From fbb857cff14acb1a91937d71aba7cacf064af87f Mon Sep 17 00:00:00 2001 From: xajhuang Date: Mon, 9 Dec 2024 16:28:32 +0800 Subject: [PATCH] =?UTF-8?q?OCT=201.=20=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .clang-format | 220 + .gitignore | 4 + CMakeLists.txt | 116 + config/agent.cfg | 58 + config/agent.service | 18 + config/agent@.service | 18 + config/banner.txt | 12 + config/zlog.conf | 29 + depend/doctest-2.4.11.tar.gz | Bin 0 -> 2183312 bytes depend/doctest-2.4.9.tar.gz | Bin 0 -> 2292632 bytes depend/doctest_framework.cmake | 18 + depend/json-c-0.16.tar.gz | Bin 0 -> 353091 bytes depend/libconfig-1.7.3.tar.gz | Bin 0 -> 3023504 bytes depend/libuv-1.49.2.tar.gz | Bin 0 -> 1338717 bytes depend/system_libs.cmake | 29 + depend/third_libs.cmake | 132 + depend/zlog-1.2.18.tar.gz | Bin 0 -> 130997 bytes prj_config.h.in | 18 + srcs/CMakeLists.txt | 43 + srcs/libs/CMakeLists.txt | 76 + srcs/libs/args/argtable3.c | 6403 + srcs/libs/args/argtable3.h | 371 + srcs/libs/banner/banner.c | 42 + srcs/libs/bitset/bitset.c | 382 + srcs/libs/cmdline/cmd_menu.c | 712 + srcs/libs/configure/config.c | 786 + srcs/libs/configure/config_help.c | 188 + srcs/libs/crypto_cipher/base64.c | 154 + srcs/libs/crypto_cipher/crypto.c | 177 + srcs/libs/crypto_cipher/hash_digest.c | 143 + srcs/libs/crypto_cipher/symmetric.c | 259 + srcs/libs/database/database.c | 91 + srcs/libs/database/sqlite3/config.h | 151 + srcs/libs/database/sqlite3/sqlite3.c | 247045 +++++++++++++++ srcs/libs/docs/OpenDHCPServerManual.pdf | Bin 0 -> 1335375 bytes srcs/libs/docs/argtable3.pdf | Bin 0 -> 224374 bytes srcs/libs/docs/json_schema/README.md | 130 + srcs/libs/docs/json_schema/json/flows.json | 1132 + .../json_schema/json/side-test-pattern.json | 6 + .../json/side-test-patternProperties.json | 7 + .../docs/json_schema/json/test-anyof.json | 35 + .../libs/docs/json_schema/json/test-enum.json | 10 + .../docs/json_schema/json/test-items.json | 53 + .../json_schema/json/test-maxmin-items.json | 7 + .../json_schema/json/test-properties.json | 57 + .../json/test-reqs-recursively.json | 36 + .../docs/json_schema/json/test-required.json | 11 + .../libs/docs/json_schema/json/test-type.json | 8 + .../json_schema/json/test-uniqueitems.json | 10 + .../json_schema/json/vectors-variants.json | 106 + srcs/libs/docs/json_schema/json/vectors.json | 760 + srcs/libs/docs/json_schema/json/vectors2.json | 769 + srcs/libs/docs/json_schema/schema/empty.json | 1 + srcs/libs/docs/json_schema/schema/flows.json | 68 + .../json_schema/schema/side-test-pattern.json | 12 + .../schema/side-test-patternProperties.json | 23 + .../docs/json_schema/schema/test-anyof.json | 51 + .../docs/json_schema/schema/test-enum.json | 22 + .../docs/json_schema/schema/test-items.json | 51 + .../json_schema/schema/test-maxmin-items.json | 7 + .../json_schema/schema/test-properties.json | 80 + .../schema/test-reqs-recursively.json | 14 + .../json_schema/schema/test-required.json | 12 + .../docs/json_schema/schema/test-type.json | 12 + .../json_schema/schema/test-uniqueitems.json | 14 + .../libs/docs/json_schema/schema/vectors.json | 127 + srcs/libs/docs/libconfig.pdf | Bin 0 -> 330096 bytes srcs/libs/docs/libuv-1.44.2.pdf | Bin 0 -> 1809469 bytes srcs/libs/docs/mongoose/README.md | 78 + srcs/libs/docs/mongoose/images/arch1.svg | 4 + srcs/libs/docs/mongoose/images/arch2.svg | 4 + .../docs/mongoose/images/mg_commalist.svg | 97 + .../images/mg_http_get_request_len.svg | 48 + .../docs/mongoose/images/mg_http_message.svg | 113 + .../images/mg_http_next_multipart.svg | 109 + .../docs/mongoose/images/mg_http_part.svg | 94 + .../docs/mongoose/images/mg_http_reply.svg | 84 + srcs/libs/docs/mongoose/images/mg_iobuf.svg | 124 + .../docs/mongoose/images/mg_iobuf_add1.svg | 52 + .../docs/mongoose/images/mg_iobuf_add2.svg | 185 + .../docs/mongoose/images/mg_iobuf_del.svg | 347 + srcs/libs/docs/mongoose/user_guide.md | 4172 + srcs/libs/docs/sds.pdf | Bin 0 -> 111849 bytes srcs/libs/docs/uthash.pdf | Bin 0 -> 79133 bytes srcs/libs/docs/utlist.pdf | Bin 0 -> 25800 bytes srcs/libs/docs/utringbuffer.pdf | Bin 0 -> 27723 bytes srcs/libs/docs/utstack.pdf | Bin 0 -> 19890 bytes srcs/libs/docs/utstring.pdf | Bin 0 -> 22253 bytes srcs/libs/docs/zlog-EN.pdf | Bin 0 -> 247645 bytes srcs/libs/docs/zlog.lyx | 7535 + srcs/libs/docs/zmq.chm | Bin 0 -> 309968 bytes srcs/libs/fs_watch/fs_mon.c | 107 + srcs/libs/hardware/cpu.c | 174 + srcs/libs/hardware/disk.c | 137 + srcs/libs/hardware/hardware.c | 168 + srcs/libs/hardware/ipmltools.c | 187 + srcs/libs/hardware/memory.c | 164 + srcs/libs/include/agent_main.h | 8 + srcs/libs/include/banner.h | 18 + srcs/libs/include/bitset/bitset.h | 271 + srcs/libs/include/cmdline.h | 16 + srcs/libs/include/common.h | 93 + srcs/libs/include/config.h | 164 + srcs/libs/include/crypto.h | 97 + srcs/libs/include/database.h | 18 + srcs/libs/include/fs_watch.h | 24 + srcs/libs/include/hardware.h | 103 + srcs/libs/include/http_svr.h | 70 + srcs/libs/include/inet_misc.h | 37 + srcs/libs/include/init.h | 16 + srcs/libs/include/ipaddr.h | 18 + srcs/libs/include/json_schema/internal.h | 26 + srcs/libs/include/json_schema/jsoncdaccord.h | 40 + srcs/libs/include/json_schema/optional.h | 36 + srcs/libs/include/misc.h | 53 + srcs/libs/include/msg_queue.h | 30 + srcs/libs/include/proto.h | 27 + srcs/libs/include/s2j/cJSON.h | 300 + srcs/libs/include/s2j/s2j.h | 112 + srcs/libs/include/s2j/s2jdef.h | 314 + srcs/libs/include/sds/alloc.h | 91 + srcs/libs/include/sds/sds.h | 283 + srcs/libs/include/sds/sdsalloc.h | 44 + srcs/libs/include/sqlite3/sqlite3.h | 12730 + srcs/libs/include/sqlite3/sqlite3ext.h | 716 + srcs/libs/include/task_manager.h | 26 + srcs/libs/include/user_errno.h | 163 + srcs/libs/include/uthash/utarray.h | 285 + srcs/libs/include/uthash/uthash.h | 1136 + srcs/libs/include/uthash/utlist.h | 1131 + srcs/libs/include/uthash/utringbuffer.h | 128 + srcs/libs/include/uthash/utstack.h | 87 + srcs/libs/include/uthash/utstring.h | 351 + srcs/libs/include/uuid.h | 23 + srcs/libs/include/zlog_module.h | 99 + srcs/libs/include/zvector/zvector.h | 670 + srcs/libs/include/zvector/zvector_checks.h | 138 + srcs/libs/include/zvector/zvector_config.h | 85 + srcs/libs/init/init_runtime.c | 172 + srcs/libs/ipaddr/ipaddr.c | 37 + srcs/libs/json/cJSON.c | 2653 + srcs/libs/json/json_schema/CMakeLists.txt | 42 + .../json/json_schema/additionalproperties.c | 58 + srcs/libs/json/json_schema/contains.c | 53 + srcs/libs/json/json_schema/download.c | 55 + srcs/libs/json/json_schema/pattern.c | 27 + .../libs/json/json_schema/patternproperties.c | 32 + srcs/libs/json/json_schema/propertynames.c | 26 + srcs/libs/json/json_schema/ref.c | 89 + srcs/libs/json/json_schema/regex_match.c | 20 + srcs/libs/json/json_schema/store.c | 135 + srcs/libs/json/json_schema/subschemalogic.c | 116 + srcs/libs/json/json_schema/validate.c | 649 + srcs/libs/json/s2j.c | 52 + srcs/libs/lib_config.h.in | 15 + srcs/libs/misc/err.c | 30 + srcs/libs/misc/misc.c | 464 + srcs/libs/misc/sds.c | 1460 + srcs/libs/misc/unique_instance.c | 35 + srcs/libs/misc/uuid.c | 95 + srcs/libs/misc/zvector.c | 3425 + srcs/libs/mongoose/mongoose.c | 8402 + srcs/libs/mongoose/mongoose.h | 1451 + srcs/libs/network/http_svr.c | 173 + srcs/libs/network/inet_misc.c | 827 + srcs/libs/network/vxlan/vxlan.c | 3 + srcs/libs/protocol/protocol.c | 319 + srcs/libs/task/task_manager.c | 89 + srcs/libs/zlog_module/zlog_module.c | 54 + srcs/middleware_agent.c | 47 + unit_test/CMakeLists.txt | 19 + unit_test/crypto/crypto_test.cpp | 47 + unit_test/hardware/hardware_test.cpp | 20 + unit_test/json/json_validator.cpp | 54 + unit_test/misc/misc_test.cpp | 13 + unit_test/misc/uuid_test.cpp | 33 + unit_test/s2j/s2j_test.cpp | 58 + unit_test/uthash/utarray_test.cpp | 51 + unit_test/uthash/utstring_test.cpp | 46 + 179 files changed, 316832 insertions(+) create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 config/agent.cfg create mode 100644 config/agent.service create mode 100644 config/agent@.service create mode 100644 config/banner.txt create mode 100644 config/zlog.conf create mode 100644 depend/doctest-2.4.11.tar.gz create mode 100644 depend/doctest-2.4.9.tar.gz create mode 100644 depend/doctest_framework.cmake create mode 100644 depend/json-c-0.16.tar.gz create mode 100644 depend/libconfig-1.7.3.tar.gz create mode 100644 depend/libuv-1.49.2.tar.gz create mode 100644 depend/system_libs.cmake create mode 100644 depend/third_libs.cmake create mode 100644 depend/zlog-1.2.18.tar.gz create mode 100644 prj_config.h.in create mode 100644 srcs/CMakeLists.txt create mode 100644 srcs/libs/CMakeLists.txt create mode 100644 srcs/libs/args/argtable3.c create mode 100644 srcs/libs/args/argtable3.h create mode 100644 srcs/libs/banner/banner.c create mode 100644 srcs/libs/bitset/bitset.c create mode 100644 srcs/libs/cmdline/cmd_menu.c create mode 100644 srcs/libs/configure/config.c create mode 100644 srcs/libs/configure/config_help.c create mode 100644 srcs/libs/crypto_cipher/base64.c create mode 100644 srcs/libs/crypto_cipher/crypto.c create mode 100644 srcs/libs/crypto_cipher/hash_digest.c create mode 100644 srcs/libs/crypto_cipher/symmetric.c create mode 100644 srcs/libs/database/database.c create mode 100644 srcs/libs/database/sqlite3/config.h create mode 100644 srcs/libs/database/sqlite3/sqlite3.c create mode 100644 srcs/libs/docs/OpenDHCPServerManual.pdf create mode 100644 srcs/libs/docs/argtable3.pdf create mode 100644 srcs/libs/docs/json_schema/README.md create mode 100644 srcs/libs/docs/json_schema/json/flows.json create mode 100644 srcs/libs/docs/json_schema/json/side-test-pattern.json create mode 100644 srcs/libs/docs/json_schema/json/side-test-patternProperties.json create mode 100644 srcs/libs/docs/json_schema/json/test-anyof.json create mode 100644 srcs/libs/docs/json_schema/json/test-enum.json create mode 100644 srcs/libs/docs/json_schema/json/test-items.json create mode 100644 srcs/libs/docs/json_schema/json/test-maxmin-items.json create mode 100644 srcs/libs/docs/json_schema/json/test-properties.json create mode 100644 srcs/libs/docs/json_schema/json/test-reqs-recursively.json create mode 100644 srcs/libs/docs/json_schema/json/test-required.json create mode 100644 srcs/libs/docs/json_schema/json/test-type.json create mode 100644 srcs/libs/docs/json_schema/json/test-uniqueitems.json create mode 100644 srcs/libs/docs/json_schema/json/vectors-variants.json create mode 100644 srcs/libs/docs/json_schema/json/vectors.json create mode 100644 srcs/libs/docs/json_schema/json/vectors2.json create mode 100644 srcs/libs/docs/json_schema/schema/empty.json create mode 100644 srcs/libs/docs/json_schema/schema/flows.json create mode 100644 srcs/libs/docs/json_schema/schema/side-test-pattern.json create mode 100644 srcs/libs/docs/json_schema/schema/side-test-patternProperties.json create mode 100644 srcs/libs/docs/json_schema/schema/test-anyof.json create mode 100644 srcs/libs/docs/json_schema/schema/test-enum.json create mode 100644 srcs/libs/docs/json_schema/schema/test-items.json create mode 100644 srcs/libs/docs/json_schema/schema/test-maxmin-items.json create mode 100644 srcs/libs/docs/json_schema/schema/test-properties.json create mode 100644 srcs/libs/docs/json_schema/schema/test-reqs-recursively.json create mode 100644 srcs/libs/docs/json_schema/schema/test-required.json create mode 100644 srcs/libs/docs/json_schema/schema/test-type.json create mode 100644 srcs/libs/docs/json_schema/schema/test-uniqueitems.json create mode 100644 srcs/libs/docs/json_schema/schema/vectors.json create mode 100644 srcs/libs/docs/libconfig.pdf create mode 100644 srcs/libs/docs/libuv-1.44.2.pdf create mode 100644 srcs/libs/docs/mongoose/README.md create mode 100644 srcs/libs/docs/mongoose/images/arch1.svg create mode 100644 srcs/libs/docs/mongoose/images/arch2.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_commalist.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_http_get_request_len.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_http_message.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_http_next_multipart.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_http_part.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_http_reply.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_iobuf.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_iobuf_add1.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_iobuf_add2.svg create mode 100644 srcs/libs/docs/mongoose/images/mg_iobuf_del.svg create mode 100644 srcs/libs/docs/mongoose/user_guide.md create mode 100644 srcs/libs/docs/sds.pdf create mode 100644 srcs/libs/docs/uthash.pdf create mode 100644 srcs/libs/docs/utlist.pdf create mode 100644 srcs/libs/docs/utringbuffer.pdf create mode 100644 srcs/libs/docs/utstack.pdf create mode 100644 srcs/libs/docs/utstring.pdf create mode 100644 srcs/libs/docs/zlog-EN.pdf create mode 100644 srcs/libs/docs/zlog.lyx create mode 100644 srcs/libs/docs/zmq.chm create mode 100644 srcs/libs/fs_watch/fs_mon.c create mode 100644 srcs/libs/hardware/cpu.c create mode 100644 srcs/libs/hardware/disk.c create mode 100644 srcs/libs/hardware/hardware.c create mode 100644 srcs/libs/hardware/ipmltools.c create mode 100644 srcs/libs/hardware/memory.c create mode 100644 srcs/libs/include/agent_main.h create mode 100644 srcs/libs/include/banner.h create mode 100644 srcs/libs/include/bitset/bitset.h create mode 100644 srcs/libs/include/cmdline.h create mode 100644 srcs/libs/include/common.h create mode 100644 srcs/libs/include/config.h create mode 100644 srcs/libs/include/crypto.h create mode 100644 srcs/libs/include/database.h create mode 100644 srcs/libs/include/fs_watch.h create mode 100644 srcs/libs/include/hardware.h create mode 100644 srcs/libs/include/http_svr.h create mode 100644 srcs/libs/include/inet_misc.h create mode 100644 srcs/libs/include/init.h create mode 100644 srcs/libs/include/ipaddr.h create mode 100644 srcs/libs/include/json_schema/internal.h create mode 100644 srcs/libs/include/json_schema/jsoncdaccord.h create mode 100644 srcs/libs/include/json_schema/optional.h create mode 100644 srcs/libs/include/misc.h create mode 100644 srcs/libs/include/msg_queue.h create mode 100644 srcs/libs/include/proto.h create mode 100644 srcs/libs/include/s2j/cJSON.h create mode 100644 srcs/libs/include/s2j/s2j.h create mode 100644 srcs/libs/include/s2j/s2jdef.h create mode 100644 srcs/libs/include/sds/alloc.h create mode 100644 srcs/libs/include/sds/sds.h create mode 100644 srcs/libs/include/sds/sdsalloc.h create mode 100644 srcs/libs/include/sqlite3/sqlite3.h create mode 100644 srcs/libs/include/sqlite3/sqlite3ext.h create mode 100644 srcs/libs/include/task_manager.h create mode 100644 srcs/libs/include/user_errno.h create mode 100644 srcs/libs/include/uthash/utarray.h create mode 100644 srcs/libs/include/uthash/uthash.h create mode 100644 srcs/libs/include/uthash/utlist.h create mode 100644 srcs/libs/include/uthash/utringbuffer.h create mode 100644 srcs/libs/include/uthash/utstack.h create mode 100644 srcs/libs/include/uthash/utstring.h create mode 100644 srcs/libs/include/uuid.h create mode 100644 srcs/libs/include/zlog_module.h create mode 100644 srcs/libs/include/zvector/zvector.h create mode 100644 srcs/libs/include/zvector/zvector_checks.h create mode 100644 srcs/libs/include/zvector/zvector_config.h create mode 100644 srcs/libs/init/init_runtime.c create mode 100644 srcs/libs/ipaddr/ipaddr.c create mode 100644 srcs/libs/json/cJSON.c create mode 100644 srcs/libs/json/json_schema/CMakeLists.txt create mode 100644 srcs/libs/json/json_schema/additionalproperties.c create mode 100644 srcs/libs/json/json_schema/contains.c create mode 100644 srcs/libs/json/json_schema/download.c create mode 100644 srcs/libs/json/json_schema/pattern.c create mode 100644 srcs/libs/json/json_schema/patternproperties.c create mode 100644 srcs/libs/json/json_schema/propertynames.c create mode 100644 srcs/libs/json/json_schema/ref.c create mode 100644 srcs/libs/json/json_schema/regex_match.c create mode 100644 srcs/libs/json/json_schema/store.c create mode 100644 srcs/libs/json/json_schema/subschemalogic.c create mode 100644 srcs/libs/json/json_schema/validate.c create mode 100644 srcs/libs/json/s2j.c create mode 100644 srcs/libs/lib_config.h.in create mode 100644 srcs/libs/misc/err.c create mode 100644 srcs/libs/misc/misc.c create mode 100644 srcs/libs/misc/sds.c create mode 100644 srcs/libs/misc/unique_instance.c create mode 100644 srcs/libs/misc/uuid.c create mode 100644 srcs/libs/misc/zvector.c create mode 100644 srcs/libs/mongoose/mongoose.c create mode 100644 srcs/libs/mongoose/mongoose.h create mode 100644 srcs/libs/network/http_svr.c create mode 100644 srcs/libs/network/inet_misc.c create mode 100644 srcs/libs/network/vxlan/vxlan.c create mode 100644 srcs/libs/protocol/protocol.c create mode 100644 srcs/libs/task/task_manager.c create mode 100644 srcs/libs/zlog_module/zlog_module.c create mode 100644 srcs/middleware_agent.c create mode 100644 unit_test/CMakeLists.txt create mode 100644 unit_test/crypto/crypto_test.cpp create mode 100644 unit_test/hardware/hardware_test.cpp create mode 100644 unit_test/json/json_validator.cpp create mode 100644 unit_test/misc/misc_test.cpp create mode 100644 unit_test/misc/uuid_test.cpp create mode 100644 unit_test/s2j/s2j_test.cpp create mode 100644 unit_test/uthash/utarray_test.cpp create mode 100644 unit_test/uthash/utstring_test.cpp diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..a96422f --- /dev/null +++ b/.clang-format @@ -0,0 +1,220 @@ +# ClangFormatConfigureSource: 'clang-format-file://D:/development/c/daemon_agent/.clang-format' +Language: Cpp +AccessModifierOffset: -4 +InsertBraces: true +AlignArrayOfStructures: Left +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: + Enabled: true + AcrossEmptyLines: true + AcrossComments: true +AlignConsecutiveAssignments: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true + PadOperators: true + AlignCompound: true +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true + PadOperators: true + AlignCompound: true +AlignEscapedNewlines: Left +AlignOperands: DontAlign +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: false +AllowAllConstructorInitializersOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability + - __unused +BinPackArguments: true +BinPackParameters: false +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: true + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: true +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +StatementAttributeLikeMacros: + - Q_EMIT +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '^' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^<.*\.h>' + Priority: 1 + SortPriority: 0 + CaseSensitive: false + - Regex: '^<.*' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 3 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '([-_](test|unittest))?$' +IncludeIsMainSourceRegex: '' +IndentCaseLabels: true +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: AfterExternBlock +IndentRequiresClause: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Never +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 1000 +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 140 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Right +RawStringFormats: + - Language: Cpp + Delimiters: + - cc + - CC + - cpp + - Cpp + - CPP + - 'c++' + - 'C++' + CanonicalDelimiter: '' + BasedOnStyle: google + - Language: TextProto + Delimiters: + - pb + - PB + - proto + - PROTO + EnclosingFunctions: + - EqualsProto + - EquivToProto + - PARSE_PARTIAL_TEXT_PROTO + - PARSE_TEST_PROTO + - PARSE_TEXT_PROTO + - ParseTextOrDie + - ParseTextProtoOrDie + - ParseTestProto + - ParsePartialTestProto + CanonicalDelimiter: '' + BasedOnStyle: google +ReflowComments: false +SortIncludes: Never +SortJavaStaticImport: Before +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 4 +SpacesInAngles: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +BitFieldColonSpacing: Both +Standard: Auto +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseCRLF: false +UseTab: Never +SeparateDefinitionBlocks: Always +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME +TypenameMacros: + - CONFIG_ITEM + - PCONFIG_ITEM diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92bac18 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.idea/ +*/__init__.py +/cmake-build-*/ +/dhcp_server/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2e3f511 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,116 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.10 FATAL_ERROR) +INCLUDE(CMakeDependentOption) + +OPTION(USED_DHCPSERVER "DHCP server for agent" OFF) +OPTION(USED_JSON_VALIDATE "Support json protocol field validate" OFF) +OPTION(BUILD_TESTING "Enable tests" ON) + +# 数据库开关 +OPTION(USED_REDIS "Add redis database support for agent" OFF) +OPTION(USED_MYSQL "Add mysql database support for agent" OFF) +OPTION(USED_SQLITE_CRYPTO "Sqlite3 database support crypto" OFF) +CMAKE_DEPENDENT_OPTION(USED_HTTP_SVR "Build-in http(s) server support" OFF "USED_DHCPSERVER" OFF) +CMAKE_DEPENDENT_OPTION(USED_SQLITE "Add sqlite3 database support for agent" OFF "USED_SQLITE_CRYPTO" OFF) + +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/depend) +IF (BUILD_TESTING) + INCLUDE(doctest_framework) +ENDIF () +INCLUDE(system_libs) + +SET(AGENT_VERSION "0.1.0") +PROJECT(agent VERSION "${AGENT_VERSION}") + +SET(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/usr/local/lib/pkgconfig") +SET(URI_HOME "${CMAKE_SOURCE_DIR}/libs") + +SET(VERSION_GIT_TAG "") +SET(VERSION_GIT_HASH "") +SET(VERSION_GIT_HASH_SHORT "") +SET(VERSION_GIT_BRANCH "") + +FIND_PACKAGE(Git QUIET) +IF (GIT_FOUND) + EXECUTE_PROCESS( + COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE VERSION_GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + EXECUTE_PROCESS( + COMMAND ${GIT_EXECUTABLE} rev-parse --short=8 HEAD + OUTPUT_VARIABLE VERSION_GIT_HASH_SHORT + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + EXECUTE_PROCESS( + COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD + OUTPUT_VARIABLE VERSION_GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + EXECUTE_PROCESS( + COMMAND ${GIT_EXECUTABLE} describe --tags --always --dirty=-dev + OUTPUT_VARIABLE VERSION_GIT_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) +ENDIF () + +IF ("${VERSION_GIT_TAG}" STREQUAL "") + STRING(TIMESTAMP COMPILE_TIME %Y-%m-%d_%H:%M:%S) + SET(VERSION_GIT_TAG ${COMPILE_TIME}) +ELSE () + SET(VERSION_GIT_TAG ${VERSION_GIT_TAG}) +ENDIF () + +CONFIGURE_FILE(prj_config.h.in prj_config.h) + +MESSAGE("Git Tag: " ${VERSION_GIT_TAG}) + +# 判断依赖库是否存在 +FIND_PACKAGE(PkgConfig) + +SET(COMMON_LIBS "") + +INCLUDE(./depend/third_libs.cmake) + +IF (USED_JSON_VALIDATE) + LIST(APPEND COMMON_DEFINE "-DJSON_SCHEMA_ON") +ENDIF () + +IF (USED_HTTP_SVR) + LIST(APPEND COMMON_DEFINE "-DHTTPSERVER_ON") + MESSAGE("Select Option USED_HTTP_SVR") +ENDIF () + +IF (USED_SQLITE) + MESSAGE("Select Option USED_SQLITE") + LIST(APPEND COMMON_DEFINE "-DSQLITE_ON") +ENDIF () + +IF (USED_MYSQL) + MESSAGE("Select Option USED_MYSQL") + LIST(APPEND COMMON_DEFINE "-DUSED_MYSQL") +ENDIF () + +IF (USED_REDIS) + MESSAGE("Select Option USED_REDIS") + LIST(APPEND COMMON_DEFINE "-DUSED_REDIS") +ENDIF () + +IF (USED_SQLITE_CRYPTO) + LIST(APPEND COMMON_DEFINE "-DSQLITE_CRYPTO_ON") + MESSAGE("Select Option USED_SQLITE_CRYPTO") +ENDIF () + +ADD_SUBDIRECTORY(srcs) +ADD_SUBDIRECTORY(srcs/libs) + +IF (BUILD_TESTING) + ADD_SUBDIRECTORY(unit_test) +ENDIF () diff --git a/config/agent.cfg b/config/agent.cfg new file mode 100644 index 0000000..ba8c6ec --- /dev/null +++ b/config/agent.cfg @@ -0,0 +1,58 @@ +# daemon agent application configuration file + +application: +{ + # 系统配置项 + system: + { + config_file_path = "."; # 配置文件默认存放目录 + show_banner = true; # 是否打印 Banner 信息 + ssl_ca_file_path = "/etc/ssl/certs/ca-certificates.crt"; # HTTPS 访问客户端证书存放路径 + system_info_watch = true; # 是否启用硬件信息监控 + system_info_refresh = 10; # 硬件信息监控刷新频率(秒) + }; + + # 硬件监控相关配置内容 + watch_params: + { + cpu = true; # 是否开启CPU监控 + memory = true; # 是否开启内存监控 + disk = true; # 是否开启磁盘空间占用监控 + sensor = true; # 是否开启传感器状态监控 + }; + + # 数据库相关配置 + database: + { + # Redis 服务器相关配置 + redis_server = "10.88.76.100"; # redis 服务器IP + redis_port = 6379; # redis 服务器端口 + redis_passwd = ""; # redis 数据库密码 + + mysql_server = "10.88.76.100"; # mysql 服务器IP + mysql_port = 3306; # mysql 服务器端口 + mysql_user = "root"; # mysql 用户名 + mysql_passwd = "AES@5/BQyUIfVxgV9BZAz/D3Rg=="; # mysql 数据库密码 + mysql_database = "test"; # mysql 数据库名称 + + sqlite_dbname = "./agent.db"; # sqlite3 数据库文件名 + sqlite_passwd = ""; # sqlite3 数据库密码 + }; + + # http server config + http_svr: + { + uri = "http://0.0.0.0:8000"; + }; + + protocol: + { + # 0:无编码格式,普通字符串 + # 1:base64编码格式 + # 2:采用AES128加密后的base64编码格式 + # 3:采用3DES加密后的base64编码格式 + # 4:采用AES256加密后的base64编码格式 + crypto_type = 0; + crypto_key = "AES@rX2qZWVwGVlYTJLf/6X22w=="; + }; +} \ No newline at end of file diff --git a/config/agent.service b/config/agent.service new file mode 100644 index 0000000..f68e24e --- /dev/null +++ b/config/agent.service @@ -0,0 +1,18 @@ +# sudo cp agent.service /lib/systemd/system/ +# sudo ln -s /lib/systemd/system/agent.service /etc/systemd/system/multi-user.target.wants/agent.service +# sudo systemctl daemon-reload +# sudo systemctl enable agent +[Unit] +Description=agent Service +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=always +RestartSec=5 +User=root +WorkingDirectory=/home/jw/agent/srcs +ExecStart=/usr/bin/env /home/jw/agent/srcs/agent_main dhcpd -m -n vxlan0 -d ./config/ -k pqwAQ81rxg70aoy3v+Jjrw== + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/config/agent@.service b/config/agent@.service new file mode 100644 index 0000000..16c400e --- /dev/null +++ b/config/agent@.service @@ -0,0 +1,18 @@ +# sudo cp agent@.service /lib/systemd/system/ +# sudo ln -s /lib/systemd/system/agent@.service /etc/systemd/system/multi-user.target.wants/agent@.service +# sudo systemctl daemon-reload +# sudo systemctl enable agent@ +[Unit] +Description=agent service with user %I +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=always +RestartSec=5 +User=root +WorkingDirectory=/home/jw/agent/srcs +ExecStart=/usr/bin/env /home/jw/agent/srcs/agent_main dhcpd -v %I -m -n vxlan0 -c ./config/agent.cfg -d ./config/ -k pqwAQ81rxg70aoy3v+Jjrw== + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/config/banner.txt b/config/banner.txt new file mode 100644 index 0000000..6f3ba12 --- /dev/null +++ b/config/banner.txt @@ -0,0 +1,12 @@ + __ __ _ + \ \ / ___| | ___ ___ _ __ ___ ___ + \ \ /\ / / _ | |/ __/ _ \| '_ ` _ \ / _ \ + \ V V | __| | (_| (_) | | | | | | __/ + \_/\_/ \___|_|\___\___/|_| |_| |_|\___| + +██╗ ██╗██╗██████╗ ████████╗██╗ ██╗ █████╗ ██╗ ██████╗██████╗ ███████╗ +██║ ██║██║██╔══██╗╚══██╔══╝██║ ██║██╔══██╗██║ ██╔════╝██╔══██╗██╔════╝ +██║ ██║██║██████╔╝ ██║ ██║ ██║███████║██║ ██║ ██████╔╝█████╗ +╚██╗ ██╔╝██║██╔══██╗ ██║ ██║ ██║██╔══██║██║ ██║ ██╔═══╝ ██╔══╝ + ╚████╔╝ ██║██║ ██║ ██║ ╚██████╔╝██║ ██║███████╗ ╚██████╗██║ ███████╗ + ╚═══╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚══════╝ diff --git a/config/zlog.conf b/config/zlog.conf new file mode 100644 index 0000000..2abd82e --- /dev/null +++ b/config/zlog.conf @@ -0,0 +1,29 @@ +[global] +strict init = true +reload conf period = 10M + +buffer min = 1024 +buffer max = 2MB + +#rotate lock file = /tmp/zlog.lock +rotate lock file = self +default format = "%d(%F %T.%l) %-6V (%c:%f:%L) %m%n" + +file perms = 644 +fsync period = 1K + +[levels] +TRACE = 10 +CRIT = 130, LOG_CRIT + +[formats] +simple = "%m" +normal = "[%d(%F %T).%ms][%-6V][%c][%f:%L] %m" + +[rules] +*.* >stdout; normal +*.INFO "/var/log/agent/%M(vni)_agent.log", \ + 1MB * 12 ~ "/var/log/agent/%M(vni)_agent_.%D(%F) #2r #3s.log"; \ + normal + + diff --git a/depend/doctest-2.4.11.tar.gz b/depend/doctest-2.4.11.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7108c13b9baf32ccdca3a75964d48727c6286d06 GIT binary patch literal 2183312 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

~!Vy!k%LeUJ1e6m4&Z2eTO@lixo!DD>J}kK? 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

?v*y1rU0?E&8g(N@~1Bg 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

QIaz;t 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%0Dh*FbV>#K;q#8C(@DLhwss75LuLdKwwBt_ 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

N?ghb}4ta%t*1DVfD z{Q6L9RkE?jNc#umO2_L**u~wjM|wiPd=7$|qE{wfaMay^h*l#yDxuH^d40rV?DMza zQg88o@3JS(eC%Y9x7lS#@0>b~E@BX*VNFlFzBRqInR?@NMg2;h!1VD{vOSO4zd?*C z4zJ}RB=R!ln2vT5-Ml5mLN>H|hM=W!{%G7Nlvy_d28jcWCH;z*op7$Ya?L~=Cl9+U zUp*=h{T0l#uV(QYyk62rF#@4DWQ57PT^Gf!>69E!kuE zNqnkShqfoPd1||HPIq8-r%8b|T~@XBBY}wFyy1vyd;^Jg5_%OKp_5`olhF15m4V>E2Kvy|Q2 zvA(vRB;jUfuln5x#(EBDWyME2=U>=RlhpUKfT>L8iPJ}PwC_u_hM9@=o~wAv!+yQU zogGmbbe@ev4RJ$fqLSSwXRj?c%gctV85i_@k*}kC0soA5r%?2`xogCZ*Kb^{L;1=C;%MAT}hj--#ps3a4U;fOQG8>F zenflJeB--2A7`0Kd>ay34xap+mwim9#UUdlt5r4mm{Cijn3B3#x#h^4=R=xC&^e>S zD7DDru0~QQ|3b5TQ-G4DLCFW1pU3_wufc8i^MT9tgPUv9^*IVj$oy{QO~Tw6GmTfS zaEQt1NXv%F-4knhdIbSsCm(wzjZ?CKdLhvo#Y*XR=rj=z@Oz2jtS`6qL|d1UMikF6 zqrqHcXk|S~f~EV)9)n8CQ@W)Qm1F-@f8D!DibHyei<_Ocf?U+Jyjy}Xxw+2@=eHr< zXBz8R630wIWk2$!Z>wn57`j$@bXN75rmZ?d2~2T7>Z23UJ!K~rXe%(T*OBSUOt9Zk zV1HiL%AnHJWvw$0+o^6*8vrPIP_z6gnPxCdVX;K&i!9c-fZ@=)D(wY*|Ayp6goCp4 zi}MRj3!NA0-yxlttxBY7ywq*OTD4GtOMu2AfP7X+`Oj9ADa($G@`fH~PfLHl`&0~C zrNrPuclU_B#I(nCEBmiK4#wC|X5nXx7^Ad`E?OYnYrw;fKi8-CeixY(v_9b9T<-Vu zJA5_`A7gK&=fCBI_^3H6NgBC`mY?n6#3dfj-h?E6K77!k9tql;)KLH2@x9P>G|kjX zManWr(zjAv3$Y_*PvXPca%(Uzb&CD`5uN5R!eU_9@?K(gcR>HWtl$Y_(+>`aV9-zX zM%*yR(v^LHVvsttVVRq&#Pv!t^fV}{(WaL3&TEZ5 zN$Ausi29M+2o3&m^$@)xQ$VWoA1Qb<#W8{%gA9!u9x&!aRQ&T| znPI(hw+d;Ze-&}nn|w~wS8vpMJlPbcDNpSYMMlVF>J}?J(~}7A=oGh?rR*y((UyaN z!bjsHWx%wk-g!zgE5ra3Wwb>v`OO-BK03j9&upZS(c2BF|PB6pEYio@`5pcP<^2`z`ai^L2RV%wWq;|iG z#Pa@=mzKRNHp?Wj@2PUTJPVD222}>LuM|?2)%@y|BztbTtTsh@nCF0n_H^2lhz%O? z+B=|(Z9Z35;T5B$vY>OtKb0vAp??cc`(rxugtzoa?>cJZdnD}6vy&c0VbK$|DpE(h z$hjDn6A#BsADel5C?@(lfF)Lyw|%~mnSLpsw^@XKG`5d1om zxQI_Cs$b+aI?@;!BhIpuowwBK4MFUcN2@a%nP5hkpEtUI*Q&>79@n+*zm%Ay9>udL zp1;@}`LPi-?;(ykj2kAMeTW@OAshHxx{>#84GmnYiQ} z!E2^%vhX7K2?JWOVGq2UA4yf3GRsveUHfV(=jCsGTCsNJ%FNnHGtv@W3z-C(*jMt7n};9D=~EM z(Quq8Hz=6QHsZNOmdHVvjF^X)qo{El7U=z4xoMGfz@Z05NhILZ(XK6KV`2frC1qbwXUUJjd)cAsmfj7E*%M) zKcU8L^Ycj6GD?UB(%sowNOd7`_zdaPT1`dfL1wShVKNM{4DXv@w#~W7Ep>keRm2hJ zghI#NF)h1+@@rL!H9dw|6-`Y@Eol|te%Q>CB#P_X)z?C!Fc#`7FG;g=8`G_)M>4vM$ z+x3^Z&lV@9Jy)LiLM~pEUYyG>{~`-nnckQ(4JFI$W7nlrsVy5W=i!-TYM`dh!iV1X zFLUxa02$&pV|ynNZRW~huutzAG_Ph>qR0fdLbzq4c=;0tm4$t8Xm6S1td>F|y(Ca; zRSLFp;U|M~{<@IEY{JDjJ=YQV=IV1&ch@%kVc@XGp8B>$&y^{!l_?L;>rr6CtUC-W z5@W}f89W32XgP0B6KCj7GR#`MtnFD19negT)vS(9MmS8-SIu*~6Q9xUO-~;aQe{PF zob%3yCtZpDnTf(7Z&Hu^&>-|?N|I`RJuPZ9nZwA^I+$=l(Yi;lPSyFpZ=mH{`zrr?5!~ff!T$CKratkkFg>zI$?(R*&ee@qHT;Qb;Y? zT%AX7d02A^?UT0L2;%aeidxswo{bH3N%M63tC2X_>BgNfl77LJjg-aBja*e-RvMYU zt=zh0#4nXC^dG>jH7A<$wPaz8`B&H z!WZ0TY{Vra)o8u=0zX!!EX8Ds6vQZ!38uxHFT_VLm>%E53T@kc2XGO`Q@DJ)&Q(oa zU+K=iwzo?4ylpjfBhfxqGSOvGFO9ya<~!o~I2~NlLI{A2R*Gzz91Ej&RCJCqgUp3w0yx#yELO-SgmXl`X@osD>V9nu`MKPwk@IOaNKh>964eBNhH&0 zkBW-qDxB=B2s?L6a$(CNYZ33W?*yfLfNa{9Q`tSgwtluv7bZ_b3MjFd`a<@XntV%O zSRJ8nCnfT#gMUjYc1gM~xH90^bp4dEfANf$>GAXCc!XRmp^F^Q(B8zeR0ZJL(llac zrzY+&HZaxI^Se;L7S_8S*K*Ezg6ve{TkT^`rLIH<-@m?3u3{`7uT;tL)7f!b;xqxm zxg!KWqjEiAc5Lr!D0AId%qd}33>WLF=xKqPXZ}7n8pEkmlxbKe%lJr)QKx(Mt zePI@~vX>_5)?q61PiM+Czvx1}Vd54(#1bui3!D|S|45GKtq?bk&*Vz$ZrM8xrCkVb zJLci-0FC_cSQ$^A|B9<#${rNxU6FwnupM2MSkYGiicBU)(i~B$9X5U2f zth3XZMG3EsBL&(3enB@B_hy|h^@b44JM1BNhZ0VML~ODw9sa%d~i92%YE&o8^qijik0?Z^V;mMJC>TG*2~e6kXR+ z<+dDYu-sU{4^w$b{pqE-RD^7I_%Xk7@CQs`%g!15KbgR7t)^}oSA9==u35)Y+)c&?hiinWknWMp>9$t$we3Ve+hbOo z{j*3dXVdZX3_2IrgLS;c!M)XC*(5y|9jx%1sh;iQ zf%0iCAh@3^+rk#s=jvG(UwC78OeXL9JuP2|MK|r(X~o@{=S@-r3Nw(wgM~P+&D3{+ zHn)H4E7IaD%x%aMWozS|wKmmEwjGCTyE6WVBFF#ri(V^X-D1vpC`_nOWi9-EWh#riML|Axb7L(Y zfj=SU>^5x!sHJ_p=dcX8<%`9f91&YEKnrA*wJ$mC0Q3AT=|^Zn)M;8Gq}5b>kf-Ziu8V#}G`Jlp z9VXI7-RUAe;WLe4)D+b1v9q`M+6%ERoT(T&*aru~Qc2dCs(4P`^TbZfy|~{v8+6SU zClGE5g4X7a2Q7P$(hGqulwFTgTMJf;@jH@Vdt@tNz!MZDgonEB zJ1qG95_s|&VVFf~Lb7JPq>~%F{bOFR=G}vHufeEak~~&gdd|I%2%^8KC;jh6m5ymEEjXj zxLv|w_Uooc^Z`5+I8vcM&|69GIC1Zr>&`TK12ip z$jAx}Q#rLGOtuo4>n?S<&`f+2yba7Z}0y^b< zjqmqRzcMLWXzlwgDDH%J%Wr9^R_#z$YuWF`Go+b;4AJXgS6sw|_eBeEy4kPKRC*p8 zOCuMq=xXyxVxp}kINgjCQ-@=P%T5$seg(>EYS!*19M0F=NbgD`ylO>=%0eHn;-#YL zSR{*iEfGAvr=8J*TO4N4?lZ+D#7Q6>E(<+{n`Y0sGngai@ofC%}< zAghZw^yN{74ggXdweyiDgptW<1a0A1ua`!qoRyeboZm*5HbEz{BA$=Ta#Q|zN*Gdf z*_UX^cjZ-tg@dP%xcBLM zXW(hfHnUQlm_f^x_o|jz&v!O;_r|h%I31`a?m*|uCLiHeRq5SW&(BlJLN`gxgb)=R z(3F6|oHKl!?#gb;?)BNsC0iTQo{b}k2++H*n9WN6!ww~CMvCbd&)F=ktwIesbn}g( ztaLP+okM3!$#EK{UWGyj7Lv+jsJ$~&r;KgvU(RIqrWwEbf{U2YX^(B*OhX#;{KjHA zk&GYjYqu7nmOj_>5+9u)mLA&L_j+u;NtX4HRF&a**Lrjt%jR2RBzvx9-B15aJNkm7 z?t%J=2E^oZ4h@ zy5;D6)JIojt-ZbxnZf|XNk5N&JS315e9q%HhxJpD(((wdI(mq|O-H9L>%^)2=)dbQ zY<+!n^z^#Wj8hRm-_moD^*6cGNdIc6D;Xm|#3VDN4zXLVS_-k&=O>JSb{ZN-9@^9J zjMp;@rff=TInIb8=pj+YJ6BQ^qu@5sLgg^=Wo#y^Y*WYhyvx<3i_0tZE)fnwtcyIJ z*Ywr)D13_xGhwL1O^)|Ntli258HtUJDzSo7V^_{1tm1sPIld``(J2j-ZrafqXZn}Tq z>9Ts?wSc(K6Gt3gU=vBkHL!ozN2@qtpNQpRO=g*UUU#+B-1Cm~&iDvS<#rhj@uoYM zDL+NJ*3cKTJO4h?u=U9v%E_lY<=T_PYQFOm zM$mdcv+S7U`tY$eMyHK&EmlQ`^{;zGE=W)WiSi{~e!LqY+M>R=Bs$Ihse);ism^nY ze*8$=c|M-H;CsSB0=wnquT=A#*T~_+lf8LCjot!N%7QQ{BMfasn&nW4e)fe)5XpYdCs(~QUm7Fo#;NuJSnqyaAd^uHi5<&ctl+>}g5%=lw zmOf?9W0uhCy9xRUD_qUrSnTwibgSyis;;bfZ+3UXEo~pr!Lx|2t59?)Fs9acJr00-R+nZPz0?qXRnl{sEo z@BRjJ_2)PG2yRGpT7WEJE_I%BeaMoSWo7HXW_*nCNHq+%?=s|G>arl)!zCSM*$9m{ z9kO87p8+B-wM8ByVj(f~^rwcLj!!o{SGBvs`Adrf<8%9R zX%*SR>*oyc2z$9!1|1Zx zt#mGyJ(OZ@`CK;BU%6y!5Dl~7au^KHvt504M~$UGQZ(s-*UqL3BpObqyJFBDE2iSz z+@HDmf_XY?a_AZEHg}AR- zJ^2zXHmunRo%RV~6J*je-QJ8jk&Q1DHa|ZR&Ev*_2+|h~t%cz);nU+;3Q7Y8$2y4v z0*L=WhEEbgd#{ZVrw_uWo_>*`0O=!9lzYzl*;g2gG4AWTof4?JM^0Kqmf3j2v1Ks2 z3g`E6a>Ltr(yMi(&%&+f8)1ld3sx!Xf)K@7b_)F~c)9vqgGRqpvu{tyNX5Hg@Ei=d zF+e(MC9orE-6{*3dbI85>xs|SrlmaylK{2LAFNEL@bsi!C!Mxi$TjOU&KXpcy!A{# zLO+N#t=?SC5X)c-05Q=RVI*moH{OUy!p-&Y`+0+b%oT+{$UvDglG?tc9<-a|DXFtR z^cXIO#;~zxCbIw2>MA*G;g;Qg5lgWqSFrh4@Mq3nXzl zUo(bA941+uCSAEmrdfOyoc@qE+Dcar>F9|NY)SM0944Xj%|_6xV06Gw)`a~s8$vTNwLHCryq#+=C0Xc?73dmM-m5&>2R?`V>Eg9U zak_ASXj??8eEXrJQAV0hWgH=jD?6C*Y;nv^4RZ)G z?vc`kfFH64mzCRr%+5#vz0Tp~EI(3gBSB5P(hI*42CFbRjz0h*W}BQnS~cZVbVrUjLF5s=s!8@Zf$y73Bni{?5uCkI;P9d{M%v15`UER9uk13S zr;R6gL}T-4sH(=0===OB`jlEN!?%2<$Nj3z?mD@%Bb${8TuSMjsE%yN9xB_@lgPl0 zHcGPA<|vd2^APeFQqL|n(ieK{L;a13KA>0e2WN5xtHl^Bl22uiFH1rUn;(compN^f;NBi2$S=6 z+xB~{Xp*qIXH4afqpkWoiN-6<*jX;E*~^+!sJIYP9I_VHmdO5Cb=*l5_q*BaS;Q~~ zH1XF?b_5To*bN5Eagq4etioVlsoh*Bc^}*c$E3&O#2bA*h;5EO+Rt)>03Z~?oI7+;hZ?`E(Tfn**`t(e7_8@-LS%qo zY$v*FW0R~%xC1>*pd3ZQU0W2`C**zYffYUOf;-9iKf>m(bv^Oo?zrGZ!FO>a7hPj@zZKQR{egTvaA$tjbB0jt8Z?MZ3ix(aq^QT~s)1DJV7}lm*^2eGeZh zp?tUaCIZf$OOI?EPmIkhvU7RtSPeT1Dqp|9u#$3}G;g|@m!##X^97h?pg zL?hNGQF`p}N_t^guw$*Rw|jbAx=+BtE^Cbouim7+7EKGS1w0J}&7@BBHihweCy5YF zb1M`ejLYocm7trlE*#x}M4)m8{8WYX zz3EFrmP=gPru`RMx=3K~0Xg@5e^GE{S38EjI~4{sT&KPl3QNOUCFEJtb4SJ*CmxuFkl`)elJBapn= zl{hk*n-E)&dQ?BqWv#QfuBcVpH2y{vOHP;hN~l882y>8K&yO@q9TF$8z7=Q;srb3K z0Ugh1PeUSzx3k}AY~xsQi|74n2YH7{8Fi{szn717AoIv({O52klwKP?22UYL6?pRJG zHM0^ZZP@k1TM@%ET4!`^WymcSM%b74%FcrsIJ=wX5THxTD*E^s=&mbrmV_9ScBP1^ zDp>55(0s$y@_LGC>4~EhW<^LZlZtoVm}N;TJGOE(%WBx>P5UX+LSLltvb9T609-=G zdUQ*xk-hS{=;@NJ%`VAuXMxFNdvFMwT2P3Ck7z`# zc@;DA1PUF%dov2TB6YKr!j86P&rGv;J8jF{j^-&rJFOv7^gXAi{Ws9zC&Cz~?Ktt8 zxWem{(nJvPpk3Ity|K_7kvaG4qfw;Cq@%BUNkFUh{DoGvIU%`Q+-reqCZ8cAe|2A_ zFTqLJfyh{c_#TP}m(qGwl*%qEP898fjN^XZmxQPRv&5yHmW@aRf+6SEVKPiF)S!{Q zlA_-geeCt&?H71W%IHdze{ZDWjlris&Ws}5D-A={!96Kg;=Dn~ZH2&lW`|*7ED~%M zLjDmnubJ2Nrb&Pxp}+WF&hhiF|L=0Hf0?d!sW!&A($~d>nS^TEetX(wWc<@zhPk%3Dscu1CXJw# zWT;J#T~m5BOBiISX11yt4LUSeLZlBe-5uzWb<#Dc<-*qpkq4x`5WmBuW3El1BX^<_ zgBkm{?>6T38z+R%0qc$;P$3DklliA|`#s#l&Rl&q;Bd* zI)QkYNd>v9E1C@gFLb3CbWZy1??2&J#k-qO{DHX?IR{PCV9L7&vb-zgBZbh8htjI~ zR^A>hN}ZG4@GQ3}q6J>)U@*phXn9v-l*NxQ%EA-?@PPl~nr09DLRoQ@{yf4tq(N|i4pIvX9z4a(v@yg}Vvx1f2{|g>!mA@)(X5>aE^ZO?n7O-` zwNKUfim8T7&dPr%=`hggRk#M3oSGoRGie80@JYyV~8Qu zSvxf^J@|#=59jad!gx?zs3GoWmg0P8?`}a^bT6|lW5Ut zz2MRHrFgn6N1=EI684JYVES!+ax0WM5c0grN!4PYqcBYUFzB|zOG9^JK;E-O{L{!t zNP%Zm)wF1#5q7?KA=xyx+q#n(yvv`L?it4hC`w2&rIop`r0s|b1kY>v#wG&418S<| z9C}i#Eve1{kY1*J)))~XX-IH#aelU+weVf}oVryDwtT@!rK}F-<2aB&Vt`3jYm=G0 zq>WZTq^m8eL!7`K%jR~MJ#EA_8u!`c4({L0IPFnEo z@^7urH7(Ed&lPpH0zzaD#Ga_muTxeGOG{chS;_E1M?;??u@-Hy0zn}BSBAn;gGU%0 z)@Ld$5@Sm?7g7y27Vxq#HJK3TfSyb9GnLfwh*Xj>DnXP!6S0(7XdWpNfI8|JMfM6h^Knnhy>ubGR5zuI^&t@HtE~MT1t3z8=Pw_Gs zOeunkMQ51K7+kK%%+hZ@)0ShGu)VJCLn)B$wiMjedq1PrqtVM4TpUMFR=?0i;@BFR zHj$`9!Qm~vuV2}y0+bv`Wxabwd$snXX!}Q#rY>u0>?>r%tds8UFNGG{qUDJ#&4$*Y zAGJerx7~2~C?T71p)fwe9@nOnTqGVAW|E(vY}|-?EyL1$)1;*b5yJc-};0c3g$^e|RN%KML19Fg@mHcFQnXFf9#{Y!YIcG!YH|UeCt+ z(o~M$-^&CHc;Z!byto>TbGj9!9#oXHto1?=$ci!5dimRPvP7a#$4MhCN$4{u2Lu`cLmy}@N{JKZv257TlebFRUj}~&>1&^@w2wSg$>EeQ1 zQ@@jX!Dk2sLwDy9ZS;d~(TXlKkkf90T}MYnikMdFQ<1+lqQ!l7(Z`1f)n%t&5vt1) zl(B%Y2Q)>2>>=sB!(^n##1SZM0B@eAhZX^0Ar8Xp)6pv70+b%AJ4|LV({^dgjY51H ziaa2yEXi%|Jn>xi-T}r!rQ+H+>`c-NBq@=g)Oo~U6D)k^x)Gnv3 zm(e*MJuf5WgHodMr;Fw1RFg`Bk!3*aX8R?f&7X$-Xl(hIS8$D|_z>XATFxe^^6BHm zNoHy){*_Fp*tM^jV3FW)8$bg!$U&e@>mTNy{Y29wC&`SJIvs&5i^1AtPW@8K2-@c_ zC#xBdWL7BaF@;f_fV1jX!K+8{!wZF(=euF6x1OOXfjCT z!2IMqrA`EQ0wJfoE75I}fa*zr8k;P<;*~GCkCYYztpyGSEpgH5h#QP0#Ir1pc?vZ^ zzi&t5jBO{P)bEgyEoxA$+sBq}CE7hZS2s=*LHOy<~ABGDl6hxC}uYCeGrbeyVju8t8LaULaRjM|%&$08(P8Cd(PNw|b z^(W^-aQ&HT)6ue31H|t#WUl)@ZM4{BQ9qBkaSUCAZPbM&WucP}P0~Ch4s!uZ*BKM_ zyEsQj@wN*sN}ezMKy5>$tO>2JV$!8NM8g{)L_CdUZ&3h~Ky1HYK75M1?e^n7v#c^B zs30@IYuGR^D!o`rR zWGZP`VLdO}oS{9VbN)K>!iz9kp%rqNAkBWq7Qv%fD7=*pW;@d>r{=GkWQ}YH+1gb3 zTC-wJSA&n#%`mOGTACKAL?0p-pHWo>S^9vng5ivHj;5cNmUF%*FOwk2T#iIHa zTw+S7T7Y=*g*+uvV%fBMtXL2Ly%k9r)rvwPd<2TA5eDYPH%V z*A^mf>$Wgz;FO5{v8ffKo>0bRS;se=xlHi^9D_+QZxz7}DW7Tvb$igsvwUC)GNibB z9p|*OKEr5fsk4DuTp=eI6;g^8J1l#hmSSOC+(B~A3y_Dh(y9kDuMn6nb)h{00Tj!M zbR^|#u>7Ax%#uFvwhH$Ln;pOea}wkn+-f3!#lKrGw5qW$n z0hI!5cc_)&{q`hEK`ZO$`K1jc)R%&8PGdMnI}23=kQOqe#%P$#O^=w>O5(9b24AU?rByFU!%>eCBdl8SWilhvUot7%y)(vXd;e4$f|pyVZeK=KEf zX}@ZxX8jvync5F$8H_+jMhUt$Li^Y}o>7+K<-YkkfoY`F*B#BA+7Y7+Q6p(#qz;95xG*yoYpB;j9OX8mYMs**hjUbD~DKfGpD zu|zt$@=`Y{V+MuSCj4NOv7$q1t;p7TxiN%-isPaR<#2H5wV4vx0;S1yRGuOPpi7a+ z<}FR$ulyA4+XxdtfH!3)=h9r%o6ak$lsPLy2gOy06i;K1p06ilj2MyX*9J+xDX)5j zKw&cPDPh_@(F$5pM-EZ&vP~lU2NisbCZ6KKi`Pz;@MdiJic!(iV*4i6f-z2L(PxDi zbi4cXnbl142F()*)8?-}J3znqyC;?w5SZt9M@FLrV=RfH@|h(D?TaIjN=8f8ukU%x z66juW0PRs4i&`!vLe+56g-#{K)Li;;cl=uxp_95hXm-=kY9S^BP4Y8UedQutz1_== zv)kj^OsCKWFlm2>Y|1q4^NLr>ox~9ShfdG)-=0$siN$KOmMn+eZ#*@P_pbrac)tDZ5l1eliiN&Q08 z$W)pJ#H9lLCD#|GdrN|AMn3@%QcOKH*ojC}P?wQfp>>{r-vVAM5=>B+B$Ozy(Ax5^ z^63TNd8U0fLtKhs^4-TndH56Ah*|b++)IbiV}u+9RZsVF;66(XQ51KiZU-qTSn`;B z_>-3<1m9&$y)-suR3>bHi}W2MG}qRClqH@d;n5iW556hG;}z+873p;xfk@Wrz*42v zad?AfT75?_1Vac@%op@-q|~}su-Sh9s{N9gwuk@N;6A8%%n=|;2Y-{FN?K?PbK0@k z)+b66TO|75a`d57Gc;0|YRN|SIUb5{Y9l$Ev!Plsxp;MKCDda~&eG`%Xnv{tLFN0x zAvS`ZiQmL<6g_%`Ie1VkQnT9BSZFcTiLb8vP<2Pe+)mnb+ZfO;SN!R3BKCR%a;^8z zjhX(~k0dxLvy|LEk9j0akcaw(eXfQh9^n54wQPhu$p%*fRrEp}eX^bUPxW4?!j%tP zPbyx9LMX|Jt?aLl_Qyd(Z9--YA;kcl)=+BfQBlRdq)l3MEmO^E$n$ZO>Vq122e>)w@7x+O*TO!zdIgdkTH-+tk`x#apDZtAk0LXiLirYD9LU z!!WYM5SrPhJ&ISiXH`rpD>j%};U1OgdIFBN^5Q2m>VOQVu$IGI+K<>48$9ca=p)Wf zZH||0CN3xGkcbOz1}JHY!vsQS1qKP0>!WqF>?=zf(=J;g_0;SnB3A|R2+=8))x5s^ z7`!HJhEdr`1=C8=Y#=*NVeR=~?P;GPW4s&F{QOu029tRt@qzaAJKD5iC8?J?q{Lt7 zmipJBe=UuX6WEP;eHhvWH&vW6eFe>?wV&2O5*LtbQ)AM#0k0G6XO|cP)y+S5?N~NE zS?x+6jue$^&+T1om`l`bCSAGO)Oi==+s;W$gd=MrDxPy;n%l7Xt>yb&WHAUwaP`u} zLQxA+Hs_Zx#i|t-Z%gPSv3Sh`4wd<%;2O%G%P3+}&kYir^ zK*Qdq(uX@OQk{TJ^P}S+#ks?eQs*RFEC-_VH%*~i>pVLI;-H)w29iTjS)&-WlRq$c zJ!JYaKb`fAfl5Khr!#o-l(fnR6TJS{t$hD-|43Z=Uz(fwe=hoeF8V)q(W^H`w|1@s zH@En!Fy_K<#6@MUrChoF2=jk_{y*?@*Hp(+*TRzdA`2%AJ3Fg|j=8}DOAFS!cP#I) zYU`Tl+%vvoZe+oFPxsDUU2~QPCi?%4d$6G&Zf;J(pXlfBf3kCPak#I9gc>L^ChUw+fSEPWY+N%Psieh1po?0s-U z#R7vlR0jVe3Sc~R3WFJW1MQ@3H7C0F1S_;`hKeq2;e z>cwpB7wpm;S#(VYe_Pu#?RI&O!}Rr|T-IeCB<0WMS*Cg|mhNY>6$q537g#JgMGgx) z*M~bi4{ztNX(F!{;H%n_m zI6fk_bsYQ@Y&bNS8Vk&wvm9?_W-6L*yyL~y`a7gzf3zP@4yq$`sJdr= z9rIC;^zkDYV+X0wcjjt&4nL=Mwml*2Xqz9f3K5PsNl8gP;60EO%Q^Hk;_+A~&>hRW z-SeNUI z9cm@q#vMOq8^5;u-SrNY-S_ub>RW7Hkjiqm;I}aZ)Em~0Q*f|#=ytmv_UZC=p zGh#tn9r6@EHmsrRw^BAAhzlh!Fs0D(A%@xf$W9jBuH2xpKeH}F^2Z)>@({7r&``Uq zo8iV3YuFo<=fy9`Q0x_nmyg;{*l*V%TFf)MyM%ci-5z|q$vuVJ(;e3)bAGHeOsW%W z@`v=go0^&tstcYEr=vVs$n&knNjtKQ8Gi^;XgKD?kndzpuQ1jMicIBp!E+zPIJg2#Qtscl@;oP{96SD9kiMHDmQ7_2v=hjd87b z(i(@=bDa0v-rZ3NR*UQ@a(E79D3GuB22lqC)8C;{26G z9p4+-NZ~h5Ym0AmD!uQ7Tea>5|0E3iX!32~oEN{>27CjT59L8`ID2H|3u+-k%qL+e;WKm;=REKQ?j@di|b*DjaOL^Q>QF z%&)&592`u*si~-_{1|<#O7-ipyF-;Xo>Gv0OMAf>BINw`icneb-hv^=v}A*uQsrB; zkMKSymT9x@H2w&)o*_%OAw{F$U7NP&Q>deY@r{rdzpp7?R#v~JD1<}*8C`_!Sr{kw z4PUZprHuI0m3W!(bSu67`jSQo#;1tjJ%Q58^zVLMv%Kt6@VbD9uDxDhYklr{UAVw=7{Iqa8&q-t%1LZj27{WukZ4mg&)YKORHUO* ziqGv`cH|sz-FfJ(nM_x!vW}PK_$$xxu0!OU7w%`ZDBc+iP^ycF-bJR)wmu&(QoGtS zQ%Ozz?7+#F-X?-GS&&4kTe4Q{wDt_?9l`OrncnG^L?vaLZmW+E_fVaHn#m2L3!I$8v?>s;rLerGEJ z+3am-xvot26lJWr*ULK=Ra!gN%q-eE8B5JYO;<#+3-5UvQBq|L6Zb~)h0qf3s`pY; zpDsEB8t%OXW6tur%qw1YN{v^(G-41-W}7Hpo4SLRu{vcfpdN2t%}fTa-goG9>Q58( zI?hS+8!d8GjwdS5n3Y$mjtt|9%ZJZzdNr%7_OD%*SEm_oY<5}Wx~sWGr8;YL9GQTn zs)u%cXeD3FxwRG)A=NiJqGC1Pn*5b7pi^MF(2sHn9iqVL>`s$GU0vN>K8Z!p=%~G( znOwoBNZ#ZyiqCMkl$t`^LY!zdW7E)=09C|f3mJ~|zoDPwxKY0IWSiuBh>-_1? zIu$SIZJigGg{jL!`K=6B#OcDDzt)rGfKO^2X-%fB#ZJ=_-IL_pcA63Q)v=uPC~`jvV4R7vxg}8j|-+O zE{OzZ;UrrhFL|Hzdo*pS!+|VGZ4q#wKd7t zO^5~5W1;ft5t5^v9(yBe^$8y+rhTu|$Bp#aL~j22_m77Mp=Ndk89}A*>#Nyq@lbs} zA?(r8&~J}yLPkHsntBk6#y%<~hc)QawE2m~=kBl~S!&pfGr!H0`uD;PwL;DE@!1K% zxGO_ez0f-B{o30uw5$=xD9Q-Vlsy`*n5^NbmlA7XUJSc3tZ0%ZOEQjhZEZ?wx#m`X zE82!xp{1^j^`fO7$tAf$yM-r zt?DjoEwKsChou*&e#c-+lfWF+jK71{I)gktwmNoeiM*0@|z_H$`qIG*nhmR$lQpjmJ;KFb|8b~rIHEz15cv0S8gSd5ZhmC$Zc>U z%dnbgOLJ^^eR-7Xl#=A{t}tO~Hb~Px;k|3-?0(Xxg-F{BLdxy?IX(STY_~71KxdAr zEa!tlDa#!mOIa1=<4aj0%Nf(ulLV5vn3AYURT7wLTlXGT=G25_V91Wl(5NPy6O()@fq|S@zP;| zi^r!c@y^`RCJP354;TP{x2dTJX*GlTS9VAM(hY{j!c2I5iq~hWzk6z}pDjeE(?E8n z&$8;&{dboQv!tZE>H7JQ<*THSE}@hT=jU3pi%f?FwyXxRqsr`Y_%NlUIh8(A`h=jv4Oj6)M}W5AXAL zcgVBUyH`>L?4dO$55jbl?VIg+u1FKYS6X0KYUaz zJ#NYm+LY$bRGgCcTs=S~$m@s>ZUWa@-?;O1(UMH^v+~1%{o`xz_fShY4D~<^xbw0m zz1u^j1AM3CMm|mho>3DsZ;TN)sPFRpc2k{9V7HJ3&1P|*Q*A=qb4Z8M#n+x-tMfvJ zlo5nB0b3F`Rlt4%$J%!9!Ye2$9M{m=TAMDZzmmAxOm@0nWNW>BHOy*dx!)(Fk}ans zdMv`W&;4DyUYPEgrmoO1JpL67SI$_9dsc?wPO<8sP;FYfY@tP?*4XRJyx^3VpcRd< zNwPcUglZb^qi<*#q>}T!sD$`W8Spu+&S%D(m3_CtYuHF9JD%dacawWIWR;|ou7BhM zbd$`ww+}(HgHT^?*aAhNTj@vQ)5?9V$~O+1ki+ zcB-8Wx*T=FSr}Qd1g>H2?=z_`8;n_F_-3aZi{ZNVk@kGYjRpL|?$Pomd<&Gsk4vG4 zV{1~Yihg)Qnoeaij=nDH$j2=04`J;jVvdzZ(=9rEhUOQz==$6iV4C&8%^Fa@x&7V( zR|>2r8zUO!_f79%{zl&Za&yrrVY*s+g&d*3d&a+&{z0QrV0{qW{=ufjeOeu6_BGEa zkT8q-G<#9&v1T>P-Fdi+^oGM2nV5cALhKyV?h&*6BJC`LCR(QSPiNa*B)bbo{LHRN zPxzVLRZG(@nP`laH01ID0-_R(&4WDD(Le&|N*|hy~M~yFqzBW;UR*ZmI*2PS4J{Ut!>&-TW6ZeLhwb2psW8 z&9rQOUyIyY*FV8$e%G*tStc3ky!G+zP?}DGD9#%gf8Lr8(b9IQgI)=<_G|)9DSxyn zLF#N&uYMG-+NGm~K=z~d z4b>X1c=j6O+~ZeQq1)PfHpb$dN_uw}z`#PxSE+grhprJ8nK5>0FrUCOhc5B4$#&Td zhnxL=qo@-)QhP^Wb4}k{_8g{C7dGk2wbZj)d9s(dYC3;BWg`2^utG0b zJz;dvEr*ge5%nS!OkGt(Kh6!8_XHfK78VT0YHn^U^#+M-F8BY??iM)HjnxH7{T9xg z`frc+vnYRmRW%8{ip5$@Yl7K#)u$H2N+8^_u`%t!YAZ8o{P-aE1!#O-tzQ%D8&0-$ zin9B@!lpx7IV18-0Y4 z*ger=K97c*vnJE4Sq7m;z{>n+Q^wi~($!VZ51vwlH81`;la*s@q7j-g4XJ*+e3HAM zDZJ%fX(&Cnb$l}k*^v4zmXIJOSZwY9-DG{aoYrS52PZpo&bQpKC<9Koo3tF9I`x{F1tV9pk-{?C==-kr`TAM0JEkv&d zU+1#HbRBoPxOwVnT|)5!08%4vmxTvYt2Bo_qq+xM(K ztxGP3yj*yaKS~=j)_p-X`@+@o5c4RJ6syMtS3(CXy^{KTAU2{;-ONrw zDNW)#XxsVKt|dp3CGQ-iP~y-;!AxPcaVM#uu*r-a(>cxQ{ghhwJntx+S=gZJpVq7L zryu)8lYYp?4q9{ymaHoF zK6kYn@k6r80%ItFDiat0v?9@OW_DiQNYvWEeRWdk9SVp$;Hsm1R7{dPCiti%bXP|F zdZw4&Qf82J?dCcq_qk_F3%j(b zJD+mSuO$|jyT)hR9()mfdOsy~&awatOr|W9p%3}H?04_Ef!jxLoGnRT%W1zJR#AHn7?ZC>hn{^nYVCb z+=$*Pw9L;p$v!{Hp%Wyj+g+5NO(_g~@&fB?(ob&7{Y zP5+%RIO=X0X)TVmB)+%01x@R5jbwN|XmXX2Mdq1?08*tXZF2$19Qks4y>lS$L-FS7 zxI%5Qu+!@Cg#vK1$YXPeWq8kEt<=z|%vj(UCtkaEhWX9(=4?=jR7+By(Nw>Wh)nW6 z&=`-$mlVnHosmdU7-DUgx@|rpJ0WMJXeHzg4W;XhEMu2*F6W$WUGs8cOBvOSgr-`B z=oBGnrnj_!P0H1r;2VDBr)sr^w7!-CwFyHqA~$)dzRZKBC31FJ5d>}G+A4!Nz=ubY zrqGg{a@f3oPsM_Y`RDUjdyAdq6P*t_ecEbK(u!r!(sW)KR3IU}`YGI|hY!IPbi@<_ zvhzm$K#AhUveBL6J=(M88ztj$Cg_N3;0&S5_J^fjmq^v8kYJf$sC<>Wj%<#|f!+<@ z06kL@S~5uy|5YI2c3xjrs1-nFKo;BG7v$#grNOC%1e5cmxbx;aIe`hlfFBQwtpA~k z9ox6qN2YJM=kmc_pR6{dK;UuvJVl_4FHrShr)kNC95x41u&^2WnnlIhr%RCF#wm7d zzZ1FF@Vc3Sx##fEI(fSsGS^RguUZuE*@3|fgkw&ar#P)GCg9XGq8*bG@BYE^iB)8LCJnKbqeR1M)II<-BS195?L-Y>)O{FWns;PUVdS+VDrx^24+ z(P1~N#Vuw{1DwW6gMC*dz_*{Wt5j$Zdx^z~TWJ7lrrJ+z@mB=%|f*E8NpZ$^QM zB`{26)C*T%-%VP;#W|^aRlXrx(d=5sWKJ*D<|@AA8IY=WqqEMRdb5o14Ty=8*UyNO zY53O}cB@|L^}5rEC}n_Z29Bz=!nXvRQHCv4H4h#t&Qy9}DeBm17@Y%d)nT z=2Io~d?G1_G3mH{Y6h_Za-#B{)aQ6&pQXqq*XsBP1=hwK5tE1NK!TSK#(QKt8?N_V zJ0P@A`lR~4p@ka*fsHofVY~Td=+#yP%f2omDEfJd0&Z*tE^1Sm1jY`mr?97K`nY9JzEm=hN+ z$h;RYXpCuQNP3g?MYUj=LMB3xFKgd8g4VbT*RN9JNDCA%c%{A>y?IJa!-zGT8(i(A z%aGvzEu~-zXCa|D)+)DZqRyJl!hR#^z~%AKO+J}HaN8j29jpSJ|OONA3Zk4|RmzNx6ZAWn5?{$cIv38*)G>{dp z9Y0#i96R00Gik2Cr)!}>^kA^L-i*AHIlJv_qEVt?PVs1D|5{^*QEIp<7Z7x;RhZxS z1E+CnvDnq}XGSS`v|WfjCA8RQ`r{QW)CmNxCkP>IRURU?n>WGXyHGsV)NtW-D~od} zzQI0Im?=!?;I92I+O@ONPDBqVE~_i`zGZ!#!b#_Hij%Yd#(^x! zmWO+&+Q#A@ne0tX7|Q?0)mpw|bXEQ$DThQZmnU^0*E|KdDY3_+-_S=$nuRtLx_!es z_4#MAD;p*mBhV_b)Wu(ZGa;D%3({vJ-x0T=Qww8vzI;{_S$> z4jg;zo$10kZ&okPm(b7+X|G#aHa&Lw%1{GGHP(b4RXsJ+{tq<`it`Q#>BK5ZL&-D_ z*UWWr{_Fe4<7(;pRVztj4m8s{AJK^9B~MVExf&<3{_U`p2@EsgPoLq;wC+SSM4oGU zezKDX`}80sKc^Hr4O#bYTy5H4!L`+c*1kE4J~?kFG=YH$@!ckAo>)=~8W|G> z2aftNOG}Own0a+W`}-_C?1fw}`8t!V7R3Z??9B@lElUx^Vpq61%Pp=>8=2XUf@?wX zBS4bfcmv}Rn`R0KfIUFcrN6MbHcbsYD=9^iV!`gynddQz#av59xV(Q*Sa0Pun#2@6 znkEk+R+=?NCi24bjHyN^OuX^FFL+RT7=K*;JJE-1TZD&@G#wW*Kxr$GLj5zEHTWY+kiGfp2aAbV`iP`y)FEm-W zq|8PM2+iC`?mIqb%41pc0wF*~1sHRLtbV(b%urUY;@mAU$^cc8Gmh(Ow7ZuV+@n)H zo$6V2Yd1m-r;P4Ou5_m6xg3UA8Y>(En8o^So9%PMZi|>5s2+oqHxxFS6xm$W?UW z1m|7Ek`oM9pon_+$2h1bSYN4kkxA|=>m7tnbl(elH&_bSXR8fN$6Fix!^@q6Md*yO zhHgoY7qF|pqO_7;plGpCJ5&DKb;y6tNQfFI?#1`{w;Xh@ABW#GGcb8K-@mu`JWlb# zh}Xk4==P{;G8(n{MkC}ZXYsvb>$q?*;O@cQ2MB@`9B%LZ5#Db8~A7`%0VaYd_ zD@EdPCJ+JQMGX5RfW*b-NvPD-6q)(B&a2I^so6iCowfE^*7+sw1N3FzUD9QaVANBH zd}gU;+X?O9H57N^ks<1CAk)Al8sUcTS?~C2E6t#X8}z0W(0ecIblr=b1pL$dcye#; z-^pDTm)D#1OEwnw&($iCZ&jPuuvb2T26;%8)k|NUUa@O<^<&lkROXsHZj&D`38&gw z45g>1oN{KX7@s?DtUiUP{GEo^mn}Grm5re{??_9c(ib2gL3MXEjYd8uEE9DgvmBcI zcnL zdRRgNY-Y|`3U7JRid!a72I&wcMxg;141`A5C)$NUjH6t5W&y9IFQ1fs&Frok`#3|z ztq!xhjZno^eIs{y&4Xii8NLTyZ?>e8s{HG@Vp5NjD#7|Qp(>HNhpg8dN^Xj{%STsS zN)A4%weZx&4peD@^(6TLABOUT$npKg{XvQ3`E?2&mDvVOv{_>|1HNM1xr*PTeS|}$ zpE}?*Y+6PnXM`5=$5X0PzL;(Fu9mTGtV659WtFpBHK`_qcT(Fa+B51z zFf=l+5q_YC)PA~ejweh0y%EGVauI%Ryk+INkr+JsKp*c4)01;}JHF-id+&!B^+j0SRokm-2S^IflNA0q7DeHC zO5U!}tHqC}J(is9qn=xRCi7)vT}s9GP#1@uoqN)N{&lZg$_y{D_&jNo8t1ro?&RfPAvT?W>;%h zFQAZOlnxguZt_8K&B?GeNmWNebvg(?ebtNnaP9M@&$sNQ(!Z_sa(rdG#CYRSS2sG$ zW0iYKpM`(zyXkIy%1efI;p!ZDS}E%?Xel1)iV8qSgj`YhUYqTUyIi%h4J;e~rYj;posdnGpb z@e<_Fmn;sbtvKd+DcVh!%008_aVFEG?XInvkDp0z=nRa(XMQM9&?i^8UDs6SpT$ru zj-v{3SQ&03%Xd49uLb2UeX%Arm0VDl<{3*WmW)j+VZB+#>f3a7A;d-VCcSy}e4y?@ zEQhh}_iy2DhxE?XuziU=A^fI<_$a82F->_&ose-mP2RizH`8DCIX4NNe|GwO-^cuw z3}_~$7L$4wZr%6Vm`H4qC%5-w88pxi(Vrc>M%C4EtVAazvsKN#G0?O$jlNfuP9EA=grm-LK7oT|7)ofqbk|O?@x#| z!-ceD#}Ve2w*ckre1+gEFCs~V9(t)71k+@*l??ayt~jxM3G(kXb1<}O9lgZIGw?=T(mhLX9&}jcO(V0TNIg#pvyJ}b7f9X?6Q7=3|;Mzb)I$$@dA%y z_~O1k-KxS$83lv%DTL}YR0J6{rsw6V^f(sM`6c#tDJDkyJ@VA2cU-kr*@wev+yC_G z#2gBiHKeSi-5NfYzSM0hjW%~&NDYgSDdkO);Ge#xivm|R8KtXI1NC;`kET%6tf}|7 z+7rM>kFTuqLHpGOG24N7J(YIS?tM3}aFh6ecpKIOIqxIaq-$g4EiqSi?+I^+-f2cwg&~fzf^de=U z-5h>%BlE7ZyY-PUJf%?{+uFurp@glbL@+OpvMXianRGf2as83#S_KijfwstiTBKt_ zV_kA8-@2(e8_otnUrG(L9^{9E_Ue|#g~${1&gZ|Y51O9*p0%ML%2}=#6Y=NpjBMBW zy`{LU9P&9*ish3nM)4DnGnby$^~Q1Kn^uxK4nm!jXE4}QlP_+vAxeVlST88nMh@yR znB>gxRQK*BQ@k_x?0te#t_ujAtk$tOSasY#{j&FF9EgS}&?dd1U+*=u!FV=9?_5(} zD&M$YH3ALlT=HW;R%w?iY+dYi4NE4LKwx^DIgTw-N&n_r{s#KTugy&QZlAKFp$^c- z`#37ZqFvvW*W|9dx%Je&rHNYu{P*ZHgW z&ab?Z5WE%N9Fe_hsJ`zLQT!goF`H%c=j#mOyD0Ioz1qEPM-y$KVr4avJy=8{t9ZBZ zGN7wF2K0_hcVjWbxr3VsB^3dQu#rGDHa?@G zD778jJIry4k|{m$7^q&lBxfC#?yLtd8O*#qEv$J;Jy?==p9vdJr%qHzk!FyApVxc3 zXW<3vQ>4OQ3Q%a&#;a{2Hb@>*di418o@>A+(FN#f1ltpLs|tQa0Rx_UXL-i8>U#6vLzo`{7?4 zex?z=TJ1hhGRv?pdU}x$7?S9$KAr9>*P<0K!y8a(P&xv0$RNW)ZZzZIY`I9|MJy4=|!*0E_e5pxR z#rf;2vs!u{X~&_>qtTG;W1NHG*#>PqZV z3L`%eW-}5Uz4u6wE3E^0!RE$lBZIOcWm3Tux4c$}x#ZR)&WOvn+n2>Ip63^@mbbrV z6l}BD>&{wp<5+omimn79dCLp?$^1o0Lhb5a4rh~*<*d@5v+l#xi=~FJjo0$#(1#}V z$CXmuRgDz)FnX22Xog~EGG%hEF0%%G-eK|rFs`bgcqc5IHJ;HSxi?M5q;V2D>f@Q0 z*Jf+AM#Vr?75P-ToqHM@8qt9Q zCO=KJ>m^cS!sY_fK>WiZqjUy{jiPtU$HHJ-{`I+rXp$ln?G>SSPTj0z*_HI=7x#y| z3=cg+vBTyRNT5LM9AxqxA(TT>QQ~4+B&3NN=v>Qhukr8^oYb9p`hak?sHcYb0{a*W zS*kYKuCX}ELq8;f*}g-|X}lbeSs|t0gLe8ska*^L^$FzH2ETl7hoVsu3dJKxv8Q-_ z7}+@U@pevWl1Q;2znH+t+W|f?1Ze+=OZUaB&)yE?pqIX+2MyOBVy0n23*h|Q%-AoV zV@Cc`UhO%Zq_k?|$Gg!n!82tH^`}(5vfYGCFBWRDok``-DO&Y7!>B=G zYF@LOwp%0D=MFg0e?)+m^Tuo${aY}QjWJVb2e?8BBK?Xs+QY3@eV$UW*bAe!>^ur) zYieV4GAdsh0^+ee5l~aTv0D~mBWHvXgwh#+ehBZIM`ZECD{%tIl`oB|Y*N@Pj0G6d zDbd zdmfFT1(UkD`<|PT)>W572f?XZO_!1tgYJo#6m82P@0Kv}5MJkru3T)N=N>L)jRVWd zS@3jgJaL3LAi;Z89Y%%ro_7n(pR4LqMNk&|ikNhDL&h|n0pz0FUdK0io@75Wh9Zz2 z@GrI_mJsxUmPYzEQ(Yv|2?6YTot!O-uRNFHYteb9*+)#HczVq<2gP5!7GrPZNo?kZ zUdAv$St4s9XH@f`yPo@~U8v*6a?$p%+mBC>jR(LEWi58w7EkpQryk8UVQ2yl zD-hJ%K6bZXHj3bpo<-h-^oBPL^}a*oFU07(3hY7^o{etxpwwaXGOFgM!58kg1U1{7}9O6JT%z_Wr@0N!KUuSg7c+kF~#JmkxR?Pk8J z4%NL=t$M?zI#3m$`t8H59&{Zd6iF+!f^(MB3L&YetZb0mUR%0d=b4MLO!|tHZO2Ij zSI1J*qLR?DI(3MG<6JPzp(NgZM<_^fH%52x6rE*;^egvuqa%vYj-%?fo2{Ngk)|`& zEXz=Ggvaa9_A88e?HeTOPx`&?DlrjEKGAhH9!oBFfiCX!E962BcK4Bi(!IS-wWk+t zmdGuOSw~U*hV3-)VtRhtPjdih#!X!yyU8Q zs@WG%I+ezPpt%X@1sao*qdF44F1x?;hz`?71s?<27DR-LVV__U}i>Mr5HwC9<~>MMfT6$>YtGYmSC%4uvL3e_S@9kxJf zQBH076k6*Q_NASI263J~5B3zhkG#94f{)@FemQjV!mnVFqNPtMGx@7HEJF@FX&_Kf z6VD_E$@BQFO(wed#j*UUcVTd#yt%>$(T=2I7xzdR6SX1AtM!m(7BF`|{g`m?%lW;Z zV16xWT@890HcuH7vVMVVu1;;7W=(K_^J`FrY?lhQU+m(hydxW(TvQM8RfOezwbF4s zYKt?Kti;rO7PoD6c~Q(zR7$22EMGcY_wFjV$s$&VY4ltWvI7Kg8+$LNIcAv}Uc(M>#H zUfT{khLb570h63QH<9fX^d{;=t7IA(Ow*UVfPzS4RnyfA02?|x#zq? ztUDg}oXiV&Q`>t&KCp6v($_h+l-D?juIM*~#hdXf5Vg0NRXRf=Np(EErDgzWWqhsHYWOCD z<7X8V5|#6dU?#Y8vdKVWR+IDj*Bw#SuLb5Uu?MA^JaI`s#q3By>s)UEO`ZgI-> zN|lWZv3>H@SWE+=?p_~{MZE$4k!oW|tFA|fi@ff}I+#2itmM*}5m+>J3^=J1xFyPrn*%ITacE|#37v#kE3TKlNIQ2bi9eJk~LGD*p zmx7R>jzsCF3?AEIP!tSh06zLqN2Zak^b$1T(4dEFj5$_ZzvnQ|&*@ml)PgD09MS3H z;haa-=#@MPLPcRy2)lidaVCFCN^qYM)Ng{#o8=JbcNsMKS$Y0v&hA=-%Bassga$9% zd)B~-P)<{{^vlT-r@RdEp|S^=Ik#S&aR!NoR1ZI|25p!^6D_SFPNS};L7*L|l=qB? zR&dR+AaHX1U5x`-14uWHcVtS$2ll=$ zuVl&9*OiW@UML%OC)^ukA~JMEtyNK*V;sV@n2Tgr=b*Nd9s`J}?L@nCBMm)u>Ct8g zadf3UzA*oAV@x>56JbFWKrMVt77tT}D4y&Nun!doR0?KwtmbUF9q)GZ^K=jkn0?a2 z*w-7a%S6i$u}yiWPF36Dd6Fdp#<~<|ECTl_-@gT$F#iw{Wz9DOKPwqqaa@A` zD1<*6Qrd-6MTDuh>BRbuAq$K#S+BYtjwVSVa}3^X<0~z5aD8RIasWYY#d+i_Usvzi z^5AJK=G8}XsxDN1(5-3W%;6FjQw&qiw~2^}^cLFSkv`=CL?-FpXZ<-hI&VzlLEc(V zpN%^}0orI{blvn$l$T3tyEpKVQBW({6ATSa6%$KHgOn=4=Eh9Tu>iRNeMsmMMx2w8Rr|j+AddJOY6B-m0f^ow4>RCUUhX(o5;q3D!dX!1EaZyJCwD1Ah%66E}Sd zSM*V*#ThX)0{T<2>f}^px|6NR>I?BcpjxAF-X2Bad!x1?+)QE}Z=reoI$y3D%UuPw zMe04(E@>ak4G80}^G6W~Eb#a&<%}l8TH1_`^uBI1c{l}Vdf`0xPoL7xv5j@1kgq7c zMVS)%uB!WJ3wIqOTN6Y=v~P-X&-KDgZS3WLd-;L01|l+Qp+tI_l}oXTQ5ENAPjlD zG}nuC+lcdRJ#&NoLL|5HhswBcBSN`{FR!Buy11IhU`+(qWRzio(sLshi*0L7V7a6Q<^-TT_~p z^1|gtM46nJp1bOdk0?uk{HeL&hO^R~AdM=W3PUQ35&o1?=Yy%`@umq0Vf_dI-fRj! ziNds{AFm{I^_zr+%LgBVJ;7kY0hnAe?8mUVKIvEtwQ={~k@$nqXQ!r+L)12AB6whwZV5vxfaMgCy1>g;20$%R?9zo8=XsHWW?YwO21Pn zblBUnt6;WBbHb80nn!NS>}a8r!j#^3uH@hYlV;^Fd~P#MUD|U^||0@;NHpl#pCT z0XZUn6Epqsc^mbQ)(EJgALKP3IRP`(8e=3++B6@g>MOJ^IV$`?Mhpf%$1s%W_^bac z-+`Wi)({2AjWI`PixKcpIG?3#*<~&T8!TNch>Mw0OyOn_mq8J-siE@HY9C=HohuB6 z8;?E~)mAVVYFmVP%yHYfdg0n*S&2C#G0`yyN_%gCeq9C*bBnb$0_TR*RdR*Y6k10% z=R$(*z=^pIf_N{4yc=Wa_mx2EK?Y%qQ8_CGf5-Jv6;%LgK$X9D<_r{Bv%U6cI8kn# zoI&0Tde{e)a?HL?EG`d*h0z&%f%L0!le8>aPFWRu&au4Nn!Umdi76Efa!J%z2cR_u zfDC%&;CZ+RvMesyG|Oo@Uw*O={mR04hgNOrZbGIbHVb1Xfm;@-aD|I=)@j$CqM`cm zhR{Ihg09On!XrrNI)#Flr(`O2CVuL~{8OKp4kXNtrPjJYmjv>;0UCY>f#P-_p(!kD zxwmNA5?Z8dW)$_4KJROLHrhV$gDpd5C$JL{@yLXt5+tf31WY6E;HXN|Eg>Dz7$^W` zLarF@jm#H3bTcS$_LEN?L@xEqjqlB*S9`JqjqRa>!?>7;8_)v>GzzMgd7RX#9edtj zQmzxzkzo+D@YJ|f)m7uP^We4MUsh2xUHiDVePE6);|2;IBAy>VODf>VkKIa@S4{{X zS#W}1**wA|8mih#4TQ2}jhrizVsn*L^MxH*mus!@`AIG<8 zEoKf+Gy95)iXza~i$AUSrIWv`c_#qAbjz*beEHNP6bd0M?f@Cxf_ARG#CHj#Nb zpzmUIJjk}ROJ$;s1gsgy127RCYjNogRQqC&aIogCl@GUGee2FCrGGEMJN!X^WNf9X zT3ugkCyaj`N6yuaLW>@R(W-B_!ZWv>8w0UpLQC~2$|n`~3(rFcdqVgaD>5K$>tzqJ z)yuuwHe5WY`M982ihpCNuT8!T!B8S(kg9h#gXmmMeY&sOiw)#uwe%>xsV-i~EhJwm z3mc3QTGv^cPjn1f=bug{JMGc|efOjv%BQ#z=&1JeEUn6^J*O+ujg2SeYJ2#KX~_WL zbKY17Q*>hY{E<Re|2If4{QH;G=ob><#Qt7)D6&A1!;X8%<9xsG;J46k zEhg*LS2Be*IMWmoEZg^7lG^^zOYE!q-b6)n#CY-ewP&Y{y?^8WK#CLle4=jaI#n~| z8#i8s+44x^I7oIr{)ggZcm7orJL&4fAeJ0oezv_F*e&oiOGPw#4B?rjmmBoH4BgvR zO~3CGG_A)IKq)8-9Z*U4yz^UvNnb*Y_R+kIo#J+r8ult!YHZw%J9m5QX?}Rk-`k~4 z50Qslr1A!gh%8`1hP%v=kr_J<~P@etk!(s-pq zPGQyq0gW+9$c;Ip82(~&v8*t*xD)E6qd9|Q*e(=6F`#_mzMSk7d*AD~tp;ad;L{raTpr_asOW8m!0Y)vtVInf< z$RL6s6K3+ZBD)A6j|_OwH6M>H5>v{ot+Zfe7|jN-8RT#_8`kyx#4NG ziST1>WVF{Hh$H|7n)T9k@4G{|8l%~{i&LcC*ePh#!Z%zg#Zc?(by|cFw!Mw@D8<=vWVkZf+HVoNh=}eZh}t zdTsDZ6QNsc0qu}LdCvKfCPpkV&0V-Gh7l;c1NR-KB8Q+?o&@$N=^@9}x#8n5v(FfX zf12;cW-3|345N>=^g)xfB;!M&4ixUZGyn+Et`MQulCYU8Uu+^f9WO?R=4Jf40x-77pm5WKJS8!Zu~H3w+e`Xo zL0VQuW}&d7k91G#2*v7jlNRzB#6a&`S}fcQ@tlGg@WsrTosz~egFM$4I=z0;?B21q zcP>Dn{kUfU;K{E2R4?R7P=G)NP&^4}wF1&=4-`NOoe0W(@eDzRIXc=Xve1LG1n1MWqks2u9?<>$eW*33 zIT8Ys`_OU{TY&}2FT_Uq)k>bpWt{fnLHHIM^$-&XYR)kixmjscl%QbXd4uJ{BZ0p5 zGB4^N26=`ZYe(0I)$YY0OBkbRj?TR+LS;>@AkAntIu_2dRO0| z6KYC%$fvh8)|hzWBhRza(#Aje{f5}kK{(UxrZ+H=RD2lI6=Bz^xosQNoo8d0Mq_hi z`}*M+XYqphNaMZg0G{}1WNk49Z=R(5GDJAQcJIr(nZ zJp5fE!%~;RyM+$x1PQNTFhOKYBv1Y<+Uh>edE4>P(ISN5ePb9jG&EF!6dfO^S@q^+ z%tfpdpj!7YcT0C#{3TVCYQp%&>Lf9=jp|B2lR68rZjUE-_f6XvD3e7Kyu;dWjy-8Y z`<_2N2Hsr{0_>K$oN=IA6LSGs`6=`b?sVNiSmKDW@*0IuUF>}-lGi&n&mW(C-}0h9 z`WFdg`~@KY(`r2!lKLVe11O$xDEw+W*YS^GhKL2IZnmQxXb*~>sW~~&6fg!L9mOg{ zAmalWTC4BB?H{4q#jjoWR<5W6>}!XL!l4kDEIEb;k|0zn0}XZ7%E{&@y7+E~2@0e$ z=oc&x^gu`*ABdu|0%MFy?R&-hrC;fR?IjlxL8rbLvk;v5^UVr!Z*9w|El(U04u|P~ zH+XW8{dZO}5n$cA-q$#b;*3mrF604%%2*V0?WD?9J;-2@Jq`EbMS-RcWc&<`h6>c) z0KL;W!=MA1I+#FzPx|@08A#C9g$sM9Me%s9FKG+J?fM<*&?A>t6#@c0kn~qrTtFCu z5Sqv`9H&dkh#|w+s^-oNgcee$Z;mI{0un*{ha8jPLY56=XY`*MD_-RmC&};g;?wLI zgZ!e)Vd}t|nDd~{gN!4+*+l0>6cJBaPJRE}gUkgnG|{}_HP;i%`}FN_gqCm|q*9murz7BVjGK33-Zj19F;N5IE{wA9g8P-FA}7L; z(+jGwtJ~~`JF`uPkYU%|#lgG-K~Aq&ib`+HQC#4a{_$Lp@RIsA68%3M$^U=ulCOO? z&o$NQ-VWwryZz?;7Lnyk&{w{Mz?ijRtJS1?FVC*%7r_34(qcL;&=0qb@sF?0zOioAVGn5zKb z<=jZqsG|Z3P8yiEuVH}2L{+^2y`gqR&ZU39ojvw1H8_brt3FTeA}_uPa)+fJ*R-=w zEymlOfeVa1=G&zI@Cf9)ZihrlgweoE2b*HNcH_spssNBw9M{d;*%#G@peMfhfaBI{ za9TO&6fG6py$ljO@kbz)0LRR0iwhfW!U&XyU=&hBb1p)bYic0KXuD*LyK_kDlGGh4 z>s3&AfgnOh;s9_*d4}FTkz{-dJ~N0WM-p;h0OcUTnx<7#a^Cur(=OGq)?^(ClCAT4 z=TO72Bnk|06z)g27@JK89LerK_zn7nqhy>_5d7%T5?Ynhbv|!8P&HL@T;fA>Fds6i zgf4~Ki@E;OrxQ>|QLF1fIIJ<|TcS$gJ?S?cIzdqHF~<6b4iv65C2o_ma2(fgw=ah| zZdk`Km`!#INOR5))t{Co(GBC~>pjqmpfKCL8j;CuSp zp8b(BzQ8zuA!+GXFw#4UMI>XbkR?8hK*o}aQ{Hf7kc&HO0T2ITr>SaU{zApV_3`#} zLhvJCiC$+!ClV9kiFi-nw(iePi<&c6bWE)q_jV*2_Ztmaz;Ss0v;A>dY(3wJy_SF0 zvB!wY0GzHCdcI4c_Uu#76rBs}e+<$b4rdkQge|76i$c(@O4dTEiJZ}dMgmMqP?RP6 zA$j{f55KrrG^~LK=kT+}P1u(vQbi94!~HU8veQ-47Oko0pKTpp-0i zrF=L@s~qz9-3SUa#@x5ff_lpKyQ%sY{H&oSM+WzXR|z3ijKLO9%O@%) zhl%xpuGrpUKy`2UtsmuZK8??4XHZ0#AX@rVLeDC)4jSfYo2GuUgmG}~rOyUsRQ6{n z|)?Fisno5UD@q z`+|U`al1~GGvqyX?b-KGN+i<=FWA+79$BflKaNR+ZliVdXx4`2yAIk-igxA}zVThS zpN($MA2>hx$C{FVajsox{rUFhc}JDQzvrHC)_wo5Bt$>1&>$l_V@kZG#fW>W`v1V0 zJ;$hW@}76YZ#V;rPyh17c>^DbUUo8>pbrBMH&cdB#?5-^F-6=6tM-S^Pps<>b7fzg z|8&Nk2H583-}U5P)_O{x$nU@Ky1;AHh%{$?I`LiCqx=RMr-7cy`+s_ZpFUk;S=w{* zLHF{1OtoE_ow8(#C?hLAN0*QcNhYTO4_`|Cr z7)gCw}Mn1v?L3I}{ zgZ76Vz}N&*qu2I&{Q?}a$Am0zVhDgIxU|&gEyeg0g(MG0apiTHk48H(jdDnSH-l*h z6b#a(G2_M`v|tSaw`YTmuYf335h$Y?Zrff0pcnyVi|WyrQ_<4z^78mWy8@$Qf?|h7 z)#d%vC%|f({j~i6A-FfBeXNelqFLYr(b649IO1D31KSaYvE*_Lyo6d01nk)4kH6v~ zugiffCJ}e%5wMQNH5Uh;g0>k`a>=pbW&+5`qs7t(&PV(9?zx8ikkX+?eSw9(K*hL% ztVZ!dhY>Bb$Lgm|qWd8m2uh5}b%1Qma_?AO#^L*IooAM*rA#@rzjf*TD!WTMP!8?Kp?oDim43S3|Lh;*u zw2H;hBPq65!1((o5PUV;L498-kj=P%+8G%TNs&3(9b*E27xBcxoZbK9$NYWVnsBs> zj5>;&QM7n4`Z~?+Zj+{a{SxIJt`Tnh^;-0FD~zA=`Y1%BxBiY9!rv3>7^^h<{Cmet z^ec&{!lkZ<4yC?6wodY(+r$$x>FDpizuWA8W>Eg$i)6Np|J#S2f0QOrz`_)9%`u|! zw!OXfl40FR)e6Si2!V*izLg+nL&r5e?M%hVG}k=ie|RaqB_4uo zna)9{-xSH~3l(B!qINQiBF{HOqW^IRfN3Sr{y$++{!hE)Kjy_=?*D5}?4Q36E)`zO z2`XOmk=OD#F;U#1A4ShLx+Hyt@?AW{Nvz-Rc#(hD0sl^BFY+=VIpC1Cf||R{XgnEE zp@18W^&kPY9{e};MN8;yHUcLxL`d8-q-!yavm#l%8SL68(^?{aT} z()$!>37a)T_2I=(TY%ymSGQH4@#gwsROlUb zdkeR+20jtUEvFU2Z{2zp>BxSf&gJgIXc*xf6B+7<>!eNsvH7fEkEH3+M$k#!LY*d2LKfNHqS1SkD?H zePm2}c?&CEq>L&^VgPqMCtaRfL(>&j z-Tl*({ap{99Kx5Wm$Gu8$p7az#*FZPbj*3(#*g=!=FqW=2K|mSF~u; z=viOHOV~1&^x4jj_{x*O3}?B=1JD4#zcy8jVknDC+gl6SlB;ksF*U>@5Zaq^++1|* z3DiqC2n9=?sZV>*aq89XE+ti9N@o~D8?NWeY41b8W^6?^t(Y+}&&M!2sX?3%g^Qz! zg`x3_d zSm|y%4PRu-=*8=)gjYdVUPnTe&4ZfX%6JH)n7z|$NodpV8o^rO2n;$hsw4fp!d)qk zwX6$34+-!g7q(4%(?Mi^feYwa*`jZvtkj@hn1l?v#%TvV_s@oktBa9Ah82-dmC^f3{m!$&2Sk_Agj_=|k~t{} z0g?>7!|LxLj)I(Za0}Vnl79xtf5#*LwSebe`Bdm|LUxr^(w+bQ(569P%-TuYp40!z zsrubldkzJ>#@*WTyC3{a_UCZ)_zn#IhhP35EO-3Z@I~bHfD0NT2snP^=O0|kiMVp;x4tjiPy5yl_lC45KC@dy+8Jg&E9}XF z!`7zZPqb(M;X^>8GH6fxngJF9^iHX_&;B(?4Z-jbX%Y}kngTI58H|bByvysIQGau$ z5#Ee(>t~NZz6nS(_oSiikZXK)AjpUY1T&1GIV`bogSTrtM|$EHw73w*Z+BK%TU%Qp z?~GMoffqdX=E-5+bD+#Sd|>+lcz2y=E`!vyF+wq}Xz9+r_Vta(msb0E4M_admYrByLQ^z@CV(0>a>?qK_cwl-}%Om?Z_R*|+`M~J2v1mbr526CirrAPBS^i!)hGte^g zLbrAoMauBoz6}u66d(a^48!&=gX~U@+3>MuMbqlW81kcbpLXqk3bVHfUDfOOwCmpf zlZKJ4<@FNUSOQ9NBLUVJAL*p5;VXRwcIHmEX8b7y$}C}Tnw_!)_69kd@1LgZ#|Se5 z*uPyq~g58AL6{QYS7hkFY03Sq_ofm2-PTO$n9B-w@2)N zKgb-uCSRC<4co4lNCeHykdp+kRE&@mmAKIQ9MGuEe%*d8LH`q?u&+?8*GtSN1u1+` zr-EWV6xo0c<#P4##b2qV`&TCmiP5$eV;1>b^89!zo^hG&uhhoBhTA)KW;Vifux4wt zQC-?kpPFD#^;9q>9)gLh=jPIY*bl4-vG^C%vx|kB0$A3|8Z?x0_G;_?+cEljI5cp< zAZL&~?Gf5smiRoCnZYx%`0TXT0e>Y6Ip}IC2F?L+VRjOo+BWfmxKKfRn^vR3^&)}A z&Q}X320w;-5mWox@fVpQ>({`cQkM!ye@ln7ISf*wORsOQHJq__OEGkBB%{loS6$IHQ@j~0+ z5GNKZz5kPfe)9F0m_yXO9MA%fW${5|xLpB@#J;>Z)w9&+O$>Gk^kj1)Dv-+${L3e* ztdGd5M)=Bz#4|w7|H*#h!;VYEwBJGr!t56?SXL~?-E{)`UKeCeBGV65S=~P`O)Y|T zJiehP2ErUSj5n4CU79mO+9 zKL-B0ro5ry%y=Su&;^v1Z-??<91k%C*NF8J`pa~vKl>8}}%>`m7rc`UY ztIKJ>{738h2Z~D@p?^z;F!4QU1Op1Ewx8vk96F53pr|a3X~S%XNtcG-J|Y42?Q*M6|Ea-`kD9Z=M~IMpPpqA|`xG>3L3 zB}h-CGlqq>OGu5cH*I#LYSqR?_6PnKGDERV`#;sA5S%8X+h+8FQBGbMnSAQ=es1}t?clgh5xq=)oo^qo;21)*onv`U39VN_zn?-8X05iD zB_bYe6BvK^`#Pz}EqhCLjX*xZ<0Si;bcQN)71j9kW&+0eG|Br9e%t%4yUn!mu5bi_ zHp9Q^!_Yl-=2}hyd}@q2;0PUHNuT#oeh|16J+=SBf85#I54}s9Dc*))$goSd;2n(p z+7S?W`!Ib3XNASR&H!k4jA%p@7*WG)jTi=Kg8A#Wjq=U!n>R^IF+N4>E(m0*9mgjE z{;4BP=Q#3+c|c^)7$@I=*>$QjKfcOQZhz+M*IS1IA>1Qy%8~1$QMT%FPUC)homB2u zCKMD$bFKp2^4=~njepPVzz0K29aF}sR`Lw}Ug>{+61HFG%(Z_Or)W3n;fxBF2cmTq zi3R5F#5hH&d7k)>X6G+&=FksUp%?%0AO95o{U@}(?88pwXh9}W{A`TupbMb)@%Re} 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�UjW{jzRR#`&Z@m>voRE1DE?nuDC_*kO z3QHJxL@j63v?kC$l2Rx~jI|wZJWD#)fb30ia_;!?SeyBVmrWod_y~Gfh|{u5FX;hu z0IH2;B@7^3eh`YZqG^$VRpEi=EMjZ34bb;0LkJN-2>3pVJmXZBG#$DS;-Dg*J%+QV z7=>jqQr!mbVD(T++KnjCbi(oQmiaM-;e5l8^;aY~g5nBp2?*_!!fai*@#15B zGa2D)rP4}-6&!>B*%o_AmoNut#y8d{Hj2PfBD?|AI$i7YnfEI>Gan&~$pr!}x+pf1 zcQ-Bu%x31U=WF)A`mmIG*$aU*@Unq| zXV&05pCUk2O<(9lV!fH{)NryX;R{Sa5K}##WH;U}1epyOz6GUDPP29dvsv7xe01(@ zWW+f1%s@t@$uWi9zSGfg*`${e!5n%t1p&y&Io%u$B6*#dYYmH6iL@VYEcH@mR(h~7+trj>d@$eK|H*h}d(n>XJ z9P5W>fN2DM&xAEP4QCrI@q8EKEJUN%=DDB3oZ`^YKCRwN<8x8Uj!5 zF`TgiF*BjL)#>^z`auN1ktVQpGLrB>4^)l9%hzk17GYkj;(li%o}}xKoExwfbX#2v zWfpV#X|AXW{U+)2vpqA}5ZjnHe*hXMV;?wCX9^;L;cT4$U?r$tS;O=g-|B6biB+`J z$?7*2E|$FWa%_W1cNTAOiL02_1HzA<@2KuGTYo6%@s)L9;C*A%fSs zg6>f$=&#wMYogS8%|^MeCA|AVZ@7S}wqu`C%7kH*tBQ4#x*-X=F28id>V{0S3OjQP z#Ac^hyKu`cDQNH-R0XH&k2$YCWlxS*zw=-hx{Ra)%%Xx}4Tcp#;iGmvc^56!VnH7@ zdqiHNC&Slxy!T1%2s(-yytu}A^xod3a*6eCqvbP$(f+ZVajN5b@)~1>oJ?Fv3Vu&u zOOD$$1UiVgFIDQ`#8)Sa)AeQfS3$`@9!3C#+5*aRh=q?42fy(qJ>N0 z+OTS2!qE3ry>b4Az>`$l))ssH2Rc=XkHqDL90m}G%qi@^n13>-uWQ>*hQIQ`rlqvh zH)j~F;Dr1=N$moU=C2?-FzPGN`9*A!k0YkwPH7$6?n{nsO##52Mi9&Ix8b+{uInAT zkNWg`&R9D6*ns8jw3Ue|1)&*6VtsCudTg8)YdIifwU)Bud$99(Hk*B$S04aWY_7J@ zgve8!i_=XOYCWsJ%euBaiTDOI0rqVZl2ugSTTaT`EK4g~d)u8z6gUJM`a55IpU zSK(@*Dvimj}mq6n%&07aZui`S!nUcL+fTUwVtoZvD#gN z<@Z;M!ZXc^kLY-pT^z9OG>Z29xS*g18chbZwi>vC4`TD*Pub^s^{vj-%A3fi2>BZV zM!wQi29vHWqPdQ3{2VJ|nL4d^aRK*7jT6^0A++lYrk^;4PDPAPp&K8}8fe_)j&y-0 zGV9EU45fDtM_4B|T0elnG#<;i{dz&MF%%tpmJN3OjWc&8;@e#-15pHzJ-Zf(8+Iq! zy0e~JaBB*`#X8^I>(9+#-DZ}lFQHb^mZ5vr3bTqJUmtp&3a>F)p?`mVI0-h@xYq4I zaILD9$Q$;9H{5OpUfAFVmtScw(x}(Igzo~xvs?@p$(VF zuz;ZNfO*>opfQB!)7bljZAfByFgo3?R~rGS(X|MB23yunmClqr_U`WuDk~Nc>=p6w z6h!6P486>i)p}AZYpor6D%M?SoP%wB2WK)OxW-{=^OcE@g72Xaz3^$Io#! z<^4a7AM57v!*B4hFQeFRA#EVaUEDt3i`7r*TX^kMKV$RGPb3zMYTLrgzZeK5 z!1aXZ?}cQHLA4f7%)~!X4=tUH> zFgXpr#W!U^hv_JaUGM=Gpu(eKGFbPPb)ngzOR>P{y-IIS0nGr;wBj{)b<2va0VGVT zoubI|cuiT5p(7p7EIA@`&pMZnb)1EFL`q`$c3S^;5Gn+ITt)USv}BRh`Md<2;QSu} zSsOJ^_3nmKnB09L6ljOenL+-wv}%40GLd1TFc7P@tlp7*;y(g|*}*7wX?QuTG~}8j z+9$rQTCsk+(e0MdN?@PT=CP@Mx-Ol)kcPJ1MbhyFz;WtPy%5DI_?~2MU3hsiF&3SX zQErtSI3TVZrYWwH@u#=nG1?;?f#I}0Z+?)122N5q@e>F=fqNkisS(86Nl(rZGZo zuf(1?hxb<=?{$wEWw|=GCm_v2T`r)0;_TfG_RtpcN}+%k?X^;t7o+Ga@uYOQ2;rFH zM`xUG5YP4um=U91CH@icAti7{?Ys7h*DcwdpDx+)scMY05>3z|HIkkMB&80VU$^>z zj2=E<0-YlHd6`@gbcMnTj@TR>zMwU{(-ZNprWojm&k*4UX;tkiNEmMq>h!1zIv`TpGCVzNE=UdghYDIojz_29n!LX(b z{waEORa?RA>7t_sI?;W%_MvFm-*b$JqUAp@2b9lg3)v!k>K*MTd=6xk)%RRv{yq?_ z=V!Y3Y|*DA$ErqX;61^}NJZ4!vaMfJ>##S!$XughF~I$Ur_x&t!t^DlOLZdM=18i> zgky>|D{jCV#o6UNkuN}+(MWiGoR%QAt}yqIO8h#}g?F0bs{?WJ@*bu}qbF}=B%!T3 zp-%${*9c2Jbl$O5qtDgG)EW1W0;LA7FKm8zT!GQKVgi90d7{e{-&xy}`K=|?cY!wJ zYobyQl@8QsM%SbqU#~3coL!N+y>fYKLm|09Ur1THFfM*AC1fn+wX?(uh=Xxi@dZRlQ)w-xQ^f?G(OQ>rUu=G&S7?ms6KW?-l_D}OpMnx z(+Pt)Yx)7V&==f$QzdEKPuP#9mK)4umt+g~JZA$szOTB9vC7FSei2pbXYEe6g(>)F z3(Xv^P69z@v}twhYvO^9hcxZWD0G2T5qI1jf4sOQ_M-iFf%3?T+rw!NUs;2067N1P zyx?E{7KBMTztTxaLK|s9)Iw%!z~(K!Sh?Ic+8ii@Ec?^;jnEMC!BB9GhlyBH{2x5& z@dn9nOf<&kR=5Z$gawlHpmj!h!3ibmZReGqkoB^GfjUlN%@}k<50H4NE9MyOhU!^? zVU>4|^+c$k<=w1_f|VkKP)1CR0(MY|o`+pIlp@RC>lanrAbyW86xV-qej4*eE+02tjG zUby_(wldkGmV| z3_F?)d++oU3&1z7>%3;a(@Rr0<-KQ0YOm~*Xr>bOM#FpGom=Iy{Wk(Wx*yGFQL1qp zOHx4={@p^ML2RJ{0z{EXTrpDq%=l|(tCuY0@R!W7$OyY8^s!3~wufqNYqx8iSkJ^TSKGBGQmvs(dSJ88T zTIB&G{K`o`> z_u@;^2Ps;=f8|C8O?miS2#!UZ%gxTLV5y(1{*Jt4?IV%#tW%IBHQpESroDVax<#T@ z5gFIDR`q}0i=y4y3EbkmDN@cfI$a76obYZ#>C*X`FiNQO5WiF)!-p>sH~fbDkJ-*o zw?0D%qt#OX8cIfF)l1;mg&}pj`*GT=65il_ih=sZ)Z7Q$8?f4|OPyWEC1>|=S5gW7 z@My#pWE4y|4nzo$rst4P87U#EWY4#nG;n6J#B|2-JU3yF>2GmCz#UmpP*_Ln;~d+b zU>Q$TC?4qdWJNodp!5ltRO7I7Pb9lab&DY>p8mUzD33kVl0ns$Rq5%bOEK~%pTIWk zKN}d;=YgSxkxo3fxaYLPUerzq{wa&^wxLtM_d+RA&dbC6Zw6=Fnl^jW!O)Dt;A}#l zPvPv-Vw1%=TyH|R(6d52Kh^V0DB5eebvD&{_U9{kgR%Zc=RkrRx)l^n%F;=$LCaUx z5Kbf-Uut0{kDUctlsrC+Z(0VWbfwA#7@@1zl^tPIj!p_r!=Ic!zJgK(OtK@%s5pvQ!&- z`Ae(RtgHEusbsW@%kByK6H?IMtUm9ed(USQ5L(*@LmoOVQ&({Tv?8-H{h^$5k$0V- zYa@Y=Yr@fX6mJ^i)$w#j04nQvWu_kP-UWoXfTcQyb*X1^0T~JX@5sN`A2}zxX{HAE zkk}0iGl)um_mb>$P9?8MP%gsVuK4s|2iWd)W678%U)899{jx?~E?qI$*DGp*yie-{ z9^p=6y!NZ$zQ+UiHp%FwP*ky?Xa#yY-;9L%gZ1h|eMgW(0F7Yj^(&68x(yYMUAL{1 ztDZ`hyP=o^PjZ=}SmVrWe~BGa4R?<@n|f-kf<5KEN<)wJammgy=~Y_;$r$af8?R1R z*9ASJAAGH_PjyAP?Uo6MnZk`zMC-}x`xILQS)m<(LbJ!#A`rLZ1Gv|%fQyRU{(`-N zfaz4B!o2^<`G*x9nH+J_Lkmh38_~pSQ}>wm6?MGFnHpnv1Xm%Qb|`2}3tv02xFeGO z9iJ3_Air@T9(QN&V1{yIt%gBWA zeV|HV!cS0)lVdG>U$%ma4_{z{h>T1QLvVo}m;<$ahX)vaXCxt`-@R&?Xq zX4v6`|6mU;@WCj*!1*5wr6K2YQn|IIUBr4wsxc4-We_F)eC{n7s7p~ws~zOFmkWv`*b8ZLSEofR`hn>F&+PcZc7zEinPK2)lt z8<0CQXVPt5BgEE@a37wu{(1%-oc$IFuNYG5IQW`%BhY4-K-O=hnVW=z>ML2|mRPpd z%d+t$dG)EaM4%ON{Ev_!)9+SVz3R&7#cy}7^2EAy>TBI%uNZ9GW47x+dC^$00HfEW4!&?bY*YdDTP-{!Wnx(ye2NW9n|TT%Wm}NF{+PH?K{(=O%rfw` zO+QGh2w~QSmqWfR65DY5KBs{qAnEayDGIChO!4)_-t>D;Q+&_5 zM?iBou*wN$E*C3x)?Z?Meb~wtP=w$3jx)XAk`RuZPOHSzCaQ!-1^U@=GDDYj(%uyw z2|&Jf#0F=KSWhvS9sJg^3{3#X_;5<&&SnN;OFv&_FLZo>vU$IK;fhu@fVqr>x#7f= zCa4c*w_W4_rkr{As3v6EO(1Z{l`Z}_TQAcLXr2$OVe7~Fe9IR7ApMEYd1l80wey`w z5Dyzy4iTG1T#y6pH}CoYRZQctSVGQlLUvno03owem>`s|;2)RFk@5X5Uy!ENjd{%` zv=Cg*j4~Xle?Y3Uj9H$Q(YY13;X6^9*Jh#yQZwoEv*-GPAwC{3=QRV~7V;$5Xj*y= zvMn0cGt~mkP)^Bi`x%finOV5Txljs=d_Vw18O%L@}aGl@ED z3H^(`{wYF}pLV3}u(K|_URM8B(!1S*En&XKAUmoU+T`rlykeXe#?>z^AduJOf-Gzc z9Xg!l25kF)mn4)+E9a-Vs_Nax(o7J8~6zrl^dt-p!lrn_8 z)wpm&Ahg=9xXULJw!asKvita0f52iXPl43kHS|!WGwXzbNqJ~ICH08BUHL0B&^{RN znvoV2>I{anX&;tXPc&%`MeCDgfP#>U?Gbsl(-ru*$k1_4oo@wsd<&0oT2EH05c1dI zz4OV#)V)T7Ev1C|g)jcmW)@yd{nm~0l7sx;f3wfcI}$Y_?z-GqCD7%vvBDAhqQ14~ zMsmoKdwP1_R2jpNd!6vpS+}RynJkr>UUwxFtbbd+98i}Tu8y8{wDjP@AEdgC(2Vq} z?lE#g3u%_UWqd2|ojJsuX1^@UPuYH5aaN2G+xh7m3~@W>HUus@ibYT07nd4ZyGoCr zYh8F5=w`06GJl)ZrIYq7#+*=KAfwavZY=S3w%G#I9^1$_un)L4w^$UeS!J3Lpc_knBE^`f?4dLO#iH@Cz;guG`tDcq z;$P+5es-wJRH6{XTHcQIBw}*WXCTi^Bf5nBLuk&1k&2t6k1FnBdC~z7!&sY3XWV?$0kT@G2YulZ@IZScGok>x3r0`#(P2ui`0x-!zK?B3qbe=MOV9 zM#0_zDB|%4H6+mv1cef|_YcA0FGjwG3}*t<{m$xKEJk~nN!V^QIPfNSjqk-i8F^qb z!qz*{qWI8sy(e}&Duj93Fup)AkV9Oo07ZwuW7Z7dl1AozBEJjxJqhS^-v+ zG4bfO$%Sn7wRyngX2kB{Cdu=zuhBTmc{sBd&ajXPAwkJ#eiYOabdlAUB^;w$nI;!_Q&C`U zc=?*iuB$NfnuX9@n{wT?ktx^AIi-4`*C)?4r+&y^IQX`HpU2yx(jAM+s#-MAh#SYs zYv99~u@|uIU}wHF_9gdvLTdcEZXwM(4|b8M$PhRyq}>P=5|4y*OS^rSYs=RF1=t}y zb^}rFZnO#+v(0H!e|#eAtD#`)1Bi;n^c|MJ3Ca$5W$mdyzMk?It?$v%20@yd&I#V> ztRA{QQJfR2>}HlT5b132_D)xUYs1Tm+pm0`RJEt*K1|J+8Wij-9hiU0o@~@K;Gri! z_c%&&O7$DB^~>4kl9XqUJtxl72r6a3=GjaIY;7KL7;Uv-qB5s?{M>*W|3J940b4n8 z`D5wtm+me)gF;Rztp*3@iDh!fxLH#@OHWC`=-NUT3ql8e>F?>!bvxg1uGcP@sM#N2 zL#eM4Oxi5v=UeOzxQRKS{F^q3&b#sP9(4M%`ycQ5iku$%%7tTv&nb^x_OeE~EG$3ZyBZPxrg7Hk7Gv(8aj5Q4LhO8@yr`3u(J1lm47n|pfsT@9WL$qZc!Y=5yhJrq) zStN=`PUJeBDDdw+^ojS}IQP`=va6o`!Xrtq0{P`##`#OAK=dE|~dT*-JI!w0c ztYa)!hxaH;cYV}6hdlS!wG?%dPKZkOeA*&b6!}HSCm1&wN-|!X$?Em1)XrUOuN_WY zO8kuAEfcU;0cWe7S69?jLYLsX+oP2#Z37emUl%%>4zoD3Mo6AbuwtZWbM88HPT5=V z@co1x%6F!Je(i?bc+(Igzo{C8BE?VzVKVAX$?bX001OlJ`go&4D>Kf3X+}3FGj5z( z$F3qENQun5-Qsj5H?+Bae6@S3p!dmh;NnfnXvOKG*u{dlA&(w}oC{MAO(HZX&ifPz z(hb5i#G`%GA76=2ZGeK9cVD0e7tB<&(8WqKpBy4KYf}ViI~mXGpB4|~E?7LN!CZKz z2D!wRCj-#&3#w;Kea(@RFKhUlj<2^&>3jD zc(>#+G=<#LvFf#+fj*d&g5`575V?O8x)-Q!5Hc$LBrBzKf#C$`Cbqb>1Or{m%IMR( zbX<`};CRy(Ish!V29_=~U!mZ9z4qI0Zh>Yfh~kVq)tVaTRI+e|vHyI5oTbFGsIe)T z73A%s)>_32u7OjWZ@oHI5xm$!3SKm^u;$B@H?!4bADAk9Iq&~&?%}z&n}v@M?dVEai?S4+0!rdiH zRmi&J177)kn9KuR=k{IVjpZ^s26Joaz_x=JjPfY@c~!DU$Zbovve+Vm5m1@&#mmi8 zVKA81Q!o;sgco#C4fo~7fV;n<`31L!*VqnZF|)w_(O6uPOQ=uVL$!Dnp;2IDbb#rO$> zp(zS?s(Sp8N?Z^~eeirls0V^Y)CJusXd;J(9S}Gwf`-Ry#VKB(`Um;15B;Ggv8=bW zMp^3YW>qnmH`6d+ckU5&!bR2aD4QTHyBmb21>mR!c}ZE$c&>RWBaOc=Mt^#PoD8vv zPQE?LW%?@sia>S0eix~HeH#XI$(aqa8{=`#8d7V(1CA#-k(0Av6QTcw^_J@>3tEPB zdl(>yzu>wuf6!la`nur!cRe6!Y^V>R8~8(PBq^;3@>Ebd3cOGKd?Dp^_|!GBLMEr@u;B*GnTd_u;=P)%19R&d2pes+ zj9HF4J~|d6pwW*ml2|^ZWs_LK<5CV$i(= zrNj?q$4wsjF^R-#c=UX9zclhqXB)<&g6$t;Y?7D$(}6c#$~y*6V1x^Oi!e0g>n=`q zt2@uP7*bJirr%O?9wQb%KOuPqTvqGmdp=bi!Zh@Q_q+e&!5%Mp@ulB6L$uL~6GtBdLHEunA;zV!S3;)4xGHeYz>+FlQ1#i@!e zNdFRXAZnqDP-;z4HzCQIAR9E&2^GQwh*crL)`5@)*>bTNqyRXfG8j7LnktnN*v!5ULZ+*BSEH<~>l#fy(5X!T{AlJ>{ z^Cxm~3qKxG$+_cc9(E#_DM7pfQt{ti7dm7pDa0J7f8Ou*r1JurQsaGFA0@$r)4Xtl z;i>BII&dj2blB@)>$6JfbVNZb^R4|vr}2$1S2`T@Eh0b-5xg=-TGa*J#`xPUUE}!+ zowLn{Any^04&;zm=;mhhnEyocDIJeCs~3=5LZ#FAMgfhgCJ(TZ!ef8|B^(hd`lggW zn8lnPK{YMhX&C=jF;1>!t>glX{lPQ_|JHSKCu3r(OLe1q1M)0``(sVfHftf}1F^fz z6@+$96`?>q0(&BN8V2b0!<-kkJ_pbdxy5pGFZ>*7%d}8K5ugIa8!Om`mU5jaSm7n& zQucO2@8U}tu4BM42m?v_GuxV5kR2oIV_{DmVBqH>B)N_tc3rk2uHChyeN4^S>b zfix40=zvLsUq*$niv*=6K*hpTtzURb`UkXd5U+q${CH^*3eqxHvS#aLim@hy0PG2h z=X%fEgX#BLeE7V(8$Ccufb-b>n;$pkFXUm&Ymcr-se1xBdI{x42F`-T9^FJjhBN^y z&|#yPKw7T0aH9s@0`k;}?nHWz1wA|*pj`Gw2tGDu>oBaN+vbHbR{{xZ^wv|s4A;Qr zPOfBhf+8yj148ZR-ptO455<%%tNRbS!jKsXNvNpVfH@Pxo7IW^`{nM+;C`qL8T4VK?=(lQXk@+Fc*QdL7p}<@wArlzW(h79c{z z&%vvz^DSD+@U0ax?rCGtjQ3%>f<2D7ZS%CA+no;r zm^hNi%4k|~Y?yf{_Lkie14cTBQcCNXne{Y|{LhYB zKc?hUd@sED7o{Z7nP#xa<7r3U1e_7*CQ(6euo?&x1N$6*r$g@~ECP(F8v8gIM!DL3 zw`q`7WbZ<;EFG|@-$%QbECNh!zjLkOYu0?LQ|P8!_vW%LY!=A86itdIfb3mRey)Ulaw#6==c zz{hA)cUj$`H5lv&#W4u1;#lXTcYOj8Gr{%6-eMTl4E#BQAetQuP&?8F^OwV>zu%;8 z=*eBUdV%vRsCIxx0l6~Ai6@1252E#ES)YxQ@B}F_^a{LU+y@k}7;HqQE#fEy?CI|VFN^ua-lz{ebtbcNvC%d2K>Dj0h z6BuP(F1t00u-SE)<8&!|YbZ{J?f0k^?0v@ZCgL#kQ)QtO52iOH@aDwIL}Bff3KV;a za~em&ydyM3qIj-*5Gq%my;B<`&8epyK3q9xW(U8W;tXj;=ZJQ*iV}&=fhYKzRfNao zWOjZcd}Z9)gX!PfSlnOXVoDPqNgU(lA%@ZxS9GoR3smoSkM7s>Y^{U2&|{SD(SoMa z2vXCCucc4btstKr)jcWjRP}%k3Xbq3VF;VyRnX-CbZ{vA6;zsk=2iF&A){9Z8`jX_ zjblwet-5s{>h7+r+d4QHEM_&H8~al-aBm{lH+JH2d&q4Ua}EqO#L0u4>c?exqHvrI z=R_S~IuGM+s^NhQ8`$F9%pfHaDV+Dw^qW} z2XN~nIvd9$9s5JlujLDt%mPI-Nn@EFKd^txdYo$tP}L5>DT2fZv>EWbSaVoXb_r&h zmisX^9FK`W@6GPEI3UB~w%E;a5u}ETZJV{|fGQNY(b4BR6he{#NAi(m9PljUVf0n4 zS?}X^|N7@QXihXm=WQru?wUU{6Yzj10sF5vjN_>fb>=%~B)t{nw(RKA3*o2t-B`$* z6!040x##CUvq_eXY}n+4`-X^p)_{YumE_d?bpK($?lB01fw&#IEDoMvD(;150K)B* z@u{nvuFo2&w;u1U7d`ETQ~T?UIWxZB?S4cpw-*KP(lWRmMfCg2m#o8}H=`RpRe6FF zPu8=~lj*t>$jQF&{Oox5QhOcn>nmrev+b?~*r}41?P3;7Gr{iFj!wj&5-V3N#aH8FzbG^B*5>+O*Nx=D;J6|zKV){VKR!>*0f1~^Y+X}v|Y@4dLHkl2~7Yr$9` z$o>792Cr-Z{L)@^HN0cDT5dDa=5zXoGmR7*MNb@YimsyVIPtc-(!4lD%EQvgU`V<7HDxp#N4NbjC%w z9fwJiM%-#f5JHbiVV%Ik!Id{zgs*_nrP=0?X0^xSMs;t{KmAF;6|5B^N)V*8itwbx zk~sv3!ySNUka@54%5*~p3vwIvI>E}ne2~(6ueUf!hzilIlqDzoN>U5xqZ5PYCxSi_ z2{$kip^|quJC)r$+My7cpLHdD6yp!2@J^uc{RR;~hF;d9_m$m}ejqO~nt^f~6ZBJ{ zx5JotIJ#wB1Yh?7I3ct1gHh5(U?F|C*^Mo3l1o>g&dkcOQ`WYBKUB^8F12mEiJ*b& z8zCjCCdiIKy^T2Zus*(VEF%E<^cZZVtg{AWein;a*6V(ruYm?8yQ{NkC(;3W`G6ju zzT~|IyMNqbo}(K>*oyr%^6=3x-#~`m8+B>cYLhSlx~ZxP=g}$Y9w6BM+D%}1DydM; z{t&cYVp!Apf9)4e{sqPeMMAn?n(bce`EYTM2$fD!22|t{ABBQnP9Q-EQf7DF!IW9E z`0gp!#cIyfbTN2GM83Fy!pm4f9PPlpf}z+j&=O#P*vGUZwxoGtvDcpp z=8dpdOpg3zB&EjZizi12D_*V{99lJkcT&&4u~l;#dI}rUSa|ozm29{9s1b+u|elVm?1tUP@0Gr zn<}Bk^UvH>3yEt~#us}Xlp#9t+|)*fSdsk^3k-|riJ zAZ<+ynL%6I8?x~U^^?Pci{W6tx}WjZeA(U&yLm096U2$2B8*L^{p%nblg}<*%dSPg zg_Pq6ee6mmtzZ#yY=&N9=X%=H(GqLnWX%Ta-s(c%jpf|}Nf4{T;3#Q|K#3rmkB#n4GuRt$jl_n{O; zpJLew6mcQ9qfH}5?u5W9`oF;c3S#1~PbIX%94v9T^v4BlCXq3he4fTUbg~r_jUlB0 zLJ&AoB86DoLB?L!b!gBh;Ku+|sjyS#GVb_h48=?!gOnp+r+A>nA^Y;C&Qa2^d_zN9P%Ii{ zSyhW+6cc}kO+#Y>jpSFso0bRY;%Fq>fteIQa?6?qr!j?(OpW@%LDJVx!^>sPE~kIWM1KESs%$wwoPSw0>GE+LAiaeQh1FR)%7n;7BEUE9IB z6OdbcD<36pe4}C7i^{wLv?|>ea=T(wW=c0|S%Wm|jTRY7Pef-zw*{`ib)iE*VAZ!r z`70T%@pYX`OnT}0ZR%R_VyZgk{ zVE~G5Z)JkG)LjvRGET($9^BS(i;;N=E!hD$7Y@iZ7o%MlSlz(zu!a5_cQvK7ob`Md`s14tH`byX438GTHILbrgEo;^5y6THH))#i6dynbplQ^ zv_4&){Rk+QM(2hg7XyF-n5a1(`F(b?KN{8W!~nX~mW-cP96VpRyx zUJ;IheEiiH+1vk<5A#qV>u7G@67Gr5AIu2^MvTC8w5| zcC}gZ?aZG(?^$JmF)ghQXkFxGLJbifIsnQwIN322;qQgX@x|f9`Ukd><&4%hA>XT* zXuJJKlbegIw@CqsvX0RE+slp^~mmtbs6 z1oFDPjDFXqq?;fkPaMwQSYH9gtza?~-d214M;jwyZE?CpH#v-Y{TjG}V$krxDlz;6 z_p&g5P+nYaky1=dFEH#nl9TdL1;;nOG!R7v*)e{q@$}sX=nnyf_UQgrLH7yd!(Of{ zaM$#%AphXSEavo{^~CD9eIW$`*48+Z1|)<4m@m(dF`#9OfX4d)%Ah$k|hlY}OB*+bG z`3PKjq0M=k2z{noPa}!2{RjF)ZfIggAy3VNl}erU3&bn54iLFeLE|Y_VFHD2dm&6$ z@gFI@MdV5+P!~g=Gan!;&V4O3MNj}*T%D%Alb~HmH zIx)7n)t?*3fnmOI?>cA_rER!JKnMXzJ&F*9;YPfo9qavKTRi1o&hjK#ajIZtT!!Gp zV4l^j)NOS1VFf720L!}ZjeIE<0#z(B-yK6mT}IKq{GsPoeIf2J_3JV&y*~#+7le>z zTK^Ot>| zRN@%;uR-83fidOJwmmc-IhFVMb3dKgI}mbS_e#QT*?&NwZ_!e5*nEf&A*0$fORHt` z4Ri+Om3LDz2Coa}LkUY00kdv_!X;VAB&ON+GUiyy{ZNBESPY*=SCWHE^|$WItbd?z_sFBE+t$Wk<@L#7i+HYN--hJXAvNx1WBA&Z8=I#uB9IQ9KQ2>GmnvnET zW~Y3?n9>-b&T|}6IOb;gN%ab8N3{^ zP)AIV<)oZ&spf0Gcfz808mdQpSLpe0N(m%Lud11*mZIJJ>a?sh0&~Eq);inTGxgxF z5c;V1^_sAU^Yd*MRH{0zwvaYs15JbOQaYWRGQ)(_vg3H#E6vGTfLc{1awiHJ6X*td z#1`7Ek+B4ah|LE^5)cl>^AXWy*6CI-TZn<(tj|3uvMdsA}`AXgk+2iPM>>k|c zpbZtZ0TR&=C(sLT3`$8CfT)8BW_)JjC*=I+M3pcVJtMXUB3r*S0m zy6G1EzqS_c8IuS544MjnDTKwf$<%sj{VJHqCY{>)+@`(%&t8r;l6 z+m@`)iOlFR2yL}aFb>rDN?t{qVqRTPZR)MKC zf2y|}N^>#43eTiO)xnlDL)_=uG0R zgm$6s9v^N>$j(3)WJ5g`uvx9dhRasX9>Xh%sp2@CvfN=9qaolnB`7?BEyya)4kgw9mV-IN{cHfp72J| z%f$o7F8ofGhD|Lwf}oGeUML(3_6O?~0jp8dX493&d?n4N^pM3SEadl~V>Iy5~*jm#Cw!x~n-GdIR^nuPjWktRq0_ z4a}`A0VTksu`ELnEQEfj0PNqdjKy{KHo^}bw#^60P~3fEtr$JUu)rp#Zcn-*@}T31 zJQ&bafeFUye#|&R2Wt0TTrI-KMIHwtcIfL5xPd}BI?>Iia>-eDuTg8&##+~gCu9$Z zxCop28@iJ}KI3VM0HPkG7IT^%O#l56iVk=g_6rOD>O3Mv11(FqZIik#`gS=Ptm*-R z#Oh>mBY9JJxIoJx)VenvfLTAc`;tu7k3T8UxDiU4jJ zyOZ}p1~Lu%Y!DW@=|Df+j&+jU5{UNQdEm$>+}wAUR`k)e-((EUev9B`Tx(+!)`Xyx z$OmyA+Rpdppluh(+0^spR;!B`Eb>34sF1c(<1nn52L=dP{IDTTQiHq@M= zlR#QV@rt4u4$g4`3HbUH2u*+QHhKhc*XaMS-w3i&=!S5O@ssGN$EoBC)>=rqF3;`* zj?6#*XZnuHpD+Ept|R)NWx8Pu%WYljw5R1G!?7nImV;g)X#y6`%)CY3J9`9HS9MxI zuN?N_8t2pE%jJCy+Qym!?px+9T>yIWw(Vg&Ps+=OF1qiQNwgU%Cy^O5=)Qlzsdp?7VIpJS)>~wHiodRP(*>Od<$I2J zGe12)q0^%X_@j*pLFld`o=G!5dam-79b3!)1=)sdfN?N_@m8Clroaj^u zzNpKH+$+#47;bYGZ7(foB2oO+uf(E?Y%4USYPv1;b$^p$fkRDhOa&Tn;NB@hFybYN zffsEqGI=*pc0FShx&S2#z*jJ72=)seDztaXZJE7GE5H9w_pAOFaZCS|KavR-d)?M( z;Xh4+U($7*DeCQ>p^)FNBe7zHRakRMB3cHos7iTq`EW%9ZhjW@G^)1OMOhDF5|7a1kZ~ z9QS62`z=Zcj-kns)1v}??|ze?Z?Y8$4!aL9MBp|*W{x~)@qf^&{Ga=g|JL{`?4Ce z3PJGiv2Dk?Dij`P={EoAj=^4!vp&!#3Z?ZK>9s5{L%3;=(t4`#eJQfyV&i zuo#uSp!ksxF#mrMNG6i&w`Tn-6NOZ52oG-j*}84V?nkHm1Wy7Zg}TUaeTA24S47X&@Lh2JOpf^-b#lC^RTBqaoz|HDxf zgg==??5Zk2*n6_O_}5TWT|w}UVE#Ff9D?cAoXi&BZGfpy{zTvzZJDgGo$kl@=}v8q zq(HH^`(F;Fkj!g#2uKrqj#)Q#{PN9R1+K-w9fQRLNFo5W1WH*d8fG*=K%3M7Jwed# z4junv{X0JudmW^J>MxEoyj7d{$o@c8T|dB7aA>JNjC(EM*wpIdsqVZmi37C7e?xuGvGb-j37Z?gkr%=A{*RShD>{n|YeVwx%Q}l~nh$p$ zT<)SNw(YT??R4n%y-!kB^^{ocrfLyh8PA^YXJ!BqV?gzx9Wr^VXcOc|3HG=+J`y6(~Xed|O3^$%7wx)n4 z4Ggs6`FdjydW?|g>r%^^E4OzGiq59b%z>CiH#GHoy^6iK?f%@a9stLkpM1%DXyp>? zhd~RZon4Mj%jO#lQoL6g`%nTD&E!OqnE>?76{gGcaQM&6)FjbkEYP!nq>J&5y;`|; z2Y2i~aGlUPuu86w09QPStkoZauKEu>PuXK>We;Oixwov(b196dFKkyv^qt*-8s;}- zruhzd^ePv6Gdmdpb>PQ&1sTo&l8F6yII%5yG2^NAEI;5~P`|lBI0R`Xm~e(JtVBaq z^%R7z)kU7F&H?GVE&{dkGB}_M>ds&2lp!1fS!mN^G5b6cgSO1$ms1$?J3S>&pin>s zdNA1fEU#_%^S00RhgsAN+XB1C{ZHHWyr*@9an8}DWa=HAFr7fefeL+hi(!;3q4mxp z=={Lc1&ryDd%4#^scz!j7$uYNBd8Q|eE76oJuLR`U(Ktr9CWtlLvi&!_c)q|oh++A z_TZIA+O2C3MoUo`VTT`|^4r^yV=F^=elV5E+e_Q7MZfsdgB`_Z|9Rom=kENM`$wdqCMw#9EGbLi$I= z81fm=$b-xbBy_fXWV+b4`(%+PEWu&dB#>902d?w?mQc6`)u~|Y-0p+NUvGt$7&CcH zxM|K%EM8>-1|21kc_Gh{LaT0idJ~vg&|o|)#dz56yRP?ngR0=!ASaNn`|BI?0p2*} z@*`jI0WI+(^4yAX$X^2yy8?`V6x6=QPKmmHP5|qsnD|f8t>(7yD*iUp?)R_c_9NSV zQ^r6WhI7~-Zhe6P>$dwlESY~O%8T()JTz26D@7JG_)vF+B8GMAKGM7}4#%MxDeLD; znJZD^uJtebA*)pspsIbWN!>8w*HG-8ro)&4H4_4nyhVT|!fSnPB`(G{473ur?O{9w zw+;#CUrAR?nhF$DX4e3fYOsGIWmVfrsiovb>k5w0rV@o1EesT`CDPu zC1%M>0#L2=hG~A7{UjV&-%68LNuzx>JNQkv%XNWfb?b-9=lxwp>Y%07)S7cMbP3ESQAX9$$K+>pnV|(q1!la zHNIykEW!PASb`A*RRQQzRbYSAneXhqhuPsy>_eUS-P?Z*vu=fm=Iufn?IwM`GRxBjbV2<~b5B9~x)2j@2zDbQfrG$$F5D`@vWq1lhh{ zWeTN&&8*Xeo;M+~tJuodN zOj&GmLWhQK&PRrfhc38Ay2T5N@rLwul?ttiDANEX%{!fSW#x^E1b@}_Oth?58HT_8 zINYnqF4239a(}ht@_TK!&@#EL_|t=S`;T*Q+`mIFO1g1F{R`HH_V#e>EqCNbWw!QM zdg+lmnn?HcCFo}+ajb4V*um>)2lQ8kkcHuZ6Hj<+7u2b7Y>QYOHI$&}S{t`lOtItG z)}e;1!Qoi>s7R-!wwY%)@BvY6wS#m92fKcsn{JpXE8k3B4j#yNUI3IUE#|R&0wd=| z#lp;tmas9AY1{d^D&|kVmCRdPQv*GZAD0e@Qe zR{f~%7W&3A28(bkE6`m1dhi!_BP)u+s5q6c3>JAWwp56=?s? zo3*Bsn?7J*oatb9G|QTi8gOh{eCt3~7{6=IaPsjKT35?cdp!G3xGHc<$m+$t-^3)B zD7M|NZ)|*xC6fN-)7`r0kiP)Zy}#_s^L@@3Hc4+v6dL3pudGNh>@S8^RBRJzd1UPM zcuPTz5#ZVigX(ByF8zzo_zR+)&OuMHAy$?GIWBnz5LvZrGoxFc9}9~->xf*sLSjY} z0$z=OF6&YKDAT99vw0{vwN7IEx`7Ix;k10D<}7pyP0mDZh{F8ERS6spCrxO@nVZXT z#!GDfQTFTPx7M=;dK8R)tQ0@s9xceQh@7SDmM8ZRwRwVB#K%QS6KJVV-@MNGw;wxz zTPM)EF8|EE$g%bG`E1e8q5efWIlk}LeZ4ZDaQ}^%2H=CnA6XbSmvQST3JCbraQML0 z73Z!MZ5*kIEV+5heYZb-6n5#DfYmJ{=9d#UH)2zN%^1JA8nn;jLH54CZB>~dwZGa6 z*#GfdijLHMMe#)tmQ{+`@t&G-On`z#H?UcD16h3jAumd%;}GaIK3vw@H&~{>&uD7_ z(SF0@&l06!4L{TfkG$_JI=0o@JM2kT+J&jjxqowBSl^f!&5yR=m8VD3YJUOTODoiv z<}W%M%gvKN9#X|>e{IAo{whAaS+o7h`eqLb8?c;!H5$*UTb9yDW}0^>SgiL{bpfIF z9CmiRLqv3SvKYT-uKY-yZ{^kwyrhxy^S}@Kc@>F-(w1B^S4|E7jG`_hkdgWIc;*fF z4cevm`icDgVlrQWq6oAf;rDDkuJxUt#_k{(c>uUvQ~iH!KdGVl^*su?m4ZK?ODZIm zBEKGnWd(*AXk}Nl_zaEt%L@}MUI&gHfglEkG-eMprhGnC7N_D?=F50A)O+?u{^~{F zh?iSOoipbiradq=Hn#CxHjJqNuaVPpwr%%&e?bzn)W166Pa_+0I?S|wI2CQmSi`Mz zcl;sio3|8cJ8gPDZoRUOcH5*&RVW`jf>*q{!;SdvYJsi;J~N4}=&URHTmxHj-gSAl zv9c@D@TN3jwcYJn;dztA)A*pMNCELk^0i$u9PG%oA0#EJ4sUCu+IBynCC$)VXKh#& z;K@FDi8ULCiTs6nUZ1$^Y$0SRgSWM3RsA|Scd35t2ZB~~^bZ0Fh{G^GE>Q5_*?yoq z0FIr1*nV_}Ky7gz#dyE0ossDFA3v$w7bX8Pnz7`Albg<&*?!?>gfQQnG+F1`^!tbN zcRqQLhufol43JZ~jt=xgsb}(p)n^PsXD(6=y>ePIJ}$z#l@!1tXH7p{fD99!?h5qB zf$lXwid1ZNP9r$&CD5@4rM{1fpF?TY{D#i2#?-1Xd^EQ z7qWgTzV(gyBjgPzvoe?B&J-&baoik5)X?;9bMX-hH@L~lUzvk$)32i5(>6x^XZsF) zpQ557j-+C3ZH>FUcKH8-5k_yVjTCF^+j<;zw{!A09yIRG3I5N%@7LDAeEBOO_Zu}@ zSFk9J2?Qqlc5t_9+jA_{w=5U~7 z2PUwfRtXsKs(Z9A|Ne~`i4E%I*&%AD`B8PohfWtAN){U{YO`KEyfX7#9G!^28Cp+F z);022eEki!8121~fT7cN&>g<)dgPziuldVlcX4s3Npc8!);0~YNjX<+Wp?cU^FO zhV5T2zjeGG)mSOt@cryo0A6*0`md=9%J~npk+svWy_AgVln!h^Z&7xOiU>_4z7N60b!555HWy~q0^Stf3vQ> zUARR*Nb3sP{KEmj?m`~GlT!V^Wf?zCl`(h=bh+@(NmGi=*4+mwLgt_4{}gYcm^KL# zprpGs;X;3b8+7WwLJW!Jge2~-#|Giu&-iG+b4?>D7wtyBPYx%h#4>N)ohvnl4N_$E zLRR~;b(*qg$6ombCINQx zscLt089#z(}AvAT-PI}AFrhoYRk@~N{5dTG9*l;3NHjEZp+dR2lhh)f% zVL;CTlr-Nz=#q(uV1R&StIENVOpa#WYCSu~dwR9meN8p^g1)ryg-jr2gi%=CDA)NL zQiFT{MIbZLOilibI@^$KH*n{tD@Q zu3&EFZX&pQY1RBP1X?kt*}XvLrg(V~2tL_U@-6@s5VYj!K0L^Ora)Ws+OkO3 zl3eh4-7Cx2H$Q4HCnujpK-<&qym9?|6@CQ9 z`?TcggX#hdO(JmBgf;PmSv=AC?|QnBGK-6_ldgSTa>(It@uQXxCRlC?+1N)2+$0Bg zYh;uiH#u4&9d{ef zc}%QgxK+j3($UV3f+GtkW<3Bcb;1f(F!2o74Nq5ejlt|F2trM!`nz&4;R!%vQ`%Xo zRr;7E?wZ#%=EFtO8`(0$eFMIgZb4g)^Ksj6Wlv-=bJs98y;s&33R&D1i&+o`1kwiJ zt!^~oK@RVJ-Q_(o+BXpFD_R~&(W%H$#u! zwP*B)ff8r-@aC=8@$K^%Iu9y`Fzu<3a&NHiZ8vC&=VyR!ZFfRq@_tDE@~mWH4?L3c zXJ&#V6OgUh9Nqkc9A=qI4JTlDno?x+!z6kn?@ygD&Fruvi$JLvgy`45*yTJF69n49 zEX)o+9^7>t9A0x$)p4DhESFg40cIm6T{n(x9a+EJVfs~cI-Fq!=D{9jdbE`T{2qNk zP=qGU$$5S>#IMQ>1r_Ak9J->9m0S#=p`i*X7iR=&&cQrwvGYWJke?Ts5EJ1*(Yauj ze-k*34TIXI;B1|wh9~f!xGlESy76~S3OLPF3lyW!WT_i1;QU@*!%*kf4#=bx?U5`F*wqAzLd2jjJqlGT_jk{+DL1z{ojVtZ1lN;#a#Z~oB`GX!5243L< zg6OxSAJ#ek7m1nvzj)yja`g0o%iv$bVVetl>NEnAyz8cp#x=Q%3b zwLtrV{pbsF&jYCR$g$~Eu7zdOV~#k^Rk&0N%jVHaru(`T6v|dDN60HV1dprLhxN_d zqRnmUSbaV?>OTs&r~6!pmO?tago~Z!#gBHb&*^t}l(XEFInNofZrXZt{+Z{^atx?__B`Q*3?tI?z z5f}3qi@S`PT1%o}&rX&c>wc=i<~b!VFE4exi!zKr@7I~=ZZw>kXGw$k zjb{_S=XlH{J8>mW3LKvqY`niz%?;@G1!n8t`fsEuvUBt7+zt7b|ECY!ALOFQB|6@J zndOORqmmCloSbE=K)*3NYx90;>_f}b?!o+J?^w4=2Gs|Y1L%PsQ++FbOqC%B-H_T* zIC70&996}F&?@;l+TgNQ`{@*cb{i89gwr0!jUz9L5T}nwk}vBG&wpJ5^k2fZ&y{4g zW<5*174;15`>g$QU$_41v@p)(G&daJgqf4X9MJmyFRkR8NP6;f8GdE?Zyr;i$G^-z zA_rbC?^{_f@8~%5Vo#Atbj`sumK<&-V;8Z^HojS*>DfBH{0BqVo9}3vX_hI+%a?8L z^LymKV(#1y-gW>JF}ig~s&gii&-Xn|+kE^UekU=zJ>>Y|%&KVL-AguDm&%X)*D{~~ z=f7|eQsxXfdB=DS9t}0b#c8k4i|Q%h`Ud8Cmp#>s1#aZ8&gM-`H4Yy?Eh@maIy^qq zood)AjjR{j9u7Lnb^lJ?h=R&^(lfNTR8G2l+GcYw&2gG%n-#PN9z?k#ID}J^#gqeKX!iPxeMzO`x|J{?)A8tRt@^+>EMOm|Tu9jrfDS0ZfCWc@?n}h#qA7k$I z{i}_9r?U#(RaHcxZ)H-2OFStro_x)7-A{OnXfoyY_eMoV`duu5n_|pY-KcA{a3qEv z?#1<9P&~MG5Vv_;)dhEA!!w{Yr>W9yak2j!zI!@M=O$!_J(4RApnGUvYRjrx|LTpc z_Q9HI;`mr_eB3yqWe9%vmJ#^tj8@~?UPiW!9baa2bQ(dySkJMmTKi%nN@BcNY)AIzBmZ9y9lu>=~Ewmg?&~Ti=Bz{rmf?z`4); z{oZ5(48TO?v}T2h5cgklrp8Fp^%tdBI?f3Ei%+pF(ldRP}3vV+j za+3oSkNK_i`y2D0Zh8kX=>q@74&8t7LZ+S$`>unayaXlGqKr0k1}L|kcbNR~VWMEg z>vr@t&z3a9IRCAL6>ShE*luAsF~v)_*vk_-N1?&D`RXYb<5O$5Zw7GJyFQI{}GI$iXtRDbiIu{U%G=*@XcQD%@gENdI}S(RoWK;G#!l; zZ#6Q_b%9|iF5F7`@Zvl|d}7p3k9`KZi{W3%DrrboP2?|-hd-TIK{*4u!HRUfnaIfU zekqOWdqZirm9{P~Rc%MsxvgV+^#sDPAi2>U6QnJje+asPCP^u7d~?#`Ga-d%}Igc@bSCO~Irm_ak6fh7rY~w9U_aGjbSR9JJdjeb0+$mRdmVZ9$%*^n$F{bV)(f;f6n*-F6BiDPPk!3rBj({eKYFZ5 z%f5r$;0fg>n~BbR2jE=n9*T>SW7(=NXvt(Qn1xD<2=%>Ie0nTTzu4;_`}Q^*x!hl9 z(E`n-O!n=!)8$3R(kDlBHgb%lpcN7HRg22S=TmLoXSl8Qve5Z+>D7H{{8G1gxVx2k zLpox0RKT#Kark5-u2>=Q*zH8e+ldEd2nK%;`mYlBIgni>Tj&otSOT+U$>Gu+Z#r$L zF%8uu9ZK2SU3($X?U8V=O-kKQp=gcoLHwu&=qd%ZPv7wg+lUEf9TkNLVW$!>R)R9 z9qmVQSxR}jNy8#W#U#zJR*vuzMu=6uf~p0X%XF?ugD%ZIvGkGyq#uE*z0-L@R%+Yd z9^vxbND!74=C&0RiNMEBlqNUg;8M|Ud<2>!t1!C&wW#mt1P?4PTNErAq>j#p3t881 z<=zIdusvb-5~WYy3_jm%+GPZtfXYx`qucPkY`z*k9i5#m1U=5WDf#pJ=``|CHq7i1g{Ps+)4ySYK;+@%J+R8xy$MyO*5F3CgeT8w>8UmkA?E(6-TFDY2R+XGSc1I0&LOUM})N&Se)6e=H=Q{^IoV3f<9y^|Xvez9=s}=8FovD=<`?Z8sV9Zz} zdQH0^)yHJqhD#*S!l*TJiRq=Z8b{MydS@sufB;RCx?#*#RnbPw0Ml>+W;*VJj82QtSL#o8`x4|?n2Vq+8Qbr=!i-UHmB%- zae`-D%qBkdWcJ(U7eHS1uZZP;Wj1CLXkacKB$qiEkEbVMVaW){XQ+(pO(KFvMInjLf=O_drZ&VxKCv~QPseui0}M!aJ2Q}$$f z6%8{Y@EsnF61e~4)9g1^ouvxZB4BB4WM68CT0aW2`i&-SSLw8l!jMcOdq~#;kS2SE zSriD7Q=G_@!KuHW((7i$FlJie5T#dfktf)U$qbMq#AY zBBl8yRyomEA<-v+(8|n*Q-YCrMT>ReM1zr#RudK+alUc*ouW4}^LKZ{x2<`2QmbMj zrtwbwee;W!bUrHxDVL^D{~(w%XgkIYHBz7fi*SBAct?%z`;W&m$){ z@WuBbF%61`3bwIR+F zlDRnJKH=O&v9_`xFLfmt9I0)ymSW0J1_{Vb1R_*Kd+=S}S8~ScOC!@ixx(Hs=sS36oaZ+|4l}HxVm>vz@{h zx8h5?)Z_Ura74Sta~R@1sylD`$Fq9<8bdQ31oSj4Zf3I9M8ejmqmREj6&XnXjtTji zZnSl|{7MCUkaZqYbc)C!4L z^H%cEM*|IWBMzBwi}dB?+Xs4SRXE*ZrHRRFHEx`EW#VzZD})ShzoZtY*!kfoEa&aS z2pOh8`d6EO#x#av=;N~;7W)6>sABl85Aq)l>q`TQDeo=13QEKFox1kyOyGX3t|tvL zx#Ynd{U9xs^xltxmQ*3qQ;&qXMEJSQJk2eIzDis7SM7tIM~9`pAY{`Q^A9o!UmQhS z1&WE*oU+Fz9<8BM9p+?nnwX$ciBqSr?C-lR#iYC{1`}1FgF!2^(1bmZ)e|udG>*aw zM@%@HK7HQ9qS?Nrm4ER&OfZ~{3xDYp(=rHicEbTmT}p?DG;d1#7!#Gbav4g)j?>N$ zq>yTrR7P4;yvgSyU^rW)O;UdpG*LFt9UzO&I; zQr&rS-+N8VK~+e%HQjjVx=BE#Vwt;Pn^`8OflT07-b_t5Fpq*27C!PcL=HOjiji-M z^m}x-kdzgL3*UEa!T(8RuhMeY##-0pki5I_9M(s-1HD6$`>4(-E<8g}6Q>VbE6HA? z%qI}}!VJ=lC6LCr>;Kt7z)-#2`~0|2R-?jrv9SeCnGk5J#A)+7i%m(BIY}XW&2_4j zE;E$%SWvO=N~}sD&wX@dG%F@oyU-~srgC2_e#hiGtQfUl0_`@1l;630kc(J|)xMDw zg&xa$wLgd&-l@O2&&GHFU`WPeimTKTEW4V4L5+rhWqu}$sB zPs=}o9@shQ@Hh69u>V^VX?v4b1`Vl3)4Arw>7c^!NaMqW27TovQrQJPzPqR9 zuuJU|ZVS0R*&i1-#sw7rMJdf);a8i^ z3*&nYbD;4LQOi|i`lFm;L=IK5RRnap%v7sXlFFzn9rF(#Dy1GBJ~TGlAWwy2QtUAC zu}l|eND-I=oOh}0(VOyp;_&u1!6`#Ok3HXMsbl!nNY?v%qWhwv9JVvb<0}23aZ^lE z3QT@dK2G;`sq6LL^*V?qrzYg1#PfqY*4nLWX=EBHS;X^#S+$L!mymQ)`%bOAruZmw z*=v)xg{Z}LKeHVAARW-HHW!(IoVpC5skT%-kjEqOXctC}p12-@JWIq9*|T8tn{fH+ z;h|azQ`HSw@;Wh#8%t`|`cu9Q6#^N(k>07-X#W`NlL2$|T!YE3tV?LOI?r{V<_8e( z75i`(s6F~~YGDx}!(6pt(cR8ni)8{&^=8t3clSpDY3_HsGm&&<41GXa+G9_@qmtgG z>`n3uw4L{pOA~yD<&Uy=h5NN)-(A?PGNo79Gf*OsG0+F@1wbe=51qRfLuy@4yMSYb zl70QRT|O(RD%_qeO-#O|x2*^Z9)+G?6hRG0Y=mH0SysN6_Y1Y9nF3uq8w&8f{h^!X z@9T>G?m9#8hYnCpyB2-C>X8Mvgri-*$5WQlD$k9UJ9^?$z3vhMN_|#8Iz(UTW7uhV z&3Sdv^Y%y-9@(G}WP@5mv4k!xLBK~bjd;IkAKOs@=YZ0}uQ2`g4ixsXJF7&ID}H)h z^AItJn<(s#BkKKB@n%}HcS9jdakn>1XaB)ZB(iccZ8XFFr)g5Kc6#i%FfpE-vpCAbs|7aTscAfi&zXtK4YU$U(6cKGPw=P@;xi32;Qw zkIxSkxgVWXj6G^^FBK3)UHZmcw=e~}@ylM3ni_{!k1c3uG=>s95mcp>p;KA@Oyzc~ z{mo%R3grSW;NQ&5KA^ABsNLB(jAA~&SBgw_vt3KeBPmpn(HRc7lIOrgzaxE7GmkmR z1|}okcCT^_cb(EU1lPINd^PZPS;VH;caw+}RvbS-#2gQzB-pDS7IMizhNuG`T zO@&LJIx6Krs$IKfdC%`W%u!K-X&1(2jx6jjmeDjn9cc;@cirg?a$zGsvlVPF(H0ic z*99oo#*cR7+NW~J5wi+!#0;wkH3|@=)tyO2?;h(+Ajoqju`}ty^$x9 zYo!yP)o2lu5x6AQ_gWD<7NoTHn65dXpC+MHz>?i?y5th!f|5_gTMdo3twjl&25%G@ zJhQhd1GQOQcP()lDm@>c1n@HVe)O{RssZvczt<%(biHmJ6q0ZbYu0WhGI3`Lj}8`E z=N0$}3pd!$fq$ADQL;X$?D2K6ERAGfr_;N4C4G;aQrp>bCJsO$vG6Ue;*8v&Jh| zw5HM0HbD*raBa$aC+>kW+7~n9&?RMMjpT4}Wzuk0^nT2?Tq1m=kB3QCNcBidVFR0d z1%#Bab)Cv%aN=6v#9blOL|GPIHEc3AMbs+&(i4SsUvsiiy7`?@k-bXhQ+VDl@1PG@9JR5nb`h z9xi)59)v!zxKMuVc>tRkXtO~6&1W9Q`g;m*YgWX#T*>-iAy@vY2gSQ0KugYUpgxZ5 zTxn7{&Qhfh8t%xPtfx4g=7yE43X+r}dHA4@*t|XKomNIUv-5iulPSt_X_CFELRaHC z{V^>HpG1Naezi@xi$>dLg3YbkVM?3UeUBw~T!pJ*@5DK-!?emZNlB$i6{oNETwtG z;c`MyQ^a}QEA$d>F2h91`g3j2QRb7c%sz2I$1uVc%gL1S+m;^#gharT9C^o^gMc3# zp~uU6n3Nhj-`#RfXCq3B#p{FLa-1Ff)}0o$W}50^mS+b#RVF!1<$sn~7fFMQ2~Ch z5^c~IUzxjQYbptbmw?Zq)a^8>My{KF?}ACWmQaoEsx+CH*X}50`sPa z*d|@6jR+VZpY*kGIRygRL)XcaeGpeM7A#d;cu~s&@=3= zLHg}?-WXKaQngL6-%<8e;8#bEz z<5$TPeUUNI5a>2B6YCB`%YP&8aNz)}GSj0qgi~}9MLx4{bj&sD6p{`^F_>qaAWGBn zDJA~Ripmn2EC}@{n|^xIX$LzIO4V1UHimqzjD6EaUXHMbm|X0)F0wJ{En#X)J;~o@ zs#ujI3PP9Pq*%17oOEnS$_;5_ddOQ|C%nAz>U0b(THT=VUrW&%>Uy-a&tx5~+k0)} zl=_&!a|b0TTBY9Sx$CHFUbELeXZS~eGB=+Jt>Imjg>3W@h_&nx-~z(4@$_iV@;84srKC@ss&-B<29} z3e0Ij0FvDP^yKoeYT56LR*?kHY;{p$RU*=fG_UDxh6wJnO$7p{= z&r0W!H38O61IOA~Yq?3Rj>gC=$y$Rpuc{C6->D8`sNlG@!D# zMn?0giMFm<9&dh5Q_o9ZvnLk6m4rvb3Cww(2&MHntBVO4fIl66SD#FO)>MSy(M=MK| zj`QJ^rebYcp0GvIo1=q;;M57#_QdxbokX?#_Uf1*?d5J}{1n$zR#!IyfSR+FJz+%X z7`1%Iup@P4Jl7(by4c@+wRcABfyDHeQ$DWLZPST5Yv)W6P{TK8WCba&iuZnXjUhH` z=c>tF7++e3;NMRpPIPks%oQ|k+Iz6i$c0CPNt2>sXv8loPjR7$q2feqgtU;Pb zpqsbR#1chJo*S#R8)!9vumiXt=ddL?3F~59Nt@u*&*>L9&53VK7(?EOuvpM<_)3=l zY=+3-<4|Ac<5BgqsUDNf4qZBS%Z(KA|_A<I>Asj;$Ss23|9B z#qv6&r`M-NKzCnAhgqy{AKtOCs!&% zP)A7AaExtb&ps!|jgqA&bo+vI+#ELta9%nnxIwmqEz|PYkKtD{D9B1N?`(hf2c!hB z$i_dlB_b0Xr+vd^2VX(U@e!UT&35mEWm%G%h+(9o!7!1w>yD9(2Je~PFn+XYkoOC2 zuB!69T?xQLNB*zm$F8L@3wMpAXFP@FkaL~=HpX3`uAcv_XQoy{r(M(%1!_lEf>jEI zG{wO#d^jpHIzIBM64DXyGJ+5MqIM#je$)MSuxv;~wOU6ZVAn`LDC{e}AgnXOm) zt_Q8V-$N>KK}h{s@50?)b;O-r54W`VE8*A=sVT>bY$l}hx_{ID9TXB+##e+TQneA#N$D{kcF1(n zXx&fh86etnLi+!SZ__tRb@xW{6f-SYDSHyQTsy-HufmkR{lKJEau+EsK=@HjYly&HU`rV{b_U zc;(vpB+nF=KKAa%r~Iy?pSDC=#u}==SCMHvcd0q`2k(84(xcozdacCuE$3x5EA%Z( zUKM1m>K|zCvC5iyla^apbDW~v2Fbddp3)B*3kUg_by;oC|w{*FjjA{dkb+^T*U-&XuIkeA3;YZ`^A69{>t#4;CSuP6CRTh7aA z2%Pu>rk8O#mOV!4O_hNF+;ULjxGAt?+ ztZFK21{O)=s{EXEPrXk-<&83dfLigDQL@p!4(Wrsy|&+PyAKFji*fB@49f5wI6HOx zzAsgPRT`giM7LyPk>j<}^olR0}p-aAR3pS>QHsD=SoX8B>0m zCZD?fsXV|Q=%O|Fs%u1rT%T*mrW#V+j~<0#%j`L$PafO4eRNjurpkVU zDMFY}y+4t^KwBG7>T24n@Tu+_dh9D(DzF!`^5eQiqHw9KP?~0 zm}5V|47|rDZ!!qm7=3pfi15*?Yk{x-rv}f>KmFhB&bXKkD%=du3nePbx1dF4dl zBsMBQOLn&&%Zl1}WZR4B3KvU1bbB$x8n#L04T>P_p~(FR)V5cr{M~PgS@9JLbC7kV zp-u*xP#JCJxiH5~p5Zn$Vbfk5`&h|^SDglCb7fU6zPUT=&k`GV^q$M+$sk`DgOgaQdr@78ghIOr;c3Gc^;vV;VRCCd~ zzX~Qjy`Z?w^q@>nGbWN=^{Z!UfRnB!D_xoLu%{)BNAgX~0ghDA+;*8u)H%3^#pOP^ z%>vk;BhNmu*I~B$a-tiBO!881<|}N~+{hFVz!2h;QHq|oDhJc9xhiy7=aXMD=&?ss zXGxnsOSIufmsJ&pp;x<$_P&nb+H6CyeZfq`{iVJj@0E!{3746$uA8-ipuX81Ze4Rj zEI!|gDUd~C@iSEsv{F3S!yGLB?jDqJA%qf(mq*w8z%rnnUSr6#OxX(EOxiKkZFf2W z7lH6g_h7U?r4*B`lCXjmsBD6|9CLc1nok_MH%dl~SVx{FEgvxA~+n zuMxzyqvl=)-O5Jxu^nWoqq+Y1CJhU+0zBxO>v}WU?FGVjG7k%|Be|iKCQsG6{#-2; zA)nw6$j*5`*s;g!^26OUG76<)k6WjsS=P>MZr)!hGC;q@AIMmVvb2u>L1ERTP zZUAUUIOQ*TVRbIW{UEePB&Jvn#RSFHzRQQ{4$}{xcjHwrn6;)i;s`2yg4{CGbB48% zTB91X=nY~nP{9D%mfKxz7KN@;rz@k@XX9pHnE6Dx_XViZZZ!S){LrWCt3j9oc4qcM6s%-wt(zWH=E~mOd{1+1B!u1(i_8ojc^i*1k5Ju)2 zv`qm)kj*`FVB&!}BoLZcYQ)8`E_JG(@5NE{;s$t$0!JT)jJ%0tn15a6p zUC^%(j2Bgwh_Id39_ZE;h41NPtOpbmQVplYFb>xzBxJKn8pO0eXUDr=%GYw|PH7b44z4l7uofy`&zfBxk8qpQ>VJ*M+9}u0@V=hR zwbAL&`_6S^ZGn!>Umtp9vXF}`24OY7N0SI8odR=9g)HsaWy`Oz-po$%g4+n%^Jm2u zDs|RBs^#F5mS>_tKfqxV5%s_^oGg(%Q6z2L(MwR9d6UR(^=$AT@ya?v@fd1O7)v%Ig@Jpn6_QT*|?*0 z#rl>k@3Xw+`-U#%oqtB`=>EF~Ywq zV`#n5o{UQnJ>fgwVi=`@HX(vLQ&ikXqRF%kD4dtcZ(3fM=oe6MvXY2gI(FgS7fl(TQvJvt2AY3rp)1j( zb7GoXzW0q@b?8hPDdU*x%so?B%Qgee>Q|Nle(1u(kn6vWIgp+x#o~IAC=CrhD)wt- zYc}TyC=M*W+WjYUfR3K7Qs=&7%H!4w6jOII6bOal6tvv)K&#hdIi5X0yV9a`T*&HP zs=OR=KKU~`tp1|Y*B8qK3cleiqDZPbVlGRSI+V~B=0lOWI5k7P5R@~Vkoc7KTY?GS z)4Ai^T;9KCQ`393qd1QDo?|M_61FHKt!{1uN8aTA@+@ho^T{>nf-&39*O^0Qa}xSm zHak+^t9%8%8Z0XaNh5poCo^O)mY;blx~iH_bmqf0T|XOeS~m1G)+P}ADp6Y7X(;CY zX3}W$vLU(Rvu0C~(P9wRGv1X}D=q@1*lrXBIH{4-Z!@$KFfmODEqcY!1~uR5Jdr&v z=bzF7l5|xeym5o}jU%r-4K-tUkEv>)>n=vYDDnts$-U9OxT|SaowdJ?xDN#yGY?r- zf7@gQN|4{X=K%e4EUSH|?)lSC?5#71F7oQ_ z)cQ~iRt0`7(DFMqCk>pNSnIA1`aB9jf)WeI!A;GC+ zgz3#kA^w_^#%Vny1 z>y+~oaCSw!$;VYkJS|CCq11YbsYGUabaz5L@WTh_hx;$x$fVjm(G)H4$pz?BOOIR# z06iNhT9WmLK%u9!o_nhIT5Viclkj-EIY zwNkjTQb;xN+d6{BhYFB~rW}3hMS9wmuYoP-jaPIn^7#)q%NaPWrBFnXprTh++MUL(urz z^DfUNbKzyv9T)Q;ExWU=`cx<&@~-4T-o~HKq))^$dhz&E=k=1~zVrpw!#J#(BL=PcowVsIxPqO|Foug4c zbhlH@7)w~(Ym;e>&{OnTJ`#nt2 zGcy4xF071}C5Q0>nGWR!c^a?$XeK(jy1KRIB{pUxO0@|3#H7y|9ABHefU66^B(?Om z`ds@7m{4eBUurH~55UGW|B-hld7UYpbv-$uE6WH%pc?Yc2*H_VJf@*RuOSi%hvF1D zbS;NdvTg6%m18W|%{+EJU3p#-W6*j;ezoVuATUl2NNgj(6_ zPsQW$gXL>CdYDf_QZV(slIHs9$mc)?$->n_UCL?+%9nB4XCgPo?F%(r%r&2$=_`#0IjkBXT?&nSW2OvOKT+&Xgw?X^#dbN;s|4|}y5T8$>_oBgdQKrW! z%^BJ(GSm5KcecRPaaC)*O)P~1Zh__D2QYj#=={>!FQ{;_E7`T^2N4k-p!0^_*x_w;w7usp zjUCh2hO5llk7;D!_1K0Z^VdSkO@zypCdlcj%y{1NaAG&I+?2?+SxjlRxUZJGKY~mx ze$OSofBJw^+sS8yKfl1s zBfyI}|G(&-|LK>lwT-S7`bsMc3!DG!b^oJ(|F<{yzsavBx8$S_?mxaC{qf+9>whR< zFnc^On4KT?!l>5q^Q!acw{6x6Qdcm^HH<^(FFOq{%U;G{QvE4bb%9B3-~H?A)))+B z3H-M$fSr;7gZZX>a9Sfv z@4LH}>9Fk-F8X+?px#Ft>O)yT#Lv=?MSdM1tzSKl16(I-vd$f zCH?Jp2JbbyhTCnEz^vt znpAYX0~zm)#rZ5qEm%{_R}10&4d_y+3zquBW}nSJp_`o!>~J~Pd@eb3E~zgax@tGF zU7@}Qd87NFUv1l@&gM)N7iOMQ7bhQe-l*=)`IXT$Z{X2na9&7pUo%^>`9_4Q}ik?KUKKrNJVSl+^@LxgO3n9FJ;-#v#@*_2iF*6pw6~)fx((JRHrBaGX9j?;9i+X2 zjblSTj=%Ir4})9}ai)@3U+m?e_vf}fC5LV`Uvt%!-Wr=9 z5B3;nS@u8K*q~9>e1SU=?mV7NW@9D>M!HOY<+$$G##!fD>cN_k(WdLoRP>Cuh90`2 zP1`53q7sM>(UmZ0W4b|aq5U-f5Kt#{NBfKK?{Zr)%isbzU?`zyM73HJu6^XGa9?hS z@&bt@PS5$le{-|lz5<=sW9kze4>ayTyPChvVS!fT&;0pT6Z|z39*!rU%Mk3PgE=04 z`xlJd_d9KywbYGPK`dQ#u2FG_n`n)oxF@J_kg!v_xOK%{HIQOft`CToj zmuA-&Xf9EyNY}EL*lm44T~l1cBl0qA*Hre;(s0oaPr61)`7wsH#Td<;wOiUJc7rp+ zvQ4G=iPoi!`OHFDzR;D0!VRWCEDq1{J^rfTVT~Nl!qw@PMSDW|53`iRr>@=Wz7e^L zPV+p46I+B${YAsPSTo$Wt8}u~*ryMskp&3CUCMvjQ7AF_X@~m4d}{dvl8OeWNgs>z z=|NK{1470`_@bRdJ6&0r2~-mJ_k6M0m`NHhSih=R*=rfad8zg{%x)uZL4E~R82UYT z*>%R%>u#E_y?d&24cJ=}`do~aM zU6?&47D)GeFPJLQXUzSWR>E@u>WoSzQP5p6qAgtec@Imtt%lZDpf|X@hv_wrGappG z;-mef`Q9X!YVVsz#_{|>xV6_?NpCNx8sx2v=MJS%*G_g9r*+L^bCDVN=z5AY@^4S0 z9m#&CTEMVl0+hYpT67htv-^@wM)_I0SGzhqCwPyBndQ+#W#s;7YI!WSmZn^Cy^q_y z1>bG)D$BJ56DM|8riXsIKg1+C`{VO?EEJl8_56es2r=K+=Ew?zmsFp07gIXvgSm=ow%Ku6Ft$|}4A zZx`EoK+u-$>_BkT{^#LgIC1B?JHkW~T9HR(xvoP78 zq`}DLUU5wR4Mx$pGH5^Ksgr1Bx?pk+grE{ICCm$zZ0bNqZt3y0HR?TbXUCx9>cUt` zR)YKhGRE~~TpQDV>hY}q>K4W6xw{2<6oitCljB&6kFBoV0El&NM`w4 zm|7~H#VlHgO+G6X2!JniIW*!iiqJ<xwAFGDlQ9cX60w2ET8V? zz*ks5p8{pC4(md^1pW}4C?B16GDD#{AHxS2{L&T+v|=cK0c8U+G6A#uxugHUUY23I z@attBvc4sWZBcHZ!d8w-SJD2sFZe7>L8$Q?Snh_h28cAzD^OP~7#R86d^Tdgp%Z$9 z%WKInX&}&88N#tRMRyIbQG*DRmmw6Ju(=C&^;j3 z(AD|-u~V7WvCy^uZuoT|a)r-NT4)?C> z_5O{=75ScQV2WE;dTqQ{b#h8T^lKpo+rD|2<>F~Ru=S)BmxtqxDsoEoNx^RIvQn#_ zzo&ECct#}*_IHw|YJe{J-C(4JX^+oRNyX)RKq(AdH=)=#@xgoS+`Kj%kqJ-@lPSoC ze(S}2+kk!>jhVqHn?c!J^MLex#|y2oRzApq-lew4#F{vbXG1>~3_7b73``{T$1D}H*(9{O^aqz0&DKQ`qk}hX4yyH+$c0>8 zov9W~ly8YxS|-_tig!D+UzO&36zw|r!Z60M`J?_-Gyne0aQdFAB`Hj>OSHanC%2QY zLI(-Kj!4e7bJlF2v(ZfQmQH8Bbnli^5o2i_g;==^-NmB%ZW6W|( z*2WZZspkIWyKC-5*cIW8?F2cUC(l-RinuRP}SLTL$K&YBp$;`owu}xHeCC zvF|v$!DXBGY^j5*G?XGz)!z-hU2R9Xp$`VsEE|PspYD07riVbtAzL+GF&V%oU&!v$ zf9_?2nxC)jUd{aKnkcu$$u8(Ky9AB%{CH#FWOkb*>Xfm$OndVe_IOAiv&f?1bDZws__f?;&V{DbEW_>ogfq>Q`1^gPt^B z*lPTE&r$Q$=sQ#8P~R_1Nf<$Nzz!zzC3h z_yV*Bp#3R{wqawuLf~p{(U7Q;ZBGlv9bx#+oP_5_0i9K%O3?eUkcZG=4m1v0gY%f| z$EYNy=3vT^uaA&%HiAAsyO#LnIcUd{S2n@`GSwJuan5H58euQ z$X>v#F`3z)jVw!|ykkfRr{FVH>ekkWt$jp#`f~YmA!AnHun(xhC^gPCs`S8UZqCS^ zoM&m0-9UGr>8XnE2@qGh`0?~12wh;(Hfv~5CSh6K+Mwk&MI;>o&O>m%%B7}?!UhMc zb#e#QM5=bWf@o0ZfQS;5)!goy9Fdv3HF+^oh0A05CpU))^>zX4()ERLTcxUfkMJQ6SWyHDq{Hl<{_emG8Zl{tG9fMm8>Mlqz0* z^?L>H8jk^-n#_z!V4l>>M0YhPE2c~-v!b@7OxmL#A0{><>zKUrs|%%wUrg$f66N)+ zqT5DB!=p6f%E>923K)#}wS5mlB?g~&ZssmSaFigQTaUI)RAJ{}Bj_!2>b37-v;1SV zQ(Ok-BX3VEemE8SO+ZT7wp1G1^mgt;J8z$>Qj^Bm?UBU^gb8Y`EkCa6;Lq=Q5-%UB zys6gVFhHq8&X6@+*Y0DdNqCgeK6=51q4m_|rWdsLb-tzQ%o2)er%{;oys#*Nz+VkL zZ}t&iJg^5`u!IJuW1;5#uI=DyRu}EmiVT0~9`86UU`D`)fAX}%o1;ju+WPa`H}R{r zlN)Qz1z7J6z52F7dz#L!9CCBPOfKlJT96;Q63)lc$9S!bnEPK=IZNZKtXaKt5SSMX zC-aBu^sc)nXlUsXA(T^4Ojj;)w?-l12R(iMM1=x38OfD=O-Wk+y({EyM+_EQy?YuQ zXkW9AO==SUGO^JztF{>gLKE;2nl^DJ?hZp!_GYms#1_d~1|lFlg)C3~iAMq0sq1Np z6Is07ehN%XM#GXW(_cGFMdJE=dP4$MUlf^$DN%lNmjJlp^wX)SeA`Heh8w)TVw62N zuq8s{7O65FE@sv`xCJsrU==wC?nN8&O^T@>X4eMpW)MwYWb+=#zhI0?e%$pQx3JST zKRQpK7s!Zd3io&1wxVCv^SEf4 ztPBl@%|=Q51v4((InM%qvhKD^dSM!Ap3u2moA~42_mr$U9nD!n!_+m4fdvuUfRoo! zHQELGg6~tL`KQo53Dx))D^#%6N)}8&mxFn#;@GfPR-s&Jep+XbQ;YpVoiyjvu$fM_ z6)`_;jbD1{>m&5eyGJ1WA#aM^x>-r%YuyI|MRLm@Rm#w9h7US)f?6zuc^4+Xo~j+h_jL+0J$rmX3_HFoFxXiSK`cIr}0z>xU_L+KD?Qx-hO zhI2L{kpmQ1gzFOXC8dsa`tDthIuoCI%9io~4U)0_C{8)-K2_|DqMIi)%moi^N|w*k zKB}uj-|6^w1b)kWCK9h5P68N;Bn>Gp8jNS?JXX^|SV~kzqJX*(G zf$k`*T=kD*pB8_O^IZ5SaG|Lk$n`d$sTxy)AYr>uwSQ7o> zCN5_d!L)O8qhwxkyUm}wnQr16e2;L&D$ob?6skh!n)+y-T{REWt(He_66plAxhx?h zY@0H%*ISn2Y7ySkoZa*GcDyPfdnu}c5pXllz*qoH9%F|_k#-{E>L=zCU}y-}&&!y2 zk3|>bCks-Y$To%t-%5?SY&5B<@K?AV`z*WT*Wo>VF-D*#o`e(ocslGcI$-B-N=;;& zD^o>I#1}j5QE*el>mH%!WZoDvOu4fB@~20tsiLDMG6h$PjNMTfRwvt!)dPX9XX*Q< zhM@D|f>Fiq>bzDU(FjDHAdpT~^#J`XOC7>Dka*_uoV%SwzHa6b-lde<{YVbstF{}4 zjp|C(iO^_6vhRbmMPg}=L%qzRx@RV{jzJwH(JEQYQqak2%`nc=450K#&u4o&4Xobc zCGL9=ufV@ck+>ryZV0G+uz1|+VJ)nouF@C@>$s3Z)>Kmx(a5R4r}#l@q&1=NcP1qi zW=^PAGv(Hs#k!s)2b}2+(ztQ(fyJxHfoD2#E{)3P2QU*k8u@Iup=&a7;dfPw`TP3x zr?q)q#Rk%Z(Mfh#`}22ERY zy3aKxs>G>(YGI(gADb{65YoNxM5&r^&4sI^uZ8)oilLfu1CA~0Rx;69EgcjWdGcyb zJFe6Rh$PCKdpsks%SJ~WbGw{$pldvf)2y%dPw(|HgL3KFnlR2Mf}C_Pra{;ayZ3lmpw=>L_H!bhAA=>BFp32?o3dJe%@^UQ-#-A@KAzXML zQl?EtH$Qxdmlp%!khY$g*hY_lDfE{$b2a~}f-oH$ zki~QkiNtMeES4sk-F&MrTOD%l)1pK`|K$N009-($zXS?Uu!onAVA@Pa-*Cy9r8aRl zlkPhzA5g|-aQYZR$(AT&+-(PZ zrn72D32iK0H%&!onw{*ANk6KQ~pum_|&AH#J)|XR@|b4H*XQ@_`5g zeX{ryN^63!QjpMtsLEz^q&IaaE*C-;m#@|_8_*jc{EE3*6~R1val`tXOv!RK@&kBz z=Nc4##uOsBj2s6J!DW+hZM5pPpt;)^FF83`I90bU7nuOALMAgOz)oLHaP0QPl#Xtw zaJ_U^FFFsu)LVWC!9y*>_k~%k#G*uMB0}-!WbCi#txIu*8qRR`xM6Hb3|T^=RY5Fa zGJ+dyr8cF@wKl9M-icX_ZdS|p?5cQ{Yh9bDx>|0RBvF@#UTZ^qvhdvxe{>F9Qj(g? zGj_W>pFL?=Me)uuJ z-a;0lsS%dTDnBAH)coa95>R-+Zgjb*JNc_~#qY=3XdS!lqg1LmoORtQAB(o#4MU+= zoGA)>sLZ`G##bn(Jr}#2>piW<2+xo!3h_!KM?a`&SwXM|Z+7$C9%-ENr+)RxKKtUL zxCsWq--p)aY7-ThZUJ45uYR%H0E*$;jRN@_; zC5LxyR)+lvisg&>N@{EFv2Ja$g)5%-6lvH6k50TRKYR$Vztgdig0Zw}>#x6;+6)8>=LDau3_Gh7yhg9CAaiog(YDZ5)eAU<_?KF#7^pn-4!N%M2 z95~J{AzSarT(rGlG9;e+gy7ns47W0I?U48KK!p8fXu|nDk78b(8xldTki1rsn)!*R z?NA`zW2x8g5ZZz^2&bz+ny^v$Y!kV3mi(9pa+KxBZ^y+7y+Z$ve`QeWg#e^1g9HuC z+1N*rJ$Mvo*h7hZ&S}p!*M{UYd_rs`dmqy`WX)J1Q~@tH26^C-FZ82Zpi6%t_nNp_ zXn_t*XG{(m;jN%Q9lDL95(tU0E8ef1&y(4whGMvBNQrd!-Wq4PKUL8C5G3^n3boZg zg$&Ubp2OV0^W4H{y(= zz;O*T(3Y0dz!MF80oq#ktVVuJiC)5dnh*w3TXifUlHwip&2fsc@Q;xGXk6ynOtl}( zL0}eh5U4aUHmIs6K5L!OVUJIKisCp4TtVrQOsqv(zAAqY?Oygx=c|hFw_?xeH*VD{9_b?_*oOLJ2%`m zmWS#?XnFmw?m{5eix8e3X{~19I)GDuoj;kq1=OslKn=9AaWl0NL(vSSn-q^yo1PN% z>4wdnC&Fl$M_YFuk-kOwu^WaQIeu3^UUezZ_(nLrO37@cNT9K=I%}X2`ufAb2bhFo z6jTN^OhU6LdJuY0Y}MAdlL6DGs^<8TtJhrQwDcUwt(F<%>a{Ccth4FGuhcII$yU3y zaP&O79e>@#m15#Qhh^_@{^z|N<;HMDOK z=#Nefx!?poX-c-H`Gk0cU%Ra`^(O>FC7TeabqO&z?d3GTP{W~R$yCadG4i?3KA z7rRtz;}wRbm&b>#G#gHFICnnjm`PIqz_K%;ndv0Y?hn@vJV+K<9nV59RA}zp)A<$y zxwUaKIYpueQ0#pSAMUzc^deabO2ew=R{&k(+t26LxHR4yQrEb_*Ke@*Ev7nrwS@er6ikQ`_7a=d! zfEGj&f#)WTE@I1VSgSXY;XKBbK{xQ>MRDXPW~Ml)8EwXEGR1pwJ6c=UO+|Xu!dkBx zOTeHdk4RF)L{@T-AGRXx0e8+)_u@z+H~DPS$}BH=eHKOm84;vWw;(u*eI6*G&lnrZ zONmX0yv6S%cjpqI>NZUtis>UD_qgkv-lZh+N?9cJaq{h2o0|lyQe7=FIhzNYY*)?K zqH|g6`%>vx5y_eFvZFyy5LY=i+Ou5bh_yyIJH7Qa-At3+ogjswbJwJs-}?MGX%myx zqAz2athcVitfQ#a&e*qn*HVw&&)s#6QdL-c=;`GadbB*rm#n+W=met`$bowq2fjJJ z5C-u7iRnluuipK)KImItpIcdF(V3_e`f^xqZF+h(Zd2M_hVtI?)A_`jf+~M!b}=Qh zXxr;--JGGwRIhm(G9FeNT0c|%@k@3O5aR!|78?$9L9E#1cQ6+*O# zJKMxUdq1D;hfyJ#wC$w{?8%TAe13{NGeA_GLJI?VSlkRhLR^Gh4r153dQ_!hCF0bS zLNznY;^~#ePp(mmD9Q%TU5;6Xe;8S;+KK(RLni9YuF=-jsnR%w<-RThD+WQ<@L8zT zq1{rz^1^##S&d+iLWmRBZuis!3zKE`m+RWe@0CQ`POrfn5J+K*p1pOD+(+tqogMIc zwj!*^AMFC-w$-ZtsA&O$8{ub}fLGU?6L#wj@yu+5`zL4RlHJ6If~yv+^3VV1 z`+?%y3o~YH<&q&P?1iqfV<}lY`ieAejI6BFxDKg;^TBv_<*ABr9xrR5F(;os$!0GRXnBD^( z^1A)_b-o;<-@9&92^7y>k`e2EKZ8)8$$<2Zud&>F0?;0JOBx7diU7WT^)X$cprHOV z$GbcXDNvsxsJElVk5b@Jt8LA<)tkLJ9##Emx8Qv9BgNwAmZrvK4YPA($>JN`HkRNZ z>tA=;=rqOF$0v>k#9sb%$nU3m&AD}clIoG6B3o}aWI?mXDt|wB*v}3H6?enWQTd6Mor zsS)Ec3bt$gLUYJ~#|`d~!68qtF2b#5CG#+lCz$S-;Lo|5BkzkE z{0&o^sC&P=zEufp=^r7MrhPuc$W?rSU`r zZLLOu3#VWv>1(QHV`jBLRCwpx?OmXkZ~fBv9$O*hQ=toopqtoKjzkVk-D+)UDl>{8 zOEPKSO~$$BXq&}|tf4R(K?2Ar-880354SMN!?OYMZyTM&=Cbo*X)+iabVWewIwA@hWJ5S0d9um zX(H{PM0S`bYbBl$+xDGqS^^%y+~bfJNg_fO$&9HovZ7u}|KJCE5L5*=S@PM_G^SI< zi-+m>vu`CasIm8yJ`HiQWeR2Baio=5?6mjGAB^NBV|biBzObD1$fp}ZLAN~*IrO_F zOfTJV;~A)y${7Y*$p4FlNQtw`(Vg=OJ;WS#xyo)Fk7J?^*1J`2ct?RfgR6IS1-Y#Q zD-*XhItcv{qOnu-D$>WGjK#+u!tayJVDn2iWQ`6Do9}vmt7;I%^y;4$LF8C<9&$~{ ze+pU>MX9)`M0{hk;@0*;r5DY7Lcg5)7R2Ur;bFI!$YA-MW>F}}m4GQJ zx{!d77s6|G>Yubmit%_*cEQaY;*yod@wgA*v{VV%C_a+I{d$G!N4t8X#TKR^jp~Df zcd;=}$vtIIH`Gi|cv6lQpB@r4>O0+zBg>hg&@WRVa1zBWjq1sK8(+0pxkWf{Wor`L zpNj9X5HU`0-0~m2>p^;w5%gCXooO36U02Hnjl}wZtSO1C|JTBlw9Qlt#$o9{(ODbQ z#Q?E0xw4whCw>bOoNyO;+f>Xcb9Fq#0~wv0#6JJk3We0@exXSeq()+`=pSW4=Mq_A zm7MN{Q=kt><*g=~vI`mg%;VVEVNZv5cAQHbjGGN7#ojeO?K~iUZ>H7PE#X7?i0uA&-YVoEswFgJ1-3gdcW9E zZC_vPiBs4D?V1FgDk0;_?2#W%=LEeyJ+;Xv(yVO{SwJ1zk{zNVRWNzOW#s9rvyQ{RKU8bMRP`}wMj628AGZ|e7x7!jW0DZFpmu(AVfSAIZ2 zsY&11xD}Dto6b1ma|ZWY)vda+Hb#0QRHjXR6!)s(*0IY%`yadt0X|yo#gGBuI?)yj z!&L+-Z##PaGqac&QlMT2ZjkQwSK0myUr*;1NilPr1 z$yR}N^fr9dAUV|q^gb^12MMFIu*4D6@deP|pt{rC7kNKL!Qx9~1*xwOcA`U&SI>u6 zz1P7wP)P~W+a-|GYDCbK8{OJ3tkB%*G8E&inwkyL7YtSOL92d6&5@Acs}fB)?Zr8O zDH4+yc@w5e7z(I5jjQwt5~I^Nu45`Y_xUOzTrlLP{R0k(>sHRaE=BeZ12(z+-U9=`Alu7Sx^(R$g*Lu5Re2nf*^qY+ z5`s=&-V%Y(M@g*f60*%Z{g=F-6@F!$`UG-L<&b0_%vRbye$l3p=Bnon*xB%^77xU& z`)b8{qOlInMC@s-r?dY82hj70^e=RV8X^`25FD^!@DJdks3h)S{-(QCk8v2JwGg4cC| z*pf--iu3B|m%WFA;`AhwYr5SqiHXJIENYj=v+5I6t8f+r(g+`$3>}?M*fL*9$ExOo z^$J1pz4pZ|%Y4q#Dx8;hZkuToGI@abG-oLp0~J*@FoS`Z~DBkp<>(4OG|5dJg z4hU%R7+0Jx+Y6I$ZPoq5H;@+?f*#3${#DYWhc2J*mmd<#7QerN3|1C>k;}<w}$veAjE zUxN3}WVjQWjTXO9PG>|GidV<{p=tmn!c5}}*P$%dtZ+Iu=o;nm#gNU`6?X(X3e`n? z9W4FX${z*_mbm<8o6;vruM?h{QOVl2yFFo3IDkpo=&ROf+Tu1gccvIw-~(HfjObGA zURhc0*BDvtI4zq)EgLRl^R2$P_BsD(9Z1eTIug=1wE!(QG2(pi%3w z!d7ZI6FG{w;4o1XJeV>K@%T@T081kI+JGH@s8L`6#-IPHqP966r%Kpps&<9VCjx?K zmbxv_Bj2{!bvozwV7)o$0q;d-TfttDmuc8>erheJ!#WDBS-7|D+S*{x`V!l0U!b5b z^8dm*UhV~he6RE3QcnBYK}X6$+a>=VLWgxB|JZfO*sD1DtAh$+eOH=d7IM2D_EYK_ zHA;QdRAd}UoOsB_1ju-k*h;3T#aAXjVOqDBwsN~JbF(^6GuUYGN(D=qtAy6&w&=SL z$O_twcI4WWBTv}|&F^ACQsOn9H@m5CZ8J3+dW#qHUDeX{i&;&hZ7ZoQd%Qz337zW7 zGSpfNS`5)e38hA866VzIhDZV0aPl5)&JBCa&*bM+fx6i0W_GM8^4`8cKXM4l$>l)9 z?2E#qVrXT}53P;rvsg#_xnZ+iRmL-XLgUSpeRkOa-fyyEHc;~4T-5VI@mS;W%0h&y zxLuU<&7a;lYyRAI@C6$rM}XsNKsI4Md!gMz%wuzXam3q_065iy3wXpjtHhM3G--ER zP*81b*OEG)-KZ>uH+u#X8w0Yr^A5m(Wu~qfX#C`@W(Ty&3H{k0r2?%t9-s%w;DE#?nTrNbqolkH#tDVtC{j!;g&2J=mDk{w47xmjU|y~ZrIdq zdoEUMX6VWcR5vpK$DN@wi+Mo!(O#+!$(`W`fY z?lJSxo-0f&wQ#av#G5ab*Lz4ll(P$n20DknDXp(A)`v{=4?SI6wEMfV0`+N`Oiy4l z>m105?VEDYDOH2!M;X&J9EM}D3*BITy^U<~QeWW6mjPgIL;o2G8jEuu_B%S1wspmE zk;^x7_6?0IVI8Hrztrd4>%cal?FND?lg3dhwp_*ava6S%*nTL^YsEY#=yv>d5$Tx^ zrw&0$JjbTaUBB@}C`akqO!b`H4jF&O_n!~3yN_oWLYbL3)5j5(5%`CAf;rK7i4?x0 z|1dLhH}-WBiKEs6RTBnfd$~OR=rU)nCaO~{$nttnSDQxGWJYpKR-Gg-#1-`zN`=&^ zWERDg8;xTL?##{?BNcGLQnoy+dfh03D+9F!gw&k!*{3Fh`R$WAyw5xJ>SDe1wzD{C z?HMlpdOf&`$v=~BPi$%{5<7E-bzw-MOkGV0hb3J^2g8itExAj~>F4qAnRn%f6^WmW zcoS7q#bMfH8aTBvtIz?bom=X9_Ql<&??#i76EL3J-3U3qm!?v3Ar+8XK(rW7T5M8N zQ6e@J%s9)299tQZ+ms;l1nQYr8m|uW?>0y7R5?kU@%{<##EzAifYl0#p=e=pfmqdf zdU@y0p60Ar7irlH{i|B*jFp@MJi*DFi(epNm}%=}oZRbD!=m%3s`vLkS-AxoP33X^ zcuv24w32bqmaue+qe>{swvweWy8Q)ABZ;)=s%eNlMcZpX6tt2YV<0&;TsJjjnN=Ge zY$GXDL3hgGNJdn-%dsL&qufU^B6Zs1zs*5iN#OG!0ory@$iq~q7;O}A9z}E>RzMn_ zgv+Uu98+IY3i-1edX%vADyg~rlJ#hv;`HwGCo$VqPTEM#UeP@0ou1bhAnHBTFRH5` z9Xs`QsX)sE_}Maj5zfQE z63Lp?1tGpU!{=8!{7Dp-q0ywCGCIMc3pHXr9t2Gt+jIV>Ld1V0KZvaq+~Yt`saTKO zTr-1?`-bQc9fvR1$^p~rolb$dDhB9zRJVw8xzY{^)N5a2dg@)6+~kjZhW1Kzo(W{5 zl+TRn6&<}*>taU^U^-!Bkp%>GwS-^@DLT@%RyN4h3vJ}7t1^N8wi>K^#dBIyPaK!e zAk_hpGcw6Kk`5%FIE;;sLt5)^Cqs^4)P=@_N^8kEJV~0JIY#%KP=un%o_j&XQbu*u zmALOgKeIpH65%F-de8R4JX>=A{KRt|hyxGHE`3!`PC)?=3=A9&R$;culpKEfNHy4n zUh&{XtYgtpofmp2qLSgc7wD>_{&N-#4H?PBN^EI$%XsI|2@1nm9<3dsfyWP&x zUT`=?dC=?69sBlU*F9kEa{6M4!en#h`9A-f3!hqn6s=w>XXfP#xxxbSqIGt1+lh47as0upbvLuyv7)0{O!y zt}dV$CvxtGqdLt!2w75FN1Z<$v&qv&mR>a#pBU@LGuE7047xJo^Mn5UDUcUYPxjub zc|76HY4xwlo5;V%)-r%hy45Vj8E{rNe;pUlSU zgjb}w_5az3-p2FbhnmVd1(Qh;^XCF4SG*P`I>g25J5$k9&1|PW z%JTX~qm8$2#6tG3HVqo3vy`mg#SDSxHD$E*boY{N(`|W^I6aT4LVKGZV@#lPN3dkc zNOZ$kr!+2uJO%x}F=k3Zwk_vN+`4<5xG6*_&M6N)iVkzA1rW=OC;Zu(d{f6}N8swH zc*+%z4FtZhJ%=9a_bdOekX`A5amTx3EK}V}HrXNh78~XCy3hr8jwlFK~PmHA&z{W-G^p$e!&y-vG`e+(*%S?Lx zKGonM_%c8Is4dPcc&8~TFmtO#?4^ZcbIxuK3bJly{N%pHi~0_1vK}rAT|uiKWj$B! zig}VeO)Mwabnc|(cDoraw3(^Yrv>L31o6l8ZR8V|ysOwg^%Z1a^U$+3U=5wu2~1Vg z_gWsX?pYBkG0^kWr&mgu|6Odhf-xOm5&n(hA{r23Wpu#}p)|9e38+>`l?1OgFRcgn z47hl#&cp zftc3jL@soltjAFzH9G}h+HSnE-bHszlIe3a4fFH2eFEGet24-cBudZ+a7RIfBgruY zyx+9fmGw-|9XCBP=C6-?iPWEo&{fSCdeUs9^&WZ}^!Pz*0 zmk*t&ai5e=2akRc57U*OAxq4op$VX+Tji}mj>>~cV-Sy(Xx15TkjuH7qS?7vHMw`T zBD{j?dueHCE}x>k@YysYDok7-In*C+r;6{nMhHJzOVT_@ev1zMfhq1L!4B@ri^m_e zK_3*MS#^A7M$mg%F-Zf;qb9~KgZ}-T&WmYr=xT3e(ACan>@FLOvWX3@otZ8_;kGglbjY|WL@5+&{_Vq)UgQfuR&ub2VAUg|Y{(i~)FzB1+`ruY2n6Igp|$qo z8CAZZaZ6SRT-|6j5?5hgoktf}5uu@>VXkL>e>n;Uje4nFhT#d3*ra#go+|o6&h#L= z_yv!R<)L0=8f;upoT%V?qIQ0i%u8+61Y-Y4H4H@WE^@ED+GJ@9U_gPFFQ?TgU#y?6 zWU0@v^_}4>@68Q!Wku*`z2iE7%VP7wMBROQqYQm#)OyV1N9OlvCC$)_(FpAS#X5f= zoS^BB0GtX{JOqn}LYL1X{bNLQj;8HR}%+J4~JSZcJ2(RMY>*(+Bi|p{42{ zrs6Hq@)NGv9DzyIrH-DBaCF1go5oW|UHN^{yMF1Pb^Rsw(cUA6!AgiD@Li6UKXx$3 zfW2@AxmY?FUxTTNNFD8ee#6N5&_CMg&7J`;{Z;fz$O+kV?av2SsqZOA=Iaxq3=>wr)tySDVPLYFmhWk)!S+3(^ z9kjOHx%=c==8TR_F~cAVI6tqcd!jQ_x8vKxoqH1`9Goj*T23;IhI#mpJUSS7&qGF} z+&EN*5qeR5PJn@ajzYmK#sk8&m(-{O^{R^e3_w-&4jNZLhx$y@^?&Z5(m;WNb5wP6 zuqX>;6=}-PD~j=XQxG1PL4hZDu@LPgAN^uCe5vX#nD>7vOcfvg^+$J5R=+LJ!N6$X zL7~p)&81*pP`bgJ!jQ0D+xx1%lP*DG>#J1G(Cl%0mYb_D#+7-L} zxLS2fEq$2aKznHJ+_i(=@#&ler*K=}AA9rfn<{vapaib;K9oezeh?`_aa1pgRuAvo zb8w%1jgUMu5ZK#Q^Ot}9^HF2`Y%qtEsIK?=eA~qhbc`RX$gN+}sqD0`=V-oT984WE zLylEiM$&*k{HOZ4(a+{;1Q*|ftK#3kTY=^#d1F4^o0{II^Hdx`XMuW5P#h6Cn0?9a z+lP1kAyU4eJYW0bGuq(nAlP;R-D9EzKiP<7PIr4DUw+v2UVQ)p2w+wyJ0iFC$KbQ( zWUX{6BOlPL)|$_CIrsP+66?GG6J53EtwsrnhoK^boH|QG^mXE$Ju*?-ui)H8V;Z$D zW^ta3K={kpJM~OWnFU4(?@#}^*AL{NYOPL8orghFRV%1yrC+M0(iDUYX~WK;!$7^OtBa`3)0Upj`ZAXWhBduKb#h` zwVUSngwk7~aAZ}~s3Io=a~*^|q*uEyFmxf*O=!B8RV!+7Y~wmiG%@CgE`nH~>OR4u z=_`R>on}6A9|2LeBoT}WP6L<_o?%Z0p;z7MK2=Q6j568Y*-!RAAl$3?{TR9&f4Y%^?&*EVHCXWhrYl~u>nUvfKEP7 zPRS==;@eE4_;FXLX>J0w14@CvR(iIE(DZhB7MroPV;}tJUz~lI<>DJs_FRKvVkzTQ z6_;S*X_|!Be?Hplr)?H9@2$qZGmpr8ylOH$s^Y#AHMMc{dMIa%LhuY`@_K5-Is*2I zs#f9KC-mA`nuK!Mwdrz@kWR$JLyx-Q(;JoE#mH0@s$-*UO4mhk*sSdnbM7MT1&$en zxcXqwc?tpK-kK8>T6Av;$Tl2ahW8`El9wItPTld-&CuCfCSDWP2Va4Qo zn1dCXfZlc5Rr>&oM5k>P$H?soCig4Fz{DNvKFLCrFCTs#Xu2t1a|Ie?`FL3n>U4AH z@IYInAu3-5!}J528BIO(JmsJl z&3Dj?LSkwZChVrYV8!TcM;!(dff8+2aLKdtiP0Bvtez;yL7;)!ClU;78wy12t^N3U zxqD-}Q$qL|f@V#SeM9UbhtvN;`KswoKPa zO}&x8llE9-;HDwOnucNE{N>6J4z|PMUmpOkf-m$F*793{V&CVhM`}5HSgZ?165gTn ztf4z~&NnwhV0Ed5(;;*!RPfhfLV$;C%CcomhE}JurpmN>HvYikiYZ?6sSd`! zv+8t$V5_;ZD|ycoC72m7)8ow5sNn}ChG_)0@e=fsBX7dWh%Ne2SaKl0FWRA_>dC<{ zzdbf1Q4(i$tk7zMI*-FoYA%6p-y{ve91p0;pZ(x+kBjz#hWp?Pv&_lkeH@%h(0@tw zHy_VNL6aa?i>~FTo&vn}9D39@s`0HYo?)2n{W{zYlnPJzHO-=JE8qROhwW}70$(o% zH3dWLb+CMGKRw#x157v;LWO|SsW>Qz>FU?k3ES9K@(gkoK*A$r=}ieVxZ8EI{zCad zb8AKJ==)`xnC{Afiso9|0OQddMt2RX75C^q@uFIi2VQ-N&0RA%UHI_&G6-%gI##B= zo~;}RKD0+?tf$nwIm^<+V_aF%%S%zP*kNVN#kQz_u-8`Jz*q$tMjq%!bZSwUJ-ZI6 z7b@Ph%ER&Hef^Ce(^okeWh_QpOOjH8Ku?_x$_Ls#D@xyu^-K3aTBF!nu^wqU7UO*^ ziQ>Lf$Vf$)>?TXjH>ufI<>{dVk)^MSFvJ|+4<&<<7MVhpz?{S>q`&6fzw|zpw8v3y z?Sf(QFo;}PNUVadTwAX9J`DaNOUPAc6{c#ClL^C_MVcpEsA9Lj+X#5O)F_^({J>m%ypEjRkcn8-Pjr#G77I`Rn;1mFUra; zka~1G{b9CQTkC)=Hx$g?lwJzxKOk0GjsK1b3ev>~r>1+$k)v$A#~(5;g|=jZL~#C< zgFeo!hJKe4i&}SxgbZ|G4hk4w=#(7SL-(tg!x%zqYkx{U#PXQ6sQ;fcQ0l`51MJw{ z;z~Pm^@z+f1rB@AL}_qQyD4;yF*^6KsM&KsR8wb~`VlbOI+Tki{E} z^{(VH3P%p|$0!otL!RGWN27{;B&~1~E7XNH7xLT{5gY>?Z(irowp{6?RE8JeoU(0) z?7m!MGErL9NhV#~!V!~%rqlQgEU13U|>tdBsakEI`Tq2TXbLKTHq`W}pcfg)Q zD6MW~jR4|J`~okzK-5V|w+@sk33%{OIM%8uD}GToUUHvkz~)p^a$36)v~o2VbWEZ1 zb`u}&wLWHGmVU-2pi6v+7-HSM+aVjh1hl}&W$TNh!(1M&W6ctN$H<@BbX)BT^xkv( zus6^i0Iee!CF>A@o)3PLqE-j*_+Zgb1(sglp2%kwI>NvLUlVcK7CXr6csh+ z^mxoFDP5_h`pwGKm9cc*Jw>%TE21qPuC6i(mGhGaT+@XE`WGv$6FV-F3?*kPgkIR> z_4?jNYvX5?+a>C5DM6W)S{aTnhqE{M`Plam4~zZq^<()*_ZoVqwqNg)%ySRz^()VL zaY`nu2yJr#TxDRdA%WuF@uOgk<-L3RY>MYKlLp+^=UdbW_`xwrgrCq67P`YJVRtu4 zN!oSnIEQnmEwt)m8?%RE-4o1)bg%?`8Fa$Ph#npR!W+}BpH)P)y}o)^vY5R&&hb4g zeL3h=H2v~j^@^}ow9_5u!Ox{Oj!(!iIj_Jk1L9{*UP37~Y6OkZcZTJv=0(hB;SCTN z%OJ0hK7x)I;nJ&W!BT0+R`Dkohe(`VC$1}`R-*+7SD1i~ZkR34c^;V?5;FDCZ7h{Z zS$6pw-%*gxZ8WH)l5A0-bbRsm5Z8eYItO@&FvV$>>NpFkt_1aN1l%~lnqm7%8Rn(X zg=#SZxpV4_awcFo1=Zy`IWggUB<6rwIdZ*4PCD%3&5pItM?Mpcbyq{-@P z_;#0!!a=)-4s-1m>C|9zas78ane>9uB>n^#rB?K|I`1R~U^x+eR0E-xc(v3byY!4i z`oFeZg(gvvFXLxqejZh~O6JVF6bm&;qa{Hfq}{paF$9+6N{a(BI(tJXo1Mr~sixws za@tVfL$Z!A{-M1cD9=DZPTk^!0VpFqW78EZU7I0X($}48E?HmbND;A$?JjorOU-HL zK^F4WB!GJe^)8tewbm{uiFKU-x;snD9^{_x|MuRK+E+!HL;)xYOS#@)6kYYqsvN87 z5<6B{-3#>lWuw zP;vOJY7*V9_R-F7XcZ1Ztqb`K$i7pl+2!R{Za;S$C1hO|_wognmR(b%0N%9c#60U% zne+^9^oC_VC10K0n=AO+$?_TRw^TC`aQeDVlx5}(7v%99qZdBXJ%|@yn1snhtd%fA zswSy!{iUu(5g(v$Gl^IWV21eKir=@)*5j)kC{x@=VGRo5m@nDn4}=@mJQp%o?x>i| zGZrIVSckS=Tfj%?NA4!25*I}l)C(SLpVkhbniNONQ4Wj~gU=#b zJnu^&huu)W4qg+MFm1>IRLIR5wUOS}(DYG(XPP%Xueh*Z}uL*>LOY z{M5cpXB7Wt@AIaPB&1}1;vr}jFTJR2E_Cg+Y3goiRolO9Acr-apvyOiUE(5JqS&4+p&)iihkH3e;=VRI!6_H{uoGKD#6P5@$vo;W6U>c{wF6fT% z$RUfAjO&b7s(vkE1z_nz!#sR@+d^J`GO~kp%U1sP<{F2|7nFIf=FXr1)DI~6AWr~- zO^1Oz2@=uIQOHq_&Jr8gnRlPB(Bb8;#%uX0M=6km@3vMEc2O@hr@rIY0z8C?<4`D` z$n8H$Mn*O2wHy0h~%6$*fby#L8C5eop6Z+gN)-^NyJ!szD zu_ZB-9~7?nW8*-7v7|%0I#2A$a#`gwTQ4v1I87se44jN-YRWf=`$?BURF)3=0PQ*hY8~UMO2Y1~t#a!wdU6~faS-$&Fka~?@hk^OnVK;$ z#h=@G9MYcCYlBW5)5J%`cdY!&;E}+&f&YI47f>$-s73@J3m?sNI`q81l|hS3Ftgf z7Wuxn_#ceqpy)pNeyvE$V`L|JsWKms-1c0V+Ydz=7$pUo&N74@UvM4@&ZhZ(d76WB z=l)7GJJ25buTR#$$>JZdMD`XEX68Z@2=k1jp9ubM)eIgeze5l}<@5Xuklbw?h`IWI zx?12S5)}4{#%J-rOt8C!z_cPLlJr7m++_f#RaV924UX0C0*bn+g~t?xNDRZ2MECF9 zbMTk?x8o!xgM$cQ$}@{v-f=-z6F4Bs--Ic%CLq`OZn})l4+NPl5%h&&?-7=M(sI4r zrbm)SPNTAv52#L)&#DKuK?6AsJBDU{(PxSJ1rM-X93Hk(5 zuGyY}pfX1Qv%~pF<#&jlP_jAQl~mqyuO_NojUWk>0a4{&&gI-KM%z`*s_59M>yJT5 zx)!;89opP8)2Y`}4GdyiYaK;;ZRSt_?=zNGC_sMej6tv_fN^V^#Y~NHa~+tPq-3cl zTh8D$_dQZ6Jx~4wx}(%mOYozPcA#X1wlLz$;4P8N5y5_vtp|{cQB&01j}eCF?nGvi zAli)r0!B!pL7yWaeqWG-%Psr{TzkF1Vx<{kyvKWWB3FAES*n8&)oWT`M7G{{EWK2g z%sOUU({(n6vND6A5%b?%geg`~Jac@w-fA2=u+angr@YamWYu7|vow3$PHfqo%R^%| zG)us{l!qP?VLb6YlhnM&NjmAp4x7^ZW2w0b68$j<7Z}3O=O>D-kh;|YtEh^1^XMiI zL&DhpO7j&LoQCFp$l*pdzEz2n?fu9dcM!O7A{)=;@W8m3YU=HSx^XaxA9V|@t~%N+ zpl1u{FV#B?GQl9CsQsa{6Sy0QyR0|vjD`uk+=fq#*F)G@Kypo;%?3eNn`0r@h2Ba} z=Jl6BtKDGGB6V;Z0=?#4y*Al{krp`!l~E~``g4iQX(g0OHbS!(S{?;$4+;rNogzQI zq^1Gm)-B7XQH)%A1cr^0ZrA@EMP*106ixaYM|^Yz1!m1VhCT>|BO`kQe-y@srbm<0 zl`oK*iLRyy&8TBXfawyyFc#FJ^$F@~Zu6r!EI)tdhaU+|4G1WOD>Mmz#}!>y#(xv9 ze;p_gsX*Tj7|?Ynrp2h;zFwx$pd-yO`RmyXA4_?1`B-3|c$q60S@qYkf1yc6V7pXj z1!^cD<+(}RUyEQAsLEOi@grY7l1{&ZTn$w*&}*@G0c*) z^Iz=u{dH4kU%at@ohoiRS;=O@4pG?!be=Cc_l>2r$k+GjYyq9iO7pSU$j`}(ZwQ*& zQ|1cJww;|oYh+$T9R+IVcCvt>2&%quEsLO2F_Z%Rj6-EaqwVV?+Lj7{xpBo}!m)BJ ze&~Dh;+C4{p#Fs#hrR*BNRA^Z(i3*~o^N~&YZR`Ia%wkMGcRg2a{l(=38C4EI_UwF zxmHDBbAcEBFDqA$-e+uZdg1#WbZ_LF^v#N7VOC@7eTlSq=WCQVNpaqCZMTlQ@bR14 z8#7#Pt5G0cRS|48kJ2zS1w!#JaOAmh$PMp9y(qT+1s{G`dip)EuB%6hOZLxynf-gc zfNiSN)((hO)v@QDraaL5GdXE9I|7Vjq5G)ZGk6NxMGVv-H4DI6geF-aFX2&oE3D5Y z6T0oN9$24rdct04Xg$%aV{?c)dnFQ}#~p`IS}#H!O7@kYC9Zb!u8U^WF9KXZtx;9gTBD3OK4Vw$B)(TFL{56aPXE(`r(-SYmZ+uUmWjO-$C{M zY1A`YFp{ACOGi6`itLc=O2JK_Q_s?kOxj!o1xPPbaO038CJPqNHBj|4dBwya97Txe zB6M=~BG7yQCeVOgS0RT+cB*Lh>^>V9`Y@f<34ApRQS&+%+SH1WD{VBuZmzrr)^I@n zgywq_#FoR5NKGO-Kz#{@3doh!?!ir5{NEQ^6c8sUWG7-2p&rXPtdHI&sU!6_RH)SZ!+p87f$E+c+%O-{18z>GzyYtmmzXVmq42Eft4ghiGI)WKvGwo35n2${kmXYZjz!DP9_%;AG4^1D%5asdP=y{uQG$B1KEJ^~ z-z6R$>t3kjU9)^6x z9TbIL+1yyqS{|TQF=1B&+J%H=`S6$cEXFe1gI%o}bAXxoqPxI|Lknmu`CjJ7vvlB= zn8ok^8Y!%=I|=3ojP~@(Sh^n^@0$_>&j6P|Xuk~WB!&*MS-$(J)v3d(@f0@#Hf9IE z#$Nls1qlDAR?ql3-Pcx?4VG{ejw8n_(I-RpF`4$hoSxtL#{2q zN%L9l|FI12|Hsz%KbQQ^CI5p>|8vRzL6_XxSncCk^|Ex3^9C7ps1%h$5qmD80XiGg zN;g)EHTcD6_RU%vF?-aDp@TaL%Hdu?DDsfFU#1BgKi1`wo=w^3C)mcg_8$h zIGZ|72#l$d;bhfZhEPdEZa+{i{%=$=3GcQN9o z2DOfX0$nqHYq&9AA>+z7r9oQfX*MPcr^N7rNc2_;%INc_-U;yABceS-a1VG5{M8wb>n-5#~l3x!2F!)sy6M zAI~6&>hu5AFnxw5p{wtCDH()K%1k2k!m+_XPXYbYelbq%=h;2yzVxPK)hT$JJFHIR z`T+$d`Cl5Stuo*5pnKfq+#^FRH05?VDcbY8_xdoE0XquzB&@F?l{Vu#@Vec(_sU0= z|8a(Kl`rrx|Le6h{QD+X1z+ZReca8^M zR@Hdud;QnWaC#E(aVuEOPUQ9^{7a9y>FaygfV^&ti($xrG-ap)_MiBjejUVZ0gl`|@lorRa7B6an4MNjB^h%Wfi*L>N`Ws!&J%6@B zo091=IC8B#WW+f@9mrVbocl%>MrJDkd3E(tJz-qH zP*&sQ&F|P6ZCFSU683x++4cV86M0S+>O1F6ccoc_W-jO`hCUE&8DLCl{>`P`Jg|ez z=b-g>ahU0IKXs5PvsyrrxPKnmGThk{>w`{ec*^?Rqh zH{DxZhhoZsvw>Va(pBiZ^d;2m88(=z;IMt#>HTP2qK}=r{zf&Pc@S8F2%0g#<$_}s z;iBK(4Zj*4r3r16Oo;({XM!6wqrSb)4u@!`#X+)^M}*o_NpJ&+1|AWt%-QeG(2SlY zRJie`Ffvi%XQx36A~h4ee{O2szxiIcw&{&C|9o;N0V)I=(S7Z5>frZ44!~U5yk2(I z67spKR@BV$))At4UvZL#(+pXU8+Zy;#t=MWe264Zr(=trxph2pN{Wi({Rfu&SVHQLez7`fTvCwmv%e@1VjBBObLcKA#S| zc^oRB_rE^eOYP3jpL6&tBOFBASp!}e`m?BfUlQaf>w*z*kZ0Fo_FWHVWynG6o7rn~ z;?WxPK7d&>KfG-RqGNS$_dH6@0HR^!n7EqcyA_;3tQ zEnZm9k*q+!H2-^qP}Hb9`rTrcG#Vf+-nx=I=I)J7<=&&mG_UqNJbLuUGwNq9;ZL3UQNLYYURLl&rCX5)n5VeQG$d80 zcK`GT=@CG&t+QEE>G zu#1m=iP7GUoj<&wc`h*YOig*emVu|^s1J3&p}<@mn7>E%Wq$`Y-w;BI5H_uO4qD6! z`Zq#3Wy+G0(^!2EvZ(TrWGq|XLG$1o&!z8GL{++Qe&K|p@Z-LXYJ-i2 z!6`Fn0RfpKsI4>}E0Ed-secI5-uHo4NDyF#J-QFX#3UsbS=rds0vG0>r0&P%mACJ4 z|IBB~;vI8@TJ|HaZ38WVl2@G1Zkrvuvoy*^E-oKV`Zb+i;-{x+=|)hkJkPdYRq!!1 zcYu7g{<+v)C7=cgVl}epd^lWs405v6p+Nb+FC}WQVv{RsSoZh=w&`u8Z)tXD9{ZxQ z)WjUA1Kl8Vf^tlxKL5lzTj=6cj~vH&SL78`>9)4)%o!SMJLD<+&Z{N7;f!f}9VoyG zm7gYFnPcp6)FGU}`{H|w!F|CLiCd`ZIZ()H+TNQU+B*tvco;d1w`LHuq{1IqbAcU$ z%2wceXD8~MFv94{G6hnKm;ZWaV%i8VmVf&grj~y9{R3LV&Gp42$!P^xKz)s0B!pe2 zzc#&Y25IRKtt~mcaRj6d6}atn)EFNw7wlV65b_=(#|=xJK(V=Dbc z<_GR=>+plwEPm6;0?0Q~pMusUaoZOZ9HzY=23=7^1)%n9+OhTHVaZ+Zm4H4BdM(g7 zfo28h@f!Wh2Q1Ji_odR0|HB3&;;aM5rQkxG=UU3=lUR|6r$bMK? z&iQ`JG1TpP&!F$UK2II6y%Ba6e`+=%BSVPzpzeFn^sVOj=Z_#~4RqX*KBe3DIgi%r zqT^^2H97#Q2#)W=)o$oc(~1|`FIacxZNFNY;YjpDpuPL+c?#S-x=#}eQ%_#?eGGGQ z^9pFUmr(osfkP0?GDnPX6_>XMmNw>E|K}0{F3wkoetWMCr=jbCwNFrqi*>_KFTyM# z^eRd2`1a2mS6W%HV%g_8pKQRevHi_@AvAd(5s-UR(<5^fRUqn=u5YGJv)TH(xw;+y1@YBbvM$^|3PL(1)}#Kc+QjyyOl{jz?sdUJh?R zy~A!9S(~TrUCmHkJgXFW0wPLI6ceE{DCoUhZAid}D-=sOcUa}(89!@ZIy@1DSvF@D zKDl)l4<;38I^Vo{b&`lp{;%K7_Km#w3qjufE8P8KzdMZ>i;&UJSaLIP>0>UN86Nq* z|91TPQs=MznzifF)}LHH`&SI|k1M{`8K;#tZ+JtUZUiw6D56svzi>}m^xgT1SPOLS zRrp_Kz1zEO+Oo!Xer2AVM0nnCZHaQt8@gLTYw!-j3ISeCpFjVBA(C5LpQC&F9=+Rz zuOI&mIGhQ2#JD}ODCSZ-vULYPaJB7y4^0bL5jH6&OYHVu`*v!T#>M|k_%ErZo~wg} zyZE+#{Mplli)N}|ER8_so813>F`_u*#BNMj0@)I&gFDXSI2Am+oIf%tCtOT7GOt**z+A_xfkS5Qqv}Yl6q20nyZmstSVXp(@Uxo}BYVLBsBP!od(#lbq+($s5F%H5X z+cV9#xORMH)j?3KoIy+X_V}sqA&^R!^^vbIW=D+d^4?r0Xk>x~fYU#3nu>x)Y76i1 z=U0XZ{m{v{&Ha*26B8`+;2$?80?j}gK&1W{c%kMWME_%vw)5>j(C_$q7JAhKbHN`L zZ<~V8j(2vj4r}slCj=2>==4SB_J<+_m<;traN^#XdkGG0%#bLSlhjI2XDnx zXvAJfI$~Sh#!}0dDE*C3+NXEj=R_vv_*s?MXg3E(uJHm*?0{J>+eR$)RbG~dF5Y1j zNsQ7u97J0O2F0nO-=pLZ8fHnZzno*%E{8BG70vGNkL$W4@8il?Iv4B<%dT?JabE0d2{)X zXP)iIy?xZYku8Zq&8BXBrKMCES*v^O?PA24#tWubwogzO4n6PHt5>mPO=Dx@e|hKI zr-6p%;y;f2_gMW0`UT_;!8IqPf-^)my6hh=_Hyoz-))@f{(IXCar3VPUJ~fMAr5x(rWYNDp<`gXI$Sf z4)mg3rzG>=eD`$-sW1W)N7K%K9Aw4IxnVG_^8Gl0NpqqGe!v7Wzx^^suhQsVg^Vq= z^BAphbjbE^nnGnBL>*+kbdET9GhM&9tS?ZI6NH4QmV z_5X)8n<|=B2B1gj0l0EA^3r(^1Up7FzMrx`(U}DH)X&Jrx}5>Q3nNOSwE2I#9b|f3 zVZboC4Z{8JegY89M;P_P)B?ErmmkAGU~(IXfBl8ySP>9|wT6DdCSDd{)0}OD44K+yKcY!o3nT1>se%+ ze@SgGK*moMoxO3|ze31^4!r;HbN}Yp|GO*xTl?_8(FcDHt&e&m`Z)lFfsa3iaVK)> zb?q%o!(o=SmwZdNj_K!PD{~|CAU5bm!*LasIr!>of~FU1<;`tG{<1Lhzl}-%t*QIZ z2mkZI|D8YR4@T7LB?Dk1G2Y0vZfDtZ$Yq^r=X4pQ#SK7lF+H5`Cq$x zlYa+N{->}l|M}p5KKMWV2j`ZGZeVw&KEG(9@Lbx}ZuAS;^W7MRfQ$37S#sY(n;frH z;$)#ZO4$2Z2m*u#@oXFHK;l0V4!qw3x&KLQ%YQ!j-}AxORYOXuY(KdFE6(|0W!fh6 zv9o*}OM=YuEy;#?{-TkbS5t&y1F7L4bYq7dsr_;!%_mS3!i23wtX;FiuL`s%JHkSlp^A>n)C%ibehFEBLo zCb}qo`Bi`aUz^!*|Gk$!iIqzGBRbcvyY!Jhj{MS++twcFGd0y9cZo0e4}2UAwg#?P zsqvuwV%iRLRqh858S7TMN;405$M21eW%keoR* zy-GiC_tQmED>WA;KKeC0Nweuy%01+HL`q~1V{%LK%Hg178X~$ccs`oX9IiWG?mo<|MG?0)^1 zhokw>-7&-&rLn~3IsG}tuZnR9CT zO+0!&7<}@rWCsQ;F0HI##etzxgXX0a+9dq@9ux{NdAZ)+`rVb(2938G1p!)%Ea3yA z2ZVO%FLd@Ka!OoCYtVRpXXj;p?H!SaXGap_sH2!LtWTZ(h0G4~#k;=%Yb3OumuH(d zHn@X9it)$K(_+Ua>_cmL)`I(%`DPvJ zP&H5s!R%UDn^_zOC|yj$gnsDO8i)Cd&@?@zd0r4D>*?0&+~Zl^v$?V8@Wv6?lgd$; zuJ^cn>m|HT+5do0m{&9#C|L5`?d06>ms3>E0jL)4=z+Sc))mUnRGI7T#Qggjsu8|g zxH_IyUj|J4p!b1-PvF~xal!d3z&XqgJi^R>;?R;}!eSn07?7h5}YUafK#jCxlK=Z+kz=6|C(a`9i^(3R93w-jS(64HSAhOu|* z3LXCm=o4w;Z9@@u8LLIg6StEdDRMLRrqtw2v z31UlvepaKh6u&NtunA0Mxuxq9(;y8wuaKY=#h6w&S#Tc(aO%L5Td z*sSvmp>afK*T))86&hzfQ?MvcA=zM^2Sy#yPY0uHIK5`0dfw>ogS5+c-l)bWEVW`i9wgNU zpkm0VzmO$=>x*OljW6^0H=c0!V_OE!Uej;F%0};W(5oaDy(N2$ySBG}UaHJ)s+MQh zsh9K6ASy(>(xiQRhW3KveB9=89B{SWEItZTwskU#olO>uaT~!Zv=P80*6Yh=eXgCJ zTlpX`m{RLuak$N;(9M1F9FFRvLcG5Pq*W^gNax*n!iBz^+=bP6+w3T@_roK5ngUj0 zj`hISz6e4!FD08_R8c@`Nr zhv$-x*iqX250pxq6N{R=hxaWcCnVpe*7b$C(JEpo@0YXcWuq`>pgj$a+Z~r)pK|m( zy3)6SOUN%)#+}gyxNcm4+|hj}&1cqEki@vm$w#ZC2hx=!`XZC8!d-JOe|l7AmD{D6 zts*h-3|Od`ChmbIDwBbS?HzMGuHi|0!0NH8Tx;V;)vBkisstTqnR7euIFmIrhf_1%(wxl^rl8N+kt{LeX|&YMA;2 z(Ah>*Fm>Me6KJO}Cl7K+USfCs_Jp8yT&|u<)I!$K^63weN^^;W@jqbxE#6M?ep8{j zsmBjuXc{v>-l(bAm_Y1&l!ovWLBp=%nEYd)%rJ}(7UhZENM+pF3#z%}1!HNw8>>?) z@>{0<2b&$gj$-o%!WC1WQin&$4N*2FFED4S1xr1!A{{RM!R1rv7t>!K9r1c+P)Z?-1*yx1`1*+x^2pvo){4>9y25 z4ccV-`()e~4wm~J5p1XUcgHxjj|ApIb@FD6B+-RGp!%n(e#o`UD?mThHjsSafsAJ| z^Jh@~Bxub53mwSe^@6Z3HJgqMUnJVOLPkFW`O6o55M5arOE<`lU;26aq#yfnAT9lo zJ>;h;@CX*^#o^uYb2f+B#V>3pJ%2Eu`p8>MpfQwj*M2~)#ELqzK9Sp_&o`^P(4?l~ zQ@q$+xX;6^3f%^0o$TuPUsZqC9nT8_6(y?@JzKQRVvzZ#j{Wxq@M0d9enIa|M|yzG zAP)EBl)Nw3`mp@>ijwQ>t_vK4(6fsSi#@g1uQkIsa3IQkagqa6rGR;wN%0!6*p3vN z&HcHT>+$y*{wwr8Za%+oat`f7zW=(8zl{On{>A|RZ|45C(q%L>6L;IQ&8g%q@Q$zg z9X@2R(h$+W`#B#ua#j&Vz!?Xd3@0v$iuwYh7}^%lZv{*$oU>O_n?o?Whhq^8tSwq! z=rHUL7E>-Z1wJ8I8a10iujxlzk3kw?J`(7B4S}DyIGoBsEj5`JpLYSwVUkFFdV)f_kZ(YvX9F z+bDs`2LV*zRA~TUxBZs}m~mrC+|oy`i}UmLLL0+DhP9jRrxM!5cj zm_gD6@Np~;#i#A*6D&1*h3RO*P7pL`2A|O|zkQKott{`o z*3Wen{WD4wh%Kt5TZ6U+4)bQreFha5(0#vOFSGdORO;B5czG(m`p6x}?zT9o$6h!X zX%XOs-(0KTJP6`F=mK7cpf`Ec=N%BJKrxpOw(&0?LAM1Mb{V;wgtIT>(bDgyfD0V;ISYJ&% zbux%ejM|_{(6R%pprNHFg5ZO43@eZvPb1uhKXp>~{-3)^hdQu8yFtztf{t?uRoQILp{!a7b8%G(K~Debq-qVV4g5Ascp z{Q6RWn#jlMMAx>q2ahyYByyL|r`ptBycO6d9l`vX1Nj*MkOCp3C=ygtz6b=WXw=;- zV$o%JdrikWf8gLlO!O;B1Uj{2qvdUH#B*&-`%&A2Uav(#<>ZxQAK?>HF!$anRw3sqGt|{dAe%ZRR7l8nr&&(>E(G6cnXL zT#Dr(7c5Av*xX1>BERKr!n(gTt93HPrq8M+pTQE13FXI)RfiHa6%k09Md4u6wdi6A z-Yol_h2ub&mtL}h9mUO!wWR00fR-vF!pmz+dY6h-XNKcLeG#6`yH{mm+sAnk*SFtM z*C~ZR)yLXa;-f-iqRJ6J4yQXV$Rss9dAdY|5&ZGYY5}lS!hA|BW@Q^wn;SNxU!F82 zVfd3x_$#;tk$al%Tg(TJ5VUwDcM5WwjoveueJY*##5?lKjg*W#J7L;iXtvPJ{2jIN z3_%HkmK!T*Jt!AH9lf#pwgoLlw=M%SkXd*;y6Hk;k9TTGVkV}=%WR4Ij#bUl$P2g9 zBPVK_^jltPlCfql4+q~sU{NEPrUn|bM1->j&d2A;8|rY6Q_QP?=Gm~}&5e;?6mivR zmELA3%s3w#&es72Z|H{s%8`)AeK!(!9v1&$ZGFmHMgB@g54KZ9M0P*RVyJ(0zxs;z z=G3N7y61!ip+)uJ*ksA-Bs%6pzblSb;vK8|{GH}4t6jd>eS0FGBYxg{1RoI~v!~y( zE;H|lVW<85lI5COa~rHiYB)KWarDgOeujv>$tU7AK;uA1`V31%c`ypedzkYE!gT`H ziLc|<$IYk$r(Z&V|7;qRNaq#$GV>ODyuC+p6)VdfJsX;QKWQ?`O@b`Ss1NjHfm#B- zyM{dD9)Q(bonL{)5*a-}luX1VPb?AZCXYXPTkLi_c~&{KPRdby3cKu{lVaV`G+LyF z7A`rYG+;-jMzQ5YO{{FeRLLr)^Z7ZRLriwXam5p>3mTEg zP9r1E6yPMioVvlI+)P<5t4wdDyJA^QhFt1CebsvepOy zv|FSzoaC5KMDI@9oqVOZ!k-og^DJH)vvIk31Xf^wAx#n8ScpJnN4x?ZJF3ZV+_byy zbl7TlVQtgfpu|0|kQDbJI_!+2#j*?>kQwR$$*j{)&Xyy}gR{ElRga<|1fh@8?3_5O z{|<;Y31YKncz6v0xwC*zVYD_j#}re=(q~)x>{IT{M>~%)JG74c?Iu9N5{4lA3S!OgNMd-PW z;Q95XW^054O-lNM8}f8r4!%N;OkMg6eVnqTm0(L=lZ)f@e9V+b;3#A*;3Y$K53;n(D@T6nw z?b4w;g<#gpol94{jPOtM%6?gsILs!>=YfE!&1`!bV`-?u5$Wm685nh4eb=w=ACl@X z2nel3l&+ltu2cSv)VwP<<+ltl&tnK| zmSfj1pHO+1d^KB5MMk6uc^g6tpMa-3=)$@rck;fIWDXQN+vjtgIGV`cpE5T(;GC?I z*8lV=<+O)s-+l*a0)J_0<|m#JhS3|_>n_2tcrtkPYMgB)3#nAjb>>^&$Rx;2la3RC zPlWQ!1z*MGElrFh(T%_Gul567OM@Z}S%1!*m3a<#@SpCdxT%oQ;S(TYN*LoZgJ^Z} zE<1m9YFcqma-4Af*7FqE7P6#8s*|X_TGlL2w{-C8oJPQAT&Rc^qfNACcWa0{XC>!$UgABM?uMtYarqdOfU^!v;$W&GzERy+Jh=bZ&@X$<{SW6 zgYeUA+~&>Hr#MXvp*B&bx&-+>A7rgJ0&@{umMy*_gT58htWUg<$cen*i{>h7#|A=C zO}zf@avA|*`;)F_NNB9j8SA{lq`bOgVM6(_luudxZP8Ch}X6nQnL=e&Bl4Y=m^? z9#34Xzwn-Z{j)e8n>$r(w6>*<+Fj8brJIYJzR=RXg)g89<$_Vg?|tSUM_+`eYNN0t zF!2?Sh98#Vd*7oyQ+2-a`R)1Rq7?f^k+-lUv1m#9f*-pa)_;p~wepZV4t52oX=^g{TsRCEqScws0#C8N= z2+BScV@|cKrHMj}+GZiThdKexm_ZQOf+MqZSBrl5QAD%L-FI ze##TP(Rt*Jh;9B0m(1ce(sAmtyE~ zWeDbGfq;5E%W&_0Tw?j!c}slL-)GaWEtWOU|fp2lZrKoiLO`kT>> zubJXc1k;$w;rYv+o#=h>mrO04F!w0CnD&d~@GCz?6}xVP5=d`?(r%{Ku@Mja!A*PN zb6THe6*ER7_FE-=PG(;EF9Wp?W`f5*X+O2{SCK`Le<>XV*ir6L6)Zuv%Q1N#lOVMc zl5@f!Ioh9D?yP{8nkGjQG3SKMrF0d+FBwfdCKK9pSr(sP{sb(t1TEF#2>TO)ksXbZ z7HQfw1pq5L*eXth)g}iNFbG=S2sqwK7EaV0JC!RrZdp3ylGWf)8m= zZNgeb)3ftxWylEWXIH~GOB42d-Tf4G8RM`zrBv1CZsLVpOmf7h9=-XLX^e*q#lA9d zF>^`ycXtVm$tYHDO7xvjhfmdQwwv1_UR1P zN43<_@hJ*)(>&G$g9(&1L72^H??rZ%AlpgIpveEZ(0oZzr zwQh6{8Y|a~F5WIaVlh8|w+`a4WE$6F2v{T))qGQynowU83!v5VzzW6Q0ZE6Ed*>ET z_;Xi&iS9o7doM=UNKD{7eZ(t&_q3FZO4bqb)1?#Yx^{^oFwlm@J-bTW%jxoxbi=CX zVRv&%?GgqLjVp}kq~cTbiMK4siiV{0d^fq)ytQT!wjt^09(U19ifHDLa{hkp z`0qWlz;6q>E=J4kE)xsrsI)jpg=qT^J;ni58(-66llh;^2YhOgsl^Bx} zxXlvxI7qQI92b!gRQ*j|KwH~tWp0GT_vehx@{PpIyq~Rgj|)%cs;=+)hTNUrxS1-y z08VFlp5%F=KkPDDaTLNa{_y81*(g#-)clBCPJ_|MxaJD_@lR3gWR?4>asZ%-^88I# zqj7rYy<{lPI_JAxe*aTznP2vp1TR_Tr^>`eW6y9RLlVg?v^r8N>F}^AzPU#&)uJ?h zGrS3lHpFZ*4?n0`qlbs#6pICdOnVq|?lC{{kG<MG?h8iGsWuQw-vcqfLDy@i`S!La{$r;U9dmfeeTn&P@$rtrQvTD^3vOZo)E_ z4!UY^JYKKgTvG{r@fEi@3Gxel`{N+rL{u2Oq@Fy#s6N&{HC%dz*!~nVQAAY8x)Vli z$RnPJYY*L2iKEAcF1&_t>eiTK%Hq^A1R#Mo-m}>h*;4KfKnHmV!iY>N#e&2p)e-VS z269sgnjc}n1k>~s6XT3!c)0*b1v@bke@?()7KN7y`sV2k%Y(d!Ze+E~zbW!I(AK@4 z%a2p}8K)sAqRALnkurxunH-YcAC&79(66w$E;J4-ilaDP*8v7DCa+T`JzFEOBBkN3u1ZD4HI8?tdh7=@Pkf=> z%RWsCXP?h($0p-7Z@AK(Y{H(|as;=;%KeTU@m!g^Q5?>*C>V{)+hvV+QFYm>iiq!= zfkDq=Q?la7Gb@mA0oku&7Mnd)XB_*(BCY(>Jy$z=P|S<)VcNc-q~f)iYEn>*f>3s{ zS7unqtF2s$27eP(%>;AC*696DdpVj$$46Wqy|#1h%&EZVwI3+&tC<_c1S*Q=obA5+ zyGmI-0pkVdy>2e|4SJdQI^ATw+iM%VBnHVOo0)FgDh^}=AeXfU9mvH`k%!1|2`C-M zN9Z4bRLy8DCsF$e>S|h^)(!1w;+^8o zS|29;B@!pWHr%CiY8nMqJS!#?(~0YBR_f8im6yjMFWg%(&188rpBU0nz0_$iMuogRg)LvAvk zOOm9h4B8xTNoSn;Go^&pinFb?rGFBfiW3*6{Mb7rx9NJv z?&F!pCr@2ey{h?hPjKhjvV0v4o0VDY%xdiHeEl;-bC{+pGNb~GeXWRE`swb=!D2eb zGL?~mtG6_I)Psrk)CfS4vgfJ=#{IX8-Pzi}!jP`5qheYY@-O?oi2>`Vxq&uH?j06m zQyUmrbemdWveDEOj9)^r2V)pFv{xH(HI7D=llwBq$@GQF5(CeSToU~QR{hbp*C?w5{E}y7u^}(1 zG(9=3ASrJ!$lICx5aWJ38S7{&sg_C|S!mMm;K`6Kf0sgJYtFiO|Lc3B>m~zXD#G+; zzv$bN7)U9U7yfbS#Hc@QHSg*EX6BSqvN8&lz89%%AB2Vjv(7@AH}RAMBbJDt)J-NP z`MCMhAMU$0!|6UwA(f;H(~p@%=sBG?RjXhu7=_^em+T(Ag z<|w5$tC*#iyRF9>AI+_oU47FX)JOk{9M+T+w~#^=?|?cTK`eeL+svaOOG-8Q41^n5 zvK@QgzH*`EikLkgsM1q`*B!hrJrY=LPiJkcVv%8`g|wL=md3lnNxZKg!!gW z;3vAcl6*qWI*>o-mts?#!R$Dw0|pG763qYhbUN6^BYp|fHx$A|v%WG9Iey;oQ5YBx zJY#Pga;j@d*7CUFD12>VTTnY!=?i{7B6iq}}qH zUy-TeZs}KjZ)@J+5_>$I7QMx`zWucT5q&>Tfb0wufJe#7Yb=$izZtz`iOUW$kl)-` z59F5XpW@k=&i2%ox~(AO9<6z9EhaFui&j9cJkeqWoctZx^x_Yx1>l8W7`7=5^;cN6gF%wbDJnJgStsqbYo=3iZQPkWB;?6E&N`zSvCf zrE;#ai`9H#A(z+RYCLG)?zO(`3+w~$zFcR+>v!xq!pWXiG^6m4mE$^GiF>Pdb#VcR zB!EsvdZE=AhWns<0!A2l%Cdo%966E#@jV>y?Y{rdRnUHr0wLym_wFtASt0v%GySsX zB~j6ww|_1zfKs^Dt1+RphA%F{nQwj-dx}^(f@cVRQfpRnKwOpA)MC0!mRZ%I0F}As(VJP zQbRJ*mVu^ya6gLqJ(0zNoOmySb%$XZ8d!hC`+h%F_IN*igZt(6n^B_tRI&;LN9oLB zT}_wTTS^$y@&_a5cpMI)Yti@f_jV~eXRLl5eFhGx$wkANgd+WW;gcjrIn z*w0};+C%`c@57K_Y&zvPFj{aU|d^Mk(l&nPEGYtoTwEh z!{!U*kg2>De?HpFG!HZfeP^rVHrIycVp9XTyh#jNCpMe^IC(W7?jr*A963E+t45U@ ztr^CR?m212-l8>}{Ykb&;R|Wu%v!UCmLfS$m-?~(wjx}W8vR(b=;+6^1)-cu+`4gz zqVIM6-4iMTpDVx~h7r)>a1iLvm?FG3#QhZYcY5HHR@*R#j?Q5N-G4e28ufr6T9 z`dw>_cNrN%pleFdLIGgtV_?vjR~THFm8V>%awCAek;5BD;B3$P`Wsz9V3&ez&ibEw zx!6Ih)#2{-*;+9J@!^+`%Jy?d-)h3*U6|C*X*qS!L!}eNq9f&NOLVLx zr&Z^**W|Se1tq5nr|mfEx`X*`A+Z_5OH=@H86!<=1pVF4Lw|~}3?WG0eS&DTFbTaV zXswVru+pEtmfP)SQCOQD%*1J>H+{|au=2oeu6YXb(lxi}Z7Ut|nC4$C1_x%V(%1jE zdice_H3J9a59;p!BxT!I(Pv*b{#tNlJgYu{HEm<{-c;Nn`?~LUR7qy1-s)I=9#*&Z zi7oMkEpY?=SmVLubp(|3O1;)qlTYg}1#!vA&MR<7fy!1O-JjjX?o8Z&01uMTReKO0 zOMl$=E!WQ1+M+L|3i(X@^FyFS&lH#5fRK=84SOnnX}M2T4cAv9OnEF(_a>;P3I@#d zUvWa`pb;TmynjASMfQgL)jRk9++8kKLJ4lNh+|E;lpePU?EugTg)DM|0xyFIyWmWp z1%EZGRF6I9~#=lY*2smLzhwcUX!9#`|2_{5ve z7jDgyysHanw#qB4#IQ`;erjg}MhIyD@cZp$-dbyX`%j=bqJ%Hx}S zbYgLuAbst3Cf|&lj#Z1q3hGO?4N9&>PkJFoR5-`!Aa#>+Qh&rz4!=KeSpyk&4#es`BDb&3dXFd?@L-cwqvv%sC4|KSn5=D=iJ2}! zTKb&HYnml5zH}Q%O_b*;6jNVG*P{%a8`bs{?(OH9|5cY?C~e0#6|@(-o}E`yO>RS* zJ{ofpdgKTiGX|UU2BZ=`vJIL0DNeDiCIloShzdL^9u_C-yi&5;Or!9OF+WB7a0t49 zq=Ca5ZTFU6Q)RuQU$L1z<#PD^lOa0GN2rNL<2dA$=k(9u6!oBMWUHCWC_gdpu6of? zkm4u@^=f@9g1&cL4GVH058N zv%pz1(~oB&Zl*qUIj*Njjsrb7MgGw<`ZeHlNgc87lP^NTD`YGygIL1c_=(Pkn)_y} zWZWPd2(=dr-vc;Kx=48D=dVGu_%STUcFWqR@Wd_uydxD8HyB18oYw>3Ze50}r&-k*@Wobo0nn zjlYfF&!RDDuS!QT%27>~lgnZhTmY2bH&G*8&$p08aA-4$U|9X8ZZX9g-BQ1qTe{Bg zG3DN4k&#=Epe6kRaxnMjzQ{8%SyR@{&Q1!>7xt{D-8r6Gpc#KBoziF5qUU@FYU+}h z(o&VdAarxce%9tiavAfYS8o+%Dy>f_nX@iN-_~Ectq;9KL~?BXf8LOkYF=XanBvoLxx! z({+8VbcrMwuhl14=G@h-^+T}FNZ0CPUgQx3Qb>92Pi+}qt{z1I!|}^CCLe!#?gafC^ZR>&oGSYP_Q9ZA-%xK)wX)a{=x2M9q&d2yd~F3WWfT<0>^HcMMkBTejMV z&p^<2Fw486aL>^EtQ?T^X&jHpS%KyOH(@5huSOFQJ*;eOf!gH|0sx&>fOZLJmS>2m zY8PGhn#>;xa4O!Aec_3A@KalIUL>zEFS=#q5pcHf6e4Lm9JByp_4)Ubm<)9Jh-&5t zV;(^eN1^y>o`E9Xw!f00dO=+QzT*fo1RMSt#-m0osTCdQ~!1Y;c|kQ1in^rC7-^ zuZ65Qh6$JB-e>`sCNg(3-g)`FZ3&rHy!iQ&$%3&G@h8D<3*#&R{rW5dApY;Ocza@z zn^nT@F4YSnhp0Uss4DXq=y?o_=bL%kLD3W_q@XK5z^f@)E8R#Cht@Vf?*;>>HofS&$Puetc9C>ep3!Mbt%rE8!r28x+z=b`8Xo3X2{sOf8p zz}joq<+W7L^(?!kUOzwM5Q&6)a`R1UKx`;rN&quJ%)eV7vg8PD`UEi>1F5X4@9tCB zOn1U9D77{y6}e1Fdj#mJzQZTbC99zAibXhB3eNH z4k=28?fHbfY^AlxzK=H1`Nn3LDAb&5(_?hxS*YyF+dDtCsQ>BM|u%&>l&>9?W0gZEPrz&EZ|IRU(2zcp{SlUQ`;+RP~;>HL5wU~enTp& z8N*Q-8K`Kf5m-8PC(2eLK67amI0$scuZrY~FpmvTCkLKBIwG6*Hcr8QbvYiCeSqMJ zG^0S_pG;*C{MJ`R?Rn(u|5Qxq<5b&=&M8wIcemy5n@$K72YB1B%#B=2tum?Yt3TO& z&_8h>Wr|2F4c&?bwjwBGYK*r6s3cnvvF-SYRg3ms)R~vG?b@9d38~tll%IiuK~Mnm z30MOA-mpAqX3?U>*0)l}t!Q4J()Oc$8585wZcZBS{$%3w2^v8V7^C#v2hK$q8jP{- z?zb|=yqB%e-#rNVw*S`$P7XjrdOQ9)!$jVkhVJNjfqdk(rXB;~BdAA_EKCeGS6a%U zHLq#s%Shy!7J^c#6Ie8oku=ONIVLiz1t2-0T>K)?{oNXh+V_DhqU4UtBFJh^u;|dj zh#8H;CB@4-v*Q&7@=sf4f4NR*$pL!^wZq+9@A;Vj`5f^m@OgO{tlj+%t6b3Q<%6hV zZoEyHkJzM2B6a_M>{MB^j*TAs&R-Y)^-urFlk%Ur$|L^zz<-`3i@{j*5W%)w~SP!6oJ#^!jpH*pScDvBf z(CY7leJPjW3%lGW$vCCmNcJP`WiksCVtZ|BJRg4b9;)_#Z99 zIfVx_G;g|Y{QQ%;i~hvA?Y+A##l!9!mu44>%P-yF%#Oc$_!rOg#!By^!+HEMHyxM{ zXP*{3#b&JkOPuj9k9LKa?`JpOw|sTypTAl@YC7%x%jbvDjb|STjd*4MAI$w{SW{iQ zHjH9}+gpkSMYe_0I5CTE}?5dcm*P`E|Tv zXPMTfRNpeNIFCWrYBgP;rVY+(B~4m}1#2Aui(21u(^}F*gQj5%d353u->}p_#k}am zZT?z6Nf*}K*Vl)3DW+0`1CI-^=@%U&G@btEn&_)18~=5A-qGd9|GvHB`}R+5GP)a) zbYgULa-2ZzA%h-K0WCKlogw#)p0|PyF^VcR+gfpVLzPOM*$%IKckSp){cjlxUDG!M zs!kWQV)wS4+w+beCcb?(l-qToU%=U8euo&GW zX~zY_8mhFTeIyo~?}r`UIyzRwKnh=D#PI`Z#c9$g$mGLYV0857=vzm_w~}+39vXOM zeph`d@uWX{ohTA+aDLaJ(5vV7C??=6f5a9V;cu}uF^q`>UP>v(yzhtN$wgkmlT|{M z9cS@g-3TIY+vQNknqWBKC;5DS+!AU@s-hyaGWhooGFl{~&Xua*#c4UW)5i-RPfaR5 zoMqUj2gd`Wr=lsY0ku%Z$vl%rj>n>xW{1BS%jFPWHgVaDKIR_IbzQM@RbVb%8fE0> zRIM{jCaLiv7f4UD$5oaL(e7Wg&>Ku0I`}zmr2X>Y;#)bMpFVtj`47UY)6tytYdYmC+NO8 z4l%YXiHg^L5S|nI_>(i+ORM_U*2yL<(x!dj(vMf*e2tFlTm#~CE5Z|6Sa4I0UP_y{ zdc99uLQB29Z^OWuaBjG2AR&ATx+phNu(JEsHdlsVzdNV#pU*(gR{2F~bLPGj6X7`R z`4XVISnyJ#soZQ`e{F%SKp=JtRqsRfHhm7jsttZa9E{&p$X0LvBn&b-wRxB9Cra@; z9~u3?qU0)0j9`D^c)_Me{w&zfGX|6bH3=pTnv}^Mz3_5sub|=`sdr^Bd$|qFa}|5H zmCju~%Cck>Jl-%~j`s|!uPW*w_1^+Fmbvn=Cu>E`40z2#VXLnKLvGo}3qMm8|DwL6 zR6$eNsSXXzx{_oB*HwslLqFo(JOMVB0gb+dfMg+}#wnwwaETfHlsoMx9f8gIrj^gy z7KhKtOs_aGwY4yiB6|2s5|XhyeB1eAYK;5K@jM3_imsf#&*pHyJoF?8vW>@_*_A3a z*o(vO_$E5tyUTb7L10|?;XRX!;XZf2y)g0i#TqZd+n2%c6)@Bw&3(}jJ_BFbbq=M< z=M#OH67i`KNTtL-oAN$ABsL1#EI^^Gb(OLa4kezrF^8MS2{93co3DoNxg?z^g6o{E z_M=Xh>CSv$8~2_BO~m3XnPOuUWOvGABQP>4I(Sk%ry@54ye}l!$j1DGOxYTP5O()% z$7|72T}t5{`}R+wP0`Q{NzzWhcO00|nk(JG}NrzFBT9n?m19`o8bN0Jd?9$H|C{+LYL-gSqVzu8E$f zpE11jCEn&2Kb)gU0Vo%GZGf4H)s}Qo^I*}_yVkl=Vkg8RGe9@Q5sFmDcqP%cki)p3^h z7dz~VY0H&Q5!e-+_fTluB8SRX;Z%%lJ?eVqM{kq_6VC2BKK zxqqVFVlKvM$<`ucnU=|G@9F7DGSzH($Ss&IQo=E0?V2T&Z77p5j4%{$9KR|2?aI$_Ilt7|QzL89htXx>U9*?9gGrHdQ|mBDRc zkoE^EAc{gL?+=purXNH(#UuqBj?!3CNfdh1-kMwkInyq?gbXaiZ3K__lto|`lMZ(^ zN=CzJDWtK3oLs|(hD~V}seFbvIgrouwD`|tpa50e@plJ(5G`O<ht1^$X z;@B2tS<@`Xte`DeYe%-IoVg=(=b29n`lC|eQjaI8s%`vpLC@9X;Qlzrw2X|NMB}Va zVoU};;okO|Q=t>!GL<*a90WaA+%uouX8rrk{ZG+e?1QXK16`l{tPs29kjVX|xTX6U zZhyaFHjsBD85XWKr?RY*G;&-Fs@t+Zu!a7@6$J;-Z&^3Y5YF~ZR(ba_cvgSeB2G{m zcS_1xZ%^X>4%&U&+q5O%zabzHJfzZmo43>a!-<_O-rlrYvF>K@yQC2+QW1o<<88hx zph}(=YIqJ`m~9vcy2-omDPy^|pz8NX1%|@E0CIIlLzZvs5j*Dn_KPNOG`{f1kbVw? zTE%9m#e8Ld6Q`0a0N58;^RJ*-%+AC`?Od0?mAwb1xv0M>S%geF@v!iAZy4!y&f+G1 zeu2*J;#Nj4Jojm_*rzzmy@#rN%n9A~-0O_)s}8mN=|WsmS$L}NDmo=$qnd&8wo^ZX z4qu-3otPp`J8w$j9YQkc<*8PV7p16`or<1a14;>-v7K={xC94K(iIBQl$z#QS|P}* zOo@7Yjqt$#M!m(UaB{WDfl8~M4-->o0o?m9{*VpNy_dxaKX#ib$@{<2ai$=RaQ_0b zSv*Uq7_aI^8I!)Mz=2&mb;hzIlt$T-Rs8^Mq(kE}POzLR)xAjPrPeA&yB(?to$Fzm zFH+NBn;mm!3031Qq98GlVA7|A?=$)yL0K#ZCaBPsZLYzACT|G=@8LL`Qz;ue1L-uH z%0dYFjN19#^1hbznUO|?AQX7ur%{X8KoId|;|9g6z7En2zw@ruTlrSt3MAgP3BRE~ zQ%QT&V!dPk9ACRMdk*o;c?IHhb0f4=Z%E-A;b~)a%Ntim|l+SjWFHXAai?KNb-8~eCO|6 zIuoBwDPo(`^8s{U$#_qGc;4KPNOAfq#rTmQ{Sn8t60zWreZjv26KgEK=0&D_+NarO z`1@>_ZR$wU{5O=Cj6=7R&V5KaJHJRHhzk_1wixr5eyBMRqvc`F?kz7rc<+8&x|yfC z85P|OAzkhp0dXcr_p;38^tpVOl-ZnT82ekR{XlQCW4b3j;Q1g<$s#U7AqOJRG2)2} z)@Ua0&Lp5Jvpe8Zv}6OD7KQIGddRIC7E37V0 zp~3afCX-H7*B8IOypMxyL^nH_&J6lo{Bj}X^q?1Gb`SknWB^e>%(=vSVZr**&$uUs zjV*H%hDAxg_8=XWU6)97)G^sU8R{12=8%y9J9Kl@op;8py(_g=6Mm`o@^i12+Cm36 zSpmzz=h8ZDO9b0vfV^8G{jF40OJy%CoBoTG9Pvj~%i}Tle6Ehfk8ZiMK5x`d35x39 zRnmpFgx<;Yk^K_gpWr0%ci%#(Nk}>Y)T5Y(44mzaQ5x}Rhr4N5rk}`(R%0@lg=Lol zib1i9AI{|ltNvA{Uduq2LtT8d8Q$-^xma`e*M`Ans_-Q4Bca5gdwu_V-_VDk>q$WT z^2q5YFV=9nFD_b%+{)DGNStN6cKLPDR;=*e>S>4rReD^-ff^awd4`?K)bJGX+@t2XWf^dEihJe%U2yA?8@mD`_h z(zF(2ZXsjQd~rtKIS3QH`!<_@rK8;6JL)!1UEC0;+NgZY(=aNy`3g%qX>Fl}W}NNE z7s@kpiE!fE1R4D+Rd@>bPP8LHtmDDW=Dl*MK;jHe0FB_-9?bG^M5>|Ck9t+||AO$lr0OVTvt=T4)xyVjlu zh!xqaP-B&lBI4XjOO?SDTz9jv!kggZ%4t{4PMux9#cuU}KS6P+@ilILBSa?ui6k~; zUuW-5r_9KTz+G=!)$5_F<^*l%Y8r?_ljQAzG7P;uej7KMclV%kGXem{ z=H4%Q!#IdWJ4(*K`F9N?+0V^naiFg3;9)>sn?pAH!atx3DT@!{ zB4fjyOF5&V^xKkc=fTzW(9p@mi3*?OW^P_w z7yi-f*q=~=9->jpfZ%Wi`%G0w_#JO;R-k2IcrY*FLDx)~erTI}%|M1*(D%y4FCd)P z1mrptj3G^6K99?7SH(R_0xD3v0*?9cJu3ah=~0$Coa)&0BCgwvf=j{$su>=NY4RWP z{B7y#<6~kd`-fM%DbV|V{HFsK-MxbUVAwX1^qEX=berdvh_k*kukUi|%rxTUZbfhy z9LKGGTRLXbWR0V{(b4HL82nQ@_K+qouZdtttJ*;w&rK zB|sRG6_DHVTSaLn8O!h!v*Ob7$5v-m#&meoa>#^GsG^`=khd`J#LrZ*5ZbA<49d&> z{c{aAVIj2e`dRI1PtUc^4j&7V=H2@JZ%X|Pmgus5vgpwJo^G0im^~6<5hNB=W|y_J<~fC!-N3mt z7h#5AD#i|)Q?R5v)~c?&zcKn>TMB=WlcW9Z4w5l!*tqb|iConr;;I}Ic@$B8k5@CP zMu)p+2hcQbn$r*$wJLiEZsmVU$jYV&Rw@)|79IHLyvG(f4pC%Zc^?B`{UiJca z4Y;2zK0`VMSuTN&HH>Y%tO&=+9oaD$)i$MA`8vE({)OOLdyw$#)3-r2`)f4tTvBd<5!QFz4tT&@jR3rP1d3q0xH3 z9qpyDxAY&S7ftvF@vpvIXX4-Clp6iE;v7(`p3>$c{Z|D{dx$32Qk8-v4GT^j5%RE4 zFI>Xl(yFUsfJA{=_PxsbL%#Yj+wU$@g`qsum51qe&T`im(Gaa>C+L-gSc6-;jy+<4 zp!?aW`(|d)TLt7&Pa!r{e?TxLZ$H)PgKQTce2#l>L-4f!3AzF&w-=Iu(ry!RV3WoW zarBvhhBGSCj$A!*%~oQ8pQy-?w;=r0*R3XVJjgTNwF3d6@F_vepHUgQgvoYwkI+ph z@S=F4Eg&(fwnaf)F{Yr^tWRl71@AGQQbjlt8&^%kGxC1vh1M9+p0|Lty^?j|nw~dPK?RGOl8ruefci8uq^FwR3ya`bsZGkZBgC--w zedX-H9^iS@z8qbcO1c5%+_(t*znzujT{N?c=)Snr=`1rzkkA}T|BDf_HqdiLFyE@`wQYQqZ~h2OTzCH zbichsO_;1mJ@y+%wzYvA{EP4=j%(PvKhK0)%&$4QoiINV)3$o50gD~+<_iNka8zXA z_F{Zf^6)fT>{h6VC*)mY?Ln|SZHR?GGwXWsrNW4SX7cnSr?29Sc_I6{o0s<2X$nlQ zdCQ_;kTpE(YB=)BAXQVvZ{dbNsbdM@$}4qy*VesK)w8tGmVVZ3jZkD#sb&fA#s{lq z1rX7eSs!N@RN?1L)JZ?zf8~v*T3zOlWO^QYU>veNRE<{gT7;yj+-ACiH%AW1B;4D3 zqE(Rv?hvD6RLr{AQPg6$7}cyebPeohBhK`NCpGUS+8F3;QlXp$F*?=kzwfJ+QCL=B zWHwoI!8()}Lfw{zVs*Wo>HDTeL!4pmu3UjmM;iK@KF8xQqf>xGWN>fnA7n7lbp1!g z;r`-1#DmVsWf}LciCx1_jV7KgasFzcWsEx$nq_Q-a*xCB^qeuZJ@KN*EY!Oh*Lbab z7(-R5zdM{zveeiR@)ZR&f*siu=^nUTI{`S{BU8?2*XIQhl`a9&-}~ zFeNU}Tt3U{!VPLG+8Nb0Eka#Nae7-$Z~nmg{Fpsw1aG$-8zgQ~O%YXOgU{{v^ZPF@t z_|&WHe+IU~L6V4@nkv^7D*^kqvFhCQP*3UkV#|4g?yCE-eR>@kjU^HjhD8E*o;$)S zmoPCxK6_HED{a&a^hVI`_>{PYl$+PY%UtWlwy%T5dQz8sSgU+Tok%-_fDj&Y1W`p* zU!g$g&NHJ1j$R8LDC`gvbeaLV=;-8T{=tV|hH@7R1q~VU@Xkg>O>V6gD42^S%JY>L z9bG_S=rdv<+Pt^*Q1Kv&gPEuJJXZl`I}&}d55ZJv2j;0K@ti32eL+XXJ|t%bbPO80 zl-@b2D+reN#JnZUgKU8fWnWvGNUcxEn{}R95|fi@{bhpwp6kwUOL0Wqt?l-zgMBhM zwqMugMCn%xCUALyk>q#6GwaYm!UI|CJg>KB`&$qjR)+d;dLovfdN3QV-mdnOWCS?K z;_C><8MTDKVGV*9T;7a+G6qF!9s&7y4$W_L6lfaO;@f2>nc+>pD$)4EHFu+rKbnPx zrP=urVMjN341IL?bVWMCdCaoJfdn(;ltt;IQC<2u}%bLlhC@_xTH@`4Qvk~m;xWQ=bYV^?<^-obR zrR^jOs?i@}=*9Wxl71GX<(UXR*|mnGC2C^M;j@5}-c8Yf19ww)Se!Z-%euiEGF&58 z*r%PcVhfyzb))v#{X(d4rOB9I0kx7O0_x+Q8qz}m$;E;2B?noAYxCENa}#^$po)sW ztDjhWMOqeZ-))0EsA#bsE5L{In%@})d`Y2r{cgXW{H8Q+4k}g+>L%Qn1ACgZ(o%P- zb+T5?=KU5&PaF5r~n|qLK;1NbIVEwD!zdx^I774?kiXFac@umho&X@8JIP z*|7(K*fiGq+!L7mYrFog$!i5hV&>XnX5KeiExftteWN4@{m!8}yb=cYQ`?!PHm!M( z&!14`{r%*9>y@j0jYZHsDTIRj6W>4djGa5B07ehYd!pK=D~9LXES^F!J?jEQ2u4fQ z;DvA8DniZvU3(p!L+a8Zd6pr#$2B7#v&azQZSIZc#Ua{1^={YD&%JV2KUsmOPq*NhdF2obKzTROdu-Kp4EEk{ahxv==my+j zs~HnEFw(2GW6r6(8dn|O{QvVDIH`6j9 zWIMmx%(OD4d1`REL^NXS3`@K_({P>Z3lT7w5eY|7MQ{p+V zgwDTBwvEpqks`V@7}si;)K5ustaK?}PlEk=1?)ca)&}|a_5;l5?~~rvU5aT5z&m(? zf>;^H?7+74*TuLj-JiKV);^w4%nOaAnQ4f@Z6%(!eNH?q`F0(Ew`u){o1B@BPV>f} zwXW>^#N-FqS`ZaSK`mh@Zs=-^&{D~d&n7SdJH>szCf8AAhl%rhXu;VMr~?b zZ$|psxXA4?f^*hame_M6PMp7Fip2=_*?hr^Z#Y>9Ik2_)QQ~DROd^0gf^SmhvOJHj zS=NmBUtrDm<1*X%W({i?Em@s+Gs#%Op=OYxR@Be1yzkFZg+MRwEDqf`@?U43Id*0^ zhlb(+c+|~!VksXB741XV{yI4v8Y~Vc?c1zbW*+ACa4%`5O3Nh^i^lTcR?(m^u zs9pu8k~b3G4K;X};i*QDnsbM%*~%=WM4$Jh5%`_C3saD#^Q_+kN3WEepBG2w?UtuT`GiH$b?#&(VsE%OM2 zq|VMija~BQ$^^$f-S+Er={OUv2ztQoABS9%d#)b7t-#s3A`ueHlzFa^6<5I`oSO$uE;ZSQl0Z5C)beVN~>b} z)bB9c%?aWuU5>JIa4jdw1gg;rFr>15A8z)Oyvm9`em{BLTr5S!tL|4F0w&*dd=B}g z=Eg=B*1Tx;K^K>laIB&fu#AB1@@_`Jk#;?$eq^cGE+^4J-i1LzKZb$j9{sp*gjeXS zPXAH)$8`So(G>6DmV2g;;}pD(9sJv%+eMD4jeH)|Dt>{74cv-1CfM6qnW$-Z=dLxS zH)gCxG+#m`crKkCDuKClHwp$^6jHu`tr9dV93lFBLcsb!kG|l7KP~e}qMD(ogsH5{ zhAOzjQ)r+)bo7wSn@oZ4f0taXHg+=-nK)FnVLZopq)kuK2Zhq>*3Y)msgBXXfz2y> ziauHKuHt%Q7uq^V^sJlTSo`=_l6AhYmld&VE7zptFrV;6pRaR=4Y`u zMU-H7j<59o6LOhgdQ8#gyn}aIFfE{^Vro@J+UFq8ChpRN_|LwW5|k0LRHU+FAcJ>o z!GUkA5)_Nq+Vum6pb^9>&@VZ*w45<+hf2nQMis}gwfh0m`O9~sxMe>XV?rzq0ijd^ zeme-S93DBKJMl(DsNo(zu0b4+ciZ-Nac zEG=>#byRdOn4yn`h)5(r;%z0aOd1--O489?9)b(`hmtPZt!INIIho|eA!V`-MfT-6 zhk*2(vEnErAf<`C`>C^!0=5rOopWeFl%cgP#PU(0nJ?ZFY~#&j)%PQEqzF+?lE|Bs z)HK))^H52Xx(b#@g-j{xW?v6+!K&@^tX6#8y)?yhA*$?+y5m52S+f#H@6hxoe8Rc; zU4oP4=0rcf1?tFMR086>Vh`)H_j`+u7d^kQ$~!}{DAO%t=`LRz0gpyiH;_Kc2 zl1x{Oafh-u+LH%+cCWBU=oeA8F}OzCs+5qEbZ(mTiLEYEmC}8dk44Dy<#!q;fEJca zVj1%pg*_oooo|~@e92NFA$L6RpPE*+Bh3fH%J+U`pAF&3mq0UlW4_CW}SSUn2YMobQ*{H&DmwtzO* zq#Tl5rr(ZkPkrNNETIOYm>0>-ypj-KkEnx?a%~GkFAM;l@=FhggQeWWNdjL7>#r*7 zC9ScSesvUU%grVtub#@G@sCS=CTXdu>)q%co8Yf97E3-*orX&DCn^t;HeYp)mHD^$^@y@OZ0az% zz%nJBBipw?wy36hqp9!xqhU<7gj5fpu2Ps9|-Z zoek@_my=2`ix`eFsDqY7L`D73^CxKx&9>nq3c=x}MO|%+xCPQCrf?DG#~s3EK9V~k zNX4pFn~N(mUTyF%_>ycam1b1J@eV0g|a-zW3(PPJuJ z??JxBmo95z&l7YSKmRu{lP{H0TeP*}ygo?f9?@bVH`_sT&L~_-A4)aahySo&KAGRE zI)-(58S*Rl<E3pI8`^g(CE@z!b09tZ{eV*@$+eS3%qkW^=4!_fYg^% znX!G(>E(&xE!k4A>06OBSwcm+kD`vi*G4>!2by3FlQau8lIev>`C3FMDuMx6K?E?J(u7Hi2PJA_AU`usR^HYWXMry8Yg(nxhy^oOcj-f?* zO~|GH_nENxvF=8~58#r9p8mXqk45gd{Wf5|Q2Wa(kkLY?H+#MHh6C79{z|({Oy&+zXOZaEJXqo=^vbOG~KtVv@D@*PR$k6X|Gy;vi;zD zQ7jnD_**OD4q3c&gZoG768<$$1bF%VKKu}vWJX@k%xi7Tpd}qBx^JNZthRE%J@;M6 zVK>m3-pI3#PC12EfvqjrL^QXFk|RrU3IAV+n^nJ2mKRJch^jxm0)j-&f!09M=NoPc zr3DB9bJa%0oU%A(_r*q152dpa26 z8WaNe;>FY0VbQib>JQ|Y50NOKs4DojVzZ&D*z#3Lg4s%b>sMXE2|Bs0Wu|qo*gI|Q z&o|#Y&J6}slkkIrTVN{((rm~Ruc5LY4c;o$ufDA^yh4u6j zP-d36r)+ZeR1L7fK`};)jpMTgsI2qHeV=gYX~eK`k_Lc-FjB%KJVE1E>mW_L4{Wx7 zV$q|<>~#d)iY2)}jH~wFauY%d6sZ9M{S9L0QzR_bgZI|vdAS+r?u`X2Q|s?~kM_Kl zM)5v6`Kh9U-q_3=D&RgjTT5%+vz?i2NubwCxCSl7M>758kV=^!-I=MWz-sfFpPlG) zO%UlaZz_B#*4PYVU1<|{!(GFR4t=WtEaN7bL%W3*UP&u_UR^`<$c=bY={?QExpS(n;gjka9H*X5ki#bh_|S@WM$`RhgvkgvS_=LQN^vM-BKdRO%+_ zbn6gczYSCTl$L+Ok{T}cSTq&SkVGWBG+QNzOq|7Pw1B({DLCrssUketA74VTy4f@# z;iB0>fs0-$eBBYFqUuG>O;qI2v1zIIdc$i32M z1n@8LUm7l$m4Mb^YD3Dh#y(eYN^W2rWQH-E^TU=ofvVM++CXP;&IZcpX>vwGAvOj~ z5M4{pR$mcySazz_nDTj~72mP;OdxphH{Mh0Wiu;RgsY%jJIrB-RkajDU8TToe}gfgZ`|o-|*V^`TNa%LDTv9d5N1Zir^l_f_S`6 zy##xG%rldEkGANo+FcN9_iZ*R^p}W1iAc2Av47>kQ%(EzcHOf1Zj*$5YelS#9@w?} z%>YZB-SVsK?0QX%ho98VBw4d(Y3_>*$V*;ng?W!yrY@%)qL|-eZ!DuuUInK>bF`&% z?alSXWo{dR?K-wRBp#hPwzf&V7BImhH!B`jn*`R}N#n6Dp#E^V%hK%n&MVcd)@W^Q zcEGctQA+HQB2kao5XeP-irGHh#4+eTUmBGD_d>PTof?R0mgpbugp zNESLcg|ftvUX`u%^(3P!#ChsmVU=i@N?*SPwYbFx%@|RPk&{<1@5eRBH;wv8NcWXs z)29-b5cw4v#qNu3;kZHrfJoB^(H!wOtU|Und-Y7&oKyVIC-F@+4!Yrv#>L{KJ%-j zNah(y=zFgHEcE;Wa!z4{`yRbG?cbj6mV`3vG7vPoe7YiF9o*DvQM+E)xv%#yJ;Udp z7<7%3hXjzXZhM+z#`v8>((BRWrI z|NDmvdc6nL+njL`-5^l4UTpFH zZ;>9br&h1Q4^RG#YGf7Zo9LJZFU4D)tJBuI@WfQOVXv!GSTJo67zT&k1Y?iPVjl-RoKW4#UNHzL3x?swIjo3lN_QeO_ zXP+xYho#iR%>$Pvx*e|-@4YvYAuu@%YS?NO$~xHF*nAf%;&tP$VQ@hvfp;cqID3*d zJJ!z4*X3MBH`=E>GVEH|2=~?D_RKlNwtrUrsboCgLZl}ZIk z$t6(f!CeagHPmjcnv#Pgrgg{?5KeMfYOPdbz5KZyR1L1Ah>#w@1b2bWIjS6Y92-#-LkD3ax7J^-9?c;m?nN@CBXU7e#Ym&U8ohcdaesRa$tdAa zilV6)CoH``i&m0ArT835i4GdqWLd(f-*hR1=+(+y%VDd|?FJJ4oI|_!?KYApzINg0 z=(A-G^uki3AQ_-LpnH_xujC6a&U@sigaBQ8?hil8Qn|Mf@qdM&cLz`jXPshnd*ROI9 zy8A5mdb%%+Hzqq@@zf#rpI^1L6z-c4N>cjw?4b^UdUiHuc0Yr@8l^jxwhs3lpvz>{ zRUgUn2*`G=9*8t)gC%#|?MYi+)E7eC&MFbAk0F?S$dZR&&YOeu3Oyd2O03@6+63|P zD%7cEbTyPUjkdELLJLlDz2Xj??>hz6hN5rA*QUtMIffKN@4++jW#qdIu8w=}_tr5N zh@>h+10L_-Qi5sx&9TA1CY8S$^}2g5t71dH-V%fGbnQR;YA?yTN#4&cdwpVpa3)PB z&$?;o8o}9C{nizU@>?fRN$n+4o5PMpFF@;kB!RQNwG45A$+FDBe#?+vRUohLvTare zT6}l7Q8zO7LDKfQ;+#~}BJT^u0SG$y?(>1;aJzfBzt(*=aSws;K8ERoQFB@Q33I(y zl?U=nKZ@NDZ^DaKnC9Ck-%fG+Q;BH`Vu5M#IR}uXx$XMxDx*N5(KBV{Ry*JNo+{pQ zSYPAsdIo!$6Vg%H9eiOzhQfyy7{FY9;5c8Po;K0I$sIn+4^#_-eMz}eWVZ(1Z^roU z*g0?9Y+#+}IgQh3g-d@eKGDxyqS8O1t8g{(ZGG?u6%+xw>m9U{0#uyR4ln6aYMGa} zRHxYQ{Jj0oi~M!Yvq=4z-}bmW&~o@vD{*9H$h!8#&Z`-5=gBP<=tIffN4>Am z%sVb8;Y~?AoVF{&wcaL{1Ie65w+Q79owJwg<6RG=>+Ot)hkt?HE&q(Qo`>z3Ld=$8 z+j!QFI?j!}rGv2Wj5~2`FO-8z!j119NDj)KBH2<1brJ95Kj%K*C(G8q+W`o-h;1nV) zQAl>oUfJiG3CNPq>)mf%i%|tz9!7>k-S_zVH%!z)i7Gm<@8 z=uf5Hs_W0%%)kBz3|qq#kQ3P>LPqW?w|)_n(E0f|y-EPB#FJFE_+&3&vo!5S{Q?87 zX0kD7cqGaRnis)KR6hQuHMj(I)KCqf0CtoIWNW_X1^$;1jxqg(kIT$P5V! z-;vSV(uXH>9kcy8TFaJXuW3C$4v^~DomyMjylO%N1k~?{EzPY{-UjI$sHo6N_vI~4 zBzi2RGp+JqqZrx+#Jb;%5k#j!;dKUj8dYAZNf^;~e zU|dYJw6r{SRxKJ5iAP=uP>tia8iQ!htx%YN_|}hA&+Yn7FWs_7;U%KiG6pZ@Q(HcR zRwuO^Itu#_=FbFpJHKnXNFAkvo>MXtA~(!@6@y{F17$wDe@&;49i7tjI4Q*Bw|Anb zDe3IeM&pYju&;7x^v>#g;qA2h1t+G;(c9#1U-GW}ZWu|uv?ZWyJMdNE*8%pxDv5Yy z_e6RLs@(k0d|9J#OBDtMP@N>b=1%e97{qq3xPVlz)G$%3?;Il3i_%Q|kU1VXw8}%u z(pkz=FRpGFrzWYkzBhB$?P1QAeNIQfclasgt{L&1*JT~SpFBebcu!Mm`TooMA_Up& zW~$FFG@n;Mz(vy@_VOc1&Lru%jR*DKTg}aOweMBl((jq)D_FWjz>w5u)*4k$SRVC$@oYVKfxboFU(i(GsS+IZz%aH=u>o3oZKw&T%!vS3>Gc0n8+ zq}aW)MD&}PTacOUx-n0VB5G>EQM~Rk_7ZqyqJ?oiYa4Dj5IZvyyCb=BcNpY)C@sSf zN8W^o>eYT7laKAzn2Yb6Y82S-?PF&D!tsGJWjR~O8`IO(t8_M1LqbeIEbY<$bCo_N z{YsUZiM|oVvpm4?Fj(I#g6+A^$tbp2aoHO+T9%s855APpK{ht}*u%%j;|inYtM7kf zX5mo2;JB(Cyaen>#b8qpaq;=2%;|N;GrptYzGqis`IYyKuUb*IS%yQVzCNi>)vimw z^i7dDyg|L*CvFySYdt`C2U56IpWWbg*J2KNubekXTQ~0o|JT&~b-9s(hz+KWZ{`$i zTgSYIW;SCHT*LsieN$P@@V-B6fz=&!kj(TB zc)N0TtfHG7BXk;kl=5)#I8}70Pz^!Ed;D5YW*YW?iKu?f*)x}kx>*h?=7%}$=eJ1oOrck7|P6X)TOgJBh3 zi6hZ??>I>0uWB{ewJ&~4=~?O5BvqFygWOXeUYpw_a(Wbq`1n2%tyOo7IxS++VBjIW zRUMKgdY#ZQ(*OY2TT&_n(3u-e^(&SKd(ypUb{{4C2xJ zg7;)I(}Z`c$IOPM!fP;LvMDa=VcyX`T_@arax^W?`5~QNy`E-hnOGJ;c+mJnCzaq z?(HSUaoZK5+MdxcTBPqF$Qgl1oGZo2=uTy&b%FvJq3t zcL@?%MpHdXpQN+8Htcjmx3FX}u76MQi<9h;$l;@xRc}M`#aKo*Qn}+n4Tsl7GaQrJ zLvb`@L=UC+rylB3xB0%*Jj)#4{l9}>FZxIgmp-sYvC1}AxBxdm$iJp~j6L_y6v_A< z=U_-6xBIumU_5ya?~$2(sxiHZ^UBefWjOdV^`JoE2`xqe66fJrFQ=Da5Ig*-Cv{`B zrutD2>DNm^g|o@Y*0PKX38Y`jgr>6oxxYy!io-VtvF%6PKV@LR|y7B|{r)W(i_VeMB)BG)tl*%>Wi+*u5%i5lhrTy}?rv0ZS86 zSX^-c?@pE2ezWs?Zk7;5b@-9D-#`4^x(aA2W&fewRs`RC2A^`rvhdHU-~(Io6m94@X3Q`k*{cQ)Vd z<~6&Fhk_Htg7z;PjGPHva{Q)EDfP5UqiWo*q;L3if!4NGO&E`GS{3b4k?XlMhNp8LWNZEc@KWCgPD$|abbm83& zQ9oRV%gVR#6CL)6$~=+a!`&8k?97jrNy#cw^(OTs3oZ)=7MtfjuYO{o9Lh6joqysQ z(+VTsUxsfaD0yJ=CEpg7yAwEtb|cK_3i@iWlB{mHz8zP)i3O!D+FF6<$m4pPw9wDY zwCM=Uyuws=n@J`6=QmWHhd|H7-Jb*(RnE;aE3U&;?~iUh<5$#sz%WDX5kC~Vr=|2u zf3n!@-CXO70Cp@BGP;JB^e`VB600ZyST@69C%zgMg-6b^rg|Ol<>DJP*v5o{rI{sy zw~!=rTN!Sqr6Sn8U7U;MIB9|ZTZ5~LoOGy-iYm71$m|n&`(ox0qk4J1s(PIJOEZwI zY*YG1K~t}1`UyU)%-oKdq$JC5X>e%(CUP}OVQD4;Gutkfd1^EU8tdT7XoK`+Rla5T zkCQ`UMqGHGwrqbnjp$97k$C&d?)+Pkt~;L)~X{dMvhN9K@KoKT3q zh9s-Sy>{qKq+a#ncMNv_>l&szk{yncigm>BNAwufE zW#OTJcihv`9_5bIX zod-BC({OR|68sCDAuDbHxg%-RFLe|XLiaX}-h-Os?K0$@&h*&r$lxcpb!=;7tZrOl zE+OwJ90}O?gE}XUT(Yh zPJ4HJ0K~ak3JD=BlnhWjECIFOZSS8-_y6Tk(AxijUKLtoln?iH*~%6KZ<%Aw3cWDd z62X0?fp*=5ZRh7{w4?X^XPC{`Es>p=nU?Mxux{ziA%97gHwANLmPqSh;M_J3kAgKd$`|8G_uRZe;K-47ct}UBxm-zN4Q44tA3O~H%trKGnuEH{W6<5c@QodjlGvl95 zDUW`7DAfT54gg8~+V~qpqZQB0B?CU_!Hp-U{H^s3vKoX3;5vor{T&=k*Yx^)G6QQR znXb^cT1b1>wgr`2Cak43dqv+!dFsry{LCjvtaIyE-BPN$q;1cLv~s=Q^{#$pg+;E( zeqY^Y(jhSKtDIDQJnT33{ij+C;Vk@Ti{xCTpdt7D@VpaKeAHWYhm+FR4n8rJ#^jW$ z2kp}>sEi+z&I!tg2ihB{USLS>D++AUZ3`O4IZElOtfwqJhy(T(ZEFWkJjL=rv0rnZ zEN#|Vz{@-C_K5SY!-48D(#m}6d!L$YR2p0}qQorD^9g)YjN~bMudN;Z&)2|^^$ z$Nj1!olAfuA;q%ablz^X13j_bWjt2d(&68dHSgKn>#`i~+t-}Mik5~B{VNQ_uWaJ- zgZW*W4#jgX@X1@tk1v-)R3KVr!-YT(viHis%D|Zmh%TW44BaOnAb?mqsqmqNzcyMA zf+6|`cLEW*fHa+O!?XbS>?e)NUXkibI()rgn&vzkj0jQIeg$Yws2sGR3_oc-Bq6^x zy!*2fJb|UAw$m{8@17?*=D}bXhYM@ zwqP30fvr;&aZpU1jcCyoPsxG5L1rwrS4?TydkgpM2-RNbooTJWpY*)uZol98&fH#n zB@ghOf}gv}z5)+O4A!Bdq3ZJoL!u+IU%%nr$GZnvg5O@S^~n$#)6q;-jM(USBOgG@6!j#eUiG(HIP6x8SIG#WGUekD&&n7uBdDR8`bMz+Yoj zkuv}AeWF%Xe(VEjSuFr7272-XsBTAL4*|F~b8EtI<6 zW_^pe2mriqk(9oyv|C=R=rjSn8|AzI+2B;oE3eApzfA=|iiu(YOnDk;pE%m|8D4I- z)BC0f;|9JN{S@c+on0{ntDj!w7{cjb4ptV4qPSITBIN;Bu-6Gow(-$Vy3BVCO8%BQ zM6OmfBZq7$T&&?BU3D#?{L_i&S;_axb@V##%S@%&nq9e7s237~ao|<(cX~SU>T7>^ z?Go%8^e9jv*425EqWDOncK4Y_Q>qn)uR9vutNIzu>l>ON3g4Ry`gWHM>}O6we==D! z`>Ki?o375Tdkm%AM4n-qbWKADp%oN?!nP-*nYzo;f1@sYhB7VhY7$#-Z(s72><9jZ z)Ly(9e+v1?mp7|Qf@57?9P?Yb8LjO^yVK zbed=$+B>72fe(TIaj7gnb8Ja#_4E$v3hoP*ummLqGqWF|C`#Vo#$X%lasKUF8H~3vRKA69w&%LPd^PboR z=nvQ=Hsj-HI2NW|UWOol&D@W!PfTMn$yE55wS#=z6~5!^QRs9V0iyaJIYH(v{8q;> zbQ&&xy#@4Qp`V}4)1>vfJ6Ps)QT0sbGK4e5q();HcG3K+Xekl8WCQ9xswl;dld2;d(cBQmwEdX(TbqcrTnG z+(yQ8$ZHL(dwPY+?HTxCu&lM6KYxU}ZK9QfE@&FO=co%e;D&)H6-^TNG7bsp=Jr=H zT}<@Szz85nm0zI$?~@+tPPb@)ewE>1S$pun3(_&i0F1B$O_N)#`2O7glU6NG; z$calu=yrTc!nNg@h?Xer`d{_ib_ht+!#tt9Csc%?^?X_K)9#T&c5_u#JNa-02cgeS zOda)Khd-a0eQoW(H4b#7uPDZAdc3Lz&TLn)c#8Ds85P;B5msuLxQm=_H-c_Hc`c2$!Gy#t~)FeH=9c;oA5Xkkef55 z7F)V*K*b=h>726FhiQloORih3gT*GQi#%jRFOckX>bHgDCs2Eh|LZnq0k74^ym!|M zB$Ud(OBVZ z`%&}a(aj2}bD7j9l9ooKO#tsp3hR`&Ea3DDJvF zAIQgfWn-0-E%l=CD&NQ4SgmTDOlgl-*C0&O|-s zeY*cGB&bZ|FoFc-wE#u*UmZLm*E#=w5tUP(?veMay9s9~=!PpQI4 zVJ_k$jHKop8@O7^%TojTH0+uLIf21tS$x5NX~8KEd3#16sgyn26qEoK7_+dW*sl&3 zF%=ueJ)`7x3?s+WC9194d$+}^r$&SnW7XS*$;PnpwZ{_>Wb-UnhJS&9rDn_n{YV}* zd(C*6eD7Wlzf31VGFOQUZ$tqyxSNON%^@JJa_`u7kPId6ny1WL+zaH{o3LW`%Wv(g{O8`*L#INird!Wybkl4o&rAaUmE^B^VBa}EEn*#_ z#W8OX@OICOM&8eE#15o=i<|&_Kxh4&y%hRZppLpEx~Oj$WtxN@8^qeiDmJgKQgqU{>Fhd5rp z5qZdB0&EJLszEd`vKg#XG&2b;ftPPLe`!rAT>JIphfFVGapW{G6uMG?)D*@T>JH;N z$$Ykjo(;|#esauU+@3&bsaCQ3)r+9CiupPS*LGSt0I4Esdo?y9xk&wrKp!r4T^2>B zIUH@1f>yd|B%LoWmI05_LNy9`Cwo@4I*8e!~*!`DcDEbD?&XPqreD)j7}iH=|>f>&QO_b3*g!J zGWm>~^7-uEA~pHpgOs)x2#O z1rjRpJ|$24Y{#|RzvN!WL8&AP*I3+Y3p16lmm1CGK*s76##+8oVO8mO6;xoh$B39~ zuELF}OrEaw-d*lj#soLHA}6yGRY>k)wqr!UMR!bh;;hjX-`{Y7hoV z7Fv=Js6`}hs=yqP3|s{?u(o9VQ{dsge7S@*bXFmh)+j7;X33s=vMJDrM>)VQMSLXt ziqm)kp)95kJrWV!=Ng1jLY8Dcy7bKtL;bP8RoM9*GCWt}M2WcELK^s=HAnBCn7YbD zb{3a?OSiUYJf$5{EOyCZC7OCFzc>z>v5^Jqp&R_!>%zwn>Hv_<)=R{ zQ+gGjGTPG9(Y@_l>~D?IbcJ4=EJv;;@0HcsveD&+F|3VoP8yzrMD`v${9Ny3WTmYW zd1U-x31mIDT5^t!aG4SCGB{}NZ6~65ru(vIj*?MrzjT9m?1~?@&L%}joOE<^jT7vR z_Y9@XjF6v{1BEs&eLwN7j=hU44KQYqxN$5u!{#!S^sv$Q}MI9t~wiAuT- z2Qk@Mu*nypggPZawMOb@P0QjuGyL+mBBMQD2A8#Bd!D>0a~!Mn<%%1<`Y1am352VQ zWv8RNDs8u3a!8$b9om;(_@ofHPYfL82Efiwo(a4DSrv-XZZ{sDnM+3&WrdKZUo~)i z?qTA>e9NH^6FS=&as#xsVTn}FYz9+|<0|>G%WnQ0F${>Vy}6lg`vjl5?6F$q zbnpxjFk+FWlOseU83DCB80qMux&9b@Gz7xoTJ6|cPChs!T?hs!(*@8&ela$ykf-NE z2#J?hmRVQz82s6Dn_=>gn+To?#G9n6G*bOW|K%P4vD&PBG4+gXX4jVxVUL~_hLlAP zyhF!bQF&(Fc*ZF{$~aMWQkBMbdZ<1DJAMYEdWCPGSTlMn^#onm(|boLx^jwA8G24% z#jZ?0Iaw-=uV+a?F!+xCJhwEbmUN=*)yLl1YhQ|`8Y)4nMof|A9j7`CfYINV-#DEY z`)jpC5DA^Ef7X&rDlp)xkA5~Y7+ygcS86}Q9hQG>7aT;6*p~2JowY@RKYn!PDT-@$ zzE+<(G?7|+lvaFNpmV250qzHdOchwI z6yio(uGy{}M;HmxQuI=6#s&9SEK6trbFB=hd~7FpT*9x?1VSwkuXlQRpV-!JGV5yN zzc6VWM$9zH=@oOu<0N*NYTNHe5wrxKroH^Qgy2pui zZW>;H2h0sdYpFgix(Pvq8DnA9#GSzi{)Xq(YH@$>mjy|H4r;hEXm3t9vh8-ey-Z1)DDlbluxnY!C0j1sKAvfUmd7{_gwe)&E#7!^s{koPp7t5TcxwA5n@ z9QwQ0SI~ZWp1vkR?fCJ7H%>O*J0Z!*P^;GKkbY2Lu8tft@_CJGH# z85q0e+4?f>gj_5#P-dU7Q^2YTiL<4ZSy6t+VUJOcJY!%%S7BgPt*PGriG{j4 zW1y^YBrI;8Y;>61EPRYi4C<-ExN1ro&|h90>EId2UDn8N*;uK=^)7V1-Qz;n6kNC! zXL1PPFl*y)?$!p0aED`=H$HsgjIcMD*D-mVtRQ3n*VIGzh!O0g>6N8-mo$s6Ii?|+ z++L1<-KNMH#+{s$40_+bg)VMS%NxftX za>JM3XW zH@qL;jY-TN_bJNOW|Is^@+RP}{@7ds~{U z!u?ORv2ry zK$X1G$L(>rQd47f4&W^ny$b9Flb|Wl(;+06_`T4Yb2HyvDK$)Bz40Yhmc9k5?pq+& zHia`-XOUIht9wLQXH~IqfM73RzkG!VGVscz&zj>ZvBeB#P)M^D>1P{4M4DDJdiT%| zlE_PK1T!Z$z3@i=jbAPEr%BEZr_8MfNyk9}vc>1_r7N1Z93@ou!-*}A^~cY-0_Rm_ zd>_x>l~JIVDLsm+d~U}Z>YfS!5aaH8M%Xbsc^-&0%AUK-ZHN}1KxQve0c0*DLQst zLBIyiklnjEIF9*npj6ZjobM5kI&Qy_{M?7@qo9P!-Gc67?rmce>A5+(;%W(R+ie=H z=EN_90_(^I9cbygifN=9@+#|I_7`m|cv5Cj&Plj!4UQ@NVEIU^_gec2X-Tn|$@CVO3K}R~iwi%O>p5r!drF9ZkcwX zaImbs&!a0WzYX;G)duv=L=u0G zJa_erP@t@RfDosWsASUpqx#MrRG^BPHm3Bt4iK@<)G$raw(AIDPD7PVhbW5-59T_g zd_4WMXN3Fp$CcqI?#U(Yzf*F8eepp*xXl4@Ei)=a+(M5;WJ)-SdFy}TG~BLL<6A(tD%u{)fr z>zbpqA`W?)L|zW}Z`}-UybdzMj9wedEy{CaZx<=NfygTNk4m^*T7aD2NVK>e83> zrV?eYWRa7TJqSLNkc45^vJ8cIj12g(=gu=qfXL6-H$x%~Ky8`c@gLwVtu*(?%OTHx z)qzrn{~DW1lJHi%yoI>lFjWOB#&08d;>ea$?!`M>Ynb8@L%8G6!K6=;ph7>E>@k6n zv9kw*MGb7cZ-)yf=+swEC3=gX_}~T_Ezg_c#LzG~U?f|6^fBn}c4L+Bqg+f=nYOAW zo@*>iKrp1aj?(%d1?bXh#i&B64f13V1=6c}kPYBXJhD7HuYsi+=r&SG=MP`)t~5+tjRaC;TT=Q#r+wA32EOMb zFzrrowG}08OE;6tR5e7vNk&UtlSQm*zj>zB-nIoRrBG66-O_nNC*@a27~@ zpnPYt1JxUBhO}{nZG=f=Jz_tG+kc&yYJOPA@>sX(isv)<@?KD!j6=e-<3)Z8r_N>Q zE2p!|V=_fxrFYbkH-hpCWn{(&OYf%xoJot~9ImS-t?pON@|D!voQ9p~yzac_Ly9C8 zo3-N$7kh@^*a z?+@bCZX6t{? zHJ>@MCkPstgs)lcIPf9UM<)t|7x!E3mzf{`a$kRij6tm+083k5Q;Bbmg=Np65AhrN zu6ngL*5%REJ=VTR!wPVGc&Rov4{@~IC76|yh*-Q<(Kk1X8M={QNX$n&->Fy~=cvlT zHI?RaHBAG#hmp3&GrIl_ZxR@&H*Y!66_SPipwYU-f*8`qEUjzXzqlN{IR4gfbYL@K z>B5T%y~ZnB(>-rH_n+b7*aJcrI;A)v-u_O2SRX{eFCz44W|)wMKvwy*iJOuuaeeOY zt|_OA?pkz+-%(;VaFQsb4==*$jBV>mJ|g}As2{$Qx4^Y2Y4vI??=~+JJ)Y#E$1loe z3IlHE9nM4QhDkWeUy6>a!9vfbC~Y`vM4EXqhZf^y0NU2VEP641QZQUS3Zt5iKAZst z@OYsTWItk>ZXfvdPSu_V;Y6b*`D?Hdsql&-{VU#mnHX7N;@+iQDPRVZELh5;@Rm3R zRwXND)`x}B&23ibI-Rf3tM)VsU4~jDTV&C`aq=>yLUbWdZj4(U=Zy6-6&e+f$ZdbZ zgkZ)j{{r;Uhsgr_tUWtKUuR!2$z(-SvMf|eHKW@$cZPeKLZ65Q&KH{9{y1t<2xebh zAMvrcRZ@Z9&Uy?lGq!}&l|ui#Do)+B>66+D^w{~Hau=>+&;8=do|JdVTMGk^dW4{j z7cHPS$NFz4rNwASmJUs>58P^LbU~Rl^mLI)qw$ElF);}+kRUc%6k2YrH zhUyc2#&2a-C@QYI9Tfvcnl5g&jSk_<*D65ov6c%^ceqeiY+Fm58E-zJUI9yf@q8Sz zletrm*{}Ca%y{-=EvjW@$Ee7^Yi7CbB1R^(2?s8#81C@&Hh)k2v>39r7kBuUD{#8; zG=;2*qc$gRub!Ba1P2=0eP@kMzC*%<`|5BGVBSc&PS51FPUNA(?3Yi@JUr!2W1SZj z$1~hxkcYdE^EUCEYft_JdJCOFaKTDjYM%wEPM`%wAScy;5JeXI^z5h32py$GkDJrGSbJ&NzNW+5?sg=z}e*Py^|A!c)P3 z8Eymf`I4NC2_dX+g$O)O%FRN3{ivVSJ=WuZ;~=T(=b<6ctu^QK&z26q$>9I0R>5)F zAd1(RsO4I6+V`WBEcSjH!PoO@L$6~2@}VQI7tbVOk%lC=2d_Fz&=Xvy-cLxa6JB*4 z59iq0z{sooGM#=^>hWUX)j=($%_RljSG54Ad-@obg$C}^OwaMQ3um0#?tKAbmVNL~ z2Bogy=VxNhXtxnpn-NX4#4Dy^lOb#meYPf&3qbWUL0N_GZg-#AYrE^&vq}o76TE4I zIg(wBcmIRXyK}sxqmzp=*VhmKAeujFpSz3*34bdp?q?NwZpEqCrgGbPylV-iL*l4$efofFPPmU z#oVEtVwjcIc{I%rH@*e7i$Kx`9<3H7JpEtkJ`9(9$na6>K4R$07mh{S%J)~&0 z^LPIWSSBERP-dt}orJLMkPz(SO5cISi3pgF#RqW=T%)M-*Ev43`S9_1kp`~+EJIRL zMxPUxhpjCTE#s(DD_t+~QBa-ndJx^qS6 z2Is&hn#QR%=4K%qr#|@;77=^|-~5-8>l57j+4~&PQ=_S8Y!Fok})ms5|s z0lcX?#PX`5Y53Y9IZz8Nfm{l^MBP@y=tzcwNNx<02OqLiW>+D@bHaW4V`bCE^X`Gu za$V+NEVz3mR+#5UQTF3kxliaON?Z7<5X=1^^AwbulSu^Ry_MuLyXBiE1LaQAWehG7 zf-nQPgnLmL=6&h>CcsEkzNn)iLT;$Rr)z{A3p z8xlhW!j5hTZR`m_NoHT{lepgI&Ya(;>E8Y*aN)z_`A`a(?iWW9z;?5a%F(x9R3Kp%CZ;}zG`Yc&*dqvroUcQsD(J#K*#SntWl`qk zi@_a9oKAzoNkWCxN}CRR`{f4nm!%3XP%B6Am-;Lx8-w3#^M1&*6Pf=E9^KmG0rlT% z9pZnC82&J7c?NlLq#UG+^*c`~K4;+JwOemdq8Y$fmz}PxP$qQ=wkQ`}{xm!9#8DS3 z;e53ottAiP@dXJRGjtjZ3|LB($3S>JFk@D8-tnFR*v7R%1YA`Iy!4*lS4Wa2f{l9S}|3IcZ2AbClLWcVa5}-ws=~p z5o$;kR?TYjL5K`;pR)-K@#8m0Vp$g?!0#O;GTI{r{qAIttbY_a-d17;xFI&uEf}n7 zv;j{}1yrt0i?ZC7Zpl$`bTg{<;GODbnE+I`cIOAqyMv4H0R_Q2uNq|ZGg&zsN19_j zqIbGo6=G>JhV3hyAS2x0nGKWjgGUYWwqMdg9S8*Fv`}RMiZ}29$C)D4MGZ+%QJZ9v ziQ)DqTh14Tsy%vzkBpsEH%xoO#W?x4w377BtkZO9O7I@7EsvV5W{VQNqw#Vh1vA^d zxZA$0%W0$idMi7(8@f2?Zp?k`B=#(gcCdh~285_VVr(vYT4v{AaVm~q4Z|Ba>Y5;c zcQ!S#&H7FlsvSXrP3&{Z&i=hhryan>dMS9E+v^=#-@bcUH^B^Onc7o~9%6ob6oBM- zVVbzq)$GNCd7)8WU;;ae`xHa*d@KFTg7LM7I9J+U+iis)2jaAXX{S|U(7?7B&X~;N zv%RqLmA;-Ao^X+S#RBhLVCDZCAP)~R-e7s`5uFB#sEW)A-1+)}F~Qst=Px=QUA z%`v>$ZoL<{G&j}qIfYIm8t8h5>BCfG4qyk{>;xV8vY;~l?dufOV0!F~9Sa{Q1qk30 z8(+b$Ust6*2=M=96JYW-!zRy6(7@O6l3iS1^VM*xqmb#hS58cY(Vs&mB>8(5PvlI& zPrm6gFEx`8BmHplQF+b(I4#poCp@*!EB*D?3LJQt6y#xPxuGJZJ`)k}v38|v6gIb- z9o#6czY=t7lk~D4%JjmXKkfSjundR3wnF;;@S?eLeUo66V)fF<=`BQa6K!SQOG1Sf zyv^@^>C!onYMf;TAin7{w~?<_p?CkU=~+h?#m5L--+5d9)Yi+cmJ+w<$U>pR3!TkU&!rB_f zrR~SLkL?l;lCD_Y)pE===LiHSZu9{!4{sXYfN!DK9<}EsKOgz0tR+p-9N>E2(-XF>JOERC$PK)mJd z8jqUPW=-I4%#6lZ%XUp7&fsCBM^N&3cExc;jC;YyKOBBkc7D?3Fyp%f^9bJlMGBCp ztuSvE^{|()K(*IcE;ZHxLfcjW0TNA0`+Q9g8Ni}5EuW)~M)HO>P?)NBZjaU$y30Z` z9Xo1vZbHL{QlUPA_?Cm612FUiU0C(B8IGLXluVxCJ#d6FrR5(yuv=AqpDAg-n!!hD z%@j&7dPvLAcsfu-q=klF+%ry5UdXw!r?>Esc}Ja=Vy7O0O${NhqYsQ`mkyrVO(Y(y z@~GxgDf5^1;3>qG150(<;l`XLt4dW@YCA1zy;)H1VCrhKvRJ`wH1FlbXtJ z?%1-Y(AG$)dt$(Y6mH?e3FJ!tsW`$JBgi4llnZEaW#jWQ4bxRc4P@k9M;+DrORyVH zZYEC`>WCZJA}`j#N;93OyP4v9z@k=q9ZP%~_ojUI$l2sp0<_cpNaH>a6XZD5aA=Pp zRi@nbk5bZB@_z*re;Lmf7UxR}n2+9byN4O`8L+4T--)Ei>a=X1Q0Ca>nwwtDHLq^n z%|G?(sF?PbGk3Bl9zB-sf1qRAwz0onWd}4=V2NYWzB=W01#nTo3RV(9`c!Vg#@|aS9}@J~Ju1D| z35@Wpca?(K1$e%=b?a86goq1^>l?}6trK1am?jxQyN5by1@T>B1wQA($B?4_qSvAO ztQiNe-f1j?r%|X%RSp7PaPRKp}*GYrK&fr+&k!T!&Q7{!;|T7=@FPP|I7Lt z=uBzvD==j3xq0$Rp-F>)(4}*QFRF&=H(V{C79tt(mO5AdCz6%W{tqPkr?6g+hxPJf zpD9(_p~>qh4Y*tCfE>+JElU^DOpRqb-kG#mgITC6D88)&N4EAeGk>6D|KV%l=}SMZ zMYf%8kudy?;3|C4EIfqr!Hx!gU*^>#6Kpz5G&w3%G{=~7rt#*M#LZF$0ru9)rPEbu zJsS$_AaqAV)h8;rK*Bd*zb1r#slJJKW5m&^4s!!N`0qk_LryK+QQFX`vb3JTU$*h* za9_`5GqhZm=YX$_o``-Rq24Z_P53h=UEULb0j(&$4Am`9nlAtUJ9wLEV75xTWzj#( zXy5mDtUV8$AvU3RZj4aayW06%Eok{Y|6l2+bDPLQe5IumoJGhP7blzw(+_Z$W+C7s zaWefyTfo;_$bi6)b1Mu#`VjxUn8>Jq%Umj}iIT(Wr3{93$@nbWc>lh?S5ZhlCZ+%% z!6)ZywXr47<(RdqNs&&TZLWXPWxhFG|Axs!UKlSeD%??VoR&JfdWG@6Dp7Vm$CjyJ zY`QhQvC*G@OH0kp6Zim-vr`ClgRzmjKY;C(De)c;PE`oSjPCotD|%6VVuODdqbvt7 zo|4=CltP6CTG$DsR(#u;Ysm<$!G;9ilAvXSd16iIQAll5wX@8d7mo&v3n~VKOoHDei*8nM9S`M$xfguR9}yIh2-_hPlF+U zrFECxArDqEm6qhp2_SEj)#Uhz%(td6#qSk#7oGGA6$s77%oX^{Px#|RM~jY()cBAF z{^1(WzAJsk$}vj{&PEGz+64j#q}BQ{e*E*i2Vtlp0m`tys~LN3G7!yE7U|k-9!LlM zsN#xCYAXI2`*ND0W%S97hsosqvq2oyeQ!BsIphs4rGm`<)SNI2d!~00(RjJ+kz>hN3cPqH(POn@`c;^lK_kSGJOtwKfy*hqt;AUK(}SnEI& z84)`tN+p8uV62(I?fYmj!ckS(S~W8E0oteSBOC{;NG0O;?025csvL^>)fy=8+_N3I zl@Ocd_H0?!Zgw$GPtUZAr4RmP)78J7xZLx)=_7uBZ|hL)4-bEwYzjn)+AAORR&CQq z);|pWSBWtN#+JW#FslOdIkJ>YybmKQPXt@ZGXDK^p!xavmD&*+t-0yA6a1G; z22z>!M^(?RRRv&0ZKa;q;DCTjX{xvC%$&Kjxs~@gTP^-%!wLVX>2)LgpDtMJ|3AsV zV->F+`T(rH&MEn?LS^Eo|60#>@5$iPG1wI80apw5X|q4iHQ)_Y3NPV|p|w{dLo(`Z zz-Bw$(t!`G=A}I`+zsOWqTW1ll9GR{7*@jnGX{hcrtx1fATG`~g_^uKY}T@eYFR)8 z#5HReBt|#BjqM=}s4fFR&%KLjKdv74vWt z@8*aq*-@U6=PXmwaGi8YDye<6ovE5&r2e9DBef0$sp+?C#zFU zE-6(<5q;1Yp1v~kB%QQWK())Eni^}Y_n3vE?k(dz12Pm{7 zPV?W8lgYX#<0%gi$QPmb8OhY(%Ae2c#^sE~@hii3Ze(+aF!=`Zb1F1yr4_Sk#yt>I zScPx$?7x_G2~e;*yO3{x=Z-t+K4A zw>e`pJZ*1DcrBgt`^FQaWo`-Y9;Ie*fZxGqbmPV#XCJ65wVw8H zCrd~|>kK zBrSoe`7fiA6T0H-Kebr9v@NY&#kP~KW4i}2@bRE~CJNt(3$hlRT)WbgOAKBmhnSUc?>6hm{%$YKsU$*p7St&Gd!Ud+;4XrzOcPb_JKD}2KN>2_ zaIeGPyl1ClC>P)Q1}>?F8b|a;DmTZfVU&Kv>b9(ttpleO(~69Xs%~=(51`RUyI(}{ zHpp{XX71X11qWqsYt2|@Rk)VnP}#zbrDAk`oAW9EL!~}=rB|}q-9!Nheev6AOHM%y zl=89H)2t92C(&wQFIv>M`Fm$Y;*a1)DDx z%#qJSEkDQ1={U)({eUP6VizJtL3cR^UkI4+_P*ydL)EipHulz+Pm z^>vFrwElPh^`SVHN7g5QN`n!QlAlW!A9To+4R|*XJ&6x-hzLH4a(EG`Bewn@j_m&@ zLO@YrBiG}1F$!yCFhvbmsDOu;=*QZ9hiY176VGiWW}tAwuaW3!--Lf!G8Vn1gX-y# zYO8PeX`JU8&6yHN!2F-k!tU8dOOG=^#9OZrxGy zMd&hgRNh6$0um%;)qGsJv^Fi~t?PdS4CqUxgmkT({#HfEYR!7F#jik9JNIWt)@^@t zuBgU+eLJFmLs_rSEzk9KSnUrvVT>RTiFUK;^dH&-8X5r@*%*jBvUdn_m_G>xubm6I z4^>^;LFY`vp|K+|@3k-MBUoAq4l$!3;Ni zIZkDLzg8;Uq^>^^Q5K9*T#X%1yvY5UdiyB2oJngnq}tvWJGq+Fp5&)|>{YgvQ4Y5R z_QEK(m3Pw&pg-hRmbV$X+jH*Am%b6?_%8`E=hgjx0S=cesL$*cBKTZ#(B4-=E&x10 z!@sY>v3k9#kVxVETNWy%f5)|*n?JK9z?Y%q5GM0qD&iQij=UG-=&u@hIHhvlqzRmI zm*dU^L=yVGm-o`7h%|Fy{}124R*yA(*snireK^_w>BD(kQ>b~AZMuoSDr6L}qttlQ z<6vBL_D|P|&LQP^Or@kww)IgT5ETcu%o~zpaDq48n32T!X6q`xlVJ@0 z=C-anqPO(7SHVApQZBKoy{SmEp`E-rS5@(45Je~e_8~gl3jR(%QwEx|pC!i?1%DId z7)43;<&O1YpY}}sEIuykL}#V6#IUPlu=~M0lU6f!=D}oLeI=3@pg1VdH{xyZx8soI zSED5t(&hl^q5~_`LGHovI&Zl31wC}NFK`Cv^K4aazO_Upx{z)AxfCqREoI9>yOds3 zP0_AyPtLhw8=GGf09||5&cFuOvqv2+N@`pqdp5S&(flm_NhC>S(e`7R6soc7kJ%5q6pULb0rHU9A=9r;07Ssq zHOKiP6i`j?>sWgbqp2+K&i5y~g%#<|1`v)>^@I9Zipe?iGf*+jUg93kyjS7xg7Esr#!?pufPQ|YFgup=~?Tq;jLjW*Ft3#v# z6Id|7bl|NM*CpPmkMjIdv5*m2OVIuB`cuKnk?|b#0%7jj;%7~cccdl7*Tx@=!s~xc zen)Wm7o9Xj;Z0gXZHcw&EJ}U1R(G^I`JlzRLx@IFj4<|R{ZZP~&>=m6K18{^uYK?- z+T)0!Wb_^58pWen58^+`MNLUsIwqEo?xe0x5X>BrJXY`i(+sj!G?!k#I%Zjaq1a`j z*&0udn^~^N=y_s_7m7>=!!}d4Yi(Z zYma87LQtX&c{|91eQ&ZQob>(h5``otgUQfeloJ*t)DqFHVH0L_AT%+6=+KU$hy_Kv z3z999I^JBt;>ebM=F!eeQW}V6)W+69RQV2Sl*o0*0N%URH_C+ZIWXJ^;(*Tx-$rSh z$l4E^q4WeNreZo3nsSoenk>7wcRmW58j0D$J9yS2E!d_yMv1&A;!W55qVIT<%Hd+{ z*Vl)T3|!Q)ad_*va^!&xp6cC3ns_8=-g#_n>wB8J^>NNL8C&QN1ZqBzp_ed<`LDJd z4sa^W^`Lug*{Crq)t8=W2mCEjqhH=12#|#1D$m(Ewl{@){EW6VTFo+zpu8r`$3Xwa z`%L)SFJHlSoQ-9OE)kHv{HwAvi?ZbL+aTVIh2Y)6HOnT|G52`3&~j&77-NuYUY81h zEvNfHu-c(o%Zf6D9j|OzU;$`{<8m`<3EkRcI^;v8kaaV(0GzZD?kB) z(K>+SGsiHS347Yv!oM#gzh<+?VEC zye0!pvuu7A^Dwm@BgW>+!p;HGc-Q974CMReuX!7;zyk54wR`c}!!O>N>EI1fZR zK?ZkJ442VEc)STT)K*&Zg$|}CsmR3+_wmgrP&}-~7^O3j7ue^!OsFt{U z_g9jW$vM^W==%Svn0y&sjsLp`1DUUGIoA(L`&mJ7rsDY&3$xC8@`@<3^{T}EIM37Q zG9iig?X!)`u&Bl|02{DZ9nq4ZWr}C~Ww%RdrF=qD!MC=vk{*SxFr-v_a{%SV&U2B} zLR~JOn@lb?1M+$*S$U;}-`%sw+jB%pPm^P6R)=_pe=@RZdl%VPdh_yVn+4O zq{(~e)R*M2_Qn)yb}OxObABFM;xup4wOo$Axbx{wuj-(x%~2JmNd^Y0e{Lz8|G{%1 z0yISK&KBUFYUdv2%Hdnl0QHJzm&AqyJBitrgfNd1gFIW)B}wc~=8hjm_q{=v;dqAD zCj6k&m3j15ubM(DQ@-4TLLHj+V@4Io=`Rf3Wc7+rBl=~c(BK9&e(>W7owXKtp11k> z&^Ac@LEzGij_Zd4~MLbyzQIvr~=d_f;p}+^x!;xg6x(;?|=S-pdOc$2l@hR;cK9$cx24 zoY8@1P+ZPWLG$AZT4%%^$;h5U@P`WxR;0clyU4ynHnn1Vc!(N1LTioMdpCl&1P2=Z z$}-qkQ?fk`Qxt>FNyl!Nzv~h9Ud!4Je;YD=RfEj%kOH%f#QUa7&y3W9@@0Tmc>)^$ zU)22tR9sKDFNy{T79cpzbQ56rfBW?v}#fD&X?2?lo?{N(AzK?+{53r z9nG}7UY#O;if1ayOFrDGCD9j%v7#?;g@?DrydtZ$J zxhCtoXJ@4QpF@N$$loRW| z5Hd6#k@joQ_^@8EY+#q21WZ2SyFBMY0$@ugA3_l=^dIT+cNbo+tN}=K7+mIBkJhkj zEFxx?ZhD91%#nLEfYsN234Aoyy@Jz-ZaKQU5G&HX?xbF-eimqwe)%+Bv`2AEN6Pkq zGsvP&etnuqbAGz*-QCyd^&D}op_<%d?H+o?LEW3`H{eMhPtqR6J4?U1RhDqADW)vLxzv$PmMSPQG{|1OZm7U zbCB&RoJ#+nOx>|eiBO`@J~Tm~2^2~cHfV`p-;#!7ZdO_%CHXDLcwfb6!<}__J4(YX zWoUOYC1~#|Ex}%wZ-!W+$&%P|Oa^RD4={%oixC&tEwO;zUi5VQNDk`bn+}}I6?7i- z{ezg_%=14K_Co`e$tJ>G1VXvSxt=TgvCGXLaQ>iC&w*6uy$O98VBNq|Vv~a&X+8;W zLp5}iXk8A?ME{Xn-0CEG*CzO&=lm*gKZvGiV>=6_4zM;ac8EH%1pKC!jc#0v?(1Q) ztCkF1@$_CiEnDKaVXQT-DLQ6WO!ChD;Np{lcCsKfBz93}?CQyQd2_Xrc5oraI)8b) z@6-Kf<4G*Y)XfBydJn$`OfIT+Ks7BP1qBV-XzL??JZJ2ee$H;(p1jr421ouD^_j?8 zk*COvoT&gpyZ0Nb?>usamTA^sis~vV|HUb=jr2T3zD*t$9w&YXvN5YRZKRiqK88@{ zbmj*5Z=UCRGCIqAKW=}oVq5+{aR^L9R9fR7Y@lNTmj|pD%lEwGSla#H5XuK8kAmDe zcVrpjq}woV>+h+-3`~4|>U16KCNsnK1jjAb7iv5!MJqYYI|8;=1V z>bZeLs$O?6?;D#If-1JnGTLJy7HJFSy2Oh zh@CE3Kaq=`QOcFj)&Yy*{5>VWrDhGW@8`+${NAT>v~sVK)Wp+Jq2{LX)z(+~ z+r@aM^wClT0#(f6CaIw2q*Rz~vq3Q`(}~`?BK&{1+@I<(Hf0JS{c~D_RUmu7*qB8a-Gz`T1?E<`K~9>4?+# zn&Yr5c;-zK>)B}?`K*#Tu_T!UOl5U{0k)C72E6&oiIb>yQq}sK@(xB!4+s;fc0F!} zBHi2fE0OwsBEb}qB!6CW$v)yBnx6tTkX8)05ZJ_j&T*|x1dfMMPX;B`p~l)=ibR4} zw=Uz&v&ML_q3MKdMcp_p>aO6i};2J zC^fn)_7CZ~)rXLo1Ha>w-n_f3!uUt^Wm*y6=!(@~faWeKzkl+HS>D=TS35xOZ_V7d zVpTH_sygTKpyi8;)*ML$tYr%ZA9A6Cf$9wlTGuo1&QBQ?KEKi4-;5A%v*)3Pzf-UyEdRYIz*xO9 zUfy7{FV}60Rne?(GeVqeK3A)M?3w4?6qh(NxZ(4rMK|xf(%ow!vU)1-u=z{5&0(1b zUD?@0nR$1&a?gcE=`iiQ%5s85$T6*A3!Zs}o%T^oo~9W|eBME9ejm8{QbgseCdQCi+$ekMB6LTUb8 zo;M4B`)6>-i~+IN97dvU{{0T*f2aV&rusC1t+&W!FLI#wJ_0zcm9n0p!9p6LgW2Vf z2Db0@nBB2#t@{rupA*ZhbmVpxhtQ5`2(;+4rM0sj5yX`nlVKuiuDR*m(%(WYFa99G z=%l9|O8sw+d!&9d-V1Q5Q#BvtAh209+Z<%IsW7LIc-B;oW}~2->p$B{b_C zt?jtCz<#hjBv=D)5+$kw{8+v}LSfmRo#CtHqgAQRT1}gi%EVP~p9MJsn#?c08YVB( zC(g>C!a@G|gzabC`RIHYn-;`Q!$PRPFuV)YotC>Q zqWTs?BcX5g%;L!`m??(^&+b9*kjf)E+Z;y^x!uIK-bvIcp5?Xt>WON-_wO~~ z5`n5w9Hv{wx3Nb)o{(#6*28zz6JL*292CUF7oy;;JAj?l{EOmvLL`}x%YT{vwvIU| zkfrAjGMZ-DU^p=L2>IDcz&ry!oqtm_5WAwv{lJdY%(ef*sydEU#O=|}4){*6OdNU? zwq+^k;wkxXZ+TV65Fps*-iF(e30rcMtkGYjA zY!XzqNuV6;5$CWmr5iW5w)^PYkY36XR>PbgS4v{nq-v~y2L{|J4>Z7tOg4Xik1jjkCA1MNFEgpb+1 z0?Sme?+o$Me{1;iJM!st$~SR4T57?{7!c0>+(}lSh3+8YKGC{S99h|d*+Nz8Xt$2 z;c2pW=v?q}HSz^In@t!WtQcYR7WXs>{zgsZd4~p)E3#;@l3;3HC?-dR)U@8WfyDU^0^dHo>?>eEn#<$whq^jbDZ_$)bL zCiNx9pAl5Am=~|w-6316qN6+#V3^~%B=fE%%C{tVwBzcrul5*=%8J`rIV~_cRd4cr@OLomIV` zu14r*nshpzKiyJAJMXdJ$y0d8H|>fvU-RYNqVls@Z#De682shY|3xKx_EihNX6QyG zixo-OVm)5=`K~zKgh`InH8ZQVcrDbV+)kS$QksCF=8v8yUejXF9~wVZKNbLc*NBqi zT!}tHax>h}KsQQkUNXpy;p4vPJk3LDX+x1Bf?{GbSL$(=FFD$~fSLyA-Q2g-JN)IA zcpwevow5<(YZRYFrKv>o)W~@G-#uHI)WQXqWE<+qc(RL`Dr|m3uo|K|l|G&D`c$7sk`eyDs%VS)pA~Hr zqulgOPD;no{q!*?7{PL!szKy&$hb6$GmxKrhdm3|3V_DIN^gK#)^lXpw$`lPpdnSv`AP zkR5-t_*K~&WciI5g95HqE5HU?O!>IR-Bycrzp8L>?I!F);K9+d?7xI&guL1^nk(a( zv(7cvo4?~tCS)k!8?pOnYyO^zU(%^{B}!U5011UT)X?G{Lc*F}z94x%8+AwgFr|aX z+5;NO<-1_Eg-lC&3@d9-lNh}wL;Gp=!l>sh;15ogFNSM_RQz~r$TC1Fhe07+JtZ5!-T?TBe_~9+`s|6Qloh4}!!ihg9i?T@z ztP4gEQIhv^+P-_=*jh8X9`+grt|#-i(IZwarTQ(+~RJIdPP2(mlgvH+c5j4GVEoBQH*GS@TOika;)nLkhT-yAQc0 z^l}i`dB@fcu1bC&@H_9avsQOB1Xb&q_ug-X(~LK75R1!Y)vxuDuNS7lHKt-bZs}F4JpNV!^3{d(_rC~+G3`Hn#odL6i8eqwy$<@< zvu!eC|HON}_%qqc>gM_g=&uvCAIaA(?ETjb{8bhqzU{x3x_G`Wt?XcQhE^dVz1!$d zh4yA({<-17amwx1V&sAFuclv8ssHoRSIp-lqtBPv^C8gZ>z%wG%BgJP1Nx`xBl3T~ z`vrhQK4q{CW%D5~cONMJS3fWRr|JOD*WGj8{{P?O-2QJo{Ix>A`)3aIK;N6^+wf1f zSFPOi`g5pDsHC2s!+CygEi19QY~1$x2%ICGD2(&e;8$j$=Q0tI^olMM1^i=l%lwMH z>rXK{Oq74$aWd-nS5=XgzsT7%Uagm2kri4^PaLNYQ?)&y`i}b4I-Kxx6M@!>CKCnT z#;Z6(>r;XbHG0fXH&a-iMV^zHoeHZbJ6sLPQn?#MuN>vl=KbHUDgCV!G+r9dY{L^2 zU_`AOO{Y_|F|SyVgR%SE5u?9@>@z+aelL|;Cs<;F-XLh3%kA|vzj}gy-)FH7MbH3m zmAm;Q(Z$vne~w;ddJZ-SexlnuBK$8?g$uG1Y(F#98+m$cY6Oc+4lTxdmf5j}Ff2IqYfp@|Er-jeYcTUGz zEef4B_G8id1JxVxFF%w%d+c96ZI~Cm1J5(@&tYjnnPlNHjys!Sr}>aIigpK3@Ojlarl=jqL?98ygcFD=Rw( z+tc?f%xs(-FPQ#M5B9&ioE@F?9Ugzu!PeI4fA!q|?*4xr-2Y3ikT0_0Xs_^}$~mD) zN_M8P;Jhzq|c9wyv-{Lf2MAsL|;FUq1&?)9HG5we|x zy5r-c?N5JUus?qO`Y0E;B|ix%x#=7=S(|CA*6-Y!9ee#*AgMQV{(+LZ`-AC60T!a1 z;;Y%{A7x<+@NsWf?1d?vf(uwGh3>xVg~$pEVbe|1O38+d{SL^u-S+KC)AZQpe;qgQg^IKG3*8(B+bL9RQ!hul_!;No*k;wd??%E+}tTx?T zv%7=4{7j-S{(dc%?BwfuD(VhC!p$1OT>)x_?tVlnww#&A)kf6y;_Wvb35}Ke+W=XX z^c}yOTqDCw+ET3H2t-Gx<+}EMdsc2!1S=N4b53rH-TioIL|Q_Ul+K5l?Bp$7NlEZN zv~tnXMcby?UK;qu4CB+;Ls>wS ztZ{P>J%>i>-;t4Y^F6Sqi} zw6X^?=(pQm2&5%~4L@d-L+-HqM=nK|Z;x)Ala@$^P9A38I6D+6L4=KQxd1}6_5$G< zHnk@A7Z~M}*YmZF7t>^lzB5J{PHgxQVp(WmTPuF9r@*?Cf~C`v_M54x#Ls!UgOubU zuMyttT}mx=a;>TwcCM)|dZx=}%Wa40rcJCHIDN|3n_q#V&3&Yrscn^TpLp1T?%%88AWQ5b_BE##3z&o9P*(B)X z!kyx2zr>pOnu-$mPp`#q;pgnDwQZpqkYiqz_Y%A-#Ru<>>GsNzup^^NfXa6T7bQXM z;!zgBWzxmhzzk9*<6g=1lw;&Fqw_IeNhDMSL!r|@jnFVPrp`UlG^l9#V*8b4GWr%L zC%P0LWxL>BPGj^t2!T>|BPcfcSn9TE!AojVS2Wk~_lq;j;k_Whndp@5W=@)q&uM@Y zy-4Reb17SlWRzvZ>NAYUjB zCh`{GvzcF{X%evIH;^yFw|&jWY5_fI_xmJ@<}AkBzgkmwc$UrQHnQ4;1-r(D-ZA*6 zCfzB;#5bs|5K~UK2_&pw$Igc?*Bg}%E#D&!=S)|Oj<1dB%)SsaihkiKvN?BLhiq^> zRo__V+VW*H)egY~EZ+kD;ufc>bbBSPi~V`##X8jx?c30bZ~O<%B=qdpJQh3$bC>+T zj0c9Yo=MPQYTK+hsQHzI{Sck7NTHHwNf-=GO$PN(0D!_ho6!Tm-L#onAI?)d`CS62 zowTV%4^-IzA1>})?s$}e4_i$vXJ2jp+;}N1$8a7-aTcY3$FFz`ZKc3z{&V1SjqKH1 ziS90dS``>i{l=SH!s?Gq9-80BStU)yj-|V4F_?wvIkPAyf=1QTv^G!Ew|H0AF~#3` zL@#`iO(m|jPKE->3^6V|T}{x(+0n$p_g>sBoB2rSdbn?lvu9zj?T_tIVQR(gX}2UQ$VR#!1IRI{UqMgo@;wq z+(++P!`Nq7lk%Na-7!(34xjcR4+B5_ zL`EJk@=Ksv8~ezCyn`74dhb|7otKuArlm&?(S6Yo#$qEHY#?DX{154x3P&@2}{W0_kckHyP& zTMx5}8D>W*`HRv$byfJ9_O`y`_AJ6}* z#0Ij&K~A{Y1)?Zw1kkxftv0Q1R71#Kx@BvV#JQ9J9^7y%CnEgjF8q$jZ#Bi5Ala7L zvSW=8%_Z->2_G`<&zr!T#wYPke6)M=wk%W0CtlQY51F^|P_yVbfrNvZg1e?07dB84 zv)kP%mF=gng!lblUDvldXbNNY>_}2{WB&k&bdf0g*5Z@FTZmDiUY7?dHls9RW7jxG zEtKSPUHa~mny7y!8gJ)49nxEpsJ;gESp8ra&AK44zbPejIaUQ>?bwf{k`MH>ndf~@Xd(}y+1Y_+ZICg>)gDAgv>Q6e4 zv@3w%Op>%Ct^Ik>v|w;QgM6YrK}Wgk;|GzR+>JB{%r`*~&p3uhNOrof^x6;Wx?FUi z3|Y&-arV)pnEFriY~{`fCtjfNc%&vZ zkG-DdUH1P#93{W*(O0BP&gfV~MeMYkVoC$8li?>J9^UaNe;9Js{?%kWqS-)55B}wN z|0Y5=jrps6u8jUyxC-)Iq<0^EE8EZz92_kYD0gz&YRWYQfXqF=UcpiFei!Cv-tD<8 z#&AD#p9R_tNOznNOs?3*NU1Dma1jIw+)i4VZrPSW0;6Sd%y+7#NotL%R;;CV@4pq^ zkYAO;ImLhR9yM``I=>tHpycy?I!Hac2{2yllhV_80M}FL2!VNUd*Bh~6`J;Br1cqi z5?n+npGU5VQwnsu>(DEIkD0OI7m*D4^m5bvEY@eWxY1+-Pg_`EGZqG~F}^+4P#%gi zALuEF5a)t^0ZymO#9!~kC7Nb<)NVgypdrZ}0A|Y1tF2ErPIs>5RG`yVIvHFKBhxEY zg&sNTIuPNr>a^g2up0f;QkCMp%Im5hxX^p1RYbLY$7hLjA?Ga$q~mf$ka?tdes8M z?1HJkCCp>DzkVy?r?vnDrLodcoPc~9jHX(U)OP?SkXHVdS^>NC7%3euz}RDNtY7he z>u7;SM|nbU>jdWOpfB#`)7LG8(#V9ibmZJ`{p4){d&q7m^Og^beCO-D`sO|vmCbW^bv_vf+yy?P=;|jh zHK>FnJW)ul4~txC4KupCZj%GkT@Vos(Cp}$4fK%*Xvm?q5E=M=KmOkErH42GH~1aG zEF+|=GzDEpRp!qxR!vVMhVpT=(=bHCfs%Wzp<^ihv(j{JI>$==a%PGY{tC$q(!I{ktW zFPkCjLKWiwXnsZj30${Y^@o2ciFe{H{A4A%4U{wC&LV2Ur7pC#@t?Tm8g1q;>#LcP zb*5}bxo_4N?9-DDxS~`>5dXFU5w36b)N3#7y!Mw~1pmH=R+v%sCXW!s>?{vTjLM&4 zTpKz_9|eG#S@cukkM>lS8Co7#fROQ{#S)h+#6i=sg1b8MmRzSlizCZkvXPJK!rP;~ ze{22v?GU4nEr$f?=Ce!7Xgs5fAz8b?im98x^C)^(fB2v;w}H2sf8kR2~_T0*T%Xlvibf_ikG#+dQD`p2$onNJ=YE6M*fSG+e-1C|DOTq~&AFdlj;e+uzc9`)kb1&saQ)*t+}+ z&y%({7TEjEcZ`$^f6-u6Q}25^55{X`^s4WpG`tDJ^qgN#jOs9mnlVD?xohR*f}qrz zC+jMeKn$to@2r6rJ4mGpkQCa={!5hcoXN2oS(HY>I_Q=7W1|xvPoMXuMcfle4si>K z4R$#Zx!dQzl^p(z{gJV(R+Ld96fDo*e@+Off#Hl{z;P#E^jGV)23s;8pac6&mSZqsDbKrLXBp?)X{V zBKVRq)3=@w$o;28$9wy=6sY2zDfj#L+ z@ANz2vi~i^I@0QwonWxBh(lSDa zyFwx0c|la?eq(GZ+Lhop7Meis=1y+E860H>-xI%8Iu~*K1$evceO_L(zY%7ut2p<= z%VYi-dm%Q;$V2WwyN0h{fluR4`n(yzv@!x@B`sd*ji3R3IgLG_3;0V2f1~Ht+oO0p z06!T3sIi%)iwNZErLGY&be8sjMgD6XQtTLVlWDxUULY^wr)qgPV|RA}1yG(4AuJ{| z;cadcj9v1f?)#ioIwvmu;-10%A;qmqjFi*;LUsvk-BeT_nNRpHedJX}lM+|Y?9NYi1b#VlUb5=e>`6-Pap(PIgW2y1EEFwR$A}*XJ?{AN zc`i`=)i>nJx-Be>xeBf=8YQ3hEB>n|R@iAOiN?v?Du@>?&iMGocW-~#r`Gz`-K!+o z7j;d`(wf=UT>nAlf4Y#=N8&%I6L}XY@^0`|8M&HV zif1GHj8qU$n`e+q9cTlaKMg}zVnz6AZv2hP@(`l8WK;cj{V)a^IFGce0^BNKI%8=M zwa}Bguw%&3byRL^O&JCpk>tqM*Mu%ldf@)O*BB(yQvP4R37r}(S;oUR>R{-r2(Do( zvP}3BeFY8DuY{KJF`N6^i4b4ASz-h*ZAS3fI{`aSj232P__N?mdW2P$SZ3*)9C-kV|+c1)0Fb zhTFQ?s2vGUu+XjDlD5*Z(fj4AL2p!KGX8JR%WRK|{A3N!n;o2*vvBL0?1Fgg?!^0` z}e&meRLz==j)4k9pKa~kgthpmve4Iq|!M-sbaE#2iCP1Wp zA>boxgbSL%9t5;!w^ZT}Ez-fOpj9civR*N@b_I8=cf)bMZrxZz53LZR``F=K{L7~? z8F1{{?)ac(GPNp0o#cc65f{B0L=xhAU9WF`3OFD!cke?HC!t zl7am^yT!bz`joL7Gaum^=a%T{L(X-`rA5z(nMW0J#fhepiw+iGKE$#nyAiOqgLl;FLBk%ny>RRab>Z#12*y$1#WBlm{ZKo>v( zkb@p-MTB`WJrgm&lHHb0k~Z~_aSpk|sj56bQ_Y4RCDFG`UCj2MWf)qe*YBBCG7#jN zJ=y955+j@NlT|mg=cbN`DvG2D-{Q4UIE;1E&eX7>G6?+Y>A0wNX6C8nyLRhAxvh%> z0ORLwc^qc@4$s_N0bghO(lbqbIpH86uS#4$YWreNL5-{3*$sM(?ldBQnlG!a_NZ3XS0$`r6D}WaDFc->4Y0i5i%PL_?=m*Dk%81Qj~(2 zqlBUOdqqzT4b9;hhWvGnl@AYT&S&A(*&EpshnwQ0R1M@WxcerH zly7|1N|j3eLp;hX;Z;$vCe1J#oZIR+p=ETi6jrncUrsHNxegztfyRJyRSLF$aSs#g z14r8n+^Y^)vKQ-ZS6}9CYBHPNNt=F3fL})>W(dy0$PlVTd5Il~?#n0gZTw1YYfJZ~ zbVH{B?JlC#qjJO;MSeAsDe>SM<8tt*$sxL-m(5Dk8WBYu%%pw`wf4sx7dZtZGsr(d z^7F|JofnwaX#25eyf+}# z$(QC=72fgH7RFVaHE*80a z)ec7(Z9|LZ5#GS4< zWKxHPmni41j6<>rt4ZW>gZUydmVMsB!@_(4YAVV{gFjuZJ5rI-L^T<0^R~MQX&6+c z9A8gxY5r+fNMD0>TjxX$AUx4Xguy2$;@Qzr&G+hr9i>}q+Km>_ey1sQGVTSW(bJjN4 z$qaG|lejo{4EFVTui#Qeu)+x=09hUpz4^3RUVRqJ;CAK$)#G?1nNo0LkZEQYSA%fP z113u!J8$xc3T#eOczGkv!h4q}YkdjOQ5MsKc1GFP^=o@Z z79Vhmmbr^dWbf@qmg2aU2LSa{qukYNMYPdA1*@KU#W;|U=G8|6b{q5(h;TN1X;a%I z>4=fYznxnct<$EpN~7|8UzBjjta8rA?ISWN+2<0v41~of11fvE+d_Z102iUwx!xQP zquh4(11=kjcLBvMnQ!|5lR&E-Z2-rhMsWF7!%;^yT8+tpxY(-)7A6kGC@s#a&!n=} zW%v!wi*5ueV}?tWTYJDhr450GB}@S zjIeqRXj0nkb5#x;#5S@Z$V<}@F^!6qV9-PX5g==CigK{oR(=leZ0t;S>CLU2Wy-N! za_#r6t(8((_uIe|M6hWKAb+?z!nH*c16_)@+2Gpxj!r~C!nVfJWC6@z=^t=j<&5M# zQ>EErqZxg73$_8&;p`)F`VgeKc=6)UEa3M$3^)$B9+)mf-HhJKRb<}gRsjl*i+^kT zhz`i{w%8C_8x?t@FRM$Fb9mKTbKJrC%p0?Hjd!XO3oubvEiB#aSw$_RCq%f+Mgf=A z7iu)&XmLe3NU##`+#4U^HKeWblkWTf3%NTepePpwU|}f#P2%8T=6-lKoJA}!bKY~p z!mBGDbr>_Zadr&!?P5Lz^)zbCoxB0vENoXH-FWa}*!KT)heuDGk$sdep{t%Vdc}wz z8HtUiY}L`u;?O7W+vJI*EL?Uc`_GDC<=*yt2+W7wCMM|u3ubi3?i;3{D)T$(x?Y4$ zZ)|^z{jMo6yT%A^*qT>x;4x-9Dh2U%nuq;XcUS14YKbl82l`?NYZ$;@Fe?k?MZR)~ z!q#}*u#$lGfk)>y=Yw;N>wWZu=LD^s-eqnkqwocPuD%;vRK%08o~fku(BLQT5t`Ni z6;5r%B&}YNS)y3E&`fu@PEgF*4yGQ8eR!)JgYgrQ=W0Nf z)~O<0Td8xMRkR@nLpYESTM?8XlU~xoPVidgCk*ZNvCUZ;r|13jEk6uyBIsSvQi1)= zEq!z!R%$~}F+puwwMzguK*+zFMa0dpw-{O)_Pa*cR64`&Wd<bRTa?6J$MIc`Y2fU|>Pi4AbeWBvoNfW2H z6pV-zB6I&fo9>`21JSjifOo!fX|>xrPln;WidVQwAgc6OW0`|Wv02moemAWof=a~Y zd4z3{l)B^upMc&zOvQ?x#NC|!cF_Dw>x0i!IazOnC0hOyJy0N$qbHGts>0l4vx=VY zVxlQ#VB1S|C7QfI*Ge*^e`9Y>t`OCOZZ00#-5@ZbQCzT9Nb1BNn0V`oN6U2h>z%GE z6xWe=_Wo=tXvK|LPe)J?*^0QyJKO4{Hgo!TbT!)@eph#M4#m#K4$^{s)YX_joktQM zww*o&btz7FS-_3Jdc^*k@irbQlDgv*=xM-y1LW?PcQ)?`XayMOGc&2`(~I|*k&E9g ze82sjv`<2y8b1^;aQ1d+_nqo@{eZ#W5`srt#^Ydg*`EFso#umY=D+r6&9AS|U{d#X z0^hlSKL>o6{-&Om5>ZjS5x;4zgDsZ)yP1r}^{ zINc2y5iD$2czCASyQ}LMUwt!N^*yR><;5XL?;$E#SngGeE6;&6bbs)^`6&38B~ zd1SKe0qJA+T72SieZ%DZzTVI_4*i0PFGBek37Kn~PcO zE04{YwG3oo`m2{dDRSQheg9>&6@i5(Ci};#^%qA!-C%idhb{Bm?w&H+P}Yj@Y9CCv zDc{D1H%a$_Pq^v5K+l3{oWd$zei*r8dcJEm5dp8gR$8^6TQG92+# zL&USuRddwpdo`B#)DVoj=(HWGAt$VuekwnD|DY6kGSBLFM$~kU`$W ziGi5l%Sr0*R_9QXcR0WW7)Ij8RGQ!!Xj88>cKqoo@E0t30~$G&Qe(PM;W7RS9a0TD3*{1swy>4$UaVa`P%qn@j)-zNSLQu?!YDt|_a z5^tJXDK)=pJlD`*E3%Cl*?iVdNRTWC`mtYC_0@B>nF$=|ySwva@g_FywRJ%#==$~( zfb%k`ItFbT+HLjI=p8umX&W#LZOxqIY>YaU%;-uq1#+zzns!8(4pn_@5p?SapP`qJ z>l?XRRUarM8QhHjlZA}36>qtX>-O^?P}QQylYdoPKDyecWzx0RZ%0#e`6t7rqpFp> zv3f^`%IGM^$vZdqaz0OF6vA}#ZcDsNwb!2k9j|n9Pv5)lHyQD#hgoX4@akL%?eE}3 z5c545C?b;38WC;HMU0?;WTKA22huXvHn&41wytYH^67~Me&hAmFA%NbdjL6FOTSMS zPmpzK1?2@%Z5}E}v<+N+j~HDh9%vdXuuweYa&o)>1#rTdzobOORlVo2W$+LD(RR6T znfEp%Iy7D64Rs`8iy-)z7P^vLn{I2U4iGU}xI}&3cP0H~9ZYD$aciJw_>s|mqF*tm ztWmTg;3$F^iQ!`DgNOcA5itsmMRdY=CzYdX>H7=&8ZAwS9EE(*i7Ss0k<^6h1UP?; z;=NyW6Oo9%pcv=ww?+)b&x~i_ivZxt z{Ptu5uH&Av{7-P|IPTG~Z?{LAUpit(Z>K$XMLkVHH$p_nhH2%p>1M5Cx~ss1 zL%+G>?S`k^;_$Z}(>tY~*U~MVp%}vRdaEyWrlf09IwFAroH@Gr>^M}n51)qfYcDpm zCwzu#_l}%o!x9BTM88-iZTS$3%Lo*L=% zb9<}JXikN?(^n#ToQWWvE~FlU`RD+y@>+XMix?CI`)%qGC5txdBuG zV(mF&mwA){JzqRdTf4EN%N`aE-3lQjL&S~lXcs;()mYm@j$;KKB!Cyz%kTiR7dD8;-=0Z~-UA#T&| zPIcSGi5+0+F6EkN-~6P^v1>MPkZ~&WZvN&OR>;&?W2%uUj@;ep%!_$EwC$-SP7Jte zmn0O%vaLXhR3?HE1_Uo1`wrf=n~5*X%l$mw5jo4xP1xppqbN*u9A_WPxsbj#)BYOE z9iia_Z=uOUwrh~PZa#qW5^f?_b^vqk$3+3|qBy`DBtR{GtYv}JD8(D&u&yMsPTk;e zwdl@&9-JcUk0soDilOBl@W}N%^i#F8%Nd9Gcx9^;xPXF%StI8M8C8v;+ns0ip{0+1 z?7VoVhZ=d!AzCBh^)l%iMd{oEW3%a8z?^0e3!Z4oav^SXHv9;c@$NwcGXF#LgtR*f zy!kHM(r-JoCR0-5o=T&M|M)XtTN_;Ng2R)waozl09N+SIcgmDe#3waM0F!tMCi{0kt$#(k8t1K4hQ2dhRZ=giaQ5%Y0Ir zhM5!4T}F9l^T3@8-Pu}DU+Cs7Hy-E>G8=cXQ@rj1ep!83D>q6~ac*6TW)C2l zbpfYg2qTcZ`U^PBeNFo?II$)s$ZKry^f6KL?Ztm}!NS#?{6@->UNh<>$|1%-WAXkR zuy_+!xDWKQq7y9oBXaMTuIan;6<${4hO=5i^kuzA6%%Xp{Y`y>nGDYyc)i6XOU#QK;dJT zR6pXf+Av%l^``d@!n&-sRRk>rHB)bddq@9bq@S=lj19tBys-))IHvM2*D`_ied}or zNx4DCKnkcu9Q_VSwETmMc?~3BHr7@l9uyA0J^W##s=--k*mmhr70JzP(769m-u=iR$TuPHwv7aTAY>ZJwr(Q2M8#+h#$H}0&TN0 zK3$UJzK8fwKWv@Y_79WDsC5GReIUbRw>3WOR6UVIieT2cMkn!R&~BE)(R|g%E)rLp z{*yQ61{G&R?thj*RCU*V0E%Ov+5G!5qdjSse7ATqmSdjVZ=ECPr0SeuYoc4$syiVR|uD>unpH!4HzX5GE z`^^8icv!Gq=R04g_gRd7a9K&Yp8~Z|v`GDof`VffIYFxDwlZ}qtSHm(lbOhR9%fqN z@=BnLw^1!a2NJ?acyzU)l#enm>(wJ#wkDe z$ zCp5LhS*+>-iOgE$d5zbqjY!t;VToSo%6I&NidAx|%~m&A>hMa|j6@j&z%9v;c=0hP z(dI$ScQPu~RT=&#!{I+c3+#!okJuplx=?~h@#PaR&__%|k&b|K>k>c(5!B6sqYCTj z^6TuG4$#_Mbf6rANnuyTzrvH|s=*94T63Pi@2lHF4GwTE46$K8N8gK>m!G?U(QA)_ z)EA*5-d2qZK98@+@j_z6bsp-jYDgEaiwM%4y(=eLo@`#^kaT5$u!N@3t42|57sZp{ z@VwFI7;R!{?h26X8a9|oTD(H9H0(r_z*Q8@PkEqz{zpxXc27Fg8(12&N~|9Ld9J7z9~gZWT8_&~3mcc96+7+Sw>yZx zS_HmSoH1P2Rzhuaea=6Q`-t||3(Ozs62wgdM8SX}p#S&kzSK;0aJ$tLrQQ=0Hn3`v zzNOq43MQ&jT^}m;J?C5>lCY~C%+o)$vabo#yQuobkGMV*`8~enNS8Kr-~~G7aM#6{ z&fv%-#pc2U>h6q;oaiDdssRB9G#+GW zX6CCxqxKR-Mym{i9b2zPC(f7s5!-Uq z5j1G2F5EsHnj|}R1f@m+e);&h0g^1vc$bdxLn^1$bC*%H8U*$Wd)f&fTrg57f7r=k z^0|>Qp$!p@&NpgBiRwU)zBZmUd9%!inQuWUYnqo%zZh?!pZP;&G~Fl)9<0DCq1OgF z$|7os<_Ydj4L;+g)-|wb%WLIZH4`oFm-!FKWQqRp%Vg2>J!fE_tr)K0Cnqi*6H*{k z`NZj>d0ee2${ELS61L0nz8_Qe6=IG0Z4F9JP`jnsMRl0|tgk0AaLJDE`~tV%EVl8! z>{n1a!uCo>?6l8xmhr}SS3E{l;-%wszAw$GCWy?_dxt7l|Jy9{&KXe32bpV_D)u)5J3+x}2Ka(uDD>xlz5fbK2V4?3#XUooB3>Q}IO? zJDdB($b-fjvPEg%B`c^LayQSKsBCuJ$}U*FKdZ<|_oo(JI25N7h(59h}2m8C6`OZ4`vGY@-8+OH)}0%EwcW&aP4NYM+v4g zlUk7lsS4oKqy=vz&(HKnZkvGL*OHYp(mJ;pZY{4@OXq#$7ecNd3H$Q-AdzsdUIw|l z%Xy@g_9egF#QAD=XxvCqkBw@vO}>Ak*XW@p+x>dnVq!|{1{UR?ml&cq&Wr5naNAeE z+^e*{h}_Xv@tW{DdEvNkHJp9isl+EUa$0@+k9CJSY1!MA;hLDyb7Y2iNbzOz#NyZn zXA^kgT4EW?B$qfzo6|?Jg*RSh>jDv!Lw39i+w%iN-vI8z^{$Zj-ofZdX}49J#JUi>y4Don4C~sS42N-9sFE;=SYQFfnKt-i3DTy}*m3_(2pZFCf{s zKx`>0?&LFj@W4#7AqV3BKo#jNUc9u(JVAL9Z$(qDYlzL7Y9Dl~q*J-_A`!!@M-8!&ivh7yDn>o8$_%+v%pFtQVQ0!uF?=&NBdS zPZ8qa`OjqBU`=;4!g!VRW=&XZmwk~wL-_;o9LKZw&(?P3FNR;GNTrTX+=05;z;2IGWyRPPN@VZbc+_<=44T_CKl zn@LF;GyHssw161})#fTpQS0k_Ezixa6JRyHYd3mt8(#pYH;qQHi7D&q2Frwg4d9@# zW-MI**^%F)31LE9B=_Cbd2ZYr;Xt@ojlgy4=sVGhqp!YNO*ROQVP_oDoP95tvUY~j zSS@4mup|}ocpy`fWE~e{_@aOyoEf$uDU;j|CBQVx)HSGr5r-*;>hNtV;?{)}k5~HQ z#l$1Xq}stUH(2Nx5h=;A~`i}$$7+dl2ekIdS~589Y2)h=Prjls*C5nfxW zhS0cTpn7NR&_a^-zoE_Dei6z!DYMfuUx>PppS-(o#D)^`WFL)=l*@w72BkEXHMkfC zB8mCujWV1niRU`c?h>b_>i6fS*ReR{0YHM% z{6oaoK`JAwUE|lHGg`-wuDIAdE{1$i><91Em>3=wbIKN?t-B8)uXT)URE?nCSQvU> zMTi{zeiS~G!h58HJjSD)V~}Ca)Jp~sPPEGfg z{|=cn{77d7=uxv1c@*P;e#dfST71-wG%4Flm{Z+e#jED=U8=a7=Z9*Fb^2|!AE}hD zv~Tr9I0S0R9mxV_wp{ow5?<>7EnWBooKMhNFo_jKC+0YuPxC#nCUUecG%M7u#i?71a#)wsGT&vM%0+Undt3bt*MIT)3O2{)E`~RkgxpM zn!i>ru$WJBg!ZSPucpQ5;pawWT^vu&l$b8xM(jEPaDTVnN@)2YfSL?S+Qw({#``W* z{-mR+@6=fFhI+kLU!EE%mxM@DWaH|6{sVw#i+$3KjESvek;wdlfvE%?N|L5Ln+8*f zD!W~Ky{5MN*(C9$ZW@LZ>EC0iYrcQT)!)W{WtA<*TP?_|7Xa>JX8ldg#?Q*aO4L6s zi5RvT0^#;e5*e2{M%JfV&j+U*DP73Um!{Cb}7dj zYMxpRfxv5Ue&yO?>@INyPoL-u{X1HFh9PI1eL#vQ_J=WM4&p1+-$Q&Y zFarlW<+sKf%eNAH4LQ|GPVO_*g^wG!Y!E1*y@R?*7+8X-$+^7Iu}M zo)L1!mgf6VLY9DVpA!vwE~d&jbsJ1t>Q{!|H3_q}izEr9uty)K7`v5br+As)vG`T# zr7)vzCL!1`9i5DlvK{cT7Yf!D#}X&x-@+a0@eY;+>}z#?uBJ76_cnfr;)@M+wBoO2 z468Pvus58+Kq#2pTQk47H03UCm~r5ISp2j0H`tO^=lQ*hZ4H&>fDzj^mr4V3(Aye| zw{A;J*f6G~!%A;oZd6#+qx*jngUFFB&Qcdyk}ngwiosiuH;&M~8Ku#og0)ZNAU(<& zGt;iP&M}+!9CA2`S@`Y_N~@e3C@)o)lfGKubozPOzZh8vv9dk>kYg^(z-M@^^{P6{ zuH}6lBxG(Ehm~CMuDm!`2k}5s6F2da_$MoXcD~t&hv?FoTlGMi4=c8_IDy< zTvKUM1#CsBoq;HohAnwoZ|A(ES3rO$5aPE-OuF9ATtN!yJab#|_HV81E=mijv2L_A zEfvTTNxYA;T;^Ebnly*lN^LCmIN=(t+dxhtC4xwpF)*uy4pKl!{*`xGO&dt!Eh#fc zSoqr}InDyPYid0#2kNiE0sJ+&Wy2=4m+oLBGVNSe(CU&}bY5Pp8v%f5#=!=4>~f^! z$p6Io;3cPxl+4uU=ta{s_0hJiY`TIkVOnoXorz#%7&gNa8(n@L#s|GljIhb{> zPv$hI;}J}8*oas?2EtM12Zai zzvBB{1hz7{>^WlTewP|9EA2LX^LZQn%K*OiK29gIwa4QA34;5{RRbR`%H< zFE(%T9kS!*pSc>d8_}ZeJbqAEBAdujElX57^_ zrDP=8#es>Ni2;&x>d8~SIU9+J$=Zs{7lUa(_AGcWSqVut5bKY+zXnO^YT%f8++WDI zBtRg-2l5lm7Cc1r4E(8EZT5HL@9i37LLACkyA~xYCSV>}-x??=aL8Osm5>KKHA3`j z3S^QyqA7p9bze^yYKmeNmFWO*7JiBT0hF%kTCgW%RU}X86Z{K{#$_0h&j}ITOu)l8 z|Mka!D-5ya4@2NeObRBcO=hQdk>!pYwtCwx%a14ih_aFeEmw3vq7yMMND(xMYS{e{ zm?O!~2QuGl`b3~~osvBke?;Mb`R%wQGjFhHCh1cbE6;ety^YyxdDGd1sI-vL_x&a` z>}@h1o^5Xa%mm&ed022q+O}F<->{c=x_3gkbN4$HUeM=dzOhfYr9`EJQa>kvRrwE3(5NXZ5>&lB} z5%^aO+tx&Ct^q8!mKsRErFPoCtuYYYtlV}V{?t*~Nk68!=V0?oj#|$=$J=d4WKTVjYdep_? zmgHvFRE`QfY6rhMg0chBW{wzmet-mRWfmpE*v0c>KQ95uD}yC<>b8b---?zwU*L+I z;i%71=*U+{@b+JZ*^Y^LF$QjY#>0`fGfB>uu#`2#QIW{Lz;PXgF=JUyc&&uBhaacN zVDg7@U7OV$!ZLOO)LuG=Tn76AXJ8yCWb`i%qM&yDk^2hW_xFTSlO;xVYFateP4Sd0 zfR#~aj6YdEz^oOKMz(18EgbHaXlyInwfj(wUq#dR2VE`27`9*-h~hO*fb)K1?0&pp za>X)0bY6av=1zUO|Jz4(j(1^&2?65eDp{ARX;!m|;cgA1VsrNsIC9Kkc5L(l3hl2L zU#!O)&wsDtlCoLGyNXhYzKpE$UeBor>{7dPX8!R-vtI-7BnzB}x(5;V;POchd`gS~ zhbcyWo{gKg!*mG3NansGPQla z6w*X7!yzA!k>&t68Pv;r_ufEGAcKRkN;cH~mb#!x1aT~Za=G%Cc<#rT7MgF4Jf$S6 z%-9-|XA8XeLEtH#2nyk>ypX$4^KWt5tVQR?949DJ1wKDpLdjiK4A`tEiu^?nz9uHG z)N>wgF?~^F(=;O?Gy3?e^?+&_7teFtD#nW`xA1tjzW0ra3#tDh0l~m{RS(`EATvFh z=o-}}1%)QxZbaQoKU($+jSseeEuxJAe0+;UpXmb64FJRZYw>A>Gk4zjw_dYf&hrXo z&YMp4tH>d2>63TK_oh+F-ZD%DkSgrcd0E0qJ~rz_asI{nQmR?6fv}nUtDh?K;z)R} z{!x3!7pRk7C*TLc%j53~@>;(#F$*=p+IEvlytjV$DG=qnbpuCOk?W##f>>k%F-ugb zFn=M$1gRf6SRwcR6TXN_W9s_e4`rVkAK@P1n^gH|cdEBF=`V9?G=vLsbH+=a8BH6e z8!L96H3L=4h(c{S+cXIM_=7*jxc9ZpD%wl2m*E9SmRtHeVA+BzPV)Spdid`Hn;v;G z-|ll_lgclv*sUG|=-+_d$yIXN zC%u(cY4Q{+@1gaM?mJG;<%zM|yk-66o%WQH{H60nBqj>aT$xsxH zljmk+xl)J6Bd1*Q0Pv`0S~LHGwUy6D&QP4f@L!vX;v`2Zu%jFgdZ{>`FXLBn=m5F5 z5c5{H7-k+yUb_$0vv>3zTsNWi0Pj;BSxqq$nc7a7{+M1Z%;g zTd5$Hu%lhfag{vqFD%cxtt3vL5&18fM-OOH(gieIp487PG$u+ubsA0x6=|ZC6(d>< zzCue(@RjI9EX?|A1KivC>0ygzu4b&G4^PISUVR@pV$?^?O8Jiv)lmR_{$c2!Y3J`& z?YPb(OLE8^WmTaulpHUq`afzgjNje{L|$2Kf0**Y?XZvjJy}tJV<8o3T$NRy57`e; z9%c&?T}u*|xj64Y9M7qelZ9_5I!L}&i3nKNqD`^^pkDR6m9Q6@)sw3z9w_M;7sVXC z6Xx}}G>ZusXQw;T8vaA}dI6fA%y3kaX>!p<(k}?SE;;1>1Uybh6BoE~TuJ9ZT`=FG zSj+)kbf-tqD)?xofp@k~9_H+378}n@JHoEhWrEmjxSrx2zM`cd+MZ3p*YO?j@7NgX zbeqhaa!nPFIn;&S(Kq06O>ZRjd~$izSF{Ru?7d};9Nb5+{+RIlVziVl5oyC2~yz?{6kvEm22aD^!LtsnNpnX{L84C%%=54=BRTQEbmL2Z<kM9xf{Wab@jOOvjCYM@*9`bC`1xv_dwnS0yP6~|Xt1pDFQfJNJ!%L`2| znlnufLeSMGQBLH+`Vo!RsdPx5Izz+{aYPs81fw7nX%oJr+*x;#?u ziqy`d&0jsMnwh{1@=!yT>g*M}e+AF5R_zfsG?wBeyulBv2^gr5)quolyO5B#kX;}J zxn1=W4(x9fx-4Qv`Gz@csLpE*6=b?sqaMSv8GIZfk5*#S#@&NFFnACtYW-Y3HIYCnC?sMiR&qCRbH0dZHriYK~ha`L_lxV85CqV}cYjH{dIi)Q_t zjsof;$c=PaIz>EK04ZJ87xWdvM4!yqNfcS*^=lj0O0G-mK^k6qq)XwJKF8$Q2pMa8 z_})`x2JU<$P`1y9WjeI|ul0gn8o-=DCeQ(0$-`*%sAu#ek-oOQabrdAn;dqTaFye6 zEKfTXC=v%)aOgKFovJ1Ndii@`>LkNLn~hgJnVyuV>dVgtZ6`t1@3A||zhvgpGYw5> zN_r>ftrQ3?&?tmBW1TzXV0h*t<<{-{d{>dFd%<@Qs6_RUWm5ZIz2w-nMSY&lBr@#F zb(#|c`lRBI?*_@_P?mpXG^Wd6__U$>-iK=Wh)!U`q@_023pLim4K*6_Ea@l^2E(V& zUeXW4pti%p=EkIrt8|g?!;_vD=FWJOSP{1N)HQKv+?u)a_hpRyF1*WnARRqCJND#5 zZ{+k62Iy7J`#dsbSkzmZB-KVy$+*libF68psXX&Ens+nCk{1nhD9Lk*AGB=_R-1_K z&Ev`1?n-HbHAb=LxaX}A_n6-`x_DaTgf*~i7Fejjd(VhKJH|DX?i{ zo)UbXwupa0-bTb^D46Cfox30v3WphlF8kc+op&?lt^l4e{eu_iaaTy1jt4<~A8U_C z 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�X_4GEjx8+!JbR3@cWl>+^_~1zV>vpsW7#3d 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%0AI0wd=W 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 z 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

Mkx(%v*%P72tbg)nX<9oA8Xxm~$tOzDY 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�s1M-`L%SXFSz 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 z z8^yEot&MEHd7#&rXu4#+hUdG2$)?GQj0V|LeH zFqQ6+8!4e4-mkINtFWiFCdi|_FsFu)K>MK?9{OWG(hbRDPQb*inr&%}mS#|1^Qyy} z$nw8+d@1gXL2!qdgej{CCb*Q>^+2AU*;yF%Tt|}BXUpcaQ8Fn;9}TN0B%{hD9sa%z z9@I-J+|HigX-?tT%aJ>Sv6sRS-eQ+?6fEi_3itzGdp2N0aM%*Sk5uv7e=c!71kCz4 zU@8wFxhKLt4#WznTe?QXg51=8phTkPDB%mCzPqD@V>~)5s~bLLAV?qi{6%w4LT^=1 zbhBdPgecU$< zIOGrfUaNhQ^EZ`@TYl6 zWPV=np2cTIfC&zwC25p=Tx%x!Cs7xoa+06vWg~Lo`G`Mu6B^mfRVN@5ASQc@V^p!d|Buzt52(Pei4Z+DbKdKly$z}TKL|4 zzJ%G<7ldI1+vRtHOA-rh55aqGwpVs0KYAT|P-#a3a6NX!WuHSQ)5fk=YJI|ia z>EDF_i0+Ek5>T;x8IR9dU;zuY+whuLyCUKmsuFX-&|n-sI+$7e86*MEyqA)@pyX4p5ky>m*{ zlpkahnUidDZ?rwWs>#x*pD7`k-)n09!fApj2 z^-!O0n|$G<|ESGJ@6ZbU7N6Xdo&!%R;APBk2k@FSX?-wTXy`W?B4jZdZ)XDVqdnjM zg{twyy{>J10*sffs>EId_==9vE)c=wkpPtjxRqcP%U10QVZahBa= zipi$=@WJRzdh9Nhe~nSb1%mbQcoG1;^{L@aVo4~;DjnY{5euw;mOJ&qbjw-WtbCnZ zHw_wcEje0tNrvL9j*YQ!YmGS!efxI)ISDmn`|tTWH{K9u(;pgQ8l%R~*5MhPQT-ys zt6yKvzV3g0?Vexh)@A~GD!EzE_dFSU))=;+b#~63b{3ULVPmfp^Xz)wWb5_+ zFz(WrnqT{R{t!zR(bg%%NU46DrBb;*{WrPp<@RDB5c!yH!}zt9Qv5pq_2%_u|Me+< zvgZZ4`R?g4|9K_wb))z7@ipLlf0AbIgKw$RTsG;`Lf~uQYd>azMsnnqLZyy)hjsU1 z3+Z>0iN4ocwHXC_AZR<}W$5*x_x0b|tEkHk0uTx>r~0%XSe1-{zSorKVZRn?Waml2 zv$Ng%v`zVX_4@MsdKakaM0Xed&I`BMp4G7Pa^q#;_4zUIIbSql@=V+>(em%)<{Gy6 z*}O9f^fEIQ7c3j&c98 zavJi9XD!oopdi5G2ehMbdoD0;ed~21vK@~ZW0}!jQ?6nbEA@mRy<7#S>+>jEl-W+?a+enxF1*yXNdtAB4c4Vvi~C{Z_b%j_j}gUAkWc>pjAMy-L>mYN><& zZBct7hCKCUO@KXy)IR_GR(ZPy}P;EpIt(=T4KLXkSo0%PdA zIcQ)1Z{upU+xk-Uv}M-;!8OtdOXJ9`%I?$F^wQm|Rn2!va-`5@Y+RHA zCZCLH+jokm0_rKV=0OY%{()7v%QxI^rIJT^Vtsr;*50Y8xw-HbLr`4+`IY0gzB31M zJ3$SgxokB6@i#0g-t1_QyyBaN*gc8oyNm62A(A3?b*xyo`0+FWQ5BT=n<|?bY_z{2 zsb6o*p|Z3b4_xX88Gzl!mI)uOH9!}k2yE^*;^kqt(3dzM|x*~Lh6 z2YWZCu(p!PMNfWHh-c@TOL0rNSOHyQXYK*1y?#(uaryOiI0!2dYsc(qIpx^ z|7Py(XwXp7iByyM$UH}1?R8k4{(4TRt$M@oS1ZP2drCaud`?_7|FUj|!6fp-1pBl3 zgT0mw@8Kdf$U1CqHh}f;@8;CYK{ES~r@EPd`@w3xSB~c!@o@yPm*}Ru2x674Ys6!k zHO<#Nxjes{1n!5po@8yjxDdOw#rogOfj&p6;uGpPll=1s+;-DD8>;@h*fWAex5B%o znLRgKy~;mlJDOBx`7wrV8O!zzQxXsA`Uq^MM_t2iy!+Z}jrME@S-IbC@N&RONz z%jDD331!*SY25ojanH-M4g63U-~zuGRFJJ_4g`I@;9ASawk715c0rTk|wu!ia>j2+xC!n;6sbJDy6`ls;Bjzj~%D2!@c)-HZA5WwJ#*AJLOBoQj_lkg>O1c zUo_U*pg#z{_h~{=V=SY;K`R7|jz|l{QAWQ%MtVR_VM`mSI_@NsDjq>di9{`js*j0F&2|dXG`#Fy(3ni~hN*KmRNS z4@UPRL?UMo(&e+c+rn+2-h)w#Iw#n#9#aL5)AeMjPaoaqP z@)%wAHLp9qXf`=Tji>D1b4}Usks?8z;;r?vn{4*6;Xy_!P&Cmt_r&)>US*RXY=4Il zuzSIQ4G>E$0X#5zv>>mdNxL7*J?k;a#w*~K)au{!x&_ne1fVYh=_V&*7vAB(YZp`c zt|t?YeIWuZoF8c1Ti~=EG-on^D3>g15SB;0nei4o3ob4>R0sLns5X8m7v6>PutX9+ zXi_qtQBb}tSxk=%q*u)Hk-c)2c)TPU!4Q}G??lvEL`;%jEQjI&s{bB7qkYrI2~~9W zObOyGd#thx@W^pxBV{GjyQA98?Q@TNj;Gc^bKLclVa%$-_F%RilZNs0e3>$fV``;2 zs|c73`l*1@Wj`e{Nf?7cO9SY!c;LV?Sv$Bt;wfbs064k-(tkto!%J#tD=0pek=;Ms zK<^z$X(Bs?s(QLGMw^<3B8&bcRAL3_5i0k1*bk9e#$5aPF+p+d!lLbtST&Rh`i78 z0Sj7VDW9YmJnOe^E#Rnb!51FLPk&&fYU9-omt^36N;f_*g6V0w5{Gw(`!OmLTehR= zhQ&u=;`me^wAKyQ=yDY)&#-jnX@>5Es@G`Tqu54nLnnO{pKO0nE8&^J<|+_~T4}N_ zVlk*8f1Xp1 zGe9A)USe#~h6g7Cz_|1@2a6uKppTBqtL?_mJ0c8nzWUch4f62dPs=sZsz)#9=sd`E zsx85(EwMaZ+D(T!`pX=<^_A;n6rcpvnQ%mOd|i8;uCNNG__BqPVwdlJQWBhAIZ0kX_3^TH7eUM7|6WBquYeS*1R;j~}5K_yHh9 zhvbh5%6|RAX4Iegqab$j@YMBR;1LlyR9pa1qgh-bTaFN}+gNP3xO^d$YceF)CSFw^ zuirgskw}Q_QGK16m`(~p&i3|#+hw@j_W?Hdy3*_UezOHa$v~1cwn8PI2`MN+;Sy!w zNA7E4T3GwOJwQm-=z7;3v~tP+;lnAU!{ikW4jkrBjRl7H#t4argP0sNfo!(JOIdGi z@MbiYnH_Ibh8E}VDbiKRR=GD26NH zHAYCd^h`h1=PR)Ytv{njL9Kb~?Od8;f7=1gyw`(=PNj~BioyIXslP;6VbgMvaQIQRNMU4|!i4@P{Onv23Z6irejf0S^jfV&S zwKpO}6vmwpW)A7E%5XCDs3_ocrFp@-8ENz;!pA=Ol&XW8k)L3I9AyJ^~IyCd+Ud+-q% zvW8tno7rUPR;k+BBRO6nqWNP{AEW3JW;qDd@gPus@kB%6vqYdG6})J;N%Y&CLh_C1 z^R|_DESa3PPOxTWeoUJ?P^eg9aKMRM%%RRCHD72V0L8TF2~-zML-lDm-gEP=61QU* zAo0W?@RKSe)D4bz?(;cbVC5t94*{URVq~JZ?5|na_FU9Lc_ZHIbQ|2fZD#1`SK@s} z55m$zp9L-bNMmZ_t^8G0rEtv2}Mk!9LtMbh-$+q`ZN$jTtN zJMT9wPdm3W@Auux+LpV;9PIbGqO=wbMBVS}$U{6bM&(lf*OoMhP@eUg__2v68C8Ufy7G5Ga;y8k41AoW%dn-#wo zJoFuv@8#Mk@I-zc1@H60`?DqlZ=%=I1*Qx21AD--@J@lT=M$TFM?5wtU9ubJ!Qn=X z{+1}UFm6&HH}1{=#w|~B&C)SBzk^vY`BsC%lap3(&|2scQBK_WQh2r_EYlpWxw zPuh6QBqDLg34g0@x}Y77#~ArbgZ0A888C>C0I_6Ku|y$|Fwy~zUl|P<6K~v{#0-qB zx+Y#=Ldi}%+B8l~ZpqZ_V#kj0CNAmh!BPYy1fZ^2s zk=e*5SZmi{9%}Hfac<9H*<2FS*s|V>vq@ezMW>oe!032T(v$N&DV2jezfv!T?ge>b z#m8PK>(F;U5Dvo;N;<+rk+Q1v99>7zkO)dy7_^kfsVp4{ zONsZUmXTRqv~>AT-?UR!cPnaK@Mb=It_41;LWc#ns2N}{h{|+opmfRafCb)mC46)r zm|j7U;&Bs##62$|LBiPKb1`)ZOIa`s$EIXy9Ly95uNwCzMp~7N!v!S;<8+msIhuch zw^axYRX`Cuxc6OESpI|WSj$YTyiq1f&G{I>Mt>SPYm^dBtb=|;1s4$ijH=N{mv+#1 z*PlD$+16Gn`#KHlsQrXqN=2ws24_=!eQ)Fny220FI3|YHMvYCVrlR3Tx$y-~?>d!p zfaybC^5DSi|BP&3HGW6c6s5~PO^`z`;lq?|>dNEJ_=2e&0@*MjVPbk{-h8ALk?_mg zKq+qkxdU{)0u*xl2@8yypDXcgH}dbf8%U2Zh|LrsLI9Er5PGX^B&cTRceGG(1OPd; zDVzIZ+g^~ayilIps18!|_Q8!yLKv3ORDB$tM#MXbtU>?`RzN&42Br^+XZ7mO3jM+w zOl?SWy<0ZC%b}=;6{OoS>68B@PW6;Leyu&=Z?5c5@Iq1ul4v?A#8TXI3fQb?C9@rr zhH@!S7BLdU7swb+F093yGiYO!@XqE49{KPVn?RcSviuY5(;-K#xbkpH8>3J{4;Row zVGw7d?ex%QcjASwJI+BwNV&wbTSCVTsu|5u;2&5R>Kiy_ zlXl|Tr24N=t)!XH>^PWFw+Q8S13WUH1t7^zh$B__SY>xh)?r>k5T*M*R>1OJPD_DJ zmELlTBe^q`K=o<|l_PTyQgL|9JEkEgh4|1G)@y?uUfCet#-v^SmF1e_(t6RQe<`_f z)BD8pljJ(lkifR>_nJB4N)J7=NOj;f1NQ;TXjyesfRodZHxXez>t!?9 z{mI6D%|fvcQ*so8jqV5aFaerp9-mle_8D-<*2UZ3>=@h!okxk^nP1adWHTkrky3^?Wk3?bmoG<=9XJCfjff*(&}Yr$vB{QP@b!(ktKiippBO2`6Upx z_>GrZr#4c*o>~E#2(R^LaU?faV}ftAsovIzEka_l;nm>x)uKe~g#c}TakDMHi7jB6 zqK=X@$SZ6@L&(HrdR|qa#Z9)WJkTv7;1e!~s!H6yb}O=(mMqu^rfs?BtM6~7a@zbu05J8Y9~TVw!_ zIXNc>%pPE974CEJhz$8n?ARiyN9HJ3usF|9=bl>_ADr}kwFnnq) z#*GPEQbG`3#J4(6MTU$bjcX7!(^e2O#M%hTrn*%Rp+k24r<@g+u8H~HT%hXR1Cb1` zCcahu8uHtw9#aq>KYg_~9XP_rH4z2V zR>hGtPX|VwsYew0GR203{-NofQ^mpKIAe_Sk|gLQ4<5|yJ$S=1XmcSZmG3HK`d(tv zA~0Wv|m!7kTt2i;*(D1%_13<5&!~2>gFwP=eC%vCN?g<3bTEoY1K%oQFC=h&?|Z z(usE!nf`_1u?C>o0?M1MeuQm6%yXSN63X9l=;t3Z!2$jX#T~$zLw;rjg6*l~Qbs~u zmy&zK`Zko_=%RCLb*UB6X1bYoKBT1BWk5fagAkCb*(9-5<0+L=#!UWv%xS~~|KKJJ zu>?XPHa1!HBP6%qF+oa(4S50dSYUZJ)QQ^Y_sUH;ZZatrKcNJ0P+aK80yeAV{5lT+ zc`&Oi{*Q_tji3}i?>QY50qfLnNlMOg1oW(!kZv!0U!qVsd5@levBu6`=I-(L{!g#D z@3;ukUem&5OOs^}UVOYY8vT#>x|ajIyt#P;Nu#Twf}5>_s+@yQTP#2nJ*&g{wu9}0o)^C7!m5;KVkDJ%+2hN|zfeFHja3PV-lw)KI2VbU*bEa566ev&OID<< zFNY5xXD4SC{R9LDE}NCnEJ3y|y-5lW-+f}kyzwO2V+!2gJU!Gza&4uR96*%qP3;qa zY=1|B_NzlyT-v##CK(ib^M`a#_+L7|B|8y?-VtAmC@5m#-mxgc#Bjp^^M;yZ(2D5Z z&w`ugrcFbiavpcTSHqUbyfm@xm?{l}|787h5SftBoQ-4gC4Uo+XIdeG=d-MmJ<<<@ z;o>J=3psHNxv5)0SYAX#>Km2_Xkokd8{*MVCs9mH2~UoXOZeawb{HEK@4w|U*2|Vt zS}xI6S!0JRPbtUY85cB;xbcnztzq(q&Zxf!E^HCG5^aaXE?UL_A)yc?<{_pt`r0Rz zu6Bj!cY{TPwl6;T;2i56=h-O+Xt^bs-Qvf^dVk3xEQSUJIStJjo|1NeN62l@gQE^w zgsuXDT*yfDU+{L_IH@ zEcXVaAUbzq)DYF$6_FMR=C9BN{xct~DmMPMQ!mR=Hr_1H>g95BjI1A6_->P1-;YL; zI)itezZg#%vX6Dw&RBNz#OGrVxOSgCAh@?*JreYp7YuU1+VN|B^|9Pof9h!pXxj0r z);hk=)ySE0iXj0)lAWuNL(*tqjUHA&u-*fU$a1nof7TI?$_Mx?<@4;r$}Asqc+c%h z8e0JmlV@w$TKM87#hP%2`Ng;-3|KkfA$*zav$E#LDO!BtR+jinIhXRwaQ?Zl@V9+npeRLA*y7zW` zS8&k1rRHcJo?p7_`^=$Ya;_kFNH;N$c+r2=dGuDDDj|wo zpE}^>>LO-)!qFmAUGkr4mrB-j7MP9JR$CFTE^Vx;jCUerdq#}{$-(o)5xfAB$0h(c zWwq4CVw3`vwG+8uGBF0EU=q6kB&YV{(<^=v0D3^I)bwP^Catp4so_DB{$FcGD*(4U z<-dB5ue1YAN!9LGusG0~Nr}MX(2W2HJH@^5YCIe{@(M!djm&2k$9is#QJHyQ0b75y zWg!48mEZ80%ir4v(q)4lb*vEW2gE)MqF@0$>idI05ihbYx6g$P&>quw zEipzDs~7~U$81ELFybw;swYRk-waFEP#Mt>N59bJq_b7-0u%OZ+?9~Be#O&8IR%Y_ zdfR0L514WMdLN%6=j-btb8Xj;!@$G6r}9XtZ`Q>DziGLOx*~tL7tXO~!Y+9acJK-E z;NynDSj@ zk9>y`*1x^ZX04-kpYmV1ydE*ydf4(*)~?L^NG^k4Mqh>4cm^hlj78a~j- zD`)%_1#5P;%F4##?26vttgn8gQ`Y)$8xAFaYn2-dAheJ4=y%mmOwZAeN1t;3u6V;! zj%a3E%`+h_dinyInMg>ZB-yZo;AX<9M1r zRsD0aH#T^yhEtl z05hQ#2m{4TyhMH-7xo>FMQu4G0WXCa49WW)|01pdG-p@ikXZ+jRF7bLHB8%JLcY+n zoF+mm<;rFF@g3IZ{urX8Joh2<4Y z5&)nQE;TYxBlfd;JO|V37QYt>n= z^3LTq>20i~ijqIp)V<^8HrlEDlnqL?dE>CCobJ^1{lm9#F}3RTKoR*YnZ*boRQLM$ z_eRlOOzzSu0Y@7p$FHthhHb%nI?euNjtdfqO%yT?KqVRlSB-zGK4dK%-ELnerh33& z*~KOX0p!m7$0UA|0_Lj^nK?(Z&v@uM^7&#lj09;Aw4Xn&1omM)$AQK)Xs(wGFW3iL zQ_z~x9&(_AAB9$KWu0Od3CM=fDljK*7aQTAsL=gL+?5+Q9nHseL;s}ZbPh0lQS$Pg zlEaV^Y#SrtQgZqN4%QCi4%sfA)GXTKf&;_c%Qf^b-tBAp2rbrI{(*xela$f&pQKDz zyW3r{4Uc!31&2%61IPnNCJ{M>3z}N?g^}J;R%zI@&I&MxIci!aBR$S6nQzcG4Qy`E zjv)2fYHrtb_vhl(uTrS@veYP7O%ClG$35azvxRCtLWI?m&(r2joa_{6Jdph~58F}% z;v4O7(_V3m^!Rmlfnc`U?aqJ%Y@OE+K#xr55+6izOhZy!eiP8$!Ngat7iKrvz zgj)pjVLT`Tp!E)g6iLn%l(f%+P5={r42VAt05e4Q60p>8EvN3FHFiJ%?9v%-pMO`x=~G2I$Y?bbZ?Fqk zHAiy1kw`BhZ*Pf;`IQG7@zIX{nvfMozNM#H5j;9&)4^INIkKuLz(gA;g;-_#*fa-p zlp5o6F+KnY#pczayj=iWiF$H;Un%)>obdM!bIdJ{D6&@Ba^EsgjOu?SGn2!mRDuIW ztq<2KyU+4$#wbO8a6s;Yu75~y>12c!GF2E})3tEKy_ygf9DRDCr*e z2=9g}P7rq4U}S-9NgOZ%ny`eN=$Ah(^*WP8zr*ebi2BTb@q-aoFhR2vvDAS@qOB4) z*M8;OC%SzJaFNJ|o}dUXUd=D+GLE4>o#IqSQqOeN{kO$|_yEU3+qySSAu@42JubH@ zGb^uj^}c}zTYWv{Q%*_@6AQ^MnB>Rm!J7ieO64c}B~EZku0&WWuAeLJpxhlby+0Hg zD<60~>pQ&=`*NR)C}e~fv?uUw0@s#xY5pM%gzD#2GRa3l4l6u`H%OS7_YxuI;K|@) z$>95;943?iTJH}Jn+^{b!m4FK^bzPUG>ce~Ix*p8m<=#1?*|l_3HM+ZG0xToN0 z*7w6t)Gdmz6yk(Sc@&gNPzq|LGFA)San&YxfuIP=-^|1F;6=XDTW{jNf;{Qwx4KHb z;p%gX14M;Oq?@La_I-mlbmlm&)QvNYi+gGz5hf^K6HxC;)Tme8R$nWPy2&cx0c*5q zRFRA?uPruitJDY=kQ#cFFPD2NhRmm@{`YfnqQ{I7fir^Bw0RAI3z?jO9NH()Lc(45rbk9G}=`v$5%yCOG zoGP1ie9`^B4Pj?zHi$*;)0Y&a{@9#;3-QVM#76RDCaLU_*{bW*k&m5Gq~J{i^95yd zxUc^Fb9Y1R@3|Xi@{VDQOH*+-&sf8Jj&$IVyzX1rsw(X*0%)?0N1DfCnZwO49<$&V5Gm*sKItI!nHEJ0bAzbL`x z!*W4V>qu0E-4e@ymcwfa=BPHHFG;%a@VenW+oMYOX=OUY_J<@A=Yvs5Xk6MFuHl`$ z-2!umzcWoMW30CExZ61D;7tomSJAFFU4pgiULDbc0tv2DZ6HY@) zVj?G(W)wvcTfe{Tn(V*tV}?W0&O=!p)!Zq<3GJP8R>gIVvz{rFl}<%p%e$ne0|~&z z59c0~2lV^}pXupt$thu?gA48{nsoio0uKc4KCAv)m6F3V&lMRLHbr*byU*fPS%@-2IG<=#KZkBiU%(1(c=kh564W9gE zbZlO(WB*waAJnq_SkIWV4XvATF6I>)iXb5K{ni`RhpHYNK-D&BY2PnYULnmw255ifLO%j@8| znfK`olkXC~j&}}G2jCb4x#_X4AE_UA0~i@gJ=yXh zi#{goF|~Dw1J`Sjc7xT11cFKD_U2{$vtCFbB{jv|(u;BhE?9?Z(QGFV3Eiq9C-<{k zZSS}g%XHncO6z45L4Me5|0e5x~bTn_6B;-rnKnqox>0iyspiDmt zR+9u!q!FY$&e)7)nCUj=)g!ujYIN&5d`~n;Fu2{w33tc7IO_6&byKKOakR!xB=l(K zZ6yNTo^>lQ4XH`wWgZtCaiS&qgvM(s!QH`zDj`@Gq4Clf5l&6a1-dieSC|~6N49mP z-3)h%hiy06n9E`uxms3Tb%q?)aFiUkKGV44IR@$W~wR z=3UW%`Q7ir(2sY6rH{DbtN8-g-$qN!v1uTi*e1HPaX#&hDI%9PZ=W6vewF8kkri@Z zTr%5UQ}61IEXrvdF3MHKe`$XBH{_IYJy3HeVzj?Ld_(C&JlErWStA~BI@p!h88D5< zd+PIJdB9XV_gsIZT`p-*EQw>!reI1OJ^m}v6hqmyue+$sa1kX=N&LNUYC}R{<#vFE z=Aar)`WJPhv%X>mPCdWs?M$ zj&+Kg3*_(r!zc6VRVgsPqi<*Ax$e1S6!=%h7l!o8(`O={SjVVweoHBXW9oz&SvMd+ zK;o02vstIxqj%CN?E2S)!Te_~Clk-#iN)W1cuQ`*3Rr82P-hFtUR2JQK0G|+)kGeb zB%R^aU&KCghmiWp)qt|{!xL}a-sf79whbN6zvMbd%E~9=5-HQ(U)}OuWfi)INNBG~ z;v@&^>=D1jN>|!}?-CWTXz@Z+0iCC6$3nlDj3U(yn))S8!Uw7BnNsXmx`Um{R`8~s z_J{HqW?j|qivu{l$TFZk;)=%t0NN5v@OS^W%Wa}D1D_>ZgDw+&&o8l!_y z&ebC=x;}ZQ6H+Fm0Y9j-Q~td)X}ZxqRd>z4`N&@>U83a+R@I!Pd~TkUohPM-e^;K4 zk*A8I>N)?##%w-K679T_(n4Y%QYc!Q)nCU5U$2}W+I!7(i)KMafJKW!Bt?Aw=dk1(-VG?BSe;SBoG90+~dHqb7u-KI#Tko~CTJGUX8d6%L! zbi~VawZrjY{o>O~bB`QXcwQx@(MQ{>@CV$ZmP<`He+o0(17(UUr z^H8p7Gg|8MG-YXtO0M|kOuU8Rj+M!kG*t1mC9~w4nl3M#r%`&e%J*}Gq6Z8Vn{TNd z)JQ4pS9&_hRT;sUD;<9{@+Q)T)rp(%yNckVVsapYT(0wND&YZ26d@~q*qehE>suYHNc4)JnD_7VA-S4v z*VO@O!1b@1yKdvhz6Ge`U9a0r0=-`E5iudH+UGI6C_D=6xWF;~+x;HSg!1>oS>Y>H z@l{&+La&QM)mt*OvClHo?ex;a+xg0w=h}w@WpNq27K|49TZ^WlgCcZj@qXI2*F`^g zTibr}AMW>PB>aaPMX}^hp!qH{#i)Br*OB0)eZdHxjC^rdrfryE86qT`w?kXC-X3{Y%=nd z%lJjSvwtD|wQOq|!L&E32bf%adDlw~eT|0(DHMi&^QOb>AuYk^p!Yl%t!UfG6@k^# z2({oos!5_gpQ7C4en7k3w06{gS>OI%x3F06cd7o1h(ZqKnh5Xslg35D8DIaLGBZ=LcPA^m8tEQq^B9nC%(yu?jjQQZ-5sbPYK&cA~U zK7j)2m+%!@D6bmxe!I<263bQf z5ltJj=uw|mr#E8JGaF0bhoZ>Y6MJpj$`23s8zkF;(~JXYTVe4@hPUO*wazzK&(6nO z?beexEnhI}X6zRo*N{y&8k|$-*R+g0lLrWnQj6q1dMq5mD!EIw3D3?6O`rKx1xH)u z{0#3q4in^BLFWujt<^5f!wtZkk&$=o+`%I1$Y3qh8`fOXDCsVq%Q-v!a7ZVu-A-2x zE`Ie4#+QJ((i1Jxkk}DcsMgW!U`;IU;T4aU6eVQoS%&v=u9@t|L>p>8ajx89uS!X_ zB1eUy9{m@SyA-v?#9}|zN*=o-wzK!2N?d(X?NpYR21+Hr^He6xI}K7_2tMAxp6iPO%>!G-sxFo6Kb#%rbRfzHavA{R?g#^cPk)^2u(}>zS)6GHbsi{`6 za)Yiz!l;zRis_d%X|)m4r;)0ZOxCQ{E$rie_7P34D)MZZsIy_{`uNpzzv#FZ32S1a z+R1RcTs7f)#Dq9xhB5CYH5>_}I5YVy!A8kntxPTSTceYSEnE!ZEd_@$(0Re6)n)jV z8*CLCa;4U3tuZ9cT2(16{-c2CiI%vwuiO%t0hKNT9|#Wqe!QDwEx>${Jz)2W*Mj5T)R@x#;o{0I=Yn4m~{lGpKh~pz;J0j$>|hN`HWL${RMWL zBnfG6$!uw!H9be<CTmn*E}u)qH{~?SAaL*gz_2>|HpG#1ByIm z2-eTsmSBiYQRE3H&lZsS1p4(4U$(%ZIjeH6k6{`!FRLk= zR(Dze46V>c7d!r0W-F9FnNAEbs5W4s>8~|}8`d!oUl&~9{4|Bm3z@|G+nYci|Aj^1 zbn0ij9QE}*j!%QdDM2!1^Mf25FA}9aZBP=ghbp3wy-w!8W}WL|KrS)g-g^e~YfA>6 zLygSkf$Uw%lFz4(uqC;tqJVIV&jT+wtH^#(uNa2IuQV*I@=I0?5HYuZaI zmJ1QiVtXaNi6aKxW&YJ7shjow(Yt|A1@}CQC&>53Q}b0=gKFlRH!XIj@Qs&zvu0|a zxFin@{{obdD8jvSCi;oy&c6dV*1f4Ny*J-@QrqO&svZ2DRsD~@E|G_}0d>KT<=iMY zw?tEd6O7SxzUHr&_6xzi@EC?str;XuXU4H}P zpZZq#;0tDGX|L2Fz4x)33g1;5+b&DPqHcR6Y*VL}IxQd>OK$UfP+RqsyT*zeja) zgkQfPMU~c4ruxv8!Bkob9{P8s7I31dAy~{EIG`vq;_sbD%uN30LP0!V-8>T2df6Ij z=fr3&L4G6jODKH+9g=TRYr8j>R$p5NPjUgu4`~YCugKPD!4{ewh zI!2g~mEUZ5U-z7$>pGltMICics1{fJhkq*pb5%-=<1Kj#vlB@fg30`HQWVHd!>M93 z2bd70wavD*bMFZ_h|IS=(L^&?6$20I1lU|KIR)^*u7+k5$*G&7BX(iMp(MCxh&>8n^PNOuFOLG_mJAqY6?Ecp zUFQ(8b$vQV0TD9ycW)-crtV9I-z zG^9@gO+Eph!Dbj^dW<}`4aFB~#j6+i6#GYKzNf8^rj?IP3-;o%clTD+P@=+uNycqT zH4Tuvg&JtNcZoL zKtt6BWi>OJeB|ek#4q*t%~0Z>2%^ChG2!AnQmv{Kj6^q0L4H3#M9n6(f%SgpQo#8Z zhKD8;7EfQoK6p{&a4~f;K?8TQ^Jk|{c8-5y?)|Yycaw#Y?EI(w!+I9RZUHTwQ#Ri{ zh(N+Ula6=q*KCw1A}<0w!e7-_U${H_HzHok6d9psSky;U{(7Dwm+%m!mxa|gUzrK<2wu*EvRmGuD+8r;_!8LW0x3~B*-QlB-?jxE4oBn9WQi^MJUJ%amZsC=6+L3{>yF}NK=FB zWY4QqzGi&R6N4X88?>`?b@AODH~p93WfC2wj;rH52Ag}6&^yyLrE}T+P5vwZ5*KMD z-^rh{+ALib`jbl___h|xT|nYjDR~d?xe|KVqViMRsE*Y!Wf9`9n5=po3FD8^uk5F+ zz8e?;hgiwLC62O|r7zK6FG*yYe2LvKNV8*aqWZ&=VWm|Y4m(fm>i#5gn1hDmCh4#G z!6vF{VcB#@#?8WncH0WaYi}U@1m}}=CP8Ma(5vT4S_NPN?BgLdB3i~7#yC_Y0OQVC ze(1Hm2Q(iU?(u)?HUF}lf@#k5Sora-wnXd3UbSXvS%6 z3``umbSZ3%XeI^YA>o-m0wc?)&7s71YtZyc^-3p+`f9hTF}J5Qia`6DeQeZHYqB_X#w~a4hyH^~2yzG@ zygpzM#d|%3hL- z{d61>U4Itp2FM)UL8OYfct#f}yC_&a=>mGNraovC6P4~aOR2CR#o#0z`dHg`v{m(w z9e?+x#Pt~a#|&8}tz9z2(y=zaf52it-c9{sPVP($PadQ8vMKGQ9qfQVIkv^>+4u{^ zJeF`*0}I3PN?6z?R}h;ZqA9f<5xr8EOi*Ai@lChiXsY?Jn10IBTipFh&9wXms>Dm_ zchHJlw(9m8!~e8%f9Nf0Vuj23J|mIWpW@2Bq(Sz&y*N-H!61Co9xL|6*X){_0pTCT z75LZU(3@!H1SaylT%<&)efZ#$s&LFxUFj_X@6XpRXgkKPUYL=~`jK>RZMKc=INtKW z^)V;qCpck+sKm)ZnlHYhBc)yt-M)3?=uB0tvw?P98jdGi?5}(BgWLJ{ubKMkeqVBK z{(Q{h#qMDjvS?-X+;cGd8h>!a$u)*l-Fgh~&h5tt!b0X3q<}Q6O{Ex& z7nuN>@f4KQXuc?Ng3H=@NnH{Lhu&g08?J6m(8u{Ven-N)bUi>XwNIevOmaAcjuD4- zjncCZ_$InJ@3fWuFUh}LL&xHb!|`I_Uos)A?-lo=8CN6y!hX~0Ga_bHF2dBMqsBXFdC#yyYL`pB;+8c}rE z>-5}@*rCjTvVq6r*yVR;+)9>u!-KhiWmdKR8M2eFn>rWL_O$a(6xB;9wss+Wb3ka^ z9BK+Ts&;C4a~1y)L)5#u>?!NS<^zlbPR!PKsz*0IF*QmhHN>0&?lmir$;yxULcCR9 zcvLaiOHK}BQdRNR%?8V*k()ZLLLS(Z{=NLSU@`-Nn+c7;?~itWdDY5Qe)s4OW3B)p zbD6fwJwj#W4bLJ1ld&yB==xu32&{hGJlCwV#2JWjh;0{Qez84*2MNP`kU7eeu8|Le zB?wSik%L@!%F5T=d_pb!YJ~|96N%+%VS$SBM^$I z2;hPLT%UNe-g2t#OTq~Ui)-3SN%*I0>D7dKsSI|4jGgAh0&$sXCmhZJ-eqKKO+EK>f}H;0+aTk-T~@dnM` zPi)4}3YiZ`kd34qABhkh47#9jz2|Eb+Vw7wWf3Tkk z{9`iM?ZZ^G9JbbnVGe5elnXBSJhQ%cRe$B-A(S6s1}u|<|5(P}hHl%8*RqVkgNBF* zOt`9*du?Ljw-BIkgrgHl@#s>4`GDra$!!V+vb!sMCNx#Qt6x%u6i zR|SmxYj;nc;(n#eCTcpF*EH%xLa|Ch%K2du5d;(CAB3bJO<1}w9Rwhy`tZcP32`}8 zOG-q$CM$_a7aMOCA5Awt3_reWgZ237Gf4l$@o+9?Li~X{?mY|VBI0MMw%q(lMMaZ@ zhxcW5U(1E*!%V)1J;D7`MA;tc}y#Jqzvrp`Lod4CU5=h=%;54 zU8corZ+M7FUvuZOR9&{7>2|z4w`D23%?{HEv%ug za8~U$CGvk+R6n6rM#Z&##aKpzNKEQvx4t#i8WoyA7+sGMX~Fcre{S$F+(Caq08jOO zCmp$FdC%ZdKX9#l?M7wBj^{vKCV!A*d|G{xaIIJ>&YE1KWl-9;xoRrbV0C8tRNq9n zf?z7#l>gvE(^jQ5lQSo#eYT8sMYHcW4vS$E4$YJfFQpB~O4DWK67tIN$E^v-u)}#% zbegn)e8Rc1u1!eec;qM_2ITi|c8T@R3{_x<_q>?vgZ8$G`q*V6OYhAACQ|UQMS|bf zwJyDuT2n(t;^);$DiSwQ1OqIQS}=MoseI=5pzO~(L=~>r<^({fPd=?iXgFDFI=oQl znvo1Q-oVs%t+JW4BOuI#9BKss(?5H|fj1W#;9&!U_)pKRKpv6h!9>=!bOL)mu6LQQ zFS~L<1X3%2W)~a0Wh+FeE(JMt&|U=Mb!J2>?!V`$9Huc^3_~-I3^{uMImArnicOg} zC%VF0v?dnK6U? zfvA@|<}(p=3E_<^+#)1~Q}DFa7@1P7p(Fpsegk@}10Lwj4v64rIN^-i90Exw1xqpdN6SR89-)gBDSThzamE9&A zcpo-^{BonPvi(gD6M{5TKijn49Vg01s5kSa_Df z$bw#efZ>qSUw_?e!JGJ@x~@mtUH^c;yUWUY6HKar8a$B{JOhJX&tHv^ z2Gm;E97*-xb`6F{ayboRLM6~IWs6nmlYis5iiYILFu6#T*a^fa;8t8Twc~HcMJpmh zFT@i6o@TuC0ANJWCYlfaufS#kDSLh%B0o4?Sn)TX{8Uns5-5?6P3p>7tcn&a0p|qR08B~-}Lx5z8L$isHnCN5#vJD5FBEH^5f^J#YbAf@-r|_M0dRT{0 z3Cfpv+`te9F=UTW33!OiTjzW7_)#jqjtD@`9a75?l-3LzMS~Pf8$%83Z_8u4tal`m ze@}_F@LHjMG0mT+q~yUM>4QXV|0GkP@UTUyIi75Q2M6}E^&kOYnv7&6@S?xeU`%J) zAz0s#$VCSVy}ltiIz}`5Qa}7%bQdJD9Sx5^O1#TJ?t%xW0v!`+WBN}He1GS%QwP=J zUpw%@_2A?E_jh+_6ADv}R#J8+5X{crqz83BUf*{KZRS+z0)UZ=V$r+$V}Q_i`?G#E z1(PU5{+2Nl%2l&^y0D|HQj?7zcp`?Zu z{6U0|?zC`VR}i;MDjcK(`9ph0^RtL9fc4e}!1Its4z-Bn)3y4}sV3N$o=art(qv{e z_=n?4Bqf!1^c6O5t_x#%5^8i(#(Ik&el^5`OI#h-D3p_jhJ?b=I%HfZEThE9Et^82 zri;EAa{Hl!>~_Dmn7%?st!N;v*e28;%7beNNa-74N`%kKnXTk+EEP8*ha!Qv=~_$z z&Brai64I!Y9q5^p$N!ptXXE0|b>u}9^p>wdx)@n`w;UF~b2Fo73}~)1fea!f3?Z+c@Pi!5P2x>7Yq|J@~zo&i2k*%B@C6Iw(f9{Kj0H-`I3Rij8Q|(10YF= zt;Ab&M35k(T1HbSno!@kS7(ml0g_h}ZBC3lD#uBX-yL5B zn7k>I)b-p}P&~0{;46@a4xGpVCXGr1W2KHx<)dH$u1$VH;t-_DsNxE~O$6u3WE3^X zBb!0_Qjwr=McvBK3pf}9#={B_x>q1%dp@d_v>J?0u9-aZ8s2lP%GnNwSBp-UhQ6zp_h{F_M5hZudn*P!w_mookMoq;#EeAD0cL? z;6JXErY0NuC~ESAIsJsGDEi~*>mvVG4ddSKUaXpcQkQmFmq?SW6;!I@eWFEQlAxJSxP2c7maGGB z-9Rx{dJ(EAIH)HGP}LC!+Sv`b|CR?k3L?BVb_KAmnqI2q0EEawaizjQs6pWpMP~>g z^bjPx{;-aI4C7WfaNmq^b@Q46%Uo7T^OgN~#!xRTNpr^R?WSE^uNQbZ4$VyU3%kWNe)>IbXVs8N( z&P7SXdXcBM`wwr3bXoIB@^mZvR|AX*I-=z?WYz#1eQxS7btN|BCX3+GO*F`bu+m>7 z43epzgsd1sK=>BA(ZALd15H41CIJRH@jQL8fjjQkj4GawK$rRd8U}Zv^sM(TqrJ+LPPa2{awO6CQ1IdwHHxYmBK}B)u?! z?F8#sx`{s-klhjB8-@BZd>~?c$dP4e;*wDE3l~V|WQhqBtgcnJ{>z>_0<2NE&KRgg z6N+dnQW@8;%v1>zJBmYh8oX4-b|lgH5~p&)xqKLeK5>M+`VGEQ(K#w0TtZGQ&}&lv+H%Wl3T6MQsa7sk)v^5g~Jq{i$u)TBv0o#|42R^{&g?}LKX`C)IieHkSze0B;7JehI zxi7MsIPqf`no8oLuJJCmD?vUkWZ=^)7vX>x1)<;bY7KcZcttsZV2Nn~NC>8oq1Cr3 zJ;ESDJde!FIY)!=LLKxg1Zak@<1}oXcLZ>V_9&HSfZR&3U4vd$?rQZ%{R}M&;)p|* zXcy|JMbaD&1467wG`8h)J6&?S%jfWQqFqG}Cbxo|V7)cp1{9F(_~>w`Dn7+9#Vreg zxJ&hl^erJO7D%nGpWX+XBz3q-#Z0_YmdG4aEDk5sARX(J4_9~zNAQMzH^by()*z*G zmueKq*>VT(CbuqP9#I7g#QykR$~(|c<1D?OF9ayo-jrULq|YrD?-wkX)X6F>`FW(% zCrj|biIv0Wep&MzI^bS4Q+u*cwamCYO@RdEYih!j66S{desKW2wS6aO5XU!tMu3*0 z6nq9LAw;BWpGZ3sleXueY21@RExfGlRC}0%bS-Q70GQHzB@_rk>8KE^AmB{Bb>EUI zU_7k^kMk1&1;grb! zfJGmKB>JYjH%N&z&OdVtCg+4Ot%LzEyCBQ&-peOE2q5?(TK5pf1=PXLq}5b>YviDL z3_}3VwLxYUX2>a8(%_T`UB%EJ^@W1S@T?O)p^j|0akxgD&j!{P0@R2_Ul@p3wK(`O ziJAdmNf8D6ZqE~KWa%*ML4x!H z3`a1Q@v;29@INXOy?o~sOQ#V|p9p%}Ws>AoM3Bxb48P1vzl<&=2ZT0`5THYpruHw? zXw*W*#69~(C)W!PxM3Z8Qgy2y8#{KLJ7$OEYJD+yL!y}+x>Ngq82~(3FfKqdvmfE9 zu@$cRW9F=I-aJ}_L%ZZYins2^ssE;ZUwNZL)~-Z-7|eGj9Vk`l67zxqaEXN@VKgLGF>s^6br_Q_jfmQsq)NTA zEfP6=(0mEvTu3il^k=CRDgiPvn3rA(ypV2}Mq~EsBN-xGRZ$()Y^NeDC|wp^5Q)#EY)L)V zD1npDZ+v@M!Hu~e!J%JZp=9 z64XjaijP-2hx}H=C6{@{6zSL?QY3OqP{h>)=$=a8v#>?5?0~B_8OR7u!59uAG5v`E zMW?iBB9;$enAF})2IYhU+o49Il1wqk+4e2!T|Cq+fIe^A&j$%S)hB(N!f+RY#Cc{7 z75y{#2>?Qavws5}k0%L`p-71_!&$kNV2;}=AkUypKzmRD5c-WS4-35QPk4(NH27%T zVq$ur<~Sp_3Pn?BJNR8!%LQzvkwCXk`+#K`I7o;Yj^%zhErUXPy0qh*fr8~%=`m1T zeLRT-Lbqqb1NEo(V}YFktUe@oJnxn=ARniadNpc}&QqETG9U$$UVycL4=KcF+?JtY zdUHndeg9TH1!6#xd;nGqLmBa-Q6wwF1FmLeK+P4~FO00_xX?&=p#suSzYJFpDS&l= z*xa2EP!l^TD*L7mF$kclf41mvxKw>IS(H>Sc$W$AuNC{N3b^)!KP_Lj`5^$IeI}M9 z=Y1B8M~QbH0y<9m#T#REnZxV>ofrVj5HD*G>4S0+72qx59k9UM%tXv-K5>+#@XI4b zxkSt8pzK5@puxgcSK;TPNd>%o#SZv~r`4J})!JvX#Yf|9xye#hzrvARw(AaM06C(l zR8E-K+iCLIxC*873BQU6Jm8dRuQs)ctnBOtd9mUWwQ$E*yTBC{0l=womVMB@y0M2c z8q1vK<=Ci6V9jfeiOPRn0V}LS6VS{7tNH_E1uQeYOd^7izy0|vD#y|M9h@@#iUnyR zkV21DJrL&Xm_*RPbpkgQ+~WkV5?$Y6fQ*tMjsQbN9Nl`9f~apVgj51dTS0ugLq)SR zv2YMe8|a24QgfSS*6aX}IrPwceqOY)<;35ADBu_5LSo^V^LkL8!UJs(Vy&3MiGjmZ zL)1KXcDxmY#Q{)_Q&YB7*OMo7v&Pe1{&jup1NpLuo zE5S5r#Sb<1-~TD^$&OBZn5~SiV$!i){zzr@uV%VAS<0i4L1e5Nw|WIGOrG8RQOMU= z%w+luA5oCtgyq>KsCcH`t5W8WLK*%2MTGUs*D*?R(N@Lm^#gvoa&qV~{@yY^oLZK* zs^dCis@Cie%Ns()Im2Qd`zb~*9p|YEKlg|qZ9jc(kZi+p_kKZ?;K2l6-0bmo;Jwi< zcuG)u$pNf)XvR(-z#y`i5lo1IhE93)ilVj?;DkpG`7jL+L^|^74+lkJBmL|EXy&CK zMTOKXkub8}^FoR3xe<|UVf)2G5n0~}RZg3-S^(g@%;*K+S}q3ItDwWnMmnT(SZC#0 z(KalR7>|c6lLiye9373t8zRv)5QmuMp%DJG#YksUM4@(nu<&Sw{^+PbaDV+WQAzsay zE(mn{a`?`|{8U8>&^$3uMD(Et-rN01Ow$(1fD13mLD1DeK?t6cyUhJIngnFUAxr8t z|I8%>fDR(O(Y?+eT~$(C&3n?>k1QG}<+*(AhHZ)b*JSWDwe!CEcFXUoXB5bh@%j=0 zQ*ejnKbVz>kitlwo)#)V?X0M57M#_uXXtBUrq3Vh_(eQ>_*)

`mwu$E$`(? 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Ξ4Z_4f;c2dkGmJax!i4+ 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�<^!%=y`- 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

WNUK1Z%RmkwIGHdIvM)Z|A_`ClVPbcH;J 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 z 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≰_| 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

  • $I^rW;zYGWZu=hTfi*Yjk@_s+k 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 literal 0 HcmV?d00001 diff --git a/depend/doctest-2.4.9.tar.gz b/depend/doctest-2.4.9.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..306f10cc4aae26ecebf370bc7b677c7bb7a850b0 GIT binary patch literal 2292632 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

    Ci2uq&KZdPIimb=$Vs1Q)jdixPJW%Bc< z?S8#Tesff{gKhV3t`}R0`I}{R90+=^gx*qD`{nBU+ZX@XZm%!0JDYMblY4<)lTd*> zlUuWLONB<7d-Shr=!}c>Qfsjn&z{}6X!7gDYJ;R;txSdM7mK-OaH-1M{^0y8c+NZJlM> zrM$4X$kOzyOChMH_C>n;{<1IBqHk9MdHa3;u=>Yp^Wj3#g_O(w_4XfuEH+iPRH!?) zeAx=54yo+BflLzW;qFQR5a?g2z_miBYoKJ$AA?|uXn#>3zCCVtt<+q&)#geljYkCf zo9lY9s-8n%sjeH3CcE#?B`1mP&G$NWI-ZKu+feyF-Cz|uHk_fT%Z~SuZIG?{cr5=fEiapTBmMWS&oQ5V$u01LZXNo!vz$xJOk#=>(_6#THf^etCQZ^rCykq=u}&H_Nh6(9Hc6#U8a7Eoom4bQg-*(w zB-;X1S5pa@q8!tRmf~K|@&adOG&3WaDa}lA=9J`3an^)nO>owjWQ}pwh-8g$R!Oo- zoHZm_L!4ERtO94zE}=a_+pMw#*Y}s}o7LhLEf`p$R4$e)opQ2t5j?z7+PuUSH@c)D z;ft(pr2T_(G|bZ6{uXU>^0RcB385H{hv{ULjlO#H)iKz*3whGmmqyBDXi|*i$g~_D zEw$6ZbU2!%6VZlIG0CT2`FKWbrrBUv=F@3rem7LIK`|Ap+H^W9M)`DHGE~ewG06wh zw492f)bGqv5jm4G9}CLaXq0EUPsB_t{X4frM9#RJj0It_rA&ue<`Ws)nQD-ahSPFvep@1tBWBN0DK@d?v@DsL znCWgf8H}^>bT~1;o1PU}ViPnLl=F$GQko5YGIokg2V%0D4pZ~Hp(1iJ(Vod@l8Me4 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�I1kP?WrND30-=oaJ0 zU0=+BE*}e?sG`#y)o=2`P8!eSzfM1H-P~sU`uH47uhA#-mmq!Q*3hAkPc524ts}rN zn~9f;V3_mU&5=YP9z^Z=~6ko+O2c; zP;c%rCLWBeZ>KF!y zdjMLa)L5w8o6S{n9C0b*x9}8s%s(!$tf)4hwS=RAn3c$(}gSdDM zwC!5|$w|VqC`yglG3w8+^cC=~hPvb3SEi4Y6=n4ZrxKSRxT+g4b!OtJbA@`pgD`dnb0KK{Hky*neY@VFyG6uE*W<{J=GA_#3%ok z9QDq&?}Dr#Rt3BO^G*7pAj?eHI^HoBnmPDY1Kl)Z-J5>0KiQ&<0h-7Kz+hze z>J5B(@m-o2GeK014}fKKGr4~NtQR$InTCV6dwRndyuPZNR!gyS)oe`Qvu=VJ`gSi|sf={#+kq~by zd8u-0TPq{bu8l}MkK1RHXe%Ibv2zL-^+B4i)*6&-O?WGfx7}~~w!zeBmsQ%Ru$nJ( zI$yk+rycT7wq@W1oNJJ(wMSAW*cOxUjL+-BrVdc5pR5&N98Dw!X%8D+SxiFwY%MAZ z(pKiy1ZYzuBVB!a0@{VzAM{rveA9&zjt6)?DIr^}2Rg^4sTZ}Td|}Gz%o^=E4=Qv_RTWK3B_1hq z;lQ!W4bOb;1np(W<}sZ^r9DpgaxsVK>Q ze8gANrdTB|wt%o%s5CiSs;@2Y_d<@_aZQD)FcGU77I~&YndE6U7z})26!2!F9fhG@ z-g4xokYkok&l@tLO(gewg_%=JNj0%HD~on?F#*llibjRGfU?uALlJ(njku`q*W?A7 zR3p9S)KI;t=4`Wmv5hEelpQ^%+*8L3m|!NfLp7NCh|!1*@ZiT>X;t=x+5J;WBSbXt z>Ul#@;F(|cDl$)ADT#DaOyKSCh&ls8627GsEa#HM@1N_J&tmU7rTE4mn#u4=Qn#qWuEJ`l|!zg3L@Y=SXYc{(UQn$~1AA34V+3obA zYbwlqZv$_bwW-M)NhlUR;ZH_GI;+CbH@Ab&_O7P`F_IcLuKX@-%XN#SWn^iuid!Ix z$=ILgcR-YptE?7w0}yivX%3!_KZV43T_7>B+$vZ{qZTx9rh>6KF0FR^=CpFC+L2>k z=PBQiZT6s(4nK!+NX4YS3 zh#}Q5M)K4mcIl~kKQCjQ;~{T|`#u=_HF{Kkt~H@>yshv}tvbF^0ACq_%Q`?hQ8VTg zY?{ULR86fVNy~<*_Do3x25Feny#2c~n~~%MGszb}O*p(l<6`tYFC~iEdZTjj=>b7i zm%Cq{Hqog@bT%GCZg>r=RbDm$loP>KV@;YLLn=)2ASp$i%%d(X1`#V^nn(d_>}@yF zzU(=_-ML5Vll@^_9vYe=t%AM3GMbXV7LQVx9$7@GMkvW(+~g5~ zj6;CiJ#vmYlbCqVCdQ}QazQ_*9(Yx879twOcv+EXvG*CpzWH7MWis>w?^$8&GeT;6I23Tjl0J9BH*nKhqB z((`qLB<~}68&(ELt%sg$*%O8dGi^X|h@jbqsfnUcguslNid6Yg zmib}Wc3zrS`c|3Ksf=K{)MFl6GiGUURD)H+RLX0oiOi>jO6*hdy3Ait2U9iT-P={a zDTPZxdDgl%+pghy7Y1mF!5(z_ZmB5hG4y}Swy#yJUnBk&%wOq(ZDy}Lhi{!an^ytq zm=uPeysrBjQOC~pssxuikbQ^d&6SL;!IkcCA5=q2k zxDR0wBrZxqYB0Dx+p=&05N!Pm?0wfQ^L)wX06kd%^NZ0Ac43dUtJS;531Svnbv?-e z`{EdEuu3%9{#e=hT7XKra@FK)IXY|v^ub8Otn1jbbZ8@#B#xIm^haSBqWg$|I=t_)z zB2(bN@nDal;arqBzy(oEvmi1|fN;AnE`|gw4~5rf7q6umCMm>Ktl&_*Tg2mKNps@} zv5f<|xqi*{Rkrh*cg1Lvxn(=JS)WX7bu?Sv>jx>^lh&Z;O_P8U`k{w$3Q|xBaW6oI z#o0-hj_-(VO|3;czqBh40(OO0^Kb^FUV!8J4PZpa!vE^3PQ}9IPI)k=afR-W`W`xTK(lNM<^ zFFQ_VDaSoq<*0}`@1eA)iv4b)W<5*{=$!5J4%>KjnbJ9&AalbxqJsWUwj*i{=IUo{ z2ln3X-1HzX2l>d_+K8HcjQ0hL=B7HnB?-55TWs_$KDuDC+ z#v%g5{>L$m27y0k(1;Ps zBDoiqWyW6@*KI@jr%#1NLm+3oWn8xjP&JIE^?QE@F7+F zYS-WD!VkN8pv}XPa7epS-npIbo7xIJ7HpQ|>3+ITeD%=evc&wNTwa3QIpK>TuH)4V z_)bP1+MD4{ykpHdf*}`7&v@Ns<0S;hDWs5MyX#+BB>~w`w5EmR= z6w_nB!1v@exlzjfHD>$}W~IR$CO4_4eB^TZ-F(U%FGLe#T|WSq<>a3PL`OS1@AqlVW=Ykd(}q)BQXLdg>K>gyrcK z(El@l=p`ykh$Hj5S=kdvY25hhzSrG_0J@O!4AHnJp#0J{O{nvB0Nnyp zt$TNDQ-sYQB^l?;nb&n5oWaT_yXjSx_ph1^oj(v~wV&pwE~l%$Z25VrmqYR#dIODL z`R{N3QDS=;%_dpA{XhPZMOKVK-~!lBN8Xd0qK{$64MCXakBIu?TUSH5Ueww`)NGeKFx#2sKLxb zOhA7ddZ}{3u11*t2G9)PP^J84j2DDw;Vqu;?=nzCs^H^$nJy2n0ewS}Ra~+&l8t9j zU4@-y-Zwm_ zs!8mfPoeFQDQD)9*F0g2Q-G;HtPB@wzXFf+c=Caez8bq=h&pv);R|h|O z%HVuvN>8?I6I-jx`OuU$A<{*ck0!QuU^9&8S`wB3YzK|8CwuIyBVGmeM}h5;zdPce zP7^M`(#orj+$7!(bH{ea%cf)aJ-Jm2sA-ZuMQK#AYIfMJZ;tvs3%u5qOA?$`vF8rt z2y4t5)zZuV1_lQom4$Rb=jKZ>8Jkm`v$MALs&k$|b4RARa*b|p@2Eq28yIY1VjMLv z=zd%LJwSLM-LSWE2$6{c-~IMH!m|Kydita)slN7VL`~EJ9pvtVl!}b3dfqTrKLNN0 z82$u{ccWk<^C}ixtHRw8u*sG8qBuHLGwM6(kViC_>)tbM!xU<2D_*Rh9@;V#dfek~ zZ@)#e@m`dPQ{JTn=Y+exATtM`w;HDw*}N+0R-zJdU0`u~fr0qx?IpV=wz>-NJjhnT z4UX+S$b0(G(DuAWKSHNxexB$~(tKV{PuZAFMtNP7xI3y$FYk#hC1~)AW(vHk?EBa%176)5#-R7s6!_Tu|e0k zEpW`?SExlTKEtQkvZ&cI67SqAkR9n+&&ue&l`(hET{@7twq`-v$IQFV<}BTm01#gy z&J%5}V>;_oVYC*#Dqi0G^s5-Vv@57F_(xDw!{i@VIXZD5yLLiHHSm7J`iLzK-uSj0 zqLkHi=qy9p9YV|DnCBfTe(IF9oQvIq+#^=Z53Aew>-7@1UXt_uqybW@l-SqL>#Oa0 z(JT#heKH~N1T75>9)X%wtR9bKcx4Qs3?xduuyzZj@$caJ19tDTcz#E3hSPWu;8fqW zxW3Vtqq6{D2N*^lY3^K-}vI z4yfxjg%&h6P8Njzh;~Wm<}f>V6)r|a7TMR;V!pq*o)MQ>$Q_KFp`@{_;}Yo98;jF? zUNsd1vxiP@?1Gbh!lrb)#jEl0hi{Bu3wkN&07ao zRBg^fkoQSdl*k{&#sG+CN^r4PN&c5~mJdbAc7ATU%cZmOv zC|IeM*F$bcQ@0-eK#+XZx!%Y!kJ5gY?)1I3V`mgh*Pv|KGynTI)^D2HpV#1`KMEEz_{TAdd(BN>l(it>2mZ^S39k#=RBSFc^ ztI$h7n2$iU{xY?Kf9Wk8-tNe5IwZQiA6MT_d;5iP@T)JGp708^%+L*2pJiLwod`KW z`~S1|r|E4R*}5=#eq$7A>XZ%81PFkgL^X9Nl9E|Pk=ktB9F-q10VK$@fJ_*fAjNX& zJa-y*2zMNJCf`WD)kZ`%06}%-I$PYkEC89&N32-wyVlEn(PlEmpD29CcG=+;^_LHV zlI8M^2uj&`;IEGCV6Sw1I-UgAVLVNo0_LZjz+uYdSm5kW*})W8-r|G#+ zmBd?ld3vo(KA-jGV%2He&ZG^)@wNrN)FI7zVa_vIVBSKEL%#8sGAoO03a_!2c%m+* zs3`av_(@QQ=_(ju7Ah0px5WKkcL#`@Ube0t59lKV)NZCO`BXLpe)#VxC_?pfT? z+&fom1`R%Qv8*-itKGPNTN2lVsM{tA+=0ko+N~k_^;_|r;=0O0q3yFcb%xwpHz7$S zF{+RA;?`_6qvMyk7+B~h08X5zM9Vtg6Oozk?k{v`&eQA^8YUw1uilEI~ro-BN;>H8Fy?66x+H)OlcU|aGkYag<@X?H#{FKaaMtg16F zWAQl^XS$(CItGfrouLU2OTxc0Z1I9j8>Yzq6lMeMwLh7}HzoT-)V7b!*~nPhN<8D4 zqbJ&uSw%0`RF3)oThUv52h&LgI5NQ4I^c z>&X<61%)8UgGG5z8|N^K2W{6r1+!VoVrrOhvB3h5IrG&8EBr_t44_@+xscRcPG$R?sA%?9bD!7KFdYV2tExrSP&f^fS@=$zjECit%ohIN9PY7; z|2G?go=<-{yq^1b=9Aobw}a6*z0F~u>Kh8!nqhv|ojLOwbo^Ix-)9CwmBrP4C~eO+ znZvkf6+0=N%D%@j_KxPp?nGO$q=;x~1VVwrwOXaOg@aQ(E9Qxeur6t|X39cO%m8%H zJT7eJl1>!84+~Amja70}@yIeqvNhwnat7=EK5Mu+n`}u>vcu)!DOy!&4{{N3#oG1i zvIAXoQFF-RcBpd#2klsGro>sDaiZDgu4@rHdR`OE8I*AZ^Vij73!Je!KhGMeoBpx9 zBiW!HYSUTYk`6e7%+;P=O-J3x4~I#Xs+an{SgdPP%A#G{pYDlwoiFH0W-!?LU^oS$ zKC7phF=W9)%CIxtqMYx|l%A16YrV{?;yzm8d%3I3bWORr*eR*BkR6zxVCxh)&u4r5q8K@+d5VLfL9=th8I}b0ffKzP|9A&IY6O zZrM$iOC_2KhjRnuoS;2Z9XiX8$qmb4EmSV0yauD7ANni&4=cX%xwe+`;FFK_h`VJy z{wKo~vH}Eu&Scumg1B+Zard{Nm*%0~`59{NpzB6&$I_BKmArQ@&_`FCdVwcHA2 zmAfO=-_Y*{!<9zY?_UPP_ziolsG@D;avyQXpu@)w;Vq22FmW^|5EmtPrrt@P-`Ie9WCuzo& z{NQIfX5|@dTiM*-ww(OHg_!{VFFl8EgWJKx9|ehrzUmX0`Z@#eO~P@I{DE-@ZU;@% z>+IQ^#-&eD5{5SLM1S4}lFwUz{K3^XXV)z)zyDvKvFi=3@eh|dod+2|GsmXtR2C0_ zVS^O>`w0KexK2^KD z3IB=Whf!m_a~du@no*!A+|$wV8k;P67v%c<<9N=)nNM;j_j@|NGbdWWl?#)x@?q=n z!PR}Tn(Xl9*6%X`D`5#~v)+d&5JABI0C}KFpow@~MS`_b9^G9lyysX6au4S}Td4l6 z#ox=c1!T?reh<>NzR?dZXEf@yH~!+bQ~16C(>bH)oJU)^T5{jZI$w4}{AcvMcqjZv z^!q=d(+q zMLwih@*$<-4=8l+5)KjX`w{ssLxGj-%_fgZ)iE2b_1=9r#UKDyy}R2>}S!MQF99?iZ5=7`&~41 z_6l|6>s|BpuK5%9{Oeuw`R*FO*NZ28i%aTyz&TH|$?f%>(x8rD1OM-n#Aw^*)#W`K zzSt~z#dCg=ya(kmDvDnFzE~jd$82B7q@ONea^wIecqZN>K7Tw-f?+9yM#1ec&~) zmMia+L_p6P4G)&XoaeP7?>Uv_-op^LNj#h}2kROfN=J_8gG}@WgC-YR*v=xqZ8mek zCeV5T@@BrvqowiN58CavQoprvCfQ#(>1)pj8)+BgM(8Jl7P3)}7P5hSVSefwZf-W3 zCnpLj|FS}k6@FhV+QW44QF#X+WjYu}{jle!!0XOfUh1vWaYb0zuz~P}_@k2AU6i{* zrgbOy+IYQ=i)pH9xY&9Gd->6$N2LMv1i+C0wd5Xlqf|{$e0kSr1F;jrk6kB?VJl4J zEa!K(IeznvdROZ!#UICi6v92{^&BcGM6Z?9S%8VU3MO%V8if`a zV6*7Fzm@}he3(1-?b*jZjG%>Z4wBTz18O*f@UB_~yrdkt%3NHqm}!b=1bDz;?3DX2 z({ZMFDLFVi)v_M23_1jU?YMYLPK&D-{dd9Fp@yXKO6ugWkLMGAbgiY=_{nO z^)u`;ht*unL6+ZkWfy?f+=bpX4qYYiSQaWzI4!45by0C!>}5ukhSDNxWu_QYl65 zX^CUF%|4a?G538=?-hkGiM7hh9;GJpN)y%9$Kh}|_l;+>a-8K3RDRz-=rz~+ zxrKM-uFcK0HI5Oik0-E7*$ieM8n+^P)sieMx*5<>qP6vbT*4n*%!v-7u*29ezDfw|xo>&u~ZmI45QJ!~oW@eP<9R=q` zdCn|5|8#Q!&-~jPJX&kD{sgC+M^rrB+|kc^Z&3qhSFeLj9(bozjn|6_69p02`d#_Flgr$2|e$tHi@=XzFGX z(ys8m0WRiX8udthD~pcY&UU4O<8;UUt!L-RtLC00D>zEnS!dsR*Zy!C)Vx0`9{k0L z2d~R6cy)`s)>+KQq{=ToruQa6I-NillE;&HP7eFt2C ze;vpH#v>ZhCN@)u`{@^0M7Y$a!#=E1Dr=`xj7JW)j6Z_)LbMzNJcE;N8-^NokPnT> z&^x>}n*vV#0Gfifc{I=|DCc{lVAOTGP`Yww@YyV0VeM+Nc6YDXGLB~Eit$O3Q?|XG zIt!u)s#4+o3iFAxdE-YZjz~8;5R#c^amC{UUvI&R0aI-{=DH_GQ@jy^MfN6A8+?Z*0}oJ~@-et|O4RWc zuFK4=90=RWLHY~UE3f`YQIeUifCF7tM`a=-2aHf##>phsn zFiSl@3A9H#R9ru27hx?(J7}tI;>lYaC|uzIwApWXr`muND|X>BycV`#6i=}GP#_89 zeg{&I6iTeXF!Oj>%lh{4q6d>B24g; zXS#p0opiP&+=OY^%W^?!wfthZ_crFOO#gK$4hiV!6+^61FCa@KuwBn@JxQ$PA?B)m z1V2y0YkVCQHs*FWFW{u#gir)FYbuokSL85S-CJ1s;gC-172Qy{1DRfog7hlxdsTm! z#NMtJsWm)gVoV#t1<_gT$Fw)7SHYY<)sg;%gKTqVYsobFz{iDrZ3**HCw3CvJ=uSG zaC)|X(%JuccmMU-!SPY&>}2QY^l<0w_yh@;M@$V&8c4Z#u^0luBmC2MMEOI z*ahl1o}hxI7YKKVEC5WE?r2rhQs&<_W)E& z^vbL#5DEgchFXH&l$k-G;W++8W)Wv*b=6~2Bn)HdkGg%IiMyACm(a5*R4@sCpN2RN zXga^}Rnx}~Zj{g=}~|(O_+>Ig)tDYdsp$~a&;F! zv{e|}SbOw=IW=5>Fg!rM`^aNNh8y|kOlAS4>T*7WuZz0S9~N7g*Tgnm!JW4Z?$w4FQQ~$8 zuN&l>d4qR@o{u+--Ep`@lzfL#Z#b1b0>z(jMbuZeQ{yC@#j1VK_htzzjYfmmvh31O zsbSciAjfy*6Ag?}62MC=p4^~p-Vb_1pMBwwG!$ie5y<_NnM_#`t(ETCxBRiOGJir~;z66W7R z6onjq8+JDg1r=TUr)QnrIXz0ME&JA3;lr|<%9eV}=R@Nzn_%FYL} zgdKj=fi84lk~+LlsFp$ZI+%6jw3%?y-h}SKZ1i}MX~7da%TK~M8Qk=r34?)D(@$i{ zB%h&?BWSDiaYB`I3x!950AL3lskmxsIEwc!(El1g8^u-gG(`Fuf&$ ziEB$~7pPs}p+Wvb5rMBvL_UIv?iVN->-}LvT~0`K6?^OLw}hCKU@NG|5zYnZ0<^z7 z^hNb1d#49)u(UwJjfYoDfaEREy+(tUv+B&1XxxAf!88y7UvD;T%h+neBPv&^y!ip{ z_Ft>0G8zTEl7{D~RVq)$9(lw*U1FEmrDspV(WRG6dQX>_{w2LhI8Kw*zMuN5!}u~@ z4Pgs(+KuG;65d`NKdV4BtM5ke;R(OY#o_Sy>;GGuYinQi|6ky5zW(1V{)cM*&+zV}8Y-2ah#0tc>R>vA zyFf0vMCnYQEO`EK#d~)SEv#_;biRi^A+;fS9fa?QAt5f+4=KDf)z(DbOhnbolvHRO zkO1UPsZzL=KnMp4k?EFb!H|HCy!yNUdWThZ_s4SM31cBaEDR8Y5;AikQ($7r3=%7-2bstguq;cdz?L1Sxre8>9 z@sh=86q1$1h@zquNHxnacD@&PPWP)Y{0@x)^&TB~R9jxAS5D8Ln-`?|%sUmg81^Ce z7WRbo>gYr0{XPX2ufJl<8N5?S*&<3%N7RLl_WLx@Nyd3{my3lp(p}+IdaGJB;>Wv& zqZ`6zoxpD}TL*N7j^l)^$yRrq+F1-q5;dF7>&E>sP&-9y%L*-5!Eh{>x|zk!?%~eq zsq&V@4g7}M#9{b0$h@epjQqE{e@QV5oIDU;53N6m=|eyI(0{dg2d=!5{d)^Og#ey50ctiVu7tFcH}8%nla@vWqNj1QQd% z$(6+z`S=0nZZgFH8IP;VZc9>g$cn(YV4+b2{U^(ocK1VXrpO5pr-5C~yjv$xoVs3{ zz3GJuW5*R@DJC>6!a%A)2UbuNXT;F)=dMni+W4;D6mwd zqCm3bRcY0D%Hd$5~^@fa6^rBx7C`+gKb@2(nA zkgkTP8R$=Ylz_6|U#-oP$h}-3H&qmczWDjk5Y!(s)VfIPb++=d_1Xe*LW1O z2={=Mf<$YL*N>NsVv!$XRv?pT#^mgDcmHVTqAA7u20c-bdtW-0o@{$d*?xA;_Fug|+&SAX>F|n2 zS|a?H^eDK5C^0WS5>xxXWk{X9{TByEcZ@9Tf5330<}Wd-mj^%YAMp@kWG!IZyLaPH zKg@f2HuEX!<&q$KSa`I~u_%ndy;l?QJ_y{}lk8~FR1(2ZR=g$Dm%t}fh%BY@8F(l( zyO32?&d<)#UT6N8@Qpd+It@qR(4WY`$EtLda3$qyeq7SP?YCI(AbW{K|gge^=e zTLU{5Mo#TXu6iVomjP0U2C|+3o8y=O+Bvs1lDa)gP+n#S5g;v-pch{P(?>Q5pgGtA zvM;_et7b2W%$`hpS9U-zapHljVe8zzGya6eGL$`eBtE+QL3y7&+Mv6~OxUh`-pqQ< z04X$cq|!8ZClz&e=_oP-?gqqH0pr<2J&d0$LYW)hPNHKY^8_)}SL}0wN)EO8^kU$x zdmsh}z^_I0bAHC_G(T`fPRBTSUikPDF8NU~`Np**kaCZ?5W21}>UF~bKYhZtd-CjJ zA>WqnFz&97d{hLJkUR1xZ&4^;E!_B?%M++J5B+kWc{zDb<25$DBN0)4b&Twy-Ot{I zr6w1~oNI+6m1D@ip~$|`eb0tYsGGnG%s=XW>1aOz`hz}TL{FC3crf2g*oqY zV*YWik{43wkBV@}+ZD&YibfHZ6b|+t!yB-X(3;He>^5XrLVD%{Wj^Nf<((at>|JV7! z30$c^oE-mjiptNZ!8~Me`d^3DrGul>{gX5A;OOkw3#1aS8iL%0mru?6ap&-S|J1Ag zb;bK@4K5fNEVR7D#=#HnCuRfBck@&B?{9J7Jx8y=WXUmOq9!)IiCsaE2p%19UU}JK z!`nJG(H8@C--u{H?@D$olk2I7K@99mN`2|kg=e;o+RBLxo77-`3s3MD$+IM9#!h{7=VjJ{M zJ3T)*6Cs9zwIhj~LiC_T z?oK6}rHZWX>gwv7ty56E$XyJKMK5pCTui**V>pO-Qo8My1uY`zFN=I?xiQ$hldwC* zZjx#Tue{JzKVZ~~? zv(Q0-yrdH)Y_F!n6wk8PH-pU>t5mcgXA-E<<+zElGnPB+5N)g4MuRfh*pj#5xY~{5 zA>31Nn+G*AtC5BarL!#4%=!x~g6EpHfH+=|FUB+)8ZvnS+*cIW@m)I1%$A86SR0Sx zP8aCX+oZGy5wwO+nN=3nvmbP)mzd6jjQ%`l%1GOek`52Gz#;Muqiz_nA&hCw$iM9j z{BU@&dcjMm-_)Otz9Xf+aC!=BHil)J(NliPbMoc7rA116r7lSLg6&Ai=bL0q>zYq5 zC0-RRx6F64Gy;Q2Ya{}M?*79upt*GDBg=_`JOU>v1R#01`rg|Jjg90C;Ta$MtiNnH zq5%CA{ezM9w$1Asz{vuMkeOufN4%ZP_O%mLItO&hvr{F{uqht2J2hcS;y{p;k2xG< zJa@a~td5rCKGDryk4(#G2|=%28xXMKkr1f8E-Wbe2ibKK&o%5{1se!ZpT3L|YVbB$oA zp>5FjoQHa?n`W8gC3n)q@@~!@K{t_44zi;$-@jzVbA8BiOlP$}rJu!>8Pg|`cMj2} zn&V>^NqIU=VZ^K$Uf0Mx{Knqb^d?#rq@fY8WP8~wOpOZucsvYw^E$Idp@Xc`Q123B z;St6e-|z&WgxYYgaADlYPw?z?Y3Ajvl_#z;05;lEt%TjXBB|G17$Wqn+?!A&sWE5L zFqT~T(Yf8#kG-s`CGEn+;x_7l6kdTNg+VR;IV8%W6(<@pSX96%{y6+{oFsmb^+T&m{yhRtxH)nf$c7cMZaTC5p z9QV*~pqD#-Tg6+U-Y1WPPTzVQ)YM^1oTW(TC*}ktMzp(j)Nmk|Ri$!@d^k+qO~9j| zxSN6B<5Cj3n2F!H39M|0*Ecg5sD-!1@EeOHaG$ICUSyOfPra7+SN*o_l#-w7UaJP| z0e^e!$)&#|fo5qSp3WSMLBmith$I*e>KR5GS8N!^Z;R@t2V!5z`8XfEdVRS6YX9i0 z^V7lE51mS=5%?Nj-zBX*Tx>f%JUOD$>E#4upHKkV=Ry=tq58lOVD67!aS+NP)N z8Bf>f>E?{5ttLHQ+iX94*lfC{fKYgOaYZLntz9<9)kec#lQ9aC9E0oF5dFy|xip!m zbS5z%)!<2@#Rm4oyv09KY#ymR^Kwg74}(bKR2k6R+KLF~q>xd;+5QORXM~tk$Ydd_ zHZq}2tfOG|NriSNc&&+&s%9g^2QAV1umxC3RI@q_>J^UYF+a;uiGBG$OG&VmmeoZsZ)1GmwaYl}H@p*!z8~e*|`y<#H zKojw<_Kk9haP=RFl=HvVSYoSxasVW0fOVuBz&?T_(KVSa_nL-pBQw0 zh00DIdScaqne`&>k1Atb9KS(RLv|w6%fmUv6)-~+JpnRBR~RN6dB2lp0{+{3i@XMU z7mSbsn2Vf_ER7Mj0NEw27~Kz0tEy3IS7;7mk3u96I1bFJf-b~tyz0j$oRFvpF&;lr zfHIJ<8}x>y2Y+?^H;97WxSkEH55}E9LTeE5dpM&b3ERIA@bC zYCIki%#f+k-2^C(;TN{6HY#npZ`DmWqab!EY{uP|bV?K`$WisNvvWw5ZQ=(!6KlY+ zZ?xRf(HUOh6i$(eWn!P@z^SVw%ATDY?A#)Uk_7CP&-njo@`(Jz@!@=53`vJ7kN zLEOVZ_UPC-szZrQV81W^9T;12!GRut(A`C<+OsT~c7WRRG0yuYpcUoyQA?mfC{R~Q zs3nYey&ZZ=zPF9aI?W~rk6;y;0s&6lRQ==}+n4pUfvwJLPtDo%C%*OhM9~k!9#Rd7 zr|?eHi&9iF1v*9&c~A|0pQ3?KOyz#G;$4z&&P2WiX|GYkvC7WVfk}DcfQS}j2Qhe) z;|_$j93zbSBk!cJ zHzhCiD~1xGi;W_e75fP`VMux~b+_&gr|8oOJS&zAQ|dvO63z+l7i~7j>Cn0oQ-kxn zYL{W`hj2IGPNm}|;WIMH8|yIxjFxJkbdu-9k#SbHvJVVPx@On-5Xr zMs$tKR#CYTkxM=+G;Y-I5l1?>^@c=M6zIb_F*Ulgkq3qIXQo|LR6!D`s&;#I^*5xO zQE>A%oV;xyH5>bVQq+#&FeIz(W^-$``Dpd#>b4F&ud_c!T~2Mv;#c4M8$~`GaWxp^ zPQUVf4KcDk%dt zL@QyR!R0~8mf-m_eoilF)ajA{?ugqKH-(yM-Osa*XW%f;S8b;naH zA^$|{(PYiXj{gwamBMHmIFKZMp_^K_E#~^%pl-pONxtxv&yX=^7LB<-32>*d&~QLp zFHM#zMld%?m)+X3aj0sT7wi;WI}19fYmd@1vTXjqyyWhTSZ)>8&I;Km?j{yGm=Vha zpo@oR11R>pl-x_1hr(}V?Gc+4dxSKShC|ej0}amB8ALrGxg-t1e4e7i8k*x+C>Lit z+;{>R%SsFoiFxKEGMDdSa}^tUtZNdnG8E^KtbKG(GMZwy|+9Egc?9M zt9BWBK@1EbB$0CLMh}`|2@oSmm!_EQRK3;>FcW5_@`S7n&z__c_+S57WfwY9d9n&0 z>FY7MjLHwI^pd>z1Q=|(5}q#gzW;vd*+*N8o^&VA?2~VY>ElqLh%VE|6_z9{a3b6e zkGYI;^yAL74DXp~>lUmnjaXNdLO+V5(0 zskJ~;3w6P>RW_VTfsD^8KKn_wV$b{V;k7^g@Y)Lw@AE9&-6L*%%$UDyrxzJa<70N{ zCtGsp#z!vuC+$l6vvlSDHGSmncZaq1=?;}!?fQbG=sjFAaHTvmmybu;@SZNMH=9eD z>ju6diLSINuqEgQps(#pJO7pb*JxE_`^*iRH?6BSHAw>~B3bumzI=hcu!hmVw$~Bs;)B zr6^g7$(MqNCE2=R`pFDGK~+MU9}M?K_0V-?pV`aiJJt!Jt>ixhyT&?<(^rr!$No*k zN;12`*kO&__$?-}T3ptNe~bFe{QGta*}Xl>&N}=!GqmDkFYqSP0a`CblXPP$SkQ6o zwz3GUeLMyE0Ow*lCLg@FIQJxusJ2rSy1mVt$kfcB&BQE|zKuq!d^s`BsL>LH2uavLsu3(y2a#&n zS1Sm`HaNniflVZPfI$If|9?Rb^s2DoP=|b}yKBzmIu;3?7tmE4WKGGW z8$$WcnIAqJB##0a8z&-?BcUJ*z3+7=VK6WTOhtLZ4NtjfSS76VuISFnM(}ZrP8_jl zaa9%YHn5so%yFU)>G=vIiH0=}BY3=DHIWVx#1j@)(BJQ)DZNhRc z6MRXZMMgoi35$W4EnGAPJzROe5!9g&<)d3?5;?G5xV`F#6^cE9^JN_A@obfQ*ke={ zUvjVsZ}zsVkZ|V^tiBsFG8=opW(=H@;L@M;Yv>8V3SorSMkszt zn?%0g{v=E&w%BH$8%c&4vVF=hIrNRZ0w~fqB9|b7n$b{py0x(pC$#_Q;0`DTXHPZXsVEA zf7&@YDsPoITyim{Bx95bWqxanb2D$GB&oQA<@Q3}OYA4<_}0rwgtkHk9Kz_w2&1e~ zbua-z`jX*EvY8TI~`v%@ao_hyhN#dvK4Um!YOG2>N(f^T{Sg{aPl<=rqKd7g8CF`m+@VzB3Z+ zCI*{v!bmJFAE|LUVQv^d5sR#nfK92!MW>O^kCQ!9yx8Vk(h@1^BLg(Vq)SLG4vPyj zeUOU#GpaYxmwJMJu>$q%>|Un<0XMcDJG6^1cCM~&cnW7#XEUek+>?;a5dmO0(4RG8 z)95DTaP9sy5RID6_d@EF+_*ERB~^!U0R!ZtV?Y?t+c}9*8POwWqE?F*%^d;mASXw{ z1){8Q2dawUp^!2HG!%%4b%UA1u=XkWgJ{R72g86}Brha0hUpPoXuAQW^rHD-nR4H{ zv*}eqXGlW71@etK*wV$!ZqLI_Fb>!sv^&^uX(w5|%n;qxAM5ePQruY5#6^U&bV$KT~4;jd}w?W%0I) zWk0`ebwd%8yptpQ&-CI+pC5IAzM$Wr2W(GAHwDwL#$LY-53rz1$6DRX@Zm~Mc60V${ zzXlfW#SZ+kbBefqnGw!>a$XkHC*t{AMfc!i4X0?h?~W8eQ@;R z*f`?b8|wi&iq}l~V|FMp$f2&z%~g9y>gunzAADr?s66G~BOuRCM znX~>{1&4l){gHJs3o8qA9VWtLztL44!^&jX6uya`GubB}6?YZP9h6xV;uge}JCUFO zCJ*8*URe3k>y=^_D>N%c(zs@dvD<&JjoV%8b$D9Jy%N;Tv1^&4+)H zqj=BbOODEhEbvV!#9Mse1R8(M2&&uJ+jiACAFK8@YKVNKH^KgYRdF6xcoO6upfPi_ zkGw}O;YDR$%T{x=e~)UunOV)tvwKwY%$rrs;eD!kGP9bO_Zif)nS(mKPc=_wR&#!| zbMgxj;@MT`(~^?Tojy+l3bhLdYqmoy(q96^Rs6ZaU1W2r=t{uG^PuwHb3yv!JuN6h<(VurHzTP>}eaxl@=w9y*KV2Sv^Qeg?=? zawQfkclLPUP|n^@+O2uRlC3jA&*M?h2_}5#CG4WC>Q9E8;|hJ! z(b}yJ)}`0xkH-gl=uv#u+5h?V3AA@`e6;Azc^!xSP7g0mhov=_rxWc-<_wd=*c@SY zy>V6s-orXcI-w6Y{v@Jse#}5iBA4JP)IBF&j>b=2urldgOG$J;u84hDY>&N1wKw_%LOOXl3(7urZM%y0MIO-wNxPv6H@t~3h z+tG_^KBz03_?A2?QUZZw9bK36PEA;0+K07n8LgNao*E67X3kwT8o5;9g>F)&5$M;u zv{KoTH!?`8(^Ml)3nd6ohbDr8LRquPu61;eWkMX#G{pG=F>Mz7!2O|T8MLe3cx)~> zvN7GP!cVJ2PQ)s=KJCb^|=cor~16I_b3GXidBwLC!EKZ=K-mE@uhP zH;#4uz=bjmX_hou4jwth?L@I@MKX&~cP>N~3-`E8y`z&B>}j@8oH>?_8+EcHm$H0r znJ>kWTcQHpBUsM+XW*7PF%faUBU`%@4?66bLx`LhX95Qlhj*n>T9P1vp<4<%2PXv| zLu?zhVqi1clZj=ad^?i9ywzIAZN6*J@I3D0&7ELJ^9Czq)t@GfS5xIpcNbBzvJ zVlo{Ce&qQ3;`PfH7jI~<*jCjozn zLP1 z0+QwIY#eK;V?kjegsZZg)|)INtuyG<2HSf7;Gcc9Ke&>5|Dh zj>kzD*!hB;@?sb>W6v&xR{fSpHZ%DJ0obyyGBg3jAd>LFkTnAvgJ}~%j;zC@!S}8+ zeguhrCJr8Bmm^WS0zJVqXwaGIP7@1rL~g8T^1%>SftpEjo*GViT~aT{ia`J$f!6!k z;Svgbc7z76ypYxtYMh`~?L-g|KMmieOIfDWmQM>@My1$VPULqbSq2OG`*o&hf*!!ByLhmf2#@t)&zi z7@;yffK51z6|1Xi`d6of!NCMQCo!hHrZ7~(2;#8C8CiPDe(f+@xlPibRCu0h^I`8# z2XGcc4rUGVJs@s&gp;Avi%lfH<2|eEgF6YUyaZV!;CqAt98`QRawXDQ88cG8Gm!Vg zb!vD)Jn=^L+{9(l?1mPx81*hFM6@`u5S%%K{Gdsks_UCy-O>mM*V>{;y}F`6aOlO8mj)Ch`c;hMXSI&zuOX2ovn04x?muX1JM6Dm!~K;9O#397MrxXgVy~SdFaR zn0QH$ul%U=An`JpgjMR+W{tEevEcOa%9Rp3J7)(8bnha&4(dtbrsZ%zDt(?hh8Q*x zKe_3I3#RWAz}L`fIm4)r5dhHQiX@dWkVt~4$cK%Sm2dz?Zi2EMpEF4r03e>6Z+J#7 zWX!1H(R^giM2e1(f?3)Y6-MbVe|D&+$c@;P=dsLDk6dK&)?TI%_ zks)EwoOE(4>T1$+8g+^STp0F+w4&v%J=QbKgm`^(r=vSCFrVDb{on19`t|P%{>}0K z&KQ3_rj7aj-)qfQyH)W2Znw9-`hS0czX#rPv&^h8vCB>ZuT82*ewATj>8#QcD#8D4 zjBjh6M8^oA+$*@WU8J@(+X8tHN_JfKHh#mLGdoao0GVD_j8*z;)tDj8<2pR9^W$2+ z4nNA%Y^R12Lnf9NPc`_p9I&<74JF0UjbM5DvVzKRR3vn9a#}nt>F+4501`% z=4v(@Yfud~-dt~Pde!qT3~kCk*IVr=eQi61dKlX6tv8zZ9GGZI4Id1uI_rrVzOu2%=va{8`*8BHsd{pdQJ#H9XU#;1A!m(|b)VmueEvU zo$S1-@f-pVgV!_84jIn8)6+e4H{+hRwi?ZK4qy8*oFGf{Jbvf>_)6aPe%RZ~vSgA# zV%x)T@+Jv7fiKb?%md6T{0t+m+&65%sd%ll;^tPPjTJxeb`?_|_gU9Dfe-N6?CtMb z%1kk%-z#`C6_Z%VM|!~t?l7tCvJr^)oB>g}%K2A}&jbgb3r;0v0sP)Hnuw9WqZy!1 zQC6v)33w`Ea$9Q~RR<3nzCQNet35C@ptQ){kyt_+!yB}%2+C<=+^9mZI=CI0GjFMlysftSEu}Q&L_4q{e-{u#=}SaX|vI8@u!E4wKe^1?U857pD+#0m0x@4zRTseTKZeF&E@gt z^Iq<{osf51ZTbW^>%&d{wBFcS)8F78&X%{Gkn+;&R;$sHPaBPiBYONK@ zYY(KaYfXK3lUJg(sbhlQHsCkhsB|lM*}wm^jmp#GZ8aY9^gMjnc(|dTw%Uts)JKg+ zTU=_3wilOQ+qi3^HhEGvfN`LjT5I-Go3`xyjVkT8+l@!-^y!gl{}D1HcWu=5wr=kY zQ_897;awYbLpH^u#s+WMM~@oo-2WyVl#M$#>ZZ28+2m5tKGoEM&AZvUbE9(q+Z)st zmU`IO+~QALba*S3xhfLNo2~NhY>cDJB?EZWYA&h9h3tI@f3#qAX6qMfq}*x92jabg z93_2!poAZMQ#?mbzOKLJIa#QQ(3`kE%ZC63A*zq&b>d=+Aqp|&slm$@%5 z%5yYu8;WMpYK@SuY_E-|sVYxj$2r_}d;DwODzanTc9!uShFt<>atfj!igRZg0>K@S zxR|y(Q1eP=oW%Yh7swYh&+;20TMO~KAF~o`bvPRzycE=v#uf8dcdy0T!zL}p`d0Ja zt6{w)vR=gm5yDn-cbTf>O0m0hw)=x}VS5LsJI@dI$$O$kCP(y(8w}9HMQjQ}`LWlo z&XbTm!{X-S(a{bQH^9t<@Z)t#&tMnunaz@t48cDwFT;3m{96o9#ngo2iwmoKb??yhdSL{XExl34It~=m zOa@_UTwyR*%A6^{oLA(v5Jxua8O=m!fojVnD(5g#J`s^t`V&m(9^IO}t?Gb~Nt?*( zaN}^|?qc4VcZmTtb%>+TI6~J65}?VH>qnd^9l5%w5}F~l!u5c5Vv%Apl4~n3xWZx1 zr#OKd&WX6?m#d{gpZ?RQT?qjT*i+BHupX`ypUKWCu!#~INy8$sac6;(NLkF6mp7Vk zQGn;RzcEQp$XUSbmi#Oh1-H9}%2}c#W1Slp58YuZCuOKk6uUELy?efK008U^)!7RT zQ#@T{K%I?~8X0u5!AphoUYfFEg!WHZ?%S+}NUX-aZJvPd(Ur?<(fCd4pWkJSjklQX zWNaJ?oY+Rk@m9xPm@a1uF*?a#$xI@i=Ca3*kK-NTSGzNT7`jYmea12sL=Iydjo?5sDMR8#xmrs_x@ZHN%u z+SoKYqKA#vrp{J#ZN3oQRvp!&R%4Azt;3A*+-Hh#gi%oW_uxB)$D`*36Jr@ zhxDPU+tym7#bF)ChFPNae9aVYHd@&A^@pOuYi+7##3O^_+{3rACT+D~1Fwlbs->E- z^+$A|=NvTHn7r*b9_hAU-`rHf1IO#pqq&C))vX(<#aS~4RaD5R%*~h2wGU*7#=6;j zDEh4Rhi&J0Kbo&XZNae>eb~Al@2xGH@>k<0X{STdqsE`9UgKwO94xwkpvA;x0a_>-0 znqAfeaT0aa0x{r6W@Kgj#Fq&IaYD*iYAoS)q^I3mk1-Gay`9T((Bz?Kd#LX3959~I z6@5Z}I1`C?WuxsV6a!x(7-furQh2c&yf`9?i_>=fcNDy zrmDH`5|gdpn@OjW$Mf^&V8&H%McRz|TGJd75#gC4IMFs$(S4w*k=X35wZGIFnN^?9 zP`e9h{9=tZgToGhss)2Ebz62|4JpJ;SaR{UAjIxZwbg2ZT#x>qs*lR3CV{e^h<8vo z=QlMe{7%6*p(ve1oV*eh-@fhD|HN6o?DYVm4iAPQ}G{WeX{p2mB!j;-G!~^5^ zITpN}D%QN%Jwe|0thkkUEZOwb9qs^wj)m|)YiNhgP-61Xd+IeGdkB@)5|_8f-uK^! zH7DDAh_3LVMjXVG#Ve6)X%t%(W-{2DI!#`47g$dQCW^ALLfGM>%NP;T4b(n@aHGxj=gy1r`Tpz8;+RW@ zc_&Nke!9oI^DVbcV~$=&Nqo+`YFli#*6tK!n<^xMpt8PY>n(p*te4&vwJ=YZwdVUa zoAl?tt0MR#;=<<%v`rPZpj3M+S8ws%O`W}V-m+WhgNlP~Zei}b>+9Oz&G~#e^g&%4 znk*bH^zNF@?@Zygr3wg7tK%QRGL6s>k$EOh0Q#Q?cQn~>b_XcVS)8OM0fCSyW)y$XU% z1T->T4St0fH0L##@YU9M?bXit$@$>*KmUHVb(#L{_{Ztr&fA^aAOC*(``dW06?JdN zJFUO3ZMGiPkf9#?CKsTG>t)@)D1%YLu$v|iaG4J%vM!jw`zpZ1%5{k$iWx?Yh6G$A zh72WcqT8+ymm$nm{U+>PrI{4BtxZgE+a3DS1_GC3khiLWXl+?Jox;{8RFu!jL*^DS&3->1TeZcAV2;5Zcgnuy^LCJ!~ zFhC>VF_{O-9uekUV#?S&G*vN{0fR$y1#pmJVd38ma~khXlkqir=)e8ny!aoK1MA5x z?4{91g#gWu|7mV)tZx+Jf40`zU*mtiz#rm-lDseL%(o-a$ka0d3@U2_*RPojQ zB%2~lq17pG7J^bB`ZY-3@#L0bpfsjIlaIlz5wfn7k)RC3j!4|7iL20mJM`*w)RBy4 z{pyeVCx~_h++?#>k>H*xze_8m&zp@V+>D1iM=#HJUhbcIyFdR-F(|Jm!I&ewctr;W zq$;K89R-oE4B%?(AmWLC8E7=HMz-!zRj&wLk`v5h>?$%V6~Eu_*soR2J*Ms@wF)<) z`Y02pOYeEFPY!E6itrcf2yNq;?{wDL-MjK-jpLoIw`M zU1#x+sqV`=uQgyRvj8u{%;e`@?(FpYRnnKJwL<-u9!WdHT?>A~6Y$uHjBI6rv2spQ$gtNr8iGhkup>-pt#J;?=L=T>y9~|!Ge>^xkJ=-}v%>R6N{Iaum z{L|6l@y?!id{m)532dK}UA}K*3$LoG!h@sT!}Gm;oCk6z(R7!Ht6iAam$3C-6HIz~ zYYqYXs&)F|q*h6Sw5(h-Oz(tR>$bJ!%w}}=g$uhcD-4Z%DFvoGM+f+Psit+J(C>{#KnYj zbdKWwbQsvw1_}G{)u_rI@z8Gk4gnxUOuCsMuqM2FD>5Pa<;f{_ITi@XTW$XS@6Vk8NrWUqBD z49SeZICAVRiO_shVRk0pSbyM-R?CC0KH0R?|rk=!C$5497uYDy(}b>UJl=jaR*( ze`F);CcUVUeEi>BCY~ez$yrDH=*Iy-+>!rpbEDZV$bajt=2!Xe3;dCam)03Wje{&D zU@FF7OHtUv6mJ?-fL{GQr=UcIB%Z`JvmJGyP?IS9P2wSHEP?)Au{*ny&vkkEzov+1 zMM-?vqjMm)fQ7*2v}>Xf)I3qxyTo)$pmQP)J8(>PRhxdy@qwpsWTu|v08e0ny&(Zg zAtr2>bcy6nhRMmM9mJpE8KvgwrY>MCqzvRmO@c z&f~aMh8mh>YEFhsHWq7La3K0^kjN)WcZDA?&zEQc;Gd@a8pZnFU?86cn7W8qwOO5){Pnj* z;7YpBIoXsjdQ_Gs11liSufos0MTxSn!ADLPIm^s+gh0t24*Nwogs#Zm=c83mP(Y`x zITSa78(>HgD4P8vM#vYi-DJq9(k6gpnRgFjpf1sCbRZH0afOR*Nn=a?TKXD!cwG62 z^A9&(0~5!i6&(JPqEIA}9e8pk&~l=I1WT0P+w!;`uQD47;3Pd=!a%45twzf$*Z$=c z2}%TKkyEw{9-Q}Atfm1>iZmuDg9MhTQ^Sg$F0diV5W}cszJsLaj{^%`@DJ=zHM{9- zcd(QHSi$fASOI4DA1hQf{0ox<|M|y1{;^_O_{R!!KLI@H-r`e!`+|~^VJEd)igj8slI5C0IN+>0kDf(&nIvMSF50_+@2 zhubW`Bv%2Y$h_6X`G@MjXpR_5o6>}?ATJM(IkPxn!ojkjh=%SfxI=La#J^IVPIQQJ z%A5<5EERGKxTgkzn`uD^WxFb{lgTP_?Gy9?swrVc0+b=NGr=`n0!vO8e0{v2WBD&{ zFJP_=6@34y{A;`1mq5J;aJK0nl=wN&O2D`&1Ps4W{Nca6*LW47l!MPqdMrGqG_^b( zi4claofd8FdR}Xynas39D0x;1J39tYTj?Y>g~O0NDRq8l6`W(w2Bi^ zbOYGvHPi4g?deq2aXRcaPPj!9L9+oH37ry@j`*%+O0;;3NlA+daxLXe@}pdvoKV5V z$hDqY_n(AGwnvf!aZ>1y1Dg)}-n@p}+k7D=0&C9P%g5%1{FnFSYVypqojOaOCnQg# z)6cjca_3|gLIH~y^9CoV;kjV3*>&TUqPzeD!x5m_JiKPWU}816Ril%4d$bHSTrICG z^Q~~fXfcrh7&!rzSFyBJ0%L6NC3O-gyFG~n+53|;?MUUAWeobOlA3ZA-)2{Sna{v1 zrs+3AMWfCrKclCTV@3$qtf`j}YMnO&JGt0M;9a@!X-d?^EwX{KoO(Gi{D+Pu8RYi{ z>n7`{$(S{kd3%VMeAz|r)=^`K94^;)4)_yw%C+6HQ|xr;u1Q{GNj^;nnZgv#6cLh7 zI&GFd&Fov~b}P3vspMy!w)=H3DbS*1+AX6*_nkDUrj%YK4R253dWG`1f*^7AtWYNQ zM9)7lN2XqWrpiS`lopLA=UTpzB$Ot{ayF;toMAMa$#Hf)xBJ& z+(3LbkR+6XSkc8eYqME+Vb6gdKo6+`X^_+paMP~J3(g_Xr|`agK{lfNfWmD&T3+V7 zsG9apNx0;=at7eD1c$x2U~!e2lFwMNd=#mfWn4lF;U==HAoVn$Cr8I;``gT? zqCf3f2H(ED;yKN#uqaI%CSS5gpx<4+AB+*$B4Tv|9}-4s_xKTqjJwWU6V4Na9E|SA z0-41j!u1#QpFROTRo53~5k;@#+2sLY8(Noh(-j$D%FLRta(S74hW^+)6jA$lo5*eu zpYk$Bu&({N4C;LF43IPC5s{p2R|d%68{ei^cs5B?DS@x1syb9v$5cfKtA@{XRP(pcmV zS5w6m(w}e|U22MTpbak@oM1aOnZZbk8u z8!Ec-RhCL#FhAi9W6GGygL#8MwQ#0(R6r+=a#T#VVH74;j{X=Y7MjP=(JJ4l5F#pc zv>*dPFxhho>YQ0B^SgBB7k>gxIgm!x0WcbQv!udMW-O*CY%OBvnm+yRCDBTb2)^3 z)PImk^@RJ%_C5+q8pi#A`pZn)I~-@maKP+zVvaj)Akui&O=1h*Spqy8a>ba2CnXKT z{w*0V>5e4e&{YJQOr{oB%P_2}YodHIqVpO9YnCWm>>fEXb|;zBTC<48l3qsCw#8fb z9(J`4rV(mo9W91AM-=JH<(%fi ztqLvSF3FK2V%~7`WVD-;w|uM86A9SGm|BjG)iy32F6lCwvhoV8;+Zz!zuVC^e!gZ5 z#;8W$kT)U|x=G^{>FQLWHgAMPgbp2>X5{_pJ0#=7Wc6TgKhZc6H>)01E~>+LVmaz) zJTSe5xj+xLx(eIb*+-{D*6A=%wF5^j9hB8JvbtlWuRB!2L@XIMC@F8_n+h}pqn9Pk zR|-VHqzrJDb{M$>!8xqU9A<`b=uR$=W<2zJj-3!q#kqqaBNH^jVcaty0H11r_PEfN z(c`V(pfUJQ5?1&xkX4;3-fX$mZZoY+4@ z#PQev{)=#t#L$|xE0U?T7mp060A?Q!-#L*RRjZfmr*+&LMk)oa6BR%r*w%8nsV{OS zNjG5`HJho}d6A9W{ObkzcDUj*cTiMR+NTw9y9iDCWxZ-#6m>A7Shoyu-wc(9vyeikGO;Td)ng#yBftE z+ZpY+)8kCK30guwxn(a6VhbfNIGf^?7b|#hamr=p5gn7#JpRrQsyv6sxO~}Q2}x^^ z*}gJ|W}-RugX9Z}VoK(DB^m*GCVQ7yzaA@6NZfXCXwj`NHK`Nbjjtp*oam6@icC0( z#=$^Z=7j4|wM9GDMp8=5KD&Nnii0oxv?Et1K0#jrlbe)vq~tyTm8+owy`F(o- zbR*rF2BSRrMTI+L`zr7olo|1w9NnK#USVh$ zwj}&#P$e9h)?=sz%N1tCt>jxM^rrbMyo(tWQDL|ZJ3gx0LLQ=ay?KM`!v9agcZC3NOwmf z*fb&qrV6z(!Go&S;VN`$Sk+aGj#9r{zfd~=tgSLDDAVY4>v1KwC2N1}!dn&ZX@BWf}N5z(%Igz35|9o)PIX&Oq z-9J4w7(0}Sb^^387rs)F;WUDGK6V7r*V>AM=sOlpj*0!=cuR4RK|jJU!W?F3>P&}hdC;{#1xGbh$|WbQ1Q zc-4tmTZOLq=)A`U1Ol2VXZ%YtkqO(MXY&o}U z4ymzb)_ZoczXM->*g5H(p22^1PT}8^gQJ%-DksZY2k++&5{izWbl6p6W(#6=m1+-O z9PIMsyf}u|4i7u$r@*kE{qlO|cqG6=+Ci`ao-x>*9n5HrqIU-qe9s=`-tjpss_DWn zvz9jo9^N)|JF~u-K%)x)i_WSO<^ejm*ZE<8XK(*xR)sKF0sxQ+nA7{23WvoM40CEeJNc!^Xr{$0BR zYTy5PcmJ;bI%d3uYU(^c7Yd9=@y;&W>O0-35M(@pclDkt##0ab21wT#Z1B$WUphbT z9G=gjwKhLJYV6^fg6-bv-gd}OY-UTl$A`yI_tEjuta{lv(}@VRc783AUwD2+H=K_5 zuDW)PP7mf+1Q%{Nvli(}=XC#v8MR11I!SOfZ|(1{2-bO#x)2uQ=g#TD%cGscSyMz= zm^;WY0UI>0SBq2z{aUO(MNYs=1Ztodo$Vzux39EOoM3e>7Y_o*{VK>pf4yw z7R^6FJeE{yf4O+bAA722cmE@;+G++ykJdg8IB<$&>;;XQ&pb&CM$5V!S&O znLQq;Yh+Q-`s`>}h#ztGvTuw-Oq?6WGzx#mg%nULeC8b3+4HR;=^~r6AahBrob-v) zE0U`VDeBn}H1KnkYc8C7h;gW*hKfNYY2E5kr$QU&i;SNlM#`;I$|s}ak$ zLRYyutti26a!BoGl81AFBp)gDd)0XIIrI@49xomfcCJH>xzMFWkRtV(v* z1ifL5*&%Cp6F#iU>?DTM9hrlvl;x9OS485n&6d-HIdplZ#>yqjd_57-m8=#-U|eR7 zTIXN_vox9Zs8V&HsIyUq6K{y~|MKz*|G?ebIhFJqxP0{c>G^Z>tH4rnz%5>gQ|+4s zi|G!xm{9fH`18%`gIUe%^FlY+ppOB=lYpqlh;Sv@RDTnBq~^137<_aoKAWbpKL1#t z;I0=kd?9#0^pR)1VM3^sy0z4+L)FcAUdGmRx8JfUKKSD~?UqWp!EA;bsiR0f%RM3WINJZ=q#yIC@ zVsMRC7!VLWe3Oa_fS z35Em8B_miS$}W7D6dLIU$PmPn&%SIkl=a$dCW*Vv^p(xElugQw{!abC9~yV3O!S06 z^8@WAgCK*?BmK3>CMXpZ$VK&dQ1_#{QFYd-x!N~gb*+Ud#DIhsqDAQh5ozaSM`f`b zs#32ziRS7ivl;Wi%t#eW^Y3*GG@bG%DTm;?eow>XNcZB1I~Mj?HaqPi1?4PDGG;M7e>&ZVq}Xf>OEF)eX?`!Gax zlz~_YlTy`G#xWWlIx$M7+(7|h^{=r`Ga|8WlG`yJG)6mAqyXBFq#isyJIw2;D94D2 zsOQ9(Ab?><5Rr7r6zeh?aG^=K5Vk5kq=nObf0o@8J`M#E39f>E zk3Ndan{CjQT3N%zm)9E&Wu9?M&5Qo4i*CXsiJ|k%5dUZ?COCNdAj3lR5q5kb;%u26 zH~8kwnZ!DfrHM0{sA!rY>UOYEsyM$#+I z$S9Q0co8Pa6vWWh<^%d9$kO%p`sTyt+FEn1=F#s=l@JpOCJ+x`%3|29cVHGkgkZA> z_D1;ZTd2fS!Ev@C3c+CPj)*AHO-v_9haqGUCeV#X;E)Ixg1Ba^01nhWBaLY|Nmk}` zBx&)@=lA52u@oDlxRBK~P})xLXfE=hG?sNmG)%sUsL;p)?w2B;As0gKme>~#0O$sS zkUPXAwmh)O=TLD~DWKfkJ*x1T1hx4zVut&OtJM;FCikgKM{}RGrP)($l&Pl>Wg#N|1S96t=T1bX3D8f~)UmP?6 z(bI;@rq#Zu$f%WQ`fIwsoJ80Q%aD~ysXRj-`bLyd$;M$pTtyL01nkujG$Q8T0z^!X z(z7KD@yw8G9AOp&@;?f94Aa&nGjCHu>@DdWi_ zfF5Vrj5XO67nw_Ef9Gi$OOQJeLJ%*U(v)OL;{#Q#N)m}zrJKQ=-vJ>_XhGG&zTDki zrF^0|TR&m{$SNkWk+kKN|7FvKc%GE)s=JO6(xPD;p(4UmgHul&ug3d8gBLEokjc=E zi8Rp^UPWewR+1cREY1SEC* zY0s32`DfueJGy}nCx{?Ab(-`0BU@S70X3Hf14}i$ow80j{EN?8XX*}=nxB=I50AS1f~zOs$4Q+me|6}Q z1m@t`t>b7N4B(pB2Z_w!-uH8ptzcFAHdQr}7WV0rick2$y(ieB9 z%_^rqN`0_kHzl}@ro(VjQRd373as6y*d(>m&2AG35W*P?(K9p|hCXtz@|Ebb4E_X} zW5{jH%1CCDe86rXC6S}>krh(58%P93FthbG5RDA{$R$En%hJWExr6AsnlTHa!X@(W zq+l?#;=sMWF6n=6F3aEP#U+XA}?1QWJJ55;c;V@#1ATb-}6gxW4; zX1l+(iRL3?Mu00n9s?I`NxxWn(T?cb_Wau(SXAYJ<<5)9oW*wiO86hdZZFebleS2G>+mVxUyrzIRnD|j5 zI$=!wUE$kvRt-;OjJ3y(hwo?Gvib0b65d{o8q9dR5LgO-BhklskI+AhtXvYD;SSRp z8WtX@qdxnIBOkn-*9UwxSX0EGY49eRro_5fv0(O`s4135hd91+)>!Q3Zs`l0ZFIJ(D5VaGcIsQ)nRh0Kt%?EE%DWr(uu#(YBU*Kao0)sg+rvN|QQ0RJp=RE%sY*~6mQq#K%po7lYJogW?iOsClF z@ZN+JqYdvkDzR+*yGL6Z$~AvaEH-KXY0Ew<2CaN9G#*H_I!_#Cg4_dkzyH3~((rwb zBfycM7g>HAsrFtGrlI)G80f~k3k$fE+U#u{YLiZ4M9_}}PE0Y^@Cic(V2$jm|I0*U)`WlI& z6u*RG7iRZje-XTR4|p@o)|`A~(BPlth|C_z{8^?Uc{n6bhScz06@H`A3C=lAIf9_0 z$ErU;E#FXytti(}JfWc^>|x2due@Z03yQ9cc=FhOFn{U(6!SVe__I=ZMgEOAEQ=2- z%4+dS^+`SpVDdEud^42%$AhYpe= z5J*0BtYyxcqadKRq%oP?VOCv*7x$K85O|Rger+fYei@pC1IcbNYE0EnHUPAMRn8c< zjv7?Gu);|4;FzdrwcCdShf-#&@@B9GvtRuOb)e|JbsExHVcRv_tH|`D7TT&WsVD65 zOnApKjO++aKvgzO;pWpF7%%U}SzBQRon%kJ|3a5^&~z$_=jxLkrmrAwU+!-X{#)=a z#WW(U#QvBz=HtJ$HrKa`_-|`#YhUr-zQ7;cTl;361)^D~5Q|?XSX*T_Ox1x~gQ5H18i0!(WYpheM(eh|dKxZAcL#a(lLZld(jV0k>I0_{s^@fB( z&a|x+qCF==I-frCB-DtgrQOjCmQ5Cz@zB2|1s2;Q2CR{buJ%SA@Qdvgx-HknU=iTE7%P24_e|6U&~Q2S^cQsr-+Po`1qz4E7*zW9GX|NsC0fcT<|$aA>Eko#Zp zj*s?Fc7BBoBrb7`T!E&^zS9d>s2;lv3&>ewRkt&N@-cJWo^k1ORlP70E8?Kb-ZTnb zoPJ3u5*j$>rMm{a#99M^4Wz?CY&TryHn|xE1q9+YQW9tiHR1m#pj25e;TqhqfdNDG z)@Id!(P&r&bC)ny8&GROSn|j!vqvVVz_%SeBAqnu;PWb0y$iEPQ^@$U`0B)u-Xb`x zKJMTT3knoX#jX|Jpw+}T5CmC&Xd$L7NM-I=s!K#|Xs@Il*W$k=M3wNoU`APfN!poDYnPFnnn&Bo=wi70-M3^l7W*2etoiNU z;$tE|^h&m5OG>uNOSYVnEyd8?Ayz3f@C%OX72lLea5)|NgqiQYu_AV5By}kZvy!#R z;Nq@W4w3ZqCXKf}Z2}(z)J}7$5ekpz39?OD8SEN+mji`uuUOfXZ7<}+G{3ld6;cf- z82^r8WzdQCiV0+6oE}P@)UDei3~$qha29$+J(kdeO;?p>i18CR_W?zynR zQS@8X?O^v4Y8Hh-ChbB{C98D0W+`QvE!hqx*gk({T5FGqT7#KjFe9a*CqJTtMv`|%I zZS6S{0Y@7PF0C9fjgga>nIa@XM_%o5_OOO4o|)XIPeVDf6yptyO!(wTPbd=E9V3-t z&|@YBiw%c*O0&uQ{L;hSz;4uyq?409$sx~dK8gXIu&`*-AgEg?R*VZ?)$JxeFf00y zH3ZmXqfujH94A^-5}~w#wg$oZWK!E|$kB@3A53CGP4k2Y*YPApw+t-8cOo z#aj)}g2@!jF*8Vt$mhZbQq5-qy$W0gg{KqB!XddZnMB|_9&%Elv3EY{!YcfpSC7U( zEwC!uDIE)fg7D21<&N)kcb)!o4OMl#B``f%U{3 z02emL3W@gugCLOU9=chs7|$vjtD**Loi_Dl-~h3R`AI#_ipu2pFT2<=l;vn8t3V*W z`6eK5G1w|_oXrAd>7fIyB=%(JwB>y+T)49vIqz_O7lntbd;sr~%V>}X&7Zlp^gh0~ zLT8jL9IT6n&M-kZW_o}eB^TmQ=}M(6K|=Zti46SHNP?8}hE|u%G%l@pORvV^E-&PX z{Jd0Kpv;T#jsk8{HYk%$rh$14b@R8od^9lSRW^Y`r8Iv76yw|tmHhnKjZDwV@+>%n zvp8PkNL_q{JH{Ff;Nk~{KV>N;&YT6E9)k5Fs0_2U{bc^BA#SWdtl8W_W(9T#A^V!1 zre*_k+wmSS4&f^jD@-|IFtVC8^2Cn?L-8}z8i?;>mqJcs@J8nJS0h!Mq<)FFgi4p@ zlJgQ0G9rOX^*Y)vmuMUk8C7}uY5$yd?Qpk|e{XHIynpEjN(bHN@1EB*Nh|d`rp6n? zcx`QVzNxl{o9p~GewbC8Q~Wgb(Sundw``|BU(c`! z>=SM$&dgMQ=DFL8jzEi7PUuu|3Nc3F{AB+dChrF}$*Y6lN8%x~a8xIWidOm~k#Cl0 zD7qgKxzKMLt6s@SN3uJZhx8}EPgx;HQAonzu$Yyl`VRXsOMX~mRsn8&)RMh7eBnLW z$S--ST6PP~KUJ+oPSpan{V7is_j{pE3zWe&!UaG#PzSYTQ0CXf* zxLC`N$+f}?hq>=w^|y04ge%_9uMTS_GDMWWFt&b(H{bA9r5m&oF#C0D;JZkzaOdQq zJ6dM)B<_S6zG_dsYHJi11Um?>S`?{8pqt6zQfC;8_wsUr{uF`J4RSimY;u?v6s8f` zR1B#CR+!OcqaFh0g(B*Z2G(8mIx5|XSB4S@mxcOrpAmRtvnZ(f8KJD>h~1>K0TT20gj$9u;W)PKFk z?1M066!1C<=)$=6CxrASzIi3{i<>pF8V*E@K4pr<%%MY}Ai0a!F^yvoCUcJOFgNU|?MR`g|hXDH;*TEspQ6gOGK|f}IYPT;5_#9`FQF8bUv=6PoneSHFP|`I}?^ANaq2 zq~Txw=G*_**0$E$Is1QWb8~CstNs5A`~e+)vGZS&w(JMY(Uus2ItS0Wi{Z$BC6}VB z_@*8vb=^GX#X7!Nr?}Zr(^i4T=Qa4Ye&`(#ayBA%8fN)FXq59WSIISek1|9_SR!_979BoHw+B>`p+9cwi@lP5E`w`0AT0_A@)b6`_pjn_ z7bMvoQis>-g;Z5Id;QoupxtW_{K{eXI2y!cut*DTI(8cSaXqBHtX0;zN*rC14rPRh z)(}K>Qzdm+wq$q|NQAX(F_PJn@nBC6}PgHo_Gq z(xC6u=^b(25Gv?GQsTlwD`83M`+3*L!h2`nkq`I zZ=7!g=%t93J9TlA>QI&-ed|)LF6FSf>~3}YFMd@#3^wyO#p{c_&*z~BXE&^DR4+CW zj#7{4pL`P2XcNQq&Vc5l>nfgHuF^|wMVry-g1zi^USw{h1u@Tf@q#hBf9VGuQl$}{rfT}OOMIdQl6=Yz4Jq3ab3X0`7Yck>+)>! zgg_V7v9Uk#FUj~G6F@Zow*D`aCOgHm8{@2Y`}f@a5*mt-^&X!3Y(giYSZZOkgOB6xJ<(%aPJF(WKVJYhXg|0DM4$zxvny@DlFl{%QikVG2_8 zBw6(%e|U?Z@MszJrfvkys${Nf!5wk#7RL`=nGmBdPQ;#v99|uDH2o>ZC=7nPIaH@Hh8_Ui;8=ES1U*(OxTq8o#s8J|T&#v>5b;_LQN zO%a{$Nh9?5H7b=?VUnuC=}2~TFW{q%(}razNu86vqF*8t;8IY zT>}o}zm!%20r6hWsavELv0Z?XxzrL!DLlX3_k>|n}kHjamgeBEE+ z>uUvN2a4)M#}A5#L(@F)rd6_~XK|-%A8GJh@est?Vh2u#Ui;s3DX$A=F1L}?(_wm5_W zA%`(*IOIruLTHc#x+7r1L!ea?e^_}y07;(pjn>{+^B)#lkzp5-6IH1fOYncTgS4uY z0*Z~9p^K{QIUF-u4k%61*zW}uo?hcd!*S@3t?}n>F~C)bR4P9xKrA9JB6vQf?voO| zATemCnSA!3<#7<5F1cq4XYlK%--E-?kgJDD6jF>;V2FKWc^ znUiAP7g40{PCQ+*9L*=m0@>+WRMj~F~P2MCR!ImLXWz}*lZ7x)vb zoY%e^q&I;{^Cl#c^BaWkgg(=C;gcB>2y2-7%!#=(3a$T+yair7T{u(UI8!9Nrb;DL zpRrv4Yi1r)O-LwN1z1)=6q|TN-4Fx?3wnc=K-x(o*dwa6a3Fs3pk<6zXQXPwq$@^J z)g2N+fR6cf2@bU--5PDgrtql*a^kihlih8o5!iImP7q(GQn9v3<1=katf-ObmG8_OCS(74)?2GBUP4P$Z|@+7eJfQ1(s07ydDh2cc4R=bNhe( zKmXrU6JrsoG2QOrfMT*3v&D6dtK|+wBJo!Yx2`#GRSRk~Z&ax}?M%5)Asev88H>pa zub{NEOSCz0HDop;p4>WULt(0+>^1gRt(4p&JbQHF#w7LxkUQjI>$a*qQgdK$$rLSojix5&rnym_Rb9oadTY3eo%P|_6s zmX0*KHi&=y{WK?8wMlhKW?Rl6Rb$U;cDpVG`SujX5BVKfR%C^RO;)#~?ycjP{UNEN zlmJjjv~C1C{%z54hV_4Q4Z340u?@DO|xl zVo5TUO=%*?<7o*hCdjrhi*$SwxlkpG64GLE$-rbsg0*>f0xLBJm&);!%E~}P6oTFb z8vlbcSXo_6CXW?E^Lq{?33*G<0>K=#RW_5YfL3YfA6|A*a0voZsG^bLa>9U^f{2F< zV?xj;fFWUfiQXkCYF zjRhsugmSG}&!&tbi#RCOPLZ<%@?^u?MxNDMh+UK0imrOq(i7##1jwq+N@5l4*2&HU ztE;$fk5vH7*!~tXHUkH^WMWh>*OZjNYJu#aqltFVaoi`b3DhQ1GJ{y4a<~Ju?Xvup z221g6W@k)-YwENX7R{6uCdf}urY66VgK4TfMpfOBSlfe#|E}Dx$c&R$SMQbrZ1v8F zOj2pwg?1ZzB3#L2yEwtPJgb@))PWdL5R}NB7Ix3A7iv%R=wa;n(A*g&xqwMACh?m- zX^2qJFU_MeaD_0s2aMCMqtKkOue%7^a~;3c+fTjZ?9m80DKM_DkzJ`XiD@-)gLnde0bonV4@L0 z!UkC<$90w73ir)6Aa{uBaDi*u+1u+-7J!|zDm#4Q(OL1N;u>jdo_tfUSB}Wz6i%XK zN-u02pitYDG6CLCpkMvl)hpm9W895N*=y-Io&xK&O4}84`c~@oXT0e@#<@ehM@izB zyh|M9gvskXe-vi~ECxgjh6Cf?q3{hE?ZhOWj*|vE;85q`;+T$BAAB=PWR2_m%ZneI z{}pex_pUF0S^e$Z{_$q-QRnxyw}0cy9tAEzi6@LMXl4>wbCdD>2L2pH7-67I=T*HW ze#W`^2sKHz=wpZLQV|7bwGgm|Heiw`5l!#iB2X=%qCi&XBic(nWz{ z+IULgq_Bq7)GQ4{a<8&WCf-F1gA)Fe_3NY-Rvk?|ycS<=sACsF?L^;8xPIJ!yQB`X zR%R3-k!Z38VO^r#MPp*c@Ao@0)GDQA;9Yn8{BQfaXXq2zY2j5#pW5cr8ht`<%}S;Q zm|gGmhne@3O`i=NaN=n&cCBvnBSXP^CxZJv1VfF+ThreK$qFoFw5|1l^&8S~t&Ww_GZ zz9M!^Hmqa>knJPBy$Y5rG07~qtN2Z=b+CAcE5Fj&6zMl8 z_-H7ENkoO%44D57Xc>)@v_<};cLgUrGgM?qONR=Sc$FMWR*k=XrWSGH3hF@7jH4-& zO7@!j>vb61JiSip?Plvy&8$Mh@l zq@JDZ@4y$h13Ra1dv$hB;olQQRlZxFO1I)2jOG1i2fG9#4L2ruOO>S`q0 z8URgXi(<`OWbPagTo|!^&`kv`O&X0=y{w=U>wm=xR-*ca%F4BV#_u3gwdg-WH}g-J zyEe$=;6m4x^o<-$rkI19y5lHy6n*7EI6(WdF7V;O^OK#EUlj0s&jIXt0E}EXxF7&= zW>bNEGu0-!EZY*^Y8m%TQu0tiu}k_aTAR%LRb>K&>m({$K7;P`p%vyv@s)Er5Z5f> zd%*ek(S6P*uDXxhPwHQqJzr>T?f)JS@DNssz;S*oXl%M*I5>C)u1-0j8iyk zF}@nF{s#TU93!jk=H_}0*(?#_;>ibivDLDd?yTSdq^CnN45_sSj;(=QR`$E}z!{7r z&RO_s=iq3;LuXcuMIGE2oRDH}Gxx2$W_H8z(Z24c43P70jH5-@)I0)2T1fWOVFS5a z3C>-CCvmQA<;ESLP}CJ!Xz0Ar;sJJJkJ-_1WJ5B1{F8S{+FOx$tf)7BA%gc_6 z2!FGvii#}x7PBI2FRZli7PujX3OIL^OjU}$KtD8~M67T5;8+t!Dg4F4PUu2s|8nE+ zn=vlbv(AYW*t4&37chZCxOjkPP8r#v5Jg1M2>yiBVeO4ka_?BGL8iiNKA0>qw}PQh zG#k2l_9^^(3b|V9-bV9nCV)-5h@IlpVQWo6txSjsi{$4P{apKZ#QS8`ofd`K!ZcXl zVI#nKSwDM|2g;v_r$xjuJXjAs%2Y#fem40Dv2}tcO6FPgx^t8r^n4l_#8Ja`Yl0Vp z!X9eYSAS@gl$irib|T86o{UFYF6c>=zf~~-NvM)B4Sn;?H=NamvIp0HawfMv4*EVE zFv1397MW7FE-$+Uuu>=n2g%QtU?TPG8Ka=AZFo%cCLk<9%8stUpsEt&%0E|k;Lh_!9J*G`XL?R&>B zyt5w;PCfYlDW=k4^Pg~~GBmLBFV^yRq1KPUQ2EHIAqjZhq zChOU_NftO?hUpK}uD8QpNeeEb-;>aPKI3NN0-+VU9+5~+#Fu}p zr|_yNj6@YZ3r~ThxaHA}qS2G5G_O+Pc=r$pmD9f%NL7?lEAq;ZA)!{ErogYn-j0Nz zy0y)7!`#(y0{zWyuhkcR4h(UV!`Aj;%j-?vSHAly!2Ich!NKB zQwmqa>Q*wVY)vW#OpTVK&fcuz8r1K58eoX=b;F@#;sJJp%!Z5sa&HITI+@L*bQ-2i zx}7j9@x_`IZAEZ<)&f;^olj83Bq7`ydQ~38txq-b%LWeR0E9FSqVKecRc7La7#W8v zm)9Ntx_UhuU4$eM6Jy{kWW$b-Uxo+JvSB-|i=T)qdH-+9Ea8t~G<5f&bF9Gy)aXC9 z`_?%|Ph9vU!$C=;LS4XW{eRwixs-S6>+&Bw9O(oG5oT){_-V^2pNzS3jU`)(OFbg&} zrY6<4rM#+13beureO5Ageh9j;j#An!ao5q(uB<7WgVv4XV73=p9fPkq7z)rU&b5wmQ+yLlFy*R62$ccm zNG{f&`$;1h$OQl|3<{7mO2@(^6^lPG$~x$#Gi%=%7C|-*xilM;5RMeR8ym$%uvr`< z#q~c2#+&3c=oKnDRtfp`Z8$bxM*eMQAc{SHO3Rx44NeBSf$^`n^~@7g+QQC5FW7qK zfZ)}K_SIa-*(6Ov&3I3!8lT6b!QB`OD606Lju|Ie(=_mS1V5IniB2*-%f#eY8uiiS zLK5`LnxfDX5rIJ@LtW}B^5d&^Pl!ePCLH#As1}l*n2O7)H4#&}vNY*%C9${Rt?JSv zAy*EPlO}0GKrn76ag|PZyk+sJH&q)4Q8Pi7CZmeP|2g68*pF9!uab=fF+955xi|DS zPHUsu#ws?oHSgLrU?nBiRM+8ebI|JSa@cpg^$ZF#+Av~h1=T#l>9zLD;~lm zpxlPusK&`ifOox@`c|$%%)C-_!xD)*r=%W=hM?A4SLPgw_c&_LiRguw*^T_c zC|7?*Pm2G{zd8ONRuuopHsViBZzrbuukLu*VdR7)Ja#QR{y0MU?Z&-Ci2fi1Q)I z-3q6c({@ShWLElKUOqZLLwr~iwCPS{x!XrQW!;1hhADeA4E=u+%AtANqAPJuVQAzO zoeI!z+~SdyD%d!YdseKsPVu&hnHVEzZIFzbEY6~<3a_dtXW$7b5G0}+LaBYTi_$G;MI4FuvXI;*xQJ)&%kl-DHBZjae zvmM~XxEKL$>(z|L^K0#rr4%K{smAA6*^9QVGY8a+O`qkM2P~1NQ7&n;yh$*Xurzap zyEpoVou*)MxA6jifAtDboGAm(R7&;edEHnlm@}r#R4DNfxQPfRLew*uQ49b=8$n!< zQ;Zg8%`6H5MAgCxN3NCtSQsn}i~Fd%1%VJ`w&r0Wn0M_OF8=yFjD<5NvId5NiXrjD z6K#Y+F;Xm(3|gkel(JAWMlQf1W+Ms~*WoJPi`rT_veaZHEg!d3KyJZ2G6e4qWYiTPwxigzG!7#eynYEJfR%?!ur zAG^2tG#U!9mP`jgu+i6Xd*KA;RuNguWR9rFmV>b#?F4xc+I)$*Xex$C5m&HW%w=Cf zpIBF=GfSn20%}^hV91bcAriwM1nW#7>PSx~0RN<8BTqDzS6oL?)JI)-{P)aaAF0f$z6Kldj~Z&IATlgibWl1 z6`U?eEwGALWv5_x#z;p!pK$UdpcV&4zz9hYB?zSPLUjAY8b+i-^oaMsO^Y^LjGR~Z zM)4u{`+Y9Pa|UnWw#65vHW8PBVU7E25G~h{Dn>~?6MBpN79StqGq?y6h-dz2ToT{QTNN7wVqP-I(g}(*SZNQF+Jt-MW1W+6y24awu#t{wYgL#0Zahirq&tB6H=yFoAGDIB z@i?ay7hS`K=Eb%4+gZ(!dcEGg#W7%ama+|DGiq*gM#IvyjvzZxFx` zEUl3HGIh`wd-OBkjMq37xg;IJvCGX-KtwH9jbn;*g_Q@ z!XyBO6YZJFeut7(bhyqA5!$C-^RZ61Qere^umgeC zmJtp(P(|o@e-;V1?b{)E-_Ps_O|3H&;s6|UWi#GBOG^@bQhCp*wh@Por=mx`qJ)E+ zSr#H=#*9QHqHe-gDBj9lvoJMECnVc~C1zLBM!J#Nyed907(`NsO$mF1+B1MDSV=12 zyip8q3}ZqcOG-f8mf_kd>C&87%BxV5M)_~Ys=!`SN9GN z6H%7hm2^%2$}gZEB+7b037eI8tGQ~$22Wb8EB~59*1zLK$*!YRo$oy44vB9m58^jy z?@q7kPO4>H5d@H;J6RnkO}YSsF=D*HhB1N7n&D&u*)`3wNxs~dpckM^_^(pYB)uIVneYX?0bhzgQ-OG$h^B#N0Ropx32?CX8#1*ct$mNf3#M-_KLT*;;n;FvEpsM7oHsdV4kZO zGV!e!dfSCg;h&moLS~rNbfkvLFhZ9e(^dVmW34?l58hYoe~HhdQ7J}n5>QqYn<-&i zqIp6wi^Y=UKs*eIPn%(+5I?mV>oVXvnH16=X!JE*b*!eRa8=aMs2B7kNDLpI8>k~a zOZFg*A~91$v(KV4rYsPa(Y2>}RgvS3p-f|>=t}O!=hMh21flNo)z<<0hVZt;e#5X1>vWtY^mE!L+-by+8lRm2Xn!trW7puvHB% zIjnfV0riUJs#1xY?SIH6pLO35kiiVetB%>hb1#0ctjM&(7`FzkW2R4Z;Eqf&a}4=-b=;A-?N_kgW# z&$wt_NA=^*;rV{&_0Gx8tNpY6lY{@gzt`E@IoqL~u|hM}5#=-DV%+)n4~Oy+)K>xr zp_6(F(cY1x(h2+TNH)K_$~#&C`VO&p+h{Z z1iT-cNE+VpWQ960f}vAK_{!)TZj?ikxMoaYaKTsz z)_}0bTy|+&jh56ibnL;7vyzK|df+Q%t);Qkw0(!Mh8&rxN--?wEqh0%ENcBSdoy8Y zQfi6<+i`+R=bl=%uJ1hO9^#tQQPLoYEF`j)g>BHtLNAk?DzK0&h#JY6@_lh^jMJ9Q zgj+aUvu}#d+5W57hdXC*We92;srMwt}L>BwfK5R-oGya!t~5>RvHt z=mG^7$63`8V#lcZwUfgM+Ydq|Ks^QP-$idN%$A90iN^5to#^aea?Yw?{_=~NG zIVemV{DdMm;X;k4aHl_$F6mWv;AXJH=^)pu$f2+lIZUK%#gG@94TVDFWSf?y8+8aC zUn6N~sAxo5qOhOGJu`B)bYWFf=!(FL=;}N{CyVJu<(L+Z zFHIaNwAc(Fq#b&Ei^k4LthuihPBTM|G-rg6nvjCzpU`%zJ62yO7MEqus4tNGFcu25 zb)DP_0!r+nKD8|0i?cZPdkDPl%pR?e8x@Lsz@-~G?!qv>bX+(B0cFY+&wOWWQdUs0 zoxnSTXRrNmLcduS1B+nB36@H|oyUbIT$lG;7>mbQ{ni+&OdN%THuHp731lvwt&}}x zwu9*ZOdc{jMa(5pd$p1Qn6aO2Z|`_#t>Qr3H=cWEZTrURDiNcz7A^EyTf%4ZeB?(v zdz+KhVUsjb$p03e-~2bn{%Z#Fv2EPp|Gn1QDEfb|ZLEK_|9*kL6Wynkr~Fr`yymMspyBDqnG=K$6AY6(-7oXU$s~yy&>t9WZ17yl1k+qLuYtZ z&IE`q3k}G*MMV2$bZHZb=X7#CGdqpUlhLTbJWq|dgiY+^K#KBcQq&E@RIWJM$w;^q z1)|G=S7E_fE(f!~=crINPB{Y=r`tWQMC<$%!e*}lQr$m4F%$=mrajh3eG&oQH#;Hu#c$FFtyYHQ>>E`R6MBoe{N z?KhYN!HQL*C#dbk--thFk%U}7)dd4X1dvt|JB}z`*RWy7xMdoiRck3?4_v^QHC&J9 z{Sh9hXSgmfEyz@}rmUf=3d6AbjA<2V79%&nBc50{J_)fUbz2gzX!;JcfrSjfiOs-4 z(gDNG{^lFlsOcoYeP9u7<7vOaV?aik{7oYUkHrH5m-xeWd!xCrwYu@>QFHy_`s!A5 zy|uQn*{u7I{BFI~3fAinAFa3REq`-uv$@r4cAL${IJ&GEFx#7(o5q-1ri$a}_tYQN zxI?$EeJ2Ywzj{0NhvK#=Ft(lZ)75abn@0G*4)F0nXgY^4q345IS?R_okY-j}&05w^ z?$6D^eEs{Fzq$OMrB@%-#vT5Dt+jR@|D)Y(ea-*!MgAT<@XQresqATXCWcdu`%_e0 z>PA>qOisClSYyg^64JuNh14>hLuMOg(jAgTjuSQ+%uuUtHi=@p4iM!MHxE>Pi9AZK z$!2FW%M#D&6BA~TlT72L?>4bxy^g=t%`2#)bgnY?w{dfz*^#IlqUw&eIqX?5tXOrC zU=B}WQtLb?CW|OCCCqqXq=H0K4P)Xd5XQr#4uH0x0w_VSnJEGOaZB$;!=isr& z=l~w32#F_}fsB@ytN0Chajv90MMGk~lE0n93ykrY622?enoEbJFc_3E_6^S6eJ=X7 z)%LJF^3;Gx7Ll*AuG?}XP=VMLTa z#Iw1_&IxEWZc({OZCpL8I8R4Y*q87NGgLN1jlBK1QW5>ttJ|MPL!}17v~z&&7DmQg9ydu&^wN${LM`oV^;8E@a%=#>2)*{5)Mvn{hf%78Jd zMWN_VE=k^^`Z5z)E$@67)iT~v+u3nfmqX+gr)l=B6&!Sxyt~ByNWRCsIXV>cB<=kd ze#WWz)?0*qc7z9p|OyG(E&7)T*U@l09AiIqjGlLY7@?rel9z>+I;`4EA&tWQ$5v{#Fc%g&1= zDAj82IX}h&I@gADOBKtFnQMoLJ8%CHzS^yuJU6 z5%@exm8PMu46MYX|MVkrNb_4t=e{r*L`xM^y3|_I(Ae=Lj4AU^-SYVqkWR6#xap0> z$&n+(_)zQ6rG2h(H@8Me}zym8I>=A^vkDebK_@9U>dnE=Zv9$h$CX(?!ASQGIe9 z!G`@pDUU7YGxIJAb8)d^^I+geQ6FbTEjMR1am_5ip~GMADn@5apV(khm^U&F=m7H# zWGYwKHD~@vqc}v^@!wGN?L4^mdW60)H|L zCHC8z?nV4vMLE%~gz^2fM4y(k$&Lb_+ljYk_jq(USF{%AL|6g8 zN!@uUINUwtZWZ#(&10WC zw1&?fjkA9pia#-XZ<)GK*DL)^lOEPG z!xAJ7g8)oZ0QXtqq*)P>DVg3&@!4v(1R@(QG|kxb3g3Wh1=0MJKtlm`_TTUu30&03gN5&&! zd^*d*HxLVLHNw6#He$$3y29bD*%xC2x6Px0PD!#p;zG5FS&MfDpUwIemaituclV+Z zY|P9>kqT- zpjguQVyC-N*t6WuD|mnMY!_WEbCSC-ZKm|GISN%;u|eQnMAp zZ=9@cs2;oK$PH8+$xUxwFp)s8Uo{yXi z0%1i^rd|be`c$V(7lUkbW_QUn`Zi;MFe0QG^jwkNWTNYwo$MT)9`2kSpNR3E4CMo| zue))nL^UWS0v)C7Fl09}Vf0JR6xDserd`Bk^--5~dn0OY*{=P$7p~Pm>1spcXn@yw zC9&G><+)?6@+SKhis@#Q*~@jj8oX<$?zvWbTuw>tWZ-Sxb#yHn(B?Zi$yxD98Lz~3 z4z(yg+SdumBoJm1*#Y$7unCM!=4f#M$$CdTfkZBIa@EkGg$dV{6pBrICDuzMNnFs_ABjW683&o({;^+s@2bD0r;;=2wDv z3ZvQ|g>^D_B|LqM02MaS%&7TXm37&S*(_(0IE|nc2|DFgATw#18A+wU)0v@5gA;b7 z$!-m|HRI2~QE!~(EFRa>xZaIZ)MXF+e891d)_R>=Etmmh_t9Wv`x{Dv$DxPhuJ$gVN zMP*lC-+=!^M^MeBcMmH5NwOK_wK%1*EtzaJ+7$_aq!Wd?Y6sGQ&SfczMx|yr zABLGg)=Jruf6n9@P|hxANchsIJK(BvOHiAxC~uR!G|Y$+w?pLqV{9OK1LTbfGIqlf z<+fB@A*_j`3~>_9V(To;@68fi#GsImqjN%E)u$vzsQ|CClHkX9P$K1vh|bFX8(k5t zm2TU*L&TxpZrJa`sz~Uq>IL}1Gf-hXn{;4rB%_IB-p1Jq`c6h}sea%F>Lyo#YLHsZ z=3h)J2{Upb1M?cjyA)#d{B*x_dbZd3VSi_D|76i5v{Q0y=yxQ=rJDjYV>>NJ{<79Btf2JOS7*mnRf@zehiW9U^`mUpZV!S|sSEoPjvdT*iYmHcj3BpJF zuv{1^*#-K1MXWEzV>7iSa!D3RgINQtG)RIdDe#?X{8sXGjHn=Pr^^YcvSM$&{nq** zqGCt5mm5M4*&X_#ij$oK*Qf{$3}NP479?kt=4Z~%m1yA99}md)db4R;CIor!KRtl% zKm2cw{@;z-`KUJL>;K!$_4NY&YqRxL|Nlk)2&>7Wurh#u#0wl33k=rfNf+5+Q zk#AlTYFi91#kewE5P%8RE%bwweWNgu?vxWIavn2gtK7u38g)lG-)#gQXNsrR>QJ<< zO;av8i-W~DH54?g_^qf z3lBFW%sEP2dBBMQ#JR?SRkE`flK5%1oY#%}VW75()|M4h5W`n4avRdVd$@CYs@x=T z02cMleNkT-`EPail3EsccXZ=0F_hGYAR$O(WCtsM4}vjvW)vzzMnGC9QD0u=^AHiL zIb}gbkLLx_qQwS&Ygx%Gk|BV8 zR;!WR!d$%b6l)G;DMdW$1}0Dd)@I2`X{E4M?B2EHRoRh?Wo~~0D@P&L6iE3zKs+JT zTJ3Sv^q!5pGy#Ks^hKF~s1pV0YKU5Z{Sa;5ET4rMG?8+jHW|@Wr}RHq)}CqUsE!QMOKVGlcTS}gzR*8|7hpr;F!sjChyA7 zDal}p%7qc8D2=0HCpmIe)dEJncH`f!h>-2bqglKWi!mO+1;xDj(y8=h+gr-^(}G_V zJG|nNMhO4SAhj(%5>xxXWk?EvHg{xU{{x02HGhdwy*&7F|A>d6`B~jt@uwf=Jw2QG z6m@V(kUcCsTIX04M&RD4iTEA_ZtY2SG-w}*D6!}g>PFxbDnFJ|`HU%Jf*u=G<^1d% z?RDml3E!AAu2Y30qrqTRx=Of`@-;s$=`@0bA>!WC)3pd@9~D42ZX8V*R2 z#~cV<)))1<;e9El4K=vWE*A1^=?>#ANS&zk%?hA-XWEj`I0h}RE2r%=U1Nj0ixFpF zHF>4H3rkBbj0IQVYaRRwa%?EFZIXjta6>PFi5Z)_pEozwIY;_fQ6yeQwPFQ6C(lNK z3J)%#c&#|q<3{IM7oo)w#WJ89jrlSh*;rx*FU=rv+8Q)kjoeJxZVJCz!wNIq=fwBp zbR{pO+#eNTj<+k0Nfj+1EF>K4J%%@8j%MX|_MY#?7=@u3CL?%*VhQFxzmMkm`fTCE+_~ZY8;C)SZ%h?`KbfrLV*?sbzle4l^~HVS{dLl5?VdUI`kzCc+p&t86P>Eo|NvHXeS6K_oNczMwktrU@PQcLp!5q)AX z(b&OMO>!`b8hS6;1P;#j-SnmQ*Ut0(mj_4uY&G|2|7edMh>vB#bnbxU;~ssF=3g8Q zVMS8Xm|LfZa$31BoSjoQc3DMQ35(UZsJ5mLDf8ZKUq-z&h5G<@zDr4FR7Y>l7!6O< zj7sKAh@Q2`-K=DzG-%Au0_z4ayQiRbksBE?xbh~zSoU??zaFieK0UL8v2ih_;q*9V&;=31_?3fg&CyhsOhf}(i_8^Kmmn-wjsb=(+ zgsx=ex2d_Z9VHbWs(>*$R6N35j1m`x^k(GWQrzps>IE;Mep632`i|84!s#g^Kg{Z> z;6iXN$}iR}EmGPm^*q8CY)3*q;3Q~T?|gbG@v3O5W%iRr5*S2U(|BIH|8NXwA;s*d zK1uWSFsdu02D!KT6ssGtN4sa-?6c0YAqW!vkQ0$22X31;`3EL`&t&suzel{G%=Wbt zRXPWB(6dt|&#);Tv^zCnN>YK1Va|@(O+mni0SG6DfFa@R^~joxW)MzLr!fI59!Y}Q z>%xMfLy%oJaac=jXdYH>11U_p39X0L0$175x4XMe#7j;l!%aGIpr(mJifFp0ZBhx9 zaoOnr^ZjZ2**XM(k%p?&j)CUQ7;`hv7z_hKlCu;Al@5U#geYqYu#1tP-6l2hEYNK( z;5h72E&-10wILo&D0_*CT#2ITWkC6P-~tosZ#wGI+&FUuqBn;63Zc}=A*4ZCv%_K> z`4lZ2KKTY}dzotlgS2gfzUMs5fY5Ma2jqImi`2;!){=zdFsIbKwFfDss+m>~~FXqFF&28Ub6jm%YN&sz6DOdGk86MY(HO zv7zoH#=s-YGllDi5it9lE_sx@#f5nz_rSB$rJ47))}Od)0oZFxwGx((A+X%FF~OI> z*aN#8^^G}`MzWO4-{{8QzgKB1*VU4Cqd3#3Yc$IEk=hxQJaoukQ#j~d9bpD9%SvUu z;N0ycTkh7(zs^E9nK2LLi-TJR6IiJ3j9I3;_#|gur~p%i`2);;MPU zW6}tU*QF-e5bBBo_IT|0CW*6^6Si-?l_YxFI!c*HJYL=tiyoq+RpsLN^}T{qGz&c$mdpz9z< z3tIW`7CkTDobBz|1q!0ZO$hQkN@xvqZO3n`cqd2#?T!QbTvLxN@s?stqST!)RvhlA z4MDCdo9*u=;89S>4JVj`QWCqE3EjB~GWqE&hk*)tTN1yqWP({hMUyY0%9E#F%loT- z+jdIHPj#PpP%6GV(Q8eVSp@-&9<)UN!vrauHf+6+ z(g&c@X9;PdObpHm=Q2%&F2^heUY5&ZyWy1G^KUhEtk?(cn5(U!cz5WQN3wtMhy>{DKXZToUl z-?+#|6G~6WErRgBlpK-%LR>K2mT>VXqFIw)!I7c-9uGAm>X1(L!W44K)tT!5v8CT>)8?mVHm+aguQ(jp!Wl(U3~vjFj{pZIxD_?gyx4)iAXyv=6bHA(DyjD0Kx0r<5%dJJpX(JR#8%VnTkRIAtJY zH|QQq5B}=7br2o9aUC95Ka87!#MdC=_bBBZA^)b+P851II&6M=%XBfzTt4Xc-rFB4Wg8D<3}aAG&4FpKCP_vr<-uzMX2!V za7fBsI|4rsyT! z8_dq)iqnlXhsnlaT*eLWJYf(*T1cO+Ae>{LHxjX)eV__GvXXgAu@iIP z)Kn5^&(02ZUXe$^lq~AlO~?m=`p8aHa0vQ6f6~`1L{u|bvr^wht!j9u)(8F$vo-1% zlX95+II_BO@|3Tv@vx{}N3NxS2wD>y9uJct{Mi=cq8ngC>>5G{3mWJ>yv-zAa11XB zUeNHK2UnpuE295z7BxY{8=Iy|JE=+01z?7C_n91@j`~o-6xa)le+R}^9CDxsAbNL^ zp7tz1rX8U6d<^lv;gk@(I%*R%_yp=%3AKa~ueL);$rZOzS*O{Ql;~3wyZa%Wx2ZbL zIaV<1cLUp;d7hfH;ZJ<)0_s~tPxgz>W>%*t$4CMZs=@D5G!=@`+>chgOY+p2$hRQv zHEK9k*>^fHDKG5LP*WXYTh0*8OH`1ocmHVS4+|7wYtGk30eaJCP zLc-oKyiAdY8PR4G6SC5IZ&C8XM7l9UXyJP~LL$2YA_j;xwo!Ub|+jhB*0yh=idK%b)c}LLDig{LhrmSFwEf6k9oE1s3IB#;WGAULp52`l} zu#J-#4iSd_k(*N3qeL|L3@f7xje?dH{Ry^UNV+ifz3vXD=-&yvDwafS*_f>T1aM6I zMVrlWIJBi`;l@P)$gcLhR zEF2d`)(+Ffpw^A38kep5nu}f388_+!i6b4{dPAZqityo_m>S*I$a})+Gt(|Qsvrqe zUAw)y`WsTsD7bkWPTn?g8jNqJU->rjM`GSZSV!;ZoEW`W0u201WOdl`Zx7C)5LeCel+oMefP)na?`?P7m<1!tCsR$<5>|dt6A&!eKTB#w|D=rgM zH|O_h;~sqy3IBz%3O1la#j~;))G)D5mev)4P74_oNZrLw8(gi%BEheeM!^OtL9em8 z4U6X~J*6FtM;ES0Z-Y1{4kAGUfjWC}tzqq_D;enSu#8foK8q-x6Ag2i1`c)@5Su0z zkP+!z{T$E5jzcyPxJMCalegBn$=Z+|S0Xeoh0!!{;7I&JH??kC%yqv(wSqa8eCI2x zA!E)g8nb^A=uTmx;egm)nk?0c457g;d$?ueQq?*yxGB1J7I{$D9tCIQ+5CZd$=w;T zTr8}f70OZEO)PaVCzc6C7iZ4~5bbvho~OML<5;RgQy2o zm&5_g*@eDqXq97m+~y8Z09n>wfHcfACy}~*9h=+OkYrtxh*hCDhh+4ltCArVBUWid zePgkMb?Lq3IUw`^x?Hu(&1~7Q_Wg87{)h1pP!Jq;n|aP z0{`njtL#EYDo=8J^N^L(Ub1vnSJu@Fnt^< z4AEu!xRB%vZimNQ#<^QGt1AxQ$&5sl^4qAJj2{>Oi@B%}jWqzl82?>D1NxHw@_1%B zL#*f4epjoQ+u+Wo7V3g$t86%x0vVrGeD;%U#h&-!!)t%~;k6eW-sf4kyGPvkm@$9Z zPA@W;#>ec?PqyUHjgMURPui9CXX(oQYx>CD?+$D2(;X_e+VurV(R;XL;7WOBE+639 z`svlvrS)cWDRbSxHzd)ORt2^M-2n8pU1{gP(*GK*ifo^G58K&?YuT^s+0M~LxXL#t zx`|`~L*(*7a}iwslWv$Yq#ek?AefPZC-FaUb$3NYK-WC6yCC`QBe#&@o2tI~$n2Ri zZ^Xo8uDX)cF&d_gqBtvaj4BYFaIy({I8FqE+==DNb|XOm-Ry5Ywygz|0Y^BZCYCYV zVI(`iK&2>Liout{ilJ#zFDTPbcK8V;$;}Ujd!vfzy0XvgZ1Wu}1<_3MAAw?HJ;&)Q zNS0&&CejpXIvvab7DudZ{&6eBVTd_9^vXQBoL7RzHCWRY~R=ILwn^C1DcoCAkfpjBS zs15?vu&+iC3UY8nO9Pom<^Tf$%z*%c9OzYHyP*UPrLO%UlyWUvwNK}7MY1}>KGPa@ z~OIA%z=t5_UK|p3ZD+;#vB!J-?SW|2G{f3~H(DW}pjnhQazGaN9V-e7K z1zo*C)`(21Ar$YN`Qg(+;wVtDaUv2qQVO!o`(Aev1_NWfRM02f@syZ`mBLEyicYO; z{-)H#x+3@ybneBIk(6wD$CpTo>3|0!3si z5ck>6HeoTB={Be1kWzh3o$_jyVYqt!P{%gd|Fz#;rvKH|k@lC5DLzdRMXcU4d(|kt$2ydC$E6 z`M>C8C`8?uHPcQX;GQd+X7Br1-2!&XA9kDtm^ts3%U!zf{LSikj}jMmzD)n`-Rpn% z!TJyRE2sZvBY%=M=F$IFYhz<;eWOVKTdlA3{|o%Bu6j>D$)7j8Oh?|E-gvxC(Z1}<6Cm9^Qyg?*M?1AZ#Ua5@5k^hI!OFIoP@*pT3+5mKS@F_ z>O+lv@!@<0lXDsmQq-P#hhYzee|#IAQ~e$WJoyoMwvwEGc(A*Fbh_V2L3Ac3urbJz zDZZ~EfAJV_YRquI>>Zkl> zgxY@O&|k0BXksyf9N>&G3#3tUw}i8Ool&Xln`^PJiV}j+-?65eK=&JeRm8Ly8J!73 z-Lnr3#)#k%LXC-mb7#-nzTj*5Z-dB&_u||2Lh>Fa9q27-^3pDqWT36;Z#MC4ZHYST zra^kfZD5T%s8W4btr4CYCaoclQ6w~jVa!njS52j@Q2adOaSEWPYNZ8k0(8Zw?)-g+$kOT4+Qh5*#;1V1dCH~>T^OK#EUqF!DJv`sr-z#YO3om@Z+3ocFf-Z|U-!Fxmtg7}qa&?3_Zo~%Ntv*XjV z6A}Zf?`qzIcjYhOv(gf?hXF5npXl!&3}T$=Q0c7Iyrss{=WGP0{&P1%>ota!Xfyej`(TW*O|58J8AhfIFLANXb7Q7?CQ zS8W14{6;DNaB@b|lx?HIJIXG29juV&1-))xLvyPW($vGJ_1>`2Xy7bq>|Ir-s^)$B zZT80(=ZA;%gx=Tpa2sYG1Aj+DC`<|Uq%c3G9xAqC>-~%K-PHXTuDix-gqUhrYk5hQzI1(tj=I|AysO zyj(^0hcSvj?~(zY&tL>v5Y|Hu79d0sN(`1g%1cW`tDZ)^99 z!-SJjHc0Ls4#w@1`JU;BGx<T$}@_w!s>|NRT%W9yJ z{5x)@pLR};4vt=)dOz$RzJ^=sll0)r2?uv9+3S;?m#=n!q3H;-*m*tiFGqg$!Mhnp zuycC;`t`~F>1ju1rt|vz^aoRJi4Ge`v;JiiQ)DDYFD)%vS@otiqi=1Q~&v?9WH`!=}1IG@393`GJsdvtmy+#%|ndOZvzA*Qg<`0?1nPelgjmv1py*4pa zaMu<_8g%ytE~{wv_RZBfXY-bK(A~QE{*`Xr(rP|t+vYd!?1{W%hKieZ#znB;hMn2W zf)jiHshf2_xf^xnEjw%Xb;i8BH~s|u@v6A(YQ<5MR)Nb|sGuJv1nssByKKRFc%Kz| z5|0w?aB@f(|9;V0JTR4`Z|wTwYFsOA2tX@sCMdSa7q}FsHAMk95gT zc~5`P-{QQ)NBk|)NOh_H(=?(?7j-5d7zOzm8o3GlxAkj^g}G-7_h@A7_xpql@F9PT zHlp4Dm_sY3^r-h}aM4D3-+%w;VVz81>1UfRw~_id==%}yC5yIZ#pKWUwrb`;}hoO&0^7AyJ=be$tB*pcI zp7@!&D+v%r3-gWM|GY2SNECA#+>auVpZRZLUh?A`SzTr}!CPm*LSel7l1K&^hU?Jx zddM|wd&{ezVI`r2@RSAqZrda+RiN2$X1IQLH~zIFeL1| z`;2FyMz#>scXio8yNgp9$wI9y*hnke2p*fB!tKhu8HnFvt7hTvznqKzEi{tN)+UW4 zjIM!v^%dzGBi=}QyQ_x_HuC86H}dEakA$6>qyYyah5T`VIcHQ-hl)z;i!FSU8}SqL z=AoEM$rWbs1hYWOxsfe+7~9mycjN)|9Z29#bL#Shp=ZOsn6(@*Noa7PMq2GHYGg*g z5nLVps1Pu%bafVLFju8MsYg=YLA7yvRt}o9k;# zAz$c)f-$Z#G4V|Uv$YaDZJ2uBDf{%D?dO7xJmUG<8Q%D}iA_+4fRVXu%VkrrU?UrR zHSSD+E+TMa&r{~xYcv|4g49DJ>&&j~T*o2$adTE`-cJG)z)>_F?QDW}M(lcNf3Zd$ z3K@P)ERpwJ5KTv(kYpSZ|AMPf^naMGt2uuCNjB0P8`a1BEh6ZCWD^VW*2k|am4!54 z_O*Fts=KuiQ5@B;!wEW*)N!*c)fOmZISP2aGJoFOZp;#maJy3LAm4}Ae(%=l#cXkE zX2)j=tZ=iS;%F4R-JYY*zVmimtD%}1PJurirt_~A2D$bVycsf|EiZ=ZJ_B3SbRTK_y||C>N@j5l8ezX=X8w`yq1@d>xS(B$>?l5_S{bQ&z)( zQx)h?7HVW|gE@)s_=akIM`({EohB*b)Bsl@&)VOW+%Ai;E1SF~lz7W-P~XX~hztcm zQI=g`i;YCq1P@=(U!6w$0Wg{y4u*>THAcs@RRX7@zq|e>dRiQaT!f1L>3MQ32*4WUPpO+nh=V->8yIi za~*CZYBo+_b`u=;bwcc3ssx6?~ zuA_JB(OT21a(&)uI_-zC*KW4kwQR{Yl-$ghY?qX5J<64ALCKAL$yQm(tz5|_lcj9Q zW?9LNOv!d>$%myS*D@trr6spYOJ--NSz29shLNIoyNEqupX`fPHcQ=iPlq7s{!ulY6kCxtnL8a$agDW__fqHixc~+s z@3eDzx_@$Zy5J<dutEdR7_J_mZ9p010?n@cyTd@oXkz8hOj9b1{ zKNVb;PN(X$e0S6Ng3^3ROd58_rO@~3k%iN$E{XKKRJ*Hp#am$pl_`aRyX)OT+ZbGS z@?vLqzkEm~(IOvQV_|%A_O(v?Vq>1wg9X~kRD>KLhR=&nhbS0KroWJF<01QD84!zN zT<&0$f~181ta1wB)poo6@a|J(I^Nma-<>lqc>JPtw2OGKXB#Q2W?r*1{mb*E_Fug| z`(=UnhNI(yqr-!veU~6aF}u?gkIMPc`DqD4#m*scC%BvlQ^0YW89NRV-0TleoE;${ zlWQy9#){W0HmY6x(B70pRy(84kPI{OSwqhkm`0crx#V@X6Zt}f3k)RxUCofZB42lO ze6oLbesWYQZ&WisluTyp5lkh{X4!OV#S86MecgNW1_PilqxP@A&Wt)O{A^k)86dL@ zpJ9Mn@qz>7*F81z-)C^rQW-;edImK7b-B$kmO$Nq5!n zytwGB*}3`mDk)Ks`e_^a%zs5Hk5|af$-ccKs_2&Sq3+#|T&K3l|AX~aYmYys#+i+9 z-QH8RZG7TZoJJU*3_pI$?V+LMlQicvLe+oj`g4s~{I#c_dQjz!6b4nc317ff`YHFI z)0ge-|5Ml|4B#RU3D?L5WPFzCYU(n9 zdHzf1$DPCTB1?C&|DyBL$1?57ex(&zFwXMRK~3@@Oosy8pr4y& zf4qus1dx*4F~ZcY|Erzd&hcsIXBXh9Bbhvlob2nvowFCmC$F$r0srLS^$*9eAW&Ob zT}8&hRK^AK^|3}`b}7;Q7P>J@;b#l(oE{VxQXkJQ2ixuZ=aSVjB`Y@7qoyeO!%6?x z4^lrInoPmuZdzn?7;Z93rskG_UzS(!zcs@VLcPrSdQD7G_Wpg52);Z#e!g=^N^&vS zR)N&4p#SBElfs4k4{iAIQvD~6U#UAz0t*Bz{llFiGYLp4k?8W&Zg2B^Zg1;seM{r( z!13tpoV+}RJ#fd}v#2*^k(4|?+28p)UNFaS**rgg`Evh+#DC6Vh1tJ>q~8)|m*;!K zIDU(0z9pK0q!*`Yx=J9SgdCbz*yMNLEX1Lz{WV-epR9}~@7=@A&gOcJtYOcw83QgH zi=UR@vSQjZy0NYTOr$%&R5(cp*HdACl}tgE1j}RuBIOdU*Z*AmN3`T^d)wp}cytUy zIICWTz45pn#dY-C7(vYwBNHp;{}V<@ZCn*Iw3fFz@xvsjo*ukB1EOjq*eqcvBVo1N ze9APH%^gm2=4XG@FZq?`{&UY&rqAPXuh0wljr!(V$Zu|LV8``hA3dXo@ilt~ppA63 zxwcAsua1zlbp@pH-U~6}(hdxPZ&3F>ZZjf8OGaN!Y^3z+#H< z8(?q~Ms-d#r>%G8N0&i=hBp2D6oifA(-%MO&Eh%n4ac2o zmL;d~nr^@u45HI8ju%JAm{fJo*Z2-5sl70XH`h14Dx)*^C;nx^tUPQBMwzTB=SU#V z0gOAMtd8a?xM9R@<~N67xA*<`Hr*V80`IE4v@1?*wcg}u!4gWdWIXIiy)6!RG+Ez+lHq`XqUjFWCzz%`_IVsqm2m-wOQ>Z_E zP@DTldozW;{Ji2`dy(1C)(a+ZVf2O@59@Hv)hY-Tf;#|viJz;{bT}NR6Ob_YLnn1F$5Gse zD<=GBPzUl*CjwAX2j&8f2UVop%e5M%2418ZwWd8`ta~7}le1?PmKNw+Ck6g4O&&Y1 zmOX!hpPxN0uW&_>^!e3i75>%*QL)#NJ>&LtFzsC>p>INJ!U(R9F!d>uq7FP$np$5e z_UD;bQvKYCc#`d@DRs2}^BGy4%G#B;GuaU4y{8!x@Ym(q2TYors>iw62=AJW@Sd|F z9YSr!8RFY$FVg9F7(6Z-GoC#yH(s>KdZ9L2;S7N0V|MAAt6Re>u(`JsU3u0e^Kh*& zeP_4YPfXCz!v!hM@%}Iv=@g&QByZ)+9czNKR+gD?ZIUoHgkywiB`nj~!zD z<0(0zR^F2W(4`=E28EGiJdZcY5XTvw2xT{kq20K-I=cPtb-|SBVk&0#`rF$=p6np4 zpMr4I-8de?mgq=!+fEpDu%5>=HH)WbCpa&s2mhPhO7U3DA_$n$WQ6QId}wVEm-KFPos_n%HU5fP0M5M*MXusuUuu%z*kKS|rdQY$ z$o|tYGGpyE+C7-Rm~JD^@h(AXoIzKfTm}AEGdcmg&K(sULU)QeeK}(>drnANm!(iT zz2tSnREl4Pmshwt{0pq_QgewjrgPR~9%Y@g0N;R|55FhgQftYpw%Y99OU3lPo)3$T z{QNK&r1SdDdx4c8H`s#>>_bwhuuVS`>q}L#gA`un!gEn z-;k{1P8W#V1W}iG$A8D#4=Ba71)e7&i6AHF(C>F+$viC^GzWtRyI}yw4^GkBRm?Mf zi_CnN-_0u~ZlS7aR{|DLQT^BJr*B`MJiJ=3|Ng)GZz*xj@!qlQBNWU=;Xm2!2EG$m z9*6A>1I~rcp*xt%9^>|a5#wC<#*D-%jM83%Yn%i~4p!lxU~(O-_Aqs`J^`BD)7(CA z99Cf_qEwbPmEbLsTKG3O@O|%Fn6D7dvTOmw;p|Z1aXh9E{5!{it-|5}f3^yBC4sie zY0v$k=`wAc!6dL)Jd_uRa}7C{IlhL;)8#OZ{fR$H0Ja2NFs$Qr@{Zr-n+K9jU$P|=W~7qqkh(r63LgOZ{yoMjx8sCN3lJY(w9x= zXlaSIxsgaUNyTxeGr#?O$w>NwfSI2DfzR05JHuF5ZMu zZtoiqs6yL?Vl8BiJgoqoqlP$kBo$dYDcEll^v}{tnT-}apl(Du8F*Sl|`W(qWTD%Bf zEzhDpE*c=l_-%0E#-d3W!2rF7X@VjgjUnh7gAl;sNrUVxdJST_nO}MAXrFsfUqJ(= z_8twot9&1d>S!wk^OERi%5PoR%vfXV4t7$VAvIVqn#GuPRXx*^ANQM`EkQTdPNAd! z5bt?0+~dz?bQaT*0Y;;^`-wSQ9_IHeDpXZ2gi&k9{jKe()Ewdu14Gi9LXmZ?P7OOD z^8!WNfdbKOg`d?Z-Q?fIM}xY>_TA;>1n^|>ckfl+0*6t&Q(Bo#FQY5 z+Cj3!mcdc~kcwjp(JINXFV;;P9~>zp416ay1z^cd+OmS8PD#;VN*gDn3P6un1!#9g zaQ0V)&#F4MUmK89pM`ZWqs@-4(FS~(l;4ep*serVWoW7W88*t+#l|X9_z_Jhe`c|^ zI0}3?Yu|?%b5OO2EkWh=9)hzM#Om<^SSd$5hnSC*FFX{Ys|)`zwBb|S6@hGR%QrvY zzy>b=c@d2BAFp7i73Du)PUcFrs^aw*` zOxRCZj#t!xQFM~jD9CDC$_@QgEyrHk%F%J1Q4T7%bsXuv-n3F*?-8xjDvDH612~T` zzqKqvHQK^Rl!%1!k)pd>p0t+^#r}Jq(yi_|r0nhUFlD#H6q;VcAox9pO-<>&QIHFM z*Kwa@3gSBbua!@eOs{sWfV|GMY7_NSpj69QPRIXfK!@Or);WXxS>!M%dHA|}_%~Zg z&S^?fZYxvye)urV&dN!Bf^>O_*)F01Rtdhq(Uc& z&LJ#B^&DC)V6}Q?4u}()yRWBb1W%cpOhT9SD6dnj;>KIlD%Nph*ZsRyXn|=dhKGv_SV|`sY)~_sMeO)=$Jv)w*avXbB94D1H_AEF~ zDsg;!dT{Zp6-}nlm0>FCmQ{7*%W9X^t-!jTE>p7`wUnFs{i>nu*gA@!z7+OA`Ig7F z;n(l-up~b*$gA-kmY-QS)G7e9=btCRJs_kX!r8f>-5e+J^f;UZiu)pO0$$>7oZp)j zp$&pGJM`1w$j|&opVbo+dZt5!AY3*0**Lz!!*6CfN?QoLRYzOgB)Ep%1!Z$+vYSc{ ztwW|g-(avSKyG>9>4S>0C*B=sfOQ%={!V- zNZvdZr&o@iQU);#tZ|Tzl8~&Eck%-(PmmKw%=SKthh&PLIzGnpY&OqqAE*A^5IM=( z8r_X5pYhB%|12UI4>>3D#>ep-Z!mbFESv^0HvOfHj}C}?6)wU%v3NR-BW@sv}b7 z*gMRjO;Je=ZnaB`X&!GYhl?<{G*iLID&qhT|Ml`Byt4%<3o3b^2qjRPt#nbaqYDjj z>sD&Dpq%xJW;81V@yK$}Xck1-j`o$`TZ=+F`QoG=Ad5$Dxp<1)^0q}YP5jwbKsWjA z$Y1>$GJHi~0_gAmUo5x#v-a+wd zU6>)VFFR&)N}3v_G3%YA0PwCS%scpVm{$B4@`=AePIR;?;=Js(EEosJUCSVrgGba4dsQS$_mzc}Lwr zF|^W5TM+>+n8gZ_D7?DUj@X|HzDIi*LdWS`T%n2;R8m%5_K%}?#=;*e=2KZ5ds9EU zgUJv~#_1!`o`NJMrJ@UP=1D;64ivzbtb~PKFGEzGbKOeSkk~iE^^w9S!uwZr3EG_} z2?zmvp)@ZSFOX7X3>ScAmkN7Eo_ir0)11~ZLyd&vheoob9gz?qRP>_BI7o({nNp^U%MHlWgc;0S#5>Y8v8r#(PblnXxG26;fxoAfZrc z0$j?b98Pwq0^8ekqFuI&|+V2bu7c<#RZ}r_d5hhQT2t%_P1C&Qu^_ z4I~+-WFRODTNU7pjoTa0azF;>O^oL(Y{-t;1gJz2Gt)&aTb9E;OW@;Oaw@1`K=rpY=whj?^%dd9Z+5eb|Z9(S?CS$C2nt&*sO;3 z$?|4l02U1z(i1NvcQk06{8uOyZsX*G7yuDlK^RGk+8W4Y9+|yj2;v19d{l=mBUN44 z?vL>%nogAAcjIXTdxMPG(%{3eC9#bFo`EZ^?hNk|`&d<$x-l(dY6~Kpt6UZ>GZK;Gf%4NG73(yf!+6n!zpDo^cXKR*Pa_~sAtZc|5}dWT zEhH6_491y3j2`S=V76r-*bG+S!!S(eu-qrOQ0F7bra*%iX^4h+QSb5N$KKmhP^R8u z_{8oJzR*P#2v(%Hf;uV;&}Fc_ZGiP=Ewkp6l)K`4S`x4BuyI&!dCOVYn;r;_*QnN&pn@ zCB@u820I#5UJpw%Gt|#+!+6G?{$!4Dum*uLAkhKIVxXwXPIYHR6HL$zWkdmc7ncIH zJ6Lm2Y*}zFc=Z6{MFf#a>Fu^ovkv^EvUIIS*k4u`x(bI_{aD_rN3$sKx}a^8$yk zJ9t`$16)wZ_oxJmg6DgQ-;%8@VIc3JpIV{e-N8G2|K8FA?uCnRzsTc*-FZfFVwl); z3)BJS;TTPT38eE*!99FmJ0CJ4*dhcT7Nsen(`vK5T@(`g+uQhU&CBu#i86w4elpIt zH0l{LPT*$N(p)RP2Bs@V)f@so(qn8op{pmnq}>*nnf%661d$*7ciwhW4+_Rp1yPVS znKx*cWma zz5C5pTQIW_u=o<*VyEDb{TyAJ7+8)r7NXP@xfQ(!7Nn9p6&SLO8o|-9V=#v|{^ z@ldKD^^r>Z3bXTW(Wx&hYFJgr()xWs6X&z1jT?T>@|%t&u_9KxCtCMFiY;&oPD4Dw zHE^sswEL6TIE=18Ckkg@kA117Ln9KUf@yQ{}@Ns;0 zK{<^uhXQTV^6gpP{*aw1HuaSx=e4%iIF03HjZAsWkD}N~HIBky-RlQ=AP?$I%1$by zxj$*NG@Zj(2OFRN`lVsINY_~6bUE}JKN@3OZ-89!3_NfQYFGR0>_2!AZ$)IY}F*G*%;r`p0>q-xb zxG1csOnobsWmA9GT=`Zi0E~XCI13VK9g?%iaSvK5&Xt~l%w=XG@;=h+HZ>$Zx)uT< zP*@mOR+e*+y4@--#V1FYUUm&lu|^UrN8&IYv?cj470#e?BfwEiaA@f+-9qf;N#ttsJ2Wb0zZ~@Z_{&Udh)2p@@vJxP~8D!1f z%D+kwzPi0-;osDV0>x-}HGuKoF28NFIJGLHYu2m7Y!hoXz;eD*>FUDV{&um_lX!vt zQk06C@Tn{}PFbXiv}mbWDZRlAyExQT^IFA6;$ftqEPYGC13EKMyfd%vpaWd{#$ zafxzaW}LRmV@z#zY8Lexb?JRO*ym!r#RR$Ia5OKRd5ZsEKMih=C{J1sO`%#fN2zRIZxDvUeJ@QGs;!)REPAX(SCGq2 z(WjPE18eVG$66ZWe<^can$42<6StOTKZH^x)O+QV6q(JIUP?wCTFmCeO-&gWiQ^Y6u|^SyR0W@Rw524Sk|1Zq9aBm3U0gXO>2b%B7YMN7ba<2U@P<^fwV?pIm${O z6k<+?yq1HYTF*r#t_aaU6luLMvD1-12^3QI@%O(np&7zXGBf-&B2x`FiA9g=5x6dW zMXHd_6}tVQS>Ki8wui^=Gkt8tRxl6B#buU=%C!(Q0|G(iEi4M{@k()fyi(kDSBl&2 zN^#p?DQ^3#rJJ`>x_K+5+e&fUuYubl85GPss-S0|{emaB$0xt=yoYx4ERNj0#iO!G z*YBToR0^_SuvVleBWLdIsZ_EFPpIE&Gn#SjtY+JyH3fk|N!tk)o78UR@giM(th7Ug z>v!kzBHekse1CQq>5priV0Q}z*QY~yuLW=M5(eHbh(?|6PL#HGtw>S%CD7Pk2{rcb zOO5?ysj|7Rxyp30AtCSs z>uT;%v95cOqG7vCCAx*-HC-91j!yaqFMD0*1%z#Txag&`s#{7ca!-F!VWB_8 z1#Hb$c%Fs&t!ysWN^VE6U%wRx$#^3pKN`-{U>MJGE2~1o%4wuBOv19x`}}1olZLXT z$9c$$fhUfc|9e-srz;nAZbRHWEYHbRpIl}K==|;o*XEkrr)NXvN^t_z)>=9}yXX$y zUYxoq;jWuwNr&p>l`nfIZGfFL;W1T=`${v?3a;4V@BGB85E~0t`-r(}3ctTcCP*W$ z5pqUZ5Fh1y%>clDt+k*j$|@EVONugOg)Avw(kfiH*_szg)W*C?iP)nUbMaM$>d2ZS&`zMB^d0myenZEM~#-67;=DD z9hfL6&&-`s3`2B%kM6u%SWH7q+k&q5l#R~Md4f{qv2!N_8-e|&O!&|UY=M3#10jpb5)L;+rudLc`EIf>&Bbg|A+lh|@E zY!?15x5-b}<>?t~a(H&$1TJdFpfOA9ZDugpl*W(ZE=+i6^!8!q0cSZ2T#)Yu!2SHC z^{8-OcXT#N&s)LJ@{@H00W(YvX0AKVk1w3h$&lu;S--W67+~fJp zSa(iN(Qi{Bcvxp1CxIEd=zfpZ6NFCIIe(O$@K=6e7-T8PbM2%-~PC{L6KONsJX>!nxfd3GW6I8)#?yd8fU?o0ob7-M<(o!z2XD`EYxW>oA7KJd z;Y3DBk2m1e25vX!{&lb+roa%2je;>2lTEuPI$vD9wblZK|L-D&|6HW-+Cq5zxe)BV zy+uktUa0i$B8B%Cg1itO`wNv`sPMCeN_Q42{dA$y8w-{GkHrRZL3%Gn@U?|X|KEj5 z|G6hEHA{|r@(qF9NQ#{$0Mk#K92-yEbJi$_+fqEC>E!#QMr*Nplth$Q+SsVB#tyYR zvm~CzS>9fqss$wLRHD=RPVhVVW9zhgb!anHHYsN-RZX{wT6U_rDpk_VRk4I(t|}$; za@ckYf+>1#iaCQ}l}-TKEiHt<&tY4FYv{&{zkK_{U$(w~;bE}TCoCG|IJ^>(tS*D> z7SkerySeov9bkO>;>W*KqtS$7Kei}fE!`e$$ZLdYm{KIUdNBS%0B}H$zc8MNh5CuN zeJ_B}2?j9NA}T@VW8?t(V;vL2l{O=Q@qWU`&<}P@UU3z$2 zM-n;imTa=keK2qCc9e$M88=-alak5YP!>A&uL<3B^3Tnq@+*top6aZvyuYy9NFjwN zmv_KJ2LG=4W){v!_1k*kjD;`vq{gb+45_fAU|HCYD`8KvWnu4nRj{v@hP_`2d$Kf5 zb}MOey)^9o0_+uDW|`c6(d|)el!G3g)Um6Rdz~AUoE+$P2lr{hJalx-StV_e^A4iA zkvdP+)kLjEaw{A>MJC&tRXy6K-ahuh@A(eP!5u-qtFo6+c2f2N*ZJ|3y|IJQaL%wN=b@bm$jJFM3!12qyh4rO>FH;X*!$Hp>QXi z&q!l~c|W^51Xb`L8h3v`<9eZba+V+e4Pjmz$6`HmnnIEMY|N5_#aHiir5~5xMzgnu z#%t|jeLrgz1ll&XsaaI_FzjL&wTflighA8C$Ztxzp2E$KJj<15c%S7hpbYfDVol>6 z9Yv48FpLZM0B>$GB{z(+C)*S{9*^Xh>V*NSQ595CS1yj!zLGLVtL{z>Csh?-)dkUK zC4b6gnB9h{a%UP+@}e=FHTshRos~Nw?VFJzNx9i6ztAbV5KH?$x~6g7lYcSWcfn9g zDp+njWf#{Wrq`qFh%7!DXvIlK+!8Cduq;Zt&dxZTJ@4s8(bS<=G+3N4dsOwr*6R7B zvTfD1>)u}5YvAJ0Xd4oZ`#+wz^BL?iO0@ zJ!q@@MB)7cgYeqQwd$Suo3(15{hQTl-T@StW2sv8?gR=f zrPN|6yg)iUr^GY!2&Q>9k5Fm73`RaC&w=lEN+K42GKp`=c7Z-n+{>Hr`X)%ceD->H zBrCF`@hfO(`EpKCH`La1~oi-nU#(t*@^y#R$vs!PmNg;mTw^m9zXt0)waA=alwgZ5$CjVaAAkaoQ8uc*@u< zRqcmtAYA6u3O5gc?Gl&_3ZtTq$~YC5PIc9UrLwWR*C3~& zX?K^lwp?O3BEJ@@7x%UT0Nc*CtUDL$>81M$;BmpYFpp$b$e|)H3EE^`pGQOy=_{SY z;1-Q*8cq01Z*3vMNKk?t7HSAtSUPdh0iusNnT*-0o^`94(A6xR_OeQ*b6eqJ-t*iu zz+Ofsg{x7Jr|7CEC~~7$l~eMh7mHTpOlJvSMFDH>bXG)`kwcN2(>*N)`z+&eB^GlD zutLOX)|+*TmqaFMMl`Wv7!!PS24j}lSMz8zU>;U9Ihs#f)&3?T8*J_|q^5s2_)@mO zn3ClkrMJXz!cU7Q2+R{@N&wPijRFFS4C#WHV>LTq2M=aaOlulY9zPBgcyZ#%e6oTS z5FZ9(7_!{3e&n4Tp-M$H$6<;g&*ouzBk#f0>+#H!$0)EW`8JG-eYk?z#WV2YUQ%QL zN4UfgO?gUZ>)>N_rO?ds^Ux21hj190lIU31=9`nJsa3LUD=e7H4~v(GZpp_T^n?K) z^ZQXq3*S0htsM)Nd8>!aA%`+S?-UElBASCvLF24C#(e($w=ce>bIh9%gdU7p6h|GA z6I!rjq4}bFksIY|4YL${MMsNO?k8{TuvR8+bRlhK0yl|R@S*yL9Dmg)RTE-N7@$`H zd5!qYjDjYl7|xVU=u4JoQOR0clxws=B*8VdTR<`!Ib+RGy)?+={Am{FlRHuki$9zm z@#LBZBTQ>tNc>S4Lu@p6#et5#4kkchIflw*_oh6f%{`LY#_xc%_1pwn8FWg*h8nzl zqccSCJFbShbchUTah>VEC&uqY7nEZg-$Q)qDx;*MuJ`I3mZN6{ri9ar+C+r2L zIHu!12AMV#)Nh@Cn=SVhH@n_;UrxhQI78>j6-B?Ft7g?>fkN_ zfua}ti}X@8u5ez#8@-HYT8JGnzODn+(vELhoQs0rTh$e}EES`mM#blriq~0!3^>W-HddM}7 zM#FR}$cr#fC@Rz{I63?i(H1Zcx#m~ISw)vra#&dSy)O6Dp&x4=Ib_*Zd&DPZ;8FAdEI~uSlZO_OV{jpVksU0Oj27)UWG`b3NFnWs*AB*IW_)&_3Sd8X?4>O94uhkS$R1bEnqbv_AK%jR_6^@O>0ozB{ zSKJ~{w^26YQ_$eXm)CT3!#-~5AKB>&MW=v|&nt8_6+Kr_4i-b2h=?aa!}x0G(=h>N z0vNF|6=9;}QUp9W7F2Yo(`}uj z{U*bDX$~$)!GO?x)PLJ zHjz&lZ?N?rhj=k3=wc(u<+>v9xB$6NKb(z7A;*0^SKUa}yiG0_b{H=<0)t=N8{?JP zW2@AcN6#g*$ZlmUmFkP`!QW7xoDGk_{9+uoBx_@JfX zTN?RtKVbD55ew`}W{0hj2kJ%M$QSSS25@gO^~fpyPfk}O`tyb#K!z0?c>oz!Yy{?u z+D@gOw^SptH>(wvww{olcdrpHZ3Lec%dlc2#+ZN@Ua3gqM_GpaG7ZHS+27XL+di0j z=+X}Fy^XHDg=UdT@3n)Lut2&0X7!H>{^ZyjyzY8}Wj$i!zW2I&(e*mst21xQ>vezX z_Pn>}-pMJIJv`|3`h$bRzj?=J7xd=%-~E1uvGW>xO+J8&W^p; z2R~u)Cx#_Y|LuAAVt9NYWp)1vAa)Eabo8|-Qnpp7aR6btl`>bI#h@6gGF#`Wyf|u{ zQ#{oCTV(nfCnCnY(GNsG2$r0LEO!o)wz+w2d6U7~Q@$kM-)9!kQ z28NP=FYkUrlR9H>NM&*}g5Z#%P zd9Y)}hq9l4&i8zI3mxE%=`6cr1<6${pf& zSSrJk%AVV{#fDiM=dwb?S;^NHN+W0Mlh$!In*`Tk3V2v1&I!zNKGe2J3u~^l{Doff zja#2$mZI@)Zop2~R%9~og&3?22Y{@lfLG%&8FQ$$1;p&e&v>fJaexM2!Wvl0pPYYS z<>i;6=x4KDE>YFSUTS7;Ct5FZ&Ngc_wVVa=wcV(vP^w^VR0^jKn8G(ZCjTh(qm_## z#R7-(Tbz*r<+hs)EjM}=oP-@v6f@CeUWAhDkMC5dJkmxm9%k{7fB%ev;7jF_)Z6DA zsEw%{Y7;$UN$q(Pe|kCghk_ce6-R}Wn+~(em^OlgX^JDJ}u(O0wsKAa3H>-lEg~2}zw2i|RT)LPGD7tN9fN@y( zfVd%EujOl5O4h-Gx5E(&997?wAG3LjR?96!UEOV$*@-?C%;n5}ZCl0>{^$dmhNdjUTNYl16JS8*m4_#YQzd45?!1?eK@{KKlT^}OM9@kq ztI*lbeoj%e+%+8O5y}5*|5uLUjn7^E;#;%`w>dp^P!#>w?(Tn~Uy^F~iV*f4A6{O_;-pDhf!cDH#kKyyO}ej{_ANDM{PskaTO*2tciW#o{%>D zc`QEC2(cS2FO8X^2aR6OVGe*e4(N^Ah@Ynn6poFCjAToFn2N43bS{Idm^()%L{e5a zpKJFVe$%45?&w$9h15`P=!?2~p=Z|{|3gr&kQ8z{7$AgRA4#Tpm|AeQSwrf=^-ALDF^d zv(l6YoaGtA1S4Az+8ylY7Rd^pMf7&+U?yDZMT=F(No$t2c}volaile(}40=xv z92#YM5}GK?6Z8(0QiAy;@|`27Igbi>4;gtBr`=(c!q69Yeg(^ZMHX3_Moqy^Dr=LE zim2gfG{w8KoOX&lhxg=smC@Bfb_Q9f%CE>gTiFJ5cmrDM1QbBUzqMdb$~lbd5<=ra zSzaU`S8$j<={!5+=|sgSsUV+vBI^Pn1bmtX2g!BXM1uLr^+><_q`#lyhmSn*=xvzY z9I>+&>0pflNIilwkB%g8viNm1kb8fNt*NN4o!Aui#-fz?UflkQFRnu%7f8#oj|I9o zrD?JQb)FytDw0zX>?=CJYac_<{O_bt3@@cq42^?7n@#QxaZebHd!V{j4@XNKMt?kJ zIo-@d5qPCTphyIqnAdcVo(cLj2$p@3y z`cbqFX#1COl65Ex9p|4M0uP{IX?N@UHbF=Oo^p;CMMFIOIDr|Nz4ku_43n4h>?j;Z zc=-I{xei1P1W^s>AQ}T8!sh#L7Xd`gBaH4R*qBf5PUlnXDaz%o=Rg_-P%+*_5gfzD zgvCbryYCkUcj)LPfctLixzpm|NI)#c$7HG~;T3znDiV1!WWmz+1}I9rvemyhV?$`C?-)NQz^vk_7Tt zF;$TPR`LOJeh~GPF8_TVBzJUq!FrcF(Ti?B^-z`%aT}AGp=xx0eFXFLDQ&rhoY6|l zzNimiH)J))rloW=PA-BONV_26$nwBegatQHq4V0<^G9?+*3c9lZos_OfOP=(D?n>t zU{EXO(!>EEvONXDna26?BonRd9)ON6=aKgefEb}vU`a$V%GN{yQDEJ)VuPoYxidXG zDZRyrS-$r>4vun4o-jb5QBPQ$6eUba8;udz9X=w$!=$vmARDc-ji@l(;fIZ9dMi-@xXmJqmvz`z*7z`Goy8HLR3jAZZ-lF`6+;&$2#iyu zID^*QgfehR0+BUZY^s4-=h0Odh3O5vO<4}*bOp%rrj|z+=M%*TDr+Sl9oq_4I!cP( zg`^>atB6IH)08`}i8i4bQ@4V&w9^uz(QUcblwgDxuP9^K5FkooteVVxh7AQDh_q@X zI2?^>%v|H{k+2{GyNCPYf}>?801C+fU~+wXxn?HuweD1{9v;|wDqEeho1x{KMF@-3W^WmYzE(g5DjeP3{^5uV~$2bh3!~Dg5R)p38TH~Dj_t5Y)jSnb|v@}jON7d zi63ESMYt?>%ZB%ac$L^%g`{F#DVhA*v82V~Rjh#OLKk`QC5B@_D>QG!=KJIhR&I1R z^teA`$|67tqY^}Tir1~UC%i=|N8>q;y);%2Th*v@=5rlnLsU9gL&9-Vo&s zdFGOZNkft6rh@3V(qeh%nF`Ii>#C%0?=2^STxCfPK_P-3;7K;HOs>g2RZa&D#mMb$ zu31S6NQ!ABJ2_$3ok#@GjN-Nxl~G%Sf|4xizTg!_*gdb(1p~4}&xe;WMaoXsCWb+ZgUskAldgL{Wd1RCl&|dRnOHk%x89~%` z$8lA&niFm{0v0->nNW;=J7c=#@%iCbhs7+$R2or8vG^SxzP+xxL`UCVt1lfe{Jk9G#eCbax`^r`LsqJ00^L+&y ztfhyW5y?T-RV8u$Quz)!CXKDH(dpbn2*&qfx@@0uo3Y9 z`G>>flU{c?#J|w982?&rBW1P{7>&_lZ_)Ce)@(%K9!q?XlQ-wR?wjr@ERH9?fZot; zj`1QH9jDsFwF|Q!Mm@$S3UKA>kP?yRp%-O* zK`A{h!vlY>#H9St&sR?#Svd<54g;%7uwi^ zK73PB#!|oy+uJZ!igC^~Oh+suAw@$-J7Lth34AD-TBPA2<`C_|!gpjL)8Z>}jy9hV z4>Y?CU8;J7SJ#upXo#BiVGnd`B<3uMKi$>BL~FUQ{L35!1hA>NKV0oBz?4-qWSrL) ztt>@C7Y%u?3H6`_`)u&d@>ov({HnP}L z(a8D5*)P9ptt``sI#B=4`R&3qRo%WeFXG%Dse=ZKH!*r>|fR z>JT!=sBC9b#W44f4s^bmFhdT^uSKyc==z0GGiDjp*d0I^UB&wzTg2(AY#dDe=o+NO zb&=M;o_BHo&-_A%2Na5`?cIm<%XM5>$jzflIXt)7J0AWJDV z0Ijiy%N+MpLh*u2Y1C%^N8R~8mtX>=sLqK(-`2hU()s8r9B%9AB!3xM$I7h(& zeVFYDKDM5aZ?5t{%;UDgl+her07quoE@L@2a4dlVC^u`Eqv z3WT*pBltKEaoq>5IJJnb`+DqOcOzxb633wJWg7ve5UU*F-)xm1>Mqs@j7AeFfv2=v zo12^7Gch=;YUC;EQA-ImOTchrqR1)IRL7J$03F$?)9P1_<^5F-HNT1`=8#=WiYrGW z|1{Z^i!G8^%lhhn#ex4S>fS#|C0an~%k{nSf*U7&Yg$vQR3jUNz$+)Pmq*Wdmylja zI#=vd2XD@Ywwp2w>L;iD!NKX^g#JeS5m$8EuDQcBuE5=Qvq%R9_vr1LH@~X)vCR=| z5jsJVeD`B#G@GF=KDtRmzr)6xd{L#dNHFfim;W7%vb2SIYEHJo5^u}+xB!g{oivGG z7+HO@X}fdXY}Fo?pU(c)CGbma^eb7`I_`DYs_iK{Bl1RZ>_3B9JgV9?DO{YZNGbj2IqxU z(bWt$Z!QYmR!*JkB%aT-+Z#Idr2ScnCQ!`wo$OaHC-LZmfU_isI8~mhpBjVxHpl}1daLANArs?NGBly$~wfOzFn>Fd?ZsZ;jf9f|DmjH&h@&Pq(vWg4jrNLjxJ)s46V zDy^^)mv!gj9kJ&-d(5c5vb=o`OFH!RR_?D>p6CuA$v+fk{(dc38+m{ottBrYyXRSD zh{3OYr1UTi{=up{cRbH7*iA7~|Ec=z(4c1b$5b_0PHrAwvkX$EqqfFZ% zFP;_juJ(StrY*Ixcc(phm1T7rC_03Dv1_)xr<&=nttZYc7^gPcKrBjY^oCl+^FNK& zKsN_l{ie8vR@q3LT@3r(Hz$W@J@|!=#$l9MElqM~*i44HD{9=*C`o1u84fNEPWwIF zwX)fmS3jjqKq_48OMAl&1|&^{<$wmPnZsIe5xDQ*E1j(30S60|MHJL~Stkb}Yos={ zibA?{Ae&WVR)fYhIAtN4YmF@Ms6?=^z3{g!VfBmd`Pl{hQSjMKq{Hu06k41M1t$09 zLE%TdD|)bB=o>|pE$>)8k*^XP1MUP-DY1L_&*}eT#Aa^3r9G=A_GsecJ{JQ=V!)*< zF#wno1Bu_^KGyg*D@A%w9#i8RMGTRj#Vo!;b`xMooXC5gho(hIjW)Izg6;gm z`{ujveki&DogSa9$V1USpx8i_7&$yRM{C7l#Z`QXR`$l2g^_o7}?u12&|#KMq9 z7H2C-gz4pwaaGFyU4Zrs9SodNqni}N)YM!G;rYw@{BG^Nnb(FN)!louU2^|qq*dVb zvfc~Hx<;PNTR*`g`MePhWL;(s+2dVVAez=9N0B_zj*-*iBw!_2M-NU~vf(@n2d@yttK!iK)+!vKPt0%A9ETE%|rfq#F z?Q>54B3ylFmICbnS_fS5kmYRHqewZ0KnCRR7-J};Y5b8THTn<)vpg}CrzNIZf8+|= zQ%s6%Su}XMVd-S@oF~>EvL$2*Ez)qRs&N&CSq>(#KMuy7^d`K@I`Is1nFbLlz?MrX z(TLm{oOXX1Al;jc@BGN0-2D+GuuYiEQ~dw>X>fZ)(cgQReWX>(u-n+^i&g0&NavGG zEJ|`0^|EPQkTi1Ud}1`Rz>{;>H?>1}=wqS=qsh@)@4E>}#ZoOCNNg(yjdQax$6Ry=7RT+^#7ewK()Q?6Ag z&g69&qe%akC#MG&zjEYtgpskA8GwJbroB3uwu~q0!ZNMMNvcd+0)g^I%*H@iUWSpM z-0{<(-2y$?XBP1FkkS)|6e}M2W4~G2hs}!$Cfcl`d3Kp~Z%EMObvpBfJq)EnUqDA4- zE--YZq+|~$*$ErLP_M3q-A?SUgd*qCMR63v@RhKX%)cm}IfsAEF&Esq+{k}bbhW9v zEEjxLj137;g>#*Ad>XUv-*x$;D)>SHM5l_4vFJpeR-Yq8!G$d|nGG8_8Pz z?g6|>y?$2$6vb*ll*3rJ-&Uyhj?+#_2m996b$VH==QSWI1#5P_22ibNoiS$sEK0ST z01NB`YC|s+UxXxe8n9F-u!j9!`SdKeD|TNg4_;rK{oKbuWx=Oe()P3sFV9a_cjNt) z&vnrUO>WxJ+f&Pf)NFP3qj*T!sunhzt2k*|%>nXKhsXFR$0}^l^iu^sYV34YZ{&f} zkd$~js<|K#+50BQ5syei!hE@<2Yz9wD6}P78l#oQkV@|^)DwK_f=`00APJ(89zKAT z;{U7xFP7d|*|VtJmt008(;=l1ANuM2oF46CQad%wGL1aY^@Qq#NVgD5c){k=4!&Z^ z&pXV`vYu&5t)3Vel9;9YDvScZf;(m1TSR@e!7B~E-r#?S6d!icliq)?HeY+S$;YbE zup52+Z(nWxE!pbyX)~~2R9h@Vkn?i$p zzhBa_EOTVmEh+$|^jx?#qjHVrbOJ2gV4=FD$x?bM8g12B@-4fSv{+yf!rr6V0-VJt ze2qx|w%*g(}q!$Q905wQbvq2jn+CX z&z*FG>~)X4m%n-x&>gCq)HpinV;PSHoa+7R0IxUl(ByLY9&u!s%HqCgbZs+! zsFvVtRR^2OacMDvz33bZXr9M=$Gmon1h>x{`AVtc^DNIRPEYd{1IIq#c;tj41DZI$=Yf)&W zji^$qVyr3e%3>MER6;D2b?kpW1%18=T#jN#m;K<^OLe0P0RYvRFVSX*;7B49Jyl_3S~>pL##SWn)qy@!n>&zhoz8vW8N z^@?AtqUHg=SXI;4U90`rILLA$eJ=Q@$6pvLgy0N%ahZ47xz>j zStFD^jKWznkCD7r#}rPf*=u=|o0Pn*ZJ#e%UUHMRa+*S6=svy#vOY5MI;fOFALYHh zR!Iqz`;SXYp#SG?Spjs6-7kdzZS0n|fz}@TP~r0iA9keV}n1r6)>d4&K?U-}h*H2uk!P>z?cZgCV}LQyXG zR4=J6-ye?C%e#i^yp%I{i3O3+2eD!Oq=x))+FqkuNNa|Fhp89Endg559`Y|Ifp>co zNan(?ELBc0UT*;Iyh}X)s++c@I68aNZZBewye!0OQ=4U=)-ZutQTLYvyaKDYCF!sl zxJwz4Ez1w}OpTW2ixq;ukEztce4+|B=7Xh4Y(qFO*CtQ+Hu0~_3;j!_?0D$5Y@Rs} z*P7cWM{N^dE8sOpvqCdE4qp}(&HpqkN?mxqA|6GbhN|JWw`KB1$xiRvSY30A zxmU;#mS?R^qi-ostloRTOiEsH}(Ll8Z;3 zy7xaMU9dw7Rw@hbQAPFA02Vb7UA%U!@EJ8xcSVM%i~JJxYsRKnpabSv>e4+~7Eq1z z-Nn{ZTf~FvMRmbirSTOi#bM1D05vGT9Eb&D5!9K*wcOil&FFhTTF&Xd=0vIIuw8ey z+y~n7?&P&)!UC?w_2t98f!^CKx>|1BYf|11#-g6TLc-ME^gGJc+x5F@=We6nRSi|8 zy3p|D+W{ZiUQgzMGKrO&w-XtNB32?hjyhJ=WS#5g)bo=-UL!yD8r)Q`@iq+>$IF9Z zxQplBtsiCRzl6!mLcF#{Kd>Ngv*OzN(KmBVwdCCAc+C`5*GHL%u%vEPq3+*ZUrwEM zUJYDddd@Fy40_Hlq^p;Hn&Mt zS-SL=tVc|CkE(Tespd*z7nb!mp|y~AZ$}sE`_cfax2Owu<34a|ZCe-am}~pEc-QU) zsph73sqU3-C70{x{Xs6e<*nay>vnX3ZZ2QHbVKYAH_L5}7az6z0;|7WUP881ZBdtz zGb@3)@Me0s30k>vU2>ML2JTW@?PVoZy^ZYBQfr0a@3RqKSemU!7_17~0^9Was9E;V z;qdNnP{2DryYOBf9R3aHbkz3_&)%FL3{GC2^iBr9dL8_VA21@-;EbYQU7WmnJ>W60 z3O%BP%lv{=^C;6s12<^4isGi!R#AMj*HktOg_`QN(1|YW7M$qfuF;LIUejO{M@?mq z;zZX~mtU*8(Z#K-8(qDoj;^bwvNdv|>#ECdT;1sQO403=pzErs?8uzxy6W=F*b?fN zGQ+D9W^mP1HiB;ImN7%G1l?XKy1f!~T{V^cr<=N#^NSo`wga`}%g;yLDC?DVluIh> zyI(ujCDqN_T|3_5XsZHy3BrPX8HloNc&#HO)|e5(r9U`09h_iDpU|{|v6dGhU$nU1 zw#bg~?&Z;umu7d9z?=G`Bu;DPu;?Flp%W)(JXA^nnP$WD`lBH7lQ7=)8aytO3yKzx ztJpF2buoxW45WbwfaE5dtpTc78hO3YpdNB)z~T*+3>Gi$Y8+}8dF0i}Pu)``e3?Xs z2i5^#-mCCq5V;A3=lyB`G#d!-=bJJR80Jg`Qvh)gjmf*p4PsCSi$Nt8gEA}#Frboy za7=`~J+J@z>|)@EC0b&gLDhy-Y+OQ6?{>fU~>U1MsmesJ0wf?EJwr#wPZ#C*W z#@tn?4n)_uyNlI@S~~VM%9pld9e?wqTY#52+E~6<2=_{8wo;WMvgGL9U985UP<7K) zS-PHZUpRV$wMN~AWVw(CWfdzIn92dNmn#u!C2V9XP_-~s!>i4gb#I(Y%GFuWs#vqS zc+F+0k~!;Dsl5o+W6y%gqdsrAhnN=w#TjH~#yPKDab zX(i9rt+c=bUXO1VtXpScuQPBpxHmuKv7g}UuM4HEr;@gh#hMkTcO~WQhg1t4yw@r% zVXNosmNWN!@q1k;mcPo65A<_#`|)|c2``o$*kM{q>aPtA&vaE5FH7X6Sw+4r5;mTno%D)Mdld~)nrT=lFj(&A+ac4ig%wiG+Fmh#?>o$1IdUY1~IR*`Q@ zu`_Ea?@MTB8(G&mm)&t%zAdMnV`N?RtPa%TWf|?P*tzPsyr`A;ZtN`n&C2@{94!^q z52ct|>gt~=@O2*Wsb8ybcONBHLaFq*wiVD<$r^@N$`Pv~OpT+~Dlw~>R9PyQ3tYpj z%2K~d^s2^HF5F#$QM0dd;$B+Y8L`6nSb=*XxP0gKvp>E(@vN^Fg7 zMk;oT7U|;)aI%{)#i+OygZM> z%RuG=nvAan`1<#< zG(|FFW6S&VPw%l=N&{qx)NLRVMx)7m9C!^LGJAM+J6^wORAX2%UUWus{R9*%Q@vqZ~I!6gqJ>J?N0D% z2J*2k`9+JDi9ZVJkxo>(3WLeG6M_T|{Ym&oP?Jf-JPf9nLDIqG-&tK`qc}o)A{z1Z zF3o~zhl`HR%+GK%D}=8)acm{n@LBlRRoKn(t{SzdS5>(%T2A~-HZLz|GI>SmB5S)U z%%jx53ObWGo^|3G2$%4W!en*Tje$;NOy0pfdbJuO4zsY9ldjNM_|f{3H;&3uweU{U)8{OFE*)x!)MR(a39`{AB`tL;vwI2wW3=1NPg~=VLwMl%7I16s}W*8%8jOBt) zP$BXTtNQWd=BA+32tj@HCv#G~Dbd>#j1K(7110+j#ddk(HD^IWRE1gK-TFxcm0DH( zc>XOT);vmrD_H-a?l?!9Mx8ns`4hBa{NP^)F!HH)83d7+1XEZv$I9e6_*-|_9~^N_ z4-}h+i%FYPRn;P-i$(CE{$kiy>JHk?en>)4AUASZA|47!}T zg?OCnpt~bfefHHCFpf9ciwVfDEZxTzFXLo_iM^ZM>7}2HFwuA15&?A*fl%rpjP)DJ z0gkLlFaf!nESsg<8ynX^pZVoF)Z5@Xu>5y6pG-Dh{2<~U4Tmq!E?|W`IvfraoEZFl zMP+srjDlOOFKIRoWAn`<;iJXm9%5$nu0zU%ThPpv~3;4*{2UT7?ACjcTTjMwIM}C!K z`zBGde&tY4&)%GzzB%|sg34dW`tlWGivl*CCzyr{6oZ4SPd|qd$lj3Q-(lxYC*C+_ z1r8}H{y4_0@nSu9Q1;o3QNBnr2vTbj3ttx}S&_)bK*JK`8t1YBRmV)6 zviaUs_=$R6W3hq##XLwiUVQr_f)Ev^emGgbj$%M6POdj#ox2G?La|TN$;R`|t>>Np z&yPS1-EBrH&tZ?frx&X45L(CdSr@Hq2?7WEb;r50b=c3vSNP|KC;oo7`JSi#E;$`Ffxf&rI6ZugXo@h3&G2d{HvDZ5egLz} z7cEcu>J;s(Y)pMoFTkU1nLguT!9b-vKKaE$T1zRfG0r;Th_DEmEe^P<9Q4W#G7F0d z9cZe$F0yJ!;Ym$Vg{h_ zT5GjH9qRHBltXld0?~Qcmlfb$F}z1bdGEz@=RjDh9v&RN?hbn=@T!0EpG8KjuHt?F zt=gbn^Lu;BIHh|eSf|jE&Qi#yAWDC&Vo$aJ)C1MfSX6Q$2x}jZy8Li(abp_hp3emLE&3i`9^q@D(l+vpFg5)W0($;d4yZTVHgeR(;g2F zs#g0qWd5fg}i)7YIeTGNg{EM+)~SND^;%SKeE&y(VmOr(uL0x(r7C9H54o7X`tX?b=z3 zew3eptp64@B;fo(zynx`fM_Z1mT&zO{mtQZu#SpLvxR>@`7L^~qoXAeXp(|oD^w6x z{!-+XlhZ->0+XJ1FD}lC7fSl)CM^H=%5jem&vS1KG2ic8hod3TJWiUcXhb|i(lLfZ zud&_81?X9SaM2txnKNv`H}6E8Ux?u*RB%kN;!_JBQ0|&LJD&gSS=+mO_DubR537fO$1q2; zcoN?RN%N`S0$o`Cx@_%emBOp$*n7O^ZPEoF6fSV6$f2Cq`y$u~|6x~0UKeQMN3eNF z>1~b~9yNOhpi0U&I@T}4>$diy7iQTc$Q$G0gSAClYJ>(leK@*lnl!-Pe}dj`>Ahrw zk)d?*qdPi0RZrp=tx<`dAeqKmU4M>eby)&XlYpwsfFwhNw@VfGn`@tnRDB9noWx{( z)a&q1K#u~YcOHGgE=a+u32c(FoD5dYVl?p!qe2snovN@y1$H(wi_?9i^5}yhYuGN9 z6;g0cQ$9Mg`Q;=WZR?fzfzMO;nihwOnpwwB!%O(9nWpPmFqzDnt(KKAYuH#$82M+P z9rn)RS&9kxVAx3kBMmcp4Tp%@+U z$R1dRHBTKhy2bk+&xW?I@_;%0gF(Tt;ly*|%f3P}nBmZz*+9CUj4$U`%~oe0#wQJe z4^XHH|8Fx~!#IWiMBbmuPuz7`$M_IGVDkYybxb;qk6F<2QhB&FOgX9rw!n%zxx85y9-$8W-#^`PD z?DQ4>-*Vbk*tr*K6UpX)$@kw5Guv`r00G_Q5W>-ibclMHrBk3LKm$82{rOdQaQOD( zqI)_RoE-j*;U(Z*2iYOB#Tnq6rjkss97+>2w<8g16SAa9Q~37|E?#wMy1wdOcsDpZ zK6{@xzj$BT@GH)L<}3=*`0>pj>wlm7<8wdBOeyjAd63+l=XW8;c$yzXqr2wX%^${O zFv}j|Ndl~^P%o_d1unp<=#1G`gi!&5pe zrbkitwen@1!9Y&?2r81&At;V- zyk{jv=U6uHS@l^N;~`R31~^ZQ6_K_a3a=#@G5mB$%>r8$$g!ggvlQ2;fI!La#Gj?X z_)UmbNCCRoA^n(!_Sq(0Z4w@V?Kg|V&=FW!Ic{UaiOggYx{(3m)kMeMxeXdN1*MIR z9I0_U$J^_?a^J+m)-tPAP6FO8oxpr1v)0HeWq5cA8*hIqvuC~ z?9hSQmvWNnM<1MR&y)CLh_}GLM;0Cv0Pcl=1s&+J>)-ea_u`Cdp0Fo_{U@3f%x7qB z1l7l5P;TazZEq6$i_ zp5VoFDq#mcY-M0~NL!N_51!Lth8AuCY*2!&rJ21Y>A| z^wTM*Tmo=B3%H#erIeY*z#^!!2LkacMF`(cEqiRY@qdCS&{NT?bw1a=EN#%R6T%x zUpNa8nUpvp_J&$`%v!%+`f)`5H1G}{SSg@6Eci9^Kfpu^KKY|;az`I>c9mO1b9+4C z^D|DKJ!`g<^G|kEr)2F8veC^DhNijI0(EF>N8R~qP(aAk1!MrpKMl~9if<05!8A_p zhIEtevH$KBzktT}`*4(6o3^Pr(>pdK&DMI}EHz5tG=-*sB8cXH28!5h6^ddYyn)nc z++%^Fq-l-*N2 z>VZikMkfoI834z43v%wkc*DYuwq91|1}Qwb&ZgeG(QLK>q5vj6F8Lk2 zP&EJ*<^Wx1^AT0>&N zad4gZq-9-(8MBlH#bz>58vrdTxq}u!5urM_aq?kZDWH}`eT42dyj=eP$R6GTe7Ivu z-UvrCy@}_OF=-AdXge_Wekv`1Nd?N)7_|X_I1Qt4iu>{yjc=u16CyXW`yx6q!j@v# zP>m#=3*J{mOjlR7*1ZFdIi84fnGrj`@KE{YXBooI0%Qv4xASx>K1 zIVnkaOTrmK4i@OH^GTd*w5XO50YsBPkdQXIX|CfN+gc_YxV^BKK*ezty_ils%ji1c98;7?yNjPZtVpjz@?I6_K>iS^uLCyOB$tbJ4(Q zLYDw?ka7&9I<=-OMpbe`+>Nlhs1FUZeRVYS`Dwi=V71h4?^$&r1?sbB-hb4!A280# z#d<5Xz`Wh}Tn<@oLMnH=`W8_r>$KCki6>)_k{~TT+*(X=N~HNd1%&66RDHbr#6J?~ zVhB=#?u%%Kz}6;JPm&ISwS!MtKSPCnTl_p@i8b5a0Lov?Bm4}%#2E&>JoM9m-Wuw? zq5SXSkqg==9gv!vDiDSyg(|8Z11AP!8vsS6HZFzu-|Q@Ye;2I%}3MTGNj_6ANac+lXd`!arTI^^PKa);-8V+A*+=MRPRf`0=@@B>Dr6dmlb zV{k{mcwe}S0C^zrK}!jL5YX3ThmTA_F^gMbSE%0QKT_v%n$54Sh(AD8#7p0N4I&$g z1b6wtxEJ_WJ9ea4wZ4c8y)OXuEmv{QIuSCWyPjqhn;+^;V)T@VktSC_&$~h5qZdRl z=Ae{IH!dFd81e5%K#-dqQ+8p$_xVEBi?2D`$vn3^h9(8dV1N_l2qs$L77ut>OqtX( z9(j&uD}3&g8`UxAT4&)tIv|^+OCht#RE`FpcP7TAg-y7ng_XHn7qVJKD{QK^S7Ai% zYNE&1f#GMr;^JxDa=L4Xd{oJ1W0aL-dl^R^u72>PJarNA*RHVvPK zO8^``!vlXP{lJglZjj*!v5a0?vr#!}#K0y+ff-ld=uqQ|tw9}H@@`=Z60oo*Mga{{CbkG{R}7SXT%3E4^Pwo3pFK7} z6eVX-pLzDovfrYA)ospG?|L{&3+gvJZ6VWFpHv8RTTA7+!Z^5`Uwa^dXLET+H8?vu z+XhwR8l8CH6H-sOvxLz&0BBKw$fM7RIIrk{+7V1s*ra_3ydcCw5PqSPAI>lr4}OH= zp%cAFXvn*tTl^Y5$&>=Y#~?xkxJ?ah2dUF?H&39g`(~OL*TX0tj^at2q;-PO=oWq4 zjPKDSW{SvmDcjpuzT2Sm0e~^yITShYVR{zPF0a{Yao`GF zY$MI5G#gbbHOSo^zgT((iR0KRHg*U^)T_fNq;rT&F)LLDX`v z9j_s00;?r4Z3#G{L)vdDp)iB!1~+CbP!`F!sdJa0B!E!>{6j*J{eG-=Ip^A75@f-< z_X=x%VV;b=lhZ+yC6n`Evvv1JkaR|~$vnmXub&3DM^v>J_#Z%eo2aWs;=o9G>-P5V$f1h$?XQfE9 zPdS;Vcf%NVG-6t#bm8rqB?$~G2qoDxDl4DGnLm-`)pnjKuyzC~9U=jVoCDe=Sx~$K z^Jg<~C_8ETZArl;Ls2525of4Zt* z3|X9aR=rBLsrlG#oD6(zoJSwD&urqNIf=S_Dztw}F{66%snDQxWx zUO^uot!w)#lhvI|H$YkM618>*aovPnRref|07wgkONR34p7*@41JaA^s@NAdLndqJ zv#2ogi%(0JR?7j_o|Oqm8K1T&VdkEVxiWOGDajgxg<&$bbkwrO8TFO3UUhoV)b?0p zxO8D=%cthQ*t9HN#ihQ&*KE0H8yaY(f-GN}iYi~PE$XUG>#0CvrJ9dHZg<~G`)BQA zPW}Sj$*R%p_`CP&22D4D=Md->+Xb@Pu>C`ztgo~EDe0$VCOMpJj3I6UBQS!<4H z0T?mCM$KYla#u^|4EY=Bet~Ucb(%@7rTfH)x}7M z*Uz4{#5T!mic&4RQ;h7-ev^V?Q)A}w4zCv>2Kv!QkzC2c&`YC)9C^tqY~))eefC8i zlSG}4P9jlowNyfnsr;;KI`fl2J0_t8sLc+1@wgYXqk{Yp?+b^MESvyyrY66CO|!7f zLl!TfSgsUN?NFc$Rk_}=+J?3xs;B}$9zYmPO>R;Vwm`f}Zc=4r#G%v#-#**JuXHNI zZj^*lVjgQ$f`tO>0)6_jheizmScCic{%{}L;O=_&hP!J4yMKSM`!;MBrUH%@_MG1S z)r!2g?O|BaVjouC*uK`-Bh|xvE$`!QQ~ywCRF@YRSS5@E&l6z0>GH!U#Vbbkm(dd_ z+5${calT2Xje?c)+M}Cb^x@|)yRjeDS>_>tLNttN$l4LVi4*0$TRt(fSUU|BXz>23 ztu$n}yavc+=sgdX`wV`!8U(cVtjycd2Q$IZlLWv?U*Hf4HiuD<&n4Kz2DWUjyRdy+ z1Kr0m4x zKZ%s)0n@Q|s8qnb&59H*=TdnQqhEaza2A)3j#qi4=lJUCkro+;j5Ro)vmXOk-#J#k zyZ|i^%$;wBzTNzOi$WPwgc=OC4O$0_cuwH}>FwPU5mh?)G@FE=y})!U2mOBcVlW*1dfuf(EF5Q2N?PppU+u-wVCa4Gji(ga7KHmodAV4deZA2< z9#S>7lsm`32>5pq5G-HL{a}a;IVKdwz%*J-U%ULS*ENMbYj$Lz8XRraLZrrEQ39X^ z>##hrOI3mo%hkh4w0zCQo8`%A7p&F&`yxXIt#lVF|7x&U`QC!%UoD7FZ&B8vtW%4% zp(LtO8{-)ww%y^Bk`QAVaijY?cCYl&pTNq;W;MmZp_obt?@J9yj^{gHimOKSNLw|y z)l~Je0UI|T&nwg-VLHUP__#_uK0CylKy=u;4e>}^IDCe5VmJ=*klvq|YhHt6+t?{< zgp`E)v_e!aZ-a-ZzfUX22ZMv2r?w@&G_+I5I%%3viS3{}0#71Pk%ptPGDWY(Yb_o~ zLA}|EnLCb%b}*UnL8A^DK)2`dWrTlRTvO*`M24%w)PvW%zjEJLj^9a5|a1tv>L z@TIZ~yNmPyhMHslSjWC_p2dspYNezMs_q~jsuX}$SKAeSD-sQ)!@7Qq#a{BlifCe~ z+u8DTd~n!po(R*{QH)xpE3hJWikVFCz<-y~3*SB6$K&S7MB6ew_1M2+dq@S9tvI8Q z*JOtgPg!Ah7NN$J;)j&V_XgkkH+J+pM|VgO^?U$;^unw;@HBNE%B}kbJ)u-6o*&{0rF1iPpP4nOaGe%s1ngRb_V0rfg5!i+hcW2_MG z_U29+HnRx9+Y3bL-}>=|gD^^HPUC1xKh?@R{!l z%4_UdsK&xc>+oUF8hEDHz=5N#eudRGIy1iPgV6Ak&CYNt_ zvBn=Ur@ZZL?wrSG07V>8O^c^P;jL$j(#Pe(G)UkJOB}V!a^`Gri+U{{-Z6*T2B_)C zp9IaVb>lU)-(*;j{W3$(6WEINsM*pn*7O-($7elb1=tG3UP%W;**X0)!;Ryp-_fxW zq+hUB)+A~ID90-bZo3?~u=5eEF(WblRRb?gSxn#zr5tphP?Lb^GXqOs>_7|0@j~q7 z$J(M@cC1ZMD2$08eV{OO7a@w2vG>|f5}tL3qAUcH88mk#VvVp*)A__NTyS3bmnq%+ zbm-224>_o9>h^(s5#)O6HQ5W+O>wpCf71C-KyI~_mee*{bhBx{lMo#zT5!7PXZuQ( z1Pi$?4XTJL?+O%vRJi-`#7@7{ydYlH~DAGJVUp3>!z_wPaID#**zxd7Rr9t+sTOHjVf(G{pP z%aFA}d6tqWzZT8!|MKITr=I0Rrx+&Na#6=sxOADyJ9 z{^{=Ve!e)80Z7wv<4n#ukspag_WycUlW;b}$SYr}GTfe>=QyM+8jg1Qi`#45Z+i?U zrU~pUREJCS#VV2NQ>>|x$>bM7HtQx6*nv|8w=0i5+N`jRCDkioBb|vX%9=_Wi<$;S z_(zwvrxD5lK`e|lK=4Q~WpG##sXCf|tc(m*8PIGAhxj~VmKX2`hP2ePq0rw?Nf(rb z{~=1ZC@c}(L+mi8MOg+EwaMKfi|&NcK}#VURmWo%5k@_W(CS($jV6Jg@IW$6%Xjo- zVF_iujq~g!Qfm0F3BV$l)Z-X2k!ro=* zk1$iuko$h81$c~*+Nq)79ur&%C}G0meOVMgafKEJ<0>TCtbJMzvkIPqDWRGK*I^2^ z1(X6$w(}OA76!v1EUHo%>M16TLWgI)vy1-l^z5|Ts#8!Tp3rhr+KV2X_D@=snNuCv z+Vtk~K2E}D{;8r8Hmsc5;R=RZDEA4b-WYbR7GO6iEji(aY{F6!xM7MhvxZR$avL*< zQeZtTek96tD)dOMjAFvem|JUVQU&o+`c(6XhVJTQeJ=u!DhBzeyx2L-+68<1JJU*w zVh9G5QlU9ZLQGqI*TMtc87Af69!4L6JC;0mp2btbK82Zpt8K?i{jm%X9m#p*`2xBK zg2&>q``&nt21ls6kk*3n2-Wzg0tbpqdIMsJqPMXi7q>CSwzwfbKR_*m|8BELD9r0Z zH1)=xNvnK+#$x`>{4m+2dCcU;ep?nl1i=d$K3(GHcoPj zuMQr*_+o|LLy|?SfNmJbS#Es_Iq(L|CIT%{-oAQ0yy%{vUBJ73^9tyJD{k9cUteD& zG2U;&_FaVMg_$sfZh(G?yMoTXD=y;VjR?@4eSvLrIQ;2gcyRHmKODB$V3JZmwg@Lz zEP~Gf^YfKiP2jV7g9ByI$l~{r+SY0a+G%3#D#cenlkMK-&>Zc#PCRvG!{E;Z^frTkv62=s6QSJejXG4G&w~Dv7x9ezy zJ4@pK4n`SWFCM^31Ur*-V{7xrA2)vHEp-?U9e#h_!Kluc@PggrM;SxO$Wob-XPNQ> z3vpi)GBFS-FLgsqCS{YtLW2vXtb+Z&ig&E`|GxW`1gPq6?V0zG;9L<=Y( zMklFJzG*-(Zne%M!p)Y51?jhLy=@#NyOLt04?E-WER4q#lCH z=sZKa&{2lZ9wUT3*4^W$&z`X^7C$Q(8;$NVHlwdgaSN9=PA%bt5!_KL&e z4D6;*!!bHG%Hv~DU%}cA14Ew7c05m6bYxIzAZVVAz}6BPa*bxt-eR>2QS}KK#vCPF zV0JkNBW??x<^%dA&tHp+YRaOraV?a@7iLZ`-=U<3Gj7&KPCzrfGTaw{4}hoWsIB z%SZd8@9-$|(qxlEv5a9ep3pD7=J>xapHuE(xk}OUBvz+1Sig&t5A*erzwwXwj}5H7 zev?fnrM)m#Ar)0e6_{z?z4%d)N6gc8N1s0)2quq-pl8pFG2l>|P5ML70e|4XBhpvs z(^K!o3w&cz4?or#BbS{Xl(q~CRmuMYg@ln@+f&{!^EmE6hWDZLmQ4B{N!YxB8qCg41ppRl$3{YI!d1SK%I$yns#&W80D))<2j>a{4%(oFr z40|4b%-iLxr5718aXXv@A7P=kD1lz{v9i8Qhp8ZuF)iAB2gAkpyYJt(N!*I})L6Qx zh!!|3g~AVj0txr~;ZPXE;({T^hW}xBP^v3&Zu3rOy`F9tj1L+K$u2fOv&yUj7XD%m z`D1a?AyXvSMv-r+jRXghIrcm!=M<>)=bxS(+B+wV_o!AW-Lh$wFcV(IA>BOQM(c&o z*a@BW^Rsa+5tw)^$mFTgRa}aSEN7QumIj;FI~@iXb%t^{6}cCm>H{z_8!2mU+jC>5 zsINB7+Aad#Ir~#{Tqu=~h{#OoB1M-!hCW64O+Z3j!3Lu^ZvVox6g#Tgv%}I0>m~}% z!zHhN~JCx048`RdJ~KvlpbI7eB8s~Xf}g=+2ydv+$kMS zl$Joxl;@jU-)?R7=zR2X4)@K$;qa_K{AKtPEHNi%r^7cVr$g?denct0E6O13t1V`uRNqRS=8dBtEG*y`2RafrwgFi`xX9J{vnxseMS zx=0`w7O`w}m}@CTpCpSj{7>RFoNc(C2Az|+vPE15c!>5XL>bo{`4PsZSfY&_O?Lc| z=fs8yK!z)Mva?phl@i(g&^F_Xb3!k0RfLbBAlFx;fSua1c=yfu;Mcwv0d`Z<} zPJdFhklS)nUjiJqnz@G~UkKz*;ewLqZf~=HnQPSyuSCaYNSZOGgq_7H-Fp_dYOGR| z{iAOja9150#2!3vkA@a~8gK&v9#Tk92a0U1AIp*%Qv#Y{y0nbYcN(K%28 zoGJz$z))dSI5y>O5X$%q+cjoif`8G){(u6V!yDTcI6teQ-1Mw~f_9FDa{}q3g*K{e zXD#ejhv8W78Mds0*yH}tc^UG{HOl19xvUHw=No0Du@@|fB+M>_6vHH?NjM${B=Y1K z*eNdI%RvG3S+0uTVg(%@eD+>6jG~r?H{bi)$cp%H&_+m-aPh zY#zXw|Eije`Ru}71FfmL`;X_}fBWKF+JM}IW4r>R{DmLGB%Ava zdF`QLzozuVOgLe7M8Q?onAu*$qw8ZP zEF?S28q9h>&Q-Z8@)+8zO7K15mmp#sJo6g6=z+io8h-9KboGg>3t1Yg{3&cPic4BcaV&OS6GZi3;l0Wuy1+_B>BlI1G+s9g zL&*?z+{+-lMZHd#i0|vF4&CqQc&5L31yKtyo9A z%R3_4h71Tp(*R$cVS4668Wi$s)~CT!)dw$ssrcrqb3z810M>_XHtZcKc*QmB>r%yt zn0A$j<2b<`-z3PiB)q%>!{PBsuR9!a0}ga*5=U%4rVSaR88ewDr|~=)kx58kVL_&w zKsPX%Aj@>qx3PM_7BL?fi?@UvABVAWs{2yMTK9;Bc<}4?B_qyifq;` zoNdsu!a3#wgB|7bihA^JbLYj@w6Vj`vDlF+^ic0%+$B)(L zqo~xcJ$_XG=NmlyQ|m8=|28FOW)VkAi=W0(uw7b$p;9O!L!cJw3Yt%iUD+4+w9XUX zQH=V=Z<{Y(H1IC~wo~c9M>4Hk?3v=VT=EUM=wtCIV_Y5LdDeO;;U|@L^7RLxX*>yD z2NT#J8vEkc2d789uE+3Ue#JVCe?Gf7f`4LQg5&FhEK5@7_m|?kRzPdLX}e`o8;5~@ z6=eNv%zolpF@(k99M%hls^vli2Bv=o>UIC{qT4+kzI=Op+`Sl{oF1Qfqx3R7iLT;e zrB_63#H>HUsr7P>Dm|8Ms`#|MH37rYvO*O!N9P6CZ}CldInOBL`9GR34-WtK>f-F} z>Cx~NqUinUDX;K$&~A*c6nfcv+tsUKt!`w$7dH^125&38!x30$4hzR z!b>$>8r@)mZ^J*Z-yIAO27`;{rx_OQplDM{cR0EcSc} zZknnXK1E^0KNL`{K|zyREvwLVF8F0l;@$I(ZGehTMU$G2P}$3RjaD?NsTE~Sa-yxE zNlg=}YEmCLXTK|&)RdQsv8>r*jj_CQ_j0o?$1KvMrXrQ~QV|aKY*N#zYBgDyn*|(d zHOZ&S5>47hv{sW`1})p$sDz0 zBczeK`<&O)9rP&+l`K~es8O<+E7mM{+_+qBD7`A4{om1L%G4hv zF^kVB?p5TODwXGfeegK6aQT*vG)I5Sb&Ifigp!4szG)unra|Tm6eCc9GI=zZqEU@@ zQd<_-g(4hT!prOdj1o+Zjq^!=c+`FQ_SGxcl^q-oPJZg<=gnby6kN`)uY-h1EL-ru zVto;m+lX9XX~-3NsCRPu_7_5ff+2X_B#Giza||57NHd#XPQp>X;^hUJEwZ(WCu4fo z4Di2XbS29ELo58*qY`v&C@Kjn`dJcw^wq-<96hBNqo}+L>jy05#wecRv0+L!+Bj#Q zvukp?_w&=39Mmp@n-G)K({0vtHldS7I=J2z@GK$JNd&~n^#+5xaXE=EH$FaJ-+HmW zwGl?6$$T7aP@d(;pRm%vI&28nN3+>Cy&wM4>1}O3FCSwIUA=4kZ_ZXMxZ)KL-XBKI z#>Om(M;mD{x!S;0be=YhMMe>v%v_5B0VbZXpmofLs)m}j~dY>am* zXejLGZ~QDH`+3ahn*mKhZELO9_wD<9>^_9iRXjwLy-+));%>m=Pff=; zk%`9{*(d&W>ZLISu4*GW(z_H!h7vcW{0?v$c$eWHK9ER-#AHR=yA5zzg8t6X$YqrI z6hoFQW7m~#T*d1jW`ynfY>3V3{VTOXrjg%Oic znpF?lPXAMtX0)2Q&`{z2V=w z7pFVgr!D-1uZQOsXNUT?=i0a7`N@&~{l$Bx`_96#s(zt2Kbl~$-mYr{N^aJF1o2ff z)Q=OtMx;4F`p?97b)>C@jLy#M}NjNyfVDz%dB z?GyR+93}|}oo1fjIQQ151SF$_<_he&J4~TPx1na}@>wXQmW|j6to+TA4W<{Ep~zUY zcXUy7ZtWDeIA;;&XGh@ov?yH_RrI}{yKwF>7i9LE{lV*t?!nQpcXoKt)ArkX@X>wm zdWf9HU#9X#d=g(@BlnVBB3>sn`Ps5s{Uw>+nQx5PUMhG6aTI$x>NOynFV>`aUlg-# znc)S;jKBhG>OT^fpfmFMm_F+bct&sYI=w~ zwPBfx&O78i@n?{8QW5MzLPu^OJ znh^s8Z_%o4Tr9(tA6oK3@c84l-Wp=Y(*;h0>?R%?`eK-=;MQ|VR-6EmC)o+s|5Rtc zN=HBHpXTdV=I6&s7hL_M)e-Om-#8ifwKyi7eaSJ+wbZz$#4}cRAuFsEJB{7XBDFL&^7&aGc4+;RSEmQP^3cfqAbQyEzUE1o*){#KpZSwR z5n+?Z_@)Ad!(+bagVxm44j$CcFau+hK?jqJd}rSTQ+MI3B(N9!vf~U8sr49Vg}a}c zs)7+&sjrqCY^|Nb=}{qCv`RCI*fTi_u2O?gM`V|vx?GsC(af`zf$-mqVsERn{ zC#1uZUa$M=pf@}@?GG;A9^yMQPC^4l8;Zg1;bbxiu6;~L$3_BIVb*rzOM8Jv`-6kS zzYWhoiXQjQeg=IJo9K66{RC|gH%OlP9f(ItOchn)=rw>c=d>^TIJtDr~koVs;+hf6r3}5GNpP^0C>Q z_!j<*?j%MxKI}(FiC>H?kmo0brR1WEj5Rnp9KLxw=>F22&S4SKHx`_Vv`gb*Nvwep zipO@MCD>Q|%?%$PSim`GSJ+T$o(HKO+da3%L+6|9SSX}}7x-tla8{7d|JIK8>{;k) zn4_n$L}y?Aya+~dGFDz3#$(EytH_t|{d(w(hbkUb-0O7>i*I-3l4w90Deabw;weV0 zala+&bJ4UgxpP8RyV!Ue2`LTBUcNqfOoMAUIt&e3P6|+m;K4YAXRRBHJX2El;BP31 z&g6N4Eh(9$;Ac|aZ*;Hwh0ASY!rMfz1FRdC$4i?+0kb>329-O zOzzt3fHv1Ka8Cou1zvf8=nQnJDBt$kso{&~l=JcVw}n1j$Rr4nHl9Mmx?=!L3&Rix}X4c$v_+rnER7(6yj+ImVogg)}(X_C@VnsJa~CAkbOcu z>oO1n4WXR-pi4j`0d7%R=c z%#&Y9S2NNznw&;$54evEBj|N4KE%@(Dvc@thvSa^uJEiFmyUOUDJQ(9e;MJm)kMe# z76XRwFaBjT0(>eLcJX|vr9-|;X=ug)0=g#YsF7umwudG{1u>%@oRvOVAlg+~E1B%;hH z>YnX7<_jU-BBGBn26qdS(R>QZ5bV&>^-`KV2bv5~_~-AM=)^Gu4(tz(0I?!YCsBR{ z?_o?hiWl}%m||#;DWdeFO6C4ETVVz+yZfp|l|0=q3(F{FW0z%l_hB zeiC0N{uJYm1(F-aVao1BZ~V;CO_oLGGJuU}7$>5m`rGE_r_HuE{24f)J3M%Kc7aEd zuV8?NxLxNlwrKFIbYO@g)!Kxv(0mR-rr@a(v1J}CgW^J=@I)2WYJE#axfp?`8LVHg zQYZG%+KN+F_FQ zMY1iLw?k-Zc+l^6akao7M=xIu-<%zF$xoFAPkBdz)EGUr86v3B%rPdJur@=%0SYt2 zv5At$zWPoF*NeV>m#fhAZ6wpB$>W=dV8L)Rr6it=9orFn%JvD$j>583)K>bKLNKB4m~lC5!;3$9DzWn-j$rezXE;k;%7^$R%6#~TbNer*hYa*ru(0HF=`A{Si>ENcJ7#e$$!KA43&mwzyO2!M3S(LW zzA_Gl(!E8$;A? zx4;}4N7Sg9Gm4cv${>_5je}Dh(5e`SxW-Y}A~6^zIm(+yYTRzIl(R~RkRPClh>wqo z_oU0+T&g@!`~I@z2Jkc9*_{s9%^FULjyDkJRHQT|^I7J&?XoAykpGQjv6Y9uEwsE76OPjd+nv~_#8liCEhTg_*YIwf`qv`$q!=@h)g9}@W9~9 z@>hm5q14ANk~v_U=WH-RH3SAbpdabGk}Ie87FeM44Hc=zV396ZESy_Cv&ZM>|JGH3 zO$AHoH^H9@*v|mE!GG69qVwSr;IW#+p!dC<60;^P%oO^{->#?WFr^s2dv=Tpg>mgu z3hUF#EX^DX_RK7tC>ACeVc1*~<=ftxGO-Jn0fszDeO#En7^VF6)R!s)d-k*$Yb(!? z^kn(|!SL*qj7lDKipstim)hYNE%bd!4k0tc_a&)37Tnh4WWDF10CJzOYC_XII=JD= z4ZF`wy-r6-jUL69@%WAonr@RgqjQ5P^WO-_A{9d&7g|~|=_|=^Qob#8v|88T(!EF? ziV&+?IY3SWh4;%^tGUgk|L!OuUe%|*K3te~E;YRN>aNV%!n$4xoLO=ywatazQCk&M zQ2kr)Dc;2N2Y>7TCj(T_0V)9TNn->YozUYXvko^+z;Def=GUvYc;Frjp? zvUYVg6MHrqj!2$B5;ZaHGLvVvbtX2nCzjHa4jP8<^^vZbg2f~v?(6|MJ&^yh)WW8p zBH$$;B=blI!0=s(KsDtlV|y0wKmXe{AImav>feG-vxM#A^|zdXhAh{Jntuen9sDp# z*OXF>>)Gts7HK{xU741J42P@LmN{J7JjQsFXCr3ulgaIzej#p6{0}#5o(`E~XA@bN zN}wIoZIjt9%HKmjRbJ^`Y3e^EV6!XDLf^P&j_QBGjx$*fHo%g+aQD0?-jkM$uzf>u z{!gVM=oQ#7+Wd7kl zSH&o$PhBo@aS!7lmAf-FGi;mTQ2=cjEj z3IwI$K-&ughe>>GWKwLRR4QsMWU7_wVUicoSyU?Vo+;~^NJ!W$Z5;#}nMIWsLIt*^ zAzFn9z{M5laZ&uOQ)bkr@}XtJx)SLXQVrlOi~^BlMM$iaL}yV>gC&W{Up}LkdafSm0uL=R3?o|Y3ul#bw}TW|SS^J4Ib<|zvz#!d^&Rz$ z(V%D@Xzo}H6x7k-APnr;Tg=%tjIV}1^$!U+#?-JDPe7b`442^t|gt;{~Bsn95e`7>h;BT8yJ|DS4;!)bg(Y>{8 z8DWbcXUzvxs0vFn{HykorGrt|UyNguFTt`PjQKaKe^l@%$7E|S%x*n0#qE2qyBB!R z`RdHu^62i_dwcGkoKjh|>!I^&4ADt%(3Q7 zy*~H}i$5`TPyM&&-HYMzL0_2W^q&A?$0w)Vqpw8~fe~w;OhV6&hxn@Bl*7c>NMS>x z*2!sQ4K8OMGbYeD^$pwd%NeZyZk9146u_J%Kte34+A>M=W$T5EU<*p@)A z_`iD^a8DI>G+_dQH;9{gKp9G76+>ADSgCQ9gh4bmONwc+yXzI9v=v%#JU_`70vn6v zZr(duA986WItZ&P`%5eJtZT?UR))ispv_myXpAIeOLT!0BER1* z9@UX)(qO-`**q19t!={yMr{`KJ`PJ?l=00B740~R(5E3sZ4^Ibzr zCs(H;>!Ajd2sa&O{`E@(2mj*Y9}8yhj>s}z{i zVVveF!oT(9e<6LDZFlA<{(u>zI}QHc(e0*a{J1GumcX6}D!#k}^|-0k@97z)nG2ZbwsQpq!m)tRbwPMh1>r{y;n)S?TN?y6;2*IarI`U`1A<(l~+!&S6n*? zrxuDc=9w>l`_$074=-6*(HUrRl*CEA0o>%@X^>$ApXQUzCoT2mZS#4n2rl;t1s>XO zjx;nlZdW-q=-|VT;^=OQw#JGb4;GMn!|m-Q_O`;(hMyr~Mc4u5w+V8K*fgqqR)+yw^a}YZB(U#-k;XZ>B-8 zEfXl*-rla?zF5aB9fOMvSO+$~N$;Y}|D@zTM5}Az0?o{>$Dg?2HT<#5h{JC^(bk$? zn=^$;;SoFU%#wFd#&AE8X%wwF6rb!q+0Hp}ZIbQSQ_ix&Yg%D{I#Wtpitj%u=8$DM zQfg4DP!mN5l3?F^j%Sv#zpy@TG25m0Ps|U`#Rq#37SWSy>~^6<;dV{0HY(O|lj66A zg%-^EN*?*_=|@QADE~f>9}sDg4$d}whj>>?VIuHUJOKp}dC(t$KxMI4Ma&8kypL=k zn0&R>$F$uU0KsfCemV+6TXl>FBlw5R+(qm+N>oB_et68i@$KffTbn;@+}_-E{3Ph` z<~n(Eosc<3cEYFwtk>D=$hCaV2M=QIbGJh-3tx1XnZxeC7f$!et$YFP>+e z_^NY>@gI@UQ((xyIv1K}IXbY!AWhUI`2lHT=_qbYnbI%kMVoUQW}0+WiSRT-_JR>- zI;ZHF*8!b8Uj~vlnY^|_5^TARw`wyA{Tt<6Ml+Pnsf;8mpHGxG#)pk=GfZ!a%NZRm zu%=z%W95d2!Q0a|J~q1I1lD}n@K9rG2maZWbU{1vjPYhOkr5tP! zBUtM;A5)K7F42G@1{T{1f)`TJ0g3mHQNjhUS$LyX+l1e1YdHgh>PIUrWyYGunE0ZB z<-FZJUTCBs?Rvg-jZ^hBoS%TmGf=tjW@pLU+uF5@@zZ+E zscgD$`Nfj<>GPs()V;~HG|Une$xF3XP8s8iaozT%6vMR=+?Tk4HO|rUJHVnPl(?qU z@2`rSrSwbh=uS-nD6FAeY{JM@44rv>tQ*!SU8~)(3T`PIi$(8rbn89sN|-@mRYd6u zN*P#}-PrOpvMHOKY?i2JK9=hkGWTJzdzBc&JV`MRS)Xw2e$ImpbJ{c8h7Rp+!!(8U z;hXQD|KLDdy){;lB5%khxgGe|>3T4oWtf*qAJ*!@)JCu7m9T<^`N=aEyN8trDu{-M2z1+vRza zt-E@ZH)RCOo^qU7O*kP)i)Y#ooUa*+H`M1p{|6Ax|T9s&vX?dTNu6Td-8Yn6oup~BUA~sgkhb0vO8dNNj^Rq4i zs3OeLpM4=e6ltQ1nUeKNG^GGSpD2z`VP9d29aEgKuL`dSa}&LoVQ=BGpLdd5vpO*e zUTyut$qcHD0D3@$zneJhqg~8C?sSNM2pYcWbcBQz)to(K1&Te}*pPh_*MC~CYMSO~ zU6TvX?qBirKb0UnG_!(PfF0QQlumwYcsEIKCFTV}qKn(cU-xC=Wd*?!;w#oai&Oc@ zZ_$&QR5EE)fM3`F)L5VQ8;<3Wm8x8;9k>4^ieL*9?idEDGOo=Esv6rJKErZk+KG`B5K%|r|>o#X#ua4u8B@J?XX92 zaRJ&!LNuR_;&rq$E`Dz#MgULG)kQM|U97mDQ(6pE2eLhyPh|l>8Pf~lD;CmUsajY) z)rz*`KDzqR9;2CxCh#d*teOU^_@K=Nc14MBry^Gx(oPh57rxii^P2g2#RDU;uI~vO zn8dHqTF(_9VF~L>_rg9mY)NQb@jjJtm8MD*nkN4xtzzUk<1AZ`V)AapF}=hyiobfB zz)q7L&t#N5_z-POhhd(;Ugd36lT2EYQU(->hFOa1g+0_BunbI!$8uJ%NCS8_P1z;= z2_`GJBRF^^N(g!B9B5h~lE}~uR2)rb02Uq8r~_0UPmR{q7cFeIV2`GbsQrvjef0j> zFSg2pwOY2b4zQHtgD#$l1Y~Nmx3{mpE0V=H`v(dskZnCDK30z)8aT{-1Z?9=EN<*h z8o0G+6p3w~z-vEAF0O@!u5L#Ld9GoFd3xHKB6d`}nw1J0He3V9hetj_Tj?a3%v!DAO zC?_7KR=zkn>h>`-00s*9>EvSY_Mqpz=?-3>9m&_i8QPQX-CqZHUHJ3t1i#M%P@9?1 z|2zJjOMEoOO2V-z!eqcXn!Oe+0oR~Oh=s&4xlI`13Xb{$s6X=rHAK)4dYCsSf(mAM z7?m%Kl~~kqNDc86*lCu8F}ffFFChZ!Bx>1z7lg!xi2@}J&_CI3)llfPP!1RAw5anh z-|0Na4RQsUYvaAYWD%)?IC&(`@{y~0AV5&tLxY)8P0vEPe32hZ2qLHn1cbZz8_ z7OTaMfh=c)f)?vC7O-r#lx5Skyh_!_<{l^>X*cDq2cO7XFNp9s&FgqmKO}3{nC-F1 z*$nRkVv0!ZL7BIwC(P21r#sXjtLLqkVdN)wL!QgRDu8e@D8;1o*{O`Ctu_j?N(GW! z0b?uDl_x6Dn} zY(s0`t~J5Vou7-MAsUk1W43bWn_=AoZFo zD)|-X{$jU{dC5+(>TcTNWE>>JOC$&OSp1ZXQx8f4>^n>Yn#c%7{;s_T1dWB)Ezy38 zE2S^1;h!~YvHWBH6)J43vht=T3=yH44a;y6e1!FgL$iLX36~xJp!C3#ISx>NS$8`g zvw)WzhWJ^(HVT-$vY|3K#VJf&<;?109`#Y8uX!`4gr!rdmdI2r#XepQV*YTP8q9?u zQJjYT3{C!_m96}U#yT|}p%298(p8N|l&?FN(m5H#2gnDr^*kay^g{i4?1)ckg~t zQWd2J8!n);)9I~_m zC`vG{Y>Bp3HUpNQ(Y5#=w%yh|8hEpn6{fFJVDVY75_k$nu%0r&nV>g&X`fuYiPGgO93Hs*m0hPUPgPBs==WAE(n zZ;ne=ftRs>N$_=9oN}rIp@Q`=9nz1oigdRYth3~=BINbZylFG3A`~K3YV~=h5KOX^ z!H|?nuHv+Y>iri7_EyCs6;CDaG67)Q*&*iyzQ}M1VCGTc9XpB%SQALxW6ara0K~ymkLuyGz zqRN7iDm7f5dRV(HCkT{NrFgML-zb>8T?)GeP_Y3Kay}Os*4E1N2h_uY3H&=qL-7G~NtYPx;P(o3fjiI@u` z9=w)Gqp4dOEiFfQ19gQ6mjhgf;DTU^1d>sNS0oOm_YnuvMZ^IPvNqtXKPLY@#DFWx zC);K%x}T}B%d^}A)Y}D#uDExE%xv3H&27x$N_Q!k_@evjq(A6h$Qa$t1^|TiHruM{ znjkyNjxe80a5RSbdOplz9*^CKw3G_VesihU3^f%2({u@9@6Ym_Gs^WmK1(O~Ba6_( zcoHYu+lP04M9~p#YcZL#Ha#+?l`9&(^jcn{Fittt(>PMYc2*1jto&3`Q=VdJCRAmCy=?sqOvN zu#Qvd@@T8j_zh>Mr7FsB$r1$?P@(9mk42CeO0Y9yFEv*jV{HhHp{xPPJ32W&?p}0( z|77nTdrgwdQI>AodQbIR_J(yK3A&)g=>Zok6Kj8M6R~v}%BKiJ=m4DhO?1K8M^|hAr-w#_L~AS}n&m+9v$}U9MSq zA~oA8J$QZ5{aGUfU!*B#3AV=}fV>qKR`wse%CJ9Y7+qwPIg`RgP|XEBCg ziaoT;40&uH`gRk;RvWE8{4k;rSnS?CFEEW0HKrw{yzzNVAMTR#|GkaE>|vd9M4>@A zg?eaKtVFy}15EdMZ0T_j%;*X>Pvm@xK}r?5jSW`PUfkuNq?WKmI^O4xc^S+A1HgM=9+-f_7vp5A$e71s^b8dND=@%0eT7JAABgfn55M^jcS(gMyhi=`}=B&F&G;E z@oVQlrk(#75B}rz_J6$D{*V5DHe56XUcRD%l#R9Z(P|@5y=x{Q5o02s8#%OcFAj4O z^0O?hOmRY)#cfII^L${ok80{-{R_*^}QTfz}GE!@?99@|P`>-dAJ zM?M9%B*FF`v$!qmWcm3_vlVSNHb6su#+(%RcBlpk#$!|xnhHBOPGj(sx9e>Mop0@k zQUNslE*UV6J}+u#zAVoCNuSv;U>}R69344kd}(8}GMVL+xw#;!?va=iI!oFmlx3xQ z_KbSXd*IIeq;|K9lW)<^F48A9yB$5M>`T`s8%$wr5i=-d_j6=)0D?_b7AdeCx=Jf3 zV1c%$(O0jdO00s~?PbajJ^SXrup7R%_jzzf{FOUw|J$q4fxB#_+N*J4p9?u1R_x1B z33qX$=6`#Hm=p8iJwnW()-U^|D`09~+Ln}cyLPG0BUWXjXr4&29&Hj83AwH;1B)Ah z79kxwEheq7sH28$xzm=KHtk_Fp%Wv3RagtRx2;D@r9NZ# zb@t(&M#F`iey*fq#FTMC6H#t9TlO|Oon4G% zZLS6@tvim|X`DIkd@?J;E*13!yr_AVMSL&0nw;A+t&0PX`Y?2ZsC7EXsi;jh zMxp}O(A#|YZMV{u1SF}dl8=em1&Bu#mLnZitxGs&J54p*TN6u<>)I1lm;I`qCQ^jq z$x6-0E~Qgf za~+Jgy+%>lxlhzcW)TxoN+@JU;>P^5%`h7uXRt|EpvaPNwD`D#Mbdw(jk{@+!OXk0 zBT+$8ejWJp4W3+3rdWKd7;EF$Cw=^)$Ow@mL#fwfC2c3FqJA?<=-5<6-JYjsch^kd zJI};ve%|Docbgi9<+tg&Xw4EG4--6T8F!W9Egn%l@1!`go%1v3FB-)T0hxFb)Hkou zJ5*qVyj=>m>3nYdv_~wjC_jB%L>+cF#+te>R=kv!Or;V__vCm+tT7I)hao3wS_u8? z-4`gr#2Cbd?g`R`ZwczQ)-I&9$*l7VmoM8Fd+YzSD}~qH-g)<;@4fAJkGz+^()B^z zYleU7?Lr#Nd=f{BN@1=Ss-f?%0Ve7z>O74Vqgk{HHf=l~8IyonBEiziUGC2k)N8on zLh^u|wfVc5739oOmS9ml~Wh&dW*%jaV3G8?Ns56qzN*5$oDa3zhEy* zlo`Z*#=5H=XL=lijh1fxw}*$_e!pRzF!q7SaVv;aOC3J$N~N~Wa5(ccz3^Wwa{97L zuVTahzefiyT5scHs=q}}atc0*_Y|hyt)Ie#rR3rPnOa{4-qeSU(Z?{!=041b7&E#h zXs3<`_HyGC=J`iOQRWRPcB#s$pw0vQ-X`|JLiOjA3ImUCaT3{Q4`+ZLmo|6Kz4}ty zbWz-4ra-%PAnv9YCpCTROa zlSt$NMA5(Be5d5ts*NIU3%vf@lR>u(L#168finO)uoLoYelp>UPf=L%c+?d;P(|;orQA?!n<}*cmi)cd+A&vp1yv zAHKby7iXv4);9VNm3h><$H0bp>B@JHfw(w%tb0!Nr(l<$Wpn1o2US43irX^8e1E2v~d@t8#v8iFkmcxYiw=+<{MGGLHzVv zaiXsP6&C;1Q&557*lNRnp5uRB04|`IPN%+5Xh8qvC;dey{eL=Pc>rR{u6!F##v?x& zr^MM)Omv27B}e`tXqm>-AY*5fxG_#WpGQQ-*sy+d$Im1M3g~SqOAvkmL+hLHDpIW; z56@1IPhJgA&xUVL*{tXuiD~k$MgN0d&pYlNyy~|-j-PjMdgL9S^agl%chKvfc?Ulo zob(P}_PXBBCxh4C0m^E#tGWyz-*fiow7k#AYa z|8$dfU|xg7bjmi-{HpRE-Thd%yFwFKO=q^)F_7#_AT*78bY)bxD=hzs>$!hd*v=e9 zlN6C;aC?uwO)}_RoxWj8j1IQeA?0>8eM6urhH@}EcX3hPO9b;ME z?loRXyB;r6w`7K<74c%;tt7a{#7s#bd@`UBi+FsH%Ns=Hhrg_PNf^Kc^M$DQNZsAo zO}PssSGG5V(&8ugTn%vA)fz`R<@R=YD#W zWIopWch7#Ey&bH$U+GoN@k--)G736)Drgz8)sGi8bgzEZ951C`mJwV1c-^yKDE;g6 zA&F(%1Y7-h<;%dmdbh|dqtB|?ISxT;^)9a4yLg`MNwuNyEZIBm z*d)UI-lrdzHRl#(Zt7g#**mjjKW^e%+Q=}ek$X&0W5L+ouTsD-TKwp})+77U@!laZ zH%L@%AWb(g$J9my%HjL_OoF=04z||8j8=Q3X|9G%5FVYNA@q34$O`?vM~ANJ@;#;5 zvUcVk9YS7Fa%9g~RveGLp781Z;9L`Y3P$rR0H)!zy$(8;AUntW%l%FlCUq%{8OfXk zz7K^F@c&{0`+m(iNm<)Ebo6JT^Rja?i)Z{ek-_Al5}7%c^#*4Vb>eE$UPPT>gW6#! z!saUj&DyDVe*asv*na&bTDS3iIdIO%$5?x~^kYzt4*@^i z#i$2(PlIXzkbFK3#w$C~P3z8FZl$)ji+jNj{a@Ar8axLI<^?nSZDvwQR;%4*7vDDF_O6+NA z*6$v_8?|+Cb={MuUaRV0-Qz*%;0Sd{yW+KE2ghNGnj>0|Bj}YVT32;@1UmL8aCU0R z9^q*j?+mExk#~Co|DpIcX!DX~clQ~qy2nj0R+pgSeR!C$BGBZ7NCP$wF6Y3%I3#glvgf@+o3HmC_i7SX zDR2DQT5jCY*8P<*G?(3>LDneo7;w_L!g?I-Pw+Irut1@*GGmg}#vUI%RJFIAcdp8^ zA1D@MK1S};lE)MHj+mYTP}8{=`>zukv-zf*HV#Uu%92>SyI{BpSZu6wp12OO9#SVF z25B?O(J#{@saR3rthREo*08(V{yT8319yG)mIkh^k(81v(Th4NJ8C+&I`RAXWY(&Pqv9_Y3Q(h9E`}=9&V@e;XbxW|O^` z`k$IQvihL4HHSPg>-U>lwCxtAMA>SYPIyf72XOaC!|PZ{S_eB(mH%WFOHsyam1R(_ zk5f4kjQJ>(iXYvP%b4IGJ7ev8o2bhaTfi^(a%9S71__43W<>CqC6-F*aMGUSPuqsS zSLs&1KFx35UxD;~7(#@O}lG9t2-M4cyqY60(jxCfa#ANxCjfRyA zi6HNyfs{Rfx>W=_v}6J*P;t@}gk{;3aZQqPTGpO0_Z@pnXZsY(e|tGG;TkJbK<9vP*c-ED%=XmzKwJUK#8 zcxSIGFk3q4ISg2t2FzpE#5^TNO+|NO14AwG6Kc?M(GiaO!RO~4bbS%h+l0*Oq$|A% zi?-C_ycwf*2nnaJQTTb5LXdQ_^NLR1|U;qu@q+9U*l2E-qQbe#8nF6gep zPfT>lqvB!~VzK0LDN`B2hypE{Wb+&Z!SMOk;HPR=F1UCdNPa;poM4PwTD0VtglHfD zOx198*xo6f1U!rsLx|dYe9zAH$rs_Z|1n@9^yNG|3dd0)6r`)atUk-Y#Vvd>FAPiP z{@8otCm)dUq3@Ex9~ZaZ@)T-$#1En|AihADrek4`j6t4*5d{s2=_)x#7_9*q(ksFF z@SZ3i;9o4bAGY}5_!1}JyY44{luhnVVa3H{P<5H(h`4~^8ZZ#*1Qm223KK%tyrxuD z#on%xo!E#h*v}$2-M^PL`O(trdq}uAegn!g=SqH_Qge(C(0Kqc>;PLLzR{g->YrAj zYOV-7v>sn)Q}5kqHrtq|!6Zo24p0S%hr;rG9W~&dO9fmkgea{MC6{zh zOlT6O!%^a=H=sBhae6VFXqc?%B*TDBrl_{lM4i8y8h-gHkau`-(0|=M!WDm8eLr}8 z(fv6$fyG#x&QlDrq0y7NxO4^{Cszb|4Pi=KV&>XDI|Aq0iaLYnmNZ+ZNt3*b2i0|9 zjMpxB!sm55bpq@%Nqp<4 zRX@VJR?QwY-+)~|=yu~xx8FZ_)oob9#mi0^YXfV_SQ8Br*J2Xo1g&l=CjwKQ^@scI zu)IG;+7TS{I=Pv7o|_{yjy@wsWa*-d8E=dRsCLfOq7l?U4vvsL4|@F6#h!{RRhZJ* z`a-E%iiuY+Nmt79qkIFDK$Fxwi_OcouZCxD2j_1GlB7dnUe>&tqr(AO7q&e=xo*|r zvfm!bF~{mnvQ4DQ`PkNhQ=<`l=ynnf2!IRmRP!2T2{Y;6Sy>|rP|uUg*ge6UjTi&B zy-nmp%H6xAyb(N`OVjlXcC8o+S4lSx{5Xr#&tF>04$p5^3C($nFNdu;=G#QGtRx7Vhpbniaz#=!&oh<0@r}*Kc{$b{4fFtlRQ<$H! zh~Vm>10ZxAqrQ5T#8bj8i0Hf=|GW&Y!zdy{)CePl$FrG|#D&H0h(~OXI|?)qvH|r( z1Til={h)IjAaC#qZMg7k!eZx@1=E?Auf({bVaMN5z4vX=XG=a6tO$GECJ_NQxjaZc zerVxQ3;!)3phpT2=<(TM@8ooVH=S3Y+y;I!x$}5X1|SRS^I$60F5+ZkT7n=mB{YPqLg6JP&&DO(s@#VN^B9uFa7Z$);^Bs(YTPwK_eLX zuqY3WgP>Qj4xl#)DANZjJd8H>Ln@%@Q!MxF8702xJaHAor--uUE??^?x?DGmy~WtUB*B>nF>^wg)wJRk+4n9o1w%0Eii1U8O! zP2!QCvAh#F9r)r)={uq^`OF&ZbPUCoWF~dwihG!-iL7x_sjJGkS?_e{- zmji|FzL7K{f+on_m8H{w_KYqbBJ6%JJ4mk6W#>(qeADtIvq+HW;i_FWvG>Bkg8kZY z@TYye*R;9?|5wx%;}1a;{t+;zk4C$JciMjLXV8Y_0PlLeARYN=3`^zkMkJm1>CK}; zpLDG@wWwEDlX;3J^zYVEz!3WUzTh`3%W^3Ps}MV(C<w5t8cTkDyrBzs<0zYDJB8ipOF<{QGNN%4cc8I&za5lTt3YH1Vu1pJfVDH5p5j#?@gCCoOfzR{X7+ zSq&X4z_g)Ex5DcjjDJE6L0e=VSFbWkRl9=2$*+R7g>3*z0)oLc*I$*_gR`TvZR~Y)9k8@O zJhnF9q{kuVKFh6ok)Iz6p@>Gp8J13AF=IC_80z`P{}@804iCnedQUc=pz_1-tf^D$ z>+3oO>u9A zii@SXV~e6}J#6zFsLK<}IhGi27PI)4@7}-r4tBKOXRoon;>I(mfVrl^3f3Lu2rC0+6Zn{$T%;JDV zNvS4!wjof!H)(hoPT;j+7Kl3rt9$de@Xxbn_UHhf&KmI)eg;iR(C~em2CT(=K;3E! zw6?VbPn7b7&Kp%Y%RyQM=go)5x$egL3-SX6NWh>$j~?;cTeJYCKdNPKF4?xd8PMYv z_NJIDT7tl<0V&gnhO~Q7WhN1hp#(AzzvNJ7o&C!&@{>DeCeIJiHs9|&`l6uw4}q^} z2;iWLHIBwC2gY8BojPlA987@x-i!d!jj)7D@skhP64e9wSc4iR{amVt$}$Sj4E*v| zYAliR4*H0l9mv&gPN!&+3HbQs%eXcDXK_2I4roONLNx_Xqpi?^EBVlQPOSSibEQD{ z9z$&3-1)&p zzdJnW4_}_0^@e8`Lrfdo#1*~mrR<-Ne$tj{mWoIgp5KJ7V(i81lY^9*29iWQHsF0D zTj$)mXz51M@>W`&YQh8~0c0?;rc+4GCNICVITLF{96jaN0gI7~QKh00*_$OAA#$}! z$KOIO+HfpOnUY2Xxpbv;#f`{baOQW-9@vX< z=&%fVd=AVluc=C^@XUHt?-DEGi{a&6o08rHb_j|9$&<$+h$Myo;+rA9X?vS3!w9Ze zpG>^yun+!2KUlT$T9_sbD^1`(_;=fTi=W>d{8HVbl3EKv_&)rX-VNzpo#w46tPmI` z!GeE08X+iV#VB4c1QCtW5Do&v zzZa@3B2XXzSQyfB4UZKv2dS1n@ijhkh(nU8ISjBWZ*a#Y1|rC=`*6 zg#ZN%ka)K!tYl7PjS>b1el7}uQhyMPkinoAi$dYSfeFq>28X{|6cV$*CqN?xh`m_| zj+&){qzrlT(G;WU70r(z7^kP8&}h7`6T?c7tF8fAVp11bha z+}4zjf&m8VAv{4&X(1LQy8@CC61%Dp4?XKFlqXd-Abrs^&INag4J1mVrNnSr4$A#O z{I$`tjhAWs0q=2z(B9vV0zzQly9XZ&JrK;~>I4nts`^1pdH-IF3cX<5?(DioG$XWy#p&vwQVDWYc{WT}(^5D1}O8A6MN;B~`_}yO`K}m?&9Os`{t* zj$O9;7$}L^lFw7LA&)(OjJaLnQGl8`+DUUS9hq0xYRqKZB#*}|z-m*ypJfpAJ6qxT z;H7~$&=JMBowDb|l%f|>@cKn?qgp)ttGquiq+-dBvGbd2%8epJCOXlQF4Z~}(a}jw z5nKn?oG2>IV(v9a;565fyu2vGtX}@g?Q}4X3pbTnssngnzdHO8S_S%9%)JFzImNDO z3GBHY@#;EYV`S%9gHJG zKH88XE zmJDG3qBddQO<*C_tcF zK$PG-U-^7=yTw5gUiDM;=~{qLqZBaa7ekV0`P1m_UjMI0;X@JL*9Gb_YyUP+QRFqVHsc&=Yd7UDS8q>moDZJx?;=tLM&V>_ea5h zrE!`R1kz5<@JoXNbUau{YbPbhnmX>1)$;4n&OVfLWS=AN8+5t~Cs^1^XTgY~r)i}S z=G|8CD_{cvvHazoyfSitV~H zfMb(Z9C2Gc1-ieS42C>be2#9+D+!1bD?-0NkV@C#M;#Tel(Ot8U&@q=CS}*wNBE8k`hKz|)#tJzls9Dxv^C`|0v1aEkoWh+0 z$)m<^hn1V$H(;r9HI)0@Kne7H!_`!#lynkINkQ4F#oA#+aSzLiFdYS`Y3*^XKxZ&u zVS2=KKp%{d<{<1aQ4~!T_24>Bh*Asxd_2%n-5twJ;=4eA5vGZI@?wXMDp~Si6nV-_ zVlOBOQGOoCeo-a%r#qXYK;>l6y*L^`)t^ zrs|ceM|XL;PrA@SlK6K!CDT&OYOJU6nyjsi%o^5gN%cibUbCmvVETh1>Y&G5eodI5 zfF6#}>sgTgab8(Su!3qM?)s&R2fOkw^X_090%*ON!;k!+gu`1a>OKJuV?2@~NSVAjRv{9eK(6IB&lgM$ElZl?L%sq4yzSZFe^jtWjW}KjZyV^dk8ED|>?Upynw+w7)-X)=k)mlb&s-`Tn zUk+~p5(x@fvhUjDqSmrT;kLJf}E;HOYvGrBp8D>T^6$$3mbxPe|EKIKw zELq}hI!?iJ>^wH$ZivydcXsvohN*(j>d$$Bc1BdA}sAEbSu9$CC25f6yHBJWFD z(?uhn+E-yPf$_mTgvfm2HCcFKdP(|yK(|3e6rNEPL#d@jp-u-FhVeWVsL*XSH1-j6S{X8V-PS6vP?B_$7u3_G90AB13kwLS zbPL{#uQ~U~=*)Ji>qO3APfaAmWInij&`#^*^!Ti4C7hBzhu{3E4CfAg*!|_OYlH+8 zPnO&PAC$!vR4U_`^nW_^o^Nh_=Z!=EI*O4Qu58yW7$j~U;W?w%ybMM@M&hAv!{$7s z_;Kt;9mDa&i-v`ATNIk^znI1V2x7VDf`I~BA! zKRaJ;?7zS!9&}_Stp}Iad5CdW?3RMe|I;b-walc&?h7Q=*VkQ*Eh0Vhu<2G%)z9Y) zH0*SOcaU_}E@?r>l_;yeI0kV6nn<7)deohaHo3x0cVK=^;&_JgGKlCVD^KjLCH?Gp z0p54X`xVr7r+Aww1by+$jdV4|8H&dd?0(Ha2#KafiGT^L`)0e{*E$=Q=--%ye6x{5$@K{od1ePh&pfdU4Dp z$g1qgK;liU9yf;BS)jN29UnEM-`kbm??IV7$HVc-Dfx1CFOClmyUi1snd%YQT%F`u z7ew|*pH>Pbsa9_GCJYqOz~d^GS{uKv1LWA^dm`e4jpA7#V^tYVS(;J1=Eml)-kKc` z+zM~!ljV!EhxTNZwr-A6yPj(HSOg3=8gn&d>!_ow)>{WU#g3cya=b}08Wm^k0#%Bh zt(y0;vqhxcED2-E@g}Vk4q<+0adJG5VDHM!vcps|m44@{e9#1iZqFeO7(^3q{Mq(4 z8T^uYqyGLwaL3-}s8QgHwl`9z7>We5NyQ>!)lHhw_Bhoa6<)_9Qmfrs(a}l&;AO8{ zFs9(2Pu`sOx^KFt1Ga~Fb8vE6f3LB*`2+1Wo`|cJC%`pRyf%S7=@UN##<~RU{|UyL zMEjjIod@1GTR%Rhc|%&K%akJjkFDBX6C|I&sd_*a5icVoxHp_xcD{4{Qz~|8hw29f7}nJbm#f{ zx9fk|;J-G20lX;`0Zrx`So*#brj{b$m{FnaT`u6#EFJAoc{D<$h;QiJQo8N8z zpYK-CcI7k2gCl4%iQ}xST-A58bN@r0%JJu~hSOQNezRN~NRRKo|JE`7Ti?T1WBi|Q zefQ$~|MOLd`2YC$e=|$`>#6U>5e9dySS_$XMB(1NhJ{stMTW3P9-?*V`b|SAj9NY#v#@A)ztZD{?DE|vQ<>B$d@(EJMR zYGAiHWL4Se@FU?1!}2iU#TSd~!m|~lmlwM_W1l`wKo=rC0Z0%=VK!u643)uqN+EFH zGyRg2dd$lL>1N1l0EskJ1SR&}wAaSYAF@GA{i^_PG5yJef}2yqFC^hfgg#tY((?w~ zJp-8uO-g`&bSeu<-jYvUuD&371P~x4p3|diM}BdQ48e_$g2Xx!3OmELc%GTSu{6hi zJWs^-osYSQ6GIFcrftzd=GfLIZoZ)mamAjCK|szM-p0vfJmgkrsGNhO@OVi0=Gl4o zbO<$>cCKy#$d(Pz5O!#wJ_pgqX5$RoLA7W2^Vvo3XxKmb&n}CZ^i42PAfF)E;ZLxa z1x<&7Oo=brdz`YMCr%K3?-~C0@U_fi5W}-QwHnT>)wAc?7U7i^IiZue*7y=B822!17kScegdQMyj$o92axrV=f0I0r8dM_h7Jy%KSId{yga#U z5IIo8eZ*p{i?Q3=lfFlM(?EgVY359P*qPjjq&u9(@DI+rwwJ~{a{)78K$%H?uPGkv za#%7wf^1KEjdHQ;=#OZzIBjS`XH;zF20> zKI}Pq-EB`fOK226^K9v6-Q%~Xr`=xnXxm;_e0J3CcP~y3dNALhzO7~X*-`(^+uq>h zoZ)V%FFy0y+`}br>Lh}#IxG)3rx=+$qAZn1Z~s*-LqvFX4ibM1$Atpeo)EmEoi*0T z8VhycfQ%_b>>$}$u+DL!84O;_7)F5zG9Jp6;)M$;9L1f;z@sE|1Td z=w_<1@B$^_9eJ<9?DhPTq0nM1$;ZSo=8yME8IYUpk}u-!t~}Lh@MDK<4_)gW62=Mm z8Pq}*(@#I3otYpQyv8vg`C0R-Xd%8M&2SAtGEc(G#82*Ea2QSUba<}G^~I(I z5=lUs|ID`txJts1B=H?t0ig>y4wkuZknD#l7Y;76*|CKB$WzoaQ)^f4EA(o#w0vQ9 zck*NpZzIYMb(Y+VnLDohgS;hnZNm_}SR0qvv+(MRY$CKub^)>DR#bN$J@`%n9T@Oh ze3$o%DeFA0!SOz;#dlD6gpzl=c}%A1j1gISWy+0I;2LOe+!UatTn@9nJ#>mGl$Q=m zESra)4hcoH2hr{;kc=H6vy( z)63QRYuG+U5zd4ioai*XU#EREEI(4dpT6z&WK0^MD3wb5=tEm#C+f8ceM*&;_>&8$Hk_4tUXt#B7034LE* z%!v<_;(`j#p4FdUng~@3SY%Qm5HgOzE7Suuj#S~8L&v4kM+5K=-Zcqrw7v5q!y=g-NhoHyk8zLp z8xc`M0u5x@B{95gd>WTP(i0l%{Oi%I7k>4kpnnpu9bO+wUHEQaqA4_FP}{b<-#zb}OtHNpQ1B9f{6o zy51k}X|Ae)<~K@0X3*Bqy54B1<>8@%rJyI%jidw6nua_F5Nyy^CZ zBhY0$mH{I0kWLt#YVEoZqzi=KVP{BD`*gH$6XWxg*)t3`LpKm2qP;AA(h76=W-H7;74TrP(2589RKzB);#eqbIEhM5`Tj_&mER~7P?MiZ zO<@Z|@TkN{q?Uoezn}lrPwo5vc@|EVGyo{S|KHsD{@dq;`~M%F|NH*`YdjkpkMb=Z zA7o7J9ML7rbmm92-O3rly9xX;3mYn9^@;P$8~*VTgL)Xx?vfBMlbfJ0K8JzsJcpt6 zehNR}75v}AB%H(_dEq0xt|Y^;F=d-(E>v$$23|kD%5G65=!GLdBEZu9AkYz{U~s*Y z!|rLnyPkc@@cL^6?R$QP<;67~hB0H=IM?IkdSk*MrW?=zLO{L04##6~LuX#|{3MrO z_p@VbepALzA)ln)%)bt{)h4dP?1r5;$mt~hy`03C8&ebG!53L zXiNYC+qB8hyjY|e*y&;K?NRqgIR{){-;hJm;BsF%C)}L|(>S?P&-_>r2lWj*nsprk z;;O{YL`W?yd*X(gr#Pd=>_-tnG2D}+)}+r~gA6kHbn(&NkGlY2ctSJw*^QCezi zVArqFktsLGb{Kg+?EJ5k|GMeUQf-vW|L4!Y+qB647hC_9|6k$JWeqT3E(r|jwSJ?D z2_8SwCOI^-FBC+NN(IgoME<9WD~HAI49YG9@>ZB#nULBk`u>QRyCl5*jjgR8pMMX} z#@2T~zSw&H{1NnUKFYk)`DF5v;th-VwlZe1yy{iM_j)76w0VS<%U^aLu`2=uRTeOr z;HlAe^9s@%){L_{j?Tq9};B&v@XyBSJbWct!G0vYdMA{dSpzupV{E zYJ(Yf9I_aW!Wtj<;zE3RPla?O6Fz>A>)j@lVj#@WJdGS&Jh}o&Jv4K{)m*8GRyNU? z-O^o>i4_m!>GMDk;*^$LlTvn?AmW>2>?Hz@7Bry9_@iuc2i0LEzX4$lat@D>S@0)m z2l8}74ECE@cpNHSlfz{8nH~J&K!~8ZllYoa3h|$e#(4RsgXB&Ve8FU~(^FVCV>W=> zW=l}Mt%JsbpZVIHv6BVq)h}=S@wIv5@2$}>w;J)6o0^CQc*1#c#W=*TV z^#dw3IIKe7HPSRy@Kup{X}a8t^A32(`xw;K2=p~0dWTk@M?%5yXnk#(~Q|J z)v0A!g6dv*G`xFzN_aIc$ezZj)pL%2R>g+UlD<6hiaH=(B&ymVUBvG1d()wCPKEdA z!$u+gaSG+~ut?u!CQ~_GM={1y$;ct}GudFM^F-zhQ_LES1RmT8iV}+z936{~TAO^X z_An#mXLE+~iIs|wY^k@qOYw%z{p{vAiKoXr#~3CD;cC7E8iG+kYFl|nGk{u7+uA}){?^Na<|nzZ?{Pq1>F}f{UDZH-TN-iO|cttttnTWrJTYr=JtipSPT@jS`hccRD8Cf@qU`J58n4$>Xd3Bt&<*#=b z@xW+MM}*)T;9HJ4+F-mmUQxdLI%vY(f~iSGg(UEOh9iP$RHc!CMy+w!0q1~te+YX( zW&*EXb+fo{gpFN*7k&;w0`(mAZqpFP@R6zrGhGWGKw?ZC@#8}VYemF^IH4f znNV7Op&o?v{u6sm(3|3RGOp7EflP5U(gU%4bqw87bT_0ODwZ=T-|J4zrC8|Mg1KG@ z0;PLRr1E%5%CSh@@sw5M9Ao52@YU9nWtHr1|xq{ z)UxT9pzhezsw)f5Y9?Z9P|g}}jqk98n~`YdiJISDUAtFt@1wmn(ICcXup5^wnay7f zqS)fDd0I6xBBo!QA!R355$P(6(+)2yFKv0VML{b&POhbWtgd2W7wTH`+5L`!qG+6j zC6!hdcwI*3!5NmMLnb&Gbg1eCDvu5;ns0yZbsSsw&8E@Syi$s6BXJ|N8this^RFph z{wT=u=g^$Zm>Sa?$N+ko5v#BwB4J6Zfj^Eh`Iyi@Wn8jsAYetua($Ve%t6~ShSa7? z4pRSm6kqC*L-pNFt}JdI9kmzT*c2)E+%^km>fS8bDgM--27@me^KkmMa43#$cLl9COQg9rvA^G&6`V(;O4y}KAh$89E3;d~lj^0vNx`g6Z~ z_VMDN!=%RFz4ki?_cF=MuwrzbL0JoP4ZI7`qz+>ai+bAB@zyxpvjIsLF*qtX=ZdMv z0Gbq^SZ^A|<#Sb^Lul>s6ksTHkhWi!CB%M`XJS@NxOT65u&TCr0*R8sMvqMUUcA`a zf;ow9+3V};IRacj3v~mLCR0i$1e0c+_>#xKbt0&hDjOMMW|OGMf_z>5yWNyT?yIib znoLcZSUCR*f@(BTQu1HFd=jgT;`lXB-Rx`c?i=c^>uy~HR`>43YT&9=XD1`j)iSFBdPQzM&BKTKhX ztXo5^7H6^EH8WL09y-zF>9u)A&;03- z*Cw`Hz%a|7>-2YShhSXPXqu%&U3;ZXs0(r4W$u*ePu?usGNJ&W>u!oWPnS~kCo8Ts zuV(03Tnx5vYhInlqemHnVK6Zb)I?`mlK z1tDRPEOjOdl?(1BQ$8+eXosu08u~WBsEo-guq&qk6|j3Aq)$Qc;7Gum)3cubwiri` zJqPd%VfCFJ251c_S2odoO*$%>=#pF6*6DX`pw`7AsTk#}l5Bh{Px0ujD_F9tscqF{ zLSq^4&}*^f2I{%wJWS5hZ3UCVI%4)pE z`wHtlVD7H3TVkln`b(S`WSZwkadbb9XNl<+`LDL%de~FR{x5SRU#g8c_TR5wzI2*JS~E&v*Xy)|UK9a7-WhC%TcCb`?_DS|C?Pvk_9hfUd#J z^gS$^17cVf0S29JxBaeD*Ot86$B08p(aj82YWfD7Bg4S^ z>nWP&8BwA*R*3~s*|R%)2FnWbbTQa(B;JJ6oFRzqXz`Kpn;7SO@3@i9xsz zwTq@4ExldE9h&APfoz)1>CZKJsrbhpUXuP$X3>gakB`Alxa58MKk1Da@?cG?3BcR{|SGYiACMnLQwe zFH#%Ee;ULq#*K|T{~IY(|Cc>({cqw=)0KpNrU&(*1>--z0Uhvv;y?chPuciORc|nv zJgALQ{r~lM-@UQ*|IMxM{>T6G&v^7Wu0`(Q6nNG0`{%%r{r8>rVdtV@`zadV?TtkL z>UNlUDeB(oX2p3?`Lo0XwbqZETdl=`7itcqiel*J!Y>pQtCAt0LU?~bc0MR9R9*%< zjF%(+h;OWL%M(wr+w<#TPOKINvuM$hyg*G%O@r-WipMaHs@1u{la#3S=5;HLTd!VL zsx%HM?Wc;K3z!Z@K1VdJh$_WEU7%3hZsJFk$uC>HoWd@=8tG&eN^{x5=y@Rpy{pJ1avla~y3mqFLY1mUafIh?G~&s9 zk_O|J5FM?FpWMcyN*FwjSarm1xS&Qn%K&K?VhcU|YGe{) zC@qSeF^OS8M6oc!(6-a~mYm6?HKj-vOxYL60s3HGKfd4Gl$07ED7tAPe_6a!eui0h zpP|3jGYSFv%&Sj=DNz-J|KIx42rA9VH(USq34gFLem39>7>&>?H^s7eaMt0Qk+gs`foe$Fhvuk3FZ*3o>&&p zi{UmLjl64-ksi1LZ4zY4QbY}df<4vGt5NmQPpbzoj)s5xUD7ZEHlBB~h&c7Ljm$_Ft_x)W-0xfoM8p6D~pBD(geig>{JAZVI_kuUM zg20mD#2urgD4j1wdgrL`z%+UjlsDB8Z6L4kA9g?^x#$3-Ugsx@pVsiQJAR7Fu~S$H zEkuqFa&^gnw*b1rBhThF?LF$=LSMPlqQb8cijXeV#Ge7exk1YC~e- zYkQK}M9vK~EI~!%TsENkn2C%5FkV;T9re7zVnZ1Ql8sldzt;nxjQw!5ejUYQj*Nvl zUcxU>>~1{Tc)7Xtvh~0G2*l9+#yGjA6R!1}bUZRcLcVYR(CL3XJ*GvSayhF{@apVi zuYYuW(m6fLB!lsq43?r8ZJ^QNUL%45cu5VSb9zWLBb(eLXIdX{>IM-4;sDgjsef+= z$36Ra+B-X{-!(X-RD6YhZg}$VUp7BA8bw*uWJ=CF(6<-u(}VYjrYLb(53l-i!{78o zGy?ge;b~tBMf)ln(_d7}IO9*pCNTrB zUK_1i)S)i-K{@R7+dUAS2VGSG-gWJev*qQzS1$_(!cq00eek~1Kf$cgm{F@rYq=`k zo7Z}SZq4uGDRWBaP_mBIlF3rYryxpyp2wcN08|52Ggwq{AqeU=2H0(XI6nEAq@no= zjc<(?{r35}&09GpHfUBjA_u6I*`V+(tb7AJN>z2820GFdc{+=5YuFF-dGC!#T6nk1 zt~B}F#llWN=E?AOQNJN8@eZir_(>v%#?`%#7pKB;5%rL)yLchYc%(hU{w1v)<+ zbOa|z+X8~+1yT`qtDBB`oG&MsvN5S74(&BzlRFM0?2t_T7fK%zj*N*dVtO>$0WF)5 z{*akHhS3a?1b54~zVt8+)=_a`OU`G%M$dBIM+$*DDfq=|bgo}tZC)|cHCarP%jN{j zf5Yy_Vh;yK&kwQK?_7t2K4rbDuc8t8^hw9)_bJ|t5};?@-bKC7GN<2wZxm{b&M)L} z6Dl|+*m2j6B}YDL71az(?1cHjqa?)C^LQ>b7*CV|7H$pDSwj!^<2Q}yKbN{?6#7r> z?0Ei*7ftW-#f!YtMCSB|0aVg>6yFBZ`g6Yly0H3nX*jcxnaq&fLFj@H3R@g1^Ks{W zEWXNUBV=dS0h;(x#2NH-XHqLMFpHNj&k;u@t+!`usMl(B4lJztgjV4CuR*f)gNum=*{mGW{Fq{*c8!%xI zH3Mr;dS7qY15zO3YQ2+gm(rS1O}0@_Ro)qB>}kz(yUPg0bi^Zj_O^xQ+4pzH)&F?X zcYRd{%*k&#pI!N7U!xezaA+>yK(am^Ue2!Sjn+PlPZ9*5p->(EFH9W6IKj*g-XGde z8F9}dzi>!Mu<~zK=-aQ}bw5_zV2*w|N|N(D2MDNCYn}PSaG4ULN_BH1YgWaNs%C*s zpf)Diw85?Sv_JBv*O)^r4X%Uf6K=w}jmU4k8=Ag@>I{t0$CIwfB5&MgqoT>&8+d`|k5Da!5?s0q-(PLclnuG2gCcyZA=?e&fi{?2$wc-KKH z<3!+_x)#B-90~>y`TE36<6BP1k|y)Q|D=8Ku0zxHUFX8P!P)V<_xt8o?`so&#o13i z0#E(v&2Q`fG4qG#ewGVSKL0TbruXOBUC0sn07irR`r6HJxyg_(dw?ei7}^S&cE*D? z(bZh03nA(APmsG_PZjofu=QK4b>_Jz8Lz&@hDQxNkkC3Tr-!ZkI{C87U?8V`!F(wh zu23A`##cihD3>;+E27;UU7Cr;_MwOAmwplqutTCB6lb)k=nTtdJ)3`4#ymvIN)P8r zZbhUmhsJBulo)>8r)GhzEOP8q(Lg|rLO&d8r6!SF+fR!HQ-n&g}~OK744+ppWh z(2`g=Ic{U45Sh^^EJlV?*;GNt-MI}KHVvhXjSQ(_Jj2`Tta3MxhpT0-RZarYE}lki z?#R`{2zIRVbT*vA7XE9YXteJi2#~#t?d@ygyiM0l0Kd1$rOQH)X{q3At=-;!`PMJj zPL(4v<8;ADxIXtxtx`Wepb^H29|fvIZM`q$Br}gb1lyi-+E+XSCku}e0MF;*#n>s4 z$5hMZC>IGnq55#x#Kejoib8f$Nq@?DPx)E7E4cpUTKqdNy*e zLzdVeR*>*V`4uBArqz{Fy;$Y=IIhIQVi{}T&gU`(mYvV>M*a4CRb4#>GB%8Ie zW_f(n{1V9h{?$}!C(Z>l3!E*GfX5IQyxEL?5ehi`R#E}Iq|%B0jpVd z{>evm*=l$dq=TD23{8Ct6za!F|i2Li#>0!&c)WL2YDJXog8Fl z00rZnxw!SvVGM1(oXibUcyyhPyC5^1H{pNF|4k(YntUpJXKH!+L#1R)wh&uee}`so;nJRRd6AuC!pYr?WAx zmWcqA=ndeajAM^_0}zJpZTOv`m8^SR(0+7lNGv$SjHje!U4|)J%7S7u8tDyCq)Q6R z%ylqV#JW~MFN^vJ-EDZ8{&9(!N~f?Txo0I0V`zeE6VFCN(i{@db||}vvH&I(C{ttf z1_0tXjKVSJF^%F(ufYUu0pAzVi4nHM;YuW(uS6jK0q?T}F^jsgweGb&c09>4ozwY+ zhsw7&%aC>!AX7lUoyD^RR>;{z2kO0CXD$%Yckq@(FoYT`&|PPvIMZl3&8wfPCKJpW zgL}&))A4iLT9ysMUf7#r9=Fysz6>#4Omc&lb9#kWI2focjuK?8&fzqoO8_-U83sz7TGJMzd2&MDjc{ENGfy84bACE+ z3PjLBt=oG}T}Xra;)VB@s`dl9^K!Y~DlIT;_mhxAj+>CVyIpgOD3x{E>DHJgZB4+!g`y!el7#d7JNfJp$Fu)|oVApewG>wE5O=r~I zoO+*A{`2wsH3W2eirkmFT~I29?$pmK(Van_oefKf8(iGXId#b*yCgHf_{m<2p0kJ zKoEnL5dI*bugMM{nd12L=nQ6_*cIw``9=W4B*pw$$RD68Qs{K`m24=cxXTZQCxL&p z<3@_Bb3g~&?oBHSl5ex+=?b1z% z2QfzC`ymkIW+yMZu;2S)Av=k$1>1Eb`F3)e6vjrziE_yCHciQPXYS>=@qFLWoH0kev43Ak zx~fb1&aB3-Uupo*V7(xgqRfkwKG38h9FId^f+j z+$P@mNy<$88AFL)aaOweLTs(25fGE-k3R~|TIEyJfRjm92;Vt67JPek3$Mt)OsH>k zs3Ag!wrI(_g)K;Bt2Dfdrn+)E!mt?C@+GRE=wN;(<>{J?YL8 zMnjD676phr`kct~iWaCH!8n0U+ULLvLQ09p7dqMD47+%UBNPvv=s8cJy8F4suhFwq zD-e7MB1Ayg)X;X2I<0o|1lqZ8ripRgkK#T>OhYrMxlR)KRNrLA_v8tiBJwU}dz(^# zpoK51-e@Y6{FX&H^XkcO-tHdk#}mV<<#KlQOY$3rfXDdbngSoBCs4GG<&luT*|r%_ zRa}hc1rJm{i{1zRL_a&mo$t=tRUHj`enZDkbP(nZuSM%7Pt zS!d7Wk*z2r?Lt6+5id%5YJE^a6}{iR=aylo+8#*@Pb4Xl?GpxV+E{^{&li@Ha@*G>G?IE{nx03ZOmO|H03e~yC49qL=vP&0vRDNGv@j_i=}n@VWR zAiE)q87;~p88=Ptl9X)h=m7qyAgF#n)w`T=Eyefz<&(ymU)huK;AW3+8RtovjqRYej3~!Qq_~d{|wSQkGgIo9%^Z&wxywF7~y@y6ex>~)}Xw#r7)VF z&bkz6RrW4F2J&;0s>xqF4hpkjsmxwn+DI6!$upuy!OV3q%4EIRmsyvcSFrqnuzvX`CT%DaeM}W1D!rLMCPa z6%8>d98~fTt;?`5<_r87z}`|ucD+t-<_>Rh@3%6gZmwHFY#n6Rtr zUcn^byu&3!`FziNY3+c_BD*^F_GT#08s;prMt<>WS)|npfR$(E6r_yL8Oze**_bIq z51NwP7%U8e71Vps`ZTCr9q$zLoaR*~g6h7Tw9JG2iiDKIt1YXIdpKaU9o%?H>Yd zwDvV9VM8@ylQ-XrqN$T=${@<^TnMCS{1OV0k=y6e`>%7tAsXRP$Nv3g(1IDLA`%X3 z4aK7w*7}>Av%s8w2sJ08KwaBAuX(SwSPtWe!R>K`0zx?s2wRnFw9zgKnuWt1sgRxh@^9oJZH$>DEA9&8>`byYAoF+ zCh8I$GyDyImtE7kK>o00LwglsqGO!?gBu+$Y{M9A!_yiw9_C4@7eJM1PZWFM*hh(d zbgC7C2Dt>~_1wXay95UY{5kx1iYGz%`o#+^lZGtSa684Q{_JDP7B`kZ-jS(L5Cik* z!zS1Cap+}GLXEs)6(0FUo<94sPM$=qmPsO6aJ5uIkE!geYdrC%fpJVi3s92}eDSy! zv?EJ?$oJOaq|76t{QeEi!Z8myUVvS$6j9?)pbS;D-f``mwj-j1m|aIpI>Y!{{iju!Tu-u}&rytnOPSW&wVD{pMyXzYpZVV-3~+1;(1AFM`Ad4Yjd z!btKw0mhpyKa3K*V&uPaJ%OSPz$B69n{?VJSvjjcxCsWIe+<(b_fef=9s(#tBR37X z9r?SVrTEk*W*Qr(p%M+zU%i!@>XugnxeUD*!E#?LoyM6+>b3G9gE z_WReSx6>#I7eatU!__B|);wT3G!B(4%$r=qx|~bYMT~j%Nx(TSA04lXNYC-r)e|E! zj-D4&PdiFj`RW3+JTP~*8G60>W{W}@Q-m4}whdYbM?9x+fb{nMnT#qO+)YLyX!!wb zPuL2Tk4y5glHPSrI~VOBQ z8|~#{ZFbE@vv^4Ju|b`OLU9D>xdsgho zLNx^1x`jxE!8&T6bQi7Ddw+ppG?u9ZAC{|!lW6&xi#L0EM%5Rr)%lM_h74NiELQ$q zZ?W^hgw8sp;QD)IE}0B-`(Ve2-;BXQ~Q z8PbX2FvLT8f0SSIY69EZPFW+QBs`=QqH=i~B1HW|S~+U>+9#ggmi$sPP9dwLX+kBo zh3*IX_SSipD7I^qQZi_M2k}tF0y@9i zuJl_`XdoTd&0{QnDGF<%i4*AZ@^sWb=+uv;Y3m?Ht+FVvqHu~Cjqt#Km+6J?p6}yv z^JrvjnVx(6uiPF|L2WC}6!PkP81bA7^I3!*Q%W3CYTs*O>tEY3?;MLmispjmevPrG?bvgV*nUlkBW3(c83+A>eIvX1}I1w^<0 zY9Abl-#H+f>0DNnS{0nwPqp#}ds@{voU{oa2Car?dNmw4itFR9OQ|=^$~sGnll^=x z5p-udY2Xc#Tq6%eFB7`?Y0;g57;;eC^z8$Gk>q;r)%gW?Q(i6mcP1Z7$c?7flHNvx zZZ_R_60+k&3qcq2Y+tJ~#X?1w2J?uj?g})3RJi9YY+YU44{ryNECM z)OD`=zHvUTBMm4uF$eViVp#7lfc5@zSnpTBdiMdOUL!=r{ip--@{}%zy#D|~&x5=? zoh`@(>am1vUxJEtj;=tJS%#_&%CnM0*|lhP|Cb%#Jog+YI(C?B$3>k`m7C;D$%}C1 zi>vQmecyQE*z+CjKRHfL{nOo}{cLe01CV;bjWaptM1CX}+5h8Rjl#(UBd>g&m*Mv8 zJi{U3XgJ2{FK(}KzwI$jtO@KaR7Xhk#VV2NW7jmul;;;oHs>Z2*g;SQw<}LQ+N|)# zlIoSPk;z03Wlg7zLrsGs;$xAvXAr6Yf?OCYfDn;j%HVJjr8?&QSeXp-GN8E<4vBfh zmKX2`hO{)Zq0ryYNf%Uw|0zp1C@c}(L+r5AqACN5+UWj(qdQ@A&{D{`s>2~igwf9; zjJl3WgHhm5MIf2F<2!n?aKak{D9+UCr77TN)xvpvm9+|2B6t1HU6|_9i?cj=juzU< zArty2o{AU>XS4L|O8Ju)behY)=NL|PK41e98=;-tH4oxhYM!xCIkbYy%1vjHjz5P3 zry>Q9ib1u#4RX8>dzZdHz)U@T;rpFf@R*RssiEYaJh&22(uBwRx+s3~3M~wV^N{3O z`@9_HJa`(Wgz7Z74il&?p;$cG%vyME4Mu^mn3uxPOfi`&bZ~ZZcG2yho}G3YRSL?) z6Gm=IchUA~_qZ`Pb811hHnX{`kE1Y}-OZ_l4Qr=%xPsvps`v!cYz(_r32-qf9Xa9p zJYgvbTtC5>S^X#hxs4e_DX^XqKN4j+6?&ppMmgbC%&j#&se*i|e5yr6!{X{>eJ=x# zY6khJytp~d*#&p{yS$Ya#SjcAr9yo&4KZ!?eFG14CzzB&co=;S?m2nxERDy6eF8H9 zSKF4C_(K&SI#Tn<^Cff{1drpf``&Pd21ls6kk*3n2=(}=5(kP)dIMsJqPKC7i`y7u zTilSJAE1`Pf44aj3VU71rat%+WtHzwIOgBP52w2{k6C`~H&yWi5WJvK9?hb`{*Lr^ zQjlmc<@!k9WMd$qN z0^W7&S3nP3ahu-y`uZY?@qU%I?=n0u%!EF41N2MW6}0w?;vz2Ihy>l*m)O?({U6%> z_Qktyzu(}&B&C3C5st4of=>_g^Oadm;In#z18vaA;`fQ()@m&%Ji1$T-pl)!K>WUc zg>!P>ie*;kA+lr5dF~H(Xt##9?+mXx51B>m**}4SnlF}qJl-WRG!jN323i?oTEoj0h2-s6K z2P%F80AtKTPBto6n0|t{V*WLn6sPdwHXIEHc&0k`lh0nAtVCu0NEG(K!W1tFV+uDY z_WUJ0ESw_f3q9bCSNWV zrx{ueVd(L;@PQ`H5L~&=Gul>18J|5Sgge&V)8{W7M1I{n590lzEwFlLNVoVKbi8FTMKkzb;==?qRh`(efl$rzBXv zkEfq!>jQt|pYd-SSbO~@9gj+Tkz0jyR12!WO#AlL_nJInPuCrD{&*mmJQhJOUgX9= zK&jX14@n37f&UIjU!hOWy;raBO`dxAvC_1RQ8p$<1?G2m92?sK~ z52d$c(zgIorLo5eL*)a`(VXWDjmRo*hM^|QRd%#Sfa~P7OU~Z}(lPVc%~&r?Zp5%U z0~q02ozL^5TBh!apMqr1!&J{dY)MK{dbNaGhEzm>5`IA+#n28=T-teLvjsXoe-n-6 zbmLUv7pWbM8}e9eBeWRyBL0}SD_F}c(r0no9|d1vp>`;NUj3=IzKr{cBvEc!G{p`^ zi0@zCd}@-omG7ysWKj_>9TmcJz%@6rgdD5X$B)CRVY^iez4it0jd4-%~QR$CAJU6so3SoRgwMy%j zORI#L@GcJN=J7UKw?1PhOxDlN#*IW^@^K)OrApUvu@zatE_Rj%m)1M(2N-pRayZ%C zi_iQ6FgY73Yi`pk#!gdTU7EF91pHFipNiu`seEKaW=a<+yZj~eDa!8@B-9mbFzj*r zH>RcBQB|HDj$Sx7QFtE4qR5#KWSzo=WNL>!V$I?PrDme{%OT3}+1o2e1J?JtbAvZ; zu2o^YBTa2E__DMh8eON)5L8V0%y&W9{4DIZ3Z(X!wx_1c}G(jhX0O4Ka* zrVcD!qg5H{DzfQoZc!3aud><8U;p~1!RdA=o6W$VUEidAbv8(ew}Qzuz&jI4({=FT z#nyL58}nVuG6*fqapa36y0wM@r;3MLF(h-<{ij@Z^Gl-=CwV3>9IsZ(%5PC+g%y(k zKNWFx!5kF4S|A4+)%j=6B+-y}%GUY9P;BuFy51h)#RqKBfufYz7>!qxn_&2;^!RG# ztdlL_q0F8elfCv-SbS^_;&UT$u^-r72$^U;MG>wvb#XYm%%)sj?r#o!v)`KxWg zAtEPWp!i1_c1`d1S|)7hB7t03f-vTM}@uSAFW zkTgR~2|I}sy7#oVYFw$#|Cpaq`Q+Ml69~CtV2REhtZ+#J?+!%)v?_AFbzUJ`$oMIT z@(|!PGZFP?MyuzxbD#n^)(kv=p~A>IHWh9V+W1S`HMTFozvyDWM}f}ajcW^>oz+lo zdM==$oncWpfy~iD8&%#}OS{#6I5c~PEt??rggl~#|nCs70~P1Ij?f{tO9y%kyx#mj;WP6 zjfc`KZh*uolYNC>#@CFoMF3~A|MBw8>sPO7 z19B4%@d}Lc7k&w+>C7LgYYzkaHLV}{gcJFWXt?T~&@1X;B3%O^UEj+GM3pKXm<(2K zfVeQ~zfy!`h1FZrV#kF2bkA#Tnd2ry8|Z-7jliP#xJ38-0aUAP*`Sm!CIUHq86iuK z&zL+4gS1ltHrtCtbbZW(g=FWf!QA^{rpnDDPfnZF3BD)&5@d{n7hY`_JrKk|!_WPi zsXmc)A*Zp*u5#1Zo5Zx#a2^2Y$mpKeBlNKVY_Ux$yTo8w=g#(uOInLP7Q00gME773 zy~-lGz)D5w$0&R>UN=ia$q;qi%OJf)y;;#8Jq}TG#t8Rce9TphG4R<|(;S=fP#9VV zOTuB`!`LIekzoD7SlCK%pbI`HH)2=p=y<3)X3z|+c~xRpza`3AMIAx3%1VS4F@tUn zjaF5i!d6uYqg6!_ow0X|WlDCJ?BfoK!uGRyte7)0=k}1C0d^&8>zdC};9C`{@Ls z7vI%OTkIlAnp{4$UgnwH$rPk-Z8%tiKCFT_@&loV+EG1G8 zQrT9eBc=A8?B~DGikz=&oo&#vA~@y(gB@k_ihA_R=FY3FaczguaoCY+_21!j?Y3S2 zWySh$N3%d7pw)j}vHromAGzwksaXH#U^I$vx2^iGs`vliYJY3z)n>)|C*k!?DuHP2 ze^-@$Qv@JJQER{I_;GzPidy~3<45&>yurgiz5ZhOZ&Pw+jyPIc{4|b&?a~sAid95~ zK(*>hnvZk4vaiL{I!k;+Zotr*qnW`|;?g zbJ0IOJv#FS$z^yPUBz~#cSLN&tUJJ|^>&6TJ(jKO_%yvW3B%E{Min$i7X{aE@lAL+ zODW^|KkIMX2Y-KearW`_u>THG^#1U)S9m+HZF{@$Z24GX;K1Rpu?R>nB z&MrDRytG%vcxi#vu=*g z9W)LvwGKC)6iWqdu@_5lJ+F%4V+$+s!9ukH1@qKuIE8NEf?w7o-aYTQ2FQNqG->Dv zb9-5>(K$^TYDHO-f@mvf($GZaHEE7qVZY}zX(%sq#RV3UScRjEm9Zdy20YEn#S8AE;IUI{%oJ{*fVxq)|$n zEKp2e2P!tzH_$6v?yK7` z4$#-2MRBKUS-UB0=}jep?3XnD^r#}A`zXVoH7~fc97q`T;BFl~`;03e9fpibJWj3) zAix*LwUK~fcmtP#u&YuK250fwEczUw)t2gD%{4>kn)o=UFYbaW`Jw9w)k-#Vc1_FU zrpV=n(yQXx|2B2aiLo%eQo3IQl!TTcp(^l(c60X8uq& z3DUwqF%lIhlSPBEjcSaO+Oohd6yeAbUSl$E3v{bU+`@%6(H96hZVQ&e4s zbpuYhF^I=_Y?zRZHqP0Xd`(XGetr^@gW6?q6JnBjy3HC-Ms(6h2iMyYo+E@hiGX-| zy}@udE=Td@#+R4tTd&r)Ho|Bynhk>u%Cj8#BQ6cB!$Y_}m`uJo`R=c+lda8{c1uo;(rGZbiNb-8X;US0Yuq+OXG1hrSjVt}M8=I#cscc__Z$9n za04u|@ed#VxAp4H)yB|;aYsUad`R5>rdI(eGa3m zxQ{4%p>awj+<@huhK_Tr5|1<4NB(usmLi;`PrH!ghVq$7W4`S`#(sY7;G^2RFbDBS1u8 z#Ua41Vr=x*$0%80#4^gT>OuR-;Mo*oWyYV011SO#>kG(;{v{gS`Cc*!2H_RVT{-Z_ zhZ)XD@6Atu=0WeI|M$+t>5lPf3qRrO{`tk(f%)yF@vVP;d}w}u^@(-gNjTKiFZAX| z6AbR{x-p>SX8l_bU)4kNI1vr{seGNNmZ>oxPkU!a__ERT*02)%gCLq7<;vjuQA?D8 z!~^j&<#PaAK%~F#h|o!6ohyKkTfp};%xLL@Av4B!6i32Ausm9_vl;vI=f6g|lXqLV z;A5P}|474^n}cGqp7(nf?E~0|5*MN8SfFv5jF?b&vD})fEV^&XHY3x>AAe}BAs;~b z{PESxe!t;(|K>Hu@IpXywUX`aWA*hMCJ6|gdY0cf^VXOPNJR(D6xj3PFoh1?hMJ+v zXQ`ArHe$!H^4Ci?m|l<%MaI$I(M7RvYp1!z6&7JXI|9FFMCqDS#oX%^7tS2!g4BJp z-+O=2X&?4a&JNlq#(vujKDzH+_mR`Y%S7FXkK*fVWKUljAUEawHsMq_BqgysoDP~)fZeO_vCA@R{|hUkQ2dz&oK z+y6%$7b(*oQ%|@bUE-REnjRuAtVyZJY(P#e!U9c%rkst2-Z=0hs684XgUS%J_a23} zla1({l6gLfrcoinSa4$hleLzhX2gKtEn2k=?J`37p(P&#k3Vdhts!P2UEnxKZ{lH2 zUkp*z=QGkpEZ{QS7I(19!o%JB0xvjUMByDDJ1Bs$fJ`>Z>CMTVuyMJ+h)j>olW?J)^_mD#;P*kn9q4 zmy3LCwEWphPx^00vA5OQ^2V?^XF)9aHq+@VWF@gjz{f&etJN>sm_y2e2;tYFq7=8(d0iGrQ z7EEJ24UDG}?$@0sOUi(gv(tATXtpP46C!vcyYD&AkUBr3Bp+Q*eI;v_9B%;geSrOb zI3ZVNSUHBUbo=)nInIh4R1^(lL!=q-=-hq~tiw)^cJidPQ0HLHPZIxHM*Wyf@w{*- zk_zWr9k88;_g}Mw0pbLNO+Gez6W_w0(Y?ax#)tjrVCvhE1+x64u#{YMkg{BP`dFJ6R24GZ)PmT2v(pBKR(o({Da2l0?H=W6mL{Inhx#zU2l zF7C~`Ig9V&$|cc&3{tu+8RcU~ttoy>*5|TmX>wNxS?^-)V0SY(-!I_e!~POo+ABZ>D2J}%Zt0ue1*OOaQ8dmG)xGRL+w!)W> zIa%ssQs=-l1A)eRB*UdBRS}{+lQqy)0HGwqSZV%cmi$V&nvt$i7c^>mzdM$__xsr@R_@?%jfG{?lkX@K@{K?I3aPWg|ohn z5Zw+g zj$!}NKIvRsoWb7f4-Y?_p0!Vo-<^H{hCXV4Jn0GMD+|Gt5IQqbW-QFP}X5(}mWmoVX#)PAIVLyZkh6d@TvtfwA7ACO%Pw>(=Am7eF3|Jmm zjOQbi7Q`Fe#Nj~Paw2HeU%bno#@ADSjB&>T#SOzS;d{{=KXr7Iv&dWqun`U8sqCov zw!V3{+4TB90ta;Z?YCzacqI7_2B?qQbrEBW2G2Ua3Lo+|*C=oOb38Qtp`*fS&VeS^}JN6j|Wj3C8$!u_=x0JCchLItY zB)+hg$7067v4|#S#8Eq#rd^qAi{@<~n(DW^-43o6_~Y>HyZ(o>!w&hW(%@C)8kO+>I@xLGNQN5g{c z2tH-|1Z_v*SSl(j{rQRx9kN&}Ev%o@16(?T8|h4>TQc8KAusPNnOIaOCpsKLW+_p^ z1ju`Q&td!gL~(^5odeWn^8B=L0hRmo(vt^mKK!$A`!A=53iM}LSc0%?hg~Ah3@40g#ppM+I>YMuq zrD+#WMhk+lg@Hk~K7FKfY(o}UWlqj}XXpKs&JUfF%%U5mCTKtUd4{^up?{4Lb~4QN zcEP|KqfxP{U;<<0%c{B^p=QP?PVOj!P{K3?oKgU79s?2A6x4M{4CbVQ z^7$h*VYgVyStUfs4$x%8$0znZ>2f!hIuBI7zbv@{{2lM?PJ4W_hEt;D_2fAfDNWPa zBrUk@ay-BD6<~9zyTAf?N9P@e2Y&#(Bh1&18Y)Lu<13|w0OHMFbLl(20-(SW9~db9 zm64GkVXjW{!&n3&t0W5^7<^s+%8(|M{P`HJ@Tuz1O(oahb~$|OksDY!?=o%k5Pq|TLlnVpF_ z?)vD+lJX@jdu?QZ)5ac!a&Su{_>0a!pXN5?xNM#FiHu-`kE}?^wzYAZCwWBr84ldXUtevc}CJx<-6_v*(n*7Jn9rxeaT&FheNc`_Z2y$%nU!3r1DsB zTa%IXfrkRfebTB4P4npBMkqIYpP6{AmX;bliZA2gJsmXNPUDo$4aV%h5s*bHhB~%d zS~2P8l0Q%Rrqt0YU4tw4B6TQ2tnTChH4QZ0FKeyhHkbapqlI|YpX&OsHSLPj@XD*Z zHfybQy%acGa%r{m3w=RtT~I;w*WPoyiRt$K-u>SU$kGAk020fCrnBe$EG(tH(7kve z`^RFx%{+Xquh2diq&&t~GzMk5f(5=f#ZW?W{9%(jJz4c&>Q%%p=k!}sb) zS4_c@CnE0b0XZ{}|FYD=rk^9=B_K>^kqLnDU5P-=%Ts21j`yGa?V68enK;dF!QEua z`*`!MV4yzd8qxEQptpk`M#-91in*R=$F@xKLFvkjEMz!bji$=s(iAbq>mnO5$4@4= zbNYq2)$u>VuzB2P$Id#kFqJ?%sM|W*E~?*sKha*9U8$Qt72teV>Q>)`XO8ZF!N-}L zgAK4GFWf!vnfI)rB5dDKod1MlVt?_cp+5w5R)pF>I{|SOI}|S33M@V^UNB%i{09~I zS{T!VQ~kW1g`;6Gm6?CU&s8x>=~I=9inxb4NayZU&kWmSJS@)GfeU#I*U#v(KBsb zlL-myrLBWNBeSUTLa4wt3`FN40&sB!dTNWmb;^ud*FH2{SkFazg;WE03!^|JSrHN| zB@vqO0){KW&E~3HS{;R;)aP=L^eI*QwZ=(evX?LDrJ1V-x*$S}^uvf&d+V%H?RJm? z3#)}NKl@CxCg+67Ti;R7m`ScvpGaA_<33F?hljKYY|0Wk@ zLA0tEr7vtDuORy>kWB$$RA07Ph z5!u>Hvs;f$al798&IR6czB}`_Ji2@KKAwBWr&Jd0dg%NbLv+#`v?e`1edn=3jSjx| z{__q4HSQtcI=+siK1p1|~9w`%A4P%hiK1-p1e(Yhm?2Fo7K7Om_L3`ZfD z%Zho6;Z^q@`*~vdcwi*`EX)i$c>qB#{WKi2+lB}!SrA3?ZalgL@(0uPn~lL_@HR3!V9Jm|QHcJ7 zX*?T{`}m(iCO$u;_&Gm~N1ceM!~>fTF&f~aauiR0#4ta<<6oHk;1nt(P5h;0Z}_Uo z7X`MiAG5R6TEknwrUH5;{@pWxd%Ccr2@?>!UR=)t%1|1s7|JqWt;W?f45DGaq?{JJ zyPgfDsnJ5H=zSdRXgpr>LKduZ6>ZGoE8UDvonsbsqu=$M8BF=;LMrMRUGqD_&pBLaZSVbpIM!T8&Wna1l1a3 zB8HYuJ9c@4+e)jt>L#f_O%?MO44}a%=44FF*;568);dTj7l&&lDzlj5gTXEj06f z@D4aQcOl4Jby{$#Vi(nwp6g@wcE1em=pgLdT+>%%(xlzdjhnNiehv z5P-uhU}4=_iOuqu?;2V6;49nkNtD2llF2CpvkU2gJ2jH* zGw5W;#Z~Z)M=bYM3CwXnPBInYfAr;lBYl~-J2Mo2zzoWr27m9Ec2hKd!jvqX!k!2! zzP$(axNg+)2Kh6G`T(|gn|GZ}wz;`Gu!1NH0rS#zuAo6Uk`OvY5MIrL@V$U=R0QF* z3xYb*z_Xas_DP?-z3a7O;m|wAP+pfn3vZTQwZ7+t*P|Dx+s`6OKT$K!d1k<1uU-N% zIV1HCXaTx1QgXSiqX$!z%WcjDG?%af(06|tec1&exa%YXe-a!3J?r+ysD$2}5Ft+b zmlPQFYMip6)KxuB*6B|p6lW|lU;cVmGrA8iIjraeG&xG*B;NpT>hB~-F@jJ1+2*r` z{_?i|vSEYEd_sYT_Ui)!4T0NLMh!an@S`}oAET|YX2*jC)ZTD=dx^cRw6qath*%MJ zK-q1A+9K9-ReslpNyB0OX4p(0-^LsP(|Cf>@NlH*^d?TdEH^N)>22Woqg($zL2r1k zhNjmf%rlM0NFrZPf?!)EP`JIlUB7*`j#)Z-7aOn+Y@so0ttZ-A)9d_9VJSS|^Uieo3zW&ZpQtp7&K!!*cAsr$oVYehcibswx$v4% z*dI@{(vIT$&+HtsoFk_PH3u!&`br)7?3qVMyUoAinK%5{#~+7uZ%iLv zZjuG=fS0rHj*6Tj%#{V#l7ZvkLK~C(>#t5~o{xMWTf2L3e7x<^UIT9>DEJ1-!IB;o zqgu!<3uE`OcLd8Xda;JELAWpGD3N)Bgt<^{nU9F4uCPxOnGbe+xC{o&L%5>nqTL9n z$78f{_M>zg@)W2fL-=hW(PICdXnr`+)65_egg_fqJwEqJ`GpMLtu1>tN;MK*u> z$@|GwM2n>KR~obXL&*JVwU!gV;^lAFzF#wqJ0;$CaEzqf7%CA(9C`3a)4Z z`0N5Oz-1kWFP^2X_^Ne@@gI@UV_?X?6)rR{GIU^xL7M1G@*~p5(NWx(veK{SMN@Da zW|}Oj65(lv>ID;LJfrBD*8!b8Uj~XdSzbFKNw(a^TeS&={*5v&qZ!I`DkaG(<`dh)S;GbPZ2UMo4TUpg2DO8c6 zQ2{4J4yRsx82z<9*wsY5T{)2ZqwhBh#$EQM&VPWMeFN)XVY0C(T z8Kn2rkFMRin4k?w*)3|!t?d2Dio`MPdah$UUzk#CGd`>eBTA?y1qID!xvj>i3emvn zQ)*Ad%>^bRYasLHpe-z^?4BXI3w2&Mq_6ss!0IkdwSKC%>)F;dPW01oaRQ>wK-IpR z&yu&djcb?OPvP@DjVNO(}F4YtVotzTwGcPbJ%(B-d>O~V?kYn3}Thg-_VV$nMt z(|XUi5@sk|MV6jJsT|g2H?|^;Y{HY1XNi91;wqt+9p_c|+F8?ZCfI)`RgR#k@@Bu+AS$WArLs32Rt5 z?y=-2_l;CGx>D+k!Gyn`?LNbQ%y1~8e_6gGb*-G05FlVJsCiy3S65wlnR;gxjxjI1 zbwX9V`_?Gsx;(G*x@$&x(?%fQQ-L#At}veZ@N1~d8yR)MD*s$hW|wq)yV=y<(cY-_ zQb&*_Oh$BDeu_h_jeOXi(!0q_tdc{78>Y@lwcU*xza!>hmtXpzxBJ!NMvl204M#Tr zIXs8wvyd?wD>7)v3G}B}M@@gU@Kj|Bgo5nsGfz!7BF!H9)W9FwIlltc)DPiJ^EaaF zv)Z%Ar%Qn?#yo;#MfD%(1&isMf8Bic--SMTs}f@|E$@@o74L6e4Mk-Qmc$xO#M+Ab zu%seDgNj8mel{flRfJjkqc7!$CQVE+Q?g#krZhn46D9Dm_7!=tlNV?FRpS+DZekY8 z*;^FZ&li&0usX>Te7^OIATy{k#l+!{ZZZ3`)gt~OX!xepk`h){E9@Z`uzR+#q53AT z|BPN$G|e%(rWT&vzv1bBqCj|PW(BhVJFsz=jDD?oH`Cxs&I^P@7q_*)?W@Gg8iFOn z*Q|dQr}DF3qh}SVl&6se-`W9GSfBT61XGNNlZd!m!9Q zD0o2^4aSfZwCB=vEOHnOT11gTQj{A^DQf&#W=$Q833LS$VRGM^_z51+(wRhN!}KSb z+FK40kr6Eu2I@lWlVGi3lWy-=zRGRFGW%9wj*P(hRC7iSIDH2<@CP?4jw!I#2F!9y z+(?NRVlTe@uV9cSNIMRrk8*+bX#N$aEQl4fEJ{M=XoCkv+8V$`^sq0_;cYrF0$yod zlbx=+VGm+^0oq1F)SnOHb+j|Kzc&#hfM@3Fq8WlNR>IFIu>;kCY>#GRRRB=N^g{TG zL;7n~t<_Vn=sNDBs~_XZH8ZCPd~A!=yum6yXmf#G(IVXG$d!h)lZAc>Kbh%y^Z9w@ z10%6+?g?v{#IM#^&lDeN30suzg+JF^Nob1VeQM*XOqD1!P4-J!#i(<}NxB}z8*kL$opNhgkx9owrd<%F~jRGN4G*PZL}(+@bb>WnfY~RkMO4 z4dB@{Wta3vn5^KQ;NX=gA><`9ps7V9nV}h|I2ca=EIO!B2dF%r8m;Ru8rZC5kEV~P z`;1S2%>KDAw#tIFI<~U~U@6B3T|5&B$kb$SZ(o0BlO=cd4;0cMyLwK1tRF$taG1LY z*u|GvJhwZk;nt#N6FYwbZ~P>=xEAJgbvH7|b2axJN+~WB_O@Cz^aK`Flh5Jg+)rR43#pvj6#?UfF}cs#{NYvjlG?VfjZ zc5-s|W7h-a#KY9e7srR4E`|ocKmk7-U-UkJ{n_9!(m>8sep4ddmUN=u0f*^3&~@0moUN=9Q6fIe`ZtE5J5jU z!Mr&URLF;i(fJ~`63aRTQbRr#J58oxj4sH)ONhWaiCX^ef{=tT(V!#&`X{@s8mvxB z<#3Ts%R2w|oz8;XAXkvNHs1Ry7EvllA&+EPJ~CAg1PE$-XfRW%={YEuEixtR2?8eV zuxw#*k_G!iOQHoxTP>@DtFTsSO;lL4oUP;*E)8PI3g(1_NCLI3&g1(^F`*qJhGr`M zXv9%y5;=ZJ3F}*E0T1bj3E`D;7*_@HoU^rYs;&H9z+~i%cWFc)#=MKLu29yh@ou4l z_HRw;%E%EdR*M~jEN28ui!Cx1aBQ};WwU5`RjQB6Jy1T%ZpvE^?#Ns(i10YgYk6Zo zBx~20_gLg?hW7z6MWpti%*WGXw)7L}4h_iqdFy2u`P2Kp$YtRaKsXt+VoLh#%#Eh4 zHwv>#2Qs|^#OgKdT8(sC4XN$zXc9Y2>P=jAXySHrvuV5q{IAm+7>1Vjy0KFwI{BR4 zi%4hgn48>e&1m1PHNnnZoQtC6AxDp`q#KJ`wJdls=%QUru+;5cIG9HnM5E$ImR~74 zD8^Bccy*3SekHiy?sjfo@+nr;O(0?8k z#HVz^6oKLMAO#FphYTsWm%+Ks{#lTKSt+;cU z2+^`Q9B^6z6eSo}wnSSin*qzu=t}$#+iqtb4ZPV(t?8>3SbP?&1fIqb+*1aeN_z84 z_v9MRSQ)N1lVoXbfX^lzfcYLFxSIs%?b4V1t=5KB4bLSD06zK*RiTn|^FRf|Tl0cK zHkMlB$=Si*3ocnDUbzKKfv?Kqlv5oD6|9FzpMI28q`S3Xos+-Hkk|eEOq^Y}}R;1j?ymUu@Ag3MTKC!o>o}Za{{d&qRi^wetJ{)v#cJ zUj-Y^`C=_a^Dv<_0!!h-EL4V3p=1@f6(h&#bJ;X`;gOrbwjE=)1-hazr#xRfq^VAan>J2*yYt6-9VO;$Zv`aWGy)9N-`u1J3=) z^WS3(xTbvaHfz!SOod&Z;~t>eE=YEzct^-)+XdB%jaiD)T}mdt=)61b_Bt0TMt8ji z0HM9jrf#|>$ zODFgvi_n936i>Ie5AOYlq9eN2Vlro~dt^+jRy2C)HN2WNP8rnGIMTy*&KLg6r)Z(h zXlp9j|I;5pP`OQcO5OlN7}?Xa9>>te125RdKCN*tl_@TK z$uhojRX0U|_6r4TkxZy`2Bkk`%mN(Jr~tA^43&seNoWW2709h+*y3Sny#C#!)pBfO zY{LKF<(iczQgf}+z4sTL9}Pl?MVfM!V0&V5*7`G_I|}>v`%(za9TT>aOAYNjvZ*(-ZH7uO?;d&^>~R9@oMBcR&8pE+>|VaO`@`{tsG_OPF?k8sKPUmv3| zeO#v;S*RC|p&ptQYY{K>0MlI&TY4A-6S{)U5;>n@kWx)Q*0I+&YpOtwcPU1yVabA- zbHrr@U<3um6U#G35b|ws>+3OdFlZayFirg^RUwJuD-Zp}Z!x?f@&L4W8ICZc4Mlvg zBPn5wvr!T^y^p;Ex?^s7{xydCn-8)6m){VPgBLHhwru7{688Z`{}%r$@Tb8~^)*q( zv4teZ9p0v4i7pbT8~#RSKk!d{Rj<9=-1@Gyxz*Zw)7$!Pd-Kiq>u>*eEx#Gh8XOZK zbdy=k6bPT|F?A}buSpn9PecA2l2>J>It2iyiUa^pf?mS-2Oo+qrfBtxK{ZEsBi*^3 z|GpYy42IfYes29`-1^I~_m}tEfBCTem+t?r710!U`HBWoHP$potBF9(uH^yA7!%pt z$e@*bapWhVILk81*b^#W+?Aw0%LnHAsHZMAzi@V@0z;Q=nfj|P!DG^S%)KpAZj0nj zNnOD)u83FHfhEzbjG+;XUn0U(6ZLZAx>G)|2YJhul2OI7PKr+ z>lqXv2EP$MXc}xb)Y&NcInJSthLRbBMn1!MhS_3D#Hd)h@;tGx&}e#eQ#ps?9L#b! zbWyIHaMb;RGe)waU#I*cgMg!%~=TEY=FE!^|{ zJhrvM&hZCTk9-PTNrK%y=D02EWcm5RuobP>Hb6su!A=TdJ5+%L!yzgOb&VYgPGj(s zx9e>Mt=DcusQ?;&mkgLdUlesSUmB*(H0Ci@Ou&uG1Q{3=EwZ0W51R z+}?H`EtUF=J=EDpcpCK=a{9SaiV-X0k}9y!m;{nqMzsJEvUp|dPq`z}24+3m=2Zid zukYB~m~<{;BxiFKSZTfB7){FyhsTB>rTr1i+!-Z+;P?d?r(dKv0D(LX$Kk-cM!3%~ zXE|_}5X*KZ45xJnEDJN7Pc>LIoTqX5aTk+W8+N6rFW^Njsx0DrDb(c5o@rekcvOdB z8bqzrLC&1oWMd>N2o1d{hTnB7J(qwaRdw>Qm|cK)RAD*NQPrx1W7}z}QM@&A^th@$ z(fqQ1s;7w(VR*7qF|vzpp>3j0Hy7(xh>K#pOT17P!MrCAc&F>IvUEoNBngIM!LrsB zv+}&7o1&YR9MGa-Af^L@Cgz;S{^i!_)%+Ms%$nzMvg*Ih3u~UG+&q2| z$@y_3?Hd|l#{u2B4u;!a%~p0E5;c-7VnRv@h3rV&n0utem$Df zv8j%_J5SH(=3o(i4; zHzuH+V91Gz7DE4i_XV0T$qnK{_XNqpw**yNYg#F7Qs=zF<;(TO-TJ@mO5uIyH47RHN(I3b|DESK8YhurO2-rx}opS0Ve9Rb)MRa(X_3C^ERGOa+829 zkzi>RF860s)N6#|Lh?o^oK3^lwFAqg=cmGM-H!(coo=`0oG|Wz$Z)ens-un=cdb&> zWH_98hFy%+t%Coyr5A4;(Da`VZ%A)KIDR-&bs-VvU{N5z?!9vyNlnw)rZ*da2 zXOCcj6CrKx3-{_vZPR7(0y72LwF7ZCy?83J;{jz*fD8jX6(eKyh`u<^E-G&KvHzv> zR%yNVyuGRys>l@sM>yAglQ~^Xz_DQTqfHqfh8TfZwJ0Qw9{js>){8{}IUlsAgNx(y z-tpP#w&mSJRLp~RPc(%@7C;pJ`}6O#99xx9#BG7s{dnB#lwqi~TZABxGs+SHu#IC4 z^Y8(qPs4Z{cDP$xMFG*vkUMC10k^#5bjjJQ=?qJgCvXYlU6dwmT|1{Dp-W1UwmSm} zDo!vi@yV3wm*O+G%W~|4^AnZSfemFfU#C9xxCO8w?(hlHo}Tn6FUg zIr5O1(sTj~bov7u7r3NpW#a{x&tvTuVZQLmIsc_`gUkW)H%H)$7P-U9@u?u)bJd>UMZcZXpz8Tt2U0Y0{~LYaLO z%b;r1%hAkVrIk_AN-}kIRVbKkD$kP;3yzVaat$|80o0W4gTL0cHsWaGK1eojn!#Ye zSo~Vs+yKlsqIiS&=~sKAuK*Q}|LSR|z;J9e;Xg0&Kd%56P)x^TUn(@9|B91-+e!al zPFN9un6fM1hNI!YpAHk^>@g-fL$y*M{}{AP;&G7j*(7d^6VDeBkuf%`AKi;HNr?h_ zTdER-U%+U66JABS)#Jh0>Cy4K{^?o&<0;RI&Y_$p|6cTOpPYC{C+&CLrYG?8+NX!! z(eX(S5AWJ1-7~NKL;Luo{r05e{dnAa@3m1@=eugk0P;QOKc7D37!GV{`R~6auk3<;%3E~S3z|DtqH}e%J^m# zh&P_|$*-n>pmu9xiTUT7v;*^MB&HMIM2oA+2XyyK)$U47U^SiD;$tAymq2P759rFE zYF9Y_NzwE0uJFzrMUxVdWN`a{zKv4oU6sCJN{kk^)*|J0HGM;%35IgWb;!HCCr7de zbu3x5V{Fa+m>uIRZx0%;X|ozHQnyrwrWNsG)~#u9jft72f%M6MMjYbtQ7&%~mGAz# z>LsBE6U>*Q-XnE)V>b~lkV4tskV=a`ec)<<)2`Auswua(D;nQ__&CaL;G-rSNSJW? z&}o+rf@;%F^{W-!4Mww}*}n(&>+EB1#r;aIDvnnY&!&T*g{Oj!5nKIuVM7nsEB<2Q*stu&+2IiRBh(I~~^pHtVb=kqzTA0ylk2KBIunEGW6EuV# zkD08{-v@N)sw&@8nk{E%9?&7=6)i{hgtOv!{CXs&`=fJBa2E__X#h+kXnP&BEXGJ}@8V-G*9rifRv5j?XF{J{>pgJPCkvU^dS>)8W(5~USoM-;ax*zro)5RD^~ zER=E5ng$~wK2Sn>gPUOR`5_B0n)g-h9!~T@JhbHE^4()2#snB|>X8^}c>d_tzfahd zM63u8>0Z@a2I$^&Rv2&*A>7ki-66ou70M`l7RWzBdTrmQDTVb^&Z zPd|HXixdhQ+6T|PFV(vz?nYf5TwV8+sn@DHSoL@iIygWb(ye$c*}-9$pyr6y;|O{s ziq=)t9)XTM2nsv3WRLK)Omqg+^~k%uf&Wl^8?<>z)BA^vRn_Ar7^_QA@jgG!SP^J) zLZks32A8wzYr3&qzGqdHW9S(QwAE@N!x*y!Alxinb>fZv>1WoF@yi1`cMaRhN}aoo zW_%@t7VlOUm+ahjwC#O?)h%jl)2@xvJJZ7`us|-n8VwtI3_qipYp} z%?y!tsGxaaJ1gqlD5~5$ByCHOHaC1r_HGmUkfeb>M3tXhMJf*8pJggwS)4`=gX@PL zPLLTR2KNXfZUz^?FJU4U$H_EC&u7$YW*9oj=OeE9X3ZDM>_R#f+m38y=CP19cqLvy(u8dQxEkAXru&#@jy`x873$XTFJS(P!# zX=9I%8LHab&N?^GvL7fGV?IXV)RM&$_?DQS0#MVr7yq{q8ryu+O`8CvRplhs#a+m` z2{>%5GoH8((i5akL=4ho%F(a9N0MDp-znflprg zD6NYov#m&~*5|tx5<%R72~}We&9^CxFt%!ch{3tZrD<-jrTB!JSc}|rOC8%v5Vy-c zn7p(Hi9~QCU7gi$qlAl^ylvQaB++B1@%|ub?E`^i7?9+gp&W_hWOt7pjGj3uI$7(X z%U78>=pyugY&LQEYW}~+ERWL>jR*MT?s0n7r537mt=M-gtr!v=!{6Z)5=Z4W*XiDQ z#mcT~Zt+OzVh+o*`n5Fz9`|vu zt3eQs>ZAC2YqQQT#{OO1MAjU%rs0q$XZ?QNh_>Cplqg$`yb~U4{s8XbXm~9rNvmKd ztBRjou@q&zR#^t+>Nu4n!OTaYRQ%|kT*f2^xfyHU+eBT)ZUMhM$dM_N86+62&4}bN zM=X`n;iNsuAFd65y_^pyP6+hXB#ai(hOk~dVQBFq;8MsPM>jKCC{Az8?Y^6vnJVNQ zICN0PiplZ^kA{;Ai6<0MF5tzs4xqFnivJxQ(J^JS5+}=ef7tOAmPmBZGeLyO>56qK zKM5>qn#3+xNo#_5I^aE>X3R)tkO3k{R-<5z^+XrTPi?;1^YXziy!1IU$yj*0N|8Bt zddh+or{l7dsDdCjCQZ2xWKSAPSe8whqDfLt%gPhxp=0mpY?osBZ!ae%ipDB0pff-? z?6srz@yW-F&QprDBLZ}pS%qbv9U)0q9K*dVUli=yVD|q(2wJ^$!juG#}3Z{*Z zE5?bL6HEP7)a{ZG@P)megW1wS&tbsIG++_CCKf3%Dk{1g8yIRyoKS<7i;i%@4?a8Z zpzDi}-cHG^PPx+OVbPXao;PDuPvvtTV`YHgF(x4h zG$8&Uq~p9dnV`E0?^txHqhdP?v0UtRh1jFY$gP-bMxe(&Dr}zb} zaDpLjY0;8n6rzCuFjcLn!|qO*BoJYw7$Iu!=>t30C0~U1{+ED7=-XL(7!D&V6l76< zxjtv$5*EIg7lzZhKlMKN)6dBG(09e)PwnluI)z#u@pd!>#1{zDbR_MOG01Z;pr9c! zT_tA-qcs2{y%L-c9*A-q|Ki|&*y5w(OPql3I(Pmc9o?V8ii^phsxrqRaRK8RFbI8u zO1k%@31QK^rc_mSZ&%4qJR%GB)8?j!_p%~CI(q#82^Ys7KzSBiDb7^gJkZYe4m`MWU>4{-new!{=G(JoQ=x3bX4e~ z(HYoXtf^Ezf!Tq!Q`IB98`a!V^K-DP2i>lH=ybd7cb%FeT)gU3Zf)SEa%*Ca#Fdyt zJ3*_O%89_t&-x?$b~x`(F6{`8d6nGEBG1hs8b_ZIBXYWEJL65R0jixbwQK}6koF<6 zXZu8)y0}x3B^px}w!ToR7CZ3@Ch1BzKgu^i2{cK~ve>-+_^yBUv3LHlr%2kD=4JJ( z89E%Gbz#%AV6cODM~FZaTE+_STg zrCKodKN7aJ0eTQ^$EdGfP2(})7DRMjj(=VT*I^WqA!>vX!sE$AOX9-u zJK_QFaR-3`LN%bDh#=-=ryq1~1LO_v(1r`oCLDHNX)vC6*-DHn8g~2_s`sfW`|QZ4 zf)!z}TPGsmCRYTh#}5rWY7xIB1oTJ&0zExDI5|G;;Z5fiD7S$>9o>5(C}1&(e_w>KfiH$Wpz7$l5aaV4|+a+DGb8cHYE&sxtcsKgdg{MH{H zVC|!L77eXT4hF%>7pW3Lo#0AbCS`~!oGb5xq$GHb;c8NMh%vwVmh zUsz06Oc0*f%7hy#d3y#67gvRzK&i5R;PafZ=Rq$9hL1>e=jJ;3*n>iE`Ld~$r2jR8 zp86D-2c$q0GhGX7%*AFN!{pQFYCttE{iKKnvRPZ0{LOcYh%F z!Fl<<8re?g&ahocrv*nHLhGP9Yck;B4?gY&#i@$nh^OX&0ZnmAR)5J12SCjD>M99R z52ovM?2kaUz9MJd+AwX^8n_gZ_ws~%NOipOYa`Q+2_=Z*y^s^6G#5dmDHcYvmj+we zD}1H?2^bY{l{n;iZ4?jul=DvDbP$U#rSFJ_WD4VmL!tV5~q?212F}O*%)9jh!Ezv8k7?7$X zt1EFNUgRofsuvapoeF9@4XgolwweI^=c3Mw7w#d@J6m|=IG-XKNUe3yp_&tb&deVA@dDt?)W0cX7ZU`Z$rB`IoR77(0AJTZ4}qmsvQ-Y{y!% zoE}H%0~NHaAACDdtfoh4(K17*41Yik!B}LT&R=D;s%`~GkY5Mu3flmb1O$U?p}%Uc zduNAd+t};qI^eWGBDS{Jq{kuVKFh3nk)NMRp@>GpDV9!PG2^>ve*BZ``FOoE!)hD9>0YXm4*Pe8G&i;9#e)G-TSSa7map&k8H zz{mJiIK5#>O>l39ii@Lq!4^f^dbs8}P*)_DD_CN@NzCyrfBE#wx3Hu2e)noywWe3Y zrtkoNK!CsBIKuzl2T2X)1OfaOO{{qx;!@<$Rs=r^u6+Ujjex(25Q%H3fvYS0CyJ>7 zfd58=&!xBli<_>rJ+nL@(Ne0(o^41J@J$k4h9h{LGYiBWgVVkFHT?79g*!TcXR<~- zhMz%Q5j6bNqycNN4`{L40KK&YqS zsWmk^2qhmnFNpQ9X09~o-s3gnNW4>PYRzn|s5gP5J1cJ{&C=~?t!d4?Tun2{oUvI^ zGj@6%XjW_H)rxvEXKYr~j7l}8H>Nf7dNs`q=8VmXnz0g$VXIm*->#@PbH-*h&B#Z=-Z&uUHys=qPGr8PK(e3ox-TvFNvy=YWMIX}!*KtK}dI|sY#h*4+nk5@a>-kmc zD!ILQb#jn0Q$v#I#|ENrWb2$+7cJdLQr=3#(@mIQB!CRLtmza|vo6XnZO+7v$fKw1 zI$$w!F;(U?qI$DLBSfx7>G(UyMH`M~DO1vjB$ug_uDB7^3&H$Fvj_HKf?5xoI9k&y zojoB2?AIsHqs$(?m4@dz*?~W=-jwm*iXFPWi^pPz2k^ogF98|`nZPjF;UTRn<*e9^zWZ&K2mzzsnYAX)M_ z1TjtEzxbw)Z<^j_BWDC>*C!J%I_!i0&=0OwUJKKNVWkoL2mfw*AMx{t_D}O$)KY69 z2;YbQ(z`yrtJ1tPg%twBBv|mTw3X!Veg59`N>R+~G%`~YfhCyqvnhfixlpt~n8}b3 z(f~oR6{CE;5JWUeLpTTw|6ZuFj6i_^kYD8Qg@A})dI)0-{}DeI0znyT5Wqj+KlEdv z>M~6X9Z4gcDDKmXMWM)SECeWEK=R$9u%;CPKS3Tv44E7N z#fL?KQZ9`aJ1!E?Va!13gYalvW}qektZ^Kcj>k+JG%aM^!crt02Qck)j6oa_tbffGP{}q6$2w~8_I`efPs35NRU%nh=XL$fs_l0J+F`mJzH2PORAiM^wrQf z7u+S*kSMi=7Q<;dC=Unmw_3wBUU}mWc#kWD@%~{HkOKR`J@{hvKr&NNCuk^F)emCI zhxcM&^@6#*un(*20rGiE9Tg`J@5?B)dy}7*C1aD#?$!5@r~4|pn3Qx;36;5hTy-b4 zR22{I;?&*4sg^ZmUjNMA@nx%zfs)vke3qaMdF=T^%hMQsbI?y?;Vr=BG`p%Luorg3tLuP^k*OnOwu}>-rk&_Qtwjb(!Y1$q9zMZ;zht&{ zRBI%C9=!S+LN&w20MCgyMM=Pes78vsrp}r2@hdBw?2_DT0CZ z-UFf|5FpaLMubPX;n$vzHl&D)kH)e7jT_VfXwG$IkskQt=Xfe6Y7Q_~;~u`C$|52J zDAh^g9frxkpAOGBnoAaGLWlL__a~ES_{C2Hj>E+@&7xfLa>mDY!dOPHgpcH7y7Y?2 zASY&5R{`GwxXGV@VB?4IPC{9+C>`yQ0Twjkcao}>Fc zFeMoElN>!q>^KS#=oSzqxX4#N8{Bxen3)l1H}P6z*~oB3ctD&O0J?NB zi_jHY#TVjmt->D#|5e6mN)RYJxtw1b6rkflE3KW9AZz-#D^|;{M_c<)t|0pydEcPZ zRXD=JUNQ*=6g|x-g&42L6ZGF?U@F|8-Z5a!S>D$}!!ql(hM$EE0L1c__v*^1030X2 zh>boA-ID$}0{V}DeTN}(z7Xdi$4BgG)*hu4UF}1VrRHHjVzfe@P5O9)ASO1t37P&u z1;DSSffKM8N+Kh$7*R53q)y)kqc{nST0jwCs1!Y?b@s={$;Uh;G~0O>L+35wp^@8w zWA&nI6m)_nPo~_nFZV45xR&%Aa$a02H;X(9_7Ir<@Ogz+!RsrV_&%r&Lz57~KopA@ zyNROOnMRzOHI6v&7y^zbtvup(dJ1%YI_~vFtoRHE{iBE-FE%rpGP4X`dXohQ+=UU3h zY^*Wj_+Krpid?fZ7f$KUf#lKSx5LU!?i;XF6*ZLk+&~HReZ$pMrIairn3jUFQHiy~h~gfW z6=59(sOju+r9fveU}177azM8SNOKT&m?(;-ihgjNB}A!&e>NUysa_n*OyRpgfDzWj zJ$11|N0ppB7)72ollTQCAq+}or`v_gHcq@KE8Xe;3s8ULi6FZfRW5z@h>!Sd7G%w8zK?+(i8b zzQyByas#{0Q9fvpQJ7}~`)^ZJ9#8{Sx5$MzwEZ5a6J4bfR@jCf3dMC23P;4T=EW%@0E1)sZP=_(54Y>8u{}J%O82hk_MB;D_6j0E;C|bUIM=qb^yWX6@Ty z#EMs{(jb1CbPuC1@#i3~CCYPzL?}%6?9ZqjBzS{qi028uR|k%u05?n+C^Bxi*DN(N zb*{^%&>H4G63+kH^x^mhpTkL?ytr~#wiHDe!_;C>l}zo&pQbvQLD07OlE#`IOVG?v z`-W>1&z||}YrZ|Lxyr3=Ro9kFnzMSBv8K`5%g5+jL0hjLr)O+TYPi%qLZ7TwzFodI zMt8(VYadjcR}dp)=-Ydm1}bkAOx`dRTODygFN8B{##8if*W1T60}UL#-SS4omVuY% zT@s2|t&z)4Raa&9%i%3RB1s`f_Fb2plut!@X+~U3^C9@{$Q@q|;tyjYG*dV*hT%4# zD0q05iD|@?sPx$S2si3NuBxoZxV+|+Xg(4zz)8o1GmjB`G(XmJnc>cf*H?*WnC6<9 zlVDz7r}X{B!t^S^k`r&!aSEPeM|d7J4gBH#V)(n$m?Nt@Rf2UQa9(gpO=%4mDB}yp z+`~|Tziv9ipj0LlK5m4>!9X4(yZWRw>vcYm&ew&;$;HqhS18@3A$=(eQN z=QBp5z%Viv?G7r3g?W-^t!T8`FLS{bk>KvY!UXp$v&}|SAMPyXPP-=-S)agLV zhn0DF68KleA)Wx05B@z#l1o_s@Pq<6crp#Xgz+qqsL*XSH1-8_S`{*R-PNk7P?B_0 z6g1PN90JH22Mb83bPIkGUkmP0(V5*;H;J6Wo|;IA$$W76pqCsu;NjNQij=1^L z8Ll|=VdtlVPA(*%eA4MX@IhHzL9H^5N%w~X@8#y!x85-HucH{5;mUR0fKKkE9yXrn2FU&H$Mf@xPPg0tv3+rReEP2c<8kkO|NLY3 zef{;;=2inSokbK17lZx|DLx@uyTH~azk!vH^HRu-I|Y#8zdZ~>0vzfD>5#I{a%v%P zaU4EQEY=0NcIMFL{Oo+WvHuF2c+ioxv>rlUXCcOmVz*c_|BphUZ)7I5yDyPgUtce3 zY!T_1g-v&Yn*aQsf`*-p@D7sB+7&J6xDsX6*MdP@fF=s4gC12Uqf4#`(;b*!qd1V5^a-7(%~NIYUtz=(RN$MI4K=_oCuby-yny zt)0RsLbLqE=>x~cl~&O;O!+r1Qqj2vhW*jk9&y@^nyEzIoic3^zE_D3oNB7LX(_gC%O3eGm5dNDXLqFHWfn;jh@?_uf zKm2>o+&vA&h?~VRmmpW!Q-Q?mMm=E+v$H^N%{xA7$h@~Jz2Ac}S&oOJ<5TkG>|7kR z4?6W@m6_@Z*<2lGSr=sXNS{^;EvZ&!_9hJ!(ZJ&>R$805t^?$F@jaID!3OapP_e3V zO*xv;yHc&GD$KIOL@||l=c;`$ z1chnOArBa26CeD^_BI*(l6j-~{&R58Z!^>=@I})b=u-?uLcU4OB4X7|=A-Qisz0$_ z#{*KUi?yP|<8J%yNyjp#5TB1foS$?)bWVG`hxpJwKCQmj*xdY%_8QOR)ygyAnlWCR zz@GG(p8{iDg7*ImV@;y{PLj+5@0+dfU(!4xn`$i>9kPmwjHhM}cQ6YwsKv-zC$mnR zGZl6KMf7nIK*2jWX+wP{!1+ze67LQQ3aAq5>%rNF4`-*cP?t;DsGl6ay=Y(joZ;R^ zowq_CpZtG+<|D?g^>Y37`d>H1uZ@Wh>%aWfzq%c+-#nm=O?ckCc}@SqWB&X4+izdJ zdGr5my?*)at5@H>{O;Q=c>i+q+s#-1-{#7CS@O*AC<>aK#&KF!Zr=BN=l(BwHa4En z1px{2_Xy2*c?sjCpz+Pd~Gj zb%a|uQcLmBymxr`gqt~tC-+kX?bQbjJc4=Cdb#;>%ljex49ko6_i!4H;xD4`VVDTn zG^BvWd`kD>xaW1_tMnH4c_-l@0GW=ZyCA##0ofZw_adJF6gWQUoOV0w>0OGElR-1N z_xu#g-=ygz+1}VdOIZ&1xE@chH%1IG*?@Kg9=#h9;j=8w)WDBWcwSL596uElyPW#d z`)7$a@vnnzy@~5Ey_sF2Ergn1^54r*e7Q09abd=H@aOb18XRokmBTn#9}fi*dyoD6 zw`xQVn-~;4tOJJq5@Lw#=n58mI&izZ_YTOopye7WI?_RwpfWEJB%7Sfq_fJ~I7THf z$BY2&2VnuYwZ8d;Om+j0jwY(KW3YtAzFMz9Yomkf_)0s>P6BB+5pl1iBh+LXB!tZ{ zz}Z1DnMGGrv-}+P=Xj0 z1X2^OBx@ebGco|%-L1=aDz)5NqejTGKK%jOn(pp%8wjyInM~t5(2CKP5)DAe4G9I! z)hPB!{!HSKd@#`3C`{srD+@P@P-c1|%VqvVJ65*ACGUixFisUcqXSb9NYZ)FW}tYx z#0cT_1^@Zec=RLLq6mx-TR-|tUQ6dUpnjiXVgtleIX@ABh>D;);c;@k{r5JBC0KG{ z$Q#-)yM~Uo`=GgVA{#X@G>{{d*G?7#sRC3Q$DjvqV5vvr<$ObPnEB5T1^-X>;6(wfNI0{sTD>!jWro{>`d!2O=FVLJzd36ZcLNIL5Av3MIKrEW zkdtZ+ueM%$%tny(kKG83Uol~qY`Fv-H!Z#A-WF~(ycY!=NZ%b_CH{Y+Jb+E}`SD5T z;&BASpCk{^YIPX+i82|Gt{!{~o?DM`GH*LIzPmfBfPeH^T~a4M{SVy(94Cvn4$efOP?#sS7{B9#t*(S18z%gxdm#VVjE)Coo9gZ-UH#j|2;FTvOC=m}0i zpavsMQUg@-L~5J5Bo*C48844Mo}ADZDlf|+8ycTMzoRZ#Bq2;J`Y1S5t(n37i}qW= z{tLry@ECc*?7-dBY9CXA6{25v(qgkw+8yeTJiy`(<$me|)Tg2A_stO!Z^vO2PvM)* zkjUB&{AE4=zp!4@%K^$>OmO={(I^RgFfwp@clzZVFDD9pyPGgGT%Ba}uroSN>bHT2Mtp!~tBA!Mx9K>Cl;dX_VX&NW4v`CpD4&CZ z*tz=efWH45m*E*tDx<00q}(nX z7C9%0ONcs`R@pLAVP?7;sXj0Zka-z07K#mnja@QhAtrWT=@=}GGH5;ny8solZw_V& z^A_DX731e*Tql@^ux*}kiwQZ0LN?PDECdx9wy>Fsgk79;MeCE!sD-O+5%={cJiNF5 z6vJlJk?k6GFPtE7I4uCfFhP@1ZyUI*A{^#33zK+K8Nh=$%w(_@OOJ)-~Une&bzVAqaCY^D|=ww3f zQe)W8V+1KY3&(qc>+5N7jcM4)+teF{p93gv4S2Dw0P^%wPjy}50Z)}i>b2I7v*>da z-$pGK9~k}f5gNG-{Lif~hj2qJb0E=ZDdK{i!~BlUBSpN+eXDk z@H%;rwqzv5$03(!#2+s|ns~&>BEZ5Q_KEyB@`tbh3>;d;`=Pw!P;YkI<9)>u|sgdutHmMPXH3thAQR4av ztyOGf%WOmjouf+}LAT&;;zxLsW4EdXe(~X~{#5G8o2@t0lQ8-M;%i9OE+P8=iQU^g z3@bMB*T-+nu_6JrIVsR z(v56#J*zkwUs5B_$N~s0tF`8&$rHMJkA~6>_!_Oz<%Fu#$kxm6sF4D^!-VaqFldo; zbSgFS{Y##Vs1R2e=Owx8<+q|IlY2&bI>WF;6sH&WXW<}BNB1H^r!533HewCD8i^|H zRB7bfO)(}YU7an>X{BN#Z?Z-nja;ucC3i7=VYPnlukY*9O#S8^MB^)eZFiX;S>=9>E zkQMktwqLE0?}ZpXCzZ&17DThLCqy!KiQnKT*!B-)ejO`eq>?+Thdfm_x({rkqHbNy zO9szc=lbkmq4}o}Q5?0tgi|yoX(6-J8Wk#K8U+-e9kM#M;B)wvau&VI63LR?YujlZyon1?&s!dcdx%Ev2qz)ad`Cc*vI&k!PON= zuN_pvcq@@$j)#_bznH9l{qhZqdchZ21Vpxt8U|{3L^w5BP&89bZ9YuxdRKW5SNz8`8rY)Ru$^w2EEOci-{KDAF5>+&$PYU;Y@O zcR@DPOEmI7YW*UO{C868NzOm7Cg+zXm(YdD{f3iMP2zN&Rbg_%lS;CPrv(LqJ17}> z2UWMfE808EX=H1Y8)3l#f@C-wUn3l=aP35RG9I91n$7T?b4VHHL0PrPtG>a=?wFFM{~r`I{? zt=cI3&%1Eu6P;0ZlqH;I>57?R*yBDeGX)Q#^#R^Ji_=@O3BTQdR~r&SU({65$_`$< z*xH&0cbp8P^>GLcoWxftfeoV8EZGolkQ+BQ-@f_o)tm3v{bX_{Y_+R_z8(zLucH~c z$in2H%^RApw{Sl`OV)4F@kk*nt>PJm?g!!0|7<(@_ zU%qUZHD5x_H~E?`9W}T9nya}5HNVZ*+;Y|YE?0At#gbWb(^d0ZqvlIz&F`HxUl}#G zoHf65)-)-!>8$z2S#wjb`Bz!dtog00=H~Z$&F|ecUps4l%RUDmqYzmHK5^QQ#5*7P zDauaC(1v09kH@F&^W*+e`@`|c&t%SRzQP8L7yb76xx*?_g)|eHL;Bs$d(D!^0AZPo zQOt0OQ4XXAudrEno0buNDYAyCdnpbxS7<&r3gzS>sBPschWyTmC(yZ z%2mE%PY9EW5S7cEV4f0;K72gs0eLP!O+F^KIpGRdOdvQl^)$iA}mghH}uPB;#_@p5^x`bW?qc33+UWTJEy|35A?zz^Ohn>AD%!}nk z;h>P84^K|!m9^Sdq5a%la(Ig@4bkdf313UHSL<^T1{K;e0HFqm?(@Q?LmV*3I2m;M zh<1u>hoyp8*nYWJ;}mvE_|FDKK}$AXzI^%p{8^`U;sR6F zY@vO5z7}Qaso>vmdUkwza(vp+1ws_FIgLG4KAwK;IwDlGPe41t;lwZn?5AnmoGDm|K4ZQX(~7hT>QO%^zrmS7{*m3MGiLFCe4Gd z6|73Nj5hz;LrOeIU2P+e{Mb?+myq^_9wC@wn>w~@l^@>M$-BvaB0LQHx!Q*tVc6cD zyxUlDD_SEQpA7$8-RFhY9& z?a%!m+9w}vmF}W*)c^6KeU1p+trc#69ssm>Q&JA}i5RdM4NV_Ul23pfGQbVmxlytU z3{e^1ihz`4juEEW_0(E?BnW zpn!43JUl*;D6S=wYUj}?I`GRXw!6pnK+4a>^?=HyI@}wMxL7=M+D^p)|rQLiQ#G!2bHx7J~0i&fd09=#X4o*w#VRG(Acs^Dr@J z?3~Knk87Cb*1aFR8Ug{p-W@=(jK4b%6)wtUXn& zDQ!{m_M+4NJ1#J1u-Lr)`0icjg0}yZ?+P#ZFF~Z=Q_L>U$8fxp?dZ@7BM?iyF-4b=@90SRLQ}`06E&lM>qHVM9QkPJ`hrLhoqu z0R>t5M4U?24r=Z*bk5Sz?rqLL4gm>&sC&SHg^l7EFv@|q`VD8rdtUeaK^z9zIcI5`-ovK5wjL`N?9~jjeajq z*|%Q4S**gVZ{N5go~eaNka1t>&t|V5d-$#9)E64|qMIQLt{Y1c&bivxtfc9}R{r{E0EYm6``RlJ0bYL<%2!LZ**QHd-1Oz?ioAAY@G}{D{`3q@ zFtdFC^0lzIp9Ir!n5LXE0H+b!DRspTe7$-qo;R;wHT3NVHu1Z*x($LUEEt2)x8Jv5 znQJ`3P$9?xh$ZDB63Lz#GV4=6)fY$1uQrXs-+~s1hZYF{2MkPN6<^g+azAf0Jp5S& zjJ!?TpJ(&wW4Px#j*Y!wH6!81Ch zSF^!Q68g%eCX8VD2vf9|%{p$>rq-J_KKq^nd?_JzO-xm-)6P#lx^;53D@q&L5X#EQ z3<;EWsj&pn#H`xMQ6rp3jc`F~2!!x7qlfWrBo^sxG75I=%Z&X!_vOV)y1kHhv_dn$ zgjBe~-`p!*fvAh2l}vi`N#f2E zUVX*6;-2xbi0I7>2{8&gny~(%OGc>q)M6k(<~oJB(^C}*#{x?P*Gi&fH!@dWvfn}r zjO#4siK5W)5>JXW@p)OJcfl```QJsfBw!R}R>F&*II<(z-#Xs>BAiaT&K32Jj zM?(QgILD5H=sLZ@reN7;fYBNpPzP2f*tMkgOLz9FLG z4B-+qxPY9>D8V&U7HM5-p+LIkU52TseiL5b;OOuh7~k4v4L?Na=PWD0ml)H@+`>K| z-X~sdtLD|WUb1~JRg>igJ`6hQ^P}J@EyJC8fe%4$5rc0Lhr|N-l3tVQOCUww?v_aH zjosWpHekM?y^c;U*ltsZy2LyCJ3>Dm2EHD6o|7jB12X9MFXLG% z*n}7~7X}YA-ox~RS@e11D#j2tpv+%#+5Ex8J%E~B3Wo(esQ%lRz0c(6liKvj0Bp^WmdwcT)7>Go2RZfHL^26;6Ca^lDxPAFroY8J< zJUu%=b-?rKyh6Z}pxC)HsSMqxM90`j%iG$i3SEFF&GJha+|r=~z!2xUmm>c+CS&rX zwhP4?$QoH%0Xj#;^v*05Ih_>jw+VWd(3D3D9!jz*-)4Qlzg+L-j1{RuMHc5-gm;E^ z3n-0$fj)fFHLm9^B13D?@~2b(KFQLlQm?Z##}c~WELI~}(-%noCbLb8)$%N&?Aaj3 z#BH#3V^JrJV1PcsG(i!L#t?LkK?vaRBtd!>y$3N}&#pXnjL#=fUqb_?_8tv-QTZ+= z*fr4B3T7qI&$O=eMS(Q?rjhau|}<6w0h?Rcg2inH8{Y2P~qy z3csjOx-P!Sk2&hv?H89<6Tnl&fBB^Io?!JIRdB7SU^bR0BPb4RCd`kYjX^OR(e(@H zVz2~#31o&jvMs>X6c>#zemEkF0TpKqML0FC4Jqvk)HGDHkA5;ciX_wfbzIgPt$k4g zW@08PwAn9YiU6x8X7=jZyw^YBBifw?)Cb^O(K-R$M`6&&=XcktQBHIvAVs!vQ%2Se z`rC3c`>qW=<~PKSWW`~+>Kr|YZ~?(djMr;B%T{ITukGX!M=haFOf|UC>$1?;Ea=j- zyqeaeXfVrN7#Q=Nm|UdWj^aKY&F+D^HcA4cX}i8L=jK3o!b*@s?I2m=%HU{zNaQhv zY?Wl#SLdcp42}{KIebSq7O?3}(r|*JPASolmo|lv<^X!SDnPp{g0sIWd{))5{mOs} z^;yglPMaN5qYcC|slMkL;$4ZM%Ft5#BW#qNi;YvHh$EU({!C+Iag_K7)_w>xW}qq& zTY<{zJqBklh}F{tu+olr4lp09Sa>KzR|o!+(}quRR|K-Psowl}0~@&P=S48ge!PR7 zR+RmGJDO=F5AJ>K+s^?eVKu7WH=krxIWIM|e7Ch}y@y6U+z5$Mf0$VCTf#*zlSA%A z6uLJdF&-u;>at#lUKqOmL!>p0!}fNEqNK$`R0wnDic~@$I=pY6rg*kHXZ!#RUn=r> zU`EI=>0=C0k9xn=)Zg>nC2cgl=dz$tVjBEo7EXh#1XXDo&?5|$G2)-9oTz93qv#|_ zt{~TTl9vqahdk!^C}*YKWWkzt%pD zQnT8%2J$*Js*UtdfmSVJITQcG9vy-+tuqGs!{#t3dGNk-@OM{9!D(7iVJm4DRm_%0 zp?}mq>2{om@EDiir0SMcEksh(E~{INb?^Pf*^ga?wwO0%xT+dfg<=dv9jnGXy!!1t zYB*KrW5@Me)#l-dHC^@QVv2Xbd0a_cRKQl$byuB>G1Ye0t%S9M$Qgu%sGdQq1guie z@&i%`t+=nJX9Q21n=GNrdX&|%s}$ocYuR;*vFrSYQ)qx#F2j#%6;>+75b71yDxsiT zutnuk?bIpKqPge?#DU{zE{-2h+ZR7O z(PV|L3{zRRtZFg7T)V999IUJ9G8MZ~Nx7-suL|0ZtD^|&tF;Hpwmhy4zj>F3CB=zB zR!!`%{M5Oj)&ZbB|7;pO07CLPoSggV&CxU-ABCepb6*rqz)ReXi+eL0S}#b_13w84 z{nUT*yMAIq&$y2eq^pKF8^>38_|2xHw1vQ1b+pBu2G_8=pll9xzNr+@T4dVu4F-#) zMpSTBY6QKGbB$1j4&J{Mv|yd8kNenv4GwwjiAz5MfG44jYWS_6%tCaC6wOm{dR5R< z${^-|H4Ku$G$iZfo$SEMljOt^bG?t^KAEB?1s~&CI+>-ek7NJ7kDTOejqXOZ&v<5> zeU_1o`+^fijf?P3EFO>JNSFz;ISdv`G^*+Br$z!t zi7~O}1YzXM>l}^nS*M6$t7rpr7aH=`t<-8kJL{Fr z7*+`KQRSe~G>Fn2?&CukFM?4shrsoOd-*b-B()aT$rmn!VHl2H?J<5$6I>QLHTN3nj!L+oqTgz zni{P!=bfYm&H_{IR#Stpp50{f3T*I~Jf^2lnM`plj!iGW(2*Y|Ega@IoY9%~V1CgV z+dRq64!QH_HRi~|4`|hNU9_Z%DJOgCm~eBXm@dLBx&Ywd3z|dU&q1;~yF@wLMQ=Vd z8FMcFw4OQ^IX89^u}sF;S0lMr^H(-j&E1L>OZ$3^V;S6~-2s3V9W4%uVU%WVMFzNF zixnbKcy(_au|Jo5kM=TzPN8%0997IxNx8b}pFr=7!yjtqQ)wJ~V?Vlw$q{wyR+#OgaE$KnpcY# zNGURg3qZ3=q&=g^y$}s)PMesaMk4S-BU#dpNC*%rX3^;|nD#I4cc>`3+av0UW;jMA zgf^!X(DOPRYKzqv)WZSP12oARfb<)oze%O@LXU_SXB6P4>xhQZo8)-O^c_@u> z28nRP9L-@Ge$lo5@JgUV_r7Y72~Sl%gA?3^j#x4bhm16*@ilO!1_^5*$pj?>Nms{^|cI>oel1AK|w8!a|#PW$A%Sr~xDfQIzM z3&|Y=njrrbN`>2a`dJQujIAJzq-AXb~0JN31#+W@=i4WE6NyG*oXXx0Ue&&=EfEX5==y+X6Gg5Ah6A3{? zI+5U5^!nnFz{(b5)aD_x&Gy|k8L(qF>UWK81LujK-k`6FT&Y-|N=f6Rziv#+nBIcS z=Bk!O$BabeM4DFzeFAV&}O zE->3t5NtVC5W~<G|@agto?EZdBKN zj>P&)1#k{Z6+s9!pfqzhNXuymGgBk@C`{7qpe5Onc;I^yg$yEtc%#;L7Z5rmV?Ne_ z@arm2rU8aR5PVCK1V}6c4DB>g6)ID$v)5!30B@`NwMhc=siom-w<981$Re4qAaw$O z9yX~(I&Z`q77CD{$_u?6K3{@lf#LgI+4Gp-G8n~`ck%e32_*oE@RDLTklu~~Rn)`M zY=-)Kv0*&3r$3q@9IQd0a**hNWHC@wWoLe8WfLsu`YNJ;yNgSK+U>0sP;6OnMewQt z#ES?blh)g9lg3qXbAV#>wvEwup;ppWd5H5siV>Jyao9VLVlep+WHudCokCF72T5fr zka1d7-t6~9je4(9y;r!-Pe=FYaVp4a^rzp?6_CIy_d({=TAmjKgx%irDjZM*g?x`n zu&_MeOZ=8xZAk-p5B=1vhIf0v;QLRG9tba7g!@$;AMDOjiW9?Pvsj?^C=bVA1Wcfu zcP#htedBy67r_=Gh_EPi1)Wx#?QL5~>~C-5w>2-#A|$E^!r95V*wW}{$T)%PX~S@> z_%kqFIjZ>~5F*>ktz?|}uWR4I7_h{n$?iu5TpVRE7V@a%t)gFk}1CZhcPQ$5>C%8ErD-P|xu1c?r z{|YCijM(7rTq#gvGCulLEH~?a?xmw7IiDprbs=SoJy@_{JaH^;yj3yC$#p*XpM&XJ zJRHq9Y~GfH_^+$tCx1Z};0zx}XBU*y2y-aVCN0~Z zW$pL*OtEgRBpI(Yz1nH4E^AcEV{sJ4C)GF#y>+h}WPv=WHwm9qMl*j@YZy95ZXK-s z{!9MBZdjwO%kZF8bmAJ2%(09@w~Otf)cDKtyBQy`mN(ENn~_L&7y*P&{A=(^$cV#n~A9V$b7e{A^EXrA&>%v!?$?snsv5KT1{JB729-e)Cd(zR1<+D@CFLeqftsENFA9@7lq6n=;K=it1 z{KKL#$@^7`rND{`wrS`5*~`7fq_y}?pJBj7wCTqEP8Z12-x1*!VRNJ+QH!$u{s5o7VeH*RQhogBTN?LHGMtDNZ5b>V%k%D?con*4!% z;aeG~ma&Jj+T52B`)UF;Oh%?_PdO5tUvzrCpNSH*gfc1eM9>D}7rLy#!%FP`r?Q?K z-QIiFfNs4k?YgVa80#flO24`}MpOTCQz$$Cd}>cFJjT%%e$;h@{1ykAHY*lOD*_?~ zmgu1-IH(~h^SJB|_QySAdl#KH+CH~0U|PX{+FdcdDtjSo0YVCctQEKN?-GQsYHvCG zn;ucXj)qqOnD|}fx1BFet*Ypn)#|WqV#NkH=R1|2Us%}RE>?OJFVJ6#Qc)2;l@-P* zi&Rk-Efp&zH<*EZp~4F{u~6wnp=TpdvFuU}EZmBtsikG_pDKF!;Nc@KQAL>LPTSQn zrm;HJZM{ZcdO!B|g&1$JATPLFth}3}cka^~u>q^Fe_QOB6CdM*hA1J?Q9hMGX4g0NwOzJ2^Y^T=4WnPe zPmP9&)Yn4vKe>)2)Npi84;_P1A*3t<0w`T{H1J1gG9+U2=Yq$Rc@;;)r2BLXkBJfY zo-WD~-1pLCq1xKH$D+qtbOpKW6n*YEHE{N> z=vd2O{I6xMOOweoz7y8c{6i{LQoYwcDUn%kn59(Ip~Y-Yim9pMA_<(-3c*XQB|Zq+ z+$CH@3gnA9KB5hDujk4AUjhN%Us8v8v zqvx`cP=sh8Y+5f&>}24N0*%yN{Qd7tXhyh@%#6Q5WU5h2V%g(r1g=V7nJT1pg>HXn z)^}BK+aqH4<$Y}ARxk_7C1jS2%C!)*90YuW`QWE{_fF!wuIOb7Je5;0^U;r z!}}_^P8rEz<8|F#UfLdLxlU!eQbmpm6xgM!t^J*)>I!yUt}01_Y;fGmV5;6!oSr`&AP|H61m44kEH^OlYIzJ+bR6_ID5 zdMlgDwUXHp>{oB4fMlYPfgkl}NzjicnU$5*uyz`$4U@F2^M3!jlu1L`(o=ZIi-9MO z*#EsF-P5&;x?)4zEG*CQRhL|5d+7XL5U#CgZl9j@*_GlLsBN@#dUnz2eY`j=rbKbw z3`;sxC$D_fJ7oi0ND~oLC3jz$kFrL!D=6|tETk(dy)s4i))0OQ5M8U zJ73EI;9qMEXo|9m1$IeUrmT=7#m#)kMqZk-M*b;LX=s!vSdP_qXN;_j1&`Q)wm$zx z=0v;Bzc9>F6B)kdEyZr>+)buMH}WS9T@4l4Nha=_2kj|lS1T*DZBDpr8$G>hdT+?&$tXD|#XBb$Y;oR|Fo~mDLr)CZ!>bNV6qIG= zPAP^Vy1qyE-YqPqA*O9X*L%uF=Vv@Ysq#48nTL7F__POO3Cu8tL6}lPyyGhhEdWr4 zaggARE5RYZeF=$^785mtb5YL`c{da3B+vlU*`XQ(WQ-*1Dz3-Agn}f(0Z> zLyGG$gaspwz3$QRX}h!Toyjcisv74~enJ6Ww0a>Yz8uBzXS!Gys3~lP7dD5#%WU$K zb#;2iP4>^u>%c|L7&K;Oz0C%bb!Gf0@4}>q#>qa+Jm9Rt0vF`F0dRl++IV7}*Bzeq z-yT!kQCu~FQ_$WLxvG6}+&w$3!wdoF7~qTkrGO`m@)=Wj=y#FVdmixonp<~{Ptk8v zBjiPp%tlPhjFTqyi#4_Xtl9`ktZ9I^ev$(Aa0ur_p`HM9K#aef$g{!1au@qz+KWc; z39srH57JvRBB9CHuXCtgr6=;?&ODt4`OrlVdyJkSbg~|o6mV=-Tl*qF(gJn95OpoPQ5=ih%HWqZR)`-=>oSF+fzeHW4xvv+rVLR+)J;jJyL3 zL9s2XILuZDSRkHWZ&1mX8Ype&rsriW>Tj$gevrZ@zn;LbZA1?U=g z5!_BO7H~W9c#cp3)&QQ?@(gax1-=+w2H$x-`8r3(=UHfYV6leL3ZpP>A^jP2C7Xj(U4}!-&YZ;KfI@)s=u*yhz=iTnqq>8)XPGs75Umd|fv0pL zqol_h@M;6Mn=}79*pO4855)$-5R0j%izm8RT)nl%0)_w2B8C50r1088c>J*t?7h83 zND2LlpJfUf2`=nZ9v3it5R8-p7m|u+#wOf;E zJdV?>y((2LB&$@S)B0BM5Aw%0Y4`5HWvZN~oU7D)y3MKOrdm;@xil-PSVFO)DkbzP zup*rCIIuV0swVKkv{Pb;~D<<8BtOH9ZGW-JjgCRJgy>%3htI% zvaR@FKEK=18s;-@x!mXmzT8t9t8O!-!;XSwVLzP`+8~E`*UHBmZr(>T$)@j z4SU~$y~4|^JhxwTPAE1?`vgzw`0C_A=LRJw2j<7RIu^`XEp1WZ9mM=bsyy?q zCMq?OS>fO*GTGLw>M=I;?y(R4k?pVwxFg7RRqhhnPRd>2I@>)JKnSuOQvry8cS$Q) zM?ReQJO5E1HN7b?1KGMc%ba#pnWsf%-t|KLAy*9SuAGI1_rIesY!_|Mg*B=Z?ir^3xQGWM^ZJ94x+mr>p$9%r@#LYiPXI zwCnq6!xCuQ*rs7oeS%>Z!>D1GZ4w4`A0xkM>3Xc2A9a?i&hUO$w}2|p1IL=iJ35LU zfngXI@B!Z3WF&&vMUr;2Q+}aiyAUh;KDwqUyeI#fZ@&nJUQ)wy z<2hekhnQZEvLkYQG|-BtEqP0<-NJH|bd#NNI8VIi8@8##iEXerVtZ8m#MbHgq_ge3 zYuCNKrdPwoq1Mbv%*GO9T(#Aw)ap~K)zi*nwz?1cPz@F5T&wSTkJ;)jwYqDydh)2P z?h}RgEegMTR0{7>tGiaKCrhYWKOMda}U^V3X?%&RMb(KQ*r6kS4~(dYrA_jGCB-=V%ys8Zq2J}%c-_(YqN`1 zSYr~4nH333PO|QV$%+Zip;@5}V|Ysc67wk5T0i2wP(*V-snNkbhsde*&!_(N*snKg zh~Q)zLsMfi#!r>qC~SM~Meg5QeNt63KoSx6zW;7>xr*Pu`Bqgd-eQ}hh?8>nBy&*O z-KDLqkQfD#U#;r)-c|zO?QFxjb8((t7GD88wTuh1NM=?J6?I9_Bl81EOww}E#OyF8_?QgFmf2UcXwYL1E1Dej=Z*RPCNdjr<}swFf6wuyYJr)O z^N!M6VmRriB@zT?i82)cWwJ&A0cD1CNz9?19k7K5GYO_O4JePF01CV~@>D)q$qI-M z!{~>c8`h7!<3m)bsOB(CFyz@ROm5UYxPCpJdg>SjRwdtsk==(Ym|Y?RFYYB}25^K+ z3{h97bgm9QMOO;LEI$kVAbALfp{|IIbzQzWS(;ic%eKaXnf!2giI|pr!a+|O@Uh>I zMq2pR+G^}Lu*_OLV22#a1ifPyR7DI29ZTb!cZ~V+&FfdM=^XPW1fd6G7R6CZ=7g3k zX*F-V7ZsyCU&AZ~Kc}O1m50e2H>{P38&gQLo#{=1<+8PsNdHIR0>QD3WWo z2bk8_O8jAsAvT)1;y_2=2P2@c8bj@}dsCg!W**7B@oST|o|!;vgHB1++~u*)#x>HO0R9ME-H1JYg>|#W5ZC zF=X0MP`^$7tv8CVxcPd!_;MN^>kM5aSCswc-Ei*CO&oFNu7}xjAb>5c(xOxrVZMt|y*UwTJLkb&UJ1dXY}TzPc`Z;4A> z=`=%k+69hwHTs|3w(~0Ysl=x8k;uG3n^haLFaD^E(C}Gftc-Mzbp5V3ZBryil@$-9 z<0>ABV~yV8!^e>vrhb&*AllI!@L{9K_*zd9MfG6EI!Lpy0t9*|ufp+2w0R$0U2%&* z-A37nkEOv4FR$t7hCgnZANh2JqEo=fmveMA9lfHU92`TMh=?aa{rIZy(=h>N0vPa^ z$}mxCDFPlGN-7qp(>%U%A}lKBtBW&hLGUaY4gWSA8eO~F?OgQwXCLAJM}2(Ntuxk3 z+k&zpIE+{0#aY@2K4=bu$E~vnkI(yIL<6@HAJSiQ)4k3tvLgRfXCwHSO3?JOj(ozr z!RtQ`@nTNUb|cfvbxq(20rHT36gHxSobdHrbtCiU?eubChjF_R7<_wgj8|q)ol;*N zJ(tWPx0SI{sxLb2zoR@k>mPRBeth??b5UQy@!i=ISNNf{vAprOyC+uoprzqE8u|J# zVAUFt3+zf}hpUlC>P6PbSMT-)aIdp^R4D$BPgf)QvxXl*hS`lgf()}8f%&4hGgr@B zsu9(j)e1{jPe{*u&K`5a@sZbi-|-~Ndc?+E?|tW@#oX~&78a$r`e#6vP4eSHF?FO%x32272_KzN1NG=g9{^VP7MPl z1O~3UQV0@Ut2|$C14Bi? zxA#AwNnLJlNM$lJg5b{W428Bk82~2l1ELCAi zRnJ}9;+$EV;4&-Xtm112rIEAENn3C>I}NVG1n_W7oMV{fVyIn{7S>#4`3t=i8@DdS zEJfqp%z&M&t;l5F3o%$54ggt80k6hGGUm{0ONi->pNdqK!vGDwq&2XTKNN zT@nE8!t}l|51#qb$r-tNxf*Vk$Q82Kap7il5S1|aXAbS$;R-HY>;j5z+ZbRR7CsjV}GcXEY5>IK*2TUWOxJK=#VR6U4C=vpsX(%f=vzZy!i1NGC|d639O)6s|7`wehT@GcT>au(vt=K9 zfy1A-sIEHt^Xx(@C^z&)U%k+?>x2I}C|5|VoDMkF_6FHj?HaK*I+NTp7Jb*a6 zX!p)8MBpp7h=a0A+!y?+uaVU0M|ilA$F!&L^!pn!Y{bOqD-JPjG(thTsHHGswQXgW zQuclHHg%^?+`pnr*I&&kL0$>c&^0sHr>%Tug-k!!)potztB?ClA_XngMDni-G$PFU zAJ&Qr5>_}(G&damIJ?Pat%cPzkG_TKp>rQcOl;C|N?BQDX|X^BcJ`}UK{(yX1ik3~ zTvA%P2v&uzxe8XTVz~^G!pnHMQV+rkfeLZS8OprFM*(z|h+}Kg+UTlSPiEQB!b}%Gu--8#O$Q zrg(Rb(@vS^@PVAKGrB&=g+UhP_* zg2Vb`;n|@`Cn`rt2l?ESSr-T);L{{%Pp^|Y63m}o56rty`ujP4_#zUI-iGPTA)mD< z2Wu2S`VmzA=tu!4i{GLKGVgD>HI>zk6B}!9EKAAn_V!nPDLMoy0_iyRaX^=+G<7~u z7YQ<;A~_YozM=)Z_9X<(|6U2j@KQO&&^Y*$$>{z7_k_{#1XS1g!_m-((H{;ur(6C| z1YVgCC=!9-II21r1^zUb5KcONu$_|uGZxD_@qz`cybkth!747)sV=q8i)aUyoVq~{ zfZ0w2lODxWo@>e3EIqrDDq7;Gfu-K_gjL#BZXWwL`DzCs*>fj+@J5y*F*GByd)zN& zGg;yxl1W|!e&+vZn$Tx^qSH8XZ!-)#dhUmSYnIwV2SMJja=*}YANR!K{y&UzUhuN2 zlAw0WF9l3h2`~PFTWljRGGx-cn)=C&y9ci&Zr%V3=`l-sas0uL?vDsbF_@y(_p)_B z+rNybX^XPZ3I53-hyV(XcDLR%2|^Nxlyjme8seG932bEc-v1IXCU0lyVK|KN@cGqC z6NnxNVm_dDGz36|&70SY0HWp*M&}MT=A--5*%*6@a(U||kVXS!$D6RhF*bQvJj&m` zSs2_wK`#N^w_7ibZmIwqCX}z%0_dDJPYP3Pdzwmu)o=++#Of&GalkYaETxs*ahKqZ zSmi{pjwC?yn#8Cp$kV?X`PT_852*1ud%*|QnQ-%HN)gs^|XgZ+( z#Z%$rx1+ZbCViT56~JH2BAtRNiUZ)SwW2KS=@<=mPQ2|!6 z0W16<>uFv7k6AFir^^fOUFJkDyZzilS>DHOOp*^(WBThOnCH)F%Pr-MQCjsye*n8a z*C3mg($P4+2qqxyf~i1O1hyh9gnr2L%0+_hCAX=6G8Q<1%a1h1yc58 z%$*!k2>bRX9*Ol5$pD-Iyk$2*+Z@30L+~GPsI3 zx}2fhd3Cf2OH!vNC-Fv)8uoF z7mtJk8Q48M6c-#VHvv#c1^`p&+sidGimy$lYW?uQ)l=2#m~V!bZ&m;>FRABA#=M~T z98MiNZ(mpC3+>msfRHpy}g0QjEZ{pNJ1VV7s z*1HC?i;hB34$ZD_vhGOj;tR&H4Wi7Z08@$2(wHJz;-QHc=Wwc--zE-Whdgu1VbW0K z6;na>TWhhr^Q=O1cZ({S+k3}}pio(+2cQr^5AY-#SSHito@=LrImM{h-Q2K}l#n#j zNIp5?>rNyBXhw0p~84fu0vTZhE8OHd7Ddc{jYJIO%7< zIgQgr4>Sw1JMWois7@L)oD4=**r39$Lak|%SL;5VITzh4d=p+d46=oTf=q$*L;K`o zr)%em{&;%O?|eA#{p|hn$qM`Qwcg+p_Og0)sds!MXUke%J8s zb_&xsEeUaT)F3C0mB1@$1fRRd8Plv0)9)hlw|l$pjE7T}aIa`o3fSU@v*SZ3+||R* z+e1hNV5(qgMsh_RFO3{;+|q;oJpx_6g$CQTs_p-(DMq?0NgpJ2zkTtp+wVVozE%&elJGh~voR*7WlI^iCQE?5^&>w}r@zKq2HXh%5U;HUuqH1A?9cdch z9d~=^i3qX@-FfQQqxjMvVfK})@UH1yHM4zDwcrCxSOZK(=99Cx?Gxm7LF2A6oo%0< zo&Nmc?4$VxsCChAG%@27Uw3-XH?l_LW0?!c;HIl!k^JMdO`!0tD{MqQK>mLJ==h}5 z@8e(SS&V?*u(xP<&nq^fagQTD$nl5slg@|EDJ+i1KY`xRsSoiY86BsZ z#I*~vpFks1ZhyC!X9Z8zS8;M~I4F?c*D4$NQ`Sp-*a~pv>W~(Z=CK!LeAH%qr1P3` z&F4-6bJZ7*w3QP)FzR0((})$HFYBux5TlVtj}nAW@ronA&>nD^SueG*M}5Smq>QD2 z8@9J$tTf}CahMD^BOygYNLpdkx(R$JnK-230p<|xz`}RvAk*S2afY^-5RWvwbGp?0 z5nf$S7Na3*)(0n`TO%t+=KgTCvj9`hqakx%Q?{}c35#eb za!u$5E!fAzBCb?wJN0E+uh8$(88Amxr0umynBuNckPxLFd$1~{$p1=E7@N{RnIko zk64&t5LT)J{iy*rAN4Vg-h?Rtx(ks@{0SV4p=Hy>yXNf4F4^m+NUU9M2!TT*`^(YpUvMH6I-EW1#A=+SX-I*vmS_Z@ z!b9BR16Q0{MAv;Y_HS_`WzQ1Fpv`3)0j7|v9N}MYlppFY)(DJ79VvmQv|F2-o8AjK zIIC*pIqFeM2{lK+@Z3aEQ>3nsDRlrkvQ?$kKRK57pK_@Ar)XjYvTI3kRnW-4Om<~r zizL>vzWRUS!2c=g-oHpCT0rT`^u6JN8z*yXT2ZUiBO8RkE61>xN6+{oA-#}vp0iKw zeK_yCZps{}AD?!6?bF^d{f+n|uIRR1afg|^0x!OsMLICt!;c?6{H)){)(5afXa&>h zx8Ju0lL_kLgPSDuTRh(6i>jPOf?+GZ{I6h;CJoe6GqPDryes450yMTdnJ2zAvgT&f zb?3U-s5~q`oc+B+;FsFy&t+NXxL0ATrl-kty~B-#H-0u&?ep`KpO^3Tqjp>0Yp$TH zhOk&*!d33-JfXyGYGMgrB&&}zlDtA>dBwJfFO?577#_gWzXE^lhHLu)!9)U zLQ2;mt5e;NZ|TZ~{l;G@!)g8jrw^kSSSA)8DN|@TnYX@y+YaigYV(&Oep_dKf%G5BX6 zDLqaDStEbS$%3^q7N~5rDzD6@#G$ekEciA><3pHrAwvkX$EqqfFZ%FP;_j zuJV4pqAhi9?@oL2d6v~lpy?3Bi(S3pJvU5$T|Ft>f(dG)4aB0fMsKK9JpZ@R8t7KQ zR=;Ylq4R7c&Mx}h&WGcJvlIA*j>ch>IxS5yXV_GQy0bNIWt60{h4gzD?bGfF?pk>^ zX4Ow=6Oc&P`qJJAg8@YoX*pm3t7otlTm&9E_*y6D@jw9!ltmOYds!t1AvaQ)TDFib z9mx8;F{?o13Y@YK&5cGDcyuB-*k1bEmazIo=ltvf{;+&@r^?}XDGDvlg%Xp8@}Tr1 z-jzMrxB5mAWy?EOP2}su#(+CPR7&g<{O9!lF=DfuZ)wlw6MHc7ai5EUBQfC8l^g)f ziGjp#2_I|xn@f@2lf~3{mS7emKoLXar!mJ@NN)lRi4%D*v(U6CsnNz3L$IA+c;9^c z?RT~t(CN|HiaZqE1BwmI6C(%hbF^0M&$)`X8?m4Hjhyw~cP^?mRn&-aif9dKOQ8nX3}F&|)4b+lh37Bp^Dk?k@_B8o;xwHy`Ue0?V zRX3L>^VXl@k$l#O0J5$!hwO>2ta6(z8Uc+^_cVQQ16dCRt)C&qz$Q{-h{ukDV0R zv1o{N!^+9zrAVyZ=OttbEi&g+RpBZMvmA_Ke;5o~$xV2bw&DrqG7Tb9fE|}ovJtg4 zIPLt@L%P?Q@BGLg-TxL$VVf|TCHVjK)8O`yqQ9SD_K`*L)+nF07$Yuc-mY0G$`E-ce*PSR!C5(tzxl5Y%z14>UAQmlC7kNtXSBl0l?+lqR!fJ|Fd-=C+>=V#H!!b$Z1XYbwn+qRL0 z(f!+>0#^65a@QB#?Kn>Qa~&n|yN;c;KdE#`3XG^?A;6gzGJHh& z)f-kW!-f)PnTdr(3uXYj?Ed5G^fGKfiUr4uW&p$v04>gXN-+J>DxFq`D-~BGfI8?v zg&4Q_Ok*qUvoPFY(xi|zF-G7D9AE^6k`x`#n@-pWhI&of*yD-4AQbs5&5NTLh6Q2i zP5!)i`ZIiyV=iWAv5{XWx`CxybQUZW;}8eP!db0iZx~hQxe`=1l1lwP19)S#erEy{#S|cV!>HQtSg7$Gr{VRX=}V=a zD?pSADt27~XrQRdm@@z|LUl3$a_9ld&?Ck3kVK_{mlqn*3!Uip9Rp6t>th2#J=9Gpc<))*Y3j&dyH9?MeL>dxym)pC69~mkd+7dmD(Mw}M zOCROx2|lXeZT&{Kb#oXDAHYiSf4+ygn0jIrpG9R>a)lb13}_nhf#%G1=`nsxlvBeL zX=F~v6Y?cQdI}+h7p(rcgRfZf^Bs20Qq46*sVAWfNzBu|45z>aT&Gk$MGWpXc%;Gi z8~pEp#)r*o>0R$Oi{5Sgv8q(!oj#uXZnNfWDm|GKV_Ry@c78#5TPf#NYyXIX{tUF_7|-+8?~2i7MYj=8z;H`6yo;i#SlKXvC1OI3n@D zl2A!FUgM%qT$AG4n_yYBQ#LiYfx@bXZEB!H#q-Qkaa0_$M2a01%ex^}ZE~Nw&kM7_ z)|nTz&;%?UxzI+N7ro%V7eY_}QufIDYg7MHc!1}HXZ)6)57Ed*J0Db&#DRRsM)ryz zu9zgL^a&vCmm#m>X_Ep{}T$FgNtVqG1+-v0isc9^9d`cqs5{ z-VbYp{PO;|Pu^afox$`ar#*?9By%-s3;V=f4sW zZ|d~?-DbRz$7`hj9w46_pOc@vqO#mNk zWZvXTx_iWtEtJJQZ*=W&{Lnyxv$71ElDRY*!CrKZ1vK~Ly<=XxJi+b#Mi!JR-p}$} za(bEt29BNMc=(No6u&%o_fcvKG_!a9l-&iQ$}f-tJf65rh@uIhOUq6Wx(Qf9LTHMb zQYz@oq`@Wha`FAkoe=m-p?RCw$KnZrzbqgjaFBXWk_tE}P@_t^)vSn`i03G4_4?^j zSUAAqXSRvVi#mSgg_hcg%(XJcn&w@}mvKxcM6Rr3t51P&0xRX|83h$e3Y9fk)pFo? z#q&f4=d4?jC`DYAQlh&v=<|wbK1=lOg~f7y0*NIY(mHDqNHL<-;$3G)bDkwQaeRnY z#@DNSF2QL3^IaLxpnbiBLps)z z-@g9?6i1#lB@k-#Yc=&&e7=f-8}Rw6hVQxuYHx-NS&2x`1R>`7dL|6z8|eW^_&%){ z#p|bBdJjC5n%X^c?lo`7p>Fbja}tF zmk2O?&$bLQZ5w=YyK7QQ>(}BKTQcrE<>`nYpn$SOJb5Vh-$T z6A^ct_*Zrd{c9%gn0H%oH*@CKTJoJ7xlMd6fe&0Xi!>9&;cH&j{A5_9Ug23F9??4u zS;HUSR(NitXnKojEcWt4dCld$4zU<^vDlWgZ!;{4l_dGqKOI|H0*sVzA3PDeDKcS7 zVm^y)TEUyQOva?>mYd`Ps&Ia#5|Ekt-gG~F?Eji}xTH`zHl}h)`J|A^SqSBN>;x~lPgvq(A<>a#$|7n(MW_~DSNnP}&zkQCN6i?-o#sF^tBsE`zLH4CS3 zsM1WFa#TnPhnj^`IE-i}PB|(hg(}UYQ{J)5Q6VXeXeOQV;*_I8Qi#vYg%=YTGZU|T zby7lbW>G9LM5P*v1vd|sy0aTeb9N|arL^E4SyWFAV4;X;{@P06GZaxziVUHOe1ZCk zu_@e!6zseC_S3kC2icoy&RVJQ6*AeOVhjKU$`=EXGZul$DptDQuC$_O zfK=?#z2ZVqyRfagT4sS({5rWZPsnlASe-x240Pse(b;@srbRg$jJ!901&2{q`V-2j zY5hsH{cEGfje@9>U1;$0Ri6*-*_oFIDoiZjy`7SQQY4nh38s#+np8P%c8F%{-ZAnf zsc=`l%9W$%$BV!)JX%xopqVb-U&3T&1|D1EJuuyGGvnBLC1Uyop=4DFK3Bgk})_-{6b~*)Q_A#NozWF4y7ABidE&ro}t~@Ky?36 ztloLS_TKf2)jKO#uP9y43f7~OY=){Tb4hV0iD#DTN~jX@$?9mXz840Nt)k}c#w>7@ z)YjY`OHv>6cWov}ib`#v?xm`d#rior$h<1Ade39k(Hz|@UO!bKPGC31RO9@kHY+f7 zb-4g<$x=~^@R?Fz=2oVQEznHGwcsi(2W}x%yC|npQ)CNstrEe{qKN0_W+gF$vY_Qq z(`OO0;zNhSyT3yL^7i7A{Cs@!cc9ao9yz)A@bS2R`t#}8Y5!NUgJ1CjMx^Rr(CAl} zr|;hPc?_&bk7&YWen1+yQ5F~tRM6roij&f~isD;*O-WgZ)Rfi2M07!0NJJO4#$C+GP=QtXQ}9(rJ$QsQ_{#1 z(M_t$4`WlPn>rcZrA&sTnvx=zOx?7}aF&AZSt`0`Dd;BEl=RPJ>c-eFe0-S(8jmlx zk0hfUtQ~)sue4bY0Ik=G*)215?@S-hc?!Q#b}8i(4^ zIr8rGpWSmQe3^#~53B>g$UEb+ZYC27?fr59v^Wstm%B6&80Jg{69I8-j_B>GWDtE7 zEc%&P^wY4QfB_XBM8ZON^@{Y~UtIPRVu_}BXV7W`T5NEB3=*P0Wd4dsS}DP9g=c;G znnliIC(YZT)ctRngTr> zi%W@zE8`vt&y@n)FBuCv5T7fupkn46i^(<8hnB6mmhFTZk9>})9f-UYtu23!tBrBB zVrt0|mz6_h`P;Qxg=h=efu^F3^-1ZNv_8@KbE< z*h@F!Wm=86u?~JptsOVsp>GQH6UIELkP5`4aZfI$3N>}?70Rc!6FdIlkI4)??V?T0 z_YCHq2`#QvCW}lly(bq_*c7r(x-v_vG56fj8)9pyZY0G*BBWK!++Z>XD85_@Q%jjf zaRstArfhi1^HTN1Ii;M+hL$xovx_TkOPP~Xt%~v{s5U)w)y&=;vj-~23{|*j8DAuO zQ&oYfJX6)(8B$BCZN^#iRi%RRcA7b7RV(G#z}4n$&blfayUM^R%wFHf6K}x}zK)cR zwMxc)jMmJs-ldd_H&W#?yepOVV9WOP7@NDl`Mr-6^I!SqgP@%}-hA#W;n9-)c$hII zgRespUihlAc$vaC!&SVusWUcQOM0IoL&RAG&Qn#!a24-u`g%&xS(56-UXd0rQ?LtH z@!qCl7p^6}PsT2Mky*SU+>=d7nNTwCT*nm% z?ve_QSCWZUVx}QeYZjXgxKzbdPG`6wx2l->S*%xfu1dl^i7^KJs}gZft(_RLBJ?o> z_egLF`AZh=v6a)Ab;#i=1@}}4@qsSnFIl+9R!(Q-A@8dc+*2XM2gH!SWYRr(&ZO2( zjFb`jm__$Q+>;n`z$Yu2?kc#))=%0HVvvsudlCAW)rBMwnY%>P%_*fXS#UBUa>N!< z>RBQ<#XTg+nJcTWvAapCOF&-Vu3-64Ln*$-aZW1n9xdJ-Ux4G@84gB8zSC`;UOye{ znoX1D{V<%`wvLxlF>o@?fAs@PQU@QsZ&KvtscE=mhiEM4o@?E2#Glw#w_d7TK=$6B z9iP90+8;k&g4#=`3;Lvdy!hx9`Oy34NqUKQCkX|-65dx30zO=vi$XnCDvIve>Ccxq zA5PCt&aU2c-)#J4{qTne+umvHwsv3a>0h+T{aAPQN^PSC&;EX!{tHj|U;1~w)o3@H z`;Gl}9p2a5wMOGF?NYHwc&3<~4w|$r%S|hn^*!9V6?qcIUmK4HH#+sHnSC-882|m& zer-Me3wTt<|Kx-ANk20j*V%Qyq!Jy*%|5n>ljlMlitPE_kPS5)n&xTr9eu}A67wJ0*wt+l1gg*afcfitby++TkhH=dSjuDL#u!pTOloX;J=Ov_`lG>baHPwhS!TNneM<|XtBTk85xJK^uy3HnbwxK)03L>A%U;jM$aQt_A5Y|0@ zgF}>6wKDn6bj6+d)WgG={)u`Xigt5dZ+&y^iJQMgKn2l=9km+ zH+a<7>%OO5vnB@9bD%R0YCniP{)Q>b`-yX(IG>Dr%;|k&TNC=-nNB8}{Rq9Msu!gW zyk--XJQ(9K8AA7gJ}@8-v2I{h(pe5Pn84Zxf;ecX{D3U(uSb2*4ZE1D{j7T^Q{*+- z*)gph-u#Z&D!$|>dlThew|8*-dE#-<@pNr?SG|c{N?QRwhLZ~asG`P+<-fvzBuu}O z9p~oNkN9D019T_>TbiUm1V_KuY+xkgN8%XfP$xiJ=gyjrN9GSMOoq=MeQ+XZHs(mT zfPdZSxSG9>FrlVQiS<`HG(*z?jc6`sfQuUJ2g7{#i{BKTb1+skQxMDEJc0i_>^yW@ zJ6{eu1Ni4)x4v83v2{?79eoG6(3c%YzuU3h!RHRV|6GHXU`{%g7paLhWsOJVUnkZ` zC)ZPBJfe-DrcM7#a}~kgKoelV)=(S6^teZ^%%>C6&6#y!L=2No6$%Kp6=3UMwl<8L z>iI>Ve1Prm7rO1?FLwATxyPZ-y`>=6L; zDZRo~hX8H|KE6UJ75UP?K`X<}0c0S1XgIpO?OHU*ULsMarkjc;ZA+%>k4ardDO-}3 zV_=QlVQyGVxQ>J6JikHT@j+BK#+p%oWICrieU(rm}uqd?8mN5d!<%Wt>u2>f% z{T{b!5Qr=$dvHPACaAdWlAaEX%60FZ!@a#*5E7@?yHH|}BklcbIL=ge_8JHK>HTTs z;VT5Ys=tDnV}1_xD6#M4Z+wPvxi}r2X3~0hhObbb|8d(H;=~>5ubg3n4Wv+-=|BP{ zp>2&g_xcd^Z=q7dY<7nA^u}9Bjl=l<`1|kMbOFI1hZG(71E1~f9}j86&QQAtUBjK; z+$1zZ3C3nnY%|vNE6P@YypGTLXdh!$`$X2l8fv69L}y{}Dcn#qtsxs%aHJuaM3iV> zhT|y+>N+gNN7$WV)+5jHgxAci=s#0KcO%XIC$%r+J60{BPoRew6Hp71`ZUP`E&$MQ zvRn&HZ)?B}3Q28+>z}gTou0qj%76qSuBi_+*P0kZCkfi% z?D!ln`d@rFJ?SMu^vq^SEIPiLGn>$*v7eF9p< zD0drxb)*d%IcJQ@4oof(NAm+cc!59}u7dBOEs!otZEXA(Dgei%)>*&dIqfxJZv4r# z9?YEw%{F1^cUb8{fJ|KBfAGKP0zY+HTXw^E6wg1Ngp6?8kY0{ODyF+DT zWAaG%aMV?+l_3zyn((-Ul`ZlobC`G>4Da;er)nKTw$-;@(zk(61N}eM`gY_SH?LGH z*P88t3xB(@Ec{0Hex%xs^q(L1$k*5^*V=zos>pS19n^YTueQl+(&T8el6!kR@`~sl zIf8$?mzNip^iWvG^F9q^D>Px*E~ic)=Zt@vObN?9NH)GM3Aa&N|H(E0r8Y9we*+jm zc>TBQ_4WE+#1jtT$i;DykLt49zq&jh(2!FYb&)fRqmb2j_wKdtolPYNNtPd+oOO@S z2X8MgKKP#6)NA|fjKz|Z02`L$g1$3(T?`xsne$xf*|mVP(~m)?e|$q~+)X@mA%F(t z+9IH+93Bo)<2X7Z6@1x!LoUuSY$d!HfF=n#(tziZ!Xj1rq3Xl`iBv>#uQwF}6-7QT zU`|+Ji&miR03PFw4VK7?7~F~9x2A!dG9a&5wkzOA=NHg;UvMWpJpiurC}%9E-;5g> zoBx-yu^O_m+7|Lhsk<*Zw~MXAFHzLUX6~BZe^hJRc`LD7D%g(#^*FLL*H&D0m87om zNp@(%Fg6AZMdKx@;u*}A@iGM=9ysZ@S2V}`oozi3gXaIr*DpV8QWVlQqLdGuh&}|s z{!BtftPF(0=T+_H##g)x^3?2V{gnL7u>S|_{Aq1u$^VU3J-q*S_V?@S{eJ;Z!v3$4 zm@=X2DSCW==$>;X`r#P&_sITR_xJotihNmFbDa4;>gzw~%$}!>totAP?PhrWH``c# zUY(Yo_4+SM{`VKOxFu03Nhts^nPpdfExjC0H1}>6HNm^lTdkPPgdQ?(Q1>Q~_u4PL zpV#as{mn#bDvu3}8!EDHGl|}wnyxX?2fA%rcD3?wXWcuS6%e&R`ffG0B?dehGP6WwEA(G2f4E2&tdKqDhdchC=?!ubh-dz0wIGF{Cu9cjYHP^Ki{ za$hn#6EhsC)PcoiS>tlRRwBcf6IM~Gq)i*41;(tCI6Nc8r4^&PP^o_wvv-Ih8EaQ= zL}jIe~Vro6-n3o?~nT!itkr)eA0*iKe?d!_0BNe9-c_k16^1S=ougc*xlXT z#o#Z`eH1guSpTe#iFM<7Lys)H7)8DGXsiu!-^`o+G(vxkPa7%teqDZ*wKyW7?!(L^ zG)L0wBuuPurG)K@G0)V}{+^gnIKmU-P?ERb)XFh5h}2Eti5q??5K-#*@}=xRba=>o z+{xq-{s3_&^uAhouaCzTd9dv9Xq((w5A=xW(V9X@`2G|51-@?+(-=|@?}@Iv_;s7S zv#ineqaLI_;6NLS-3Vw)6?s}zIaaUYit`5IDs0A9xQ(g6jkdMOD`_SNw+YJBqH86( zN~qrnTSCm)-*AK5hS#brPS;iCJ!KJ0nx+bZUQ+3}m5Jpm=+HB?ZcTKxsU+1*Xe?Mc zDw1YSY)`9r%9-sUp*pqM=;xW+at*b~EgwnLqVJ^HMn8#IzZL3~tB+{sf)k%_%L!8- zUEbL=4=#coQuk)P(4hoAUZY$i!z~fCvLFg2V9*F-5L#=C!lN0%BWryx3bR%MW(quI zQ7E=mP>khci^8yzgrTy8vM5aV)i6z#zZQk)K^me8Le>+^f)~mt$BK4OfN{MRK{;*X zT_|di%_FqgFAS0B9unMJ7luf56A5qV%IL`WL@vXkAta#aamoh;)Zn||7zMPz^R7H> zUQl1@ofN27dMo1ZMk)v2Ns)5HmCyR<%MnC7_)ZE{TMME6t{d%h@SPMZHr(g4n966d zmCvG;+4Krl4!#Rc#As#V|B@*Eg^3sb_SN(4q4#zjYofDz(ax#)*1H9gdF0>=u-=h? zj}L22L#a0SA%{IYpMg7Wk7I5(R3V{G`$V$zsjD<8P!x0^6#b(PIdl0544dABeH|B+LO}bz}ElF6k8!?(apa=*~ksN521_1Y+85 zz1;d~!!XD4G2Z#b={Y*7u{no+@l`stw%L^0l6}dl6T=xs9P9ZFFKjk2?XarH7Z2Z5 z0{%uZvr(bE7#xM7fiY7puYl0kjf?=bbh3WD>bW;;$h*K@ z0B0p+=!CQoQ3bRzXj)ICX?A?&*z}>Rz&l>*ACKwi6Ni%(1AzEw)EA2o7!SzmKpe9gO^TZMk>!IFQ}fViCzvSZ7y> zF}jcEoc%-|C%zlH=R zp)sI@HJRY;Wy9B9X?6+kG)V{7H z|1!j=0uIA1PX9r)oPdVx>Q#OTKQJOE7+v)6@C;+9y|eX4dP(AwasN?s@7~(hqB?*cTWS9J4s<|d9Nc4a|}6Tzdl}3POeoUT#V$mb<_yK0v2;pa7uioEoIPKkfj1- z=K;t@x<;o8jpO4_0ebtNt))%TLd+8I?gUYeZQQH0E(vEEs5Sr!e{<#|Nl2QD`;ODUGH z-H%W}#m2WO3gmAbt>6COERy1fVXskc<(R;)Aqeyip7T{`prT9>v%=gGLDr>zNNsI# zsQy~@LeT*0lzC;~zz<%Ek5z^;C7}<+(SZakjv6biIe{CWIPNjcaI9CvDq^ma`F zVPsK)(ipZ}uc04y9gLOth5>$S+1xg8F?BC)`T*kuqeWGNxB+;+7qNM!5y!YSslVunmFwM9z|4w33~#ydEV-7kdbrK1`WXL&w1ZvEYK(X_MUH<9JJI8x=YX< z#uG+pS2#ftvsgN^tG9sAXI&x!+ci0Q0E@GB&*H)bkC#hx_jVZ`75y(1J2-b68Twxf zl)gy*2T%&v`riVcECnn3zGO)n7n5#f<%)^0(hF}ZeI0){p!ijQRO3mt)oFCLkY52~ z0v=1{b?aUST?}@{2iO)cY?LuHT#yWf4y<7)@UadOU%=YMdWr6do^4B;Via_`;9xTz zuoCpbFWu#-EF%kjr{`}ksudO*bK?8YaF&X@l6Au)B%#28;rxLSdS#e?M4`$d8)80* zy8>T@%?%nH!S*qz19tV7!FLUMFP7J`&PLRy7cX zB0L~oZ)CZRUcjcB07siE(`fO4&P^veJ2P}GrYr?90G;pwrwXrIiAeUmM{d0u#%7xY z(23M&B-QW?sQ9?`-G5sKJ$Ue5H3F~veoA62ml;`yt1fDed^Ixh7I$iKFw3{{EqVCZ zj*ZqHv1(H35)z})zHqPIY5@mwj{sh=!M$sf;ICK2oQ}uvSBPj#*%uG}B@u}(&k5?I z1E%o8%KZM1s@yUqoc$PjgOBjls)v_aY=MTfR=fl31T9;BJZmtE&*dLZ%Z0wely--A zEN5aAQ)qXBlD{+cG9KV8HZ5XnLy>PGpxCgKCElpGb_8aoVS@fG&qxUy6mdgMSk%)S z7d<`3N6}Cs3rK}@mUrVkAjoZ-2;J{VLF4t#i9_n zvQ8i9eT-VqYe|F%)(|Y`YkKZXN%DAV;prJXYVv<113|7fGVcG@8?8wEuV!<7|92tJ zQys9xoUb@BugVba6*BA2|DF&uvbnj5*O+=;atx9YnnyogUVQ9ciY$3Oa`Be%RJG&^ zcl1z|575y*d3$k5PA=Yb;XnWEUSg?>^Rr*E=;CiY@%$V#CaY}>KRvQYYnb%}(_snY zQ$_he1fbmB>b4KYJ15j^9{H7}Tmd1VB6P5$3bxf_nnF)l!KBlm@TWg3m2Fbds9kZJ z)V`9VNNrZ++AG3$ClpL*3}nEHnUv*b_>~Ba8!V5Ac*EdqZDnvSglx-TlPO813FY1@k;CtX}Q3y2=C)>wLef6{lWSn@SRrEV9*Tr zu}V#_jaH<9WBgZVAN{u2yTDPLkXI>8mL$w?pS!@&a8ob>A~ghv!<9@RQqRRvVgekQ zs=(Ur8R2U6MzhuK>>s>{`zz3XRn!Vm#e2)U(Ye`FqC$Er+ zYW=Jraq3s;HS_gR!Z`)if-M57XJTek<;-GR4->(Nx$PilV0mbEa8Ymh$1B!&^iOT<$-s2U zb0>fcX4U@jb@f(vgYRG(?z}dw0nU|yVN!P^s=G+y_sp=!D<-MNh$69$PZb_Vsv_2F zX=pGay$sSDG-y?7i;Cz(F#JRhJ;WfB>*+17Ea8kGoKVJiKca??X#8x*nGT1#WPi-N4-j9m? zm-)t74$aY2zyl=1|D&-VWB;wS+iUyp0-kjH?-2N@Lp}h{yujmjw%YHf*JERN=&gM5 znYt?&r{)$pBu16~@uzgSfO-m zGp4>75bA|TCkrU)W5K!jy={DkjmjS)Ix?^&`p)d$nBM9p>K#=o$6pJM&Kvj>WYeFZ z1sKs9o=yg@ZXpapfgprXSRMhFU1)n5^Mzm060uVRLfW6KEx&@scJmGH)Crv#h_hht z*6feuK77D0l?#rU5L8St2$gK)h-j#*m@C?7-rO0_g z!^<3(H4i$>bqj-(vaGZ63_gY34xI_OBeXvus1uYN#Z>hA?oVDSd9+R>E zclPTs{-2%NdjDU*lWa)qy}!7`?K_Wj4zww!4WOJLAf!ZZbDSwV^WDY z@e`L5*da7ATt^?@z~UKdQ_KVDieSXf^!}cvVZ!@T_w&Z;UUvLR0F#J^dH@V#>8eUh_nJ zxg%bLv(;Rw9{uC*5;Q_bpetH9qUHT+F*Le)`XDkc-{LSMZnT`(Opl9K}}> z6^_r}L@K#it@LABiLE5JLMughjsBmM&ah}&(S;CGDYy`VmBh$Ks)a{3SdH<*l%>N1 zcEv2zWKlsx^opH%NqdtY@+*Sht($@0yM7eEm`XwXf|Ue*k!oT5g4HN~<1GBnV(^Qp z6vXc=7QaZfFn(uI{BEIp0(HN#j&YWj$VwzMdsN#aIK?HF{EH^fN&SfqJ8ILf#&hFZRZfDHW~zD4pswcxL{{=a}HL8pInarN^V`dMF|p1(VN z`)gEx9^5>P%1iqyLhBUw^7fsIkMHkAoIPf=d}~=~Ru%p?)c!3W&w9QmQ1C~|LRx{} zm1x8=Q9J;{)|qFLXEOvW4iB;A8_SZ7+26x&bgK|fe}QO*UHW-D?j!wD{^fO*^{<=L zN$#X?(vz|N+s*w*{>OT=xz7K%h$r1H27AoAlM`}8+T_~SwNLyWpld&J-#_koP3RQC z7iin2Ud6N^^Y@2!!cBM1E}GiNCch~Y=X@IW~aKP!gJkSRS8t8i9ku_~Z#I!!*V758DKDus-iB9*!@Cxbj74mwc z&w_elZr5rTPuR9L0<&HA$L+tyI0Wq6HObF8KF?g=&Ic z1;2X}%KITo^2sEN4g=<_%OW5d&HxcQlI8;Rm!2MO`!0H-9jX6*`NKnOc`M~RAd~hP z@QVaHj&K*+MmYL+TtRFsCO&zj9JVS2WKAh3h^y4RpuQRoe0X9JiI8}kM5+EVr4FtF z5*diJ8n|3Y%-F=t;6}jRkey!*(0jPLC8l=fU}h7D5wf8;n9Y2HsW?8$IQWAZMZ{;` zk+IAem&ibRqmo!YIE?;O$v3~UCQEdBrJ)r+z0wi8iXwKEf!I|9v8xQkt|EwCWg~VF zMeHC0v4aR=2N{SRL=Zdh5L<@;diTc)97$M@*fMngi{)OkduPY}i%agE7}iVuYZAh8W|&?8WtO+X;R=Ff5_C=5K(%+!zu*?d zYUp|ZZWX@MO27NzBQ#Hgbn*FAuWXY(PoT|l@%!>MuJYhb_bob2`Y;*{1|vRoFHr?` zdj8Lgzjv!r&Bz4@>;b(Z42s}bhf$)26Fgf$#e_`&!@SdNgI+eH?tOIV7@1hyFpRik zTI91~yHjmUM!IlBg{g9<-NTA<#55qc!y#$y?(emB52#Hg%O=v=Ci^IWWBL%e>``pd z7u0-`6`EYXxf%ZLZ=j3$tA?XR_J}HC!dRn#SV!1(vJgXkaOm#fU7wq=^$@|ZO$ST5 zQ6~IbdoUz#nOD_@@8F7|)A;>G|9f={#)|R2fN%C8EnaOkdBj8qAfarthRJYBi3S5<-tIwkWyGLmBCh#|7fAGid{nWV|Tx-KmUJkh6+eYl$R_xn@*td0YQJemUg>e3`P<(NdFv1XSdD0GSAF=K@dqA1 zR_ka{Gy+#K`6&hNcqp1+tP=4(87^Y#qx;( z{BmE%|BFiw%KKB-^627K_a)8Znl4l0}Hd$vrg% z-FN_fZ}RcU6``*f$b@mmR{Sxhq5q*atS5$`AZSegWWg1|{1z5q;vCEPG1JZ*V5NpTVfxGb-_JE~A#CQgh`C*e)-U{4Ps|p}n zQqsih>FvF3nflJPt(n8So#7aM1f!lFzj-sD4ClCCWi4WBFgHH@%F|}S=l<~-OJ2iT zW|?c`DH+Lj;(=vTFcEk%Sa$K=zuUsg;{kY>qF;C*wQVv01>>wc7~o$xLW99p6bA25 z0wgvM;s6C>q(e;%{@^}(sUYyOoUPN#Jv?%b!_pN6;|uzIsml?}!{~V*LkBbB&ZO6b zpEz0GIKr$%r(v3<48z+rsPIIyKjGyh%?pbiN&KChNjQp2qY^Y%&<9B>qFaUSG$5Sj3ay|9Of5X+Lz) zmY!ch#C?@#t3oL@R|>0_tU6A)^dwhF$(;PV*erPNX^+7F{?ApfPma$;s9n-~fAI^b zlmz}EZ@O=fug?0tJ&dP&dHSZ?qtSMI-98PfE5Pya0l_3k+GzCF7~?&Dnot5GA?Z6H zG9gVcfb5SG&At1v!lZNlUbgzv%VHHQR1wK6@YE#Gh7{fiM2*poql3)4O_~^hl>{CZ z!kyl7-?^sZCyk4?tnP- zk7=of4+Z>#A?`%d0+#=Ti+(H}4C_E}ScYR=v)TN0MA!N04QA%LVP6PLa?lB; z_biVIbeV=Q@X0tF8<^mL9)ArOYIKPMZ6!8@>;`{$ z2up6_L0c4e9oJ~w;$SdZO$2+4N`}87xA=oxYYuf|hdzWNuV9G2b^sc_*=K+Pyje!Z zOP~0W6P||PtAsKVO0?|$>l6nDG8mk!2CUByeZ(STeWeD}Ak>XTXXg&b zP+~?aip$|4?alXOeCG&jR`7#;=Sa7gpx7=ApJd}7G{U32jrcvSliRU%t@-Ur=^A|S zgr9&1-d#ubtn0N&VWpm2{J$|D{tsWH{J*xo|G9|gnehL{Ec{|IL~Be?kCLpRqTCj6D=3H7I4rv-4&GJ8u#e#5JCsH)Gg&vs8ATYyG$8 zBmXsFtw-1YI{*73o@cWDTk~E2t(n(#<-opv08#-eRlX?0hZPBSXS$0 z^yPJnANR;O60Q9*`trKXi+T*MMLC>sx%6Js#5LFLwIEyM$;JQM^Wpz3_&dt~*Z$v& zc%BLW@64B*c4p?LoiN7xi?mqmCs{1^OSD+*Cu|sPX~STc1~!b2w+nP$Mqgfcqzz-= zE4u$O`to`|ykT_c&d>>O82j|~{(8gsOHTgZnG^r-MB;y;0eH>-7x1k4e|~P-N#drR z61nL&ykT?%e(Mcm?oTfMzds-T-)_Y4|F!*RA?>3dq|4MO6>ly zFDVqvb!ELj6n%2>|AYDP|4ywHBmb}c{}%DA`TwfO{|9r~Fb+1BXva86BJ6?sjuF3Q z97rm~Y+J^GSM=az^yT$|;+AnhUmraAmXVA9znBmI-*3j*f0}FlzkuhN@c$RuT)5*4 zZPDB@nK{1DlDMPvC6hgd`gc7avRyCHrt;!Ck#5&BDk3jHNO14sHWY72h*p0Y_qHKz zDIOl=S}yFrZG<-!8o)qngf^9H`ue(&XH!w)|JFc6At9BCU2%eGXIXq4Wjh4aV)>u>be(EL%V3$9@+-FygBd-~hX!B1!qWK<` z_0IyY=(a;sIgT+Pt%Vua&p;dZUjq1XQLMm-Zdcr@P!&B0gzG{DdJ zk??Ftc%OWvk9AicWk7Cq8f^-BXx%@S4VmGrIT&(qg0TsOR5dejAjrN?kYX)turPqW z492JH%MBsNet7)XWPHh47D%o4(`$f7PQ@!O;v)65;T-~_;S7MG0i(OoZ4BN_gG*W0 z|Av|C@c0QBIs=7G*p?jaMrYBd{Oj`;(`df;#ASF3JH&v!eksB(faJ;Jm9Ur=&iBxH zSN@Dq{!TPUf1|nDkMP#zF)C>*bm7QCIepiclAe%90b3ErM9ut)o|Ty=xbGEzN0b*zNOJ) z*bX$HF*7(O|G>YINZ*q^XywPfEiZmZur5tjXiv=nGJ4prvx@2FsOk^J<<#uCn(HXF zf}v1&Gtt3han$|V&|C6~d~cX2G$5QfV79KCKJ|m(R1xw!bi$&I3NSf4=0ySwVbc}w zvp_l1>j;H<>|GC70hKo5V0g2Hu7R*wK`q@62F^hl(5kMD zkWKOEH&TQY*U`r}`jVhX|2xPe^;fEHQYBc8y^| zBz#$@6hATz#!!ScKN+y7pBU7A6Bhd}uM%AGOx>0uV&dMQeL{lJP?9vr3j9CF?6x+f zyf;FMX#Ztsxk!PLW;|Kf>$xMtLn=gxAO=mNfdHqD2NkCdP?NFkscGt1L$i(XWB!>Z zqp`cY8#@yx2>w>*Q}F})mBcLqRA)tT$FOLy#cN&4S22MhHg?=Q8)JNVQAA-h#>OXI z^uGKaNj&wFaSwu*G8_ELvN2TZ6&AIWMmDuPnU7o{djQ+e^e`z$HAA$xUx;^+rd4P=Y$YBJiPG5nwR#0?!BTt7QPYRc#Dq4 zjx`+}{zpSf8txAmeF-EdkZXNh&hVdej*F-qk5E|tSJD3pCw}Hny8c&hb)xxSo2|9| zXCcpb#to+00g3%&@Xzk$#$dn_0#$kHk}Ae8-`a}49~lk}Bz;I)omLY{_#!#xdu7}u znh)r;NXm>M{RXbB0bhQZP_Onu5klXV+n{e=zb2xt6v=mD z0UI!l|LQxi!gr{Cu@%6GC%x=n9-sDmubHb*Ol$o6_nta)bW}|%7YIpAO=MBxTlZUA zB44eiJ{y)eJ`q`GecGP~Q(qs;iLdFKpC!i6&qRX?jD&sYgJ(Sd`FqJ&ZaFk;*v}Oq z#|GOwiBG+qr@51u=1xRn?xH}?4-b!H;2u-Bs!=bGrmiuDT_tEL^;`D?6Y~(f*ecK? z6qpy@{v7-EguPA50ZemF;pU3^H0%}Ew)F{iG8$C!pFMK)iqzXQ2am|NES5Pw}SAIt~+$DLKDD| zJPQ6uh5!aowRLK@xQ7|cvgXpSuUUhCBP|)AWMSYiI1v2jr6+U!NIoaPre9xIhvBsJ z(Oh7(2zEH;6aAJ|KLx;NUSB4L$uQ>R4N{kW^ydmKx*3@OEZ;P$13qs&##9^I|;duL_ieZBR!y*N2*(FQI}#~WzyN}RD&zZgt6!Ea*+valVuoX zlZ<~YX0zxH$CW}puh!16MvBnL2ua^4ae<+9gt};?{0ho!?=CLd&mA2+X~Mw z(|;|e&Etuwaew)(!kx@O|EOaAmVqm0bph2mA*l;+@v4Dy7ti2jh?qcy@4Ugb4D&bR z4`Hzgq47s05X(~tR9|_52Gl~3h`<3%7$VqR9<3>;=8tp~Fr5gEdaI3%|9V+#LJ9Fc zfF5seMC`PQG!_Zi{K`ym#HkD9eC_4?rrSL$hBW`|n_lGdGWk8FG@K{gk#tb_6&N6{ zmxi)Z{77X)ZR%RSC4&xSFbO(G0;8$|Vgr`l2a3TIeT8Fu4JsiGHViK|=^JX9dMRTp zA@!r-z6`v_$pG^sP#LF%=tO8ve2w(-52=@)0OaffWvW}d!vXzQ_D|f19W`G-Cx3tK z+ut#hGas%#EJmFH`a5wkk-D5sK6VDM`ll>cB53M|{LK+GClVpSY)FC=#3|k_#0U8I z*8#7P;0MWxQ*sPJ!xMK6!9TyJ0Cu5o;w|f@8pV`^)*y!o;+Vi>*!rgk^7+8uAfBlV zKw7dtYj{|~hvlth@i9&HkA-5MVuOE65;n~v!f!|jCd1N%;Bf$Q5y52cZR;~ya)1Y+ zRcCB5^PVRKY;71O1{n|Y9KS>?0u}iE=T|1+dz0+~&5Y8F4d#1H?Wh-qpRz0GJlRO4J(h9-m1Km)92y|X-jV?^CPV(-%ep<4-a9jk(+u@TD}pf_52cn1f)0AUFfDEr0DSSc7%A( ziaV|yuO&E=k|1oM(js=I*RPYUtB0VQe!Y`&w=&i$qyXHXgZlZ5+0vDEb!wu z(Kgp`SaB#1GkXmG$J0Sb10|LA3em1HXyMX6Mxk_uoZk3Xd_u!|d`3h0bu+BP;CJyZ zuF-}ErV-z0Bfil_D378<1Z)!fkEH@lQ^AThJO;UncbEPd({%WKtC8>_(q&p8rQwDT zC$7)o_l<=2olYm%Z`v+)oR$>de3_808;S7}r%wKCHNL(~DbXN*LOW6sp7gE$3X|v6 zk$E`{`nNz+T45BK=m$UV9WNjt@nm-}#g>0MJTy#TyN3G+0&^=tkk<5kSD9lOS@oC;4mQ&4S-9nw-_Y_qS z8Vs6a#ZQMRrEH_gVsv(ZOiwp`9IvOYXaK&@97J1~{{_8OALwB-&vK}L(T7u49O$vs zFgw%;K}((fFd_e*I_OjX-$!w>=}}A&!SkC44uk(o%!Sa%mKy0y>HLp*PZV?h{!8Zh zAC2`D_W!2eOX_3l^Ua_CJx%^+=?qK3k{NdT0|xxEtkluW!%t+L|Zg9v!Bx+vaKol!SOs>BDoz7ol zD?G+tYgGG=Z!K#Y!~^88I0X|Xwl^66P9BU5GI2iWJ{Ut8b74XJcY%dLDW4l)c)7@j z{nR^bNM)3%IrQ?FdF|80ZTN}0D`B2ni2&Z&FiVg<(HU-X%4H9bGpt93#H)X&kH^*~ z%MwQmrVgz$Y^Z{2L_tMvH3Q|B*hpKzhma&DZ!wt6Ss^W)1? zP!!o7?6ri)Q;f5NXo!D%aNnK&vwL2x9P=|UZb-q4UWThroIvlRc7$qM-VDT*#?SmX z3{|GKL>2%0Py>m8>T~2ZE8`XVS*i=B*yP6>&?3)PY8AE4mShV!?jY!$sqEk7)m3)13~}dY9EX)*pweGN{N4tQ32w z-odtV|0bw#c?74ObaeZ3QZMmS>L7;3&hM)rf?{98JxK0rj=`kaMRRsGp|7THpb?0T zt7+LjSafD(osWWz?`xz7$(_v_*f1yawQt#Qt$(JfzcszRqvJBx@O+o={r70<_W6m& zVr3hFk03pE@{CY{3hsjyQ-NicjYXDSOr>l(V12+TL~Sy*zC-0K+(IohN`N4Y$2lN3 zM^p))`I(yr2#f=3DyG;-Wp#4Hg1F*vBD zVgM58NXHwJ8cM({LIQ^>UH^zf@9Qi+L^Km_=Iu?GYRFx5Jd>tn>Fq088u%hBzMU-f z|EfEi8CnC!z!@92cX%V#N0=O@0lrrOj0&1egJgi`7cuboei5Qq80caAFr8bLC6CTi z+d;q8N5%dx{7FUw??zUxvw*Dl5A|sN&ldc-w*N2SSz!E!;`VyjreDqb*`Q+S<%i=l z;AkH{o*nnQZzyjg$lH30!C|BS>&Nb(e}N~^K!(9_uUhH7zqssgZf@dX`kiIFsO@qivGHkR{tJe1Es2Ivce(9RCLkUeea_g7?x zpD3e?wyq7iYGz#9n*GRJj4aQq=#ibdqPrsq&K9bo4+f}0N3TKH0djEd;@drB7qH~V?a@v1S-gMt~FE8Q4 z>3OezeBM7jMt8SG&BqAo(MbY5p)2Bgx)*Z-q;NJ8beAwjiPI}|@#FaZ-nPCl_qJEG zSjdsUZ~OH8pBI1cR(S)-6Z@q~W#+LV{$(>j@))4OJ{~N7s&!+GnOcwf!qhbWGX=HD zabmGN{`m3iR|!cfCQo5sJre%Q#J`{Tn%@$h|6oERAFj^&rytL{1Xo>;9QVk_<4c%- zePF{2no%)c(Km+exRPhIqr;pUc@E*|#`IA$MBo;77L3<(XuX%x%b(#TtIYh&W4P%F z?Dy7$Nzgb#IAb|{`T<#S(^+E*9=L#2c7B=!gtO(Lj#h zu>;b2cd4rwf(Wny0JF*9czer`g((?7a>bmUTCzYB-rj+(NP~OmYDEqJQ3;X?`(N=w zKCn1GCP0o+RiQzad!jJ0(LV3HZsPdbke|HYokbOh!J8z`$31=gR)wq_S91B z`YHOT>3>4&qX7VE*v32xV21wJYIGv;KU?kgI{x1xo&x?~+_+Ee!B!6iaPI`3dT#oc z12pnC5UxE=BZtYM3V|1eN1Rn_V|p+bJk!Qtxa`V{al`D!TnuBboBSRiMx+r99iP8J z7SAA2_X7b=Sg4%o@J`sPcc_zXg=06sas%#XF|cl^&4bSN3hUyHFS!~HMhwG94FkiZ z1$_fIsk6edoIp5T!|rJi&ykp->d|j(&@!IHf4LCjQeWb zb-~~SWRakJr)?(~$Cm<$nUkP-v6|81a`VCd2WT+TouO^80C*K<+dv%fA`uTgHPTHQ zt{9<8^xjIF!yz<9_jX_y#RXV8fWpt*pD3|0k2#g3;pZm^67~TK1bSubx0*e|VHEMc zD{-`(Ej)7wmy{0el%qiwAAV@S=Q!p@h*xT|S+X!#n3eh{qM+O!ZFttf#_F zLaa^~LNb2(7d+6^M_!!uYCQ{02ADd>AZ(0srkVM`2PWl!Ur&+GdE(x$<7+>wM_K-7 z!?9PS4cs#J_uGl_|7$V%-)o)yzqHHlY~1sW%l~=DU%SRYyxNTm%7FVNl_K7gq5svJ z&1N+I`#S&gLZ09F1o(r1Cc}h<%FfQ6KEAK87?~{6^G4ZrV0uMFyVVC1?F&pT)UT?w zt-}rP^y84=)e(DWP#c$P8^ceJObfi%+&f2#IJ1!ijC3zAFD?(c_>9&!bkhRCn+Hfm z$CYhD-TkOzKiNXjy0C71*3*v z41ntYq~~C-D)M{*0Jd$}&Z`Q*5*o)VyrM{Jy{hb2SP)eTg?e<;I5iAX3ELZsP6 zHw=-tgL&T!=tUXaO6sls) z?^%BJy=Z+z7KRXmF8UyA;d;?RN2lhE6+j~t?}}BFOHnYKFiSwIq|I@u$#sE!ACE6t zUY27K6pm32<*;^)P{y-t1j)N6c5JaK*p3}oGr61Fi>W2x2kHf6$2!(K5=YZ(;h?-H z_x=wb*dCy4{>%3NueT%qAN#G&djDU*^Hlaf&(;G>dT3ittN{?O&9ccR*@iX}>yqBp z$w{}@J0y6GV9@x=f576Dp+wn8k|Agd8rW0-9e&%?2JVs7#XcF0E2aCy8H5 zog|r%!^QHDBolbFpfX9`^;JmXmr^H5CggCjJS52k9xbR$k~64M%Un2qDRq)$LJk+p zLy}D3(Squ;q^rV9{8Bk)NfzXAv0Sqx3wX4k`Ycf*$youCWI_%X%QZ_>Ns#t7VvN?%&kXBd_4p?%{&Tb0j^uxBcN**SpG7=N zeEw5=^7EercH^Hk#Pcep;~qSH5hobj5S1Tt!XXB#E%^^ALbbw0ln-a*o(V(PGwhmg zhI@vc<95I@dsg7sEL5w+8Tl-`=37CZVduCR_8Im}n1P>R*L)-NGwd9G=Hm6*x(IRy_+Jd6p-S6c9${I31s1?_!R3SE_%RPP_F^%*jp2NthC(93SCu zbIMM_^+>(7lW@K#|M`!r+op!Lc4>B}p95u`|F&w8^Pl}jXYK#Hi07&Nf0J*C=kZ!W zrp$HWBy0V*n_>U|X02UYpZ_l6c?$oJboY~TQ8dKi8&AB-s@ofF2H>g8gU+11izbMyZg+eVfbU^@SAv^%Xx z{D;mu{=;IPrM~~k!y2;^Dc3ZD!PP=htZDic=p05#9Z<=%T6ws$?lJcsO*qqPkS)@G zf7$)T50QOHL>c8~!})A#yX{(oWkrU+>M9X+cuiUXk@D-7e{n=<06cm)J0kUIuE7`p zSucL+Nn=8HUkoh{-5VJrN)Y;yXfEFO-OL9W^Rh(4ma`-&&;oqX0Wx`W`u1)2vU}bS zjBrhLaAOj1B~W0mR)oyM-DEQasiZP+9@#(vxL-0K@En{cT>gnzI^7bZJUzZt)2WISc9SuxVAvaF~?<#5rZ7RF}afH@TA*%_d+7KzPOrX~!Eb!!^`#l%5#X*j8? z!M1ZNGqt%YE^2_4cwxAxDsUxU7%rL%c%D@nWrm3j@nmF&#Kz?0`e^fs7$=wQ6IdrE zNn&g=$V7KYJ*V=JHAZr=6(dC>uO6i|qoRdZj4aK(WGS*^trSIC#VAs6r(G%1w96n( z0SRHHh}0=aq?y#>m7>soITR{ns#qyP9n3%|6(hkjVofhfBUP+%Bj@qXs!0L$T3J@+ zWjjGBOp&~zvzi7KExc-U$t_1KDSwQ8Ra6{nv?dbVg1fs0f;$9vcY?dS2S{*-;1Jy1 z-2ybh-5r9vyVUeK_ujcPYi6yPm-?%#AG*3%SJmF1?diS>$<(zUZm3=l`J7f2jc;Yx?{yXnW&fq<5+IZ7%uVVuzL@BDyj)jO=FBL#$lt{QQAk-(8Kf7$4 z+RLh3iMrd`99256Ahl8ka{#&!QbXP1KG~4WqkQ5HM)`}i7=D@e^Nuj}`HlPbr=00@)Ovo zNxLLZf=vB8nNMqL!e!}&u#pCwNc73Pvc$0KOi&Gx`bz_IH0r*OeK(?S(aMGxbz$k; z711{qX7J&a%$kNua}vs9@{9ahrXpE}gXzkPRAhqdjOZZc@~TMYj_GUa{H7W=|;Vdug7AuVB0pN z(}%v&7uO!OiK>>OLVcz@a#1Bx*!M7;60JV+*DqKxUG`*5YYhBK=i0A+zn~O6nDW6+ z2o&@!q~t^V>&EESJd>Lvb4!?N7ZCZ}yVe8%kXg4Vo-OM5nRtXVbfeRiJ-k4+||z0XRy z^$sO_gXVuQbMhCLugUmsti?ypTA)5;zI|kv4B-vw+U2Eg(-n?TqJIEX8v@MN0b9?E zgx7$WH^maLN~tB#G7Dg&2DA>FjW>`d>%0pKRF$pE3T_OIZ?^{yGWI({*TN6r&a`5Z z)D+7FrA*B9!^V!iIYvEZ_J$zHN2I&ge>#qHnan23xTXbPCrem5$MUDNS$bJm5;W`@ zM4ia}g_+>3QY8PH+AZCsHk4Gx)Bois)fMkms`?n_vJ`W&Ywh{>jKVmRik+|XTR);c zbrc4x;omS}7=6qbP!2q%a?KEU4*@~BN*g0Z7MM&niIyjjhd2@!qjPEdat;x8q3EQo zB3$tuD*?NlHhZkplWvD4SS4_I*Gwn&x^K^ua#aKR2?6${X_RI zAGwKPa^R)Oquz>~fBuy%=#_Y6hi-CqUR4sSQhc%!*)caWbh(!{nMf0=6Blsr~hC{jXglIeQcHWvekU*yT04dY?2@@xVCw1ZAmCk`7T zF|cd8(#())mYIR^ zC-*w>c|yu++{5+zwP($08(p_hRnY!&KXrQXP{sb-IB&-fvvOp)GvQ6T!cz_lRfjL+ z)*4t@)E;cva4@N_`@i#P6x5TeN)%FNltf&l22FZ8rB@JpTT!7PHEje)JZrP9$a$l+ z-e5EZR(2R|vogpY)R^9T*hTvBx?Q6aglZjNIfOq{SEY$V9DxytJIxZ3NMN(FWqY0P z9eB<87hzaZOBBF6CoVfZT{|*0`iVC_ff8_k*h!4DE=2p6~4q6#aUauFqtkkw=_UwrWv9 zY9So6P2xuR`6cRZ2`8v60&$OB)v5#EMz1Z$AI*3rwn`y?Mt9Uvf&J+h1?5-h-mMg7 zXyI!f&%e z!oAl=BA0S zPo~iQG%a1Xak`MXK5Osc{RB*9WH{*752n!u0gD88iada+Yfo1SfO|DISrU)4m`a#=F<95;P6n_YQlXnPj67|_wZsa*p;(a7sf zwSqSP{aY+O03RVoOljdcE*s#`&02VVwM3uP1)^qm1(snZGlND})zGwumEP~-sQv@w z>6GQULJ`70>Cvg->_6$5-MFY+1fa4@_<)#nsri+KZONY1lf=XwgNOJ)sLEBbpd+Ma zw%1!}W|~~FR!>v|_?=QmDo7;jn^@Zm)T-ewi<5cs+hOA0nf5khOJ6R!G9rr&cc`~V z!QO>=sW6HXuHyp<<+6XQQ+zD+OsKH3OtJ`@n6$Y=-H_pO38PUw^RZ^BT$_LamiTc}27Qim)Q`C&|wX;*om{K@9{-_m%54i{KNn&j*s+zke_4xgfuC_-qt z{{?$WZp+q?e2hQsqv}X1?K8Fg$)8+H34Q<8_e)J%=21TFx0}wB`c2deHw;vM$st4) zH|edZ#NgjUxDSI*1*DXZ*n@)fDq+#%_zc&%JS!y}Rl|+J# zO?VT19L;{b4fE@8JZZtA+vreH8Y9Nf{52guK@*sny#lF9GCe-FpVVt1YE%y)JD2S& z`@@7n$OhlUtPGw43U|(}@*2(4WlMUN-+?AYW|wy)papz2TnfxTIhv73CU%_}hJ@AYN;KslMr>Hf*gxuuKhWuD0R{<}oc(& z!2jvbbL~N9fWH<7z& zxJTzlH!A;=bay!Pe5ZY5DTC;1JN`OpI{b0WVShwq$OppIGJ<0BbJn78laEB9UDRwg zHKco%9`8A4NZIc1Xlp`!z{%PEKPa8fDxh`>Y%>qGl!9tUF`{1)l`)xWd+ix}AaU;F zuwHCsJf8lp&*ID!oT@{!U5_zoc2;(AZu*Ue`EN`OKQTLqn$Q!jL1{1KWcAt)XRp2V zY+EgweoHz)^!oE2hb}_#(3A0U@(9jCT0lBp^^dFudhh0l4_lSC=`HxUhxCD_@Hf(T z?M*-*l<51a^8^W7>%Z2ewgOxKr$-}d4Y04-31HfP+TZCBx`Pn7V&8eziu~}i>76hJ z?`2Z=U2mu%=}I^!gKl$*{p49I;-9zpo19(;VX+Kf0+{|jHJ|m2egv+-zaQ|N^W&M@ zh$a6|4BK2iaqsmg_)gl@W&lKarO3V4z!7JB-UDd5>bp~bDB-;-z)XY8^-bzLfb(R0 zK^HIt-C$h@u+Iau&OZ?1uog`aYM@dn?AD70V{OBd{FEY2gjKM?xoUUd8E!ywr)|3brI6_CPI7^WF7%|I6f2CXB|f=kijX6WYDuQNZ1mPiEvM^%g8)*6bjT z0FW;h-UGm5aarJIUxnkC(vLhQ#wfz-8Obg4SWk<_j%!D1t9>4*SY24)Dvh%lX0>Uw zdbePaC)Ty5YgR3hxM`UQ_}$Hct!F)z52O3t-ma0XeYzP(T)@tT1?#l$0CP@55fv@L zVf8!r6#u}!F5GJ29ff5OgwPU+n@Up`?rP!J(Pfgr&DdM*x?V2%#0Al8SYMT&_xtj* z2EnCWylPFjA`K;s@!Y5vBb2Q)vdo;+SedErMvO&U z>ezU-RUb%|1xo9ZYQn>#=+kkf6A~tW7_yP;;|pRHS&G)AZB<8aR2J|@O*Gb$XNxZD zuJPb5&LlaT)!U*njcQ%aITxvd<2mG}QIb{6XIwUW!3Y*+mYGsfA`l8s3DVTt|sM>>DJZbrEuuDv_|XMKql>Oz0IkY^wmJcL7@C1 zaB`<8|GuaR&Sr5$pIiYbncum&1s-Ebep-|F7!F41yz*hx+L{>+LQ|vF8lwt1mRcF@ z*L9kGCh(;K&JGH{acM!E~!y~Rlg zFj4@CK2;Jy$~mQYT_vhPA+Ijoxetg5E+nqvAU=&7)@I9}^_0Bj&sOHaLG| z&TZ`E%u@Fq8TCeS3c4-YnK@e8-kMd1B!eRbHgUh+sGfsLhaj>s1t#IXo@_=3NBlk& zCLzdNbXQ_I{ME(Jn`Gd}FpElW@##W9rq%g6>8`G8G`aKI(Rj>SpEx_B40cbQQO%e? zb|ktUte*k_#)G1(s81WGNIWDu7M1ebsB+0Qm$PWMhe&muolOn9d}=I{GFErq2V{&k z{9J3Bq?I2-g5bdOLljCHx)Jyh=D4a=Ju9CH=9%{fTczC%$sb#{85y^Z9|4hI_q$IH zI^mE6CXzRjU3)M+r10;;6h>bGLUs7CwPTj6P_jbqB-YP?sI${lJ66k#h-HFpo}|lZ zkNu)(BBiAv$&8ma9&AvJjf6BG z;I+`y-%G^p&oQ;^)!vjnL_G>5I;(nUmLw#cBijerHzBm@weQI2T5){VuTxvM&T(xp zE9=$5{wT{qXdjZDCw%^=jv~fffb=|in>aMEm2K==<(E~Q&LefKxWKin*1-Is@~uG& zg&R2yFMl5iPXD3Yk^}}}z6(QgifIVQWo6+kZ+j~@NS_s4&!VM>;5l7@@we6(B?k|y zJgq@y2Rp;cGQGsj|4Z~BCjWV$QG`hoq$W5K}E%b0yE-^o@#k|xhqCla_p3%zp4otd< zALM@)&+LMrSTQ@~?#}hN62GHt3DVbF@FJ`Vt~r?Dd0%W>4COmzYB4?0CB!@-*=1O) zht>nnyUwXffORr}jtMM_;jpkRl%aXvB{=w|OF6zwU>zYT#Q$2eq^aA`G?SuhoD^kW zB&f$o%*Jq3C0JYY(`oo zVxm2V=(|A2-b&*sLT%LNq-pu-p)y*#aw3HG@qSoF$4C7k%ELGeV`y_Zh^r+8*x+a) zAfOn1C`l-EYE3%D>u&-^A3CEjE_6U`MDFIn0MRS!H({dtPV1J1k*h%cvhi_?}m`#{+ zHFk}o^zCT)Zf#NqLoX{;Lb$HiJM)$p`fJuQtd3W}m>Fedq}wp{_k!>r{2~Zb7|80u zhoL)dl4D;_B25Iy#ef55fEn$Q(Ija-!>)BHQ&$7X6(qw=sc9C5ycY>YjTIHz(F&zGv%03uwfpA zH8b}0(EOwSSVRn4Hf9h>>;Ng%+8vWd8buw?v%3X~%|7yYH0|6~=|j+LRq!TZDOE_6 zA6F{AizhSKb6~aQX|*S6M!QMqUQr}MtI5q#>M<0Mq0iv_3!pFjoE(#2mf9qOOpSdhw148J7hiI4VorF^c<^R?M)i zr;9H3{$x5lQ1%^ueTz1d25YgdJzbUsg}gVviIqDlZg!s;cuc-;x(`u#O z4h(qXex&oUVAFRTk7wf-%YNIck9^)XX7r4V^a)SkY7RGhQQjc7{$ zfVF``-H37x>B7XfHf%gpqB{`2p^+oV+&RT!)ENxH1!3f4Cw-nY8DDP@QLN1wL;U>5 z1_QE9@h$BUYXcaK0+y{CDX)4~WB!0ibI^_bATY+mN_U#Z@PXz_&Kk{<4!c;&G4ZvJ zX5B?ZIBP2V&SE}y*HP1)ruK{~+=pDDTBZ>J9k@TTJc0qKa8PG2xLW?AeShf7P7P`= zr%9wle6UZ6u?b!C)V`#e@Jmqamx_dRImNVgpIuFOi{X2-vEQSQmATWAjKfDF8Pe@Z z^7__0j7{Ti4?j1itx6~@bis&Q_||ui?{hbjHRe1!y$(y3Y~5ktd_b-z;g%<2I@W%6Hp#$M6R-rf$M982oW@08?rS~fS%mfrTp(Rf1Q6WmveN*od_X@%_TAHD;u8N4*n2a@``tl! zb)ghlGh!0)sw1|q3TB0JQ|mAI9WVOw?6#w0+*iAsz;|D?c-IQO!20`uM}lSG=;6sD zOK|h?9Zg;S4NXj1pkF5Pq^y9!tggytN4p-cg zJn(}PHvC6dSGSanK?ugo4_A_nnp5EmOtazl_m8)y$Mqdt`BkL%Sew8+b71;`aFz7? z!vxr*Ym(iz0%X9P2Grrcx=PT-S2<_vN~%y`7I(>r;!%aL)@~x*#V%lGr2TFoy2XUz z!;%oL)te-JTjD{HaE?1~N+;GP#yn9KX1@$DM{-JeU$m2W1NgzZfe-;D3&7s%ezS!8 z1qWrAUC)asPSm4oKdgCw4MCsXgQiBatXL{Sp25J)Jd{qgMCw$t#qTzaIw=8+9Xw2g zsO?%;&W<;^w?8I&0=NlKa(95O9=kMULK>l~WRFtaFkMo@(IZ*?(M4831PfZF9!6kISr&+*JnB{%+ z`TgNbcF84RTeJ+kDuYhBm0SytXK<@Y2z9+Jj1VA`qxw*&>vRkGjkoU%^8v#Wm8eR< zr=-CE{J#MAmPHo&a;;=^!}>ONZLTW@I$97X4dvJ04V_bKTqSD*xPoQ#B)-?aOr|mM ze&#Hv)G;h&H=jFgyxuQ=eE}YY;?Cf5qTd2~mcxgD@%#4`a2pd>q9_;1xgS2qnP`Mz zrM|&f%oLnmF%=LgAHTQxyXc|c(TxIFZv|vvs}k!bMv#VB ziZ2a^HZ-A!Awx^4P3HD5T9qzSrhM_sZ|mnzVGdeIW!M%vpK)XY!L=W=HzJR%-G*;R zOl@W_?$X<9BOq#enk4WF@l!fZ#%|s<4-X8!9}RfN5#{udJ1R{+ugg8YRCD&(((pN6%Mh1MD3f{y@DCs<)61k85`f1W$*r2wEZm=`(ZFbQs$& z!z{e-$erRHB&HmO^*6Izmz)-Lt2F$cRQGwkfvlM|+u=c8rO)Xadwqs}3O(g4h2o{W zW}MbvmV$l0XY40YPjz0w#W1iz*qlPuW@Xhu%7?p9;BZntZfRu*^Q)82qHfcC+2#@D zkrz|_(eJ{jVs~m!ky}gjndbqcuI^6nF*DTgO4d=je66MPCS7uFi0v|OR5uOivXvBKpKZ7V$+ZF!8z=?8QDS#_)MfECF%qB7Ns~X8bzsy$n|ceW+W7H*ujHQw1ow+ zU#qf1Aa|Mu!*&A&5~rJhjSYw+ZYI->h_`E&?<&KON){gf8s)OgKvL6(DiWv@eM^V} z%3y}DU^60v>%1;@+BH`FLAz$$WGjnXj(r}eiKq84;d6q2 z=pugeV~8Lhk8k)eNqJtaVfr(vG#*#XxU<)1{ou4r7Seo$UN(o))4Lrj%j(iXgodXrJjiN%`&IgP)y)`_#?wkQ1w| z^C;Kk2UWRM2#inQJ$1R%tR25GO2L;O9ycjU%`B8@7x4-ZWt75hxrJuE4>(~e7X%S} zc8R4}ut>7Xk! zCC670G1Yt%Ts;7=-_w8|yN3 z0Z-}U-zh?TR2HtZwMKcPrZrZG+Fj8h=^x*HiE88upoP|Y1LWnX{5(j}6K%f_b5<5B z;ipY~e!$7Pf-oyIRB~iXr-yR+KxXqTnzSpy{C%rF*z-M)KD_jvwmJF=>32KK23)Pf zI6Y==X&V*t)sz58e^0~pB)(pV3AA@XRyFpLX&<`WwZCx|&dk50(cA~3O$fwg3=WJ@ zKt*0%-98J6uMowKPiaE`3`w@kgTSlvCMGdi|9vNeJ1sNwI({;={{YKM23QDVQS>nS zQ(RFO#ivxIQ8S?idQUt!#m%X_+0nlM9A3eYg@D)wL%;fk z07f66W8S9ftS8E=d;7-l2zkFuYWpa=^Muqs2YS*>Jr>XcKa&Uj?E|{raW5Z#a>X)b zpndVM_p8b*9Sf9oTn>Hlk`8&|i%OTLiGx-#qr^;eq(XzLa5mEar1U5|FcIwdd*CNJ zC{9V?koud29$=Fp0{Ilsv!Oi-hBv{H2rX}8t?$Vk-z)EWHm#)o3O7D1UXkKn`So85 zZ~6V9#-$L4JFXa5o1y9rP3_*DHDLIPS=6?hul&;?9dXY{|EJur_Vtf}x%4k5n>Y1p zY7pS>RDvG?tdvzf03iZb6dj(3z1Qh6?NZXnIHU*KQA)RtL&fAgu zk;-4xb7;lrxGE=z>SWrtc81-&3cNKY6C-Z|_Sp@;yiV%!6984SR@E0^Eu73W@K_XH zpPX+ce^9TNrf`M`!@9jFU8-c^?{sHw3G?r#*M@_I@-=V5;5>}G9>9!eK%J8w zwWwdf>Eekk0LG_m-#!U`v=hQ6YqpA$`KY@5d|isvw%Fqy<$bE+sOkYZt__@hd&C(A zW(@`bUC@pC6={(-R)qOb4_gF5O{~u@Uj_TpF4poc4Aunc_I_cnNBja@G&+rjfYO^yV#&qu+~N zvujos)bt3dP;HkJS=x=5$aQRU=STP77e{I&N>O(HW3I?&rQ1Te?@7f_ zsJsdnu!{2+wX+J77wlT?<*&hf9dO{+<$_D%Y{#QByVPkIuFxu+J)&d&9;&5%3=h>e zzES3Im6`R3^YPMGw7~JvbM**C2OKo>Q#!pGxs%gY?S^JU5u9*E?U1%%joO1l{6nFJ zC1Xk`R1F^r{iiN81lqF~QTe;m!_Z0yu%#eB%P4rzf3$66Mmt^p-#Eh5zd!j9_uoRBhQI`6 z6*b^Vj^(?t?z7tN6qqC`vbvMLPJ~B&t%0-seX&eoI++X58$wS^0lHOhrGTSp7Pw=a z)ZY>2-fayd{`BtJm5l?Tn_=8H%&9>xKg9Qk@ct&24ZEg~(ni%7RW?jV?$=zLvA`98 zTPSypdU{1d^$<=Uj&wL(nNjKzm*&$JNHShN$N)ZA^3OrtT9>$Bn~v~gjs_g!RmLLu za5g)-u-594Bmr~Pgbdqn$wD&EHZxS3(xN&y3Zg$h3rtO>Pn=A5mGEri z1En0){kBY8>wPnV4MRY=vB=CG;Pb7AcpRwhnE>kJEx)~I{+uThySVIUucHhY`U_wR+7hPeAV@xwh1SUjuZMx&ITh{{-0E!3o%UDsnsWK zdZ-{qk*hs=oL|w5ayrG*g6QTalj-&HdA<}QT-ogA=_XI&N%lgPBZznR5mu`sVyk{f zCMyjkQNu-c73ZMdO1=a?KAl-ewc{bPG0%PGQo>*ie8ObPt1-yzZIFPqYA_}|vqe(~ zG6@Vlp3ws4vcmEY0nQ9l4p#2=h67-f>&ivt^ewZk&;bq!`}g z^8P-$Wd2p(Bvpw@F(ptt<-yDQZE}?4a<-~TbKla3bvSir-N&EdO{0R-(m0;xbX>bV zM26Wp**%#s=96kBLeTnO>bteYtm`0ItRv{W?3oZaT}!Z$xwNz<8MTqJYjB4d(-z

    nduB_5&X=ldzvGMh#tS|2pc7x)8pXe6CUwTQ_^jOD7`>oy zSZ~e1Q`BK!WLu3WcnW6N^P+AK&8bQvQeNULTuxaTljrAuqZDf#Vfl>I$hK4>$mbaN zSw6NDT_6p<{CWHloryMs+7ubpZFN0V#{B7AN@zwOB~BG>MOI7lIR8{Fw)|ucI*E-f zgbvMdu)fO&^l_R+iq8#kvcI8pXWe&q5aBZ>rgfb0>@B2&gWav5Vu*k&={BBm^+w%y z8J9d0`_wY=OeC6>Ooxlz>swRc_U|u4)S{$bXe;D2Yr+C_62%TC+$!H<==IFosfP$0ar1P&E{idj@c8}$`+3G0YpIR~4vBrtL=$bnMqDumS)vAA zFMrtuJF zWhb+!nm3kPPl7-gYpQ8o0^1Lp%w4fSp32{eE(Jd=)v}z|mT9pMWyL&ShamaN6Hj@k zf70w*ba`HIsAc7oFk?q`;@E4u5Sk0QSY39G_@XnD=>Ueh67JgpEDf#KT12hXiJ^P0F|o zMq_MhMuB5bIQ9hPS_6TBW;!R;Q9q5!X zsT-2{Nqi+|fnnmNP_y+NbXduNylr3>Gc{n!P5_j3Z5j*)=z`Rme}WERCNj|!F7_{FwnXgdl>L?2gVy#!P%AIUc0y~AP?qZG|%iGo`Lr`(*ufX z@HhQL?l`iYMfzuiVTobPhH3!gTA1tawXkP~Edag@!5b_p4`5)o*MvW({iwZDxIiv;Ov>2s>4@G1IMq&VD$WBhFclt|^rUhQo^}|wli&x*4OgBVZI6eQTnI-jd#j{NcQ!0N$ z3_+17J!_XZ%{di!$)JfD6jc&>!SNb1QE`Jt6O4mBRTnKwP8-1-dhCP41|E}70`kU@ zCn{}S{-`&@9doSlQ3v^MkaFpQy{^FiIgecx1AoZ2;6&&w3tV3(~*nl$#!q)Sa0W0fu>+6!YrO& zu7FEeh}Dp9X{1l0F{(ZB3J%-TOE1RKgmTAXXy}V{C|S+gF(JB}SRK01g~|LePR2L^ zXVF|Jr%LlH(m7Hw^Ci+?3EnLc+0p&M$8QS6B8OZBbqHi#1Q}JXd~q)5?bYIk&2+j# zSzU5jK@nVyRgXqs7U+u-OBrwa#U9&s^bxZiQu1dXWZ4^KT26F|C=6;klq3k$4U(L@ z_OxLx%u022Y%kz#Z{SlGgPbobtAlpqjlF9BuUtw~@zny-i2Zy{Yj)DzUT3CDdl!41 z9dC~BE?;wD9`m8iuJ>=xR?p2JIzNR`LCLULn)dv<-yG!9O3z@WTd0aaYWbWKn%GWY z=bLF%AEf?)OD4HknDuMe-+Tc>qsot2cucvy(x4KeuG4qu{j=tgzX_4$P(6IY-LD$f z=CTs5kdqCv{n)Am*MC>MRF35=e_2`Qtmz%r8>iRl-vr(1(Ef+6W?&Vpt1-N*GJVDYpx!wf}VfX;q@E0QOp#q+m^}` z@>3FVB(!I3RH!aam3PYimGVm(wA0zc{kv;H-d=iUCZnMlE!kG0$nv+6NylaK7ljQ- zR;5rQngV7%Cz(Q_19=8Zc~vt~I_rlxVp*mitOi5rt>Bu@!-U0Nx_rT#3mu3?HBF?f z!FmARofSIIW zd6mqJT1>1IY|o&!7gYb(oMHL?T%B6tS4ypGMyV5T|F+4#qXKYr(OUpXv560*_Z&1%B7qP~q`SUkFoLn?S;w6+--gUfn` zgXL~eus{h{k8Cq3*L~Y^p}Z_4B-s$2i^#KOnj8uhbi}W-cRTZx%4jy`lc7o9{`OPe z@5}|G;@7eh^}b)WuY^W$r@l%h`o`DZP5<_Ejx)dehum%#zleb<-Zfyi1GxkSbZ$t) z5D-ALh;kVw_!pFmpAg{qw-?A0U`NSm6LDf6r1o>4sCvsWk3Qy)NlDB7W%d=hN|~R#pqi$dIXXzo z4}`gBrKbNZH1~KDZ*HzGq{{1=iY=G14gXyTZ)q)qR%GWjO}$k7Da$>wj}fuh+5JSN z2Ob;`Vpn+m5li49a?+o%0`s^O!b}}+HXfGpUNd8!eW^dGNqs{IvHQrV(U*|<~DwntwhB) zaXYpfNF4caT7s9u|G9X!lZYSr#D`T!Mspww&SmpyV7FQ0J$p2c9t$L+{>7x_)0mkP z5S?1CbGNY}tGsnFAiC*-4E4o}w`p{=adjs_4q3jLSo>%c413GDQ8uW(wM-p)Ma8F-bwP8)S6W^THuo836ES#}jZ1CffS z{=@N4@&%=0CdQspJHlYux$T?ol1|&H1tH0b{7i;{kRWH->a*=O806Xi5Xw*E0dXfq z5;RmYOBOxZKa!G$#e$u#Gt)0fT3$7~mMS&69Py~`qeF!u-{`7h$*`N*(jMik?;)~3 zW8dthuh-9k&gV{s5jf2s=<@{Nx@kW4>hsT4@khik0xN`Q&|~F` zRpssw%czmdL~}=n+*L_z_hB1%`j=!qq^$|jSREc=XVOYe;dE|c8S3kdoJt&FdcHKJ zKBa8MV!3FUU({RP`B^4)+_ytHWhBNrd=!X6F{ebiu_g>y1Mf(aHlOe#5OZ*jr1pEu zFWl@4S35lY2lqg`Zw7&QzbCg8auv0Iex(hwSA)yX=$`Zv$f$cK)Vr71W#e!qp_eg?Kh)|a ztZ9Cg_83%DrMQ*zVVxxjVnqRYi$5RON^x@#71yg9~D~CDm;|}+CPtyYOx3Bj< z`K-buW7WK5x&+4f8y z>9BvIp@3at>hmIFKRmOw%vp4Q6cSaR+B~Dft8|e%nn`y+PCu15FD=ZVVaK)mY*=;H zY>To2@m{n=febxlGlLkOWav4~;3ER#dF)*9#r;oZVU*5sA@}gyESbZtpeY<`s?e7r zoJr81KcL)aJNr~>vQLJan#=Lxtf2*zAx-X;%KMffpJ|nNMJaTWp>N@f;U~N&nhCPL zC^%}gW1FHPm=jJc;}+-kQn*K>e{Ip1T49xcmeh{5MKnJ~G$$BlR#ieU5NPIY6S32C z`JNP7I{&FEuO5y^Ll2xZ7$bR4AAY+$HC4|?Y|9n%(^${cg}s@?f?LkA^!ME9o@nj~yh>RX=Lf z3rK!wqlu~)2C5gJ|5$<-E&TS$7rQjGV-JGvr!+e9aiQ6fVhs5WhY8!>EX5qstsMwd zn_0$NsM(yyRg8;Cx~I)g-3HMh*T|tTM4R}B2IF?<;))Qa?l4j4O2tg!I^yWCmhtaZ zp_B#*D?*_M!*1k5M@I*nz%=HV_7X*7-*&zB_&H>*F*vo^Q+fJ7wFKq}B@Iu*!I1u% zfn1yW9~?`SE_px5>!l-P%NCdX+M44JEY1|;#fy1A{0jXu%3;>XG1PjdM|CQPrzPsX zY9zv+!BQV{kt>1}}lK9RdKp2V?~7t+n0NfulEv<;E>{u)VB z7c*Y}ob!VQhR%2%8{=0mXJ09W64Myn>NLSEl8^vPbE3A{PV=>YWFVRI1tlN0|5%+o zq%f~HJ2M;qRC4ovyksop={h&hIY=38&Dp^womw;~s`t(5_l-43&A)*pX0DoSw+A=q zu%8C#a&w}6hp|Xmq5EhjJBR%U%?Okf47P^PG9qcW1hT4j6dfI64wQY|*Hy@R=^T`$-?hIl=vJm5hNzZs)1d$1>@}|{&YA3j81p>Ih~i>a z`Q1iuPZD`vist%Xu#d?}qJ}wVeLVc@f{Bql$=vNGm`53Uko;5Ja?qhX;Fzz4zho#h z+s9r?b+G*X_NG+6mp+%PS)dd2!`%qRpo-5aI89ej%e4gc^W3A>rkWgjt=)7&4nfa7Q#cH?$)#KzBiSKm=)4KjotFxZFk&^U>Ch*qAs(Io_U_|1u9V2fw z{}7Y7PniRwJ{;!aauy$)a?yMk8N5_Vq9C=P1U#0iS0&Dt4;a5p;T+`%aaS z?L?bXCluI$c24JQ3pg2uIVV-EAo~NM*@|&alQ^HL-7zfH?R?%KnhFT55%OdrMji8H zNmps}u-j}y9;`-A`E%w$X}8!Hqi+ktAqcYgd}WTHMR>Mey>(EZ#wUMQ8mZSC+6*yq znAQ|%gXP@}+wPH0{0(f^v>LPfYh4}4)D-44ZR5z@EMgl0PF=70!=L;S9Wx#u|Md=M z4G0b@rl^|_SS9%$?@~;R{G@&uqtBPD1RIsjsoJzO12iK!&OS@4iP-DWQ@D=|JLG&a z+LKkW>LEhJmhI?L4d$a`F8k)!cVY?3Fi4UtUlL#E4N?$J#tMw6C@3^t7%x3i<8*J9 zl|1)rYn^X!Vq8}It6H0Cb|^n~F2qQgQ8w^1AAgWbqaL5TBj)p2YXnHmIBY-_f{qJ+ z^#9dKsIDA3@j2-Aa1v>?WEoxZqt{N>A3d=tGQ|w+?;ArApX+J!%-i@{-^A1MeT1S8 zrEpmkXD7Y7oW}Tw(TWLFgJ4W-2tNfbXjpzF?yFWI(s})Z( z+I}v6?jxSH&fe!O%qc;7IB`e4+@s|_L;*topoE7eK1zy&<8`gulb1)EC#3`$`X2d( zEcLCA7v&#e>da*OJ2#UHoLD+6p1Ma;L`%xuf!4eg2RFycPK@dw7eu_M24VI58L$gT zLtb(gJkUH(%LucdUltqtS1x2_e?{p*(gR_y*?yyS$bvY#G9001qz7n+h(65Xxf1Ot z?RSrC!C%h607ei=XR($gz9Vf1$4;prV`gu^M z>6=DtLd}OgTc2Q73yML$8 zhhx#I)8+VjB|k5a|F4WG@@PYa3rzJ@)~oE#8=FmB6nQMufii*gZG*o90{0*Q?eW?G z*_6_>*ULSNF2hueq7-vKmHm8-jC!EZ#>N-<_9YUAbmBm!?AK&=s$&G+Ag}&%qkR#M z)&1g`!0)ygv1IA|PS2B?!2eqh;lTrMR9sb;cRH75=4=bnTbqL{N&i(Rm+aFFXJd+L zS*nyE29c=bBZYt1a#n-}5%bc}T{nFb5S}SG*Of^Fy+lQdgK;MuAHtL7irSq^DZ5d5 zfiz;;lZ$nKGh{$&4-;H9{o_z_RrljnZCRW0lw1h0Lb=evuj7QIW7mmN5}8t=3%}$4 zvnO~ExKn927*DU(LjUh2s~S$Fon$w!f`Sr746Ug|QA5IkAhetKte#J)DCiO7O_R*g z1d3i5^>!Y6fc-thzGql1>*7e~@mRxDUP9AgD35shD)Sfn3bCJoJL{Y3`|~dr9g@a2 z<5Yla!%tb2VC6@vq|xLR*S3qZ+_9#p*rK#Q+~|-9@8w)4;{P7=KKV){bGi-7}+%<-beounpAV8FZCPYqJ9g_vlYv zi@{QU8+m=hi7u?=jWm zd7KgxeW5U}MU(V~{0fT(ta`roLOh(oj{4}oelp9lZ;QX(>B2aVbcSmnmq1rKDSs^4 z|Fy3crdX;dTB%E6YxJ$4Tkjx%n~Pv()BMwrI)cdB6eez2r-Gp1)An^?pzyzCGQkaz zZFMoF*Yw8h3mog40D+(0x)f=3oEHj&66+DV^aK|C=og4&TgPIFC82XVeYtX5`l2rg z8yDBbb#PnWmYnjY^uyuUT36^KqN&ei%QQ{yu>B@0<)}*8%o- zP9}qBs>$LE6P-RDPqILJ(?@yN=+XSGj3QDVMnbD1{CfsY#3q-+F9X~a_?$lTXOug>zp{CNdN+ZsLFno}~=QPX$ixZD& zs62Gw-4P!edvT9^?=ljQBfYV$DVUw*+&%!W*h zxMcVhg9+x7=gMnqfh=-_?uHZz3j`qcO&#rK?fk~SW3GP@ImnWnz&D{g*ui#&)}Srm zC4*`g-RNh(GHZ*!giiS^o*IVI6&N`OT1k7_wM4)27+izL;} zzLc*uvfvqAsYFA(j5MdpU4yfc_}q+VjyH)EUC-}9XaA`z^?;b1Tj9O9J2(i>eyZk@ zdPeEW+i@~~XP^P_o1&i~jDx>e^4XR>sk^5zNB9_D3Ud>ISeQpC$4gYDJO_YWaxzm;B0dzO|KLPVKJpcHGpR{LvCE=C{>xY4GmYge%JiWx{t>KUNLZvC@DnU9i zW=Qah0hk^QC*5eqR`+@nS-iviic^)0ZJGGQwx^4Wl-=JXUoIqRo;N*B_+r)hF6d4kGigcf$R2*AcTWG z$Lhp^pGlW~*kg=_Z`X6G4voOLM^S9q$~1Y#=G>^MFN(XJ1QDQdMK!5n@IQpPX<tvsr5s@^DkF={7{_?S)!i)bA052m#AXFu;!eqOu<33CkELUDHnLP%bn#x z>h$;v8eHAIs?#L)e^+Vg+{O$9wfes{`i*Oq z_eyO@H)mC+KiHlg=h^in=#)a=i`C2AdmnP#KzZv%ApI84%kkKEIc7%a@?Op47rP2k z7Yr;6=4{R6vX8Z_pi#vtu2=_TX2E-}AXFe#!*J*C;ah01t#jN%OtWCrHq>_!>mI|2 zQERWd)WAGF>+qU5+!FBvEi~J7@ti+xanYMkrQlh|sM>~+;Dw?Dqk;zNXQkRJnb4o0 z%hakHmfjd|(I}7ud?#k?z~c?|evr&31f{GOgz#j0L(FJjX*6(9kW7WmNf|E3(B3H= zm%(#Ti9FwdG7=ccxhO-$a_}L}q#0O7?N$9N80;_ONX(W$;8yF#ezZi+%aPrZpt7m` zfaB=_Q!+*XAGq9}#M#)+Z($i{{q%WZ_;4Ypvc1>C>LB@tA&I@gh-Xyx7 z+h+d*WqE9A=eFq`wA~Z2QWJz!NClowXp~_l0Ii=cf4(Z@G`v-j18+S=E0I*|h{Yg; z_F1scex+68Iw6@pZP==2gSyAcWa?%hlDn%3AJw7pM3?$BlQniFP9@B{t|5Y@&sS^L z1Kf5`I2n2f1z@-aaSV_we(}K;PA>YL=B`+tYnJqYcW1^1%z!1(#SvO8)Wh7#B)&lm zAZ;~1s2%#CO;8F9V$nDcZc+{ZG+$x|GZ9E?i!-_$^z*v8hmMAde^7BRGFjrmvTUsp za2fx_ey#o+Pqh>#8mc`0kI>#*zU;MtnuBlwnC=E8Y_mfoZ=jqxo^*m zn!}WHHEVNe$+M%DEPqlfHyS7qu-p4cQ5cBK0`1D96p7eMci>?7^TSAg}AKB}3z<@b`!9HT7bf^B*JjbZvDz-q$m?nAMx zAq9waHGcbn!WgpO_CZD{1h9St9Bd0eGrSu6)>Xz>16H1SxGD+Xuuiv{+~%?_#duX)!m|y;uc>zFF?oXD&~G*P^A=4anN-*i1pW;J^S6r%iuda zv;WUWgA?e>j`kIdk+6L&9?u=z&$20?bK$ zyKFA#$*PQTm`E)EUV_w+nOEZb#ec#kYBxfLD<7_6qF!Qz9#NnKDIZ=diE#HS=SYJB z!EP7M$`AqC-_b%>c9}-g^iq|wY74b?RYdJREQuDgZGa)S;6Uyn z*w-eZup{deFwrL57W+kE@o;*XAGz#G5ZoT#K8vTl z2S2mjZx^Wz$_54tyYJB!-gjg(dhOq8(@}1=xUrr%TN=x+`7?y83WO1^Bw&a4CXUyd z*2gY94P!eXc7!Jf{dms1;%qBfIgFIbbuqB*Oa+msTsf8>I33iv2m|Cnu7AoBgi0|- zZb0x`H(k?fX$kcJ!z^OMkKgsIh50T1huVeP@H9xCXdT~@ z2sVrmn`UvTT3zHX7(TBsu%%f0RSTZ(^%4jre(VaIb=7c)%3W!2)iCQ`>(UZjgYXNa zG;03VJX^`~jD@}jwXbnyb7OYB3PJe%YwCgClgOpTav{RGBd(^BuAyirpD(fVT( zW3{;oil#m%UXN{_#nC^n&=tTd$v46$tHBuj&SOJ%p^3IA!n(CZe$Jp>iOyV?On3Vu zzEfH)W+uyE8%kZB?6ar~;`kMvbHZtlOrz44BIp|i>qZHZp$_s-Ra9Lq%l-<#G!e!9IFg2Tax4(A+{i$PwGC+(TLs4yaO%2XqlQ9R( zlxcB5M&zfm2|u13TwEQ9b2t4t;HW_C z3Hw2ASx{nIY}Tq8*zqGjU27N3bDHQqaCsUzoi|?utkN3e&2;_rj*r#w`L5^X zR-M`IC#&K)|a^Qc*74;#TN67$x>=29mAEzzxVl&6@y{$7uw)Z4)S_Ju(Ov z^q#gUkFReqLB!RrQcUq|z)e&eyrRM22No(+$vbH)BryJ?UB{A_zI8I|rEj>w)$T&J zl;}*R2a6g%|B6f0VcY-ZAayx>`F|KlQ6_ta0z<^w7VRyB*^g#0Se$b6QHT2y#J3(H zdw^0ee~Z*4F5-39k(f)w7tgZ@IvdJ`y3A@lCRyz)g3B{Q;l1=+z!YfRJEpDsNI>0v`a6vR^&%swjnB^jKmWu{#3O`xeBpnd{PV-$1 zbCKIJEL6V6>y~+wIz=)4qtg;@ra<)}p;lo*T?TuP`?gS$i0x}ykTOt=Tl9v&VLfArbpigjk# zEAm~g6qn*O> zi`MT=`%b$~oheH`=$UD9u)Z)%UJ0sO=b!6mItoXpM%$+rR&TP`PbXU^5`yUbi`>9M zY=|79S*)^U^ETZ8F*kgpoT$~i{zxWhyr3+n78%na>C_9;k=VpwiF2(k28M^pPlN>O zKlucfru;W^V?p2o?AIkW4?fgY&qHq1@AHmj%5$B`2e3D{Uqg{djYb*u$T#fEQHk|j z<{1y9;^!0TzdPWxy>E+7)qhlKI)g63|9vSw75PyK>v{BhSh{ao?7UP}Js~qR&t9sn zd{Xt8q|=lY1`dO?4$_gH^;0;mg_lwO;GBh3Hp$W1GA{=Qs)iR2Q|$8wSRda6BhX1b z(Oayh4`8aS|MU5E2w1|X$nNfudd@&fn;H(6T<938^4TxrQx$W0Vr5%lB7Ku=3aqW& z@_ttg7x9lDp^YS!Xv@y+^38gG5?j@|FOII1Zuqn$L0D5&we!-5V|5sIR;7hZd)@z0 z`&xZmw!Cz0IBUsq+d;`6TgJhwG|%c8i})(_kk|wP&&hksaua9KSlR#O$NPI= zFK+xRSEb64VSOH--yRsDI%a{7^}*bXlN+gEvH?~E6vnyUd^-H|LB)kJK`LQ>Px@?*q_1E^7l`GKu))1~Fgg%qEP|(kcyv6q zW2|XE>&`DORNhJpn7l6Ji~5GszkIOP?ZfRMj{_1T_qJK z9i!K&n1AxfwkXy*LlU?#|1G7J5*r?y8)v70<;Fb-8YJa1 zLme?w6o=o9R;TlLF=wi%$8~vmrmnn;Hh2_$je~n;HUi^zDU(V8rz;qNfR(M$hSzV1 zu6IY35*zbm_IRG#i)8<7%OM=_(f)4B2i;Z);6;kr6!Rsn+y(A*p$$tV1)yq(0!yU9 zOC`ymYS03uUkx5;mAKr;z?H}oNO9)Bj?8A^i5*z>8;=%Cl%&!WNf#O~gV?+(bZbiZ zb5Rj-PUTsNdj2aEIvJFENncGcK6&juKE(uT-F?k@qOPTU?ssun#=Q2JEuck7gHqwc zbQ*YFUth<`KKf)vZ-b_@?Vw$5_6RmzoxM21S7KpX8(Due`&b)1xAOMA7fgswIMd!a zkZYdmi2$OgVjN15Vop`T;e=3lZX%B$S`u(q2|gmxWLeGC$9`-`bENolP2yE!UtB1; zgP!i?exb4RDTYl98JUj=9OxBIGcckWtKeY15L zcl}~DeS{6YlSeOnkuQ0?^dl!>UFz!vPaAEcC2`t67x??JUQnp|bR)v$@ZVD2+QwV* zb9e?&HCfYU``@}W#`1Nv@Z?hoo=qr!^x2m*|Ir5QJMIZ4kQAoJ{kXP=9VYeV{07+v z(N$m}wMmxr&F~xYwBnkj?f@vLH$4cPiT~0H@uF|aM%97mlOp@YOZZaUuxau@4hQ$YT4Be3 zw8Bq^>YynyRvXNvPP7HK(_YPBPCu$QPtPX2#~!ylfun=yG$<`yW4odSi_gZyol{Fh z4qWuIL4AwiCQcL6+e+g>1y9COB#o$(xQ*!=C<}ga`Xu5|^^EM-A0a{6x@*y-L{{>w zVF5HyKgx!0NNg-bR|mu{6AjrYq@|dARvJ{7P@Y-|;>kex(T2G&cB_y!8x20njesOb zRWu+6Rij0C9-*#hqdfI{y{tAcmohuapsw_7v;cR0+<8YUg+&;5E!Qk3)in9LoRYat z4KF~Ue2k5Kua|ETCm!QIaRPPpiSFnOglmAp3bJp19YCTSb%|p0*fV9hWosjM4T8V$ zqk2QYuHy2Egg#@WCXg+{22X>awG3ids7|b2r*&!1TIYF)I+4g_Js;tntIc2@od${o z$=!oXgJ@po2Yv!RA6=WPhB=^AqVfXpng7dDXz5Damyn#vcZ35PVS0S_KYwd4SO%*% zY)+8>ckRWOzcoZ8&zdEN$7M2Q*ZKGPb(wJg%i1g{n$|dPV}1duxBsj-9GYMaCJLZ;E*3J zdN5y_%;)+&YGGCm?~YTMLhEr%ARfXK{~E3vH;_IGv-_l%(=Grz)^t1&i|f;fg;75u zPJtl&J$y(9d69zAEl^7tMsC;%e_AV z*`Q%qmW|FzR>sAQeoE2Gh}RGgq5w9BHiC_!uzTe@pN2{zdx(v)<%6?-AzF1B*S3>_ znPXxCfERX(BgIUmpl#17k=KhPDd(tXH@#ilu$mc{XLe+Ba|?WGR*rR(%$27&!-r8_ z*ezP1P=|J>DJA`-r=Y?3E>6Hg_u`%rIse98Yg>!9@bv0pzP%=}WRJIrcQpyT{Hrz| zjmg$N{};X0FQeS@<3di3=26es?c5#sf3@3}ORfU9)uRAqY@lxK6F@2O$?%58)WDP^ zDe+vpr0|=DLLS!ZepcOgu1C^6u2yVSdG>fvwV{`kx6dHcCE8h%V9OMsF!M1TyX!g0 z@uO|iilg_i>s+#~QxK@%UEl?L_58K2J(O$kUq=}6#I^v)}i8yLEO%i6&_7@uN%Z^g>6y7~AT%V}w}wxT$%x zI%$Z`7N^skuwpO&9cdWeX)%L6eQW>I1Ai#1t7J)-V+><<;0Eg13-2tln+}fupG-Zx zf@h>{hB7Y?N)PuO+Q!2wZjrBQq{UE!@#WPPmK=^u7#QBLPp~e+Y37crCQ6sEW~mF? zDAwh&-7L`;97nZapONN%!H>gFLHmHAxWg=hg^FtPPOISON43Tc%EX@4B2qTp2KoqJ z7kiVnF3bHp3`Zf?38MJz2x?jTvD*73%It9nX*2k#xG<;2<&>+Y&(XHg6M>x z7%}Lt-ww>#|EO^*52vYiW7OiquI|J}$XSVO$q!YC&8k02XAQ#o;)4EG=mgcEXPL|6 z6T65c@E8hDV09Uy`0MefkuOcP#dxShw%Ag~8QD@tbl;gkLxIiyR`Z(=FS-UpIasn2 z1Y`Rl0u+ib>*(5x1#fgQA6bK#ZI*>OmPvIvhL!O)n$P$rzY^!XmOXc+J0ESnw4;0y zSEUgV5!Yvjsvy!bswQ2rmZ;+D&0Yg1ux>a{V>@FC3@RYnpIW7U-)b{mG*beI^JgmV zF+p*08jZc1EX2r3=^DC))_f;MEXejNHAZhi3CbrgL0{F| z2`H*foP@8jvPHqzBL<0!64MmCXtg zp~q2D-$;JQ=_t*uwq*!q;PEN_rdNknHdEfNw6j`p0ehM%@7L6#_!-NN!R(i-KdUm_ ziCLQ7+qVNNYY{)S2L1JVrvD&#n(+e1;NK>4?ryux*bYA2iw)L5uVaQS?IEB-1Tf13 z?~BAC+!eVHJuKh(PN0pwmwcX?W|_B>Q?^W-N`rvGR9xFm2X(k=0h~e%MSp~cBK2~r z3!R>+O~l=_g`qe2^0tM+G1L~*O~|*>DWYo1rGTgtpEw?#2>}_jxB$43gJ~JxFBR;G z2LN1K=y#%n*{s~d{y&*%bS;4!_|C_&D}N}_wd3Qx{I8+9r260|gJQo-!BsiB!YMyu zcfo$)$7WzwsvA z8~(Z^3NAXYnnz`Y{+MN!?*xh~Xi>jJwkC@-K^jzD>Aj6NpmvvD6ZefMG9rfv<83WN zCx#+RC+3j50V_*`F%Dbb=s=dW$&!LGKni9kZ?b8$o{_mwh7tV|z@HShE6=umH)Y0qumMQ3I?Z2pP9Wl|M* zMl)kJvv3-k)1!Nidd@BlQMK~w%3rGT_$h_PMq6(^urWv5u1~S4?|qY3=%`|jHz|#P^p4XFz zz_p%fuT8uBt@cMDeM0!$bmOfU`YbEUN8!0kz+y(ji{I17p4*ikAh>}&$aBNUMYxazyZRz0m z+ze&@{)^`=Io@o|+ar0D{*>DT@~p}8l0&uGn;gC9#D06c$JQ!HR^H7-cI)yZRn)#Q z)M4~Te6G^BZxp*RtTV7?2jz<)h!&oRLm<+Y0(Da0z9H-2gW4A-^wMa5v+UEWB zrkPn~FD@@bA`g_y30MwMW){9lo0a9f%{2a6F<}%+!J&QuC2M8+UA}7Q#o5ZjiqTEx z#~(SRrfwM0)7|PHON59!Oyelk!Y?e1%zmmdLF9H{@iIaAOXn$vXY+K(Dq45k)xHlC- zJ&HpMxHa(gx}+r^1!ce(l+ZmhiIhN6U8jEO^=jXfM`a-L#wK;D;PXNveRx^vEf^}n zh0!oZrqv?UXeFlWM`oSCIW^$-Wa>@HPQDnYy%!mgY@pRGtV%xIBu|euc)`+sAhhDx zUGeHp@#sdc@H$o2%}^e*w9||GgAt?Wmvf-BYHylz;KiWAvR2B|^{$9`>c8q*vd+~9 z&fNzrsN4K4@dkK&%(Q;p1hLz1f%0imXpcfXjZ+PR^F_!=6Ldr7E7Gu31i%vTB%;&1 zf0$vX#1Km!kwg!b3a`@=<`(O_9e^wt+Cbxgk4@`FSrfE56>a_GLU0xE%tF*9jF|E|EKMGEG@4-yv z{uVh(Lg3-AQo+O_OGxs%$T&0bMe!21c5Gbp`9~5Ul0itzAy&z>4vG)q8xeI+#Kd$C zmBvdQlM#?n!-&rJ=k}?tnVOsbpSf^?K7!sWmC;Pij<;eAyxu`cEo_%^rj^k4D(ZNgxDBxnN( z%mns|`dP|C622cb9&3HiU&%ogN)u$(Xr4`XeqzhVyF>6A>JRw| z>Fs^Mj<4Nn^0DRA0{;{z#iuoq6L9$WM!Z7`jsH3&rice>&dx*I|Onw z1}Jd!BkUmN7VwT_V=!2@>o0mgDzGikoXn`yEaUU?coIyb{+kk4WxR8FTjSZ2I0(sx zF*v%motBH$Z-NEKmD*TUWxnzw3uIf0pVO)Hh|%EKer8I?p}#MvB`1k{Vf7>^W{X#>mv6xpuowWQMS-5!fW7#;27eV@v6jMHN&o%BG{rk@frfyP76s zRBi8@pPFYl;i2@tb<#6oX|SDkE8T+6Qsn78#^P5&hQ?@#&lu@!K#0U4@%OuB;`-;I zo1Yo#*htE){~Gj>99o9IVJy5hj9}q+(Gh-vidTYda_Ud|q3Q#*A{DvqXUSLmovCN02q>MhGDGy^VN64xzJSXm6yKX{ z;8jv!y#p|Tst;JKVI8vD#i=v#^0)RO?oygk!Q%<8AXGW8F2D8wYU+`u`D3nEKq~v} zo_GW}W5@NdbP52E+j+kHPkV$ukY@XX6x1GJ&%v8;Z@Bpn0J`uA@N}QvU7hhkl1O?t zUr^gjW%Q0x@hO^p96T2<9^=juZ@LFpPch&wD8bRWV6F8ymKZja2Ng{mW-`m{v>?Fs z-QM?z*Sj4_59RgseDA#rs}s0s!+F}!RgW#=Z}0P-<1;OIYz~8H%b3i#lr#zAc)y#a z0lE0D{2HEt{MZ^1>%dq^&s;2>zV;pyr;}RfX!ny^giZoi<5PcJ1DXMoL-){EKQAQS ze6|IYk*w1VzA$g^rciILj*SpOc#V^HSy^813Nv$)T|U-&*YR3elxj!Kn&Pw<5B$8k zU4~_YaEU(2o})h}m3;)4gQ3r#;B74mX1>|ztyN>Hm%8+V#c#asj$PoBc8Gd!F2X>v zcAvCo=kWz(5LfvL@(G~HTrEoGenOLs2|5&-6OO_Ysb)3S#Ya}#ZMd{OCA#z-;b3AC zbYprgUMJ#tUh0AY@}FmYfQWgkK-a75+O^Y%5ki4ZWFxE7YO>6VP+|2qg}#NdBx3C@ zD@L1prWc13t0j{T+6plHS`>!c!RD-0JPZ=b45Om$DlpNz=($BPzQ!_UAxC4@fYdEx z)VX($;qG_iG_up4FU@9BXSqJy8zBZgXAAO9_V`6nuoyu-YjbrM-~0us*y&i|gt4iS zv$QZWEbvl@yePJ)5ELi!X1533{ktzNE(1;94B*F}1nMadWCn zOJ2N{4+J7#Ccnfj{y^lwAZMj*4w>(V&GK)BKiQpd;ir7WD~YhM5h*=aSQ1A1<&+C^ za-=0@((t%YQ}lo;2Axi35ysOhfT(7$keVcJa@qj6 zGcoYRi_7pdoZVf;88Hnn4$Q&WH@0VQ65>EAjbo;-erqeJ%{^nh`3d}$H39)db{uX8UJRf;NyC~%`RsZ4Y`i4lai0GsG%>; zr1A443%RaFgvP*DlIzEkh4>DzKJy$?2&jws$|MKYH$RdYg%Q2R!QH|Q@P4s#c-h|7 zeiVCb2SkJSz!V<_ahaRrZ{i*}@Dm>YLTA0a*ih&ERrN!v7azR-@iZ)lX%c1~;M?AO zmNb>Zf?m`NE{W{V!9QQBUezk`@%Dn0)hX}}!j=f}qOdLjIu;`P0TvuOSqlb0x*H#N zd+R0)q{j2S?9R@PIH@C70SDU&hpeR!QXw8bK>*j0zOQ%`z`mPFSc8tQOAc`;ptK&c z?U(foIYu%=)oNQ((!30rFZbfpgNDd%yCYUkC@NPhh;KEiw48&elXN1-s*bBG3_FxxdrxJ1diQoN(cttc5Pj4F6J7VN z5Kc(1q8mjgZi9o!1*mMx(Ws5R-KSXv^pAf2ygYyExZK}_^vBXT{rALJp%_kh=w1*WRezSVcg3;~m zPd8ai>_EH^T~nml6ddyYUYL-VWa?Ukj4Ifn=F-R|Iiqtw7QL6Fi&kefU zMMiUc616nlD_3631o+IRuHXh5JDzF*}t(CQihE`vUCs|AIgezHo=JS6pSo}-E1Oyu+eY~-83 zd<5zz+~WDPOif!}Ew?3w0 za}|hfdznJ=O6X zIZS4M-+=&9xl5T->JSqfKxh5?Sl`++z`Yswhgex%SJ%#=5M3=W^#_o`8}C`$Xs6e6 z#zKMy{3-oo7(eRb{v_co$iJ8GYTV&hU1(tLP9u%0mhmI%R*56KVFqMQvZnN&Yo`kg z+vLPO8&E0$c-V46{Q9>Oh0N(=^Q3;Yfdgnr`a#?Ytm?i}F94fQp@tE5^Jr_H7>eT= z^7Q=Jn*M~@7jV4wSn6pq5|F3L{;g^*YjxdSZKd?^-0Ap+Djr3 zihNb6UrGCe0cTGLNt`p86ec+Yoz9(lRuXagPlB|gp*bf$@@^*L;4PG*MeRgk45+(g z@ra%D+AyQx{uy`!!nb{%bU=;&+4vpi=TRHTqCFl`)<0R5^ULx#Uw#sRLdKMAnB=T&fjhcwccKm3nkXeJ|wG=z7 z_z9M({7iOu`?e;IDNuKJZtB-=slSMzhhG`Jdw9M~?fRv@-A|=ybeTa|e23`vp0^lc zJ4QOXCR4GJzC5_`#Lf1;6J(|o#vl#dqoYP5lu<-%869+=IbId(IUu)gm89j|i=6d& zXPgQS+2JuG8K40q52jE>t7Cp@;QI*%2=j{EpS#Y&l@3yf)m_Wj*iB69h6uXBL60}P z>KijM!TYcfH{^jS|24;@PxVDDD{ac)XKNF-xqWLYdFA^r2X|wcDG0L0uHPgk7b&|j zH(F`e?!&v02VESUe%WJ5QXgXjQolH7_q)8>4B|kYMeL_B4R1~UL(R(TME!#TtBDsI zYE7I+(4(}b?kyr{auHBAF_URM{md~VF09q}Ksk|k9ChGI$61!a&!hvp7(1Buj9uut z&)XK--Jgjf<}&{DQDv@&tv07;+^s5!+w{JKC&D%Miq&4_lqccni{o#o8x_EQ3I)8h z?rVR~+r3&P@}nS*eWkh#@CAOnUR*A0Ujh2OpElot3W9!bn^%vUKp5cb=G9p0X46M2 z1+L#GBN0vd@l=VLcGIHm9?H)MFg(fchqC`-Q-+wOj2 zH`-&iPbBqiTlM)g2kopYv7@QDs}Gy=zz`63XLfe9P~2-Pbp&0CtoxO)0Ta>)w_^4W)D~EYpaffT zjSFO?zF^b5DY=Av0oNk>+F5CL7DA(JhlQ9{JQW-#P~wy|q0EsMERk=%vTcBEyM_IG zwJa`X+$a8@tL)3@rUBh3u7nx<59*`}*z+DG?-Z%|$e4y*l<$wl0uVqx!Q(z-p;t^w z%SYQs^j$GxLgfxj$td)whOO1XD-1cX)vGH7Vn5@aZdW{{k;O}fp>HxoJCeCdh!U6U zd{0a!XN`W=V6kWA0tKPp=JJuL9Dl@_pRpLDZc*rBZq`(WM->|%G2`D=*qxlU9{;ry z-h3LsS+o_81eAAr-V$js3O}8s_ipO>K7ojqzK=MdiiZA3^I{>ClKx5S-A&z{-(f*+(}WBF2`)_wZ8v*p-$w zn7&bFgmRp%3+CkO>u>YwIS5F(Ar$S-_z={+Mss8I5CIMQY4&ns9NPk`M*Uz zN$-8gJdbs7-XZ+}pdS;if7?#xpTr^d?}0i&-b=<5u57)p)#9*-4FiYs@%Y-g1B5OL z@nB^Su%f3}_BV$&>fEA0NwIFpXu1jtA7rql%-Fub*4hr6$h9@e9|_)90g7_Qc=ApZd$_ED;glZCL_Rqd97zNb?&ll%xz1 z7$rRBsSVy_SEi$u*ifH`s$BBe&a%;(A3=gnb-^tzIK6OzU3*6Q6VK}H&W|@czX6&k zIv@L~oGAqlEWWp4ifUyq(jb#A7 zEj0^K3NHC(HI4=R_FPH@bNAOUGp6V(1Ez=xJk;lFt?m2s6>Vb6alt3ja;8O>%`0jx z|FvA;$IZ^ky7!k8a)hS0rmm4ln08+c>DJ+2)L4dewav1I1G4QT^_d#NW?hS}Nu_0? zpIo04bfp84>`p|;4{NH-FB#Rw(wd^tL$<}6fH=Jyc{`D`1(IgCav0vI(BNU;N5a()9`JOO*C zXChR>J`$_j%zAY9#1y@GQf{M*riI8S z1vWUHW0MARfbM=;#Et_!l2N4Pi>RVrC2g*D4g2fnAFR_iq5Yo036*0!wv2z`7rB3tboURMHgn ziD-=!7zAWO=Wmo8EB;X21#Mz(qz z28Mc@YCh5fn&0W8j;cW&jEKEt3SZzN^9+}^b(Z4pevAS!NC(WWfRY7R3BZ$zzviNT zRrU{SdSbt9G(#Hf2eP-2M+Bj6!&S@po{H zlZtG?F9Y%J-(BCDB=}o~x`a`i<({iBae<3|&ga0IaH&`a)2(Gim$^dlx38D)ECy&O zorN2l*T*{GAk_}0Itj*Fx(_qj@{3g{j@u|TCIrh~)olM%{4D7N(U^d_-0 z5@_=Cel_ZJ2uuMBeQbe}9)X&G=I4RXhPdlz{(il`R5OhAy0-!3F`1l`9Q-is>k#z$ zSUZ_tdIj~{8b5cL2neUl=pvfYdF5B*OM%<}P|cVBR-7xzz|@TPdGl?(y#3d{;)c88 zhe09QsDYi2{Dgiim_y#T&ya!ciTVf+Bucoyd%sH!^o(=XE(+1VUA@>}a%u7d zmm>L{BY|D4h@{+Ew^xzhCMM#^)&?WFYbTmNU}-f)YL@^{Z^bjEO-mrTpC~%VXr>uE zqpTlF9ESyO9GOFO4-O}2YEjeg83k_uw>!5ck)Gu7g=q^ayXHgp9@J~>T(DwU?(uPm z>6u;dc6q`a!J#SCOK;15Ck(uYLGkhrNDNKkVRe|WGI8VA>u4-z@mU>ItnPo^#CVU| zf*O>^L?R|F(hpZU#3rfAaS;`t# zIPNm)p7Fmlf~@G#3vRJph_DWqBAK~@Q7Oo+WY_j!&tZ#L!DrsM{j;B>0Z2#GL^)l! zKK?>x>HI{>ld)5qNM4%6LI!T$0?MuMFR7O4IC$ux9u++AE2aTR}## z<*>z9_f$Uv^4EyHsBmECPM^{XV>bAEquE2v2RTB?|KwjzzJ12{RV(YN0chO|4W!!l zn5FMS#~6k^2skv^Wjeo}nC`!bGC+(Kf?&fzR6)auVbHSfX(YZL;%qs~=?Ex&iTYEV z&rC=MHGP_fG6NWDZ3G7xlQZMNo0e?W!O=9D@phBbWAQkDm!CoO{eC)h3%xb!e zU+^-E@R5lT6b8A1sR?|t+LgPysyEHXtC*xQpbfi>8*gXoqr zGz{&HR_$m1NfZbuq}&AkHq4$~n-i2T##bt=HXa=~u}JaQuzziH)D)3Gy)t>(P%?HSE!|z$Io-WYmg$f1#;&LhVe+-m+Xp6mQkr;_iA1^I$K!s zTHRe&VM|wQD5KdhPQ)%F7W3qa=LM3bh1&z4?kfGvBxu+#&hV%MrjDQ25Dfa6?aSde zKl*nml%UaeA2ga)E(+(Yj+9=t4{`A?Z2z!JZoiyW7bqBXkj6|GHw_h=FN`XM$$##E za*0pl+CMSmS_X8{e$}CF{XVR%B`z}BYmCdfs9III4{*8#LZtd1onob@cd=L-zenxH0CPH+0^-VOv6<|SsCPj2 zCW$>aopHnwIo6~K`L8VUvz*hE9J2olS3s!0S<*1QnYl?WotZn#ooO0Mzzm{Q4g5Q8bT5>rSk0{(q*-^$G@R^;M7O(x_m znwd&(D|?Pl$t8&ybUG^7cviQ^WHpD*;JnB&M&bjh5GfjJ*R+pNou zs1?2C_Nx^WQeJg#%D^Tgna~Qh*26;0WX?S>L!c)~?*N&F@{F!jK^zcJ6C*KY?NSA2 zy)f=Fl-+(s0kMroph$b+j$?c6^nSGhAZCdJqT7lCW=1BX(~m|`Uogy_(J1DX<^M6K zIOR5sNqX4*{UQ!z~aXJ(B=U~Ok_Usq4JRv)el`h1zJb+{47 ze0_90P~z8QiMnuIIHIBH^+4N-&OWXE;De#Yh=~dTJ-z`GBud=@CVK7a?d&KB)xolL znYbUqE+;ku91v1&QCcQPj&Ir&vvY}9q`9aD88(r1x>Jc`kAymei*3268(iA4De=ZC z@nrT})7x`EXM4ZMF5Z$CI$_ei~XMk{LeT7z!dNwsjDyc|7niw zjQ_hMo*n7`>wG2k*_dA`PF8LG zH2+HcR-+wcWs?c?;14cggETa{9?|1DD{JaWGN4cAQ^Q8Kz_yHEYWsooxIg^A#d*<6 zZ^W+_r77_$q(y?-zM?>(&y6(MM(N$D=_F}&Ed2Q9z-_uNh$3txxTNIQNX4(wplZQa z__dzCHkE6cJFahvE?QJqhxT)C_2Jz4Z1-oD_tZhwKN#wi}ar_%Svw(l)XiTqwY(@7#yW;8TR@QU5 ztT~*|8L?O(u+g;5VM=2U@|Q89=aV^qFeqI-*>!Y=17gp=xfsxxnMfFE?|AT^w|e)s z{h0;)&o~0aRPtX_ar}pdy5^n!UpwNNL;tTL@vfZbvbOKOs^@Y!M_?z$0QvRmnM`t` z-AbkObYc~ZxY$j&qOUOewxWf*=*+D!S02KEVaoU*yMA2Lau$|_6?bFdVC9Utkl`Z7 zUDU9lVh-g?Df-$+9;`gbwpULya>yUm6KmZS1f=wctlL`sevWerc&P; zS#E7C^=%PLtqtro&-<9hL1Ew`8()NLRm~&?5XHR?;D6FqHU(0*@TU%zDvle>h1qL8 zhjD9Z*NaOR7Q>&F+7|bZT7dKwihH4B8=kZ0M3FbkXNLIS)qc+48VK>>O#Q#0#?Jen z9q`P4|EGTqG$sFE9RIbcv2iE=zaySm-T%NTn1lPDf03IMS+n@Q=dIqG9r4T_{--Yn zOvV2Df3cmMCk+0#Gnjn=w!(Vdo`xnJ*nRtdg-=dIS1 zw^~!l5J=r-AVYBR>B>QxVwTjZ4E_gdJ3CvyQqRo!|43ugPX2#~JQenT z7MY$(KU4DmMgCvWy84El_8&Xq@i6ME*K}dNmNh-yK=}nLZ;s&W*z%r%?hei?RKU9v zcL?XjVcIqL!OT0BF3p5Hm85L2aC19_dctT5Z5^>yUCa7nUEN*%lN$8i(t<-^$wJ{L zlpHiYv7UkcH3R(`WutLgm&s?~Z$z@8bVjQ$$V4N{E_IV1z14fNBcBTJKZ{7urJt$b zznK4zG)L=q!vBtVrsV%i2mojekVX#}Tgn0mK$YYHPpnc$8h}bMG|@!&OhZpFzmMf= z5ZnbOSUs?+zY7M#B0#Yuk=ulPAN&)xjU2n32K-qA`FMS>>s6gRXLvbr|>o( zf`3Ni+kVETfd6PiU19#0NHZ{uJK=u^JTr#wkr*)I#I^2nD{y%Pk5Htrm?G7LCZF;zb=vb3PxT3s*v2qoXUBA;cq)?4u}Nu^X7bCW^OT zs2dnT)*{x|b!aDu$k7^&5rCAb(p8k-0wB^y;(fhl4Wkm&)^rlTOw5O9rXBIVg^OvL zaDM~XZ=ntl3!omr1^_0W)d&7tIkBej4!TpTypX?~b|M76pCm67*Ai*PCu@QbTQN>+EUjaUScv<7E^ zTZ~O>5g$h_eXCLMTl$ot|FC|eMr;@sSju`BC?Yd4t3IZp|Ba2!MgE`7(dbV4zXP5H z^K0{VwssgJdr#!XtTd2vQkrY_gf0I}>A5lIZ(uh~fgk}fI;Hc&;w7dc){;g#01bqh z>j(1M;;Oh2c#%D3Y6MMFIA#o%B6I;t!eQNJJu?Q1LGC$^p*rUKS+#&2po%pR;cUPL zV=$q_Msi1(ND%4b)_qVi#$^Cg&^0IOU}K27V$d1B9+a~fj11LaXv{fHMQF=HmkNz2**o3g>+>!}4=U=TWw)I;-wk%k&A z+Jt{an`^ZC#rRhPuo#U|{Hw9PMr&%sznYqAwB|+lSM%Z;Z84tf!NqWNp;sObc8VD$ z0El4ilf!y^1M>{P4BLe%!Ex;PYSi3li1lzl&xgjk+)^MwFkC~Cp2`A78GsXUqG0Xq zT$URO%5NMwN_?WmhZs3b2}Cqkx{5&-Ubi>c$QtNc#Z0viw0S(5j`ab>YT_a9tHc7nir7Sk_E*2X0iW` z&5hBW`@aL8O8Za$ovqNXJeBu98fhq!|0B%}JL5m>kf%uguXhvxmhDjmjF7x7$ufqO z1E~f?`}!8(`c2!=oam7O{~Brvb>^r$Oj)EjjH56p>Z8U{8XJc}oEIHsNI@Wf0h11- z-!|m$d^VXhhr?J8jr=%29ms__Gi3-~q9Qz*|)Y^Ji z46G&-in(cUE*~EWWqKlk_YzimIod-8XqmH8Dx)7^G_H^umw;awU}ya`B)`YUEED9O z*1@Wjy)h1)R@G>n{sD$CJ&Meu@ZoHg1u&%uu#8SasPxHWo~!bGf_!HT=SM}Cn$B4b zp$!{&NFzqkRpFa#nZyYfEN3@mzrq4Q(UH~iY_SzIv>h==HQ=$+ zIdjCsyYPxV!`|AmYYK-60PUWJ2z`+~yP7)N%46j&4m0mv zRbaszWiV5mqA?@BLH0NO?sO5;68mzxuH2KT!d3jmR=|A^ zh4`;nT162aG2xQY*Mf^)j&u(zC`ymCeL4YiY{$g>rlcEi9jv;TsR50Zf zXZ5v{vz4|RZI20#%Jwz}NXEgn)96jy;d}eyMl=IR?!-7=_PRZ0%P%4f4p*tfBFZo2 zmM`lzUo@elWo1I9u&yZyE5I|kL;{Oz-Mn3zo=iF*1K8cr0X3;$Q?^selUU;%gP10}DJtiezMBGEfQ=Fy%DG^&V(&)<*)~caSeF?u5D+Vu@WBgmHEZ&u= zOy!DdW0US-u?qb=*~ZeO{&t@l8!uf4ZxO@9k+1yu<1KLJ=nn_H@ZWlX?2qD{y4 zV!HY|`v=x&o!x7@dV9K&`RHjQ(i2K3wM)?*!N)tAxM9 zsM~f+S8M+8SSI6FFTA*Au7`X&UgcYM7_ZjCWc^?VDz+u~J}-M6hM!p@mo))@1pH&U zT*hvxtsMnu$PeRzt)+IX>?kt}(b}w$G?0YWCam!^W(2R@SkxU?qE2fxb-LmjB#AR8 zh#NHkMN+P5%3=-EjET>!T9r^*R$-+CbStigxB#v|!R+1IVyY|^gtMt!)-cr1*y6Zu zg6yFU!+*uy28+d7${ZcbkqtpO9QKg}5s2~?Ro2jp22o-giUtDT(XTFHX6?dZ01`8@ zvNqWDrnnbpHnqyqvMh&lC(>3KlE4NxO$i9I! zoxR*T;{D$KK5SjAa?E9J%D3Pc5Eo5U9YpD-JX7o)=3EKZgGwDEKlQ? z>>FSS_dt;75U&M_^s)+8D2uP0TS}g~re*YK@B>!0})f$&fU2eE^ zxx(2y@PX`ej97hbsaDrgBz<~1fSHo5u!$BpOW>dVv?_6zU(gtB!4j>y+AKA@vZFy6 zV2Ux|LkvE_e&KSE2D4}@Sn>}Rw>;}*DH>M6K-BMqX|~69OqM?m@X7h;yd;Dck!SGBF^)BMss(s?zhh3s6S zHC|mEiTDdz5PpoJ%Zi7plx2oL9Ioa6Np-MawpH;Ym21miH2DG#Qd%L$eRNhQ$9pu~ zW@MRQ@llv#W`o$FuI{xx2Lcy_d$o-nYzKD8xq9(RNzU6=d41C&;&QmfwNQt90ENKO z+e)RYt34m-bhd`Z%XEO(MAL1)eA5mq&9EG2M>`)wsrZGAF@Fwgp%t2ct!d}=q}G?q zCrnF=G-?N#>81wYm=_QfYSFq#bMctxLo0NHB?euoht+0!#X%Y(621j-2ES~eYgI?A z|ByAEt$0uaRULRkRpk(Ey0BvZr>b67qcGrt*pD`dI0}C{=bvH>C7*2@11cWu2|H(` z0^V+`o&DQxz(ga~M6jl9>tQiG1#uxBPFv%E_}u*z$0iiwDq%boZVzNGS6tmgO*{g%P!;zhw(;Ry5D;vKpHxs&tBRVueN+`!lzd}B!7$qz$zml> zUb#cZ_(So^dG>R0h%(*P_d7ro1TxZUoO7>r{!ZAIW+-3`~DeV6mBK5`bADWwX z#(&-s&%c)a*WtF6F6B|CV|LF`BSwBabSd1b)%#NVrkEa&i+6}0TD7J+4H&wFh3?xq zQvO+%mb3s*kZ%Xw8zVZfG8#9ECI-n<@^df&>vUDPteFL20;?wX22(c@KsPwA@%JpUpZ|$OUmQ zGE`ClizN{^!RXwPi5A3rzn-4(msY~Mf)$;WYPCbCTrEdm&Fw{oNSe}wO(8KiL(p+Ag9K>mw$rE98Kv#zw_xmev&h;d8ky5++|9k744UvsBo?2v~;r#M#m zw!cM*YU~$m5WF1pfV^Kr#e$|e7WyT=7QGyeLyfXk;H%$xHROKv6GK;G1XDLx_>R=o zWoyt^WeD`wB$x6FgIskKeyQG4TJnx@khqK*QCir>YjCzTVX3aw`G;y|T18Whk+-e7 z=2#lfQ9GLA@-S4el%fm2G-cnmwRHO9p+(e@Y0@%(>h&$(OkZ zMontMioIyAa}~F$H2vpf4|CGNyxIEy?)3lO5l^N4Zzn-FOh3Zr?3utR_`kaPNOAn{ z#-_%d{NE0EgdGY;#4eEo2a(MJZB5qNXeLCoE>sqXgF>H^rkxA4ty$CA-NBX*vDG~t z1FJe?Yufr(DyAy~y}g~?{jpVDef_bHuHH$1P$u;tyOBWolC_`WDB^aEbBt18o=@?? z^#A`Ew|lOhO7M@QHwC0NhT)CiA12$p>@(?O3i!uh-$nVqF(<%I_}~5yTARrzInsbj zINDTz$3pWkO!$>F0vNDcTe!J&dy};pyc%$V3XhB@!hlT16Tz8RrZfX6e#o8=>h0?9 z)GAbW%;`0MZS5T0)oaPoTuK{+vDBtaiUB4#+t6rU&nAXQQ%1uR*m3&9LmwQn5A5ma zT7HPuzp|@O!*m7OvO~0$n9(4lb@glTvTdNh$Faiiz|XX2^P!Dx=zcDq*>%5gGn|OY z+0|WOj->HkO}e7=b#<=*GPDv77I~1&rpW^Dmbqw>$Q1^qox?`gr5A2SctD~$Blxd` z|KsH2J9B(r_*BOK(FmaZBK|MhxHJCij(8;VMfT6+kT1RSZ4rDkKE}Z&iSNTu7-kxy zGstk_GVzy>?3N2CMXbH8ePw5dR+f@LALy!#xzj+(p9rj2)w8T^6Fn)4L>uVq zj4kh31#r=)^>jmNBaOm;Oe7%-6sDT&r%VzyHye-uM*mrju1S70E^X`W^lLOSt*^fq zfKT)H<4tPHf@y_>rlFQ2LuRe~=om&)AI(BP020Zh5zlE>K9|YoYDI85c3I_j0Dztu zaX-Z)ai+*a=+pe&J-w^jRxMfEwrT~u=~&Xma3^*|+hR9B{ zou=d0&3hRD{vLaXIjuV>bCw*udX@b1fPwC=e(}Q(<=a-nO8G?=9Y1U%G}ApP?afGX z@YBoKKsSuBud^fO#J-vIC{Q#(iGi*59@& z*4f*OHH*>#1?lS6NbtUlXUY77OjB$bJ6OsLY*hzm1@E0X*#Vvc-V5=0fkuh;viZ31 zw-z_V6cd%gvJM-v$KeSlKx&LR6|%Bq#Omoxwj!qo!&$hw=$uR{>mc{euOSD3i%-kx zZmPRZ#WN~j#uLPgi$5N^<@uAw51VW-IyY!k95)e5;;t$i2a6~9-YHde#CZu z81Q^9Px%{!3ny74aWEZ`WuR_GV;{$qi)8wQj$0V6n0))*3r?0F=v3>voBnzgR1eUDTiO{bVsJ3PqgBjd8hrItJjq7a#>e* zTkj#%rTm2D`rP%yp`VXPp%)HGqtf z(9=0HKD|=R%i5I-k8Ct;a~KG4ZlZO}OeBo77fKyyoz@adx>j;^ftuvg8`9QzI+V%k zqbc34uoWPERNAObz`Ix2sD!Blivp}x+z#1e)_92bq(X}z5eX2jP{>LqLUwKf$T;Sx zu27I{M?=ODdA-sslGdmRVipXpLZLjW04sdY8VM)@8y>>w^_7;?9@7)nc%=e-yfFqn zOkljVu|iogo(wS;P^r_5h5TMNq(k|!O6v~`8k%Cgm|ts+R+<7Z(DAX52o+bMpj2=R zeNhM_R!ucLfaB3h$3t{(03%(Y6!MiD&1??l3OrUNd~*+ zQ!EWm2q;qKk@^&%VT_E#tE(#%Fw=zMLYa7_9hNK3NfxNnN-K`15WP%boMN>q0tsT% z&~QE%0?HDS!49Xc!9EbKq*-!h^P{7vQkJfL%69j{RMPjke^uz=D0M;E!j_FxNgdR zLJ|T;OallRW-2x*4X?y}1!|YHrH$(o#G|5$1H?+5MB)SFAT5HMB`m{6KQ{6tk$IK?wV=ET^a}-HV2?+utHl7EAdT^O7zF4r24@`3 zj~;0zlX@+Z^%(pL$4AZm%|vTsV`KB8*;H&=+}KbrDz+tUPTe-HXUWS8_%xgyhGa}m z;J|ZZNlZ2hT#TO3Cu}X`bOs`Je1oK&6j74mPEz98NJCwuY4PIv3fz%CI+`^`LBtP9 zAeha0oBA9itUO>wAShPKauI*o;=pIY<|e&?zDkyab7X~dJCx2RlOaj=3E}AJ+!S>I z7vr)jY*pE!8z~k`2yY{Zh5);pB^2c#+Cmtb$@(=-xqkMTIim1L(W$@=S0iCKDw?Tw zC!a}@t78I}F0t(sYMydJgsDTgd($bXPk#c#S=f^?qZD$P;UpGKISH3PYh^CBj1&V{ z%|PE$wCyE58)_xlJj8Js&^U)I``ijn60u-A#wPN4CD*?Gw(gF$-VQAi36}X3L%mg3 zF9sX#o|YUnwU~<9>f9Jfpq21Fpw`8ULUgBBi4`s=Ss-OjtIDvMPK0t+2sJ`h78Vyi zWGZp1g$>}zVnR!8psF*(F`LUZ@oB-qIah*OXoPathZNy2h-Az#P}@u{mwfw6DWw^E zc;s7G058!Y;P*rej2VXpNJ`@@hd}poNWvlwT0Vmj9_Zcy8!Fol;431;8;wwqhz_&^ zv=z~0LeD119aG>lpe}S%ZF1^>VIxN&bWx*{8`INT?V)xr*n+snYW~D@ED5#n^y3(kbJ- z&(ls*qzT#)!jc~GGZXHOvxS4P$=J<|o4MqK2%Vdtr~?%II#JjPt{Wy|9Zhqn zL8ARLZm6*?+6)chDVdwrnq+I+G`V_=?;xOQ<_+z%7WO`s?7tji%WX6Ot8D)jX^upT z?Z4pXPW!JN@GQ_eOj~FM5*jK`Sk8=^ka~bbXv_LKwE7V6S$HwM%8VOn+X!n~ zpJAZqJaQ!I3Csn)fbI>oc0gcRjFpdUk4r~f!X9m3d-p|yyM zu$J{smQmA=qoBj7rq^row=K*OfDO>?4NiJ&rZt>C+oxnyhEbqOl+qt)W=_oHlOy<-3j-}CJs<}r8SOxa1AOYQu+inA>)GR8d5bo#6!XX z8tIK@)*^&oQFBkQAC)KEBMva}MJ7IYX;MyC~O?{~Kd&Jv}E@oXHXiGc;^wsM$9 zf@}boM?^A=@(gEwqG=c-BS1fJ)<`(m02b#S%4cW{IYS4A*&0u4bQ$4`>uFp_SbBR5 zxIMD}k}6F#trTysp#6?jgh|4F+z9*B-N~@Cjm>eB@Q{Xp`zB(B>D6n|{zEgF>6OQp z7NJJ4ou=)}W30<0vk@kW(?kfV!C@n9;3V}VEXp#6Gp(UvDT_(5bC{F%(P(ws0~Gju z39Jo#KrPVv^>q2Xrnhr>*TL)8(`t!#eFMws9h{7CSe}cP7OgbgAm`L3SwxxyoD6ZA z$=rv>2n&5g9^|@`;G`rd_lX$Z8)4NLys)K~7N6%j*E@s&yBm4T13b?l&udL*JDQkB8jJ)S_cvXuwWV@p&Jn-H3#ql>@SuMdT= zA#wr^5qdyy5n{PS^FST*S?X38EujsjPb(M#6tsqOgd30^n;pWZwZ1V#@vELB9(814Jt0(3 zXM}n5MUHT%iBj6C;Sj2JpwD{^djl5U{ zVZ6<>VVbcw;>X|= zF@x(JIyEQwTxPy?jBSXc0J`DgapL0&ch^LPAf7x*<7x6~beLFV!DySx5!gTw#ypIM z)p$x0<_M`Cc}U9fMHH6xoDO0LH7}DWSQ5EFW(rVlmV5WImwX8<4yCMwQ(+6?qGjXj z4WfvpwjEhv3x+=pE*4QJwT4W;*g?6~<=Lg;Eq95ALN9pl30tNq@g<{4Wys`UA`YjS z-l(9L@*I#DT_IamG$vCqNC#4fN^N`0$^+LR2BoWfxw?CjffG%xmT8x~jDt%;g%spu z*<8P#D%WVhY>kl$LZ=eUqzi3dG5VkGap&DHf8=L)+}R8f1xn2oD4n?=Q-&#UJ+mc> zDpsr%Co2{XP>*w_7|EcNn=-Vdm&cdC}JP2AGc+@m3a$lMA!yqvJi7ohYX2f-WB)kP?|G7u}%VQg-pQM^o^F8 zfZdOic9=l}7v)QkCz=d6Hyv=G1J1$yo{5KIMgQK&jky# z6++GfN(>-$L|(wbu#VtnNgEyy>*8~rI##wtD2RS+Ot;C0J?1PMnq6l#Z&n zS|wRYdN>41wyCY@fvu(7B=mjRA<#j`KzlzKR}e7h_?0_gDG$5sx}U=bvR~Nr={+C;co}7*Uf`6n~T}Scsdk zQsKK2b=k>ExGR-8nNImNgtw$;R!0{=%G%Ce#+Nb9@GYvq>t${IU8^OIR|2p&5TK$L zQOytNw)0?^WuLaL6r`-fJYk}!8x(5Fq8L^?pw@KUgZ}7T+#@uJ{+l&Mzd{+M6vDz@VF~77VA?a9dl8i17l+6gddoL;ELO*xFJLZY4s|N z67SE;j}k?OjK!K8YQ=-Ai+YZs5aH7K@*~G=?w&9M3pbZ+%yE&bxKLW9o+>R7FOp}O zO2!~?`ti5(g%Hk@baW)h05vY|xS$7zqj4CMLg%=-eKi{@3{d7M` z^xC)6uHxV8nTGv`cZX-u#}x73nj?*c@js){x~9lZ`;Q&){EOLtAWjnM1i;H4hKucm zS;63Zlnj>mm@(p-{DLedzb3&^%mRJh8Z=+jZbIo&#pBo{%xLMX*V5ruc;BBXwi z&fP#YonaO;Yhu6zZ*pd4&fq_Z@~Yu}gxx2p#?f6{id#G>jvymFeeqpUq#kQpFQYbDa zmZcgLjTME8DTwRhE)dq`za|%MCU^CKYz%oa4Z|Ct+kZQ3SqZ1|-h8@9=}kg(&e2a6 zms5zC&uOTYyKsEsjc)oHT`rlDd3u1F?sgs?#n4Clw42~-+SU> z&5=@5J~9lK=tmwk1pmX<4GLyp-H?VzfI$~8mCbbC2zYgJ5`}4^E%{DhPexZ1;>5+N zlTrvlsHDmq=z;a?Wbk94*4w$VEODmsnc2Da!VUiIJ>xV6X{23v&}raGV4LC-PbCzc z_4JRvD;PK+pfu)zgDFLlZGeX&m{12%P{;)iWnq*;CES|IL5tD=9Z01;zc*S2eG&kp z7LyAjAV-$kA>gBQHVqgmf+H_Y#77PK;&32tHzi_yc-Gks)K|!#l!~&)UM_S@_$nxk zw=*Irhm75Yw~%beNimnu>;WmBo!We4!4lln-%)55sX67;{gltCyU~>SkbRucER!@qFC@q&LDMD<@`)gk@sMNsp)~%}% zD@Lm&7K?iihr`G$lIf)7h96WI$$(UpF?B0g5qBZvy^a^3%1T8zl|K|CRvM%HT#7BG zMRa;|dG<+FK`(}m+8)*ix{Uj@rr~n+zL}z9Y+3fj(-(K?0v4Tt@+skW_*(^E)~Qt( zC9|&%AOnxkE-juNUKPNtP)#Szmf+B3+3JjJ*e%TnkA}&%Zb6|foHTIr6)ddWYEnpx zLxtoSS~v)Un0SoCd|u_Rt8oU@;xg?s4NAQ8*~WscUZ7 z8UJ}lJPR}@-g65;ct|qPE#64CY&1tC3ek_5tFo1waIEKqo@)`ob8BV9*;)~+uvP>j zbc-u7{J1|-ALXoCGNN|u^(b~yEe3X04Xu^vnQn_tfW8*-F_qy)o$wjLW{(K3Xh|9Y ziSbb!XlSyZCylnkFB9J--TP!Z)*$7coc~_!_ve2Tu z^M+*GLViVK&Rz^tT4lI_fXR3ul~BVFDn%!YM634I7$^YW1%-x0nO})Gnasecq!@cs z=2&Xl8c9-RKLf1>-mr4-YUs^r^zJTViN4*B6?8ibH$&4*u2E6S4%TV3)3T?vP)=-V zzV}&))(*g?3GevA-sE;AEISHJ_NFq+F8R%+&cmXBQD&GA19TQ;5kq7JiAG5 ziu=c?>cL8-m60J;^EB-YWDd0%!P4ymg6{6e@cvrQ@-md-Eg09r&A5JVQRk%>#X}C? zk|n`o@-MI?K<#$GAUrtOWezkyt0mE**>O#f@xEmgaD=tOyb#_vt}d^k!o4R6MX%7W zR=HeFmByY3LbH<~WvkoRWYxbw?z+KbJ8RLB_Dw zXXcC+H(n(m*8DJqVv@NCWx$WMB7QvnFcK|VG+Y<1^Yu-@uaxvuX03-97WA4n#*M5` z*tck()YibLVQekh>aPA87@=YK`tljPWN1-z0fq+L@XGu!>Q@iP+)x>y4L%<%Y!^D? zCi0vf%h%>a#st%vA>z zczM@~Sl8+`t2!|wQ|zFw{*|%SZC%~I1;WiQvt@C7DcwwC z+RH#w&{uhleQw$2ptigXc+igdKDjiSy5?HYM?-ZYu(i15>ST%8kJ()m_nxZ-cPXMB zh5yt^hqj~mCGI=^QYv!#cU(HE*uX{W%T@G|Q{I?0j$kDt1R^GLqLxvN7z~_l<|c$V zZQ8t-qz4Q+yNr?Y&~i79cD&9wI5@8s00c#GPq37T*NaV4Kmj!Rt>Iqm8f}y=aM-6Y z91aJeiwVOG>Y&C3MlMx^2SztPaafba2xC(+s$<_xj!TfVMn^I9L%)b&9P?8G%gWFf}k5? z)OG>Z?r=#3>Q!-@^buT+b`0dL4Mv8Xs5MeKo8%m7DU21Fu`+pd0oIcgnjnW6ok*7} zKmgUYFr$Ft5;E;nT{LzowC-y?$acamN$Z~L@1*gO>0+MN*qT{Fft zQvAvYr#xcZa9n#49hzL9<&n|N6rpNkBQ(ORGK~940gLi*1VtPKYAH-aVzmWxVjtdN zW6Ts=?vle0oo3wLoZ?)qQeas3jOn-r8$>+m+vZ6JC-89>D)SDB?NT^?jGmg;F%1^< zy=Ede2D^(VDK3%~AYVX~SUB0LA%)lu5Cc0{ak>lOiI69#ixfvO;tYS<*fWsqK9#~dLxhjYS$I0z#V3?se84FuS;(UTOjmiK=2{0-#JYj07Jwuk)b~@>o@|WO7t`N;iMVY+SYW@beWy8>3&v57~`$C zH5h_vWW&(UDhoIaZCKA{O@mR9sSWw}>&K5)Enz(TRvF0^bjT@!>%@9OGlq#f%av zg?tdjhR~lG(}+{h0`EB#A#H}O9EK)=&lu%Q-PI6QM<5dG$|5=};Bwt2SLmFGW=$bj zaNU4Kbk-Yi4{n;X>SVnxPf+2h11dq$A?%5CoOV(ibAW?99v9qD8$F~E^LURrGO8I2 z8_09>f+g_%r-=a(sV}LkP!VI@W$TY>~RiBB0$8_VHz`wJmF~-gkwH{kB$TK z9-1-}lhNZbAOc3FvFL1t2w!=k>mcB@OuDIE&hUXgZ1zmc&+mU>h<|sFSlM2%M`P-E?Ffv?x zETv~R*nU7Wbd-Xc2;m1r1yDd9!!V08yuq08kkVlzH;!?I&78xyh>3D2o{%=6j6cNZ zK#SC+Xu#@ZG_-6%z~|(NPMiU3Qs4s$38i9;fVdeUmL%F(7iws#(^8C*XakWCz+iRL znl>U0;;ro*gN8Uw1zaE=>&7|_#C`FFiKLthOR_lJ`Z{dcN+)2S2%!0OgkA@sw;o(a ziUOsJFkBQU*Nt2*PpFgEP>3#uj6UPU=qV8YI=cGk`T}rAI)^stS?I1q;D!u{IWkhw zXwn)6(52Lz8H~daPy}KAu7gkPMl?06=9Y{ zj34E9ps?RgatRS<8 zf%YzuK$`l4!{j0WkxbJYT1N@JPXxx*ks?S7U=q%TaC2x;xDFPFQm6shZwxij zZ(6x%U8Ft)|7orPtT3D(h4*l-07n`%+NMQKwVRq6YVh(kzez)pJe{z{ZTQQwH`O?~ zuxo%B!;~nP4+X^_BKLmH*y6aWXnHRm2<+DO2oj?^Z?YHI;E zmU^C}F_5g`N-b#FY-B-B?X!?jdN^Zuqap~U3dX>Nq7%=pVGh_)slo{|_JZxe!yz~% zz*ZFaQzm?-aU30SAUlk~TbNe3vLw;IapHti2B3!e#=2?;6%Y?q7R9+ab^+l+(@4FE zCoI4?c7`lt2pGmxAD%LB7&stZNxT$F_j zS{ehd;+)(lg1FdjY&g!EuE?DsC(#X>2#dj5i1b1YZri3Zu{`tGjCWbI7>s~?D0mXl z29qD#%>kUzSw2vNc@J;P^pP0z!b2ceDy%Kv1|kU~LbjOH0prBGQ&dzHy%8mlffh|X zaw#%aM$S7mY$Zh|0aq29M%e&Q8f_Lf=KvnF)(-G#l(tZ#tig^9sPb>jJOJ@VxjL(Z zw5Vq}S{sO;Naj#o6bNeYj!>A1@?{$wTNJm(-3&%7i0Q*fm_jJ!6jgJqtfV$g@X|7D zTG8kTX2v*%B+V3;T@CuqvVWE3LfEtq?1%%&I$Q- zo49oadC+pwuIOY|D_Wd}qP4Vo)uiZ)&;s#4#5QdV0f3%Ly0wPe5#yPC~~NHOED(HetGs6RJpg`Kl9LT}S3 zwQT|(o#sH$NKUk~#o#Jfp8!viW=FbRD&P(A7owE_)Q_b~4J>VihGAa;+G_9!8{Cpi zEl1iq1UM?=uqa50VMuxUnoKELq6UE%ja;q8>t3SXuqDd4H$qwVvOEm^uYjQJM3eY0(lEGh{``otD{1I zxEKfv)wL7vw;Xao>_7DlkHYS&aoA*1j9~*^3<~%Tmu3hKgmndy-$K65tD_<2q>v9| zs)b&Biasu^bvoP(>kx?dk!VukdWdnRJ)zL-v?;EBTbCi(g(S~1miI=H`9@R5Atp7o zt`W1zP?Hi-7M+OUB_Fh-rjg%tOmeQC}@aiFjsHbSruue&ON5Srh zsgZjoxOU0u;DjZAYLA(j49mkD*9!S`qJku2sy7DA#VNFJSmaNU-IS3jF-9p{-ysw0 zoH&PGb4X*!W3k%603jwWZa0-GeAz;sIhTpzs>P!QF1Vg!_GT0Vd?S*h&E%_6J#D2Y zQdZt}?my&tKwg7taQOY4i94l`b@wt8W!zv1tc=e(!mUo*`(Z9Fa>MFhTA{q1QxhLi z%)_?sp6)|d_YCv}@UPhNf$sKL5G{`wiGkE0wb4SH6hsQqST1X(QYaI-_V7#~2u-qL zAS6_XX|01qJ-mgPPv-!}umM?KA(zv_NEL~?eDY>U@=~blA$F6M^`s@I%IboO?RIAu z6x%6TE8&4J!tJT}ii7@=gn@nrcnd|slu73Hd;(%{76-b~7&qoUhTI7YK1}%#8*>gb z!cIUtBAz=rzGFj?gZfl^=W{}eTWz^}3|siFykO_nw)MuCJ&_;jRpXKw6mD8VsHHDI z%$v+M8KlZaeY;36im4_9ovx*n6eO4uijZ13_n`RLXu)Q7Sz;YB*U%Z+k@!ouUCQag z>qb(+AvQ8|#HqWN6S5h~RaJ|(v4V>71q}_2#v>Xg5zM`VkqK6ud8P~uDsS5IGKrYx zl6D0&V!G9EYzZp-%%Ir1v|m^SU@p2A6Z6pOerpksr$b;J&w5vZdOW!%mMduG~U{4^@ezbCyd<65%<8kW0k+oDvdw(*mv zX;}yL^iU@p4wH_U8DyC?E67bvifai6t&->=DG9YiD6(*cePXh{%AFL~6BC)L9*Ut8 z;>Jm0CKn%J#xGPxy9W?^AOU_D;Q>h>Ww1??l8(uy z6H%5gvJul7so^ADICU)VL)jV)L-Zt~TxSSqUY2uqmOv!u@*>J?h>hhYhiT zkvTJo${Rx;(b5Q2aDvH06eb=(0#5V+NGORy1peF*e4j9KK}I9#f)0s;HFGSMXRJ&{ zc1xLgDb%=FTwVpaf;O{1os0`fvx2-YUVEp8-N^pwLiUBUSj3f(GS^|#nB^DupQbP> z8?~$i-*+K7Paq42vFjyg;m(5e&|1JXgi`3Ye-Ne zKz7^MPuUsyqUz=$#na0&%zS*8x3voqj-wPafla%4O&q!@p=C#IUBT$+eY)bFmQ;gH zXXXBF4@1!!b){Kb!PwrGxyBsaBd9HwhLnolrD2qD^zeW5&r1NlOa4>2of51Dq@zEs`jt zNwBzoaqkH*+6ZqI(Uq{zMwBMUcuNzejo44@VwoKb(aw`C8gQB$WI{+PQpemF|)jh>}T3TBOI|#%_isDjqL(+%kJj2I+&KN)ruPureJzbm}c6n38hO4gRcscT$lVYRE4iZtgJ_K6}=?IRZ<?L{#mDLjff> zy-i4cB1zX0)`jsJdnhS)-}FH-X~QF+oHyqd!Zos#dzZ)X-e%k&D<5L*5b}&{u@#$O zckqx2Th)Lx2dME_-PUMEE*=bP1Gea$^T=iJFv5z_ff8H|@l671D4{DQ%Cp@oE`$SV zucR)NZ8?jSM|&mZvWW>xl+zZm#ufF90m^sAM$V)|pfwp|13y~&BpZYjoNe@?lIi|D zdrF(AOvCcXs5U!R$&E``XMiL6Joe1nUp)s|`7dBd)4s;l!6I@*@*m7|ISh?G8a({9dnTf+52ZYm_rB@nO5gF37O zpAEG`vvCot)RbCfiX%;;l58*+8 zOOqLoB(eRZR3B$Iv?8PX;k>+l9uZDLvacyfZ8__ApdC!PvZzE)86E-4<8r_*%8Gn~ z2Aw%#=^auB{Ucxs2GC|zd&Z2@oe+>}WY^hW4ZU2DAn~25NjcvC9X)_m1EPwGLf@Qv z0Sk+jxzX6w(}$+%IS8|8MVcZ<9Kd^WUVb5;g*-BlDMU_P7@|1RAj#E|aTjtG)huP_ z%y&$4=a(D}*Y60wWf=A9$HIjFJ_!E z#s!O8Sv2256G!%vZJ9f7=5jMF>*VaXITt!Qs~*epyS;&|b;^4_Yg(f$-B7kQrFtKT zVR@*E{@(+=o%0d>$Oy7zS|x-xHbf>ZoAkYs=4zzGGLIxvPjT{Wa^z8*iyb3xl5miD z4v~Vv6q{hX2g>{!;tEEB^Q3Pg2QE}4Dy0#2P_N3FhdIYM(1G6m{w{Ry zg3``qGBWTXVRe!>bL_*Sm~IFoHdi9{+Hgq!W}!g{s1CkD9ZpNgf)A?3;#o{QNx`LI z1#8GJ9G4RK{~DRtJJ>{yl@#okoFjP0r|~F6{VnhjCIq6;w~XM zI^seMbwms9j4k19(p=?)8;U@$`mjk3sw^hcXG%I?CXA96dBQT0jaqC2meWQp13FU! zJegT!T=F?bm7rYQvMYZYkD72+psjZdsvQ4zvR)DidNVq*Xk^R9la{{QC_l3%pcmGp zM(e22y3JILaOWnlV4`Jay&M~RDxpF=X$^IJqV56s?@WU?Q2dJo7=g1duFhaoFKP?Zw!ARrKblv!(Z@nAeU<7cB zdUGuGXTbRBNv}O9Y0WEo-3>;Xhbp?>Rd%^6^m-eN2(R7QxxPgf&5i5ZqR`@S#N+z5 z$m9Cfh^}vo=g9S~M%r}hu>KRa$-Z!;?IQCP>B8$eT?t#uw8ol5LEVHxzoJWbNFWLY zJkaPgnIrH_8>0YIrgT4a+9W6NH0eL%hOHVNd4;b4u)MB@68T@p6_ou%O++OEYjRzqk8jzkh zN#o@k>v2zr2o%C9gogm3s8nbOd8+eP;wVfapOm@q26R@%(3eS#-W#L?bDxoZb^QQ_+Q8EgJFy-;yvs4ND^geDli=YggF*jjR3PYg) zvpoTOSV}2RbzP5`Lcmh{*XO^$B4zPtLS22@b#*#sq~g=DR7Ibaes@+vJDBU zx1cMz032k87azCYqxY$1nT0)%6nh>3uW%xntPR^%Z8$Ljpb?aV6+V$dKf#y8q-{c% z6vZo}vdKyz@4=Vr!lg)crY4(pD3x{Z1|=EvICwZd0rGehsyNEIWR!Nhn2n2ttL<@} z7bv!i5IKvzNL<>=^;j%%6?j<*maere`R*XeL#ScmXj6EPw8FX(187Q0Bi%KGT8Jql zZIbO?*t%PxXT@!vBkeLoc`bg2t%Q&+6knONWo7t+5c?%=JT7dE83Wfkj#6%;Hiel| z+&$bVV>J$r_821ofF_B%CLAedrY!ineYa?XDn?~To`qu(4VL0N8hdlT+hyF*x76z@CTqAJTBa-02 zwHcDT8z6HqwXxZ|2a*Uqd*9=2az37Gf8jZF7@l*F;kk7g{ulNc_Baho^@7kfyJy^S zBu48(@&g^gumDI-NQxo%0pIrbGM=%UF|usL)+H>q1my)LQ6nh`tJj}ywvNe?T~_@= zXXL9a3~UHN!xkwl00;~wMLZdCDZWD`0$$o5tY~c2){p5cy1HW>t5#`)(K-(qSCyQ? zke3#~;TMEzLhus8m}m-fGxGQajxL!W1u~(zF6M~+d2$w4<=6P{$!O_e9F z$AlV7ih^SKB|9T}a+x$K5J}HaNBPRj=eS`=pF!dp1;G^)N3p_o@*J z72=S=@G?%gtx$nmtxj$&MjC_40Gpg8mpq};7NhX_))?6_J;TxrsnJo5DeQPfSt1eW z<$;X@t#LdA99cquvs6$zT!D}pflLF1G~ zhaH45#3@lHIy(~iMzSJy+0~H@8^~f=4ptC!Gl7ohq%_Y7{{V5M_)ui!lIh$D#S_YL z=PS7ca9Kjf=nM`yTUlR35*KWkv-~b`u+7mlsqtGhKQZ;9W`K+}-8JM+JM^6X$)KOz z0hKUj?q!!yn~G_O*^;6mo-2@P-6r9zWb!#O3?L2hm?iW65sr^AEMj>p;TrH3 zTf`7kO{Qo?Y}W@Bm5R#cWPy_s8{M+&vu&~w7xEwJq{VCkv07FRHxJD$Fie6)8Uu^4 zT#XvXR+vUp_%%UK!rCe;uFE~877<8fWSI6f18_KjC$Xh#f;ZwE;Vo3H)8sw(@Pw@j zgSkeV5g{3y;zAY9#?+`voUeL%!K$06nE~9J&lP$*Nb~X{^*-szZQL5^Ei2=Kw`Vf# zr~-&C8j>=+q~L?ovMw!WsXSXF)TrAUvcxE`=j<>nu(cr%=d$z=N}Dgw(r~pjI(1E1 zOPfB=)Vx?REf#c1N3>GTV0zlkd-yQyNYse&hgjN*xyBqGtLxeHmdmph6L!Q#x+qqL z0GvY7aekZav4vd+osMm^w|26n&%ofiY-1>5r3|!PJkm&ziL%YhAPh-D%7TPK-qOPp zAyndSy9qab<@f}02iQ_&+pW1hExQ&kt||BIPbjIjP_xBm=i3OqiV^(+5@AE~jSr0? z<_a>CsvA zQPKYkw!N;t$p0%EiPr7(|Jni1SJ!l}*v)v z=goWboUV?x{!NEH{oth?{r;UN`rqd74BmNK!xm%d9S<&f_SW0~WM1==14mwd^Sf2w zI;|_(^~t`bs>dJbzv#_?JBLr*ePHU1UESXui{Eym`|AS>-aYT_ZrT6V=DpAT82Oxf z%6{?gofUUhJpSev|Mtgw_Oz}&>zQkx?;iMm$9qm{+_3hfrqrP)g$A1jF6a;D?;9FF z|F{J!F1T*P=1at~~z1qhI~ozVQ9%FCYE-*6%FdW!~?e{P`E(d-yXC zTy?=QZ@zKC5s&r2Mf~$pJM@aA`FeMD_v?;)A!@%3hIQj($KCS6-u3U-4hY4rUw6-WpZ=fA{Xd+1^~J+) zIWc(dhfWO*UUA;zXC8Cd>NA%Peet<}9RJDHAIsm-`qFs^9X8SVp?&**z3RHxPQPUD zGNNzKKbtt;wU@zh<@g?AGu`X-wv(cIPr}=o4W^obnvHFpVkyQd;M8gZu-afum5x3 z^+!#-@WOqu)6PHTln=i6`P97c-?ingALd`YbGPOPK2SF{an8e6p8dXW)_-Q~xtn&~ z`@B2PIq<1{>mPo{F<*S`ucz-faoGij{`7*2-Z4M5aQEv6p}WsK(J}8MU)kk`*IzvC zqt_hurQP;C_v(#*yP*4w7USG6z-qklyYV}ZdGY?yky{>n_zSPE-}5t1G;FxHX5fnC zA!mH!$Y&l{T>qhupK{_&N4)C;q43bvXMf`8m-TzD+dQ6s^wJ$6~Iy=&bw^Da4Y*OQ;y(6!I_GY^eFH2LHY&pbNX*LyP0=Z-5< zf9(Is$Zh@4|Mj-~G53Gve~#$-=*LIr{cic^ZrJ(}r2<_E+y zR=_l}y{C>pcy<2Vlb$mTQJ zobr>=J1)5C^SfS{ee9M`Kli|Uf3=U1IenLo1+QGY^@$%GyQ=!KvwQw@-(j0?yZl=p zIqGM4rZ4^cyt)rO_UJdCe&kojp0@UuJ?qwgrsb%YFEKm6^uQ5s{Pi^J)U~%{etz^N zyL~G6oh9QJ9r=%&_XsZD^7%)Ok1o1>-uJ)pjy?9C{O70dI^Yu*U%&N&Km26$Sabe5 zwcYUOE03SCWc-4jrLX+r@~2_Te)!#^x0)}!`s@u))%@>IH{AE+W!Cw9yT0-A#8W^1 z+1;1Mf3>Q5VzIve?~%IvBKn*EJ?Wv-Zh8Q~>G0c6U;N~apMCq)58eOyU3Y)-#>Ce@ z9J=-6Z=A8;MDI5~68ZV%$KP>KZ1SAyzrMWZm)^hE;eUMxF5GX$0OlS1xi9wqrTJU6 z*T1}Mx4oCH11Mc<{O0)1lWJp!UH9f2uO9jCM}P6v4?g*mJC@e}_|eDkEFe<&?Jtkr z+xq3xz2_Wo&M&{Y*M;YT87`G;o?*xmSc)cD#VCp`Ft_k8fyZx8+Piqrt?{OanZTSl)K zx$V?*jXjdDANLp8=Y=rKAAGpx;Pr=Yd~Wk|*T4EqedwA`v>tihHP2rE$IG9-B6C~=Uk)e!T#n-&>KFg8;RXAa$O(Hk zUUc=7h%STooZa<7#4b-}|9I!ILkkz{dw!w+BQO8sS9=dU`={$(_{YijEj#S(_rHJf zeP{pT%74CD_4?zfKV5r&%}K8<9DL%^Uwz`P<~z>rIrFf+Pdogc3(kN1yPLaHzrWaHIid+2pX z{`5ObqNo3T@gs>lkNx34x7>f>LA3)n96dQ19=+|+#3sUwrxy#AHu>s_*mf+U@Sf`_}#7%-9v}hh6yn&aYoEXk9mO!2q6uzuPDFTlD8=_y5^lKkT`%>x569|NgyN z2-`gpI&-h9?8omtvugLHFMsdU#tkQ54S4eq|HN-zZC@IH?5fAE(|)yX>GRe7=Y8)J zM?NvXar28$f5rOx2@joe+}7KVcyj!Li`PGR?|%h*JBE&V{e^Qs^zDyVO}zfL`)@er zhL3(dwE3lH?z!Q;NYGxN*yo0KMn`Y|(bqmyeJ(88Ia^=++l6a?bnsbsytm5!`9$@Z z$Myc>f&)(pUp=_zOXF=XK7IcS&p%|}(Yp1BSN^mzc)4Be;w`wi?}y#@KAzisw>_I0?02m_=YS7A_1rTLZ~5VwP4*{uNBs4zqW}aR zIr912nup%`-Va}%?zv<>oPdkowcE$8Jh?WOzV{>7fAxb^S6?u2;mFW2m&~{Sdh11i zov(c3jaRLoT=9z|e%|yI7}%CnaNvRyU%2YE-2lIAoP@SULT4>G;xAvwPd@YTXLtQX zoqhE>SlMyF0XMgt`Mzuz5zM{6`uSc*{__d_yZ7w>!)r&*`u#QI7w4D!e6QE`I^~z& z*mLml@!f%(HbTYInyq^;KH=KKu9%qo@{un*dDYqk<-_`@yg?S z-}m0yYyW)98B2ba-~8Hc=ACCB(P-Ye@HZD9`^RtYwPf9~`@eBz_23oBdmn$k`O#ZW z`t1u3*mqp@;UP)g1109 z^W>303}1NZZoq2KT+o01@fWT+YuSMIm-p6>J~#He?|<=yi3i*7_-^ZM zr@!%=%{O21qxXIBy?Zp-H!lWqaUmR_i~hOguEED&+Uu56YWIHj`J2x?@s0EmaA2Oj z@V?kFt&cu?4h;L6KTW zAz;CNG#_wV851ul<`}KSL$Aa6C zvs!p8FcViFaAH7z@SB-kuexOZ9@W>?zV?mMiPppK{m8oW_W0SOZ!`aJx%uPgH|_qP3ol*0 z`}n(a$KBm^@ge6O|LR|kIB%Cfzx2>Cv1fmh`tGMbf9;Ea_wRk`-3J|T^zCQ=vvcc8 zMDx|wpRT?4Z|}~pJfr2OZ@mBb?~M$f-n#kTdu}-9n1im)ZTZntyXSumOyT!$KVi+= zZ``vfnK>yu^oN$7@3ozL|MipC9QNhkUuFOB!sXxi*u4{<-wlXd(}wqi@1FPfOZ5Nw z&-~LsI4*qqU%q<8RoB0{;Po^5&RzA<)*Ehn?B(wKsp}uV2XM-*r~hWbK5xJAvf6k0 z{_B$4_egGf?l)EW%Zb!JEGH$MiL~Az8TYyDQ)InfSxam;LSe zeLr^0UBI9H;$sJV>g}JdIXL*!NB7+&^w=wBUpu1p-WmL_oBsO8%gqx$`t|(?KKDEO z7Y73kxCa<0^W25E9rMsBPu|x2(B0>BwIgFVbgm7QapZtISAMl6cx-T=RQqFJNM#0Z zIQlwd&JMjYbJll`U)1}hive<;eD;PnoBEFL-g^DX&z*PE)_wk~_pkdcUc9C8>rK6D zuY|*NMa0m3 zY2>A69()p*m3#L&;f^!+x6b|K?Z8X?bK*|G6qo#L!AG_%h~0k9FOFJqOY~1cdFX~4!pD3(*gJB~=pEnvYRij&rtUfO%a_F-&TM@( zdit}c14%sf(w9$v?Tk}ev z2X7yI<&TG4|H03_zT4l9&3&iu;=@|=f4*^-`hB(xKh}KNvyXr11{3J;>7NBA;pVr! z{*QeppI>>*$n%fiao-*{R}Wlp_N%)czva$TzIFLIZz31o`_eui|K`v&8{c`|6aLq0 zzO-!X*7tO5o%i4W{NmbX+=&lNWG}rk|J1!t!cIi`{Ewf|v-H#O=T+wYU6;Ut`0(M6 z{PG(k2R!=gn_u~8{m8dZKBoKk?`pnk)56!yXW;m+>iXFIRa<^m|DSt2^ys1oH$Qvb zlTZBa2O|fp|IJ6|ZM<{Chf_@h z-*al`oex}P=imI%S;y~r8Zg0U-TR|M;^%h!62O1p2g|>4H=yWSPdxj$|3}_mhgG?? z@4_%D%0fgG1w;@~N?JgqOH^QzPP$P_x|<1z0wPFvh$!9NsnR9gUDDn4je)MUe13cH zOR)!-whbR}At^Z(#v(qPJki7Wbpo93g#0?lz5 zS&F*Lu{GPv?|*e6h%tSd=RP~}d3>E;Z8od2G&-kA?UIxj5BOx0&p;!#SErs${vp`* ztq%|5(8tf)FBkNET~Ofaj5Zr>8Y9~ni0O_BoSwa~&wI=3WI}76J$Lu-b%y*efr4Cc z<<<_hkjE9S3yO@i&TBOo2j`QuvqV0b0`^eK3uFvrEONzWFSZxbvQk;~+QJhq41u#q zxXC2-kw=$4TeZX@g8B5ZedYHvA{;=ibQO4T=8Og+E~{k1ydX{4mw8!k0lO9G0&W*c zqO-9d^O;V6P0&8~Bv9MNdZC+U`jaca#f26C;SzM&EILiei&<5p`S;psvXmYojO2rv zN*ZVg8imYD`1PX2&+CX{AMKM9N`eDYslQKMWeZTbP5ZD?DOcO8vOlK#laC#6)jhzK zh|{f8Jh_jS)FRWW@#Zd=cop4wXN4!*~Z3m9b? z;C^@)KF19I_>rkr_K98J<8iNf2@7=$Sk2W>;QxBI^bDhflQQM-hGA7e1%K9_1Qr_F zI5E2G>-&@u46j*iXZ$`(H;*-5^dL~T6FglngnF*0N_r)_?IUj)Ar^h`{^Qn$%V+xS z9eqjv>8RssL}-k5U9-CoO$g2E-I8^|-1E*y>%wZOEWnZJN|xc#$)mS0-sW>ECd@0F z303JXHlMP(^tybP!qseJS`-ylZsgb)NZA@~V{zoh>v^M4Py|iDSAlGQW2S2$%A#ZR zSXsnB>9PA|-K%AQNXny**6R~PIC59xHWc2oA|cb`F4-4t+G12MSHw6+DNR;$AM@2r zd+b=tOl-8Hg*o#zYNs}i5MrW6GVDaK+XgM+%m%>a9`uW#Z2_s$N09L*pglx$b;Og@ znIpdC3zbCV&yCc;b=o1|X0C1z=*7({Fg711u1gp>j$@C_LZfR4=3K8*Yf6kYa;ZQW6rLf`e zd!1rT?ptLOwFDYh?7F_Z^VrovR#`@$04L;eg%Ed37o+i=pUp;5^zMErl=Q$cEw&@< z`I`?#5Ff=#jy2~p{dZknmWqndQb!lz`d>-7X&!Lz=@zzl?j4Kt=}W9ik|yE4`HCkW zT1=s)z%W1e4x!<+?yef=yXViK@~CfVAg?vA|9Dq8-&$!E9FHE|m10Bd-_n)x zT80D8DtT-J1zqPFxNt%I%kUcgR5>6KcdUvti|c?XN!At-|6t#683 z)po=>lmBGz8-2(R;LBBk0M3A~1dvP@vkYPj{`?d%X3c0G3(rOad8XxDTLdL;B*b)y z$cNx*-jrWDX)w=YnBvuL3T|YxUXaauI|3|&)QTIKB)NP5sD3N1O^rJBu0J2jfj5hv z*KsGGQI9BBw{=0e+%89ng>PS#ULiBunsZfflwQ3AwIVT(_on;~Ds)wP9ToFm1t@*35^*l#m?*CRaxKkjz7y^Uu-#(7M0GRC)+qZ*t0&Xsm$*>`CY_-m0IrkVG`cb4aSibAtG8rYU5ZDBA?;Yu`wBVQXBv z{4AFP2;PLlrJeei9PO#M#@7H;ApFnGO5`$ArriV7Nf+Uy-<8-ifE7qN?x(FQQm9TL zGW(OYo##v5G6k04&g$vO>ZvS{u-5Z)(z&y^&Cq=|M|0+_kUx@+SOK8t5zKs#kmj}O zN;_dv;0mSo*aiK8+ysZY7~3uL4HytB#hDP8&YP&J(h{euoQriC1qfp)Mx~nV!`OH) zG?V3g0B#hFs%69nw8(Puoop=+vB%T%GlTt>1B|-sJ(FQ?x`SGcNSzW=^jY3k&tS2+ z7Axi5`84Yqw~Gs@X_+iCOB8gR()+!y95p-+V{RCar8ElWQc`xU0iCXkc$|VvKv-Z} zCI#%KYg@^uAZx`%lL3V}aJu}A_GLT;IH()@xJFfJa%qWTBp9h8WIDAod2F~Z_t{x~ zftou6wLm&F`gr0Oi@h1g>aT+MyxlOZ%==XCZ`y|m`%s**1Eo%;FREn0ST$MY8}A(e z==Ee2jixd^5R;C3;)Sc*R!ysrX;il~{rSxYRU^!4;MX2#y>7gSGe3qnm;*3SSh_pv zXpPwd{M$n3CuE{5V`)Ff3!-?VkHNOsPYyl@b=tgca39t@KDvm-;r_UZ7O^JXv;;#c z7&owP-v4ws8Z<>oFcBDZLp|>mwT|bTkSjMCl=FWObX^#za4Z6j9ybBi&dn@rEifRZnLT4 z@NW4Vo*eC$rXwF96JHG%n`b^U9{g$XOs6ThgEH&n@J(-lPBT8Mf@XlCFg=ZO{wp`6 zNC3&np-?lAiWA&9Yv-NgXQ0ekYoatDlZrdJ= zR>h3*#v?+Sw%5MlU@$O8-IVP2&`hXK=ss!;qHZ0o>B&&(DmFWHDE)aAMXH|IOQ#|67yowKd}z&`p)&C}5iDB9NOM!K9>R+9j}Hc`BE z)u|ZUQT^E~5;0uXs+5ReGqzVhs<*2z;1mOuJ{<|@I-_+dK*c^F4qKv0Vz_M!`HCDH zLg>O683=tV9Ct4<^z8R*`9+l6xV*#FxHf2*6;X0w5g?zn{pt%KX#vPgTlN>0JK6zp z20*_CA<#T0pUu)aI=zZXV`-=o=J?kxF~TRloGECLyPjq&C9D|$s%nYlT%k$UuG#T+ z9|ptb9Z?#&^A2N`DBYEDw+c@fb!1I)2{Q+*5$^ zlh!f2Mf!2#MKrW`Hri<9WHjy+wkpkccA@B}bfHj@URer8%KGtaysIob1=y|Y^%kh< zcvche=JBi)Ku4wm5|oz59&aTL#KD_TnfKqhUN(X=)V;F|EVK&phE6G$A3poLV|pQkmW*e5>tUcAi&otgwMcP9-o<;d{Ewc# zzsam+leAb_Y+L`G0s;mRWDERcEMGD!Z`>sD`N&0#>;m!>EyQ9&gpI`iB zPfw1mFZpX1t6R3RanUtKX_JCS?@QF_18?Nte7{Uoe^PUZF-srWp!f1V1s2CGPQEyQ z+%K;wwvW=DfAL@}Bca_tCL`2&jm}+VCmRtBFZ+$@j$4H0SOEk`p|6CEjQtSC{@F(t`0C&0&Nha0i$v`7bRjz8d1Ue&vmIyR#_W zH0epp3Ag4z;;PNCTZLbc0f0WiH&1Mb%{>XRq_StGJ-)|pVLOgk_eJDXyM-`?jfV|i zyZ&DDb*{inxzOEMiHTIDyhOr0Zo9QlgQeDK`jn$HP8w9R+|-ekGUTEsb>+*2Lt7uJ zUN^Lo1yM^$_EsJ+g-P=h4WHkRpuM+$jPG-!ZAiLlQz1jS$H$$qJIcoBB13-1FXCN?wxO~6xS@AW)gkk zggj4H@4a)Htpw=sVwe5rTjPEh$jECBAO{O5k?s7$jaP%rt7MHpU(&Aivr=|cgp*E# ze~r(8`+>b)5H7$cijZe+0nR2tGWV@2# zkyIkn@(!>@!BObAU7jgHqhVhAZC;71-6H!yQ*P}lXQvC;^8zxO6v<|&oA^D{tZK|{ zgyNnHQ_@WU`4(Lw4<;_DK7GkIHvD=1I6AzY&KZVeIIzxXDmIdejVdKtu;&Cn2@*$^ zeAxtASYEBvirKF&02fsm|2DhGVx}o&e{*gTiy4v^nW=_5pEkaXDL{*-h*DsD)z3TMDaeH^nB`t(b!9$f+{3Lm?J0(beV7WhsT#)dmCIP{dWP+~85lr1>@4lT; z`@k@C%8!mKoYp{fFL<-H^KAMs8pnoXHHZK78Y+8{6W-=O-U@P9NJ-jq zH=yCaovs~S)LemGle=~aha|lj<-vtcYf9}FvWxYkvM;(Cb50^ZZ~=efudNfj33ak6 zVzAaXnkqdUpL46$l-BuscTS*-RJaGa6CnDCA8kZ2c551CqnUB6x=&ZukTJ*V#g+5b z6{FaS!l!Gn+_~;RU3yR z5JB6m*8^_;{93X_z^UIEpM4myB}~gK!f89-_q@r!Y3}8NFiWEN%ip|iP>a*)ybYX~ z@FS+9Hv4LSBjanUwvVjlwuN&WheY;nxvDl!!r&7mdfAWIU^J_prGeIPmwMkjtXdOZ z+Ekh7K{5A&wPwXmdi`CWkqP?}1CWq(`I~}@QjT;tNYvHPay8C*4O7q`KdR3)dlS@n z%t>@cb1DgN9c2t&hLs_m$u}YWujc#coo5USmkM8DvcWnMENJ6+6IKrrOx3E1^ygW=*F zz;B*^f8)J5+uB9Rl7Q~?Ak2{HackTAc+GRK1>#qQli+KAU=&VFzX2Q{g<@4;jhjQj zwIyp2@zAiSa{QX}1vR;N$6nfXAA@pFab*nT+k!OfIe&c6?O3b4vdc|9SSb_q7*VnF zvxEF+3Hj=bQl4%K(3uf5IdsFjRtTqFkFPXy#@VZhn(Vjtg8GRBGvogTl1t~SvjZ!& zE5wLI@iSL163pxMMs3k7N;EM$=7qEeiL0Bc6q$V36?UQMeO*m4^f))=0;knae?spY z2p8G7lN`eIE1~|I%$#T0u!cY^I>7%fmkmd#Hl#?$xjAe!Qup*}xMZB-Py}P~TUgeT zx*WwFY%daYkbPPDGJH&ea8V4?BDxpRil3@UuypE#EXSMb=q=8vn>D$-lpK-$ zSj%yj@yB`XH{uDgVz(r2(N`0th$qFHA=ZQ`sG23*3iaBenHjiUB8EFQ{$7w9Vx_kO zky$kjyPvJNDQXhvUI&>h{N*XrHl#Tw5jQ%%(2R*k`q-M&<=4iKZ;+#1p(`mnuE8LE zm{CkRupwL${G1y`Osh^0`A7JJqR?NMRvp`Pz0Y&pHDSfC-}y4eeq(KGzH9xwM1UfO z8<XQD^ZW6O=L&}6Km`@N2*Tm|SXp7NHhwA=S<~KH#Li%%?6efQ= z3{`b>*NHH6*VVGs%F~M;FdhOkf-&=lU$K~yfmENL$K`>!cHAT8sVHWn=9cW^z1_;a z8(!9A#hL_|H1U zR`Q%011S&Oz8e>fgpvtW?k1_ zbe4EC|9qGI`ebdYcm#{?<>)rdIpctPPg}xWh#na|(25g7gvlr@{JnT2=&slO(H(~J z^|h2S8`aX0xy|yOJ-dF`DwuRb`2y$0zo(P;iiq--9IEAJd*YC0vXXGwEF~}Wq$MFj z=~KjPJuQ>6hCdK3y;OL8{$fkGXK*vtlO|sGd;Lywsj|#kjo;295+1{HBtM6x!Wd)P zcILa1{F-9ljJb5+;;z2m$B zhKI;vpT6cu(T<8H=m2Pi{dvxkD#0E1Xt>-yk5G&xPW6d;g+l=$R(n>}i9y{_(C%HH z_``5B_YIXVcI%V6E##5^Pyn-|qs{hIzz_uw4MR`(W=u&-=5KX;!<@@7C6IeWr;zzj zD{gc7G9B^Jv)Qxk7vdh;m8$8s7JLTfa2EsHiex^8Inz2Gw~HIo zI8&Ohb@sm)!+H`OJ;xOhi?cI%eMxntGr^nj@YZ`x6d^U+g@&l$T9dKLirc&n`Bzy) zL|Ic(HOm^7>AG8%H17dyZ%g`q=|!LrQoXr(Uv28`W?ih}$yJ-qIiDckJoHy?+jzw< zYcI3nN4E1FipS0&SLE8ZM=KoDc1InhS|eD6^^EpMDHIEhlu%kP$-uE;)0zmFyYj@X z-QofXPvz;!VfNw2D>l9&p+yX?L=t1CUP^p`w+c~4^xKYDhn+0ndZ&HFs9OBvpp@MH z$wFBzSWqX=o3yeG`AcUROZ?mW(U)g*@mw;4#~LQgHlSK}eHF%1_4Atbw4@Qux#i>f z59q`R+L6ILfv#C)^x4DaOcBWzyA|wXoh^mq0mhNL7C@J$2Y9E~983|i>iQ63F)B8e zyIsUu;QNRYGUbjlG)b?YYtA*lnYY9-}SrS z8EU1mh;xKtWsVP|{OZ`ZABymfnrshVcQ=<;HbW>wY_icbuD4tJ@ z0%sEa5>P9K${k{D^8#)<;sw5l%P?8B#G>@Ti@j0S;K!%e`U9fUoQlEdDJnk1n-@y?hTyy)Nttb)xpeFx( zkoPj~QUI24r^c7zXbOTcZTl1_G8F%yx?k|M^oJjJZ9nr%+PB`L!L6@NVcebbVNbd< z_w2*%2xe{?O#0OU=?3$w_*aa2(<2Bs*LI_7CDdbK9i99uz^F@Hv)s|eN^O=6l-G79 zy_r0Q8N8fkFJe`WIxJ@B((_SQFa-&vqmnAOdsP--bdKS4)aCTpp9Sr@(yt(fBMhc9 zb1UtB!{H}J{*XJE!`{`U(#Sa?;>15o=sw|woQ8CM)QF&)qU(!Dz`eu-t56TyQ zg;sf_M3cBwb=z(WOCcCJY+bHCpu5FOH1H8O&sKH ziYx0M__1@hWQ&)}amR?&wkeRW<$Qp*NeyE#*9@C?ya+KtQt5Ck>u9u1G}!KwPweBo z`_n;pb;f;fvo#$=wM(48S=fGy<}M98-KCA$DAP;Fl@^CvT~a;Yy>3V}OO`$k@Lm-W zaZ8CqA5IX9p#Et0HGe5ruRW8?>ZhjiI_Eqpg81b;w;ZAj>eu}9hJBeaC(hza5A-`J z@~GaDBgYsdIZbEQkqL;1(3qoE`aW*SXpR?&6kC8f{S+`q)^3JmxFEgKdhUyS!aivJ6 zCwPA$z({s%!?&^atVSYc3;Wi)a-8#O??T(NxL1nFnI8tyEa zIMHNLqnt>&ZCb=dMLxC{N$CJ56jc=^JWN5p*sEgNLy&P4u$eCGM*`W&e$5VN33_uR z0ZfJhwc*fukMfU`pjWcb*pF?1do392`|BME#+SQ`eeL;6T(&Dl$Huhmtc|v^WVpq! zs^nm!nW^<=84mxEw8j%03L%dx3k7}ZtPK6-Tb*JDxAw~>q${zexBbbUk!>jNElv%H zt~O8O(v77A#@xE!;L*$!2=;=*bf#3`ery-+{gBL13U4_UJxX%Lrr>54^}+fYDujD#_?qD3h@`)ZtF%OmkS7WGvtE0T764RYx1%ivxPG);jGUN4TntUyYO& z*!S-BW@)S&d30EgPh)m2X4p+)D$6QX;OuxBf5vYRIw>~~t%sQx0t8}tov=|i{ zt3@7Ce zTI3oQDn9H^5F=Q07=CkfX`>$VS8zBW+j34)Ayc&^eQ1*RCJpjC@Li_!#z9&Xt37~( zl)@rfg~*5c>CMHSfaI4J8V$Vs$b8pcLpD=&pfr8;N4~yH9}p7TIl)>KL;Us|+6om8 z+v%H!R{=;oXkUm;A1h3EYzU(Ei(oB2cj1y^-vr6+hp#keudIOcU6}cew|sv#N>`G5 zz+}kc#6!8jpae>XzK^_)sz4c;1IE*{y)$H5cA0?DC}zyDA(SD?@Nj2&HsXdw(;-Vq zl_le@tpV~5r^WXWPD|azO{#jbxu+He|55mK@i3i`$1Xd9^`Yp#v!(Zztv8TTDy9`Z zrA8K4@MvYhb84iYJo7C$D}(FsMSGC$flY+ZluS#YF(X{Uj=AH|E|aS*dhF@NzW=4y zk)-4Y6~VIPN1pkE@i#b=z}x~U#aaSMU`C+SZvEvCZ(C8qx(`HpA8E2Bq8`ojOByeV zESW7A^igqy1x7)yD{{N!)iuQUU0k8s_js*&R9irZD291Wo3*m_{q&|hfv#3HI}B^L zaE6?D*k;IhHexC8@MZaZ=})fK6|XPtlWfie_t7KoS*yMcI$tfhA8qbEZSETk$beET zJMvpIQCV2tZI&7orr{9xS$ZmvyEOJd4?{wphI`7W=ZScAo15QGa%wB)T;~`AfQRW!{tN;5xe(XMh8h*B zm%7ik9gvNbI^R1)n`*ukPvZ}shVq5Jv1Xmf2dv9$XSG}U;H3xaueCFt`08#Qp*JtZ zLqpR<-tBqs)r_K1#D=@{ z{sp_1aOQ-i_`9eEwiLxb00OBz7N)dP&i9tDjID)I17U_G@H?HY2ycPi*KhqB4w z2J-uRTp|2y(37f@_?-aAF_wLD)7D6~RB%dl5tAZ2-}Pcq_%>^O%PC18k+29esW0eO z?r?XCjCJ*?#hK{xqK>_oJ5n@a6BU8`k;tT25GF=6o`ia{ycW^T<0oX%mWF~($n)w4 z#Y>UHPI*94S=ZmO4X1g{`GRP8rSi~ZyGx2c1(y;LPUA(LFw}OCaK$D@ELMYP|{42-NLr#4+ikiQc~4272LF z%FQ70=ELzmSR|WOu@jl5l&71yG1I(Q>6|8;GP%&55@h)GEoNp{l2jDuanQ*dYKh2c zK&oQW00YZ}1yyoICTa?+qZMjV?52+_FXDqODFyO;(7KtSNb#_7o&9JRBVy5u`lHz$ z4zucXN`0G^;grKzMAV~(CpG#?#*t){_gRU*_Mc|(wNFOTRMAn zM5bq@v%TXMF9b*uXr@3QWgFw*d=}V54m9%}`MTp3b1!3>KSzfibI< zEOC|x@nc_J*1k_6GA(}|)@wMJuU}o+hPznBzh!kPIr!@7@$Q)QA>ah1?H|)JOA&fj zeOVeBfSgE%<=W8x+9jlgG>e;dnL>tg0?fuHiQ-2DOJ*Sx-miQ~1?v2+-Z_e1V36H_ za%F`ws-?1aJ~AGRhsj!CYl&b#lU9AhTIPpKEEoCO(&RHzfmLPD%BR2T^|zAjzjT+M zSDPrFe_z9S|LO7mT&w}0TMN^TL8V5~Mna?I_S_5D_opJ2goGvG%|`boI)>BTmVxlY_Lu zLgT0tV~dj``(thjKw3&8#b=sAdL-CK;tvNxHn}>d_osI|+%95u16Gx!PpZ)|Mexm~gCZm{&r>VF=~?rtm`kEmY$j|NQ#MZsN;s9E!J>^l1VXZik9xWw zjAf)JO`-4jxM^Kdye^xG8g)utqq+Wa zU!9}?+O6Ncbx(7x6C7{PD+@GH@&l0xS-;E;YRPWO$%HF8!3tMBt%`2G3$BIDK+&$a zKj7cE`aeH^Ti_wIHdsj~-Yj`=XRN?5Y{io=96${0dYV5mIu77l@y2H`P(Evp6T0;K zF&xBJ_Pgd-XvI4oeWeJ$X`AaThA+%4|2*AJl3jXtG34lJ+0wt0-GY05Sda3Pd zrt`r(HSGVgp6{fD{T<-w@fE!4xYv`V!4GS<3M^(2d2dH9;P7bHo%J92;r?)~9j$Qe z0R&VW3;tg!uo>j6%PB5S$TL;Nq@*?w)VyY}F_B{JW>|B@)(h1L5@v5kjkz_{1X^MZ)h~?l7Ma)^Zc= zR~qP7Yb2SjT(Y!ahFY2Y2NGW8u(y(z8);X%lKcj9b-WjbOY$OMhcE{g>i5UT-{;tG z>c-$50mrQE zXAAc5JCg4GXCvk>1Ngt}*(8p0++BfvL+c**p1uzkKBr1kXgc9sK^V(m( zO!v&1n#TbnF&Hj3PnC-0(?u+m;O<;EyZuLZD2)*iof&F2VznB4!4ag ztmNQw*h-Ed`uqFz47w6ODCfTl(63FTdqH}RnjGy){o#Zssq9qUho0o;U%COvT7TO8 z>W&50-V!#(EdT(LH!WZHD4p`Ba@%aT61|!8u98XH-poWYqsj9=O-$$9k=iJv^!1{HI5-23A}7 zzx?fTJOAlJE%TMqMMju0PQ60Nk__xRRkt-V1uRbrkT$8n;ikbx3hSRgYFe;=|M_3D zt8eBW-){R@r5*a$81T#8uIDavL$9|n*Pg|q+mieqpCJ{{h$P*%X#H8l?Rh>kKulAC zlTCf%h0A3xl1WLxsH!NJCNHtQ&?ANdz@fXcCTi=>>$uasNGqG{kBH@~XbPnCrbWiT zGw9EbyUk(t3BXNI1b3w$-vO*VK;T%=JE0EdlTIB~FGY;Se)GghD;jfFv5mRk*F2-x zw7mhSMhYPLX+S-soYi~?ZNg4Q!{raR*^q#T7C^Ixgo4k*;t0Y>nsr+QtFT(BHb2h2 z62I5!8dZFw4%+_5wufK|w(X(fMfn0_5S?j@Q31vwTCw&O%K%1%+I~FU7!IU(G`1YJ zDJ(Ln0)R>O_4$ii`;>D7Ber81?Yu=`%lT?HHU>*Xan*`UMr7wZ6M!EYkcF+oB^EQ? zfEi|->`mdYhIz^=pum1~1Dc+`G25EfuFn|;kS1-mEhbHsF$~D*&AIk8V7w`ZD`ir0 znW{=zQob^!R`Xk&lsVC`YH1Eu#4BBHoU9_aYL*U|ZLeIp-TEmujOxPjUyBU&ioxx% zFrNsl-&^W`>zI1UYQ~_9C4R#9gh)-VP3@tW$Ft0-tG6Chhujsqxgef0F);g}LD#6(zLO!QrI^gnpb;>;fP?kdR9J;Z(Ht{VJ@B_uZ3Df&3 zh3SUi$m(K~1Ps<|0^Ss+sb(Sm9ZQ1nC2Z!C-_e_4y%JLx zjZ7lCU!(LVfpdMe-sY%e^4D}S7PoewSdG?`m@j7@k>lwfw zxw0Hz0cE=gj~?bJIGwY=K?PgiDHJSx%11POIAb_eXxuw9y?2*`#dYG91x65iiKQN( zyHHG|KKpQcp$dm>d&-YL^^}jSh4^ppCEcp({N3kbk<(O_!D$CpB3`uid&JIX?K%KB zz2XIs@5uq8njZ1xwFrKkHse(i9z_lQtF?eu_b?OND`-n@0qVO(V+0KIn>8FwnnuEk87(;=Lxa| zUAIRE>$EY`m7^ux^?r4{=FNc+g71?-Z+eQDIx)ZVFwfs}aEhZT%ys~6i;_1(M%n_t z239Hfaj0Pf@aJqYk8LNuUfiAzl1eQab!ZkB{Rz%g@9Uy7zZe%pmV#bIK2tLHu`A)t zH_AhHtDn+c@3U-IM-2dMCgPFMFf;V6d}CmXQKbkUNs=P%y4>o`RGI8coHK?NFgzE^ zL~~4h-)xyla*|4?oAM_qZApXxBG+>PfMV}!O(IT=^B1$;1ZdiGyw-Z_0o`QEYs#+x2 zYP%~VJ;1uen}vGWY?c%uL$RK1A&j|0bFSo}erGr*&qvgb(uiIvQ)6)mTBbJ5LE!iR z#FA>m_K&;{hY3vT8e>kIA69VWc=pEMaNSV2G*k{O=wNJ$rQygV7X<@x41O>JW~7BF zkMLJ^o11A4WA}3qDNHjR%L){SV*$E0{7;k;s+2H&nwb4hUL=qzHoEOl4h#Zn_b?-V zS&L%CelDieA{pI%cXcew1BW#8@Y6Qs+!#2*;&heMJVjrDZ!wPsm zyfh=4{~|r7`NW-jrC4Z;hKm2PI%-?4CtZnkWWR)Ip9Rv$t+2nxgN$$Z$CIe^p>~HY z{jSO)$nMJ|iqlGc#Rt08AK@+deW6`cz&%3-GmP zwI0CWJgPm4JuBjyP#Yl;CdXmm=Hv6<0I}(t4&=j1JP`S1Bn8f=bzuU-3oR6gx)jiv?)=bS#usX zXs`-THf)<l{3W$=V`xyJ>PhA^5S79q0Z4lcQ>IN&gTIb z_Ns1D4A2Wc1t+?!rVrSK;%cJRc>$ZMEGY@`g+^uNVTU`*h9n=POjP}&{&Erxi+x9b zzS@kwgzi}rrymi!B+SvmTn{E6`t$`gk|1uS@_{CczqwUlZ16}(bpn&6%HrQBuY9dUv%fSFyL^_BG-z#6qoRnD%fg(wMGtx)&9GPT!ZYmK4a?3CvN=L>%XY=of}q;kcvs%-j;ODbyx!k6^9mnY=C;VRYuI z#SFT|Dx6INuhSPy%?P^=W0Ko`7a6!{+Bs3$9sIX5i7zJ?_6^V3JJPx5KnG|i;ihT5 z?;TzGO6ePKj1qz<&owUph!fJK=X05H2@0y}EVjT_&6PODCSo^vXz3sln>)(4H-4dt zaDdx(MK;!H!)sx%AgygSSiA!enV*a6rzeM55zR_&6?}!oubXFBw9Eq!hc8pmco`!< zD2iqY$#};G>Ymoq*v&k!+m|2Q11q zf4J_z9kFXoh>0Vkt1Je*%ukN&x9f;Zf3|Ekh0raYyrY)-nEuFk@FvnGYdGJv0SLnS zAYg4lj*Uwpky{oD@0~gj)d~l1{EfyMv~ zYUdpQ886M!)zC&0CK0~*TyW)npv8|^)J}wQrBex`22{r*gcVNAqVs46$G_p-b9LfT~2UFUwV_p^`o&%&u1_;y#mfwZZI5s#w|Lu!Z<5D$Z6rHTtl4oOF1(jF-1ymSW#mL)fE>xNJIn7psj0RgryU~;`=Y84LKE#aM% z0pOW#{S2*?xS*7+`I=TaKN%+1Za>g;jeKMrxnir}mNojdu{W4rMFZ)egkYh@z}$Oe z&@EDNu#jf3K3Ti4w?1`X9aOk=Vac#Dka7XaO$NVL4D(UYmfVR2~6B8Asdx}*NRD7mYn)@B^GK?GpCwaQSFJiXxeD=Et_-l#PtNLgOJ_h8+5V*!_(e z)(noq+@_O*@C@0Mz|sj1BJpOe@#@#k7XnwyH+@%Z`Qgp-+)6?di&~@0r>_ljhNFSoY~K8r$Zn3p!bxO?CgJGZVcwSxd*>4yd%U} z2@&t_mm>R2;qL9Ia`RtL&u;TGnmlO=C!d~|0Q}up*s5c%my?dEuE1jtBg9GqN zvLUo`TUM!C}xX8z)&fC2Umk}mbQVW*!mVJcs9Bi!`YbO3bTI@=afV1CNKc9xzl8qBMz^2ySIQa1t|A>3Tmodlk*3S-I-@VT>v#zfm z|FPl0+U~GPJrQrLXv{fn0Vu0n-PY8N>BcWBWvhI5M6f-BZ++x2{|uvNEjMu*sY0#s z?@J5lH24edF4Df{PzjwlT&>D7sod8EREf_O_)w!|9Qj;cN==3tH!M8b_&2p>wyTc- zXCIe4=-Qsi(inS>N0+)Zkhds4447hs@T8l5VC$lon;~?kw5r9~qwSNm-f4jMc9h1l z97h^vc1$5nZ2Plc9JpxUhMV@JhNvfLuQxe}h0rE^w4Wt3+&5`_5Nhw_Ugjqm2#zLw zK-AsNL5?r#d77Ke9u}e;Xw!+AxCW*wW)01P}D*=Blf@+z~a<>>$g|>2ys6eNN zmrfK+61Za#EI8YIqpabk8E`s1-i@Nc6!llgy_F!meaB>{~9K`>$%?#B#?UxIH{{115JXC03D(j6NZ8EWTkuv19@o*S-s~Z8}DCr z*Cu6B%Kbjro|Ogr{L&TYo7rv#GSi>SfnFGu8<0K@PH=eWS)y2x81u0hq1ybR0*jwe z0K2LB_Jk+tfwNfjcP3^GwW|h$>MDJ7xOsk(L0~=8Z?R~<17|#J z%(6zJ>8VuIBMH4;G5lh7nk2?^wok798{zafqPRtM+<Dj2u{W8gQ$##$b{3Ie1a8rU!F$PgxY&H5nW?Hf!F+SBJ*!B@*Bkv# zLj2YjKR$!mE&sq4WRsF_4>+o@4<>O}#%)o*GrmKRP3Z*KcJFa_Qz1|bSd-YBZ30P~7NPE)sC>U^^`8+9T7^^h1TvO~k>cotZ3c9$e}WF^9uT|Aa8n zp765#v*Ex=J-deX??1ZU68zUZ(a>I^|GUI!Xz#A0|4;wn6WTtP77nzjF_%+0YRTva z48Q*&hfJl=h}N(-{m)qcumAl|hra(08IbtD`45GEj#iWb=`2?s2exwdIa#GQ0aGfC zOky%%nW@k*0X3JLu9TN*m|60yCsR!YMu0Qa%6eNqNXPIx%Hz>1J{Ub*g8=V$@Ae;? zQ+x%^_JeI%2V3)6iQhj?57wg&cT!5N7gOQPEkah^WZ)8Ds5d2uS}GL|vIAhB41g~M zxS4Ru&kBfGYB;-$ukxMxA2xvOkLI+Lb-#=U16kJ9Ecldjd^Rh?N(^eH-T6mnCBfd3 zG^mg1$^{7QTMw%9uVwu4!twqgbPA~l+lz4OTq=+zQ7Ji;CA;R|Jg^s{Oe>igP656p zWmfDccfDr}o8nO_GKn$hjQ8TQob`!td-e2Rdn0qt*YA49pq$^3|5CI%TWBInv-WE^*vo`a*x?)M}%m`@5$xq~CWt`c)-Cc;{Xf0jz1d##UuIW4O)^)dlt zI-KKo8J|9xRxVYW23b0v7$tjhv@ciZLnznr`KcU)kd_G6R#j0;piJ0wTW+Z}$>-kA18B;k z-2mu;!ha?Uj@Q27qyl2)pawP$Ip39}pp>iq{OS9f&#{Rf$zH&?DjW64n8mVww?mjT zMK%RFFX-!@CB=Wd<>J>&ws~l|xAp>7m!$!FN;Ax=kSA@1sSg+{;WMiTHU=jZ&0cMV zwaH*_lWwya#OJ*N3?uW6tHqU>y)(o8*&)<=mN2ktq{q{s*zK6zpNl;m%RN5aWtW-S zRIj?yNt&GnHf-_4WEIc>xe^PV5P%)1k0JxF23BEy1xD+~e*&7+imZA1jrj_d^+NXo zP%wR{bL6E77W-uq=l?l$`F;c+rMsN3GAJr$iU1-k#2CV7Ov_5ifhj1WDeI&nu+neaMML$2AEdU2Mo=u=UP^fUQX0!VF!~cycoVt0|kOJ06 zJ8_TtT)yKEgS%aZ2@;2b-B`v$(IbsnH4BVJM;k0D%&VRxg< z5}c*B-LK`B(ilV?MNCLpz*Gm=Y8&?D?YcMiKC|(@{7)={8DU%qnXl6L@z%T{dFXN5Rz{0?B zhwvZ&qZ$`#v_%@cy?vOuxzHf$IQ#j7Hs>g6cZ5rm@ctfMrj`ud4{X|?=@2a3?Nu?w=G>!$w6`7h^$d!8G2#2Zm~DyZ zfkivLSsGbys@`G$K~=tsO7Cp8^Rs7+7n+Qu&bCJB0TM-{jadm@qB!OVtc3`Y;!9yQ zINk@=Wi2}MJKT*Hi(W&gOm)!A1I1PYUWT@wsAKhyN zrpH+d5Y})AA__AY#%KJ3wNHQni#LCH?0%VxgKox;G8+b&NBUCGr73SM5}}702X9m& zO9!IRX9`WnOq5AFaWc@=;21HOEq#-ndyM?b1r}D9(NDTb9D`N6;Tr2~0G$HkohMLW>y$uhZUy=K`RQ9VjNTYy7tx41sjGvJE}P z6*bPWgI~c~w?*9eZR@phL00@Z1h>aK#y`*4(pZ%S1|zD#u&*tWa*^tsa%1F`X9!_2 zQ8f*Ts7G>r8ZH(31EPhdsj?~J%~OCLKhi>k*__OTX@ETiB8%(YoFDpj{BZtO&rq5I zliGrEE`QKt1m;lwtB$WeloaiYM6$sawWBCX4cifGAWE75%8w{#C>Jz|d))y5)j8K! z{rZA+whK6+;75?N9d9ZAT54t=+Wl{ywf|t|zY|TR_^Zwfh6tEXVL3E5t{A5d`#e)$ z@9rub{ZWVX4bCg1QO-{$6ch3Nk`cXg*6B8RAR5Y2TS*~S2x!8=SxEH*5qsO}BB9uH z;(1OCIM=Nw`-KpjUK{b|J5SRHGvB+>K7W{g_^*g){F2Fovq=^w%l$dud}{TY8}f5P zBtw0qi-bI{M&#@rg@j5`v^!tJmH z)`e@V@9Ftipo?U{@nx1d8Y(i4y{d{plWC#>j*0d2P$({}cNw*t!j8G429SEYg|$5y zpjjF)5z2;@f`IDMEV|`e_ZzAgOeh?YRCm2@_ zmsmzI&#-@C4L0`9_aS7B%!$u4b}6x#v8t+ty`V5z(-h5_XaAia(;tVFPc`iO39!Bv zSv_v2y==zj;WArOI07Ilg#au!fLOk&GMiQHd-z9D%PH{GZ^ zIluw1+8&@lde*1vw->35=fCy#0S?v;r(-IUOe|?x1Rd|49Ii?{b_4wl5R)(V|Z;&t44m@y6;Jy>VWC%#?;aPFw)*7xju z9#l#C_Oe;(YH(gq{-o9NV2_Wz$k^tqTPAVRva z*@rciNdW!cB3g0=MrsvX*y(3HR*CAFi*?DI+vZz=JnGys>~*Y?pJ@(L030g6@{tJ~ z9;dZF(-82@$Np`eUt=pf8WTl>Ve@5tUBkFb&7g=ZT)@%XhwV=5Q5OB*Gam`_Eyk;RK>0@U?CU6cJ>h?2ucW!1$ z$GLr^qPU=ZeiROdSr{oRI#|kUx2j9y$-JV2JQkIXV2J!Sszxr1k=gy{-~l51Lv&{VHoVuQ?|ivSnkV; z)u(}JceR&XIqJ^)Gj^}1ODyM7f#y_he&MP0^G957%kuXnEe=>#e*l~ONeYkQXk5nH z<)|8>%=dV7b&D8WgMKf_aKE2Sc#?|K`IZylGbn2-n{l!Hfp@SxxMHhQED@kCcf5cN-O=8e zt2|uk(n&oIsMN07pCtm%S|dDfx&u@BKytFk95+X?XYnz1uIBQKh0;Hl;@giOt(O+n zf7y87c{)J2*6?c9y_VhNUijfG;G&nu+Z& zCJpthDj-2pHEY~-y{ciXBF|qTT`{f?7UGBSyEw}g7|4y(=UjP&+&D$<#tbG(5W(V#JXuZL;n49}rmCaQCr6u7km%jfmW+CoakWiMbE}TX zR2In9&WMz_O!l0^TjIs%G}&n;j$n+oZw+Yp-s8=tod)Kh zzu?3$`n-JW(qlA^KUEM61d{&aKL1}2s{Q}pAO1IW!3n^egU5*jUL5W$>-xqAZ1?vv zwPQWO`s4e;YJd)h<7j1L`A{vv{g#wVxu|&C)mfaFp!s|t`PUw{p`Y;P_Io|NJOqbwIB_8d3tiZ z0EAX=mJE=na+@}S_po?ZfKqa)-TVlDONe7-1esn%+3mOIR{`t zZlxYjILp()J?9pobQ$9G%=JfpaL|<`U=K5!=Ph)BU+vsqE-0SorimnlEik z`SB}<-C;8bj<|4r=AYo4Li}?L9CJCBl?8tf&oSc}F2@reC6cM$_EuH3dK7?8^V`F5SLsv-ohC|4OuP(BT3e~t>RGX^%z$&(HySMg2 z!Sm{!^u;yyU|S4}dhv&ol+>JrgkDGK<+3ebg{-Fq6h8OqfR&P*N=B zFi^KI8jh4&W6lQk35&;Y$;Fmc`Z?kNF<^^L$nvC}v>{igSrsgLZsxZ~4GuFXTR>Rz zJob$0vtd&UD&UXOTi}09P)qPG2g99JFY1pX*{Wb`)G)3RKd>YVZ1_V>6_||}vEmP# z4k;vmqrMs`Zx*Oe6Y(aH&~e9Td}#tsi|$F0sgLBm{Z5-})M>NT0FW%MA(orXVN42; zdEe%=h>w^YgSX4Tz&PvyVWoU9Fo$`AD)}~>L9)xqe!aK^SK~=JAbLHpXAaKRO*|;F zT~&{vq1`M~#WfTY>FxR?c!AA+Lz|WIA<-ivY3s#aIk7NCHks&&R`xMjwNk5&i1F9y zDn*i}F38-PHv#m+g~mgvBW1QxG&XZ>F(bP18McUo! zl7jzf9&}{`w#Lz{H)`oLhxV+pYi#h9m`%9pQ&P-*(q=k@Gg9R$o%Y4C0-pSlXpKhK z0p!-Q>#}6iL|YVld%jx`vH`bRwag|X0+$O@9?n!)$S4|Rk-6Gu@1RTRr==!yNKwTE-w%+c#>=zuq0#tKog2J?gAubr zubqUI(t;v;^v`-(&X>w07ETu~>bwbvB7TfbEH*zUaL&-a!hKkATx`^P47D2r-eWaE zt;{AO)N{Dob^4E_+LLauR#s^JvxP$@GTsDCy)_v^o>%89Uu2cc-rjum6ZY=FR&!;N z+)QBT(7~jz>b3p!k;2?b6b-6tnOKKcR{=*_whe#`HDpm`Jg;a;N=`+2=To z501g<7N=_i$D(I%eM+KP=)gauQl0V^P5n6VlJN2`F08?@e}jwx6pP2pMPplrOj&;D zf)$4|)gbFH8`pC{^I4E(hw-vht1wx{e*bX z%l;Sr(0v_?1gkuDOe2%A%8`7Yk1i+ncdTHk$yGPeYx0E}2t~c-(AJij>xhVXO~CnI z*6{$=nDFK&t`7jxA{fOun;Ms^?Zw!&DB;!*7&uD?$6{YrUyYC{^1Uq#QS#)Xi=P$1 zibkkoK9EmAKE(k(rfZ-OiGcOzy83$lMzAm-88#SJ?Q9(Ioa{|;{S`$ihR+)2iOyhr zu2;kkj$}_)%Cpk9#I%`hkJX4Z#6>R*xT30ILH>q`bM{wkbF`kA)8c2~?1riZ$=>B8 zt9*aW)un+v>(G4dnW~e6Mc7+2`#hoj15iQ0kfOOyngoWO`afNw58{nMJ<=qpy8_``@X^`+e8-2k^^qTU=p)hS4M+_%p6pNT{ zDubAEgBG1aX7@KwQs-n6`|0a3*J%ZvlHhb9+4hgT5_EixK7}DVp{@z5hNPGlnIhxe z&sc(um8uIZx-G7X>ShPO3tcj@kKI}x>f^Z`JA9MuoP!1ij>o8JQ8_z+?UY#9sgbIf z^Ro1)c#CqmRsNFlL3v@w>rf(=X`Y>@`*YKO zQKb=Ef(j}c0OfL2zdis{l-;^YfGfGf%YEMoDaqJX8W5u>j~@a;=1 zX2hHMIqPA-6o^y4D&v8w+*9BuSQ#iV{)mmdG&Hqn%cx|9@Fx+J8VA%d1fqX6@Z%y~P_G1#Pk3f4fEJ~LLEW_w92R|2-A zlDdq)#(+fhsPdzvOolQWtFA)4$n_XOSb1^6q7?u~O0eou>y)7e5Q!M%>_QDCbOUuT zacMc*!t7_a7s`$k59b}zKWMyJsI%t0-J^hcW}wK+qc-H1?!jV+!AsZLt4>eS7KeWG z$#-`GQM5V|6CDc$kp`;)KMnRs;JOT6u;QKmPRL2K00HCs74b~eXtJ>_Ja+nU5I3x<-yV_ zT~mt-Z?-7!yhC3nU{H>SS6Z1~^&fZ2M$0PK#SPz{UA=|KE|g1?PsHm7fMaxE~r!<=vb5p6wwMsA@0PJxre{%1VDH z(oIc>YrAl2y*Qn(_QO)v2b6#H0{O|ivJ7DF2W4OoZS?rhJGR4dXGuEIt}ntkYz|wm zfP{Zt3@~jWeNMXZ!%f&{e|)&RtCD+Yf$nO%GMtjfDH@se6~N6qk-5AXKg`V=M_ zeIlQ#C7G0^TbGBNMk(!&w`GW%3ZF(+IcwkeR(RYwmbRrrFKCK+Q@1U8fM+sR`^v9? zw50DwqZeM&BGWPVVG|t2>m8l1|IJZjAEwaN0?TYyM|;P!wi4(F%K`@&P=sPOg-j(S zcV#E!MT%D|4`C4>k=PIA28kP$Mz8grko+4%&6GYK#FlxwakEFMqQ)aBvLb$C?*6OL zt@hrk6#px&{}HKvHh7TFAe-z@C_{U8%}b?pA%CaQ&^@Ih6&|`H_(a!+xdtmf3MA<5N_mLr^*rb89cqS?oeUdW|&VThl>Tf|#B% z39i-UX9!Vns7DjNGzZgs=}eL`RVL{?H6ZJ>%?{=Z4Zg(iCslNCD%9sM~!H}cFafRy5s}CVYKWug-e4) zvBrY?bHPIY%SF0kod`lLBFq*zkQ&g%3J2>RAPc(QcNG{au+H8^weTHpbtU4(29p+s zD2BF70tyN2Lq$o)<+x8iRaSJw>>GCC471s|Kvm5OJl(t4bjLNok`(l`n#xD()ev{Z z1P(v2kN(J#+uxXx1Ck*l>qC_GkHP+fAJ}@N{ecwu6bAIlkr?-Ia6RzG`mHmJ-5ZQh+Ah*XH_NG?8mFmS+5Lp7QFa&=}vKo zkLnn`Y@^v7=9h2v?L`tlXZ#r^*NjF-{u?HrO=rU7ItVn98nB_6pi4;C8D4fLP=BCB zf-9b-l$UsQ2QeLQ9VLjlgpZ=T`rtaMx1yqXJ9X zABDTxh1!y0126t5+HhxIR(0!Yn*;A41E?jcH`F3P$JB)%e#*f_Abed#N(*h zw`z}3h|ou@Zj^o?;T>$bu3>>ON;$+G+@fxO%DJsr|5^65qT@y{*FPZ|k@J{4h&ARE zKqHQ-#uL~v?GV=<(i~49l%@_>i*}96jRsg^YUofms6Cd-GGsTu`0=HVIh;ekKtC(tE6Ik^3dw1wBfAH%N=G}Tr*om7T1yEp=Itn=Rl(SOa7;P7a zAc2J7gOExWA%-te|JL!M_n}}p*I5`_+lC{)d=u#4w7ewaMLe&8`gngn&zW#B`xQ-! zYb93mNO=7SYi$WkeK>3{%Z>yGu& zp857nm`1Ao=4=YQ5=AH8$?_wQy;WUO@JI+++!jXEtxnTrA3|2EAF>AxycW~%uJSY; zBwWc(*EkPv=X@xJPIZnO(>F^o=W&+Ud0QA#g#Cdi;$}^9%B-q`1-d)eLYE}x7ZrW= zLg|&Zasp4BDZeSW^~GKCPLR@?XWa|aaDMJ`vY*6dxAuw4dLbCL&R^9Qb6u|^GVOk? z*0_RgUEwuSFJLs|UC~S}R;`YBz@(fnvOHWOgCQ`(7C`0<9B(%qq&2r$Peb{sLKIUE zbGEr;7tpcA%7__`CPRiSPouDC@6X`LxXK3Lbj$6MMf`c(ACE^}ETU)1*9&Zxl^4w) zZ~RfDf=1RcP4)Kt#mhfk%Zd;owDa_+c>0Zue@lER27zygB-^8-C?louyYdhJKtuDo zM>(3nZ?ZoYwdKW-(4U~nhQ$B(h@hdl1)jtunCi@X?oBra8Nf?}dR0s%t{vgs;j$vz zbBypm_s3Ht!vW@i8%Bk?z;Z-D^)fs_Fl8|IqhGg`;f|5S)7bMZk%GNnKVZQT#dJ*Rr+V z1ZP#GFp>@n-cr@d3Sr&8GK{Ygoe=ZbNyGFWIDX=4j>`oHw{%;=pX1Rho)L83!==0h z*vM!}emmacxZdZVD8K3>T(pz%H#p*Sk`rIudtl=;U7>2Jl_)Hb1m0W}HcaUn7>Q=0 zhKo#NVJ(0%yanauZY_bv&;8Fz7I(g}>a``qd&1!$8hGDX$_bl(=M#8$-miPC#$~nt zC`r!dw46A4!8+*3lpIRV-5l_Tf^Vwe5HwwSF3LXUBXIB_@93e+D#t~xDKr$y zrYk--9>}c~e=YNeWs2OTQ^=IvUhGqV)l$Ikv&(3SS*%WZU=wx2E2ouDV1skmL*HkO zs4KA06*}Xt%OfYphdod*o!$Cb?e!l;(~pb?li@UGc_YLMN)?Xh_RfNLeyJ8~=dTRp z3Ae`bkMZE50yl3tA1)WcHid^7Yk)Rtlo~yZ_WqA5FX| zuR6+c+o_><3LAJ4d;CwI8>-> zgTv*d9Qs84r$y6T9)Wja$c3-MhJIE`-!0Z7@CM0S^IcIi=8_+IQkp^;(%?nNthGW1 z6pYCDcltG=e^$|xp%D{-FZcW>xt?=#1Cgm!4BX$HrES2+sBAUHA|g#Q17vg;c5WNOHiPk9;Nw5+yIeDmxX zGOfzE&2EwoYvNJ#ma{D>z-uQQR^MSaiH5im!Tqr6^rWmU8A_W{a5m(2mIkb;GKhsZ zoq=4JhXeoMD7!F5H5Rd2f<{z+09w4GlFFKbU6#hBp$``VDS3qga14%Ip00%Th;`rm!e79y^CHOM z2*jwIz3C%Q)_`;WCh8WlVn51pE8wtYR9oCk&7jRcc$Od;)FF;3`S=>{tq{#YKvG+~ z-%_}8IUm`vz54Mfo7FWTco`hC&!Y~D3?mg94|>uR6o5%Wh-Z;G4@`Wld&-ahY-|;4 zZB=)QOxpkB8f;O{ahUi3-Y%TR{9b|Ii3pk^%kys&Dxd9u;5Z038Z93X#}s!vLLF>9 zXR6%$>}+iOdHxnvZ!nDvY>^bF^Ck8p7xw+m-9ACA{fEZo+M6TLr7zZU#80!N-i?qq z3!H(se=WM|d>YT%`+JUwlHY3)S1A?(3>*?-;9Nwm!Jdxi;QJoR933vCWm$dV2p-S! zM}=0agV(gue1N1d+y=~94o=MbF`fl)^=>l@**~5+*W_^f;j3%%<4B|aY{8xk6$RLu zA?|fGx1wm&!LXr5cH)BfREc4b|Srrr!-tZs`??mp%T7r`GzTjsdI$3WIf&=qH> z6hSHlo*j8v$<4GgNxvA1zK>2DqA|}G+uQk1)5U0GdF(sIF=Np8DE98qwDaz&em-yx zISw+?i-M!^0Stu8+r@vk0#4x@BO9uu!KTU3{$NX=m6FFI&y~THoAE6EbYlZ5+JL&mA~hL;LvQ+57goQ z6-HKo-rgL>WJLziy3;d%>-uumLm1#{Rg8Yc z<1rEFV`G1HEQ%~1XUUVqp&|dz#Jj)~IIB#p+^!>^C*DOBQx@@n{_k-fSjb#s<8w^E z#(7ZCYpBINzIZ1(WTXDSpURj)QT~{baI+XHGG%ALnfH`;%LI^sgc)=}#Q|rU7coFd zu!afW*GYT>{`wu^CKT6KKZ`x!vRxUb1-=Dlx(ylwDN9|HOmV-5@_AKcz)2pw6%gno zV)@j_*W+(%;EQN!29#R}Da&Dxj~^(E%C z(qDtqJ*MWH*)QxNI6UC(bdjujzTiY3inh6M{AsMuanUy^Yt%6v5+q|DJT&i-Q%Hf+ zdF0LhNIgWss-L8f4ozUq-fjWqAwlQMpn1P$^xyOY;Wu2PQ2JKj&tw=Bvjrq#xO!Rw zI08i(UJGf!gAYg#Sfu}p@@uXK_x~r0uc<@*;X^&6{&?yDgh|IsDNm=|esjwsQKS(NwW2_$qXhsA_g`OZCw-*w`)Wml5 zkRmiMqVO4%!*kwF+oRsRM`reyWlb+;mbLlVi*N!wQ%M8Z7(tUGgurj!XEPfYxU&@I zY%CT+t3x6o;#OVhl!wyVzJ+*H9&8&L#pWbBTWQP{?fJ)J-%_b6pM+OSY1!baW+>)- z*55Az${xLjqvMm{1=d*&K<+XGU(zHkQ60|=9-LGFUDT@B6kyT&2oN1MEzCyq{E#j< zwWU>2mA?_0*dM0d2>UkqPpU8ABm;}vNAYTT4a<_vRWD{$Wx`1%430}GR6O{8ab>HE zetZWF;_J!Jzj*L520Qy+{j+GCnA76BPc5~M?HiguCRgyOJWKqLVU?@>wiF1K2A|rw ztb8kr4F>KdDpW6mDzEAVymwF14>-ff91b|yZp>#1w#`ZL?LP@S4EbL#)Amcyy3Z~* zY~82Un>z!1a~k897$8wtFG~K|CEo(CxKwm{-9%lc(;C_1v#+=4DEBruJ-gL*sh^oO z@$61=MW;9;m-sup4&6SKF{_LBUbpKsho-RTG=i*B zjvT;V_obf@@%291Ka=>#qXft`ji61|2lQT4Z4+~_r4S8!v)Pr%n&W&P5!DwP4|Bf?zO0mm=hY~yYv zCn>z5d40KF+9cVZFM)tj^;M$X77Rv=ogT-waR~p>kpZa3!BAbQIHy>$&w%%(JBV(g zI2LVe_0I#`;R_Oo$xCO~Jk7>txTst=AZzUc(kOa# za=!YWvfl*oAKN(rxqX%DPU}zE9JYSC9%9c;%Kg2pl(0_ zI5x2*g0%+@P=j%s4#6f9Za2I{A& z1Qj(RSadp%(T1Y=P|5(GM)P@aiTte>n2F(3(76~}@Pkc?&DdAonV`E~4}@OVVGFri ziA+GicIyRLfdQ;H*O@*Xi-7Sb&J7w$=>!B`MY)q;)!J9AUTzhmdpUm>6bo#?+Xo3Z z{l`s;Oh(QMxNhQLMgwNvmG9;VAfh$gQ&kAwK*U&MNd9`DXv}#ipC?rzD-#a=S2l;2 zr_}Mpua3j6xctc>z<>(A=W656HHWq5Pxd3uA1+oYX4a3LMa}OHM4Y&d;C2V`8P7O4 z|8J=tXNUy2^p$`8`;A1rvjU+vBXL&>$GM2VUPNC9I=lGf(9Il=Nqv|L-fyrC)LMAS zjf2$-t*}&VF_$HnR<3D#jKDu)h!J=39~tZOMcA(toGO}>LQD@JhfAH0)`k0kdRc@c zlMUe=!fqF_l;=X?V5L_E2?3M36_BLOT&HjdbOK^Pm)&Zkh=`<~1 zT5k5*$-w5|RA+}6y|(C%#gTIRJj1=UiA+E&sKfacGF2V;G$vNGiZ9`iL~9o)~aI6WiEJ(QwJYO(8*(94K9CGMfAKO9D$|l-Fg7seeAp_U6U6-#&T}{DP1jGfd-C$m z-wZmKG9oE3AWGI9i=da#yOLs2J`;mFfnSxT(GgCXkavRf4+zUU+09=zR1P87_z!-5 zSvVUcTvqc2W6^LE7S?r9Cf*QBwMVc?6#Xu3zf`e9+VUe#C?jIXYoOlj3L(oASeKX2 zV{{06q1E0GvABF(gClP8?t(=WC40Pi8F2#QwZ_t-%tZash5crk_Ky(4e zPnxehe#`@C>Znl9t$}OwW^~h>@!IYg&M1oBzp-0H3CeG#imgEXi`1fgCkXnXn{@Kx z464P_7`tC#-Jn|TfX13ack*)~mNgV|hjacD@nW}fZuH6aJa^QKE#)K=+5sZ;^Zh z&;RgVjRptNIn6ybi|GbCQr-Ekq(0l8bhR>hIOiS?faSr}>rGd}G#F|Q`||fSrfJrT zy(#Jy4iPEl@uXw$*7Nf0o(yF0A{zYG z*6wOJJtdT0>E-fVUzluCFum|RHOEbG6uN4jm3S~5YIh|+C+~qHk#d95 z(hXJ~Mch_|9Z0ZZ=0XRq>Tb^$VVtu8oM+lMt`V?%2VjNPJNd>H_m~gEqbUmSuA{pQ zEmEPV;W!S+6%_cksg5r-V`GedUcc2;;?*yV`AQKEBp9*kl33@u8OCycRO21)Qb<|& zw9EdzfC+Gd4>de@kby!ZyHtXcxjM~}p`C)$8qWK*`N1a^Vd+{$BI*CI3wyx8L@@5b z0-QplfzOiB9C2ARVqc{I1CyI;i`g!ifnx+*$1e23HGiB3!S^Q3smW^+Ixy0_iNUH(f+g+ zt!8#PIfB2k0LS&b`4C)w0+qOcVlEPn>+$;)`A?OOb8C|f8MjWZc`14j$?I5H*~{o9 z51cGaog!gD?`tDWpHaK14_xiHpWNU( z-jY$va;|Z^s4Iz+V!SGGK)R-rX6~{vEy{`?Vg1i{pebBFU!A>y{psXrvmG1{EdWvx zta@i5p~Js+W{Ju}oZq4b5-(mxqt?Ci&tFxCxS>5rhbip3$Cj{xD@&uw4z)^ENIEK; zf{e&%NdLFgycl^6%|k9xJfbDMo~=*y3%qw1sG=mGnc@eFOif9=@^qTxbJV$ysVoP5!m)1GI@}}fz&MlA}A4W4o;>LPXTZVw8-hvrXS%Z2f$E5Z}OU% z-?yIq8`M{&fp@5YchseCgX;tw5ny#f9#?efC1D?WI1Qf5c-2R3%x6Na%q9h1h$kO?5eq*&hvRH` zq4y21|GIO5xJ{KaF&dBo!};!8KcAmPbg0(=76XASQ{iCEnkWk>p0!5JC~O#mS5Pce z!oqwZI2m?RB$|7r_?u7df7<8Mv+*<6+JUC&fn%f}^FF0j$V^X^j4@D#1>j%Q9hcd< zE-#fXX3Bum_94uk{yz_ez@-OAsmcYZrKcx{5_H*sZ>EK5I0F|A^O7)&*|i~cuyhCb zXf`vV|9GqO=d1rpmWt&|RVgx|wKh0SLO>6@w>|~ipIUDESYn9UV7M4|+rb{Ih_02%T5p4XAe z6b1k$;7D^?=&Il}Wq5fE>iE)sta^^mf3{d41pdF!x^gdMkzbeCHOF>U9dfR&-_`!t zurA}##>4x>mBIH>{pa`HKZpItH~gQ{ZbP=ipq?&!e1HJ_-sx4Zc*^!-tJ~R^sUb^F zwCc{)4_3KUMe^9^LXiaTpNDsz$pKv>2ZsveysVW4q)zs5XW9B}?!7B|Qy30Yvg2F~ zqBT=6lvnh|`{J+B9#gBpS{KC6CYV&(oU(E-L;zR&K@KPd#3 z&xSg%f~;(^vs&`sZyGRogu~GWd#_+Zu-JU68`i+Uf%;cTcwPbT zm#ryytO%GzOE3qZI;>j1wq?&{X9c}wWqpZskGGZ4i!!IqWJy*(J*T`7S*5KZHtb0_Svj(wcX`pQ_-|y z`!n!yu!!Mi+oei?7+nna4tAD_{P+%DZT;*Z{{Wsw^eK{uIaRANn1-L)`czd-{E3eq2Y3i>Uzh2!S6t7y= z-F&L9_5=IqEkB+O5g!s>E-I;ysvP7TLo4N`QKSFuEjaJ~oy2XxJO>WZkJ5>6-kpF%ngHhlt??4T{fR-BeKlkk2xqa$%s~a7{^H-NGfuOGM5GK7tWSsx} z%B=@vrM9ai6^^^UGodPsg+Qir%mm9!CWNUYicChRW1Vo>$DAyQEgJ5w_hdP<;R8{j`emX>~<0lZu4%ZHQI)00*H zKE1G|9fp)GOZu5EDgF;cCdF}Py6a7JS;W9^`A~)`-g^WD2*+}M*URBz^Z8JX;f4V6 zIs20VosOpj5`E9$tXPk$cW!g9mRqLhcOp8{6taHyWoZ~?*IY9Hib?$)JXRM&GrRr9 z^jEDFAm(xwQq!Kr@}VwgE#@{es_a#gShg^muU70PsuV3n8fNYf_r+FRg?G>1+ZncO zS2RdTxSS=k;{e=>vwPnfEC1eRW^Rv!lt&L!|G71LV5rBsGUaYSRO~9zvr*N2dkyL zvD2!SI~0a&oZACS9b68tLu7ZHZV1R@AAI#Cu+PP2zALGHshP2io_CO7b1ARgd1akI zNju=HHT$sHwJ<*CmC~i$Zlu`p9Li$YydJf30K}j9PB^oc?rQOrZ)};# zirCJu%kiQH0SUDwP{-}+Rvk~pMtAa>A)j>w1ah9FHLd&blohIy#zUPk{?s76UxqH7 zW>U_Kr*n&sXELJ*Df3aqq=fR(nA4`+S`9{*NONvahJu>4oKfL`F0+1T{6ns+>*UYA z7Y>;aF;yK|+}0oQA!NOrW||ig5%P%tqZZA;=IBdrhRK|I5;5`woivN8)8kbFd8T%z zfz(c;9ys|g;u)g3a&_SSz-Bu?|A*kv4Cz++T3x#EysRo>=<`}39IaOa@qlli(lFM;+sc8Kxgh8Z2zwV2ZS`~ql3W}LYDY7y&?)n zrsb;BlN7p)yo%HL=-)?LpcYQ3cYm<_4ToQxe8%x)e-3MC{Slk-U_So0vR>^MFI3#} zdRzSF`lB^Y5Bf4Ly|ZloTDf#6rw^@!82A!^Y)mfu&9GAq$)4qPgSyUU$oT9gyW2El zKtxO>fAM{@`I^2;cGU&E)9HTcgTo`|Y!-%eBn4a?tFqSXZJaknqoGzQXc)Q~(-ycbR zo**yKmNnNOXe76a%|0yM&sPeRT}PG6>DS(`eX5ocrM2a`#({HTq{lyn-B;H`RZIx6 zn99xQOQr+evzV}6i#5uRJ_<38LTPy!H&kteWZgW!C3KaOB2?KRb$}+CS`vG#(21qR+MdY0Y42!@EUm@i?;@8kv9j(v; zmhT5VJnzWlX08TR!{bTthz|g##Y@YobeJe%s@$8L$N%ummpCHT-a2uYKPKuoh$SZ@ z1?BMH>gvUX<^tc1FW;qmR|7vd#&M;@yid&*?`vC$j@AI8(@1Q>)M<(+XRA}J-i!KU zcxFr=IJ)>3Fs_QLeKFE8qHFr3$5*0iIbQ zZfOcqgEc`;^(HY3)3fi>fL&bwt}c!m3|@_7)M)(f&w455lIy{wEoT+dy&d~Td3 zDH{3LVQ!vcUPy3jI1A?qLbq zQ$W!;E!<|~rRE&EwC~HkBBJ(X$v(4WHZp~dL1lU9p?ItI++3(u{T*8$fZ5d6#$oPR z3EHoXXa)*9m0qbMQdZ?G^^R;p!Oq0~y))qi>UMF{CB@*NsHe`x(#y6K&bG=Y>83G@ z#k?L0HFk^2Bl|ctXqXj~+KDh`Qd=-gf7>Ik!XTHRqe8(RV%)`3*#HSe(7EwbvZqjEuiO? zDycxY4`t{t7Z`fCt(_!o{3s-cfN-jN*UFO7;PJj?;A)&e-~ zeD!6Crw6!^yzGlB@2-|TnXleJTC#d5a@K7W@b1J^odgpFgT;Ad6Ly4{ zzLcwSidkh|`RV*odDCx9Wvt?P*&|0Tubi^o>`w5EzDTuHYcq0)#BQlSC&i$u<_$(Y zYdcR+>1QLuX>X>=;QoB8$R7#8IkF` z&z+S|X**)A04d)(aJQ_IeEZYI`?FD6z%!n5a@*{!O+ZqIzfb}%HZq5(YC-vR9;w2{ zPT*RgqceBp;9H;_W8F(rqGMxYV{8b)C-B^w%WYUQEH!~s2;VX8uwy1S*c zSOfrkA7V}x>kpAw4q_LzfbT@~l+X5Arc(~=nt{V3srChcRE60`V=?FLG>woet$CUi z#67ps*yS2``S@#fI&@rNz)L(=(AWtv#c7YYi@{yfy!R+DKsdMUWovilC!xfc{f@bZB z{ig(K!KKflOiJ~QibiZwnq&8mPpCEi<{D4$Sp5*BY`3d8+Gxf~dq`?O9q`zW&G~4r zcsA1TWivyO58#{+Mp8SV*p_`t58yK;vhU<@l@zRsv3TUelxu-HbRu~n31O-hqQDv= zv8)MHjB;ezn&j1B;i!9tRbGZy-T~|86lZTF?@m8CWNpCjR<;8V?n9SV&N2!%5?J*! zp3|dEcQalUwh=2Go5GMS_W{Bl&PP>ar_k^7uTTs z6g;DBna05x=SN<6-a#r1j}`&(o?;k$@hzkjpIuH*+(YuAnivM>Z+@`d5s(ELwk$w- znB+bH?M@8#+?l?7?Q72Q&QSf>$xe|~>yf>00o9NVEO+z;5{c`>!=}O}zG;76zJ#@)wq>74XjGf&*jCH#H>o8l{3=H@U83o-L?LW}zQzJ)2 zAO3ZR0ZSk+#A|>v!8pX&o5$+sk8ZpSVDIk6#zQaH#%rJ@FdYKT1~3N@D?`o!@r_8WZ*K#Jtj)N&-TYMeahoLT6=f6A|^q1auf9O|_T`)nPi}S|h`TsoQvx;M3wM)32V0YY z!WO0Re%V6YUBKjQ77&h*+4LlLw&&ny6!a>uPX|f0MU?vb@u3dlJ3@gxlwbcLgcHK! z&6zbj_vbnot93-VSN{;z)+^yVTKi_+&b#|PK$wJ3W4}q^vPzHc(17j>4IAGTNap~c zs=shw9?*+bQyfr2;5$K5u>Spq)OWDA_&|KyOfcszhlc?X@O7tXAayWI!@0z)(kP5k z?Pb|=q1dj8)qqY|f`Ph%s`=Alt1b!mdL@fSN~{;gg#{+~(z-(&r{fs>B1O>(l(AYF zO_fr5(dN%yq%8r01$fR4$Xs3!EiYL&6nc%CeZ$5&_X@vQZ-`iLY*(2DF0}B-5+@QH zI1gpIDmB$W7X!2yFZ(OWHnYrVpTy<=d!YuSbJ&zn(k6;W1ahIFg%SeaI77s5qMC|^ z&$D?;dbvd_q@&1m?5lkQn!g_8lAo;GqA#Sz{PVSiuK&M{di=lnm7jucu^GsA_w=Av zERMJPl2qt#L0;;FUA9{3n4a52+fin_3L{79*JeTQ(Wy@1L99 zm`{qW!&6Yb4)E9Mc8alS#kRZ=u+W^-lf!zbo$P?0)f&v#U!U+Kt?SRxngUAXJ=A;Z zfCF0jEzA^99XI}dzwUDI zlRS{@^aJOn1q8T$FuXx@1^DG|Hd8Ok(0Aaun5}zi4W&kZFOO?v(e9{YJrGV|Tzs40 zTmeP`B#&wNdL0q7R-Ml+b`#YrM33mzWKiWh(;t2>m1|(`ri&QoW(%tpF!>KABc-)0 z&Ga{jjIsqwFDd@``{{$X*6T@=4Adc8Om%I0_WL;nM1k&->?tp`S&pRrl=u6v3SdWZ zI*TiX4X`4z&>8xUcgIMDNl{it`5n)gHLG2Jj#fBst&DI3ol(*cG}lzHjHFkXx&zHf zsWs$C!%my6<_&i}zeA3s=(Jw@Mc9wToxzLX|8W4xWcj}rK)O7)?))5vZ%#L(UDmxd z;ydhHk5P?`1NPMta+7Sd@KQ-{7}v4sf8qHRF};+ND*zRgyKzcU|4VNuYbF7=XL71S zq)Z#~n@@f({`uMaC1lKClXBJ~=}Uip&N)~}BWOcZ0`B(`Sj>EHYZ*Yu*?rbLv7O3B z9^jmE<~};sA;lQv>@;*%vjB)>t$loxxS-3vn+B6Eu@ReoZI3pkus^Xf`SxnxB?DBkW^cQ5j0N{hgS=?myx{9 zMylhK0gL0>0$b;mL(eiAO7dpTWPK_4d06$Eo9#^`uoD7yYraA3vs2CfBS^m7YdQN0 zlkT(mCAZdm%m;gae98Z+W|><%x?=TFVpdk2nk&y93a);UYP>U4<1?Zlx>T6qpUmJ| z5)7W_<&y2qj|W@#YC9F)RxAy1eQR{UnYCVU+X2*oYih!)^p;vhh4rS$t<07moU91< zd=wp>TryG&Kg@y_FagnStuX;q+~u@ zPLf0O+OQU3vDz>V8?9r~>_GI3={&z?o}m_o}}h*+eJBZOJw#`nYB zOP}ioHz&DuM-B#FU0%Li;E=s(9;+T*v!BA@xV)OJHbSc-`*n4{6(c?7+BOhw-RsUf zof|zkpfj?e=D66Bu&$Z92?sUz$Hzkm>~{@wEBAzl9|+r&E=3OwQT(GOo#^Fqx4G29R2OFt?p`*j zg)u?|wm8yr==``gn0m3dx&d1I*pQsl%Y&d@N%@UK46lt_-bvHBjI@~>ie%%KpPx0p zVn`7lzSsqxmEh9an2IdIZ2H~DI&HNds}N&2 z{F7fMKU-ZS3(XjOB^Gd)oE5O}7i=km(K)`78lSe&0Utq0Y&0?;LI_4lbEZz_Bb`$C zXtig?iR1-^lZ{5KVX9hDBSYs*i@Z9+o*IdB&Kt9?e`Y7pFVw3|#HC}uOWd3qexSPn ziL_V(1TUFhY%CUKd$VZPTRnb_<=#zl6+h%51*A4&!GNLgcN~jAFG3IzbVCJX2thlBaWF4-DQo zH1cC>fMVM%m{m7UnWHMZX)}svj@wBGsVXU~UaTCs{Kd(wDB49*RjUr|%QvTM00sf| z{LVLMm}Qzxw2UWv>duY;Uwd#@L%MG8@pf@3yZ3Ytm6NE8=NP^YA5!*~rhD`D@=t+v z3DckO=%wHDoC%j_^g_9lG>-w1ct5U@F!O_SvrZW+Vb_E-MGW_%&szi^q~v z&!bPpA!ff?-$1-`V&2`eRLzgUiL2(vMcLLSH`ZitZAMW^hAFhqE$0q+dm=a$^Yu1h zp-F@dT&G-xU!FcuFqtlvA9wHalg8Cmvc#SZ2d{MVM;WZIP4dU$+7T)X=EOK5AQ@zwJ9C%BOWSNUt1XSqrKv@gUR%pUs0(%=QC#9NDM4@cDQY! zYIZGOcRr+RA9q*WvL`8@%_BYp+7jrhvTql!^m`uiiQMb0$YnE`R#~AFY7}71k}A5V zbbg*&u3&YO)N-sb_W1ejAtq;S!Hdbd9X5-?Ois;kpmz#=|0*tehz&iJuS4?!UK~ck=zsFm%9N1=kTycB>?}PioK|!Ei1ja#;TEUbJ-E zJBC!p>{q!7hRUOcU1O`44;8&-7#|j=T@Av%d6ItfdnoTG0?Zp?2G%!=eRC%I8@Z+l zyA*!ZXkE)PnBn6vO0|@cFLpI14aRMJ$)3vc*RMoSj^Ut2S9ki%=2?@%6Q1Tj_0t@{;8Pbt&^~r0a4K?2(br?6K-9=U?vj z%U|N&Txc2~DOnL3C-wIT99}kPCWeTh!@$|TJF3z2FMCZZ&&kL)2eb(sTFo%`3PlIP ziAZp3)<>pI0NnXx77f=E3>L-{Q;D5SF;$mAFDbP>?|Z&=Y`Yo5a}wxcC$|s#VcH@I zBe8MenzLos>^Ht2b9TFVjGxWY>-pg`(q>&<^xxJH9#r|`;7B$CPGw+sZ#dSlRF9i?cT<|8~b}I^d*nkMw!HZ6so`#%l8e+&VaJ z1Qk-huFMV$AbrPZ$gtVr90*|qkMUu-L+X|-*vmN%PUzrjHA!$vsNPdnU!Sxj<2LJ6 z5BQS(7=mD$$Qa+D^m0NncIxA7s>2Z7yh?hT?R2U-Mm+Xcy#L)h`Z6Wcaw3_w(Yb0S zCPU}2z1kh)_4Mu4H&PjLy64P4Jf!07T4e1I{VKiG=e(V})M=pA7$Y(}T`*IDHcai0 zn__!CgAMn8mL~q`jmjpf+f`{;`I)|~X1pGN;uNwIulLp}{#n!{$y<)LMBXNh-l0~_ zXObm7!==*eED444hG|U@3nh@jkNVy8D#o<-UYzaspEk4WPZ&6VJU|_Tu*Q*vH`kvY z)G%3Ee4s8y+#O-nspsndp`+?YmvI3@9oN9ij|WHSF?AL9oqq9LBL8ro&}4;mS;s9hoo4=ia@R_w>dfBPYEQ4`;uz40CHoCRt z8TIzth*nx}b&Iy=L1$m2|IKv^QcAYg(h#z$L}W&=-lJi47StG0q{-14*z(xyKVj6R zRz3gnOYK0_>__B}e8~AV5d-#tK!@wRODGRwF^6*WaLK8T#1D1po`qKJn#N=PRO)qe zIYn*%6{LX9u?d0M1?6uVGwbau*77vm1Fg)_% zUutjm*Tp-w78=Ev$`O}*oqrpsJT7E;Z6Y-u2kxZK+SIly%A29#;oaR<^+PLl*2OY^ zJQvfeH`pE#+|GONXl?&M`2{CG-5FYu9rjv70$wc*f1M^)`B1;)xY}K1e>=4%`8p@V zI;0b?j|3PAAx6qcA~&i-$A$h@&9@v}5cx%}KY)kT$~d)XNeM@aT?5^%`#qV+OV)d44t{Vp=%ZM< zIIa`O6N|XsedDRs7YToPg{HzPN%t*ENvw_wi;EM<%2|1jgY)5rTVS~FTCe>KQT9}A z_TDWxtX%brF1wGqX$L4$^+elB@h{3=xKmATfTYlMUM^6@?90bIT!(($?qhuKf3yc1 zdVZS>LkbGPB-hl~*YvLuV&6WE)?4AbLCwc6lW71q+O>T64+aj)_5=T;l~XnX`23_1 zNez=_WFWs)laYT$hWQM#gUwk|#G_mNBqc~owf4uZt|B;3r#mvXHKD#u>rg@^9(24Z zPJ+%*Fx+)qF*nR;B5ZF#MrZ{?F?w?1OaFU0+Wxy% z=R=sYzQe)-C5ztZ8J5j2FB9X=cUsH?9i7R_-E{_CvK=+ zSsCydfHVQ{msPwxbFwL3ib)0H&la9;iWxfPT_z>xcJDiUhZ4PLd8IN?iz8>=s7ZuFjk(eY)?62Ld9zmO_eu6e2hkEpqT6CtZbnNXNAWk#m?qncDrO z9pili-n@*KLU>2Fp(jJOTZ(GIZAVAPe4Sp*3Pd}QO=Qri4e`Hy5yIDazP=xc$UXT$ z500RDDX-_(H)Ujs*G`<2*?af;Fw2|H;7W|k)s_w7hUGqIXPif?l0h=`ywybJjqzCt z1NZ2gr~Ph}-gi{LdNLIU(e8+(H+G)jhj~4JATG*qXa+cWe(MxcMG3Sp>QH(w#{7%` zpJu3$M@d>wC&W)~cXAxZe=|FA6=Tz1W}Cy>@i5v;8XE!e8LUu8@JGxK?iUo~rhSeH zdgXoFNt<-qUBy$f8F-?8VR)eYc@L@b}n{!_cyG(DmzvPQCBNS=(A)nc=*uGlQI7a zTGpg=QQY5qyT4S~q{tHI0dcOCVa}2>NWQ#~bm3W%g+%m$lT>9xf$HR7%)}%3xV?z+ z#BWE=MineGM($WjRPE}f-xG0FTa;8!(W=74JZGvUQNG){&oK?LhxikiJNVqmtj!Zg zEI9tDr>^Y{uKbzvStUD9=R%@t@s(@tGo?&he!!FdPe*yhR}SsSDl zt&1F8h8Zip%f*2_zjlinBU#5i5(bXL@lKsCqZ}_tSo?|?1l!KjHq7oR6=_RR9fjKRyB~SeWc!{reQb+p(LU;k7d4TN{m@?KZD3NBhzbtbv^0 zt_)H=fX#yQISrw_c;(&K=;V&i@RhV6FutwbpQA zPwBO+`Q5@GojVKg;LyXrwP6z@SnsIf;w`~I-sxOQRhdr6j;f+deF>3o1OX0p>6$>E z7bF}a*3y`)Bm;)ZKk8AIoP(>{cl`XK~hy^*-E!_b}^--7mrK~T9ZV8)e1 z?GAR!VQnlvtzKZg3>*ZvJwgt-WOU6S5uIIVl8X0j93S4;yM#+j@wonUAEIXX`=o?# z-`zjTwo!Tll;qAq?bv1K4T0UG{0j|Ske3DiZ$oN6+qpr=VncW%x;Bt+{S!iec|US4 zBOGxv@q-c7I{z~nN$%JO-_-tE1*N<51doVG5rP!-LITX`)et7H?#K>%-RwWoX^<*` z{fg+;Nkm#b(OKbuI3t_V>%B9OpFK{B?PvLUp*O_M4j7m-UI`?MC&bU_lLK&J0E@Sk zmMhMhlzsN4l##b+Rn#p2?i5w$x=KI%@ik3PP=+-JYi+yoXamxv1J9+KblHY}fPd!%o1l-7GbFmF^ zJ47wZK^io)Qq_v04BAr0LgpSQi;jFTNG&4fohh7mmfJSYYLSBoUM_-T2OWoBi7~o| zTXoV{3Ze6MPsL%jJi)WwteOG*K1d0EIwnZApWNpDc+`*0x@@bI#6-FU*e=Pp{N~a| z&bM}lOCUJ%pJ-Y1X5rMl%h?r*=fhls`Rx|&P-Zc7t-*97AMn{VERQu&PZ!SDan0AT zDj#vlV2B1MMzhdl@%pss*6K)n%Ba7*nma@j66oyEGDoSGIJxE%`VchG{NeIge`LS+ zPfS(^c06G?$7LGw3_K+HW^a9;QAsJBtJ;265`0pU>q3B{PH=OUVP~dZ0_}KDfi(_+ z#ubi5yiew;&kh{PibDDl((kZBL(fCA&Uca8Pq$=uELB5%Yh0;~t&kzh-zp(3VAr=L zz8w(K>=AOz#kyVNg)9*yCnVsEI_kcG3tc=?pr}EY&ZHi3s~f5*OVf-3%N<2%@qT{q z9T8GuGa2;)`0Y-y2{7`a@Kk|xsqpCaV8e+Kg5CRKQuritbRxLTb#SEqq@n9h|NQpy zOrM}6&sa>e5Yk5crr>Tuo9uU6zdndXs~@eam}(g!eVQekOJb_4c8lZwNP@b!bw!O@ z_?Ed#e!G}u27@(2E>h3~QJ##Vs<(2Cdo+$N@X(DOel54gctQ)afPh9s) zc3$~Be8Z~uAJLdB@BC@Z-MA2Sf{kFb_1yUuW3TevU_RCRy>r0-R;Emx&yuLwXh3O% zwkl3F)`|N3q56>}MP|O7uhGKsxGM$q-5-oDlkZ?ieOHW)cVbFDtrKD$l}U;jjeq#R zpU$6%!;N}z_FhS<3GY(1?m;Vq&#(~s=L-8EDgxZN`JM>)Q}AgebUfdmojlk#KS|#Q z4pJ6}l^+%oUnO~`UgM%ff0GKq-CVpA9K7?{uSAVx!Z-!jzWVed288zHa-fRzRhx6j z#6Wa0!9Woqnr_7G=MBrl;e69Sn&L}5@TTd}FxhWf7q?1ODk1M9t@wh>>`qcz1!;nT znw8GX7wSlrtGUU4sRf322yj4hEUnT5U!i{Itr6#bP}Y#>Hal0%L?XA4J#+*7=jCXD z&p?s_>1rYUd;ZOZCM`rir6}id|F~H0*wOZp2zz62_oP+PCf-84HJK{e1w2&7c|!qQ zi_J1xpN??SKbu77$_MiG_Z=fwX&1EvxyxZpCj520Y~|;5F(x@ZRmR4$UAg3bSNp5-wRRZgG{;V@GA1ypci2&fcH=NsTW$Zftomfg9wY#=&@ z`;U;GLgY?+{9>Kp_67u^e?eEAF#1+7YaJJ50Ai;%_#uLZ`zFRz#1`SawHm}@sjoq{ zqmeTbp-9D`aW9F=-IW>iky8+|d25Ul3uFWc@h&k@jFQ2AsY6$0FGeId^1}SPDJ0Dq z|AjOkbD5Z!kil{vIdUXnm&+~8VOd_mNBgkO{b#iF1YOuyeNLX zwF8>2`6nU)8VNI(#L|#-BRaq@;BTeJC818@dp9(-Kl@I#Q$Z5i+gt@ zfkQPzP7Lnha*wqX_FmHj-P^H90!$rdA1;D*1b=yWVayeo>D}Mf*4AW+*dYn;-Podk z!$Lg5(M>>a(7gtjf5i25I=@%L@xqrCm{N|NYi z4Y~c~2}pw)Uy1VOUup*~B~9YmQfxn+rwehhw5_#?`c-=q-mU&a@6Z27qy2@rLH%x1 z%R2-X4RPJ?y_# za!y_Z!F*M+N2LS^(>^%^A#v(1=0eqd1!~cd8gf~nM(K~9Ok|} z9AhXLd?iL)w;MveO@CaY);RR=O=pMM@!v$aBj2DfhtqRfE}b5+4K<*(_x{ z5q8G5&vEnGuewu5xS0-A#2Sz$BfMgYj!*q6uPN`A^kL?be*HX zWcAuj#Coi1Ami)pxYR)ncos@cv>^W!0fKk~Pl#wgeE9IrPJw*0cgPhDM7+P%UGc~TocUI>b-eubn-TomFj9FU|PP|FB_ zM2J}NQmcx2?TsIy$#-MZ!Bby`l=h$bb72;ZA}kL+|Jh7nLHKV?X#ytqbsU{g__?lC z6}z!m)2~7#<%m)>-O+;@N~lkWJhV!{v-dyh!Im202HDifmwiAYKv#U^=oO<+yJa!a zntXhP5i)R)#8-mD1%bfs3mZS>^-WyM#=&obn`2T5v@j|inGT`{d(qXCxCnl;0|;{L zzV_lcsO4j1kN?)0e*a5LApes~at5fVOPv#d$D5_A@4JU#O zFH*f8WE}p)xxvD_?ij+-Cz^*w@vg4=@R_c#yd0OUY3q`+_|nCT0CtZFtlYhRlBQ>$9GXAJVA1qhmO$1Uzkz90P=L39lr@-S zw3Sk!91OtDf|xaKkm|kOo40#-qg;Ps^sC;3UJR(*Swv?M$3aNl6V40z8rN=Q9R8V5 z$zHN|0hzh2ydTyO1QFc$ehg@IWsh}V_-(OH@&qxvN>~19v0XMz- z1;`ebOK|p_0?&@cR42PvfK|iw{pBZw$$aypNYouzusbqxE)nT>1oIfNLLG{wKw8I@ za?sxqOis?}75)9X;LfVgX#ZDt*3X|qHxSTb)v39I{fe(9m=h0SqrnP69nn9Y4H3Bn z+Wh5Sdl_s5)Se+AFt8(!7OxRtl2^5CktGU8It{Y#nzNGLzP$jatC=V{y^8j4rxRLc z@O&iDLMO8R(7p|w!{>O|KqapX`bjmidqFq=l58fCX=JgT8)Q?;tmWwXrN!Q8wbVvX zwy@J2dX#b8rs_3~UW|6fnUdO`Z243*(>}-L@_tXIh})R+35jAtXPcLV*%~@B&B+Z; zHw&^4B~q}U^&@)l7qY2M#Xzax01|U?)d{789>;hmnZGmryw&?sp!%yw)|A_qRz2|u z#lCM{?Jw_Y1cr+n;WNnFOfU#F%IV>7LYQ56dAg_Rk6%l75<{(8VC4l_f>6KJZqX#s z^spK-PQdpG^OC=2=+?9Cyxsfz&G2?L+LP^Rvq|3sme@yd%jP8_$WWBf6ffmd?6_WW(UYDK+@Oca zxR{H#7E>#uJQ+i#_hJ~{?`69?Wyt+I>fKXn9?YgE9cEf_W;Ul}lL6l_A+!xK!ggd_ z2cXsw(s#XfT|2M~5u4S2jeyL}IB)Y>_1ccCRI6`E%dLcdk=u(7LQ5LL{AKur(;bN* zK1}d~tb?PzZ?(?4Kis-kgwhCUsGyaloRV`|mEIDRzjR*UD?kT9upGY~|Wm4j(5jp}D#tqBJa`b4bL3FbliF?BC zUz+Ntdz@$E$EN{gPeoO~qNPz%s4ajRKZq#YJ`3)C7Q^=Ukb$I$D7;?g6<*;Lq<|#P zwdjvGC$Qk7C=RC8hfn{BoAaXJWW-_)sr`2vBa^gp;`wK}o9oLyXN_|&$f=l?vo#hP zc8wst$O}_W*$5$1rhId`FOuiK*GsQ_O)89QMqLNIrRg90YF>#ko~b0aHyrmsYWL6I zqbHA=7$QoRvQlGle8A9g9->BPb|_iH34H-fo!o3)axwvQeU!##R?#N@rlB1$g@{%l zO9U=ztZjtdcmg_V$ZGz>49p<5kwClFGvgG9YlW&KC}oOeJgB>WreLP{?|p!^c>iG^ zq(R3q_Sf;wykxE8iatJ_4dlrap_2_kIv4xJaUv3xN7td*al_76Ei&P#d-=jQ(U#Wcw>ku{-8?; zK1}rktufVqvBm^HAanDhbB4*MclV+XE^f3oG@zx`fBqkNq`uRkQF%4n*hgdUevtfp z==)9ytA8mFrvFrdm} zkv1KD`=SC0aFC+1|6M^L(3rWpBQo#LgEeMw*+K-G6u}S^(w#H@P7(=7pY!%6RQ|;5 zbh&zChlJ4K(-F?Uq%yyywr=TKiUvBpMuiCRC(tPwrjf zNEn{}O}1dv*V_7_rMJVIOk6Js8?+|4}_7SZGln!7qcg z04IU-&!>06fxH}~OZpSBr2s{$U+As{0)gkO+Am;*V2S_XOGCI`3hK!cJU_0MushNJ ztT)8mjfLQ1Ux_o2sRYklbX@uogz&cRwWapj`M&In{EmPEVu%_5g^Fc_7B_hQLz|dH zxVg6I38AsTVp%mcC&(2(hP|&G24LYY7s}lt^p4~L4mN)+h%!`6srt1dyu5;t zwG2tx=Zl{BUK;I4MQTAo3>3SATRLU0ixut{Dx_!jDdb|WTWQKYz1961Db{oQ83{}H z?sq5{tg7iJ8PjYo#ewfF=D(YhSG`n!{pv$h1h5nQ8ho@)AI<=l}Wg$>oO`FgYR zHPM#NbN*SUFuSQxybg2O3s&lKpvqOO(9?ZK0GVfvx~4TD98JFm&a_J%L@~TLd%3Ve zO>q)pzhJi|QUo?_s@4+Nue*=&{iU48rIB*Z9-2o8EjZr|ii&<`b>sKYZ-s6bVwks1Q{yWWDTU%Q^&g`d% zhy<71V)H>t>-pZeJ^`s1oP*yMA2XJ_wazw4r|(*GIXgw|9gwoqK4}+0>~Ik zW4Xbq;V|b-_c6;J(Zz87tEYPReaz_bUH9LS?)s+luc;br|M9{%Fe)Dru_oPKsTAxl zJ1O-N{9eUtEvXeyz>Dm&#w0RtkW*gfc7n3;*OV!q{REFr9^+rQJDFb1I9oL1$OO4` zP=i*uy|wOocLgjMu)37|aU5QpW{Q^ap8v6k9SJ`afU#kOz&znA3=THv zRP^iQTO>DeA@gOJmve8e?RCf5rl;hKzk0+5+HuA?sarQZ|9_9N{dYa$Pf|Mrt z?c2AH3cw5L8x`mCYY*=Iw9c=S`yoRg3J~>T-iZY=ra_)A1QuP1{?89A!PziwqcE?O!)?zV&HWlSw4CG`3j8nLG$bX7FFdOjyCM zyn#TvgzEa{xBY@{$T0F)Vwgz?&>19n#QHCexeelmV8{Z63b^#dyAua^AW&V<= zB#dNwhC>Fcqq_6vBAawE=ul`t0iH)nOv5vx(!1%zMqsKG ztU9!t*fGH4i!e+|dlf&gL+30AJG2|57WGf4Z`&p1^xFMu9`{Cu z5R-E=`=MQ9jL2W$nQTv~1k`pO<@)AAyt_9|tFnSB)Q}J|1fXbJ@6^xF-Ty#{p+-XJ z4Yj9uXENG4C9d@xZphV!?&NB`ia2Z*N++K|Y9XRgMNr=%+$9{rLhQGWjYUqF- zIda4lf>SB?ly`rt0U-gG+;3@Z`%62PYN5nb^&a$!d3uE7PR~d<)CJ5xK~%v1wg==u zPjyuVLKg5ucDJ)#i=E^L+-i^W0qx)gRor#|9b z$!e{Mw0tH4pK<@tK9IhG8yyZc@jk?u`^{YWCMP?hqbnWtPQ-ZlO!Ir%nXy&&%dF>6 zf@oSwupg~^_A6^h!(wk!VTDBZ(atObaYUmkd?+Yj;t^6ryIG7nGc6`=%d0zD9wueG zVkw&l0ON*}i>RVbsf(wLbrIf=FTQrRJefBH)@ zU)Uy{`KPLpk>tJ%g+TdBU#27ZkN(=-iq## zm%v3}xH|OW!~63mQamB3;q{uj0J=e|=L-J1&LvEQnAP(cK(>$_0|9nJE1^dm0*}6x zew<40(p}y;lL`%>rS(IghBE5y+Y3|@A*U#uRy4qM0^aP!#YOd%n)?`i@f`+5e|&Sv z_9AvDbYbLiLRH#7+11t?eS&``BsX?Pa5{}%@!ns7)T(IIJj0(DJV zz_B5|%hCBTnhR;0fe?cfcOQYZD?RD9th#mh9v#2pz(}w1LeUG?_h%;|*fb``koZ?t zLj>OE`-2?TpvICh-lAdNHZY7&b zU9*Ymo3xf*=|nIYz+yZkaFaVe%uKWXao)&Zy%7SJX!>GV>Z1a75u}?MbLc|DEEpi-7qu z|J-NF1lmr7S`RAIA3M!_o>=MOTYUZ)RA#pkO9WqyeNVW;YEn3R8{dLP2r*o_?@8Y# zSs=l=-Dbe6iCqZFj&L5dvpbS=mu^q#>&%sYPm(7sYinx?4}66*LyfXU+SocDeL512 z5J&=Di2dG2O-7*^KcIz~r0Q4B;#n_ns7n2w_!IOBI;7@8313RVvouzmI6IYvlcL~`&FFYD^gW6%MPQCbMBK9LD84OXOwCt_YnC^(*zabGP z8BU7N;Y^5+5Tz_9$_3=qjBow56!D37c|i8>e8WFnXq2r|rU~|w9hVYVeLzZ+QoLDf z;&c+EpH#2e!eAJ0QtlNEA5aEbK*!Ea`{IhPOAhp#2GDWKPZ1>KNQZfEfC0ru}6IqSIMJ zU!G>{@NZA7cQ1Qt9$Nh&<1a#a0x5NOIPBT&nx1UZowSKbuYNkz*+~(a#d)N!*El+v z{6i3Q9Ou4Jo3?Abs6CmllW36f!y4Zcz;+^~z!>KN&T|_?Ql#ZA5J8T`JuF&m6~o^9 z=M}=Odu?aY`HN2(ZI+SpLh4%3k^#MYi{|Q3pp@#@1Jq%6+eLYJtCy`y)>RKv2=J-O zprgtgi+lI?O5kG?&$mzWS{Z(K=mVteI|r#>c+kptaAZ&9Um0QFw^Z{jL@0%RX2-jO6sT#TW%k@BZL>7(3(e=2Bsu}ilVPS*4y z8<_Xtk@DYrdmeofVsPW0W39=`-)p{s_VjX4BW{myS{qAS9S)86wf!vv_79iUFaZ2z z?*3iF+Tas`ike4GKc1g8J`MGZ7Bjv4&~@W9pUoqfKA6_$v>vM*_;*fnq4_>$jKwpn zh?YGTe7d?Eh)&;SuhFVy{wvyZ@c)u&!H2!BU3J=6`I!V(ocnuH6;ESZouts&Zbubb zvm^u{qJ*da%%79kT2#fapQ%U zym|5cJ0KbP(Dj*`U{-+Kvvs^PfZ|CZgA7u~p+|0v{m+|Tn>vAMN`Ogpre!CD%U;vS zG~Ss{XXa8qvH=OUKU-2@-ZAXD&y$5t9AlhRWJJE()1y3BwpQz%E9UD3DWv#jZ)qrx zLVG3yO29BsVY-9R-(>&cGS++>X%Ac!#K|Fc0o{J_{Z7#JDxg0$aTEamJr(7b^wm`&Rgc7Ve0tiYuYW_RG|cCtn>Cv;k@L=sIcH#{pyai+!fnXD(eqH z`lSxtNQe;+eArJxzvm+~%E`|jZIM^^LYlMr*FGZ9rRRwFnd?+oYHq*B%7japt+a5YKLB2a)g?H!BwkFe0_CNujF6J1bhXCvG!8Yhq1bsTt-A+Z{ z_VR#CF6gRdk?L0LxDJ&(zqZ&4ZE+^P(Wh;(d9~ag3bd7YPckIsLoW&yMB2wXqoTce zXzdn8eR+Pnc^0KNSJa~lleQGqraSZCafC)I5J&$-6!9X!#5({T{TY%bdmi{nXoB7{ z?#U)D zjMs#fM&4y_mn?S+8Erckc4k_Whi13sC(!lX;PetFY9Jp@Ypl__%O63;PwC{i{(7a2 zjw0T7*r>?3er1-?Q7cP3Kh}5Sst@*dU$JAfRHVTFlrqIt3=0cVFue?q$ZwtEdgPls zor{$T)cU1iT_h)?<0;%t1-p}f99wE-9B{U}R&#puMm{z8z4gUbLeDIfttafloTr3f zx8c8OP=Q~eyPi;v6;arQ0Qo(r{G_#vuaM zpZJaWme~zH?zQjDS(9%`woU~0+REW&`rAD0%6rVt#b6`M|F_%v|G7&Z+BA#7V6a;v zx30_nKlsFNdLo>r(zyE59kntB7fm6l zT1{^Eox*f1TsIc6bC=cY_{(J~E6XqFT!7on`}{v~g5svKjK`~T8YC!X_GVV{2z!ZP zS0f7EO>O%)>(n3O6v3_2jFk``5K>h z>+0g8iRO4Di7DN9m7H&w_>YyRjr^~j#98zF6(fsXBkr>PCXJE%<8V`;Mr8eGzGqa% z;C2UB2KCiw5jFMNPUdk6xF^m;lGb|%``!-CnZ@z<|CzjA<{@Um?&E)-{3%mh^tON; z`wpt#hrw0-$H1V{Tqv*L6}pYu4TI)N({e`{a8zE?y@>z#A+7j$9G~JJhtFM5=3buP zwr8>un4gkkitlFTR*Ph2?K%0z{NY65YrK2eLI5`D9focM7GU%+?8#jMxjNX*hBN=^ zuDTpu`0Od8l_R6(jRf-Rxb}92a5>x29{LS{P|T_?+1ST5~z3^+%BNWu2eFaZ&3Ex zcg!1oQ1R#WR-%py^7R+5OE-CxZ1eZ849I+Xvb12}Q+^_F>TKw_oEwROS}CUqqxn}WO{7VA{N8MOvIAT&P z&!(gcg}v`uO_<>NcbcVx!^DVvgfjnc+dCvv;uvuUyGpfbdmm?(6h6ZukXkg87GCeb zi|#zN5_^zNq;ve2Fw<7>wZ60}uEh7nV_SF`v^98B@4f9IqhhTE!3~nHj{aGVcLajL z8J2h&>7)(EBu(^yI^^qxh4osPKdtd<>5aYw*D^knDD%bh^0K~&03OWTFr1Ib?LK=~ z^@n;>W>rW01{M#nHt`c+=7f+u-2Ig9Z$99ZtE_>&W)L_l$a@}&^?wuT!6uXGjq?%b zSSc+T*4y6s40x=^A*nl$Z!XMUQ^k$J%ta;B*<~C@YQX33e?+>6@G;(=zS#3S<}?#)pFF zo|ld0sEIBEF~Ir4CC*p=+b13++qifLDK4*{pXnrh_TU2ZHQjy^MI@#>qjW5koP76U zFrBymFH6MTlM(g5t{N^U!n$#-+IBNZn5q{N2+bFC6?%KkQ)?oK)d&n^opq_tb>`YIuYv*Qx69B+o| zrg4{Sg^_or3ABCYBuDOGofuf(Ox2ri|;)?pu_q-8PvKC>>0yDt{c=a6{NGZ-JJ8 z=E;rGJ0v&mQI?CHjCtzp;U-H!bMf4)^y{OIC-kl#*f;j*`uW#%&-Pq;y=T|keK*$E zoy=P|t*o-Otpgq`E!#)fn$LTqMWW^h|g5R6O9) zuMI zjM#I>KhZOayZ1Uy6)%(>nTXfWU7YxFb))`iW}vvc&J) z#r9+5khKl>;49Up&zxJq6x`Y?D_>qT8mt=ytEp(!9c4=0HhjTmI%vM?i)rBh3AYd* zWxgvP-)&)I=P>v*udR4J@@$9`=ip#>=+(m2(3_3VDrf48mK-g%!}Yqi$s+Cl<(sOi zU(bqsqY;spU${-U)3RFazek)be@q)J$5I@Vk|Z=?!(jl@la3>0~eBW zdhN!3d^#pYdHdz(WlgiC|7-_ciW3rbmn)wgFC8qyQDGiN&TJqV5#1G(Z$FWo(+J5d z-n`Sf3*eZa9jJ_l1~)}>Rdiz^1}P$;CdIZeHfF9USS6fyu!wC#{iJ!SqtDBgOR85V zpLXxY+!uX-Jqbb|e90vtk*Rp);#68C`506Y&9Nt!kAG9&=qDL_yr2AY8#DJf{!Hw~ zFb}2U4g@tOJU}a_ewjdAwY;hqVoS@NOGAO`aaun79FAM7Bdg$lbPz zWeZk*NUj{BZP4|A4JyY!UwAQSK&Q#{?FEGs*D_|j8tBSHL)tUw?8u8?WH_UReI%s> zd*<#>4Ejk)iZSLr2r;cV)6{D}6Aqn~N0ezH&7gbNJEp{+`}*(}VQI63<=DtxVukat z*2}ceDrHzsNO>r#^5q#na2m4N{P>2?vW6^ChJwj-J&1=u3d=~OvlFSHlS475SLwL; zc&+}9u=t`EIC(j|8fL+C>k}tFuDbF1g*#E8kzNlEyud`^nHS7UAg0=D!M4prsXO zt$nRri&j&AXwNisA-G7>{Qw-e)_soFc1s<)O=xrEUb{xv4hPRC(?CzUF%Puq@qaI}+Z69yHvZ2m)C!M`;?{jlQK9 ztQ|np2@SCGzdt|gVdd6R+_&Dl+z2_Da!Pu!&8g}o4r2BB-<}-u5Thi`TUpI(vGw%n zX02V{>@rK8ujqbn8)Ee|Ew9Zs@@P19c>aJE`p*|C#iGWRJ=+4Ui*3r5{@6zLCa_NSbI9lNxotj6ga8l$4e0e}ha^^_@fpN2Dw*GgkUN(UqX< zlX5MLfl?-#4N?;6t>x&VSGAwY8Y@ONi#pswnw0I~U8Vbv_s%8PR(PKag;c1Rbncxi z!70hun5#xtg28{#{>GjNS}`M`b|sSgoZLB#l+wZ{iY;bHFB$`XG~vhn6b_Gyvmj4_ z-LH1X?2m#d#s()H;FsqYrz9cID8^t#PdOdop>L)j{;26TMNR zl0hxzCvsDFwsi zKfk_kPV}0Le3~dHVL_T%4ntc1vV6%JHgV9T9UWayey8|goe&3!u72C2d_S&z*~w8` zqo;EjBZ_q1vb`6#3NaB-FpbX+oNPoY&TrpQvLLH2qa4kWZ%c(sod#oT6RA>=JqvBJ zLB*vBKYDEs1$#|7#f!x*#|b*LZes{l+D`{vDPr(wCi`LZUn8Is)rv~STApdRBjxka4wTRJ$+Kk zFSN(HuSn={`G`3Z!4b6)M}O1GL5Y|5Of+BGozz0iSCQbb#V8C?ghb})tOXcc1DVgu zJi1V8RkFE6NA)M(?DLN_K~vew;!h*l#yDk0DZd1KUL{LA;C zQg4v~@3Lo3+$v9rS{=>@GGamW2CeUrwMd<3_0xmcGGg8JN+IWu1`$V8O@!#f=$ge=V%p*LY(OZIr% zR9mWgr=}-^S!#z-PESB~mvMm=byl_J6W)lCypf3Nwgw{2B=jm;{AYxVrl9LTp)nNS z6vt`7kStTPYm4p#Eno7WHi;|kjZ)ackI$4ogKA=shGU#1doC4P(VZA@bUmGT9G|r0 z$9drX8=0tQ#td0y>XT?W4tLrsPIE>*naWVv1B z&Vr~6I?qNS`ncf>QOWL8bGKHSWu(HDjSBib=*$u?zS06zFuQSYi-XWQjp;kg<(v5m zGhV+WdyJ>&BV?DtP0({mR9#MrUOshhrQgRi=yDK(RVPlsA8x<&UAnm%f{zCRXb(5cI?RFav;JUu3mt6)if*)*EW zW|Hz;Vnw3-&D-LAHUnOH@-)E(VCB?=ELEOo69!)pJtto|ih!qr_!EC@>K-FmP4SnY z)xx)XEP#uGg+sdYeAjiz%e zjDAH%)==;H8J#y|b>HpVqBVS4q(*krLgQBybwl*xAP)<#xS-iFOcq#;sMSmzO&^a@Og>41I~hF7BXRMB{O0oU86(@& zNw=nP?3|bAOLs_VaiKx{uptiS0_M=tx#5;)J?FfJ+&kws4cvX+mOh3!Q2^B)i4)0 z#3ag+P)T|6_f(^D>|Av>yqm;XC8pUqSg0yUg-ptOMCp>7`z>*Pn-cvd zu?{713}obXqi_4Si{^}=Yn4Y=RliBvniG`36#J(>IUU_wc6yPj0^@QUnXb$PyIlo# zm!&NADovc%yYjGID(1ERfRcyQ%3Vp+f?x`Z1yTUUKsmo(B(X*Xv`61pX)fx%Zb)82 zI4C>6IKR-O&}p&$J<^HUN(4$q%RSaiRf`q41ZXS*$Y+(9=VC>fg4F03SI8-rwDb@A z&c>isN(?G=caJ!5lIoOp<-o0{K^VKKthTu#x+wLctL8}e>T$BPUFz5Qu$M#}S|9Li ztqgej9lMy;7Gr0r^LpD6@li7-qBK%Lbw8V9iOZaxeF;fC+--qNIz(u1QbS(nP8@)) zqiH6VisBZ5V!o9k>WCdFc%D3_DZLK!Qm0uiAJ=LQ#V-biIqwx_Unlh6%LBhp+deV-^JAd3yN`U5-KIGpO$7Qt(t|7)(UE~p$v0Tm3{peG- zejl`fhH_MBxsv(mC~r(`pjv)8?uQVGDqAi0NEq6D$rLO#{lMzQ>+-z?OUU>cooH&g z?6lt4n}kmNqL3e{HUH3`H;>ZD(ffzn^tPi>uIYfs67Ni*%tEMzRhG=8UViDWLrB4!%8ldg7-VSN@qjTW zLLy(5%Jl0MdK8HhUss*1dYjK?682WP*OOUx=G@u+LdXa?Pv2vLXL=Ul9i8I#s+46F zCfc&%QTSMVq$HRYB@I`iIeuE0D5EKK&2LWs%kh&}O>a9%B`|(fhF4{7Q_%8aLr3t` z(0E9h2q6GcPpc#)H|(@Tzphtb4$}#(WcRcRjs(*-8BO(ZC;~1QQJ7sOKG|hzcGJ>! z9;w}Lg0Wox=B1?`2+z@r9&}ackYS{hRVB}0@D)eOvYJQb9MS%J&TCDP9%eaUp*PB~QW=&e^N zNeQ=1EcJS!b>JD@FqY-Dedvs@MTxi1Sk^?Ro)fUd>L`qhily9!_)ma9=>j$xQBx%muahF zD-)NUBDhR7jTc`AJ)=b{HsaCd=0{YOroecUT-&ai+-c=|zj~}~xdMY`(yWAN_hM$z zQfFdNCgWLF9dYB>{#%c)=$=We2%h`bH&D_~h;2kjF~Yv~WUmBWvQsmL@lSPv!ry64IC&3}oB*CdV z%^r%h5;E+fZ2t0=_bBipYFBIU7og65|^utvD{EssYbjif>`l^ zZ?~2xy?7u)dwR%&LS)l2gbeIftQj+U!5cAf2s0e&1P>SzeNJY?F4pc#Zpe37#uwv~woKm#N)vS@#j5 z$5M|}UA7%4bDt|tOnad)`IS_pD7`qBN9JV~vNC-!WvcQP*@U;nl_)G4uIIJUOV&V5 zow*N<@89O+i$5~NZ^sWzA==EILu;4bJ!DqRAWxPFZiR4*Mv?Mo_KJ%K-%{N(&RHvk zM0zox)=Ff|k-OPMvz}uTIh}~V`PA{ z=T~AvXPiyr*O`d|!EaNK|I{Efrt)ISe!VTql$j&Q(%KudL(#fNkXF^@e{P_~ zJG&bNc3E1w@_a~=bcAeU;;Ip-2sY7UI2z!z@`)l_sb~Qi#$h=z(}pZ`*oW1GCadl6 zY^)r>lcvx^20#^wj&@MuX;t6sWflSrz^AcE2!R-p?~x8gWQhN5eE&mf3(F_ex46HL z^UJ1|Y^^OIxICh^jP^-WdK7W_&qb~4Y0t+8yCpb#UMmwh+G@w0HjsG9o{f~n-OXGj zZ6->|{_Whl6~r$U%%yoZpy57@mYrsaJ@HS&$FqPWvZyxwc3Ns}qZm`T{ZyjbrcF7K zd?xRKb2;FR&68(Ak3A@7(4uWUfQipPtZjLwFP#h1g?IE^tg??VtvG`Y-=!(&Bq4X; z(;eDI_MaxeBf2*ep@U&LA@Lt&y)CK5Yx>1;+3lR{q9az9M5p9ZF${_RVVy3 zrn4emj#t}fc%-$KozA+IFq6LA=PZ~LQiLpTIIY2%ZK+6P+Va{ugIKgYw&}){@sfx3 zXdk9I6ofCR-N=AlQoPY>>1Eq^nSwaI2~rSaNG9l)?!FWmyJB)`KNGZV_Z`GVoJwK$ z?Y>kseS5Vh`__RfrOP(e(2Ycsuw=5^yj}u*QQ3FY^JzM`r1=p58LJfBGR;SPa=wUG zb52lnZ`0qec#5tfQA?-H?L_&asb*ZntU(@ZgMz4!!y-ZGBHfux3#R9s>0S)a-yhvUE zt}QhK78Z(=okn^l+B$w$>eoa2HsV??IZcwBO?;h zO;O@&;L5RQKvvX~FO-SWX!ZIW zml-6}Jsc;Qa=$(4UqiM#Z6zl_A;GCrFMdc(NOsXppKNn|nQ4oHA@Vp8RuF1ux}(3k z|I2RnPd3jvIbK*2_1ZjMpb6j?bVGsP$Cm!$dnq}rB1H=PXHNFC^pB_@^Jtc;W!hk| zIuvL<&XR_s6Ate47M5Qt=jAtPHPtrj-M9QCc@nN{p3@x$ zwJAhj&;03d`3yS{+%J{wp^F>y^-N1Iy|KHdk`Mlome0?qoknTE5L?hg?5nQG;|00hm0Cnv@+#%=E@LQR zn{H`MRWD(i%4~{L)Cs;^i_VZUV%f-dUcspoS{MvrX~T%+YfQ>z zDr@My-JiC2k$}&3LVQ;)L#Sc82oI7IkHJU$TzBIWD_)-Q!#5%7GAZF#Zz?{*+5JA( zS+^n@+>Yn$C)389}a|typ$7p@w|-Z>D`!z zaeLSrv`v>L5pD{E*5(dJEP9dB3x+O~-A_|n5lK``5}%oTV3j+OQs5!_2a;bqWGi97 z6BH$chqxR(#`ohIc=8%ym_=$rvRb{EqZ^CeQ!cRPJwx+vz^GpnBP=bwGa23kJdrVf!B~Zl}A^-pZ+E_4C z9GaSdPC0kuhy4^`#zl**{d)rAPJ6fPNlUftfU;VP0WZ#BwG3p4-UPYeA|}1BnuF8L zZezC6lW;tZRG^}}-6x5jsv7TfGmuLii4`b2U35JRl-2Z{?OiyWZ#aJkMKiHT7V}ynIDOAMp$9iVMyuIxf=h@KMLJvxX2RfuQs6r?NruXGB2Nn-lhX*=!l7O#jYJ_UF||0qojPrjT5we)ADQK* z{E3uMr0BBQJ{@L_0mt|zS`rB;qXBI>&rjFS9o2Y4u_z*N?YP#$K2w0D`PC!W0iC*Z zu5GR#@;2dWcmWRRa?x5U)7yq*r?Q5iNBYqy%|#PGm=bW#yoM#Otr6IM27cTck#1|n z06Kvwn*CQ^RiOhaSF9^$x@5fQF@TQuyOm|=LJxClj?U>s*bZkRMI8g34UGzCE6S%@ zAh@}(wLUYVMk_~Mwg-!7rE;>6UI7%%KsQ`O6x5aheaYP}L8e9Ml>^k;L098h)-ogN zNC&fGYf)(DVX92op`V!Sk?}6H?BF+;FSo3}4)d88zCArQtR}j9|50%mvOb-~mSB4F zuP{ZTIG0>x?(zJ2(hF6dLNCj7qy4yJSS=xoV5%)r#E5a_@{RGAF5ccv=mVjBlmG8w!nCvLuEKZ)O8>G;J-UrW^F3jr{kO6V z)4x!Sy=1MsB6t4v;)7jWM`JW8GP0Nc=!A&4v>1cGB=^v32d_Pk+;$ISwW$@{k>%*H zn@Dcbiw_U5ugyQn`IdG6c#oqOR}i#+^)PFja`$h5VG8$NC3PazFSC*CuayxHbj7Rh zLO(8GdW+HVo`cf~A8o<)j`~Jq3jGl${W9_CC~s2GC67J!8)qXWWDs0+@DO>Ij!s?H z>9hIK|I}gF`ugbTnGOC~$08o?D+{T>%;Ok0PWn&|J2LPji;Yd6o5qbH%t(4dI|+Ai}%MgIOcC2Muc zwb>Q#qYF0+kKNl^1EN?Qr@1itwfwQ8@RvSjtI78MH-)YBU1w+HDLsOcvcEq+J1n=Z zIb?TfW?;~DMWz3if83YJHT_r>hXH$)n?KG{Pd`E0B~XxVk)q@!1;L!-nkE+t0Ad_@+pMRTul z(s8#59>Ua&3Q~g@WIdAa@Klzx(D7GT!f)Apj+ZLinzH7~df>_0v`kQdnK%{#5Y2a_^F(MF_M36zoJLOM@L#AJ3=~?;8Mg^KwP>d{e)Hwmvt?%x#2-yb z9iJa{pP6XsS70NwfL`BC&`((QX8z_WyJ^62b*qb2Z0V=M08z|tXq~Y zwZ`kI|J-AtOKX}w-&{%5a<3SiiVc9d%HUlbw3n@-v3!6q3IjQbdpSaTDJz_!m!MW| zl^j3e%Xl&DPL)t&-XxR-gYEU`qghh+n(Huq>*(A5lJ(8Nx56YfQ<>J2sV8EO!x%qJ zA)`wQ1NdOB6tLP^UZF-_V>-{q2ilM>mF#h)l4zYrXmyTD!6$O!Go=r`sD+R;=TcEG zJ_Ci$4pyawE_HyP7NJegtE(&>J-wH!3^;9Au79a&Uxm}x z7JIrEcI6U^QiZoK>9rxG7u9W(#N{*B+Cr>q@wFTGjJ_^{G<@iLIY1~Bf`0*JbI>&r<>3ME9PZ!Y(h4AZ)3 ze0n})FMDgXYpLw9I77>qve|*kWgER{m<5+ZtACmKW|)RDV}Y1Z(j%|kO;?Ci9nW{i zpgopLZF6&f?&b^j?VMG+hLGNH`nbCrgl}?aqn^o!jh!1x*QzfBcX>M{uIRwaUYin9 zY*IR-=a(R*fzFtBlGByC$`dic|B6s0BqN38OW=Ky4HCALX(H*rbEOxT1)*c#NrgnY zBZx%{T$dl%&)Jk;m#{n&R|oQCo|p|tJx9so)$JClA>D^FF7&UewDHMUS;UEq>mf)> zvljjMcnGlS712lX6c)XRGnJFy8rsya9zVk=VYkMPH%ghUM|mgzgxcK94xLaUT^Duh z9?P-hoZhNs+&i`F86WnYJ>`>lS#4rGF;x-P!k}Z|ZI08QaBN(=MZ& zAvv*o&v`|41DVq5&6M@Av^D?`6O9l?l7M;Rjff=N-3T|#8wy~kDEvtV$`p{)_9ykC z-JD2Co%^ZBa5T%1- z8(EBy#N~9$2pVx1XR#S~=OUSA^p$n|Q^sIBT_L!$H-fJv(I>Hfm?2T^LJvv#nJTFC zPL#%)x|~Z?PHbT{4q0e6fL;Y-gML!REZ3P4nu)39>?`EzT7M<(~P5o5x_;ixUjNCBj%vU#id4?g3&0?MueST+51gHVg%it2rl6A%xtFoCD=SIR z=5GOEa;_em0k2gxA{O_I>HG<_RsST>ZSu3W7R&2)Qf6d|&iE9Eti|T6H)`h{EV5 z#IHiln22J{onf@}ep}z};>q-CkH}c1*SU1t#>mP^m@>CqI(k)$qHRUB4R36_3$C*&v%PoS=UD}uJW)`r<19Q0{Y5WXH>=agG*vt@ zwhPwS=^~g!8?io#6660=(u*s6o$GadJu?#${k-kRQz;b zQz(~rk|6#xw?YBJgyb$RQR=D8CP_p%E!$M(FJfRw{fVH#Uk>}@u#YC7mE9H(mC!@f*w*S|SF zp?UGL+4HW3We`o z0qxfDa)eix`rHpBF5ODVhg^_lePyTBp(aJ$@Rs5FGlE@+L`Q-%tZ zyrHK$4#}I{iKAn=39$vKCv*dx*Sq@aidr>I;_p;3=5(8_hR7z3G6dT8{!FvfB61Y& zUxmhya$ouy(D97+)F*&=JBvnRhhyGwn0cKABpf08oml&2@;$}r67e)ltPISl7mox!cuVYgTqVPD=SwE$+|;y%iwfG#bnXyRj_yRP6x zqLY}k8%6Y0LBe7D3k^5R>&a#$CQp!=79qV%EYfvnjxnu_aP>r%<%sp$j>{;TIo&IKuqX~Zz;dNGiGVtV(ZRo87vCtfmA@|#pF{H;NqHlYNLaX)s#a88ce(8H0>jBEf zUmzoY?O>%Z-bvVr$XJ8OezHf`()twT%dX2!79E6);{mQ$_^1Jc=(XJzjYtH7Am`V9 zDpV&#uaTvaY`_J5?9H*A7kEQV=R%PGaJ1pA-se9rj3L}B0YlZnJtTOn@NaYmvX5^5sf!CW4pFoD?%Hi& z^vhj{c&|OQ7H@4Qvndm3b&wDoG)+iLhp{nK8GXwYk! zX_9G4pRUAU#y=grk9qUf5#e*dx?>1bh{5b+p6T2H5BJauH=hsMUo$d|7%X!?328u$ zK-6KhSmt~kZ#>MTg51?rwFcgo+TyfYXZ#Kgoc62Y+J`Uxz+8)*ho)&T;L&x(IeRR|pm+un_KM?R`fYu3E0j6l^SsK5m1CfzFiic>>#=N;fbPVA zyyuE|W{{B(2hXUINzq~>?0oTJvPo=@RTl$zm%l7OG>Y|?6BVORD|2Q{+Z7c6p4alt zEd+iCm6b?Yb;Q?NQl0!Ey-f3>5h6kokl^I(^!yN0;rsG=70VWE`J$s@Ssl#Bu_uDW z0OPFICQ}(PYxMz0S6fnnIDx0gikqu~FF=YINIT!0)D<*feI9a)9-uMAiS_)kaw3q^ zaH0*IwBXz2+1{9MTA3Y~FY0Oqgvb(rJzbq&ryv)amb84PlJ=#RsxDb#E!tvPyg_YA9-{P_h^53r^GLxc zN612EaX0^RIWPv|8IW%cdRB(c3^Qsy8oi9b#c|?H z^-FCej;$eSlZjentlkm_2NVn{K*@nr*1KnPRBJwowtF&V;=HcRvPyE2Y0BOG75`Fu zw9H8h)8P&1M{S?nV>=Q)hR zr|Syc>Ok~8Lb-PQ1ZPYBI_X!R%F1V&!u^hJ(w;0A6p2qh2JbH9tj)6J`9HtD^ z#h}mREN^+03rvkI7cgM?(AsuOvCz!D9AYDQzoaP3*0=qFcR-sJ>k1_)d9;vfFM5Qg zN7#53%oG>on)sd33A%tU7<#aPXrmu=i;^h2;wP!ZKNr2WLbSNwHu}^s zzPjvu7{0nJK>-U0dr(aX$R3hj4SE9|de#65J$Ump9kd7t3$fx~pPEV@=P&yKq?A+|ge(JMH#;v0ZT?j4#$wCIy@F~yMTP-a z*0ME;m(QF!nPjT0__~t*EQ{tXV=NLp4n1g~1~~{+X#*oXbDt@jq{SGp;^!lfWzk!o z%Bf#Y8Abd2^-MJ_lFSMP9r{qR({NV(D!6pWetMxW3*7f^BrClRFd)<|2rMTzZ5fWR zpN2ZbK{Z;@9GIV+C*OtOP5|VTcPF}S;ZZ#iP-El8FfN%AL!`85smyUOXo;O#OGIxx zA)aw*+>^fn`h7bXW$ZW+#s7eeY$3gBg`QKfrxF>^`sHCy(A}(p2w6AI?Lax&s_ZMZ z?F-99_AN)wT#X63)(r{m05nzlV!&sk3!8ONOOaKpL%trpL+B~|u3_FV{4`uhp&*(( zck45-F=e9lnG$DDX$y(K9p_*|)>7FXb%vIc@&lDVCZ@zrQZ`7)%@d)USQ`ZAO3A4nDRhAW^e_pBO zdi1T-qU?n5Df?!uU`o=j2etH1t5M*{WAQ#ynO}upa2{atVn-+Fy(`04p{4EG{xWAls?9USOR*M=3GF&2Yy0<(IbND*`Xt zy9{ASro5^p*7K_M1*!{Lmv1vHz6_<}UnPYJ(kvP_2p+{k;jKgv^MyWX<=09{R>+2s ztWTG(H_O$O#SEbpQcaSi+3s2V`Iwzf-uKaJW07Pyz0@)i6lO*XjzcEfrS28p6kYL@ zE2?k7C8mTZ`->D`$&)8ODV0`_6%K^Pg@RGpFqJGviIme=#h87)v#mHlIhlH!N-``+ zxmJ_t)?&nc?G`#!oczhx*wl(KPblNEsN){VTp{}ij=`jucXHr{lu0#(x;^ORSw6T7 z8B!d54)dB>UtqMf_{D%M_TbZWvMEJNofdtL%ds#n?g%N{705$bZPkI9R|rg(I#Zp7 z0E$ILI+F5rSpF};rb!>US_KAzOb=s%*zj@=Znd0{*IjlK$>xcg!P)^|l09HhU{3zX z+ZW_j$pPS_?ZzoQ`mndDhP6J-o(9s`^RTlJ*Okj?Q+Fhnu&qKb6yGu0tys;QVN(vXd;e5qB7pyV}O zK=MZzsJ>~YX8i|enetC(8H_+jMhUt$Li^Y}&N0T~mHve~-WjCSHylhII}oD`Rwinp zBY%F30vW}A@y#Wu;Xp6nEF(pvJ&X%SCcP@p|5k9}_?OY3B!S;uW&>zRs**kMUb8RN zKfPvEu>@M$GU9hCV}=CQC;ecQv7CKrt>E@Xxe2HcAf=;BDEN`7~#hrpt1QWljpvL2(Tt#WUCwm+SEvBL>8}wSi)9 z%d4IsP?*ehR)A`Mw5+=L@uOs1%u~qzK?NV3v8PDT(ycQkTp8QG!sIkm*#61&AdDkg z^f`W7?Vf&J24&;CA+tpMwE3IQ57R9D;fbXJ1m-!>nb9ap7fU3kaABEN^Xe$1l2MTi z=z0=b0NpG0r#eAtUdt|zuNqFe(j_mKnoBd`-u8}>|BUu7%6*hn>WB$Jll)92U+D-J zZ})Pe?2fp0lWDX8^qM~)n=(!FvfPbwM`48jq0{ri_ZJky!m*l6B`cwZjb~@tUe^F< zG;9R$QB=z%7ixV7GyCp;g}N{>3)+NH9U&Vo;*M zNM*yb#;p^i@m%v_hKM-r)ca3I^V&{lBWBsZ`7j+ukKuC^lsw(bf%`1eMv-ZV-w%|R zwcs@V_!lor2zo%5dTo5#piIE-9`SoRXs)gKBugYo)T1%{Uwl*grz+BQD$?s%1CXp! zgQZHVWAz5jwDulv2!;`+SSaY*OsRFRV7B@3P4g84RWA?W&_Sqq%;6QH zLmFXh>ofVuZ6e+8Il9oP85$`}w`3#x91q1ewUMk&*-)*RT)Z~E8saf7ZQ=M8G{3lE zVEMsth>f6U;xX1ALysO|1|Agi)U0-8Mk-8oV%TjT@}8)e`$=1Fn}eF=a=-jdC%xW+ zTh?=PyR3cTk6|uZRV*gDqs>P+tcy_ z8FDhi0~EPvTYVnBFYZ5+tL_m-hG%i$DmzsQ^i@6FlaWd=~@R#TtKc(jEL6cjszSv6Ik$NA%kNtGSu~=c51TqW{Y-dh^cM z_U_f7=9brrbh+>^B0`e4Qf}OTg84r`|9|lFz(mVJ+uVZTDkB>sHN+QwQBjWo;*%$Xi)Ydp|4V|-++`#*CJX7t0s!G`}6{rvM!77jKx7B&nE+f{Z} zR?e%O>@4Wtud;A(qCfxde%XKbV`*-oVTNvLW@2LTUw!Vs_4|K)x&JTualb1meB>Z0 z^x-)oa_5#b2D9GL zfk$@~%`upxW$-@&f4ZY*F__V}&`#P$ZL(*7kZjAQ;J1t?E_c4(C%6}_NlEMR;rZ>8 zPm9Wly%?PLR&IohoEGAkR=!+H_HN4nc|A18NPj(Z@fpz!} zRS)fMV?OZ_KYapY>>w3dW4@O2*b53Lo6`agHu?T*5aD>6l$6v9-UBh=oTIK0Psh7} z?pQqNS@^Os)|?>oVe4*Q_@j>p#_s6IZ$xx!2dWawDQLL9Uu;!=;k+?G@qKk9@))$F zfsu4U0*-c25CD_?KEiAr$Z)Zsx{GsKtyU*443IOPEy{?UbNW-z)ybzNM{{clEy0_` z6X-D^N$EKZrGY@hQ2_roE8kyyf>`wXweiFkFfixbUJ2pIXZ>F1csUFat^5Aw>CuA} zjtloXl}k8`I)BbKeq;NGiw3#vj}QAlL9ZJncE|0_eKS!)$(HD}`=XuGct_S(hR9a}U`#37Bgr zDV#Snj_fV6e*tAEkgxX^Q3pMfKcHlAv^&pSA1}OY$KZ8MX&a#8 zJj}d~`>j-@z+1=lrMFs@-WuVStp~tA3Bx{`d>hynL>{&S-@xTVdC*&#c*z8O`>uv` zcpi_(UEg0&kVCc_v*ma*vtDBiv&HCLnP-iL3nK6O@IwW2p!n+NMh-!*-%C)1gY9ve z^NWo6{hx=1h7xefii(OqM;|MZ|9HpNRx>DCklv+6#lj~E_rIWS!BoNA%zK!vLqQxV(b`%gzTpu3t=@6uG)3ut+jRI;`9J+n#j5CkT9 z?54Ax3#>NFNV$U71w3>e^}O2~^DpYcd0)T)zKyxSlEY9=VzW9F*z}c1lY(KvhBl`n z9i7s)+`bhDwn3NON8g!BcDE{Md09+^c}{d6C1tx}nAIYuG2|~_7ZJUeM1^@{AzrX{ zt#`JPg5vq%Gq1dj`DU{qiB!8}z1VU6Inq0P6Z5luGcAeo3f4WApC0cgKMlzp%sMqe z7OjQowPtGOHps2oHO5-=847=V%m^dNfq^;a?ppp4D-k0 z6t~?rIk%KeYrjhgZnB+gd4GcP_Jh=-zRhXt?-1CtQa?oh{@RjC+bb34n>t#4mGn&HjYN(^HDPukt_oHT_Z}Wj9}v4Xg)t$;=T1= z$|^HO7eK>(FsI8|*^mt5VmYT8=1VCIv1I1S;`M0_w2aj$>;Cm^X4MQN;Oc#kPN(h+ zL7&6C1dqWId*wu;!mMd|rPAmKuDE>U@|IV#iqgRPbr}`PiN zr7SH?sBhG0_$A+M0b`=>x`5zl=+3oRA zeLgAR(b6zrhipQ|0PVU;AfxI*a(Vl8=+m_InbPOMh#X03=&Tcu^|Z>5!cOHvwepF% zNxrxn!P}gp|#EsXRnQx?fTNxpBIHMiNAbKTl%<{;SU_H#OBobo#>kYXL zjwBhDlkI5^4R5ZGk)M?p`@;n$EX@U~*(H2%$(%bx>{^Jl%@CyAewf$MJ9L$uL27_*RLt<4g2gc5)QoN|dmFut;mt0DfmIg*y>SM(VtWV;^5vL$ zemA}e(F3&DMxTywqQ#yH((ZBIQO<(TNqm7*5;BIaW=>HAXCCDbM2-(l*eb#u*OS- z1}vSLscduNkT71*s}Hk90+6mZJRWMyb z3T_7fWo-wwfy_3jRDIgC)~Y)<_@zU(-4wUF!doB8wP_rtZvox?q%=%%-)@lGe0yxj z)6*%#Snpm*ZckrO!C4_23Muhc>gHzQ+ek5__pKt6atd1f86Nx!=^#Bk_WhYnre~gX ze0}YR?@Ea~xIW{&9g6$d&-N)RJ}Z?`vZw2ApZ;jy!%c-w}SCAPt zxPW<1Xo;{_{o)J8*-xRGpYn6F$B|y^eyE|i(ZJ*M$09-`f>Geygi$@$G2pK2 zYBX+-x19(PR*sL)|M6bTv^ZQ*D65f6M=9F8-{f@N>?Jpo5O1rK0G;^I7 zGNg1MvSK~hgZU&sBl76eS3YTr2ay`gL=4O6A5rCx%7Gyae@V zgiVs&F{hQ%xSo7R%OIYd??ukfb5@VracvbyypHQv_jm}5Rt*D>0W@36VpwzzMs{2BM+xsy*z zp@(B@QmdkFcte_2WiyVZF6#KFEX|Lh9Yn$ol_%28yL^Th7TKx$-4}U8++VN^@$sl2-T4I$Hp}&VldrJSLR4uSN0&f2xlj45$PE)&@ z=VVBjg?yU5D0G;znx!=!?4rj5R!cjld zTN0CgrVo_UG)pEMW5x8@eSm-{24V9c4|Oa64?5ZF+`AB)2{jJqg^aeP0vb9xF?&*o zb;aV0eFV2`zG^6wskUe6*1v}ltu1{6r_xLZ6*o+@0MhB$It|DU9Hvw=hU1L!Gy7TL+Y;lOc-p7RH~q=0mi!L;Q$W!kis5uVc!e z?edU18`Y;9#ie}h=JmVgi#^=o`*_q2c?NTo6dTlbi*J(&ZxQh(8#x?v+e}f;G1im% zqQh_;>Li(j&86rt80A$}Dou-b6*7!hCU67dYRz%rDw@?;b`APqRg*<&Gd zZ!_I2RK6HtlPBA1i$-9HM%UPz+vsv2t$Jd=AC-itZa^R;oNZK`HKA8WyM8D_#&H7C z9G=AYEA}w%^k9Ut<3vw^^(rJ_4UD)s4kC)gsE$l2eAKhDmTopnWwbA;xZL1I8Xj*f zvlJ*#GPN+|4ZcEft6Ov18DY@Iuk7WK&dFJ=v^HvsQ_!tlw+7cD7!w&?8`VVXP@*eHH2IsuxGj%E6i!f1Az9u`yN+$(Vsuzr8-m z-Ov=?;(-K|p4&LQoq}vg-4+W-5aTO0vxjc7zU+=0vz0?rT{&ol7mW~sqbvFT{H#8o zdY{v}(W)znn!=V}j9(~&grK$bM9anZJ zj&NM+KoEXl^UV!VTUC8dwVU=q@~QWb+9Cx)8$N+(E}i2~9G)zgEzCCRBIXk?p0%aFq&9Qtoccpg4cQBe zo8$vCI#sV}#y*D}<(+(wV0WM9du-o4yV>Ap`tyty#)}L~+xaz~ZSu_xn{xX~XG8L9 zIl4~q#jO#m8_f0@9_&4)RKcDeyD`<)JyShD&JJ1QpLT#DgHvcp(6O8S`+HsMQj7V2 zl~3vpV1@03?BFe^wo(%CpHGI(dw3|rem zi%!0hHMzbQF1Dk7NLCqP3?)!yJOhAMB)ZKEPAi*<>YKQ4jG|^FUQJU^g7U%!GJ;2w83-oyZ{N=5xKx*Nchm`I zQeLTP_QrL_K)^zI<-Mj<%ju1lP;qiRi1ofpuQi>6HSE4OmCrE)b?0I zKc^>^6%1Qlu51hIiN)nE@!2*y_7NB1)&lPu{7Hvk%U#WTR z#aW}wd$@59L~mtV78aVMUYudoiILNQ;iI^5;KrSX=;50>|!X+5ryq)i8!TxDdDc%~tMRB1xhTtGBWy3$ea z6oC6!ytOtVTU#vPxOQr>0NgAx*qoD+ToNv;H+iYP3_~U*(zfamcx~d+ zDv3GF-G(Ghwk0{`nAyPoibX}UFPCrj6+6l#IvsKRyxk(N9!smP=CnE_OGJG0bGUUc zH-atbh{^hA=Z*P+62*;YqdUiYbYv|wipArM(Gge0=|h+8kIQ||kxH(RV40w=aFe2r zWS+pD#;vUZdZr|_WD+C(D@(-Tw6P*v%Zto_6t<^7(9Pp(gJTO3Cg)jk*WLHhypw(V8TgsXNIE|G6`>udYp-f^Nv^T;MjTb~z^obRw-hdiuS)%N5T;lTx ze)~ANPnsC$l7LPFv~|Vl)EC-0va{Loc$BMn+kTKP=}+AA@~8;MGoIdicwYHMyK&mv+okJ61kFO4olDgBi)aOABOz9ry{(r?K`Dz|ynNr{&&g$d)W-if2T z>+@aLQBG0YUzUhT@{C$!UhuB`JTlAXdmVwVl%fMRoElEyUn_E18|1k*e(+lOct~fe zG|R+#mX)Ohw-UbR6Hz&gNyi;j){FI*7LxI#xWpOzJVh$GR?CM!pf={XunbfO;=Oz@ z-Xq&df204_Vg7>>XH*UjFWwmpXtbUP-Nz$IqrA#j_H7A4(J$kjnk#2-e!GEat>5FDAPUY@ z0}%w z29s&L>;9WJ&jkuSL@iYd;;tg)iF8E}`_j9{yCn;;&xTpGt6s~pdr6oRt-&r+fIgJ}$lgPyN-`nBH`@-8%7@i)dY|4z(5f-wdHKXWha*_y;xd`H zu?syg(FVM?3G9idJH3&zFGSi)PfDVtZ7bQ}+&83Vsn#z_I1)S}yRIVN_m1gJ3LCZa zSvIzTJBPExS|0BwZy%3)VtgPqVL1O^S8GMX;HJz~Vph>yc29~z_60IH0-AWch6a>dM?ajffFz?CnM-aO1K$EDBK7FxVW!$F?qY|?adcYmX&+L3RBrFro1&& z67;=fuID^MtEc)es~4Z&dOYcrAbqqGVuMIK%|6xeXuFHqfXWt+xa`p=&p6!s%K-`( z`PL^hys~@jCX&Y@lp`)dD=D~V5lZV(DQ1|*zx-W zU1}jAxJa6DdZjJ|id@PxYIIuXWj^yScb|mHmFE8sd;bAeRko}P!%J-wh?ocx+qN+f zMWRGA3IYlOk_9AZ$(dFGB`QizDgqJ~IY%X`WXW*}NX|LKKWYjc_SwD9zTdg`e&4qno+O z%*~3TA-+Ned$tgUe&+6X{*4d7KQcamP01|eQJ^R#(+Yzs7~NAa50sqUO<%16$6iKl zGJn>a&5P3)1l^GJx}$2&_NrsLuoxk%=| zeSAEsB+bLRS(l_*ga8AmMaig@xRQv;OjFsiDH-MTOEslJ8K$RET9O2qj}76u8PTz? zLsq$(I{$2y#Bm22&pIAbj^L$=y*GU&T6nF8)WQgcnee4fbEaE%pfE(5YjSS9gGa`N zgqDx<7CH?XIybH~5SMdpcB8d#e0vt3GY}lh$c*CM263J!aCRsqHYN7Gz5RlI&^G zH5{^Pq=5pM3EExS^Bb#^^bltyB#P0@+k86V_D;5tYf(Qg=N}B#duinc5n1>UwWKLxTA_G^l#_AJdmi%jxxsAbcv zUJurr(0?Gd+>w;yL<+SuHaG+@k&DFptycp*c^@=N$f!XUC5}oGh3jZjanuS(H}2Ip z4gPR}ETY7(M74*KJ`I}u7UJ_XO;(C0%6_^I{O7dTx1&c1ExoUrNS@V>!gm@OnY|kgbQavAWzP(G{k95f zj|vtZ(wAy$_60pS2O~^+>aLKAa>SgH_?jx&M^ z5HE_bO8_J;G>${3u8Qz<$r`UZq};whW89Xn|G)wUalSjkbs&8D*8huu}eGJky{SNKVF212 zxkb>-_E^8WjPwhYg0ZzkW0tpil<@knWKR`GZ2~*h>4oKNAw{JS>zCr(`yqLfRTWgQ z(9R@d;c@bHFO@fFVzx^kwkCnO998D6)?-mfvYNeee~! zxGHaCFRi+B>?v*OM%SAus-P?T_G=-z`*Ha|?df3oi0p%wYjs7pg`Y`BmS4mN9#)-q zv9bYEnrAsqb-;(QEH+}4*sw1ko+`KIu6sqMZo{dJ5v%VnM7XnMry_lXg2i3zT9mDt zhQy`?=W|CBD--KY*9j}7Z0l3D zp0B2YMe5N{jXq7}O{z4y8H4mCxdI66s)7FKb?34dS51GiU~l*-lN_8O_io)QkQ#%5 zDw_J2tR}k!nG2VCp{lQj_Df}=Hp@ro>xnB?huCzr$bi%F0J%EvQTmF(2&Zsw9eH&E zR6J1-Hoa?NX@`ydcv*``=pLaxGLT4ZMX0qHkgIpXS?^$X)r)%7Nzazl?5?QqBP%*b zR`mTy43*aj1^XiJ7JuIMcuMy7`tJ2vESHdVDU;YmTN1g_E!=0Jkyg!(40Cl2U!JK# zoBGbwEP^Ay0XiXVvuR_gm9Eh2*v4f8#f6h1-ca=^Jt|ohJ}7mhWOZqGs_SrLewa=D5-gJ=8_`251`I-G9 z)Aa*g-RLlnRqiT#8u_{JhKJ1wZ&|j5D|3|TWo*Bc7Phw1-!IEJvN`SJgq&6HD_c{( zf@aPYBg-#95-m&Bosrd9#wj1Saeodzr!d$g( zoVBQ)57yg{^E_D}K0L;_1m4};nm^OTqLFR;^LpQxLj+0%npX}UU&l7 zPrB4sX z>d`8Q5@7g6+6%k+XN%HRw*mh&e|DYWxGkvn0n5L|KmWu?jS{Mi~}Xkz5;eo?J=oVq_DQ!IKuo2mY|$npcs1jc{G{u18+6MP`VuU(&7Hz6=(KOApyPSj;6Ln zIVm-KqYvoIYw=6L?hPx|u}l2C1A!V+9@#?kpu?(Q7M&AA?sYo74 zdD|@|3O$byO8WZrs){OQ6%8|{5USHu6=Kqyo|muE=Um7Tklfv+load#(97Vg)2fZ? z9vn``;inJB=1{P#DQzR;-tfNcgDqoQvsJ91y zG=-vOE&WH;UI0FN{Nz;jJFG5<+YR86`{1F@5IWtg>a-4i^T8-}EuOcS(eVa(OLCa< z^sWyuE`zyfZAO>$4o&^TuQyLu-!XwU;RSiB%yMKkL|P|Cu4+fhtW< z$KglQi_}H-bA-)}tUD?mHisez)W-SjYa5G2l6G2>p?th5Zq&i2G8jB13`SyW6-5b# zI-&#W(N2ktbt!55>t+`0I9mjLsWr`ekRJ}&tyh*1ra;s?U+|_rWP0*j_J%6m*KK=Dd)(kmXEg><0l|zE;Fs?gX1nRt0Z?CggPnjV5pfEf5K!#j3oDw zUQn!!9@J+v&7I+`?%hqHbbIdU+eGC&R}eZ`tz&hx?zngIMemIS5DihJPYyi0-fM1) z@oa|PxTU^Oxqh!|1RB)26~=(9(k@-py4dR$kwPko!1Opv0(-Qw!Hu9OxHb%Ab84SC`s?Wo7=fgD!YY(}0n{#UCT36sP&`fBSE_&A ze!Z+>sYy=N<@3wa+WMXqEuH5pnUBgUTQo7RxhMT56|pBXwseqNMNIwvp;f1~hfP)l zhk*HcYm#RTBjtzA74GR>WlR$xgb7ZsQ17ay94Q}d2e(_Wc|DBZs-|#^f-uY3dO_pmZ_Y z2ho}mH7}{%V()c3Xv#<6eS7r2QE66DwoyNHF)dUvx|Ttf=?AOtVx=~b4ziwCBaSvi zi=*IDPjZKH1m&>^+mYDV-G_?Z=p88wH#b%r8C8_1lMAPK6tu%Eq<&1|jJkxobxHif zIRS}k1&6D~p|*>?9&9z&k5pu&>PZq)wmf&3ELfBx)~W90bTJ)S&Mx~o`yNcaSZava zc%@(geQ45uTq(^%%~)v{lXp3cW+-u?P@&}RGH)>88>TD-Irlm1 z-qqC9j13kv{b{OQKZzC-HW!ou;vW_nWiUc)6uVO)9tPtItj{&Xk`<$9uNb{^+Gb^| zuH;X@cs$r)bl@q99X6*x0tI5{5Yul6p&XEokr3A=BTv#q=UQQFjfW56q;Jok4T@Bc zd16E;bcmypqiK`t8cU!)@Le*L{TsBL;^l$N3Mu^_wA1&4#54EH4}+QJ;keo$i`WWw{yvmMT>{{#|1~<3i6F3Li}C&$si$6_8Id z#wYm3^_Iql?mbAeRD`K`d_1eLxk}iKjw=S`WyaTB?y6Eye@fFY-$~5;e4!@CgEb z?1j-qqF#)6E_svPi@M4lWoB|t*f{lT?=m6$q1A4R2?jW&yZ!ee<^S@O&-%MRvr+6xaK zWDiG&6o3ExvH^brn3Yf)zkw%0$VUz=a%!$&M`lkswebO%E83h0)m&}qMA=33p?o3T z7GV1>KyQ22UC&0)f=S!ldDq=o`-_X@y}TrPTr z5)A|9o%a=9ot2J$^6~Lrw=OG!;M`~nTS9iPJ5adQDp|4)0M80q0r-w=y&`ekEstr~ z@sKYMwV(N{HdOaUttyaRZJ;Vh?d!XnJ?J_lD3Vrg1?McU9Y*%0va&&bYi${JoMS1@ zHtj1`u^T57S{+MEk4Z+y>cjym&NHDfhmv&b9ibq_!vx*I6LgjtGcMoLi;XHqJC3H? zeztlFMVc;Hvn*rjAztqTTdy$gm0yTh0QtANE2Jba`9#mfWGtn^6}q@HE>j9S+TTM4 zO7GS>&8}XwS)zYf%sQ&-K=zZsi|P4oFWo*EsB}vN%2y(U9Ev6Q$B%J$7^F?1 zP{9>W`LHJ=sMx0VpBVnkTG`ik;b!OcNkbhjyr{`mvu4> zuvt7iUWHCvkf0ABQ)ru5;02D)gI$ZgwMRCqL2)9iJ{jQ+x4g+heu3F44z;DJp0-J? zmAT+3~S51HU zQ{z8&=KEm;x@z_Wl})9yB4}<(exA;>^sug^pX<(Vykf&=V?vJrZ4AA>)YQ~5!V-*X z-W^?*J@bVrjrrGukK!c|s4xep zIxa&FJb55kUyHyj56N@MQk-W)`&Y zIQfWp_lx=6A7Fkhd0h>98@5lF60?7SY_4u?f>upvkjpDjg>07&by)1;p}s8_n^Ig4 z@>RqYeYG+Pyy}ZHm29N6{Fb-u^!QNBP+Uf#8mdq>T=(V*xXEHR$7zpr5u89w!j4-W zhhju{zdyf%qR=&?V#tdbO0y2BoMJ3bGdn}5x#H~sVKc$VtYKu9iqC0ZQ*jvnJ< zA_oWv8pSs8f_ZH_=oCqzVtpdiy7yVEjC3fYon;9@XQVNUM9zIr zTSwlgM^XBh*QFvPs4H3aA(Pi`7!(D=8G(;J)RASZC$j`iICSXY8smUetiWU8|j+GM22gIF%8dsCz>55$ioPVYQIVY&Cm&Irg}Fn%*- zg+g-Dm~h*X&0@m)gal?{m%f#pvZt4f-qdAi*M_$ph;BkV57`3}?Qk0{y{2QkzKs;F zFLX>T_4&le`cX2=kvc{4;wC&fYW8`s@{Q(xsuf&RiW{f_?GXeWShMf@e{Q6^wmKWJ zDe$8T5HET_FJ3Z9S*P*gF(;mkGADgxIEc{VD|xX@uyI}v?%nUKYiTO6xFqiP#c&j# zRZ}>B=d4O---fj*KC#ti9oyQ@Yu4-YEz&X#$n?{-r|Z5{-~u*9Y@BLn80SHyctc1x zj(229;)8o%RaCO(8R*Hx(k_$_dl2sqF%=!Utlp}m!#NJ&THFPSD|1j=$%q5Q)OM`h zrIGF|ZQ0>w2yygeJU_8~cV|jG!y9Eu6GSU=RgM5tg{U6y3~~q;3|0 z{Bb&j70f>Q!HU;B5?9VW{Qk-O>a{cZAUU(;yA&E#R5QQA&=mBkEeBZN-9Dt)1==cc zjHY^hBahogawoCMRT|&Yx5sIo?^Z0Kc&0e0qRb_~F6RSuLs$GxqDU{bTQ^i2`2(+~0PIRE zI}8Ifg-zWJsNB#;os?k0&!D(V{{PeOJ|e^hG<4P^<}|AQWg(4KIFpKK;8o>En&D($ox%W9=FGadEeT z&PRQ8&RV%a7>OgO2Cyni$uMkmR==t1^Xy$IFl`@hYlHaK+)~_Bd;k)85K_x89QDCV zuC13HzaN1-Ub@=_hAqVTx}K%MVIi7FwBop_=>RxDV&%aZa6K&1=6T8X)vU+1mRC<4StwfjyFq8 zjOa%I@J3VUaTKO4eSaybXV4@fQZe`d>PYWKRq#p z9HNd16Ze`I#FKZMjs*mGMp_Wt^m*|}$rMFwt_{9X&a*`3IZ=ES0mm3w@mhh|Tj*Sp zA|nQeQRal=`9fh+s{L(Vg_RLwG55+7uo3fBY{)P5V5wC@XvN|rm?lN(dtRJtk znZs}9AP41ILMoj9ZT4`CZ8vs^z)0t2MDupd(b|_;KeYeosduvLBX*wnpsjeq z+4rzWQ({Uv737ElOwA3(=WR9K+aREdevr>%JFG0XV@m#iwRhNY{Y_JUR5N;M~am5=U+=j)-riLrX zsK1AqbZ#&hZanr#Ok3e#xLq;kF~{xZ>P2dgWGCg0#Kp!TDDCqD^y@KlT3D{N5xF#^ ztx_tcrP4dGyA%;^1x_q=5X5^URaNs~$wZMg`zz0e zV-+STnUuYthrLfZ*ZlLu;__fb1cQk;NWYpi$;hGQlv8!!8q1%p*)77Dl=_8HKAHB) z0JO#ckU_5;JP$Wfw&g|JW_fLwOON-UUs)LM(5@}pNz8o6c46!|aLb|;Oo>@>-f<#r6pjq^798Fn<6{I5? zg9V{X$Q{SCk@cLHVFm@x{t9V>$fbU|{;iq(N>8?si34+N@qZk6GMn+6YSDdFS&uTJVTh_GH zgoaD8rM<}F!qDr-#TY|^t1O$%TLIdx8^YzA$h^z%&p*F%@bmSbYQ6nr70%`rwMV|_ zu43vT3WX4s_gB!11&rwm_3^YP z9}w!lqg2H0o$IA$b_GH^<_}{C)wN3(K?8Zn&YU;jxFmv5WP4h>N86#->~Ki~5Do>o znkc*-(RVRA9%NhErL)jR0@jSvKA4D(wYYQ#tABDpI9O}P%DbB{zjo)Aoqa3GH~h|E zWNf9XTEjqmJB)voK*`;WLW>@R(Wc?O16`}JooIpf^?l+Wf z8I%aGrxya#0a?=O=3%do20nCxmyzX2TYaj(RFi1hSFYK>P;n=FTH8a|?wH6CHe^8B z*30kbXjFK&ZMb^U@^eG8l)%PPUzd2GO~i`V2qy=Nrh&YU@+`&|Em5 zS46o~9x)gryso=6pX3y_E-;-!aniK|`tHf!RZMXwGSKYmSz47>f5uR(7mp|BZhP>O zdC3srbG~>-Gjw8i{gF|r3fLgt`unq^|2If4{QH;G>=zd0!v0=&Ai7Y9)1GI@^IX5* z;Mef4EvD<$m$QU7xY899t=e~8l-~N#iyW&4J|x9+qy!24+S3yzKELt2BgctpM%qu9)|lR(apr17bpSM>ON8-7 zk>iyQI7iqF1U1GbBRA%PV)zRg!LDatE0X?rj34(pl=fV8=l$T|f0`xR%Gf=uFwcEO z1AgYZ^K!D2TxXu@N;*!oBjH^?b5=T8+w>-s_9KD6q_glXv;4)m0`VJREPCBUdf zI7}pl9hoE$WWr3|R%90e%pPPp zD>uBXHxYiUjgIvm1d#-wfb27DPrs>M|8@Tly@$@j(RcLbOOQ`AdHOhw#&tma(b%SGvUBg0%4^4vA8No0Vlf;iIZKw41J z&OL3iaMcyEKpA?rDEKJ}x0^VAN<8@0!m&X}c0*2Dk4pmA+3J&oyvyS*@X6G7I-f&8 zu`2KRlhN{z<8X0eU&9%$6=s`bC4?l2PT>ry%%MA*f%rp92$t^$m#0@94td{pIu6cYZ5(w0GJ0txaagQP*ZbZ1YDU$oaZ- z)hEJ;miGpq3<(>z7X;uwLlJ9y7Q8cGOy706(Zk{@tdof|$1 zGy6IB(}|ze?qG@d9Y{TdqV^koLsODY;GnJ{bV!P&6c7-mg>H9qeLvp* zX|&Se3MZ(Kuhv~5Md*Pt6NZebp*uPVx&Bti)$tO9XkOsg6@jru0fn0;%DvI|8WedN1ZN2pe(o3xS7AO(8g(qhqOnAa4{fG=Um>Xb5x8|1yV(CPh) zR`<5Gy?q`6?MFQW08e)8rFpJEh5`f%fa1wOs}+<{zpn^V=p<0?!!w2$srfWIwSc$P%DJQUK!G$;5g8s#J-*V@twI*3MLO)aWUw0lVDXrK)S zOLg;ST1|Gh1%EK*pUCd}`ob&eES)O*2-R^V6_xNm-MtV~wd7A^IE}Jw5*M?>EGb4#KH!cm08h)Ev**5wrOjI`B6Mi3 z-xosRJX zK@+tWWh;_hdk%bRZhFn$4h!+l;|8&3H2mK9(40Qb^Sbc zF&v{UF_IB?n?O(IZuJP%wqWe9*Lb6}qY(K(*dq?v~-C#0#1jwZ!p_)k#ul8`YC}Dt#Ja-5xKV?i+S-P$r8ddV{s! z9C_S?_Pszx9K5?81lXA#=JQ;eyu*6Yg6*Y?Cdf59^qO5mno@SkY_zOb*r`2XKEbVz_CQv*RQ25n$rsE&O3{gu^-E2oY&;b-Z({gj6DPRmh zI*L_DK*k3$wASB#+dD$DLqMnQwR~|0*w+qK#RFk5S#pd3BtfWD1{>+FRZz@Nbn)Mc z5E9H_G$>pi=z)+LAB>{1LKBQi?RVMdg@4(;ttA%~MW?<5vk+Vb^UaF#uk9*mt&SZK ziG=BY*Lic1{dZwi&PBgRnW|!1M%IJ&Yh_K&>O|gX*oIAS=`*zbi<~x504%ZtQi?tG zBJ?EC0o1PeCIxMIkKebv8Hy^OfPztmyH(w#y)Md@Z44QVrO7ZjzPfpx<@y`lut?CX zi2DNB^km3<$xc(vPS@vdL#;Cx&^y=O$MAZsFX;#-?D!q&oJB6JDhvd8AnC8T zxPUMQF*K27I!%{RkV1yBRo#OH2rcAL-yBb>1tfy@4<#nUg)AG$&KNu~QM$q-K~~V` z&9Bun2KhzTgS5dlapypt2N}n+<`bP4P((awHTCUd4>A{|&_ol+XQ4NQ3^X*H7o#BM z=mH$&?+H|W)AGBr=eK}j&dFPm2rc0_$)zv;Pe;IKm^Saky=e;MHB|@UE{wA9oad#L z5*Nae(+g^_tJ~~{J9Es2kYU%`!O5}>K~An%iOFotQJv?L`Tk6Z_@c%Z68%3M$^U=u zlCS(W&otHP-3sMpzZH1y2a)Ad$Y=h<;JCG6>(%7DFHWx*6vF<3(qaZK*dMor@ei-( zMKLp*YLFsq9kLIGf(xBzJjYR78}Sw$p|_mB`tN8h?B z!d(dPa&Dw))JYKqCk-rH*D%ClqN-ki-cY-uM4~k!dKs73u5TkhkeK5qm!X%ym%N(sMzc zg8#{HyY@!Q`T^qrhNNX&#z^ld7Lkg#Mwa*>0vSuH&iTX9A+8>5g}efbon~rD1q)vm zu8p^65Q859OY|x;Hi?vkK*D$OmQ8<7dd!@Kl2cmUxQ`Rbxc_L_0*=$?pY4xJ;_C&@ z9JKAt@J+`PmL zMdcLf%N4^R+7*z;??zCdG47sSHq=wL-c8lN;BS>62uxigxY*ekX99RvrNDOGxI;gw z;42Fm+V>kp9Wa(Fo#Mxpo}z7mb>GGnzrPbHCDVZQe-fpoSxzoZ_kk?n_InCc+VLcQ>aB%guj3#YTY+NTeZ8~J5vm>>A5Da$SA2}AISU3=@pL)1xUfzDXtmNCr z$5$37x*EcXP%Pk0%O5T40yH6_?O%y@j=ls6f!s4ZiT(WcOH-hrR~IWClMGD|Fisno z5NSUZ_03*jg7$C^@pa;aTt{rT4BIVaVFzvrHCHhurFBqZN2(;*`}V@CQzixKx) z?f-!@dxlZv6uj<4UUvZ$pYiFj%LXADz3dbUAzwxuZl;`&f}8c$XO6laQ5^uCpIFx& z=E^>~{OOE453tYAzv;=lr2XV7+MZ4+|RToCkU)@BQfse)@2c zb!pe}``yd`G1Yc)cFKx5s+^+a3`1fHB$=Gc)k)C9jrdhe@dU4Rmc;JFxzAUBIQful zj%>ZTTgrY8t#_I6moh|am7%o!tdxz(Wt=oH}Vm# z2&%hs8@4~_0LCVe8ojsH>lfgVJtAfej3WY`;L=i`k2KR06p}m`#Z}a0Jsj=GGR`IY z-3+GhQ#8zw!Hk#E z?|;QbUy}z}OcI{XLtq_EYAy^u0c|tpl+q)^%|wusM~h_uoR9Xc-E$TBA>{)P`+|%7 zfQoS$S&fo~4r6*~k2Of2ME6565Rw#^=Lp%%Efa?AwIjHOvEHZMhM8>xP9U8?3)wv* zk~Z@?Q>WT+L1cQ+Hn_R9P>1~dDqLjV1VN7sw13>hKgaK~hi*hDNx+`#MEj#n=i8SF zsw+L4YlFgXM11JvsjtsX`XjW-^}syt)60M9lb=&0{(h9BUJWH}9ju?w%Y-BeKnjHu z`BTNjZO7`s^$fKnsq&5{q-`LRYHE1Dhwb*4!sFIg6N@pczmdupy}Q6Ateo zp*lvcYCoMGV+7;6pv^~$_%)~a=DCQ`z=}iIA#@%%iHj~9A{04U!#jcr?oI3mjF3kd zLh;)@w2CFrBPqUH(B#_(5PUV?Mtz^Dkj=Pv(ghh1DbYE(ZDRs|7xluzoSpyU$NX)= znn~0v6_| zt4>jkw;UXFmW=9-t9@arjS`GX>RSnMF>+ed*U3_vOn1vS`G;rogo{4x5BW{xJL8(y zDd9yEN{8uK3{~CcfjfWB)F5onFSC5)3f!l&>;D-6-v8h>`Qu>uOT8^Z9{nG~^XJ5W z4b8>Q)~iCE16%U{Pw$ogJ1&XEz3Eg(PfHvCk`c?y{Tc80XhtW#ZXxEse;)&4gEe7S zVkE+lEz{la{F@SGeUW0^Ow4v>QS{k{XzV}k05GjYI{zmu%KvGX{Kvf5i@kr%iT(5U z!L7_uM!BnKSQR#0=d z9mP`s6$-e~SPv3V>%o81Ua*4RW)onrKuDC3GZ5TXl!kyECX21~@H0bC-ejSe$QJZ- z+2q+i+Vf7<)CfKDT^X!V0j)x) z_yyX{FsF^#h#nMiif74!FsL;GpW9(KfWg<$odgLa1ek$Hw18evW84%Flh?+yg~jmC z#e3Eu=_6~}%U4v%lGVAH3F-^X>2;S8S~NBMhVTiB95G7e*7jxiy~{NdMS&S{kd~7n z)3SOn0bC=X-EA0mAl%%*!eud3cS43NPEvTw*xx;bldi)`b3~ZznYf_s+zlC*_CYRJ zNWA?(_LoDr4KGIsIY|BaIiU6*clk|y(Vg)ZIape#lbXj!$$BIrpiG)}d%A9HFb7CUfMP`^NXn>zBnEKDb2HStdVpQI-D))Q(}!bsQG^ob zf6{vm=IP=$x9-FO-Trxa3m~oTcJt+_D8a4Ive-`03{<%@B~r5HeD^hgEE+HXk3#Yu zq2k~V>^~VjJNfFz*?*mbUj6$8&dRbqiNO193YE9+aVY^2K0_Fy$lLSeXmOZTw|w8A z4K!TAF)5Bbu!woSpiuww+!%@;QJsxa@H@1*Fw95RoyAC>|rDfD$?6^!xZ~9kYc>o80 zGi!ZNc=Kjf^Be?naWI=;J1Kbg2u}L;WOsqS=YW^=#UD&@Y;FgP#L#mAoiwPA#>l!H z=g@irP5erhZJIsniv&qKrqVvU`4K+_GMM2k|7ZXj00h>iN>B`Cd2wrNAzN|YzsQdex(Rw#Hz*$hyFmWAQY;Le=rGI@--?1>`{DxmV8A(7w7Iu5 zH{s9O8!SJ>@C14aX{V?V3plhCV)c5#kq_nyi9b)t)`iTm9UuoZXH~4|* zGMboY#7#CQEh$KrNpM{KJ;YIzw+U^bcwPF>Ao=fjat4H~ivB&BHpD(W26WwmovCt37V?#jh_tE(Y4` z_U`h7#0U_Kmqy}~q?n$-NRdwa+3FtT%nks@kMi98i@8yk5B%2mY3pfUyW;}Md+=G^ zqB1Tp>sfJEHXOD#%>a^Jdk-D}5|v?l`sYlr5TJKTyLI-jLTU(xhscnDXwnpjxyfQo z+~ytLZ;bn!vy2JmOh1115agSHG;>!5+77wLX9q%z=|C{U1e(K=iZ=MVwsNG$enE>1 zar{)55TwM97{Q*u1ye%aYIXY`jwwwRDq28 z&uc*9r?u*2haS4EM&2Jyh^Z5~qps9O*(X49t_LVhVE@s!WB7_EiVAwcBZy5LDn1(%>iZ|B$8vphW4%PfN03~CZ}?q;H&zY0QsGTof}WHf+5n*% z_)w59(A* zdjEEez8(n;TrkKPBu{&UHAf#N*-{?5no59k09=^uM5m4|UI-U1 z6vo7#Um6oGC8Be*+G zKHHwRDHeawx$jsF5S{QuKz;!!onr7xFl~H+JafKTvGzO>Z{msVVVyJz7PvL^w9#>w z5uC^#2-XKO+ach1Cn!g78@4|Iv9JtA;OfL~p?DnyJRgn@!S6W6(sNmuBM$|XAwvdI zk$1Olh7&JKi)%TkkCv_NE}8L{S7(3!eHHZk&`60e6)5O2c7u9;98pHgPuqh>8PQKn zAP@$nyB5#LOHcD zMp{9TeUc!&1rBlI@iKcqC>o?(i;Fuz%f|^V@K_cfM26cHu}JLG^AkNweLkdMmq1T8 zH|h&=`N4nrMAh{XIkhN1Sy4PAHh#C{ zZJ{wgt(uz{L0gf?Cq;jLRZwW(OKbl8+g4@blM8yofcn*dzqMs2Znwi>Ym}CZ+VZ%s z=lp9)jXluj4n_4Ao3V{HW+8Y;gQ9JEgy?DGodOpv84@BxBivdmWV4@UG zz-%rMJ29hK+gV*f|LH$k*FR8P`pDVW6bKXFl|e9|Xlm@M>6^^N_JmT{){LkpSjNV=6~f68!K1FJ<<_H&5Kh_ za;lo+yd-mIXHtXoLy*&T6wv+p4hxPUMB6@=XOz); z754ip7Gu_GYgwZ3Xq&+J!{66QResq=s%r%D37*F}PGvAwp{uCjGn$E*@aaMj;~kMGA|1wm(}$sZ>ddp61o+e#x6cVWz>+`ip?)WLF?MS2`Tw}Hw;pZn;Rjs%^(73jV1hUH2&Ri1|Qd&>W}SfZ26wGv7bUQ*V9dt5-h`1wy!o;FKfRMW&Y7$KEKbpB z(#IJWE)T@&DUk}!-HvmPR`)vgAI;8R-pqmTZo<$1<3Ii>{QFO6eK`l6E6{>Wp!nGY z*+Ex8@8kIM2$$NVZo3vYI9+^l>W5Y#R|zR5`8=@zR^WmhgdvvA-nM^Uhktkdj6`s% z=pAelJ4NzREg`pcV=Euvy!P1;2YJbNabJM6v}Nm_3+IqHQ=r#&S7x}GrAT_qq~pGG z&Lv>!bE>AP2z@97!Q?oZ4%za;(f1{6i8gZ$^D`rgrIG)$RN8buM z0v#Q;$3CVzaNof94qLB!#9n*x5BLA$3-aH~C8V!&k2zN|>+Ikqw?(_Y4&c4{uTMbF z3fj--o%N14Bq{2VNk+UlD&_IZ3;CI=Dxax?7$m>@7end@4gkJ>O8KkyfLA@}k9|E2gC1%DWR&L^R3>Iv{Vky){SlICg*2Yja#3-%b+412DbUt_@fF;JhPtE5N+1 zO!R>)wT5r>352B`BHM%R85&_xDcVuEAFg15sYo!kp^(1hd?oWs+u0T%4}D>be*#*; z5MDMmHont#)}#J6*C3nyAKup9@6Z0lL6Uy@sZh&AHG%{0T!sGpZ za?x4uCqeLP`~CPw;*1lSBuh7$IVrO8wk30A~ZeBA~sMJ zbd6&HTNOpCi?F)?pKR3um%q3s??rxocDmnjrtyPi|j%6li9JhH0h)VkpF=cE;fw${hi3K_2n>H#jJX# zx81(2Wlw*?t&9Usj8y!)=;%{x6IMmUFd_${jOK^{p!O!&_cO)H%^)QBZabK?$Ur*; z`DZ@`hLpg(&!-k z-Fzt(zYHB=(Xuy71b^Fl_P8i<3THdC0TmcbCBH%U()_?A5D=}$Gg_pQ9srp5<9wp$ zW^-DujFmZ}jiYy3n^x=0HXXjv0Kp+lL2Qg~09F32Pk)~nd?DiIIQQwAZ-O8Zn^cop z$x01O!h}FO7*QE{Vs4^~AB2CQ377;*c!7d;mbTHr@;nNPf{l?G!RIwaAyGYY=ck5+ zwx2WHWBSI~qRFrQlJ@;szAw*tvG7k!HYc~fP-KR#!Z1DyQNbT~3nO!}`LlCF^~0au zwn5qkX5ZOfkS+-Eb|6*aa!F%U>1P{m0E~l=C=G1PQi7j z$xKs{BNyHILiUwB4ZP5F@1a2dEx|f;?I@BGA4q0oK+*6hqPc@i7Y-gW;g(EW{4=*C?WpAwkC+Dkz`*TNB9w+Ck?dtu}2mF)uoj z!L)b zAz^tiJF0ta9HF|l3OpCcRG~OLTIHsayX|8V?tSR3Nr+s=@=u_8WBcu=ptZky>&!dE zBUNmNqZ%3IjSJ=n7&oqiv@+iJ9 zY*)v#q~qT~GFC>lHe3+>y=S$$w(iZ9l9N6HGs_wQ%9b~48?ju&=K7*^(mSik?(GP^ zQ3@A*2OR_nyl=VI=5^EB?uVe^j~^I@I;-}>@yMPE5A_$>_RE9!JTdW(E&09oQMg-? zy@h$i8s(nHV`Yx_RrruT-b;!+0ccV&r#u<@VdE}d;W86?+3qs?GGgu5j5vJ|o%K@% z^=}w6hM109tS7Xz&c$U5433?L`CA0Qv7d+|vrJX`?{KG0MX zdHvv4kx{ISfWvi(8!YZu|7O>pHQy2F(n3Y_fuzWlca+Dm5TH2iZ+sHZ|M5L+eSu>v z@p1eKFI6{G;I_yk0q{$VmP5mdq88$LK zTiu{Dt76|aew^2L1YUH>CO)X4GsD5`6uJ6hhj9_)v=azXVn1pfUOe5rqaql9`$EN` zbxW_m1-WYMklRK@g+Wg~X75fifX0jUa8!U4+Y=Ag+%t-aHka0seIf!;fk3p&_>L4q zEplVZP524$)=$=@v#;ky$xhE5zi=Ys%#puY_Ne3rMv!H#^(eX%N`hP-MGW0++C=VX zb4WFHfV21Rxrd;sQP69gXE|OBbIoiS(zL3HAbEwcld*}V&5MxQ15qZGX`t^PC|Vyk zCfizp`#X+V?wJB%NfmT`^s>rILH2I`(eV$n)4$u2MfrPrda1{YOvx=m)z&M7H&RsU zEs^Ub2I=Y%KcFdtK!&{CXNG_S(6)l9*Et>wc;0PAa43QK>fWz}YJsu}xYe7JwU7X6 zwYKRN6VHGBhb_AG#g6x{ipiZx`NxtCB-DwI>{ zKY@~3NK;3nN&ygSib1{k)UCinKq)e~Ied_o@16FQW*;$ewgVi_X9o}7{9FHqPCBIy zf9TII|KTaOzQElTRSVeGa@Em4ww;b3y1c`h4!XjC!wvvp>~IGHZl<{!kZUBA+ZN-c3TjEz&t!p(Q-BV6;O~^D(5LYEODX#)l}UTQWu0FVivbQPoC&Q zL=cCzME3eZM+q>k3pdv%-C!!r+N9HFr8mzp9~e=CNrb+S^#0=hkyL2u{_pqDpT4}) zB=qBI3H`=7aEg$&rZp^tBpnTk;(%+vUBbLr`97$jm9vHWJKDLX*aU3j`qHRKr>V#E z@96Mtd6R`d8jB+L`LAwBAOlLTvVKwT&aeM;)ylpiQ&We0S>vwviGa|Ny(&SwuWLxE zmN-&5&$4Z%UUlVbz}LgC70TyE{T0d@w7)+}lDIf}`fqkz`Y^+5w}Z6p52mf4Edi#` z@S@XHf=nzGtertE0k#Be^I`mmN99cd!gYTHwg^l9;5&tZ#y&Iy+D#za_hn(P5a@>P zKOK4q6AuH16bNv)nL$Wno5TlM@xQ=y)4p;9`j3b)A9kD#Av{6;hC`o+L5Mh$!WNAoMNmuvDjNz+U>ew8B96t0F64~C+cw$9 zC+6zu`OS?qF>U7#}FsJESEpFhG@H zw574}2{BuK-I2Pj8}^6|nhk0+G6PLN7f`fEC!gfaT17H~95orjCRafBwxBg-`@B;+lCfyq9I07Po^c1T|9*Y%*4l0R96UocRTVt&bCJpQHPL%(of3PXvww6dDn9^-1lW%r@=&`od-v zZ3}uRTsQ8rd-q)U@2m`ZXAQO>9uv~07>`~)@DfQ!@mVUe$GmGvP{<-kjnQy6(B<4f zw3_w}-t5t>e_V*)11x{%Xc^4i#()3zn6zdAHvwG;8eUw*=$Fa;k;{S}gfVvg<^-sc zyvy2dfuy;hAb~OxsDjq`xW|-GNicL`rxJb*RA^c#do+{@yQ)VdFVKR%Rk6J z_I$j-9)+PWh4Z8*y|9qr7WUyRr~9CZfXrbKfWV4qP+taeA#;__V0NFk7z=r+jGQuA zV*bpR#t=n>qJ9`fq2=$%HGHG*B5$kv9Q#`neh0Tvh1UOQVs@{)35sZ3bQ_|hB8g!j zcx>4tTjXQXE`yxH;wg_w(4xf9HK?6>JEOoyPHQJw+>Sl z9sdaBO`wxzqbM#-z9_^X^`@=Zma~0>ey&}`& zW;vQ}>qQl!H825eN+zfDVw_8HG*H8PKj1@aWIIzUmZtmCD$pW~2!c|LAcWsz(+K!K z@B!+q!>`-EDGoElY3lWs(3=j?mWwf1zD}_=aZSj?NYFp!1kdm_PGKch%rIvgOkY6w-f_qG0jgZY-kvk$i*6GoTC} ztY7z&tlHVKQ;R<$}51Sf~+6tOeoX z?z)e zuy)~pcLz{7ug(p>RPf_Mwz_d=T-m>f0N|Ky-HH3v9ov2X5SulnKD`L@JOqFLXS6>+-3OZ> zSg-Akpu?9^DP<%F)QC+(idEHC&_g@DX3$p%IK^&*&A*n#)IPIbO zV0A|XOn3dTi}ZlqSc*udhzavX`7gj%rgubU3( zZ&9%`1RV~B3%B02r^fX6;G8jl} z$7bmy<_rX5BzHQzeCH_g>7Qdo4&UmC+3=mX_VwR3-6)=%ON&@%UhAbOx>4X__T_BM zlcN&6C+3~?%-nwc7uG`1S--4zd~?-l)A)_Qk$2@4sG@KC+>0L4IEjPE^&4Cm+E`z8 zTNv+%i4^xR#*_ph+O;3#C*1r!E$_|nn)>jfn?vuj)5XyG)9tuAo>27NSIiZHJD|mi z^K@|j%+{|}O5r4s5y%AMJf`KX4-%-rzZFy@j3yP)!O&q1g7%||1R~X?Vv4UXRzL|D+p>RC=I~y574+afA@X9MOE@I#|)YIXxW=Zj_a3K7sjQHH$Y_Y z2dF*HZ)xzC*q1Hk>bkKoxj9866sWg9ngvd`+&wjyMn)S12BqScsS2^d$HaerBupdU z7a1~^wUw44iGt--WcDeqL-w8l8$CrN9xF50>%n#qlsbS|4&z|>6b6yeBn9*h zLTe>$+7V&i&23sChJSpP-hln7jE+$BGv}CgN+KLZ8>HAt0RdZ0JLHj|Ue|1N3mMOn zE2M(2)`{=71Ui-}I~M$BWwkw1SV0Sg5HTu!>L0CO9EXNV8R3j0bJ;eV31GL0`S%wh z7^s^kR{?(YUorwM1H>QdUtfBh>fjV`PyM44&9sB}g@Hh9q{hkZ1--IkiNiF4fItTq zG_9ziH87Ap!CP33Lcv4OF9qr$n)F*6`ZWW_&3K7vAD|P20coffFF~~Y$T)yi`7(MP zSP~ey=#Y%xn$>O<^==3*{7XA`Z3pF_cP?PrgB`~vgPppgpt+5mP-@K7F_3ak;ksWsfcAmSvPh-VG4BtD< z@$mBBrA2Xf-G4{TM3?^=YQDT9a5)$qeISbRu1%Gc$SN9=fv7t4DFETa<-`@&C(yB% zm5>0&1IS{);b|M(+MEO8I|6NNpjorS}uT=p)d)}yBJ=9`n@1| zHG1q4O!%I+_i1t&xgyqz2K5STGMn)>tM1y4z*E(s7dSx5;uFw&~bdb$c zw;|dEraeIURSgtTV#00ptdXTT=CEB$Ig4v}mz_TgZFjaO8XFs*K+8|4Y58&a?UHcy zzCw_WHvXt&)9;6o(o5V(Yqco03<9w% zN*jN~r`7QFAc*s60S7aY8}4kqvz%kjx_6mz0Uj>hP;5{MgUMgApAj5+u27wY{D%ud zqMR5J0J;KU(p6^X7MMuBkAArk>(F6_8Z%NbrL z6>Y3EGT8va6JslQWqSfdTwz#utlWA1<^-%~Ycw&BHGgF!ej98h^PWKu5*!?isgJ6B zmULQaFadx{Sf8-Ml1HG5Z5#byFwE*8P>V8o5{|>R}Z}J5HE4~>m6NGSdHp0gkrw;N8%?kSXE-gStxCEpIxJjJEKEjk=Lt0IK}Q0#MyM@}wW%Sf2IjbDv1ro)dv#Eh4ZUFY z)oyDcGtlpoK?e8S{SVHVaO6p^)wu@AlIJI`6eBzxlD1kXL|Q zfKpr0ra(3_Wgm_9o-MOr0l)HtO>zNdItehJeM^eYK^zTR*_ofEaM5LDmyJ4SvliGvI}e33bwy5_fQ_}% z9QKmZ(fHqc%bKWB;Y|W1!R?UgDOzAt)9aITc4O1a8jz%g$-T9%DCYfV`TKXcTOOlm z6@eunoy2((Q1U_0WS6D!cIgHb02JtgYq4h_DH}ugrv(NYof^6uiGoAnwj;3y`-f08 zB@82j!RtfTN02(T;5R$ubZr0lwD_rhHm3_A{dwr+#+(%IK(4C<8hf{YgasBCD84Z1 z0FqPs73x#IVywscV4oJryCQ53bq<&Zi}HU!a#1f_WGeg|3$9>b7TPm(Oo-d7(s%Z24DAv z`rk7Ta?A#SCDOR-J?rlKuMhoOp6-7mHT?h2zIhd+(54@kj=r@Y2!n#|_uGZ2-^os! z=dYLjz31QVbN>IR=l{Rrn@@p7Zs^=e^{*Mm9)me8(NFYU3yy}{Xg=igby75LbT!q^HMk3@!I!?DR@mHb!!*y%qg*p4X1t-9hDOJ zl{#|&uIiX!eSO_nYia%Q%MxPasv9CRlT7+-w0rC$&F(owMLo#8zpymTk6eM(W_Cb6 z`SYp)ImIf2zjXHeb~#yu=*Q!b`>b!wR8lGm%qR#f#8f3^2DTMe2)$G&oAuG>dD*hl zw{7hq9r2G%%6sXQ@q^5J#~Nnh@!l!!N0xLKc2yHNKO`QI<|t_hY9Ealz={Z4uxA#X@!9rPcA*)gNa!{ zms3GSacuM876|-B8W(*N=GFWtsu1 zD7Ht)G&=g!7{YPT0RD+61*-eCPYj|bu2CqzvL%lG%WwTT=7*dkXw}kKG~NNZSke|H zGjZGK@1U6qb#tjCo49$KAHVyW1wr*YYz1>t(8Rt)&IWOVc~R&Y2c7vS6(C+81oGSn zmt=;}7Gz7`jp8;&a;?g;od#|PX{C}R2!#&P@!wr2RBqr0{&@P#i|FnO))zWrWxj%D zOk5H~EizxH)(2vKe}wj(yYEwR0hxkP*Fe@NeeSDR%vSfvpYQcYLa{c?W*`V4`^^GO zybCaRlu8)X7eFm6mZCU!G?98DXE3}mq)5+!&fWMARx>`c|Bn+Jwc+)PP3HV{<&wpf zq$4YH3fHxWqbE~pkp*7sYp?#E;rxKR$TOwvm!z^^)0QXFc z=M~rNuwz0P7yR%u{f6B8USrPQWuM~O$@C{bQWPFO$3Jk6K>I#|qxvH(g+Vz@D*}Py zLD~}|EOb`$GO4bHN88!*DVQK8Oz40pBWI^jkeWJt_U^xaPsLN7Byz zSW$OLw4fOvGbS3$e?7?N`g(pK1fDSxB2?gb zCk1(rA3y(NQR~PdF#tniWk17&aD{mfQCVe+rbfMRw0u8)PKOxsGBD;=fg$p` zSFk?0(Hu4j`SZ$XQiMXaG7)nE3G!HM1C#5m=bPjj>iPV(Z_Ih;IdK%B?1w`$;2 zgq|~KO~&*R2x|j8YVGN|!$F6Dy<;*Eq#dpD85G+=Va)afFmZdJ`>TM@V`XbIIv?46 zKloUHf_It;it75z-f93@3WbIVcI!>YgMBD|#<~J{@rYC^<0iR5n=<1#pAG{fZORgr)1&LvP%Q zXKRJ&9T(CfG_UnUGyi^-KM>}X|0e(ytK7V)2JU#ONJwg1M(mx7wKUX5x|6tgx?$Cm|6FbS z--Oh#*3K&)&~utSp4m|h)&A=~bRg+`%wNTJIC&&4-nE*CATU<6xuI4t-z;XlrM~nE znfxYbW`hZvWWXFUe_$lWoN^UwUIZ6{4))ird?^IYG7!Ro64{Y*FX{mAs*c5?&2`YJ z+D?-lYTFek+taLQjF(#*hv5yN9RLMh=zIre_uQ?|km*1n+Mk2!KV>aoWHBZT1VR$% zlTu;3fhdrs4Z!A!w2Liw;7CA z7tsBK(juk_l?1(pn9Sv^Z%}HsAJxbmNGb$X z_Sh(Y(b|inzovbE(Ftfv|AdDhhgMY}R@_&)X)hjcw>S|i!tlwU{}c1Yjz|>Qb6SqI zj{U?I{b@&aho593Fnz8-4Xt{Y2{nluX%RVqrlI?$rQRhH$WzHMJ#wz-`2 z@XI<=q+gc4{1SaFk0VFNjm2o7DyRoNfLOs-4;yHgDR^G}6E>8xLOPsX!PKjBpQAQ{TbP8-{B?;~S)X*h6nKJKNzB|=3Ju$ur%OF`P< z$3f=`b5-@4CH4wXr_w6r-XWy$mx0L6Fk>6>y4rM1)uFSo#XERWhgD z;zb``g02|qeOvszqKH;}0M=muJqz-A&GRj)5oDVbZa}-KtWn)uX)%ANJH5L3S<>-{ zth}b5`L7Q)7l8_YtH2j>IUP<#o#=pKM0eZGy`;#f+nHv*NphTzZzEj6-+KZIj?%^( z1Tut_4c*Tu$OVf8qem~(gT4v zYCQV!(Lu? zR78j6L8hr8SDIf{i91tbpn?TV{!{QHGg}-tcFL1ydwrdK7kf;NZsw>Ys92K9R<7 zzGLP=O6k%o`typvq~VyEci&e4L8M~PU9ycj{tou|8!O?w!GQc&C%%fO8 zslali-nW-FXtp7gB3@tFo-&!?%s{J>g1)W`Nl$LafPb%couZS}0 zEj-uXd-I`^Y{FSDvX0)bFZ$J4i-5?2HFq*h>vte)abOul{Dux3^>b{fy9{kDHT&_Srj!jqpA^)I}bPK;%ZXk;@x<(MB>;I_0K$S6OETO zQsh{!qzLkBYrahGC5ghb^TZ$Cru@W-zZ@ECT6bx$=5E5kQ#*z15WMX`#xc!fizf|6 zeif*Bxb{V^@CcO5yc^{Tk7=$6z|;nAvD9Yh$4$%~iL+f5tO(h8kbf+Bs@H=p`s9fY zZLWz(D(#Eqf@;0KJpEXo2heloM?9|Of~KO%C!y;~qCBjzicH}GJXK2hhn7E*I^LeV zx(dwS%!vE>SJGrV&CX4*WtSeA$cZIKcm1&G%ax2$!HC`&)&AZCQ%s53Z@b4nWd~pH zWXtGr*;Kab@*9sJTOZRFCN5ekV@tJ6ujcM}f{}XUjs%pTXiP*p=~t~GbOPlvOYh;A z94S<+)lf78(-cAOE0)LDZ!P?-=wMO%_Raz`WwmA-l1KCFjGW>5yrBn~=O38X%gk6A zUg$#B>Dp@$}6O@HEA*;Jz+U4PO?Kx*>Z5J=x- z43JA+r|y1vWYLk8?cKFXwj%pX5!D=MaEGW+zv5`StEz^;u;H!zkcZzty+C)*cKr*n z?zH!OcI~a4Yy;!9_AipzkT}wL#&e#hrTT zW2u!|MIEk{?=T`M*+9EkQP0C%cEa>2ylXFA8Wc4~{5V6O<@_u*EIVTtXTG6Wf>{-O z{saFqv5imEK~Y>&d8dHVbq#Xr?HE=Ml>#9NcFHX>IPoT1N^ z5u=yiVG4@F=yjc7q6qLZ$X;wjcs)qLtmDB;@yh^_lS*$|Rr<;Yv1Db>95UYb)b5qP zaIf-YhU0RjYO~!0+I}_uE8cAGtQ)KWRtMpUF)+QsndSj1??R zy|w39S)grR5HvvNh2)gjqq&~T2URO-?NFeGHl2H8UaOm()_q=W2eNqiS;KF2p(lZA z?H36x9h>O~Cbfc#w+g;0yJVa$>hJaK?yqbte_0mIIu~jEwKLh;5(b@sZ<-$|O(+f7 z@rAyBbtgCT(=rOW-m)uKNVMh4^J=JB^E#%UTwtZYP{dsRve){p!s=2lMNwe*8wRjr zib^*3Zkuk_XN#DxZL&CSe13UanTI#CXfMdyEXj~ChtncOXNF;2V@JhCaaYQ zIlZdA?&DIH&3P|p=IyCXvOndH|h)y38lHFhwO*Y$Gs zg43NsNJG2q!;+ajf?;X>H5!*Dm->8ay{jwVt_eX8uz}cH>u^fr(ADoRB~v5RnD3T9 z(q^tB`>pB=Gj9GYZWl3g_?lnQAzH3X8cpWAWm$MK!s)`NU9UhZ0eT(Kww)Y9uxh** z21HMd#3w~Z&QdI@8D@`ZYFM4+W{w_DE;;xHLUFkn6c5M9ex@j#ayg}K)9lXCy!Rl@ z(y|7Mam8!vjy#ans$@wNV18dg?_?i-e0kDolNvOO8=0Qj@%wqO?c`*3WqI$KMi;^u zT}D%u-{ej)ozYuO)X#=1l^>rT4~hIrkdB%qP;G=i$P@}PTn{o7CqI?thfS^KacXie z3IL&JdArVRQ?mjS8x%rlUI?XMW)cbt;|aotztv1>FB%1~4_%I4-87xIL+5~G8Ku%k zzOZ;WOHn`D(A^^2EG8)mU0=wR^mM)S8vYt3#yuOWRHCk6Kh0B<%G_c? zuGMHFAH0_JFrQ%RAgRGzILpg|+!vsJN{#>RKu#k#zs zDY5G9(9r-aINKA@w3%ne&*&6!hI}Y^)k0?FcMI2iI&F4f(>aGl$A}3;7{B0QQ`u))xIY;*Jjl#-e^sWpnP{9ho(YM)Mkcb!UM_X!(6Yha z4D}r7$z>w1seH5{)XOyl{V28!rtulPvoq-p62#D`oksM+=9e^LNv$33B0DJWoteIx zY0oVsFwCSHeo9DHCBNNqbv*58k+r=_ujiNSmK&XYk?f}XgRFPL#8)>I`RFGe?R`i> ztT8?6;gX|3qAg`P(Ro2}B>GLZ_RSpEG?veMgQAcZD0%dho^8UAKA_Znm8ne7cMl2G zt8kWQR;mG$tH%PCSXx?V3PBB^VEs9jP;Z%8PPDu3^zM!sdH$5=vMRSc^gIl`$Qpv< ze{3WL*ht=0H6fe3Mic`(Wkr>KNwJUCP%1uGQ@-2~vGL0LRjDR1Z7IXY1T{9@oMb& z6b9?aYhkfhM}JOxr5I|XlL!;ULFpq_?yHIL;2D);Y!ahMMUIwo7WnK?+592z%Kq~H z485|;?I4M0yEqZ%-N+J4ZESvqr>G#7JO;srj5Wc}2DIo1ZSHMs@y+pKYlO-7;GZW0 z2006pS3o>vK2CB&f&TY%ma(4LXVJ+RpWtiDkfPK2%4OL>V7l~ZtjrNPw>G_ayj0S! zj#%&INPkEbtIB!e=fc=3u$`$0^65XV4nlw!)wK}8?lh;!Yyq+Hn<{3iPrXm)0`@7{ zMJn*TI<*(PEI6~D~Y8oM}@WWd6UST_LwF`&#X)J)iSc~Aor_%pHOP> zWy@kO+xfQfo#!{+APp>9?$7kKY|{*w@=LO3Kp2qi9n9W}Z4p3+3Kq;z-lj%fY(4R` zcmoGw_FAGQg__1Myn}54=k?gWN+$~=vQZ6)S?Kj+Ih@v=egwD zdI7IGQJkFW6nU@JJ&mmIb8n=NP_VbFLBwGLWlDh0~y4mk0plgVuR^X-WJh4vyczvXZwq2Y*VYy&sB)&zF%D|Cv zT~LN^6W>31Q)~2PTlBK<>-h_-V`*rGLCUz2@aVa4+$Akt7RI15|0QKodLaS(^-%z5 zK$pMOT7SG(iv`Toyp}Z>7-8*wFHtT@CAO^hmo$&-T00oUz;zqkq zn+T%RUguO2T?`?tX%+PUT8U37r;3%CA#84Bb)OgVdUm?HpG}=JH0S30XYlkiHt$`n zTP$*x=1U32IZMTtnXQ|IdT)JN*5zGguet4W9N%=8okdHC)lel-P0i>Z9=|z4egwEL zu`&b{arrA$pLV+Y7~xF)JD-_lSFP4TBM90pdO*!i(pb;zqv@+?Y*y*YKe?;W&54Z$5SXWxl!;ujHa3Ox1*~0;Vqv# z0DM-zN^rnP>9vg%i^6LdEyjY1{|yN64=S7=Kq34AAAy-0fQ2pO6MG7srDG(jwWzol z9DSxsd08i=S79>Q*R=Fwm_Is6+LXLJ5E3IBw#3C2=ej!?1uwPp6LYMa`TB`DS_N$a z$k~hIeRs1&Z~2_cA3g^!oc5|zNd;41Q4P(Z-}F&EG*i)gD(!rS!d*Tvo0|w-y|;Qi z<*#TIRQ*2x+au!Q#lpn`g8@4jO_}B)f?`^!`0rs>-8Wgt_Xa7OBl9Q^hC$aL`p&U{ zcQ(k=OC_a?3?C7Dx{umX9emk-nNu`xcC4qX-F_KP_$d8{!07JZhk0hWXHUq}n0{3%%z_EviHHunW zhnqoYF>KQQGJeO9#R7DYi;%c#UgD( zUG>wupU!BSh8ziK*NfXnJ}F=vn3XM{q0vkHlPUMwqqy&jcZb)q%8O3J9p>QhUS`anU}RjKQUjNZmfEiB)Y4r z1bDkF>rzIao}XwVuFHVgK1N0B3n0CM&)&R&w?3_2!e9X1;u~l){Qbn)HN_UJ&^O6r=nPlb63?CP-6p` zUQIEP@&XkM^;_NI?%cZojM2R`CKpHUkU;Dd=jWCkGYg_j8Tx|D-(NnfQ@a}jBY4f z=%-{RmR=vPxxOCa%imC2` zE01lMMYDX{k#T@0p!(ZT|5a*&U6T0nhJrtOd5u)(nLLR7%k(x9NiTeVj_|%q+L8lk z0v({@)JeRoaI7do)SaN+c{EdLjXDpR<+RcIrL30Z=b71P32VgktC%l_qcD!_u=dI3 zZmxUrDHJh-+T$55H50zf5&fKO(}@*O9nNDy(7Qr^%!Obbqpc(xa{-zMOe$HjI7iER z?|t*Ix(pJ+!~5`FRn0BU9E!05cg6CDe^&Wv5<%FA$wfXkc8>Mc#o7sfZ>vb2=oA#q z6qS2d6r@shNXErJQZl>y!xeOFrENoarmqqD{S{f~2gtMZ&p2JmQtIq0>ZzTfCM=Z? zroHaH3W78wi7vZGeC#3m3^j8wDK{A6g|pim+o?q@Re z#?2LKW9WL?Hs!~|4TGxu!8BBDCQ!dV-n-jY>1~W`sP54KZF$P+tE{XR$365+k9S)8 z0&h{9t=n>}m7VEzSuNRQFmxJ)bhacZ*%!e`llhTXPSw@ZWo(Y@ii|TbAP9<#3mK(8 zw2~uo3c68KkjYT=pG~QttMvbV6b{CHt7^d*a;B@7LMLi1v{qJ90zfk>s$*oIcGef21u3scv9j zQl*k?zWY4Hj4fU2Jv_l8w16%E=PlM=KI?Do(3+-QYoIj%4PJ67hNVvrgQS0~+=Xdv z%B;igE>*lG=N)Nb94dDo$3|i=K{bbWG@a!ILcPSdnYqjcvb=wA#&eDmdyA9(q+K2C zhnL_oY)?1;^+6?l#ajl1B6hz&ki~@Yb&uT+ZL%pNldH;*G%%lUl51glSN2xX%%94& z>?Xo{B^XTw=ltkdWo!jQOC-qOK%e24%yU?)%41R?N+6t!<(B1o&98_M(N?agJye^1eRwhQw+wJ0928CGku-=Ev^e{DD&J&T$R+ z5|@4oQ{uqQm%eOd$?7~mKccAqi~$C06+`v~>(nuJ7*$k5=I3TDE8X-XBhWseC`Pdt zIi2m$o5skY0lx|bsPlkeS87pC7D#e`Xk7Wl&OF!RZ7!THxV zo@wdi<@ek_QHtrSc}6|;Oo1aEcBqe0%l0O^1cX*WQZ2&8Cs-rO0gG|8t^4X)A_IylORR^k?%P`c?jaQ z^%j@B?%k#DDmq#>O?J*Y=PLDDv}h9N-7mxXw@&Hd1*jC18uSIh4y z5Nj}Bd*BIQ?sP^0n)3p|X%m~L45VjBN|S=194~?Z4QUJz<77j(5-E8^yFjxL6cm8e z03!J@S!b}8;mN{PDN+TVK4!cNyZv9m}QWq8xIE< z6IM$=9u_7%RQiXwuM%?&1Qe}l4mHHo4*H;Q{G6clX-C6;L2thpg=-iwm`7p&jQ zgC%nxRH9lRR6|Htn{gL=BhxUYSk1~(|#-ue1d|{BDtb^Ydb!qbcKFJ6n!H$3bmKErvrG+|;>#J6(+^|{dacfZIW-Z)=35yPig$}D)!Y{qJ+s};UjwZG#FN3;) zaa(rTdYaltN^P$+w6K|_l#0yd_cRR9_GMu&C--1)rtCoLE{67t;gxFb)5>O2)UU&{ zNk#K7p5=M)>3K3bpa_X;hudfY??8$Tn@gmq9`gngiFx~0P)HfzU1iuLBUjB@*t_2V zZ~gEBNb?fI0Fbtmj``&nku64eUH6CPLGEkhGb*Ln9#E)Hzspe)c%f`uFfWz#0LEtk z*}cG*m^J%n{uIMo;^N{9>rmGozOnCgxV8F^mIvndyQ?+U)&o@2OQXVJQa~e#Q}eh6wYFz9kA?xQhC$`| za_$;RV&~%@E|x*r0Y%v5)W#32I{jB`oi>hw^sr6%nd>mq&r%zNrW#)4hzFi~^VuV3 zXd-V?#lWh*+~Zj^>%d!UWAWuOnkFvWxuKlY!;^8Wa-W&GweAQxuC@CJtqd)z)LmOd z=S_(s9%gAQun$^Xq5$5Xyg&6u81qB~3Gt76edw7|-um`@c{6)?CXGe{d**x36bsK3 zmI_LJ&)qs==v2AO!>EqF1y)G@|_7Vx;jb|5;FZOUq-0sXTMHK1t|Q zP8J&8%72;Sw7Jn1R_I1&tFtiuMH!jPwyxKH$AndsuE!~Lik%AosUq)W-(r1+e#_i} zrn!yPN$pCTvOIZVWDd+Zu^b&+G@Mknlhh*dwO(y)E&HG{OV zZS;3wx-4cjCle5KA2V77P074UM>kr_8?~=WiSuHmW3alkS@+JmC-vvbp;Ar5UPt==33ND;(WcTK2lfd6iG-#o zu>c^1VFO7{o`BvtY%nT^c1_ia>4j+R2nTNdScB|$()JVR^;Y?7#x+f?N2b;AG0~Wo z9+uBLBF4wHMro=Wnr-z(R?*PU`w3Q-pg4T=w8SkD=Hc}BRFxWLWr7C1*KXpkRrjv> zTPQU82n$a?V%uPbJU7A)V*F)M32#9PAuqC^`M7rI3+16^cRQN0b(=4eJ9@9FRxR~z zw8#FwBhgDOQ}e`YcpA!=xAK*@_MXGuIWz1_W?X+2ZckkF+OHh#Rs@I9urt>o<1JK# z^8^+wrpc}103fHpBj-%vCd^;AWdOFAp3HTDVHOI>iAuJCw@VqwASuL(h&{8K1$m}< z)}gne+9_|!)~7*Rgju7%m$o|N%Ve%s?=^WPb-Zl;?Re#txP?2bkIK-!%IABg-F*ob zr^Av`BlZ-$kj!!9OvKAuk7zJoOaa)=q50)iV_ZXuMnxkLNJFEL9LhRvDoiBwB$5X! z17dW&K}$75^oyhx(~0i-dq$)9ED08cm)0>B`GFVE;x)YB^WgXJTUnZ(=&;UO0xBSI zgrETIxKRlFR@->r8O;RC4#O<0)$(rUD`};Jj4Iz@(gaMH8g5&Oo45K>%w7X7Xp~aJ zqXhHsXmwc*V*Uu7eDc?=aC&sDrR1cgj{>i!QE};IVL9uuK}{Dj*&BFYYjvfYB*H4t z_35GKLBR;B^$V>i5NoLS%@(fy^x~v+QejzGnW+6*_GS%GD=>u%0*~Re8P>!x69%}QHA5`ctCfg z4OO>kM~>NGW1MI9Y0(_eRm{-Qg*H~{_y=RHDZr5vFM!?Pu`=xh+C6stjUZ&6#&5@# z{q50I!K4ElOdfq>w>UA}7G1WO_m8S|c8UCTeS`^g{tm-zuK9ShFCKB!eEsT~GJjmd zql{8ajHA36tv&d^N1g(z-L8dAf@BK7p_i(j81eYygV(L zXeHA3=&4=cD@BL-CTS*YC`N{8v_x32LUmTNf_{|jO@X#(i&nHtOCXhP%K&+_!Q3<} zQ*BdZFd-SOz+l=I2V{f!0Tz|evZCMGD+1XyQu!aPZfWL?9qj)2c(3*9XUFM9>0crV*`_cs-|+Y^Kn!sj1Q%NSW-Gu=PP%wxmr4s1eqoG%2ke_?g!u%J13$@N z8Wg;=G0j@?klH9)trb~_G>1#QW}u`cT*PmkRIorKyxLZqYAL`@&uenOIkD-@6}K^? zGB$@{v9@Ou$geFdf7We82kxAD>C-WNcVsC1#`MonEYh_@4*_UZf-yBndg*$l4`{$J z<2XZj>D%LEV73f5#AvU-M`*BZbM z7RA18o;J39UOZo490KC@SaIHh_r$eob$bY2zO-k6VrOlD0&+O?Y^8dWsb0MVsm|Kd zT3p?+t02-0*?{3T-v&uxK`0B$+o7PPI#r2jV*F@?k5yzvXSqNHzrDU09ot+l0SL_$ z%lg^~PL5J)EBeEdU&Z{7KX_g87uy)gD+R|Xv4c`aO5=3>>`}H*$HhE?CdEB38x#bm z9j(cxxn*WQ8$vh$8LTu09jd(7AraQT)RJ12WyBxAe9Z^PtUY3NC-h;Ao9eztM)jPF zZ&`DJ`x>Mj9%PFS(8HSrn&spS9=b2# zy=C?J-KX5Gjyn$W6ZXp~nO=K&+8xH5UV*&5vC;IqRUi<;fEo_gtj>qAJXzTZ;`zkp zDj?#7vDUjgdzAyH58hI^o_{58fptP*bJ1xtpesco-dEnB>aG3S`XWJ?#(wIfd>%WD zmH_4Y0$+$IVr5o3o>JtKIPLLzCLHg|Ch_m1zV`Jcj#!f0lAVgbveGvMTA!zoWNraj zz`<}kR{-0Pa8sPobdGdpT5evz2v@~;Ri$o7=IGQCL0K^4FlN9H66bE^spqRF{E*m-!mtu;pcfTt?& z{e@+$!l!U!KFN)QyY**9zOzET8}ie?uoTvUkURg=%Ebux)f=E>5aATM^yuQ#RES4m+595qzhio~$QPhriQi_r?R`~qL2xR^>~ zhfXNN>mB4$ox;(v{Kxw~PXa+v`DtVB%onD#qiVR|3SQ#mB}$DQ7#rsVgh*~@n_3zgr)y^adnaUdC^eZvsk1loWM z_e$O}O>@ZhPJMe!>I&i-c8SeAh0|UzvN(zkH>(l4`<^|D?mT=@RINjD%y|d-WzaPO zu~XYw@i!8OvuZAgVQ&;f8)o;o_Mkg6XWyIb?3spL z6T3Ye{BrKHwdEn_k2J=3wt2vvI7tnbm9HKLG}OdZ~pf;|NEQ&{muW~-@LqUlYU&8w@k!b^cVQX&1(`@6EEL?g!})) zKM#yG%r(u-ShIjf10 z_W$r_oI`)OxjC`_qd$NBKRXvY*EtRxJLh>W4i294JY4MP`{&Pdp6AA$`(N<9|KX2? znYr3S^pOvZjm`hn&;4ir{*Mp$f5@L_wcz0Nq?Ps#hBDWB?` z+yeUF4l^l{%ecfEnql|biazow>hdWpb|LyQ&I!KMfeQmvY z_0nBym9eh9p?AxA_D)?o^pmdp>sB(mGNU?5jj?%pv0J4_xcsjktrQ4w>qSijpX0^L}qGQoAV6h`; z`1Z8d)^l78$-20*CGX&Y*x9W`P~K?oD$XvbR$xM0G>|;wt2@@&rauV1w37KJ37z zp0#7cycJFhI=|Up>QMnih*qr-Luiqs2NVwjH_Vx;$DtXTmd{)#Ie)5{Sl3XeBY*R| z)vNmD28|ff-um|2|Xt;1GeX@ z7#j(&G}@2o#AkLstb8;XCBxuoxf3me;%S`gd4BXmCFowrS#!SoV(|ksTVhho_pG`s zN}x8?yz`9kr10%r5J&{^E)WI8W+RAEH>YS++=bP0ZWhBG&@_h;6C5?XCo}X`N8*!; z-?-6Hsi1f!{ioOV`I{Gqd+Taa0tldb>;LLHw)7Vje@1taI}#T!g-_$B1 z>w85h+-~}m@bUO#@4z|pBD($@TCo^~by4}fuT#+Vbk!x7Y-o=t|LIB!1}SAyc*m%O zUFoC|4h!-_b#Jab?w_e-lho&_T9q7?s%i0`St+64IK;@vC>5{9J~iHvWjxdnBRSL< z`w~Z~V=AQjrK0dB9B$?oeBk<|lW@~W*6KuF4AsSD>&@SK)u*TjD_ONrXhi}AS*XJ< zL1V%5`|atvJuo6j0oy(bY&*`qs)uofSdu1gbgG1ul(5>pC`F7dhAB)vCm-N`FyACc zdh)vGKK_Ypje9z8T)uuiM6P7=5yZ1F3BVsqd(6!Z+7q#1shH|zlvn`F>rDowyZFRh zM$o_(*WdXnV3GdJ1iYP$l`#96&yeT*q3~$vgQNVy?0T+(&dva6!X=)^If?^R9gm0G z&)h7zzEiwrm6X$<_{siQ*&>)zK?T2*E)M6S-33&J6xPXM@;mmrGjF0rznFLX&Yc%} z^P^~yDjH@OEJH5?=!B&QpvsGOlOSo9B zzPtJID|yt}1^aT(<1d>N><@sfKr74-gN|ot7!Y(-DX?|PXjWhXy$=Xts|L6X4Npmg zV$E(?*%wqUnG2VCvB@r@ASRbQ93A3%g;bCe^hA3+*a~kb`mq{UTw@n65bo<^OQ(56`Xn}M}k>h%*28U1$=%|4}oZ+3KFstsIW`g^oOw|cD z8Y%sddwUMj1RCMFizbCxa#TgY#=`>8Jj}&QX zD*_&VZib@=bLx$-arI{rcg&a;Hr77uB7Mho#gY};&(t~$v(^dPN^6RyH9eqDh?nWi zHtkC_V=LTiocwW5n*)sD>u52JsA#c=R$=Wh3t8^HOZihd9GewJ_MWEn$J(7_`q86^ z>bFcjI~{%|+mP9`a8VtmWj*SU^~-jOkq8TJX02YGETU&c_Y7s(&p*v$>Q5J{$lCbkkNQZHepf^j~eVdKt z!G?AVhe3YA*=%u{oXNt~)OoF%Q2FT&!bav>?b`6&Eg^Z(!%aq56JhPhj6Tkx^irIqa9F+}qN$ANq`Bgv@iV? z&Y~nShjMRP#T4X-PGX%pY}dX9Brlm@dA0(zM%mH7XE10U2~Cd|YL_ z3p|xg!4~8Xa=!8X*mla+JubwFiZZSTj{D-}=IN5_E)$cX%gz)`IwbX?wXewxqp!A@ z;BMAWDv+HruGL>&C2WRIHjEw8FXi?U!UJ0`uiQS#$)t``7BdXuTM#tll ziD#S+WNdnR_+;v0ixgo~W4JX%qs(!2Tn-co&Do;#<7VSq*NxDI)vYe>oz8933L)#X zoOlSiGW>wDv}0joOjLIZ!EUm^z2qQ&!dqlOcW+*I0LjfZf_DecJB9_#v%w?x*ydNS zu&dfnU;Bvm$x^sdMDq-78kbXxmqO(xOXYmmZk)3}xY%FTUd|$80=H21>a6rvRlU}= zLRPa7gg?q4{k`s%SLfg-m1{97%WghYXYNB%*T#7y@)=? ziyr7y{~*K`yo$_5^C6t7X&D(A)QIby(?{N#odD6vvQr@jQYLxjuVB2noe!H!ZCG#A zD~-kMK5wRMLz!niM(osv>32RFYP6|)uzXdR=O2FelE_F=2IEO{jq;fGmbyDEc4d8A zi1MfW2_`&~sXENd#@~h)|_LG@qO=?-nV7txA}t8F`?TgQ;qA{fn?*41zw)MqC<+D zZ4b{N4Lu@|imO9w+wtxy(lXv7lV7#4W$nMw{)% z=;#eP+B?lTqKls9B-2gd$(xH>>SkWX7RYI@QFYL9?XcBE?gFjz8ly7Vuo!eN$8%jI z>|}YUn6szmI8x8*x>~(d5$pI69@|gPxZo#2#2JbGR>c7;DB&wD_!KzG2Ot8)@bts^1dp-)E|p z(%~>dG#)FURloD>kM`n&3!Mn~ylQ$sf_5$YnO}_VJr>VnT+UY6T&204pP=$CQ|gkl zAtdIId0rY@C*<1$6Xlt z_(@Qw!%cu3VlB|v-wDQa5_A@uazex%Hyh&;`ha!=h;HK=Q(@5A0~!HH4qGD`<|T`Uj`jHazRmgg7X(Di+(gDV}#&+&!8cR}z6 zNer|FS>1sFo2_pK(9XhApLJ~7vTrAgxWgkLJ|zt=Bj}28f#dIEBjl?29!;Pcu}Jpj zQA+p#L@$^Q3?YP9{|ZI}jcze0;AM?cJc9fofx!_FAQh5wH}{$e^5%0~5I&PBG^PlDkw%0TW$5515E^D=&MgaKB3a@~O6D zZn%+y^W&G_V4l{vEC2?lCBpgs;DuGNJLd0}A;l+T-Irq1`iC63qZq&>Z+KZ9_m0*TyE{ z)RpI1#ijVWrm|CMD4qPAP+QxE`@RDxWKP}Iy;{2G^ou3tKS(VW*HrG38dVb(`y~U8 zKo69L>K*G(TCQtzN7hyrcrxUj?;=ZA-QVLab^Wqs^=qM*h$*xXmO{%OX4YE_yYI(3(h~ zG7-94{?f~JwU@QkMAaxHnC*kw)h=J}fUbyW>W#GiU=vkM$1xJAU+szO1`4;om?5KD z1x6Y-qhVJUup{w`DGSbteJQ7*SuPEvFP;?RDGXRuy1F2oO-}5y~n94x?IlV0a8qF zKh}1?S0`T&jAox(%e?i&6vE)0^ng`hrb9$Y?a6 zbL&((j*g$2MQ8jp)a;4s?JpE1)GgL7^+C^+Mx!k369(D7cT^(Fe>4jEq_IbdETqEcL|{@Rxalole?Nc z+{}h2f{1;Vsj~}lF(O?!oRRY{pRQl2I)H=G>Q>j)VNe5mK0qlp5Nchg>dtKc?f0GO z3F_G{#55%#{Ndnj_D(!RF=QT5V33R8^~CYQw?WACi~h5L^;T6xeLJ2+rY82rt^ zsfx@L0+4U6>hmk)TcQ^X&(OKfcUaeWfzTz_u-C<2w{1HR+(;=BzRIXnP2q>`L$K84 zv1??l0Dpy&9G42O?PyEtWvvv$nh!z!v6+RkVvopoF!hC@H!& zjlTjY^3cOZ*K}GLmEnYT>Fs8=xjs*?X9SI9caM!CSf)Ob1FabQ%yd$KY#RBTD?SV= zHXrI(*9N6g2<$Z8z@J!Z*6~4k#|*A??ba9L*f3S}7TMP6W1f0wmoBz}wk&$PyroRa z79qiR5okBJaLq+PU;Tn6+MZ~W%o%&la3DXWvdzLtvGZ=A*1iwQDMi*?>s9?q)ir?u zVuEBpfqg^`6>xVOYrjTG6nao0G*)HRsGM9MMR2~k#wV`@J#G5XP2;*)_(yv)Cp3rSvt1JN*Bw5angsOvigKga zD0$$}hSbtmX;yUQg*rJN6#%w?(Ti5%c~*nEo7uGYZ~}CpJ0$x+OYe4L?d5N`2=jk@ zc)t0@lD#FT=$4{2YyZ@hf{@E~ZA1qxTbmNDgK32=Z#+!YjvGZ)k0*A5k7;}BGPU*% zCe}W$yi*UBwchnZVADn39?4x$;<#im6i>0MH7cVwj zE46bX*5FJZQ;U7C4+Vmu!`Wwi5hWqmC8O*46aB8^ts#vz{k`PY9hRQZ&w9`v=~dXqpznFZ0F4 z`3mB2cvfqi6ywKgk&&0@6Cq_7K$rt9J|&_HHlGrqE(P>G1fTS;R~Y@ztMv$O9Hl|t z+>UT$9-)0h>p%Q8oLnq@V?3Y>oh_Gp$1cj#B6Q!N50PkNI+S5Vv0{z3E|>9m*@V-8 zD02Tid5ga_w&nG=@K|c+s$cHk4g=88{y(0;Hh&4(C1>sqg`@m20k&EynjY;cb+ag71v}hVK=Nc*wSfL z!KF<6U|+q-4my-lBf%l!YAz3{Fra@Y%ECSiI(Ju=(5TWq1Kj*yYd#!O6ibd;a_Qxz zAFwh1l8~6kfGP13a!SH=qOs1P%z^L_6lEYNA}ivd5g8yM=v8%>!Ot6$3elaCAZxZ- zj?XWb)3{7NOto!qLXp2oEk4gtu(a2RqdRum37vt|Q`>KUd82fxu`AaRAu6v>L2}z$H?vBM<7IU{rt}ph+sk#t*GQQNWk9Oy~#y9dP zZnKE%H_V5oYP3`ltKUz>UD4+Pc0JYnMg8DQ(>CJ*v5f_WO5H?sbq`hwSm&iZ(N9TOq$=~PMYv4=+UqpfjGE|oPdXJ~H$%wwB7 z9hGF(nH7y+Yb(rb4_%%c2_z5|M`b!1oW^f@O=y6m3NfqS1x9RFl!$2nNr4M9PNg0B z<_Lm6gM*|`qFhemC9kz0Ga{*J9|(;Tj?g{aY_Qyi{C%?$(GsA2lcR`NVj+TFO)-w8 zq}j{^(g#o5au!=3o3|3{d2|TI{p&d=G>A7$);Wz8h<(`$t75)slg{N+yKqlgx8Hs( z|7W2k7qoS$v@A~bDifWq__2f$+<_TQ-8@LCg2#2KBK5BBg9%=OYu!`O!ED^;{aGrR z^^e-~q1i;KQIaDHIXocP?AchK*!XDun>OcoV}hE%VM3L&(^N5CEU_)U$zrsGRj0_9 zXIPoku#Zc9xnW5UJ*H1F< zh9vu+x~i+mnAps{ye1(<0#pAI^bUu(iW{*yMQq2t7T)XjyFeu5zEy82R~p{Bx95|U ziLdZcjpu7JQeJC+MmA(#IwLt?R$-6c$H!0RA*N}2fh;jaKKtn@Vqc5TOmWkxU1}=F zjGPN4OOIXDS8NjswQ&|#Oi1&Qqzn=;#jEl}<>7=_bc#I`$52EN@BcyCj|F|3b^evU z$sSKuEQL#Ii)pejD|+*_H?(8A`oGqRX9O>27@4oUC^0^r^e3&heb3FvOkukaozc%rAgPMLj<~Um z1PNPdE#G*Ldmngk9~hQ}spoPFsYUP1WvZCA*G|@03JnXrG&=@rMWp4biWQ6G33Jmq zPb#2?&OrNDIbqD0Yv2l{Sp*1U+*(;WkS~R)Pxz~-?gbJT{63=hgfb3y{?xX!wFZYN z?0YX)S$SJ?+>n?*MRkUjvq)Fo_-J)!{}Im_AMq=UeCf`itfJvkDtABcq`Q`$YK~TQ z3T0k0QLZ);FFS^(zjc?SdX@mPRXJH@U(Dr{=KG6lhUWf5Fpq$0F3JfR1a` zX@N&7(2P%XBJXVXDAJ|xEpD*#hxw>ZYl+r~^HDAPYfLSJYI7{c1rq7m{m-3PetasN zo&|Z!d%pRLJ08a=$F3(9t-QX^oJ~cwgITIw=&;$FF8tJPGk#A~UvW246l~)g^%UEr zSsp}v#$~)&a;3u?z4>E7Ls=}1A)&=_A!nA|jH_+>dM$Cv*%`%QRG`Be`C^SFE`mR;NlSy40#ZPL(jKJzMSJ|gnx*B%4r2yj>iAr`U(Sz3 zoP8G!i{@k+R2@5|NXy!hC=yS7D;LPU)7-lcy{W4U*IN+eL_uJ@6-Zn0%cUa>K%0{o ze^96W(iR@8vMN6ldvg{A>)%ZIE1>!~o;&0}G84^}lUVbLFP7YD7(ol!)RRjCI$7}&tNz>}O?njh}NkADRo_N{^Ssci9-Q?h`ek@yoc3K3)r^r-{iXZlr z9cxb1!C#WX*C#U$*!bq&qj;Qq#~ejK4e_RdTDCGI!W`8OXXL_~L}Ses#ydBmm^(4G zPBu=p1+wOZ=uHoo1bk(U_&}J&1kt!2m~+G{<);Z9w$ZTH@snx?=`av&uJZ6)he1^! znjq;bmg#9D&x0wi)2533JUsIDi#?voM3<@UH!_c8*9d*@hf!1fVSVJ;^a>k_AKcJ! zo@;D)D~ybhB2!)FFoaZ$0c;S~@|VC*i}T&!(X~Rxm|NB)DJdF@jlZ)#m;X zb8VYH2lQqVOM0U77s=iY?A*I7iu*sBc} zNHhE6O{FxPbo>USRzK`7TmqqYfHK$88zxW$B2Su+ZPA=eF{qN|5B_PaQk9P!v3wMp z7MZ8b%gy*8C9`1$*OEj*39uPTj5hY0JuTxZ}7Cu_=+Q#z#ode6(0wM|do?zAkuf z1UZvMsFQ?IP(1)CXyV$LCb_JZ0jj>{=L5_*+?XGZ-iTLGeC{SNO(-R}nCDDgSsaku zc!hT__Kqy}Xb7eo`H*e)mE!$G?t(UOPAeyz2Qa;uzp;`(8OgeK8o1Gojn`WvNX6de z#UNJSIL$-t$KaW6`UU2GbGwR*t`EThBlZWTH#cRrJ9$y9-5S1(6#^R(M6n$$u}J3C zqgRdaFyn}N`K`yXdqrE|ri~Oi>5Ju;VLh@-E|%goasroTq$lsqXo}mC*+d=ti3~^n$d#S|XiMOd&@sU>NQTUYO7YK44M-v^(dmFOM|D z>xA06O;0-S!@2dJzt#B5QUO^ksF=G&2OX&% zWTzE~O~hR1@uFj|z1M1^W9+-;5`xKfrU_f@RnxCn7|9Oe| z3|9uL$&O;DtEgF^})WK)nTHBbi;B7qy>#nr>@PX=WES6$H;1?>zDe*H6{UA9Mt^G z8|rg$N?mi%T85I|)-e`Zi7#X3nN~VizTrOUiTg+5`-)uCR+xAlGV&Ke7 zbab_k(0R+`u1U!8d_5pZrpaY-n*7|r{{Bs^1X^B(VC$Un8khML$ip`}X!ULs!kmo- zGMa{oCRH1eyc-x2&D`VmJFTGYXba~jpZo$pI#J-$7=3$tb#6L{SHBKF*KS$LT!?mS zIKD3(#eSYJ^o4HzM&uQDm;`~OZL903n)+S;(E_E3uH3@Bm2r)U%kiM6u=;JcGf zczDGBDAa9RUCiY4>{+Ff_4GdR+1*xF=v#(lV=r=0aEf>jyWZK~?44`T`{g2v+MiZh zGQ3(`C2t&IU^sA$+K?rm?)-_G?!vS#hY@6FM|GDWE9$7FZ$7l>nk+==5E^j2+PSlK z{chKy#7^7=>jO9`(MATIyIIh&YaC8p_bE#up77baiHS zWDgLryX7>_)fw_S)7N|cqomvvP)ap=dD9KGN!>ogBNQO=4?+iPZ>e96LvL!D^NUh2 zlCygDs^wFxo_4DvIvc_6M!-XCdmw|C&LN>XETBoV)Y(MDR*p(vZi)8-6jyDytY8^i0X=)munNhI@&sNf?rV}=2 zbZ?)f*QO{tpu1uB?W8eTt}<0&c|q* z778ONDy5fj4VV@^BI07Cfbv>YQ$uu!_*-*)T-P`=P>tO zNeN(QY?4R~&=;gWu5pj$TZ?}Bt*cDM6H1ovnmmfS(q^WeIo9b%5@6+9qE9^I@dx+9fSg< z(k-_RrU}*u&d5p0bBuQ{F4=$DwmXW==a470%XsF17d2bw&D=wbk-0A8hZ&z|zU+xe zIINMLTqxOm_~9e81JgKj8_0I)i;)k7{O+<8EiAM!W*oEp(j+8pr+j+zVJ)j$fg**G z+RjBXu-AGKy$lv0Ss5)o5M92qkR+rz|LyZbEC8@1{}G-?s_1zyQ1^u$?tYfT~mJy*S?XG0xlX`JLQ{5EG?F>8eZ|7zlSXLx%PW9)ByDVxjNpLUWU&Zav0H zD@G6t*QX&V6@5BRE$>*$YQ?^{dBvL2{zefr(9`(@jTL^WwO zFn^V8M1~=shcu_XLJY&UzB~01;v2?apUO@Bp`T-PJp#C!vV-W0)8C@-^F)Ws%2?~p zpcZ}dOpRnsKNsG%^=?X6!PNGFjkWF#lF_8bmu4MTW+?5fiAb!IMXKY3K*q|nEp;@x z#QP*vFK?L;NgpZlrY^nnK0RkLv0@FXt8FHURn-p{I}$v6pU`~+LcyJHEC*|$qA_Ns zotUAB>8XNrC316TA54EA{jK?+9OtvSj#emhf}zs7>Z>s~7U^EO|VU&s+QCjhU0q3UI4I z>AtfmQrhp{co{H}+{;_)Z{a1@X?&oK9>6 zSbk>a)i1aU;LlIi2jS>nhmxB^gv|S(dLGblq>zko4j&0?ew_ZizZQ2PVGcz(9*KF& z>?B#b0Y%f(t3IIkiZxK;zR+wti>qZv7?JGsBDv_-jGLC!pCC09r;?9M3rFMTg`{wl zxKxqk=7}!HiLffJB@j}A@nt6aZ@>4%#fI;*?yr|{#?^s)t5 zNP=BtNtgQe>$0F7^g(LiRY0d%IU%hp*U=NwC!l|ZUh;7W0+9V?1PX=^f=nOcP}~oq z%{1N1P3d(9vDWC-{kR?SS8$Y--a@Vu5-X!G@O=vvI_u|FhZJ39G2Lr7C*EJq<7(rf zZ!J#MWy2UKSZ8BV&>Y16}IgI2TX=*_2tmQ#FKi`)V*F+;w25&1J_z`-_hLwZl0 zfchm_ztrQnpV&DrtP}Q2I`xt6tM{!ivTAe-6bOMEVR}8W5iSfO_lFOMyRI*#UeN_* zT}XXFeynitYh)pvj?;lGy9pLmP0M0zRvS8(ICGPYSfRBQb2_A9FKbJf#*Eu}J%923 z-S1zX_4IhMQe*Rwd>2lq*xn}UvDj;eLIz9E9B4VjD z+rNcA-ZqY4{DJl5=6nw*V?_Hq%nlv^wz`J+5fu7h{L}V*{%Up4vz8YoB04wX6Fvk7 zZ1uns-El(FdWqf8!~i|v#xkZkZmSKx=@Zi@ zVP14-CQ%TOp|F^ZmfRgw?siZM{fgBpbGL=^(BhsAans8j0w|>@5W7^!2 zCM4$JIaVRt*c6fx1MFb$G4fmC=1KIep+AI#O@75y{|;P}6n7GsY-%s|h;}b25RTC8 z_!g{J+a4_!*btxA8+<4YS45^Am33 z4{cuhwBR-iMmp)qJS?$V2lC2T`|`?owqef*AoZO|XfIjP)>e-_q>;Evk_CCF_{OGu z*NvMA=ND{2B3X1aNeWY-K@jIv)e)wLLp=Gb=W-Av=m8f4Z%+ut@hPQ0WTygg89t2S z4mOLcGd0Q_kKlwu;ESndL&tZ@B)>-xFh}fj#mU$OiP6`lY!`in4RK3I>PM{}mh-bRu;8G>-Hwok#RognC4ZdI>$0O@%;Zrul z4QFhC=nx9}hqSjQIc8#|+{p(|Q7fKd# zD(Ek-BW~^I z%%j`0e7p-%K!tObSW1K1QAb+Ei61Ix?;2&Ha^J55e%jO$y!G*B5)?YOY-cARme1I`M+Zp2B*i&8xoF{Ni0TEDBtXubvHB>gb^B{70{xPO7PKv<5w`kxzWsl z@cZMgXalw;)kDtjhv~A~k5-!TUed*Q6$VKcC(ssDPQZsorpFZ1>4@2kwecq;qLYj6 z8+tQh)6Hi`Q)UjQ{t3eM}!8O3Lp zK(LBy>p_^%gJ@D(^**iOU+d#>-3!Ky;64dR0%0mK68jjilF=5RAYVH{(41-eGIXC2 zWq~Y@csmoFb=?GFTKRCY^aOYI=yd)^7?g*zp3UV|c(Jt4dO`I=@WZW9q|<)B`Ab*g z>#xjBbW3(1WP&y^@D4-G0E9rS{qTeoZN9E+&*aU$cyl#<01-`Lbj~D{3+k-BDX)e ziA48*iGF&@0XI+yj5$34y|pzce5V1b{QiYbJ#Vf8WTur(K6GCqcYKCQCP=*%zPl0m z@qt4&`21VC?wHSq!w5~0M6KpjE_0aIr6XzUW$qj_P4`&h=M4Tu`!WI z^&GgR@E@Lg`}&5=7)QPN2h)<#)|5izD_PbNGIHnDFL_iWxgjH%-?9 zHpT)NoJf0T`}H!NJF{)eG15M4kSl*mj+vVdmg86i2_Jc1P2rUxbBXllH5AP}^WY8~{T%U!BB)MTa$6x67 z{l>V@4ZYb_&ex_-kk9et_>l42`>f%3V;L>vhs!RNgNg~)nW~GsnGeIz2ELC%8XPJo zlb>J0&E(Q?kRt^Fw}1xQ@yr2_e6(NURDuB&02eg{tVaF8ZIi2KcW-UkyK00*Mt*}% zdewC@UH<7at3I+r?)Z9SNb3hD1-%MSvN}zE##&kBhD9cFW*C^)uOydFLhZYO-S1Sm z{oAiS=Ch!?2C~J-^h@0p6j=3vPAjVVH57fsvQ^TEZ@s(I*;F)+0*$gW-Ex9gNgiu! z6RtHL8r*jfvY~-FAyrr8f(ubl9@a>4reVior(HJ{+F+&v8)F^h4id~l32@E;89Y^( z=4pd=;QYi~aU*#d_>Ki?COUv26~?jLlaEXLR`xT5YeYym7l7=g@?~S-ExpG{D4@9;ZPNUq z^E64V84cr=o81X`N^bqLVs6oz3@vSk&*Ybdym5FIBg{gVrdEj;8`8lf}i-JN>JPdZab8BTqshV1T z={=%)>li7%ig~`I$D3kjh~?G6OL{F#o+07wC_H;gnBn#qgnAr7r5!X)j-^t(a(p*> znwml@CDz(m+#)f9?Da=(Jaj*L>K1x5vO{jKa684HJOhE^dp12|$aSMXdrnhxh~<+* zKf52^r)RQUZI}0g&y7)!`gne!%FuuG}Jf0p0qNt7i-5m=g;Cq8Q&}ZGyfy!4e=Kfqq zfi43WUo04tx}z-d!_2llx-_%eB)DL%4?L)i@%~obytSM${8c6zM%?5FDubD&;YBc2 z`mj)=`LJh{ulU2n%>LliM@wu!x6A2mS#9GmDJPNeR_c}d_nkUlp*GwV9SbwnJbIZ-U zeH5MFUGa!*#fCes=)PQXi=KBhoA9iWx`#0ONl3*MJ8ai6D5N^DaflSIr-M4g_7N1kE zm_no)&nx-kHN5Qf%WLN8xZmH#=AU7921a!eb_X#g(gV7}@=IQGvdqF(cj8sNb*BNk zsZ$7Zd`-skEc$qp&4eUpb)-I|+4YgWj@W`37^GjRfzSJ`|@`kLMdKO%~GBGf;U; zsWqS4^$9^|1tP&Rqu*ou&|sBdHzf>Ee_lJ_>Ci<;AQJq6`*NtMjciemHk3K~y4<%2 zDnG|lnG6c2+5NS-S`uurLI~Hcz+}78j+wcV>oZ;)AFdKT?oV`yk0LA-r$S_(4HdO` z;yQ!iiyW~Ht6nD@_SEwIeXwI31*{hJ@`BN-(Thw_RQ==g9B_*f8p*xk?ckZZQr#i+ z1yD_jFTTD2b1(L@U#07x6D)%;Z3qZ@TRZZ=gN1!^2C``q0oc{(QJ6$%R5cnLU2NIs zUhm`VJErAnt{qw+>A3|sRr_IN7G&#?LES-y7ODj3+fcXHi16mlIz5Ua#yFKT9?va< z$n@ORTpk&K7O;u#6=(9}Q^UVhf2Gy9cK{}>8{+3tDCLO^Rl;q>K8U&~()7Qq0$U$6 zbaX12B4kzVu&svqDexrf4%WUwO9Kz0K+}C&^I?^xL2nuJh2h$oT(DsXP0Tqw)ZSDKtk>Q zd@%?T%w>eP=ZKZgU;AnO4nz{6%@G@9FUvV|7$RlOunMj%AIk_v8g8> zfwaTO88II6{#FDTooNr(m}*DpJKo)6w6%ktP&11>f`Me1Z8DZA+(*UQ@f4EqJ-|Xv z@aL8YPe{zm>O#Ov>I!rWD-!DvhS%L$*nN6lR{MUVigJPtBo1h=l(JO$9NFmdSJPJK zSoNtE9tch93($yB9U_}BI8M;+bB%m}w!mLU>@I@ed%^VG()Z!7dtN|xNDd_EOMN@; zEA$%>4^*Y`6eF7&NM!;|@dywX3!9;^qT}qHFHfKU(JXXldMBOceg&bPN2yUC=)+68 zD%VyP6y;>;JQIAamuZ6|GM>UbKTycmq@6jhW={D?{~c3dhtQq-XUO}%@?L|4YW?%9 z{sG}MX%Dv_*4E2<5@yMv&w?6ja6#J&c_w%z>6sMM-iU>S;oRI&=0b3U|`bpJyZY+*-CqSdiA~i#J$8Ht7%#m zkGkk5L9*%I1KvZY6eydu9Zl^A-*|q^d}3G`bie@_{GIQ!M?cCv+-7o~(C}_@!gWJ5 zq`lJn!*B$|$~_?w2rbf( zD|~~($v27-61r9V&6E&Yv_Pfp5(U@Gw0E?D`Ir)02gsFLpkO^#Rjbe51(KK8pq~mz zQ5J&u1W(i1WGLXkNgfkuXb za*jkwXmFs#3q(o#vGf41C-}np=LING$+bZC*AvQ;TyfoRy}22{*>hec#)WRP$PCwU z-ZqI2AhWO7^cT)WVhzlPi2K6G09&fr?3sgj z>PE=wr^m2G3lF}2Sn%|ilu|+(LMgl$u?N=6Bx~Jf9E&y3kjf9?0#}xf>~qsk5_MT! zd@pUu3t9~Gw`PAaW31e^W#L=>8P>1(s0(g}slHc|PmN$J)vW~NT>wACPdZ5#S|Eg!~)Q;o8Gx9=G1euqQ=g5-(!SUNJP zK-LIB+>win0~2fCUntgbHIl{hp#C)2MAX0^EPx3Di-9n^7**2!CiPRm1FMU`F(rWL z#rE!XRf~-8P!I2!uHdN|wygg4iqFts?vSDwFZ5EY=gKB(=N62mcZcKs$AkvV{A280 z+#PUgk6j(X2Z=k*S9*MML9d2leGC{;L4qRgvdPIG0CqH(9S4L)g-N=FN(uPT9ScvT zsAY&xcZNe^1R^m6CI%v0U0P7&@X$WtlG zvEN7L7u37nph(hKCb}iTesQt~0fk*35E#8jXjB;=plhVV(ICtcYE^!wwKs7Z!v+go zq7<)8hLLe-I+W3$m8$TU)d!1>#i{s4C?Vi`j1E66hm<~)GP&aB7km9;@p~rnR?NaC z1>2BYGI7uUT0p@QS~Vq_PX7TipK<&X!Q`bzLtycNd8M!mb_gv~Ac$l_P{A@@8s@qF z_*8?x;2XNVH$9JgpO(3U4h%+gt+H9W*$=VnS+kA|5w`gcTz6XU1|l?yT(tMi5Igy) z)#3Vl*NxgYQl1U*rWoRCgJKEcpRWCjA7H3@wsI_exBGW1$7WD4DVo%m)baXG_aw3gq1 zk^ZNZDs0j)535Sd2EhmZ^29Uf#{7OpSR-=}3k$5$C3N7bdLSS~Y6BAQn+YQ&jOLV( zm?gq+UzCOv%%!2=7Mejpuuyfz$ZJ4)<*)n!$hA;Zzi?a`OOM5yTG|hUnCA&oJTM8M zkz74XJWzm*5#c?lnG0k&h%fP^s&H}9#{R0=p?YQFhktrjv`zkD#pLn83}~k^hGIgL z5|o%kmU3pQDFDadl}yn>%aitJ*$h1=H0mWS*GkbutCAqyE61IAg5)*QmFpO<5+ZDE zu!xXJ2%f}WJQKM#G+DJx^V#s`chttibenEs?tJ;BwoD?5Zgo-2qR!Jk5bnsGgAUG6 z00G%Eizc}=yNNFKmF1B{8sKtPO^ie58x;EX0$~iy$JiqyQwSME2S*$Yvq-9fy(98l zh7|*}QUee@tT4iy7S!s)%+74gc&q9-&tbyL@u{Hx2t-OGLN@x|0<7)3ai6#}p7lp6 z(1;JczFZ4vBvmy9ask@GE_Bd$7JfDQ^7I&~;44Iqv!ktiC=Pl$hoUU3pDwK`%&x2T z+hh&Q7m^4McTu6ksK@gS3QD?#9+<8W7xCu!KfOTV@r>RA6n3sPuy=xn5@g{T;tvScU`zl13EAErHzPCSF#Cd()%-u_FMcxc`NOc?oE^`>0+CS?XcwIv}otVnqy!Qs?&jS`U`IdArb} z@5dR+EM{+Ej{rlxsy|SWO;+;NJc6H;1-x{BL@)oP$^ZV}0j>WvR^-3hB_CtGKj`p0KFT9;RD#vPAZWd# z*H}ivru|-a?Lcfkb(or_I2U}G+dO1HYpHY7C;D}pLK34@^NRLoYzPZR(ZZ!tc>t3b zc}^qXSkJOyw@HEb({%i2To8=K@=XF<`tt4i zM6~J5((|4Z&}V9Mpyds!#&}$nB6cdV7;D=2)0e$**oDTt|J&UDfB2G^=T)GlI(qIz zhfTeF+>uKI)nSF0*!=yfSA3_S`?&{UGpa~wKWgZA0viVNLolOsXui{~yOw0qoGO5; zRsHun2Paetqj^cCERK&7^VdbVjD>LP5N3Yf&B_GGKQ-#ZKULKC;%aF(YnZ=AP;LuT z=A9LvYfwgkCe;{51wj*GQP`f^0l=OrRgZe%0dlxLLDPudJc~K33II%9EN( zzvPJwaleSoASTWU85_gj%}0eb*{CVjR=PJNNLx$PRItBR`0$Q4pxV0@D#Xhbr)sok zutg5?0=CdsTK^o&v0Aj~dPb}6fvkdnn2oStAR*GmTuk*(*xNX}}0IFY&jML~fMB$^MS+d|2>sGlORS7;h+o;db*EoG30tkrH8&6I zG8TS=VzcTR*c^iYzPWWDTD;Mln+fNklt=-68M+&53p7x*#Vg$kHMbwEebWQt*FU;Y zU!sk33VMDp4a$AMm`VlxEd>61P4Cs?nuPcatFMvvo8>L_L$4+J1mw{-7E2{R>b`~6 zh@`nDjaUu#;{8JNlv^jJTpAa82rW_5hQs#~mK-S$%Ch0;)1?-b)-}g-Ch}GctZ{ZD zOE_b(n(!XhcgobKJve1h=*feQF9cKrP*kt~aL&!Ot@39GVNW&VX zeVL9z;p@G2G&B}R`>U2aY=_b1)~5~7pq#!P$7S5{S|Tn$amN*ftNie^Mmm(+I!mA< zWJ70>acx*Fe_3ZyBc6U=^UY!N?d0qAD!Zr{X7ja6Rmf{tlRJd*P|QlJMlqf0$kf&g z?K_S$D+EGd?1jeLKsILEj$NyX4Wny}Rl)otuIX#NtQ%hfV7hT7y}a@jpE5BGQdcIGeSQ?06rM>lf z*}_|Qy2JXwU;VO|;|}H34HpG+S0}bVr7r;*Z)9^Jjs@C{_bi?SU#W|wE3Ket3!HXb ze&|eROx8!NpC?_iCqF(_0NuHG|Aj-2OY_HUt%t5c;WRXdmpTQ7;5^W?8iW8{ZTg1fJv9Rj2Z(3wF? z*^L~7ZdeNf)KM2YP$#(fTPRoYRzmj$)_|&7I8a3()x3^-0B3BWDBI zea_j5Zb@`{s^m7E)6xlCb*9peZ^G97cccXJmxmLKW!4-P#+jiGdoO5!ohN7V64vdW zZ+=GaHrBvPi>vL}^jJ?7`*9}^dD`Ul2b+9k$){3xnkp_thf0HE)n^wq6FoFYc4}9S zXHT#Ie_sskmI>r`zzt}|iMu5@Asf|$b|Ix*x3e9zmIEUrbn_JM<9NRxQ@4cf6JX9E zjd&IQqqHa7lZr8*N>WU>;L)f#5C!WZ8%zmM_H&A8}{V#8feLZ1Q%$JOT1|MzzJ-|-^Mo59II!@(r-M2{ei2ht75);!8{Uh#`baK>Y73+#iH#xgzuT{`R71ddmp#HdDYT4Wf3Qzyb^kcFYjdsK0-DFSe*-nw4vRvnI2AR7?Ujiigjgrf#D+e{ z`x{h;who3DZQX|ao6en|EcXmRQ9(7@olaW_>%E1FKIomxQM5l82pgH*?rXhg>-D9k z+S1|t=y`u@WWPUHi|N_*Je8u}3uI+YW>>+hf!ZG4ADd?R@wBn%YbNqHT;f%{bjN|Z z4<9|$oTwA8vJ3+@TT?f$`%<%U_Tx#mpa4v&gQY@Dj`^!Ktj)hwWC zZDg+!KlNj`$Qjvfn}k_Of&B7#QLwst3l3euGfxA#)j6VA5_Z`Ya zrO|DxDG_U&K%c`E*A1Q00Q(!_1&nH6-`sj+BjGV_To*z&O2oDoiV~P0GFFq-E%b{M}E2xxNwu8 z$&2mpd+jR#_z!u@!&q&LEn4GVa&ZBbV8{Nn7CrCOUw*s+Qaetl?OsY%0gM&FQY2NL ztB8u88|lop1O5}JW)>`uBt``M7$2i%X3u*zJk|vTcyFFOdT1j#d$;^0_N*Wi0YWZ- zr#Sk8M3KLY{ueRh-`yx_`X7HC`!Sb2gCGm@HB#CWx`AQHvJ&C9$_j4Ktwww3 z^&H=3$NzWbY$`WN^p}_-G(uF8*FprixWepuOMK+`QShg@g-aT^J>6VTj96&fZc2yN zC+*{-{H--3Ud$fZ1^^(bQB}h|PB}J)t?$iliy5!P?#*Pi(R*XZ_x^;XhOs6!CD_2h zYJM!@04tO!UN4cdaf^zs%gPxDwJRl{NC|gALvJ&IkBo-kFSF1G{o`~j)r~vgXqbeO zs%t;PF#_^us9_yO7%413pt{W@F${f{7{T%hTMI?B9koqKjRnY{D04gt7kBiKW_fTY z{GkrAZdZRi+qj3@cze2eyb8m4qok|X1g*o_e+NsEZS$1?&0d(+!Nve)3=zUc+oN{*M{1z0bARnu z$BA4zUm^0JAKm}x7}93N&s=y zUyBdfkS^|fpvDOk07O|haxF%YJ_Yd!9~iKSS%GS(F2OtK{uhT72V+q*&`U`ypIm?r zb%tO2AbptEfj1qvpmlM6xmzI*Fq z5~vm`!I5GVe5V-SSMT=h(B__K z3qp+s3OZvhN1%%;H=j$Z5^7-eQx?0E6~RV z#@=LMw3Sa2MPktMTGjT|ZQBkdVh+ZV2q$e5qD-Grle(aTpv4A-Yh(-KVkKYAwI3VF zsX_%O<}f>WGeLmR@a~7J_>!)<^AnUL<5foLPjweEZdu8jWh%HFgbkwbB%z-k%dr-= zUN{9Xqi6%(uU-S((O5q6=nw!Ew3M5`K8i;gCNuvLue9_W4CB+B~RYL)G;ow>a{I~1ongnXRL58D!O z9A_348{r}XZ8dQ!#&uCLKex1%mH02SyBP01B{X8K9R3b-!$(AH2A|@oyv1EXIvC&h zb3%JN&S;Ht8@3IXUXCE7u;da_E;91|5ODlq|N0|h^l;;TNK9*E|LK2yarP20*F_&@jt{TVws}*8X}k$P|;B@Fdwl zZml}5ALmmen-L;|t<0kK|17Gs#?_yc4-?^sK7A6-tt2?D6pzqtruk$cBC5O;&KhUwqP7-QMqQf9j-)jg2*hEAEEPVT+!QC!4>{#QM(48vuJb<7XG zKhp(Nr)kP@2V;$_g?>Sw6$+dp3$& zv%qdKfZl{2&7kE{N~kNK;9-JM%}EfgLPj|{+I=i%rux3awo>6oTX%xTqjM?!gdSmB z$Z>zj><@;{jYr@;Oa!A~{1v?i1)?nEFMpoDdh|7zRb($d3(Z+_#5(W}jqEVV^w&{D z&PdGeR(8QYjwt+4jABIi4;M+4M&Akp3|skJj!uxfCiwS=|>xu8&-NNC95;ek` zouqAwg*!jNj68v#QQ+P!dLfJ3Ah1!GyU-Ql8{mZ22-@bcb|*|G5UK;mtH9&@jLsyP z^HyaEf>`uvn$~&}aLCY?_pLVd@`XTs=zzn`>3(-(iSv)mlah|c9QOGDkC1I*XzxCP z_7|8oV1D%g!~qO;ZJox3KRhVhA~R?vg$F{FAAROCLGODX^oicmd(2jMVC(hHH$L5F zfi?O7Cm(0dWWmsvSq-B%?ggY~ZAJkU1={>T_iOz3a7@JXE(eUN1KJQlu1`edE_$D? zLeQ&-o|zFU6*h;renh}#ahfBpa}qlK!_g6#MA+XG8lm7(!5TulhKj0s^y0gcuFnX} zoBrF!q=m}&jxBT_&fu{3XB*4U@c!Jh&V#kUH$os0VXmBn!x19bFbMFgV(ZRN7$!;M zxBC7Ct@u0VEl~A>?FUFW_m_qG%Ygj_7p`H?5atenQCwphBv-NP9N#^Al_)mHEW(bJ zg z{}C`qHj4H=K)z}ast=kE`uuepRn)kaZy=MYoREb=N${$qtsvz=IbrW0y3pdtq@Y*I z?={GAH~at_8mikSQONodU*$o=8oo89jeAhRj?=#V`%a|iOgyh%d)Yi9|bP5q_MPi59q~&<08HfcinY#vr+f~ zp#>+j-hy#Lz|{N|pWtM{Ju9>uIb<#}512*B4Wm)~`I=O+yWbZ}^8-NJOU--F54vr{wCfIfG8N zK+S`Y+yC);j3lYjf3fMvUI5{d+yE$ufg+zL3?)<|%vY@R6+8`8*kCZNu$0v`R3arB zX5vGgrpw?yRya4|&I3XQW;1($DW(0m9bT>awj50EGP&cF(G}9b*|7|jNC?=$UkU$LZz1E2wDHHVYgZ^sl@nbea zb!-@3lhyzm4s<){!TAWQ3LMd@;UeABPT(Ccv=6tDOr9~~QUlRqz+lJZP;5ku_UQnp zJoKo_=F1qn((k)juI6IX{P1G2J2Kch5qO;mA$@Vj`D?`I63)v}O|u$KQ^m>&QFaqu zKXIB11B!Q1%%hYLWhL1?GzBG0)iR8|cWcX!#rACf)@j!*PLlPYVpJVHC7MfK|19M} zDU-XuA31GE@JF+3e)htOF%bV{Ji$bA!on1G0B< zg7;w(5v^2e{<9qpQL5p8J2~i~AU;PX@7Zx_6vJIuIrPIun*FqqntR>;y$$+D;n=pE zVp@$T)%Gl8OOz0BUu)eQah`6lfTOtezWx6v7K|!?_oQKjGc6SCAsTRpl5&Q0qGTXNWpFUR_AQp{n*dDx7s@hEub)au{!1F`d)T%v$YR* zodP{G3qRqe5Q_D8Zbk4HY|&rl0r-P)LYl2xW2K_QNup2v*aJ@kw-z4lR$9m`IMT9IaaBG*cD$W6#YI(O&~? z97%Q^g`q#AaAy;=y+(-X)F1*e>^=!2`2c2rY`?YP$v!ouY~3RDe5fedFLc^@yJ+rO zM$tTFh*_5LSMz26o9hI2zrYPU6p(YEzP5KCS(F3oY!`5Fe z8KISfr1X!#H)j(O>|b7(V1298(yzQP4~6XKEOxe>a46#Ahz!Gt#c|KXdkU+N2_ z0m+P9rNx!(?ltcB`RmI=dvF)lf7)G*?OD=(0p_+YBO2WY*SBz%I=UBo;Aq@57XP&3 z3B)v6;&T}4+3NAY4Qn8Chftb45dA3eJc7#P6J}9?xgY! z0>lQvBD~$&iPsZFoR<6>%=Q4IC)C=ZOC2MX_VobjH1}|E$C$1s*}cA^a1Q5vm}-xc zrW@=A-)$-mm(*Eov-sDJosjYKcv`Xj%j228dlJ)#X+$B49p-;icK>*{aKyJ(i({L` z6(|_2uMS9h0+k13mvtN7-GC_)Y~*FfF3LTQqsh`Rm9#wC>___d-L9cdeZ)7}d#{hz&6i(-^uc$LchB z5u><*$iVlS8H$dmkUO{xdUGOwJ7F?7&12Q}Yt8xVDwQ!l!2jkjKYA2BWb#`bZ^+i8 zJ-HjOW%P07rZ-Za7Oi&!-Q@*4&oiHart20Mw}RPc-)pVgDLD5dK$rhWJJ%ulIPOC3 zfh_~{%O{-&!*Q_~o6I)*ne#*SnAy}7Is_K0?edgY(`6`$cAfW| zu@`C>{vc+LNkuW+8&>4I8aOh)KbI?bFc22#5dGR794-ejRcUb{e}ma9YbfTo6J`fl zvnLBEkm-6S_!D02{=_>f4oOhwh0Z|VYZ1_YLe0%r0Kq$h}accN};az#W z-%YL1fuQR)&jb$+YQr3Dmi?2v81Lu_2TDimtF5WVN+d zG7!%8K3XQv3gMeWRO{kYulJ`c%?Jr+C5}g69!at=3)ny~#=`aI<%x`dKPP~d0cQ4l zBK;)T4fY{x_#w!04RG8&v@AV9`;ivDc_Q70k#$-0SJOT-pKn?P3JILfOj4Z`+!?>F z4y)y}7m$H$firvb<4_9TtEMqL1@E{p&Pk20O$$p`F*1&le5Xb@anjg3HOiBJ`Ukr-TpNd^s0Pi8~zD7#!0Dfpk)>Gs{KUua_(?^LIJ2w_`ba9(uMri ztzXjo$;~Be&LKs2qadmN*11mRl>10xex8vu$NQv98EAtS0(YA4O|_1~rLpvG1##T% zD^(kkAqeS8h$XzH+O6wT>8mVlu?9UU&RD9RhM23>UQP`a^VQ$i6-Vmo8+ra*+ z%W-=@Lf8%abU(Rm>-lor?^^EjMKKua!CLr|OIb9Wsu6nDwAK~gT;%U>5r`>2`p&X{ z7~q$A8v=E#KxpK^ChpKsO&OeVV#YW&EWm-y(zO@PT-SH3bC?anH3I3pZo#7l_8}Al z5d1+6pa%%WVEm4EC0&W~5irtXIc*SQW!}Oc@zLlj{Z;X2NV4R6U9206rOK4z6_AQ5 zK35LyZz4(`(Mya`UGe&Cv#MThIQaoG7JpE1pPt_cd!E61F*76I%mgeWvNTwhP!EcVLD2$(}-Qw~u8& zNeZ($7ITeibbQ7e$X-WD2b&^W7}w~6B|i#T*OQ9ZOCW{06|*hbJbUu$P?cY>b@p@3D`RefUCjb7>K&V6q;=A^;I)6XLm-FZHF|ps4Dus zoImUW-DQAkeP0#!!*pF#<5nfLv#0MSC#?}D!j96=N5!j= z#sDEsQma8ow067q#d(-r>O%h6=6ix9!IQeUhR(1@L4GwW=G!uGuRsmk+xBpTe)d=z zM?kvoXQ&VBjJkH*0S5)>YS=$~1gKAPuaE9OW>q0yv5r9@{S<14OfMN&J$`%3z zowt(wma0=Q!}i;4nBgr%$EH@V~1-XS{vHGv`M*>ZKD+FtvOdtIue^Ng9FjS{4 z&}Tf6SEO6nXE#(Az4%}^H4{B_q}C!+I@|ifyW$@JpFm*0rG4SOd0$}LMPBh?cQMa( zT%bk{mj)7--fMrL2h-j413~Wib`rQz{lw>QK~Epd>8i{QAX8k6eyTRbuqLU5!Q>Ht zvu4U3scpF7u&pW&kOUiD_?b}{-}a+E7ve$V)*DW;%x^!WAoQlCdmcnj{8G;w)xNeE zeBp|aEJRO!&^Ex$HqG>BV_2{GFTlw(4}?;^eCQNRuC!1a+_z`fLi-pXDWio~k1 zXlsYEY%SzFDk?@CyouuX-8Ui)oLn=Yg&7Dp!70oBh-lh$(Dnebjm6Fhmp});3D=DU z*Fxxx{Sn@bB_L}A`OK7R5so>7&NH#02SKaz=f6W{A;ZpGvmjHcCS1JGE`Oyn33^G6 zbD5^K8tC@;usNE$aOPyIC|A=Nuk?1*rID{k{j+V6{*u`I` zK2qB6uM{^r`8=StsB#XPXpxnR>PiI_VqKU*SNjMh!XE({mSMpP5e9~#mRE$nKb0y# zK$s3joo!NE(Kg3$ERa$@0?`3xQ;Zz==Z_Cz5%MwEESL9)8B_+@+_AFM`GzcTtPvP> zsMDWrBMx=tI%0$Tt8}>6+E19CF3{5c-Bbzgut#2nW@AQj*~}b zQ1(D6UQuExYL8R){SjKId#WNRU7PQ^@s{S(Bc?14Ob)Vxsg=`1dvK=3 zl$+NzIyDhtea*JV{QUaY?80|)yQ5ifrZQWd17ml{COk2!E_!AL9T`&`j-lwwHgP2m z#m!@J+rVkLGHJ5s8(+brSQdHd>DmXmRZ@OZihIKX)Fqg=8M%I_!MzjU!(Ne5&ziMw z8TYDBiKK%a{r#cWXffQxHuI52x<8i`hZFvvtm%LF{;Z~l_zDX=AJ*(S6z*`IxlC$c zPJl+7TAa-WZ?I(Z%j-2^HJp)Xi6$<-3f}u`?i|-@-d6YguZz+X)RElGFR>$=as_Up z!ToV!ZV-Oy@iDlM3;h4dcKrXRKDc>&uM3v=GBaYiS=^^54Ego4asIK@>0%N1@BirB zp31DxeW9JVzdsg5u#lIE+g&>kJA=yTZ@Eq38|gUH(jbaj+b5a0n<4+<0^k3x=fujm zJ8-qX{w-_y?9hF=+~wI`Rlyk8gdtEgimHq3NmaAcIq}nKUAW@-EP}-92Yu67Tdhz z{3GbM@4#K-`G4Az{-1Sew@>~LeeAJQf9pE<@;ED6J5Fo(SynVloW`(!+s@Z*mAGAQ z>a**@rFZDouk^C!iayD*xxN`cUZ+9dd)E78-n<^6@07>pJv7k#r(Kc%g%3W)%6xCk zpicATDBsCBTwC+s@Yiprh65a;%;MAtf$*C&`ct&+%)dcnL6`r{5^t_8_S-XT!4ZHs zSo^=_e*dq1a1i1g#@AZT|HB<4_#b#2%G<9E{v{eh&dBfRrwdgU>Bl!MjHydF3$K8t zLwkEqnOaHI@dqup{l|MInQ1AU9cvQI;xzugwA(hp;IBIjwPz+q3%ZTIq(nT@>0VaF zHso0@1KbY&!cJdw;zL;Z&Wz|BZ!+C@7;%j#CT_VDJRFb}ZHrw9dt-EN1il^gxYvKY zdWo$=?ztWG?~ab!Mrp@&t_I1dZ=hR4X7Jire<|VETuo5ODa?Q(7;qF@FuqTOW9Y}Y zHqmCK+cR^;tHjl!{m4eWGe`E4;L&IHPK_Wa8Bj-b9Tt#8-y35)qhCpME$I-8YZp_u z&0jxiy{#>L^K!U`6BXk-K0Vn2uh(C2X4ByK6#io`>~ASr0;i%MJtKGS*x2NE4*j}k zV)v3{7c3U3z1{P22UN0;4!cgiK*sSDw~lhB!PU+t$$@> zysb)AY@NGmeLTcgWESU$<|vLin-a_s=|kNuJ8=d+))3dfMtVBwGka%Yk0>YY@_e}96ZGKBRal&pkUT57Sk_Qpe<(09 z&XzCAY$PJ9$}g)bunksx^bqE5w1&=HmRn(4DTq&*5 zG0W_Ox!;3nZG?nL7@mT0Z08@$1E$+=Z!-R|LE@W0N*#Rb9iuAK*X%>j``bNWGi*>+ zq$>2F;+Ws(%jaI|!$_y?veY;EPsKMKm!-SQ?3-77jYq5SSJmu6|Ep6Z*(-i5VfbS} z27xi9fo`)%T~kiEN?H54=S>^c4R(pR6iUfJ9px43evO8=ET6QpMCVwO)Z<}b&SYa=ueYF!X& zU42x4uTUDWaTv?HY$!u`8rlG9f>`SM;jqXJ50(YA{G!TQBy57l229x&(nsi*(Y7^8FXHWllkpXTeK>~^-8?zAZ z2AhI(iT>>E3z!Oa;t7eGgv2}sOvPq2xs*1-dh+vbPbhskZ=J&H^4o7?<4_6TQ)(pS zhyjpR#j|N;+sYH41KTl-4(g7Pnz;=&RK0$mgajdsnomv^(!@q?y#Uf4x4jr^_;b)e ziEFHbEseGoG*a@xmFvEm0A$q%a%Urc!$5Bg^rV`=R`rpn?$!>Y~M z-GSg*(rlfa=kGgq)5=}88}ATyp8pQTM_~A{Ks(d}IC>!=st_jP4*F|A8Uv$~@AH<2 zhf=nNT?q$&y03!&J0abs>W>M*G2919^*5Vk>YEVDl>>S&$0XwClVd z*F1{05hb)P4U=a5Tvw07j6(6_mF$T;Mi{Mw0!d;^dd( zeo@+GFuaMZ+Y1MxD3n8C!qkCHd8LcRdG@Qt2r=CQ#&MuB0GaeX(EWW2torguA}jFb zyj5IL%6_4oZK_5G6(X1rT7;IJS?KV@NJx=6$R4cWPF`PMES2;)6>k3SEq7kXE13_s zC3u*;!iTOkn9jwut4E$pFjrmgzmz%@Ynz}rw*4&MFQ00EjhT(Hwy6 z-5j9}Og)-?sjRRU2*i;i0eX0-w617s@7rJTCYZ0L-KT0kM{2P}EB3B^`1*@RWuN@a{ie%tox?Y>ah3ZVaXU6g(a(6> zF{aIXSeuaV!IwJ+Z^Iv+xcK-@D@Y$f!v^`5(;@q6;Q`Jzc`|2t++*|UfZax4)AQHH z%C@K4?;b)|5vqDIaGG0q7Qg~jWry~Vu8gI9_-c|Kd_NiVM^#gR@4HzIpm7$F4su4dgSS6-YJ3e!%|0pR~XZ71ub5Ae!0K>J7?oF>3rSF;?ga8|ttp zeAhK>YinG=@Zl~YIqzNj!TTDb4R;JW^d4D^;!gkibK>UL1dpCKx(gyH*mz| zeEyZdb>6$;yehj6LC{N3=-Nb$4lyE5hNQEbG@qrEKAfhR+b}j-r^>Hc(V(|>1N}wQ zI~jcy6icBPY&hwc^XLDJ;}ShuoVz>L<`T1^AhcNSi#)fE;g`OT^mf(ft&B5b@b<*vm4uQt<=)EDjC?uGyqFHG{Rf)d=I~xU9nkdV z@W$RZKddWz@?NFI*fyG( zw8e9`$#&G7;T}`ruKopdo;50;JdyiWlB>kQGYm(I&QbsJK$x92Ojdi@ruKL+dVthU zoZ7*_0%(0l(4?u3uSQInleOuDOXpB*M7YB-=nL+FdF)|%Eq>RScWsFe=k2xPH10Dt zYIIgVX(EWbOw?!39w#J=ziU^IHA|3_ug)T@S8+v(t~HFmS4L5&l&O~GHq#iZS8Z`s z><)u(Jn=a_V$GV?(M{jUkMH(5vq9&9H;xN``}dt*Ym4R12%CZcFn8P3_ta^}C#RB# zkL|7?!*YI3mh67{fgA0_6+g$4m);d~B@@Ke@4`S;gb~|1u)!$If%32G4IkP}t48C! z(+-*+Jl!0t7%@4bvyoLC68+U_rb=zqha>O;*5SqRNJUMHpCrp3Sm$$}C9sZocp=ak zXnGQ(tZ4h6a7JoWMZ}?J#y@~(ZjTBd4oG`L3!yolY_5O>+1@yMhMPGp+Q|GXn-9w= z21wE>3ZTcUY6y`~&XN=9>SSKvJF{UV^2&#gy%_=gx1D!n9pg$w=}P@rBOKT)A17N` zKK@ef91XS9hTslR2B6il`P#r?xm}C#$CKFWU+9QPT|M6Qwd*^A7$#FKM-4-7a4s=- z<9y^iOTU3C5|2TC(b31mv2KPy=0wVDm&u2$sTl`eYl`I!ggbiptKx@7{4xfVUz8_} zAU}6nBKQeCubx-RRgS=VB4r)BRMwfe`I?(!%@>I|9~y{RTxvY`+iBb0dT>POBhP)+ z@4R=7`nvE`WLy{7XZO^c#(InRLWim`8h&Cyy*uz0-z&1`TODbvTA88%PC%5T6XtO5^Mtd)w z4#%l^7{rEJ$u1&1temK>IXsWz4dbaBdAo1l-A~(n^G~|%{_KWoC8FgVf$c=GB_FxV zB`?0mJwBB&6_qli|LSglj9+c|kA**aWP!!U@$v>}%dM}WaOyB$?#9}LD_uq1cxt^u z@slYl(9k6Cd()LF9|~O0LU=82{d9ysi&SyOs9NUqh4)shjo9#TMJc(moIcCnn{J{$ zvQ1JM49_%Xc$CB&Ou2$zF@&p3$$!n*(9X1%*l&^~<0O^3N;Q%ZsQdnv@eOaEi^xdh zUuejum3E8mQsWi!Zhi(l+|V=cwg2oo%f?K^#^H+a(qAV)0?_gv!Juz~*QoZjUi(}7 zb$au6D-*688mrX$7mhxxrmyV#$5^};4u1;gvFnK9_wsHVU%ZCHxm`D>tV4|I8#o@@4M8^-Ch`I^`}JRqy;l-dxh-4Um_7ZEVKiY_10BZ$6qhI^+=+`0 z2quqKp9CdLq4A8~ymg?1uRET4ij-ih!IwR(cSU@8FjAT557LC1PE*Cm4lS6n)A3Al zJWM*OBHU{!dlCOW_LiMId8fk*`}#{u#m=FfERwDcH&+bf=SN6}~}F|9ZM|tXaFZ8Gmb&>kNoU z!iWvA>w@MGG=D<3%rME!V1vbSqNTj=VMVbiKf9~ooC3B=f^!>=xK=N_uf=S7<%Y#Y zqRV9M<9+4bfBMo*S-RF6=MJp`>lkNp(ZM)15N@?V=h2fZt>tYHv-*QmcTBSGkEm8! zv8x?@TP*0%J6dk#pTZMa&SpTiR*u-*YVXlj>;C0Wx^GidzoW><^rLfBFJ+(=G+Pt= zi=1ObZ3dq@@Won{^uGKfmDGgi0J5;TOTf!zX=r(WF7dejZCY0E<`;c1?DpG<(BPwMjzuF4K$b8k3oWR6C4Ez+tgN6gF|_a3k!NjT z4+wO>>L9>=dnzi`ssD!9?;JXWlM>o2c+-z%CyQk?#U%JGPu}eiJTczc;fEhhnm-hOm=JGF5=eT*YL_})nVgB*z`f=dF<9j+T|#a?Wd32!iZLW|Ekiw}O1CsVmv z7RQ}=^(w!VE4`zRJm8yhrT0mB#@j{&18-J#0HM7%<9VyMwuU}!JHG@XZ*nV#k=Ns9 z->ElKkK$!I79v+KJK)71{(3=Txl}1hvkFN49#(v=CMhQUc9vw z_Q#Y7+3K7;yHsjZK$nlfebs}c%VTxHt?G33CNMk#?1j0{%bmj_?LUi(5+RCbu9qh( zsZaeO!tKu(SWP%6l?rr5vqSZ#n2og+1iL1$o8ea!suX@8MFHh><$;ae%1zLMF>=5mrfD+705bERee4tOqVnEp;rX&h^bAO$Q)@*7Pw2Yj z$rHbh7v9WMBdlr__vOBwZhhGpB%?mI2?`vv;@S;1k66jI1djyc3a)g@?&YR*rNrpP zm?4n9K_GyTYzZGr6KJrOPiyXWnjQSw6QA&b-N2*dNI1xaB^qYtqnLCkMV4&)E1w?T z)vw%HjU!Q-@o`(2B|1lvaE|0Fq@k0s*fo;gs94==s%QepP^G1k2c*R;eGF#xBs`2Q zWjZsy%W0lGIsW(~45LfSkw;@PPAHf_!m)wfc;8nK%A0v^ zC&>YRj3-(hO;{9H8{dYuK^DS?dFy{x;1uQhtg;F{X=ottGfbkaDR1Y=U$sh(AS`Kh z%5i7j@xGfM6TRilW|24JifcbJv+=Oa7E}F^gBIKy-h7w1>QqsT9}~>q%Hlc$Swmof z;0{ReX?6iNf0gvHpaA>vTOVM4v3N8FI}SnODE|Bu+$H8~embx_nK>~02_I|kbCP^; zKxQNZNS1Hg^@@4r^KgjANcVCUpIB&MJK(`?MgwKgR zuog^)1}C$+8L*rXpCeC^Tl`#%`1sVPKJ)80t6QShu!y7e2A%1#t{Yn1E|OCdn%sHD z`wKtB_z6*1;n@u(N?r{otA<=VbJd%~8Ysl0cC=hxj^r9c$fqU@-H$fYP)eV>k$!C) z(wf8omuEqR1DM>BUCkpY6wFmw@*dQ&Iy*mX;J0#vVu=-c%zu z_pVbt(sr8x&9<}WlVY-$$Vwz=`~2!lc6kV6yUIL=PdUg}v=#}*$J+juhU^0^--!?j zXhxpBDrcDpS_|jqf=RYkV%<(N@@cCTJ7~oA!^jW{ib74*KUmRxvg|E6lHwI}V*Sa~ z2|@10`q?Q+he#Wn6V%4i3~U=NYuv)dNYz)v4OQ+g&LJESU98p7w=s^eXuDp2HME%G z+4vZu{%%h(?<^;me5FQsAhf~cOf}hWVivqn>5oUMG?T=(j8Ic{UiLsKFn z@0BZ~m{42^^Yq?FCn5RcSIyFybzhG795nezL1CLAMT#d_Ns|<>w;4H=VEY<4#^gmx znWB62@GDN|$10jnaEFMp_3?!T-{d~jbfP+kb77@>Bd_?J-xSriZ98^Fb$!>%XiiW| zY~aXT9!^j;v6Awn4!gHESVdKxjb!xKQ~z0^p;GPeMDSNgn8yiP>&XZ5u+j$V-8;D8 z&)#jq??r05)9~&_oXWZ5EAOr}uD^<36L}Zi?4M;S)7d25+5g(A&u6iJxH4<>V}+NB zM9lXmeAPj3nu+*3vey%!R|xdG)1Y@q=e-%T^^>ugZ~9;2ON?@7j}5~|n(vy49u#e{f3s(kC2d zH;je`3NlWkAow=y52V$X>D7i%aII!pdMA^5K){83YuUf zO(Sh-ih&-MR!wU4!ad+mvfA8a~HP++fT6?7T3HZtX~7CFpQ-Stme?hXJ3~n zFZLH>@6O4E_{yXl=9(s9Zfi~!h(h#KU0=Aa&qVZ;b0l8N9g3ti_Q_I7C&dJqd?ar4 z_i+UL130IM&lepZOAd^le@!kS1L2X_`eJXK+B7ousaXyxkvBFMM#Sl8ciFCw3+pQr zbQKvd8O7`^rVOlK^!kc&Bh<=;5Tz6`Bk<}Ado|rYtMhc)_C3vxZ%agTdL=x7@b#x><${@dwQ#X$G_cA?z!ns~;=P5^ah>D?PM=NLsiJ{_=57Sne)AwQIl_a$L&jBhB z6kDt^cc~{kJ`uDl66AB79en0{Ed+m0V_3Db3EvrCrk+@aV*S{;l_wk3-aL7?QX?}; z?{`S@uS<}pb9qlZ5xo4;`=V~W&!NUeM<*2T0UIo58inye*An{=higvtR?!2t!jH}| zFk2QKAevd9PeF@EY(_}P=jf+T&EA%VxIYUNjcQ;-*XyfK&P$_(-`Hc=%oA0u7Pr}kFfaWYF|&lRy)!mp?zqoIe(pW>!Ln^)fM@+I>Q>5DfutueFwVj zdws|TUMV#a*)7?r)AHT2mapc^89xDOjb7$F>*}}NSOQmCt|F_nE%*Q-c@4|3D4``j znoyRu8iKZK7dn?aQWmX8(Pf~(5X^bOn_QzTKQ-{g@pFK8A_<+h4;cnNiJ!}HL?ZHH zqR6^rfFWt-9ktAbc{trdDe3vyZQI-nB^YZdJ52pZ$j4y@wqoNC8{4#RDDUfyk=}BTQ^-9wnu<4>=6ab=R!eTI#tCL- z_(&~W^37_bVYg^jrh3+ecdy&w+vq0 z^}2hE2j+GVV5jSra~ik*qYHVEr1j+yIyno8=`Y8Np9|E_lw= z_*SO$?HA>OmineluB%g!-@D1FbMjoCx|mVzYXGFrWZ?h@JG?7PTMj8zAGI9n&Uk4m z7V)_GsW*3)5%2LCWN1S|mp`nEsXcE01@?5D;JYig>BbLXUeoYk5(cB8OwrR zKS>sl83bKQnDqHgtX_g7nm?oTp`|HW>?whoxYUY;LYnJa~| z!0evX+-Jw7)83UXPQhHK^qah+=5cH#8dipt(E;?hmP7SymD9c+6LQD$|NHZO{;=|xCv7@aNG)RE}3>#)I zIcoR_vf@C+J9OinWQhjBe=30KsCAr5iKf+^%4pT2*4vEkY`^{5J>&GJFuSg!Y3*j& zWa=yLj`WuJP)IJ7DMEoe#P@G zyj{=v&?QTP*j6`7r*-*^rNiJofkX-)iR~N|!0ncJFkIOTM zvyS|Ycj`-_STGJVpUv8i(KV-!O1d}!wXqTnAz~^3ub;EEmVu#Y0r*QaaYiR`yY^XE z3manGQ@Wna0lqI+hZJ4+9l!GAs<@FxGPfe~EoI{;TzlNQdLqD-ozc` zr-65=2VoES2;uuv;}wtv0y$C6{MBhtg5?Z&=C!hm)Qs-S@`H$F z=xYE_{!&XUe#7>n%i6L#CNzrPe9y*O{stX%N6^+-!Yp^LpI4p^Yo|B>lm;egcj{Xr<0TM&g)c^Jh_Z)S;`#faBOz)YvkgeHO;|5b_|nu`vh$aj5o<)YMEqTE3yHd!(5x|ABRv z_`Twd|i`lQzo*)CsY~0x&V$OmU zL&>R{IU4J3JE-?y?Lp@mTeO;pnNn)3CUnx5@StF{l>t#8Js zZ)SS7Kdn0GpZ-8`;SitO?`7{(>ty3prW0M)5;9(-b%3ZXj5o{A74bOCR0(>Ensq-I z2(!6k6?w%cn0y&;voe-mla{UDTm1PYcimfiziUgE8B8Z2%y}L5Bk;iKDUUnokP3AZND8GntEdEw>o!HHNo-c6NKV&7hA-@g7Ny`;V4 zsCCFu>-GrV=AaN!>{eI!&`aOO@C-*EbS+UkS1I9y_WPWb@$5J?kz->0LHc;joclv{ z(L!aSJ&z7~WuFH9%-O4_6|PrI#GA_J@L75?+nyf(wzj^IuOp_DS;3Q^laZYgOr9z3 zdsAMVt4o$K&1vUdXX?zhQ}nBCf@V3rxDWQ8!w^2$oPPx28gy{Q2|5lZcf6O_kQeO4 zD#Q&Gx^d9~?8Cy^FN;foZhH1=nU7#s3wchpbpqKU%TsFzJg9YC%-^IPAQ!j6q~84K zdgs{@cvk%F94_9j{+b|@O5)Cvj)VGU>rXOEI`FqExp@1xpFb&gL2AdJbSL;eaw=%X zoE-1IF<#@kZVie>-t)i-8TyTXsEMe7^`HPlxbLIM;eR)9TN>4Lv^dinqNYb8p+5`wEl#&J-inW#7A7kRTJpTS->fCbytjv#-o?(n4>)ja zij?FVYw_|5i5WcdIkiUT66S=6(ZL3DOR;R)MaA94!0qMxNG~%cLrle{;fC}Py97bu zsiH&P-p$DAzs(p>SlX!Wb=Q19)4G<+C;Vem3h;IHmj<<025B%p$*g*kxy0Kqz}Mfj z3*I+3j>x-%K1jFkl+Rc0?9n=M5zlgoVBXZ6yVfi^s*k`#A(x5#dK39KE-#(@Mpcby z?J~5pUf~-LDC$)dznGi$PCe~njzTNV;jiIj=B!f@PFCLD2&m27GPaf6(6p{nX;9C! z543tQEovNT|K>=bqRBy?yx@Qo!m^PApPsGjM5RlKM%%-wv?BX<`zM*H=+r#sO`oE- zHl~3W#eG44KW@j1qd)`6KhlwDO>mz?KqXqW?1-A?jnOcrr5g`Es^xW5&fY=>PB|fJ z^?ND)lxnO>%X=! zJcRSpCxZ#eg4D4CpX)&s$$e|!1p0ZEgNil@annmc&5cj>w4X|z$XlUhg>Xy+e{do6 zsECcxFzI~uNHRkW>q5iQe0n~!0*Xw5Hs1eEoGSPcoGaDyu@U8xA{%c0um}+zu`$7~O^b zmd!>~k}U15+rKxkw;~7aoqalXE*W8kn8Y9nf4e%{u{M5E{PA&1rEwtS;39kmHUm5x zXm$_br3~i)*MCXo}hRPqP5~8cc(@$#pW-^{T@Mx zGMY0}{i0KgMJFH1DnUY)dSA^Gn%VhE5eh6;Iyd z_B$;Uoq(++N?WE+MgyTqrG)Ru#|MvoXgjH2^2FHEllz0alGC8k-$jRGQ1HAxY1TEdCn(W*6ApEuu zT>b%i>$oE&nrQKlAHwZ$x1Y8}AEvA5dD%`#AQntl@IcjG(ccPTtPzPuAtQ8onf`pG_wWC^6g zwPnPHd}`!Z{J_S5K1=d28tk)GhGkRnQ3=fORf@V zPqkP6jl2EuR#&9Vs`lH~wQSvfdUKz2(ieM^oGO3hacE1&@aa#W0o7;P&x&YFXgiJBcLy_iEVdgBfSu+eL)%l6H;Gm-5O zMwl`+-$=F#(368~z>zWgx6UX`I5Kt;?HW7Fg&t&DeaJ;~F(GEl%Xj#I zE(OA=De=pRIn%OJ;xD}&_l==t(hYymzgJOw?q;%`Oy7Px=s-vQB-hAwD{({#aBulW ztU{RAnnHlK!w~uHH$~Uw`a5GpF@~~gLyCH zS9rMNL&lrJ8y%kbLF95dyDUk!Fi%^;ST#aYTa&+2n6bE7xg+valS$6XJTPw{KTU(s zI<%nyOR_gGbtpAhzsS&0bQ0?_W-$?LvdJ+?k8A2J)^H+nqCK9nn#v-<#C9a7rv2WG6|Vx zU^95n7YcHYq2}F8@iF z?4SRzsi<3}kC7&2#jfx@FMxnFNrdeM>`FQeN;>8ZEBX8Ts{s|X0}Rr1yV5W%zUGVzi!vbVClsS9OaUsib+fuJN-MsrP>%#uWD^4&Q zP<-yX<>O%cx(tLBU31?n91bLAE_696^BnfW7&e+q`d*Ny`KBDbPQ9BlD+b1%VkLQh z6vNyYRh~v6=aCAL;zabWm%I|O#4ZXE8KKIjcP9Si)OdBqBl*m^W*teVtv)mEfV*DZ z(yO5myBEuhpkST}Lf25Bt% zW5C%Tr)KqO+wQ}pn`QPm z4s~<>xnT>v)2`O!qQ{pzOYfGECywR4Is@P!T;^;kGa{ z{6F&@XVEVKf%Dk!=+{60&dbkx{;VL5_xw42K0d*7g8aPb@6Yk^pXI}y{lDv>|NiT~ zwT-S7`bsNvbDRIs=l*B^{%;@dzsRr0*A=9x_A%^3|4Ait^&d(&+-^4CCJdc+lm!5EjyUw_-F$v^#8J z>^k4&t;cvhTotgs#a#Bf{3j9mzMrF7*Z2QC$bbBtx`D~9vo&HfkGQq6 z9zpvn=C#`L}X?kt8-GoK?nb@fO z)DM=uCGH#_GJXRhTuj7jrb9N!!TsOwnm^K&V zJm^5V+4e+itQyAmt)O+@)S#>+Sl)iiXqIv8eP(|!CT|VwmY}s9Le(dL;=QxRbx~(^ z3m#4Oc(NLtx(}n8ld+O(XWplGIe;Kim4b*Lv#3BPzJ11J`)hHpZ53K}o&H+7Sd$La zB`bLH#VCw5+TY!XEP(Eev*_J`WV;!SV6maei*^Wq*^33uUXrX3me;msYQrW>g)O)2g2+M z&^@zYgVz(e3o+5A6)St)=6~D8zR>OJ+G5x3oN`v6I{m0r5KNl$<8@YV+{*d5@IIxw z+yy6aoILpJ$omup$Yq3SMOQvan0N7Y!CO8s-4+aN?tFtN*sACsBE)Oje7$UJ`dX<- z_mP}2x}6X9Y#60HHq^|<2MsV3jHanKV7$2gd75(6!i!!8T)kI42PLz}d0^ykouy#B zmvj-MnD;6F+5}2%NzejNBe@~Q^~%!n&a;_nQ66CE=41L*d2KE9x4C++*ZeEN+8S>C zhp^39l-VQOiXw0&AN8K)k;IztnW^5=ST-&?#l@1I-$4E`HOkapa@+OuQ}oL%`hM;Y zsYOmhA3kGPZ>V*3nTKAu3PxjyHlyK2VAKA@T`Xeu773l&j{j~K>H3M!fAQeFR|!da zt^3Xu%z|2M0AA-gtCITjmVg$W(tF?a)HV$yyrP*kkxPxdbS<(x^; z(xS`yOoXR-{+a-nF&;=eVTzLK;!)2(O?>TDroKwEhT(}d=>7j@zp=KE5=T#-8U;oG zxr*LTJ816BTU1$B@v9BCr<=o+FTO67-Xgt^rqCR?V0!peV!`J$>5I2U6ag#-u7s7|rjTij!RW{$lizBBi@r=4_o@yG@tm z#3`H+GmYe`1*Bq>Idmu;(H|!7{r}ke53s1RbzKxLb3nmFlGL`1s3Z}Q47RkQAfRN5 zBqFIul5?;XXhgt7PAU=#C{UruL5WHhD3B~5Ip<8>@fFysd+)XP+4uhcxp$p&w$Ib8 zVud-!9OH}c_rA4cA<3ydY_3n%zl~OMrX7GP4wkbUZPj95j_6SA1!>}<&0OQ7DpRU@ zF|fI}gMFnW04^p^C}**2y4Cu`-!$c2xw6`NEq|R@>%N#htd2i{CLDJSecHKz(QTNZ zaTxX{y1wJR*J;<{^;}-WB=uOs%FKVfyo!!{r3gqH+blWf)dp5ra`W^QD z@=73wbq}4k1l7X(JN9@3SeJO5ev$@b95(PcpD(>vCEw~=OMI!5WLB$TL{qrV+WoJ< zcHdM$RTcG2tYrwx763fZzi0!PEWtr)!S-s63}xnby@d#(NiO*A-&*QHs}V*nlPEW z1afwi3g>)_ZUVPvYUH9e$HvMEnBs+Kb*KKI^g&UH$pYv3{X2Fa__U!rUFyE}`$ieP z?i)h5B}i4e)inos&&rl9_5s=g%4TEY!2f#=sKs-SLVX>t56R@6Ti@+DduFJhfT0K6lOKtfFg$ z9=AU^Aw_8yxb1E#D6}%pB&lk0gV$*t{D{tScxJd&oX#MOfD<%85)|m^_aWmUyTC|7 z{%TCvmz{(TOa-~=M4tn2z6@&vNB2LU^@z(^si z0BH-C1Lo}RY$h_Utom%}!o61S&p`ViiI}RmdWGo5Yhogq(9yO+mQ0qgtZLOY^UWMH z&7320w-sV#ass@@3oQ52#_mo$`x0=D<{2 zM|%=yTEPM~vkUEE4gR=BCH}bd7kOP722Zch;d9U#OgA?oYOFKMkD{lW+=@1msq?~E zm5Dv@b$%R$#!?cpxMIF#|(V04N;_%7S=FaRgji{K29mJlMFZ`i@1y!$b=t5ic2OMKGi2oBM4#v39#S-0N)ICyEp#I)Oe)x2gnAx5VFWk8z0F-^Cq zgDjD486{jDbAtvr=S9d6 zb~XFeRZUm0>GJo>s!ljJ2D5EU`3L|>d8WA(%nI0xDiw0|TL_x_#=M%IH=Z!MiguUn zQ2m&I$aqGhjJrfj&>7uK(^_<->D(-8MmD$8ql&2f`QyQk5&rn^`n@PfQAtPVzQ4;| z$9L7FQ(qfJEH*7@+i**C<*(v7MaMIgu<1^qlibmc=R{$Y9yZ-hWp)+MTtU>ZTdPyL zzA7!S@E}}qpIg;{@$g1ls7B|c$&I-AqDqo3UMaOM;;RC{G;oHs~e)2Fx+jS zHDLgvi_99$1U=uZcGX_}F0=F+9NVQsbwh+Ivs?*R=SA**=aXY zvdamK_t_bA>{@_pBWF(~*0Z!P9?P#bxQnhCLss&^8m$I|QMv%b3a=T8o;P8OvJ55IZ-p4yVB65-HY!wquBHR$az7VnnJA2TYYkEZ4g zbQ#*nuH9Mlkz9K1fO_DtS1GZp79SyS29mLjnss0`11 z@xgJWiNgNJ#^XP|)LM@=QNfXunb(67BVz>Lk@IINIS0E8mDs({P5?plSSr|`HNv&(QUZB@}9lqlm zu3arbrB+{0VE*8%f^ceYtT*l=&2itAYf@@X=+#ra|AORvUVfL6Ay(Kx~&du z5cGUG?k1hUpd=tdHu{Z)g|FJ}>Q5m(PftoWLlZG4OMu^CeZD1ad9G2RkswHD8fAX) zCOd6logmEaZUSlv>B%RsD-3}mBZ+fG7Fzgo zrXU8zjLg@__6`pk5-q!LqIV|GM`~#<2xzXf(V6R-Cq|;9GP-qCAh@qbDjmI22 zXDnigvh02(DgEm)Ou;ahLg>s*T3)}v8DQEkveANnu^zj3{iR7zo~1B9mUHiEhoS`e zxWyuD?1ikNBSEvXr*uqccZ}wbYo;F)#ssK+>hDx7u}0BNJTby3+G*f(K~%0afc6A5 z6}}XPWX##5w`HX%P1LpH#5vSzw%sF+C)-szaix?Op2(n2mun64+<(!cBb%cBz8STP z17a_9W*0ZH(x{TY@Lb%E5G*0Bqpk;33IosWs{bNYQHNWHEA4 zF<8Rj!=v)X&Fg{#qiIF*#CW@rrZc3ojmX}Vq~=W=kGEZDeAWyif)4@1LY$FXe#QVf z2V}MJ?1Vv-mmh>Ctyp?=aCKy`1)KQ#TqEFKWeH(|CvHzE>pDoW{fUElp2(9>^U&S>-oTL`pSDS%xjZDiQ7C7o%Ik|Odb$u(L=G3 zf`@qr^0}-M=(d`0ED)mti&3#zx&Zm)0E*tO6Pwj020>n)i?P-m1*^aWvljws;AH~^ z&+MVse#MYgHGiTPjrU=(SI5bvMJ}=cK}^j=iv2`~FjO{R_!g8pxy?IJn$6}u?WcQ} zoEhiXI|~(&W~Vexhb||h71KUyl;+?wefv?IE$d+p=l}(}=8Mv4It7=>8|$*shw!tX zP6pmxmC^?WA>hi7Q*G=W{Iw(I4nw1sV8=ZvO1_LGBuwxpN%>Hle6IGLY($1Bt+md` zmZYLabWS`zN!}y5^eZliZm|E~%5YL@Wk=(ZQU0s;WOw$3tDN6C{% z9Cy56+-!JWO@=|MK?nizNK@E4nJIXn2dY8g<%@N0%Ls3FiGVXvz8MCiX9sPB+}D=E zS;d{dTPUdk-XvpTu6H&EVjGK=w?N}$;s+<{bYV0woK0LjSOuzAHZVOVuy)IJat$qY zss;`pXPsrD-s|jyH8sx7&vEK~pKr$$jFS3ugid?Vkmy*oQ16|(0*YcapxKt06vb~- zN&he$^w%8FHBoE7;Go{u8rgHdFH%rV$EjaAZPF;lP1UAZ!-xc^%TJy0dSNr{A}+jw z@i}QWuDo)~ikkd})u9;%<1TBDI8zffZr|U9E+gdttC&zkqfuo@$K-rKiaA-VBotYUU3HZYz$L2W``L36x_n}sJuF~AqL z)hYF-bro-~@~|HX3MqzdS;YTgMWLt>VtuOTj4tA-Q97)IzI}Ax6GN-TuB6SEpT)2$vz?i>a*C+8Q0j{{h+hz3}yDvGlHwOWC8bQ2Z!1kiUS3RHb zeMe8d;f|+Qh!0xXPFIzjRv4aXEZ*-5G@6X4LEdxRWqbXDH9oYxQ#IS|xGyE*0ccr(4fH}dAW ze5ISEnhYktiYM=TmqUs5bQygDF=25$tGgL;)tq(#u7e5zEy7FR9@w;)tM`6Rjo0ZG zs<^jS9GPWaazxjs{KBAJmvOBB`$a{4&}cHOv(v;Cz7=2ideR}!yMJxAPQg?mO*qg9 za^%a+Fp$wBJ(W!{jEpiutSp&@*ywR=z zBD2Yg%2a;sc!YhD-1Zg>rpb8btrv?*P2uR+vynLs$fxf}CU&@01)~TaduBZvH{wCG z^I$)_=-wQ8lYOD3FOZkXrrkWtKvKQ3JyY+DHD(Q^eEsNoD!#yEhyV5Y;UqcK656(Z z!?meZA#XSU-f;Wv#M{&R3-Wj9mdrFMDZ~+(0DaVNp{aI!^)ge?h*`OAm;mWZ%282H zr*=Uuz+zzY=3lG|bCLM8o%(|s!~Oj@4#?PXDTqy%X4n^4cR6IB#BMNESFP8@6vf;o zW(e7pWO;s=L^3CII|JpQ(p4&Yr*okbP>SLLaIPKitRkY+9MZRS$FSteP;7>MpAJf(#@3@8nC#fQRJ+phIeWe~s;*i>uvg5- zR~VCLJNzt9PTRLm&PFG8X(cVI%Q+|O%Uk7efZgYi>%7^czvD)Jkv2VDyo#5HsQW)D#Q5?MDrz}&L)1Bnfz*1q^Gc)=#gX;o$= z-+%FWmYg>8hMXTW6!>kCQGut3o;}mHI zxSsGA`=A(OSfkAs_aF%8zxw*%K+l;)8+Dw7KS=vUkYAsfz6grUW~n9Rm38h5>6GWQ zh)#aG@U?L3PbYjXn6kb-quW&i>=W2!?}JRiIQ~<$PpvzwDhzC1Do6ORI-kA~egVZS zEY3r(@XgtPFdaj&3qHsaRCrWPhw5LkFSa;#D-{~QQSIw3q#eYWRleY@X^4Vj$9bhPa*kd7}x9;Xr02T`1&|IeIli_d;ejz?!? zj8`=m4u~6L7F^2gU@XUdK~fkZsk0OnFnn^DZ&4aG0W7YVK)&_ryIiAprD-4|*?fj+4ft*GEs zVxZ4Jn&Hm=_Isn^JB&@C`t4op_+59u#^kL#RsZP^m)XMv0WM86O?YLAs^H*dFBq8GrX0uQYhd>d##M^=@|M-JSjsyN+j<1 zv00bv#528v=ERui$-f1?O$%OC|Eja-20=6K(MorR#1fTc#K%nHcF-Wu5fGUE%Pm?w9HXwaS8+pb;tHgJDk_ z`d#eGnvSCRqa`OzbfWuj?nBXXpw~DNMa#co4yc^f5w=75sZVTx$XSq4*4T4__3L1$ zet_B1<0Ze+TO9S1#vL$ZWP2t z;Vu!U-9m7;CiL|>;>8yZz6#&#`Kq!5U2rRjds=Ok!hAbjdb9+HFlrc&C^(lrpN;dr zYBp&&Z^JO?9{!Yf?>i}4j}s1K?CDP}RNEok!=pRWGeKh_c~i!A%24sv)HS9qVRoQl%b5883*m45jzLFayU(nv&9W$vq^^j3=%{RE8}>@qGx8w zhklt5jPv#$K^a4mfG*5kad)S^_v_k6}o<6sc=mBhXTvYNj`U0)od;p-_`&I!|Qp_4Q7# zlMn?~uby%y%Nw#0ssXDT$TcgOHyc~3u?CCu9J50y8wsn1UlxoF+ZQ7n^$`E?+q>f) zCb}a|<|95k1H^;yO&hu|IB)mS7ESx?nU>xw=NrpX%GqRe_p3{rd`=)a=)K3W0ygDZ z_wf`}WZ_>g78%ADDWZfZI)x`rI*=8A^-RsOl|25E1r`}$x1@ef>7kBrt!*9lZL^Eo z$Wl%w2Q>_uDIhC<5rskbVAMn1q0`RDIJ#UYOJnRwb5Q2~-;=JyiTO>lpMKe$er%!m|r%HuAyM)ovlVuZ3%Qs~&UC z=U=q9Zg`hqT{f6`CQjZ_^?@U;5i>Pc?RxtQp+(#L83)4wy;$?DW92f0tg)^rCmgCF zbf|{YUf4+bkz*8ReY3LI5;IGYxk3&<;>#0#-%UJQ`jKO=!gv|YvsbUdZPgt&ZD^AJAeK<42a34(K|u%e@l(u`&m> zl}Fx4EXy3EYWw<`7acT}k+WeqHVGbgd-KBO0gC!N@{)BAMJKXPLY35HU(m~r3bIVA zWSbH)uIp_Yf8UE@JvvFe68ve>F0{JciuaxI?!y@}1z9jksQduGTqrAmFO@L*g8Yy9 z&JQ;~LI|VX+VBEeMikXc;Mj#Bb^Ch>I_#1@;C)Jf`o_${58NBD+G|Lk*}$dd^zv5G z2z~Qx!WCu~PC5-n36f^!kxv;dC938uw3#+?XR*a~CGb5l<%}C>bw!CgvZA1{j@HK| zz9Y#hk*HWQIN-&Ob}m8r12Cy3VCQ|My36!RpeUa4i>?@-1N4$X)s|iP(WXl=4y2sG zcI@8`jM|gn@SGhsuQv*}=H$6#7f*a5ZN~Yx*B)5>2 z%j+mlB$`}mWu=Ur1zVQ>aTwpc0!r!1Rf{k}hn)>NK4J&D)&k+2)Dd$qm!w*l|C|Zk zvH2@6IvJv?)x-d9uG6903kqEwHg)1A*9(O_+E5J3)~sn+knvDPaWmi;&w+z$u8BvU z^wz2_f4lCPMfc39VyXmep<*4kk|qr2ad%JklqeB023%>dFyM4BesGnC^!oTpcBmtgDC%ZAcS)6z0qgg@dtm9Q!dU^X6QN{%<)p6|0y;FEoKRTtua zR4@1t_cO+Ozbfu)B5-e$jBg0Xln9AcqNnr4Sa={*zaiXz6gdRY2$tEn?9`^$Sn1S# z%OCd+)36}33({1xy3Hs&@phc|u<^t;SHl60Gmoq#e1HuZ z>ejLSph{tSk)V_y&tCMVd=-}%xyS+$8HF5%;0hR+19km}2buk6rJ$nU%KUTx5s!E3 zl~6jznV+mpXvnb{Y^tR9xYf!GcmotA-SK5tBsA}4GCKqvN$fI^Fae!@6Hd#OEfU#Q zbmKba*pZ~vg_Sn=4b9A7*4^P^7F^dk)e#@liOlkF80xfz`XtPTq>o?lMOTt0-l_GIV zEMMgcMLuAMddX(3$xG{TQw7*+*VngQL3%wHWIBfeL9M^#IqN#Eb zM%TZq(EeFF=j_hl$abC^dg^xAxDxue+IT3+#Ira0l^B+_@D)bOwIX}{KABueIO1-? zHu$;SAVj+u<*bd*hW*(jB@VEPWq)@kBKI5D*2L^`Rue@)G83!QRMs6?5*tf>8F!th z1s?Z|g63{;wKL3IE>-DnJj43?ag;Bj2*2qycgBDfArd*AHpxfLG)WH&4RYXQhOg+R zzb-lwgnaF+UAbMvOs^lWHvpB0Go8Smo){Y-Ls;OfotC`&=?U5`(o`lRdv@?WUIpw8 zb{RZjW~Y67Q<6?9hGL*CG?O0MobErzxj?dJ*?bO_FKB*#d6|$i5dJQq{w}&2H{2=t z$k5Eh#gBW~n#PcO%xS-&30p2RybBr7s607s;qOnR8p7pPQT$|+WvMPNxjvU+KZ-K_ z>@Mfg{#0ExAZ!W;7#bmJGBs}^DQw2zCx_Ks>;53Mc;YB}fU(nk6)khfnK?w5RGqKl zQnDG23u(SFd^?_C>d(j@Z&*pc9u7zhhdf$U^;ZK`yhS%m6~;Lvm#AC+k$hJT>F96oC?fpW5RjWaW!Q{t$^W(uf z1twH2p$(^S*~}#L8-HxRe_z^r42{+pDfF7H&q9znT&Qb=7j%KTF zrPE`3g7Pd|k8pSDa>jKlaj&Q4HUzH+C3dW~E)T}UK=mA@f5}b&7E~q1#6VrE2H=S) zY0+6V8T}|FysjCd20d9}w5E;W{1Ygb`BYHj%`Tzq!{+W-gZ>wqndGL>>ApHHAj?fu zhN`)a%Xm;G&g~yPcSQ-y4`DFUg*Y}iyYgHm0>O>A}%_b-q)y2(}IQ*xRsi<7#u z$-3)F1515@X~I(aW0D!8kZJPlGp5t zENm-1I-C`T9Q%NmB%DV(_q&Cf+MPdUNNT!qE-7lYtEo09OC7LiQTL51+(oDU(h$8V zZ5Vm036aKNfZDElC?pfMzY&49`^5M_&{7#+q4b?~^iXB8>P3J_d3Yl2-4O-*is$B_ zeK65IDaI?J2@Xe@)tG!vqVr}7{)izdc{&l21k zdY&ste3p0r-l-;Ag+dS;1$&Zj)YOvSV7|F#Y$@m4@LaO7s=Je)8ty_x$^lQKc-zrt zf+30whglQU_Qgb)6Umu#cYkGPIof9`l&q7`OsBh;ziKl2GsXgI%GOe8w-$KTgnSw+ znRsL+m_JtFch9XQ!ucyE6*WMcI~5(_4s&c?MhHe|<6277w3VUk+Lt?;|H)$5RoZc- zG(+`z0Bz&uA`i0J#ybtY@1LIHRk?zum~~LF2x#JKgl2(z-#*-{=Bs$qJcj}zJD6v` z7-3|Bg1rOK#Jd>Mm_j!g5>D7YFbs#k1o;|DIuo1`a7On+3EIOfBKBjU!8dqo{V(*( zDgcuaw!xVW#fN4az3~$OGLL#iH3Gd*u5%d0c`^bPu};Re#SRvSFpNpksc*<)b*g;kQTJg-=gR=ft{d_ z9Q6U{Fab&%dmifZQA=I}z$_1aGHioLu$J}bsd_0Ifl;Cf)ihN*5W-;li9Oy-hI-~L zsoIUtf_*u3fGgNA%GPhRw1vXJifyo-UO(QQ#n)ko;|sO?95N8IK4#Q|45!} zaTD124gI(?_d;$v)K%buea5?y^e*vikFeJ5`@1MqWGFc+q9cb3OGHDtrNg1yt@U$| zBJ7Y}`@t9wcRIz)xt8?l-#$?E)ljhY7DUD3`VTAI0A&Zfiq7^yEYC6;OZ>ML?3=4Ob4K6(5Of_yE z^wd|F|070fTI~zJ&9k{DQq*S{pAZ*lg_JX4^K6y^wl)tXjJ775s?Mt&KRf7taWK-x zkfQ>*{PB!8%XgMsKq04$PLqrK#0mv5Zr~RQw!YZShO&czj5iEtdt9!&H0Tsg z*6t6or8ZCvC2h9y3oQ2r-M}1B`ALUF@6+_h9(4M12L9Od896=9)$@!+PpBEs|FX{B zUH?j|grbF2rnIk4k6B^}1=3W2)BURF!(zDf@Y(^z-b4CUtNe9h>383vqdl4T>f?hw zKG2GYbnNxzU-RPFi0LC?ru|xwv4$buunk3t^g0O_$E6;h5{tZX)x#&Qi?uF5*adiN zXy|jBN27@3M4t1B!oa>mANbEs@J|0Cx8^kfes$xI57170RT2j^yD_yEPzk~|WaKXXww6Mv^ESA8zcJHo z8=+Wq_Hni=BYRY2y5DP^MV|ZfdYT4FH%v8WA$eD>EtbS z)Qu!BCx1lgEeo($0cWedcX!NmQn%3STVqwK?SoW7pBFou53{+jM@gMYvSy}gcj-QK zR>eo?@V%rRDz|68f9`?Wc=IsxMKg5>MM|Ix!eZQ)me>1)2^c084DiN9*5=$nGtBPL zW+b27z^|#kIE1(A<@5<6kn+yQO z1;1h;`XQKxc)0KA`{xqVWKa?;s$4LG>)SnzV?vmk~#P-|T9Wl7ay_0g9-iVJxBz(_~_kqO1XjbnhsW z?qKtUJEeaBDCDlLb)U^F;9$}USI(|N9a6`bNi+m-3c(4|&V=#r_WjX;)yxt$j0;B?Wmg}~SI56-^YYvr%tV+`3*a{BCtV4WyZ^kbBXxL8&!D!R&# zO6V6NQ#!^k>K;(>^hvMP8T5P0v9@QEdE70kZgTOesrq^@lT4T6U?xfV4@Tiv`?+b0 zc9$+!BkNKC`N}UN6dve$_pg#KtyVZOn48N7wjIP^RL0QHt5ZG0ZdtjP#}^ZffyzuE zQGS62gTb_&gpmMcypXF}qz_jxgROvCq~>r-(S{vPz@mc1;f6q>#O4b*DKC8GsM7cC zKS`@>}15!FVoI zGk?HfXp1AAtN(aFBOwH&K6n8l^aH^n>VfVQfXD%`0|H0I0C>DwlI9Jne^CE=I}mOf z&wf*TjIG{&P7Q;3IRgWBXCEF-x}X*rV;iDvf1S|02pqK_FDb{J$g@CWtohf)7|3Xp zmnAmSD|E!T&V0u2B2{c`!(cACaA0<0JkQ!dX$^S5@g!$TaTaVM;9uBpx{a}+Wyo-V z0fNNyZmSCi1I1>p2`zlp2a?9dhA{fU-^52#(u<)^1+Amt%XaTQ&|B)e;2K}|VdJ#P8VP5bXprM(ZIyh>5XYwg&xXMYm0k8anuzp$uRE;m{g9wiM; zN%MfG*4j4%pfssJYCNVuAd?Pjk~vV&LQw9I4pMb~*aPVdu`6F@pa8CC<1 zK`8VU^Hne(1>>KwrAeBhi`JtWT_6igf1t0KYg9+_(7Vx)E?#=7#%$3F(PKHLZvo7a8XPdOO~<=J77>qh9g z6M4ABZx3kXJ@B*-x=@-aNxTeF@n78*J7uY<#GPio-|O+B_Xe6$lYLtsCCP%*I)9z% zk=n=xa49Z!I_P2>vdido#Xu|bmBVD0$@Nc{I~@%yqd*N2yfRmM^?ALf#9OW169tQ1 zb1jFU?h%a+BaN~Vt3ig zDBC$%i~{v2?1{V?7@*q^b6(hnT*!_n5X;TI@O`vB%TgUhfQnQvtzjEl$#fSjKDDn14#z6+ge(Y9i!-DVNV=jy2wR=J*Xs0`B3Y`q*9Cm zX%-mK0h0#5jEi6w2}w_aiiMf_fXKAWH-K;uFN0Nle`yIC(z2Jc=Ne>7u%?6{>IC{rhTlNr614DfJ(a@hxE@bPh5hhYQVHb1nvl1NzNS6+(dxJDii zN++WW6j?zS5PCm%XLnA%Eun5*+kemvhRje%LUWWu{)X(9S#djzX*7f^2}cAErW}Ed zq{@CJq;T)pgAVABc^H7O>BjOP4YI@LOS3WLNbPYKpr&m#O!i>%0Aq(9m>l=klIg;d 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

    _~|+^_`YLKZ170>M5zIsYMb&8 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�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 z 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 z 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

    4l+6EaCfuQd8G#l<- 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%0D5|7bl>^KOkUb2EWA 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

    F+-hL_4rS#$adCw!wAc#VEc1q;+9EKC&3e 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 X=OJfH<6r25sHO|*B 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%0D3=6v-@xL^?;&DzJGrd8zl?*N)Ch* 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Μ16%FapAA z)7P@y`%OFDvYI*CKwsKPi+iXvA#xA-XD6As}0#MLEo;kz5znEO*V9`IHl z3F64B3Z4aEsl5Rm&r6v%pB1`6QgJBYar{IMGC=4MY^J!eDaFNhUJ*e7a<|RYDe8^g z4HUHfd+u4x#K;}ZL5c)l4VEvg%q2A4lsTB9=asT@Cw7)l8oQ`cY5z7g%yni~Y4jk4 z`>{O|it#Z>0+yTN-%0VBtARkR=Lyo@1DW`vQl&$`RDP=(Mg$Vuw z?Q(Z6;Wp^B&|vN*MGq?)F6Qf{26@$N>M4<|LFxhuww$T&uI%FSLFPZj6Mu8uyk{Th ziNDSh-1U%lXM6m~FP%!q5$Y9Qd!+as+T_1!`NXal5g?iA1_loqkEjW-6{E3jUqV8E z9Hn=1$Bi@Q)KwD@Jfkb=xI1>0n{(igjpK{`7EgGx+3z^le9R;Nz7tfft(b8r7hn>Q z9$;eVV|9d2Zy^V+vXG}7TS0T&`A8LTK6O06>l@LblKg$~H}-kR@-OoA^x|LsIZ_ux zkgVsm--*5YgvsQSQ$qO}rk|he7p(DMq~Doi+xux!JL1K&7L6-95J?qQ^e@q1s#r|C zH2#e-Ed@5XfW-a6e1&?(NpIia*GFUp{dK6UDlr^9u5|>J?LB0c%7cLFuOxr|-yY;a z$TJ4i>}TMyrl759o9n?~2k!d@fA4Y>sPxTFzkKVnSgkiRaPgG$nSspE<6~4LiKc^? zXrH-5`D^yOLSdYVXu&!K!ChXTz06J%9Oklw@iN)G+f+&@n@a-~m>E4`F$*xt>LK$E zmv!>PwxcpCWXO;1#6LD^aNFe_(>q>RG@O^r=g!4|4W0e-Ea5O=BDfA9<%wA92)r{e zHb%B!zWImhHmbt7MgL)9!FMXaC^om~!(AWrWbp;e0R{dCai0BVu9TIoPtAc_=0=1J zZ-SWTqtn@kB9Px*4QoSr9#BGRXVhdF43+(_BKar@jTjR`lOF>}+pnj4U$&E-?CELG&pnnC%Q*U*wAKk+<`~$qKT6eM8+r)N!n> zhNGqr>BXx(4rF-8c;SN~^Ig2!e+z}tYyd4bkkC}mtM+fOX`h)eZ~-bz2nTc<=MERh z>iysxjpn=!WW`CIl%YYD(inxI+n5j}xand&(m#RX%nE|P#Pdo6vdTm}vwrS08E#EH zJaL9ob-p2?!Od!~`|wOC25SKBTy7fHR>$t^xu&nWg5Tj!??Lr8uzanip_ZCmmuK%e z%iZ5D_tWYhwBH!fcHBD%y^C;Sip-CL%G;UPWP45NTkrx z&|Wx?;f{-Sk9cd1cPobkZ))lg*LTHuC?@gbVHQ4FYPv?`G3B7Wr{~$JY)`{{)iX~X z@+))%D!JN(i&Q=-4F4maWo+SWJ=X`vNJD$~c=#fc@AEZ2D~v-ArzRp_dSxnTD_#Fs z`CUX)kz!^Q{c^|Iz>i;>($7t{RUK$pO@!8hpU&dFE0TKalQK%kxdhcwrPi z-L16W!TsR%(<8bxKK)Xl=W%yxREIP^av&Y;O09)~3+JTD=NJ%zTcdj#kSO;8Oz%69 zTtF~wCxMM8eDkJ_KoG1np7oCvOM8?;ca4}>u?Yb8RKemT$~!RTk8r6-A%uO&?7#xD zxPet9a2<*ezraVNEM!O^^N%tSpNq!Xhtz3Z+V~G&NLZsHq}zjd)~-guE>$lYt7KY( zk3$--H(zK5(n$ra?O(60>#jy61+*VacN~7)T&k&(W)6vL=D_K$PI-G8qmK^H9{1J# zVnQ*ml2IHX)AUdi#WMr1wG*T)=P%|orA&PPf;Pun!!&VQkh^^6oD*x)^62<+o7syN zECrD;;x;*AWq}d?{BSN*+HJPE(pVhC2QNc{secdJe($fD*VUwE9mh&i%fNhk+MeCm zUb))*@qFm9H7W4u#%DF~r0cr77kZEX&=wd#CwnTONVJ!JVVRsHE>M^soL6#c{`Y9lEq8-O4$p&jW$`PE}`tMa)E;K=nsz zo!Hj=g4?+&w&&*Ok!AGmn9_GM>hw;W8JXtVSr0dR-Q!AdSL{zjH_V$Pu5i%e-^dh9Z;EwF$5mCCvE%ke76ie)81aX zK-j9v^d^br;5be4AXzqu9p2sHKin!KL;|ZS(x`x2o0!zq$nZEK^?nPXT%MbY!&W&# zJXe6XTeL8yFG&_T<5n+pAhS6dIf2=(1}UEe90$*o$y5GzOXY*n@*@Jd0N>S?58{cm zqSNH$;4&Kw2lVkpuTz+pm0%AHr6MLvQeUH5i8H)BC~X{OOP<01^*3UErJNA{IFJ01 zLD{dV8&zuIv7LVm8U5o*r?;v#A{A;oi=1nUiPuI*vxa)8xlq__#WeI`6 zHkn;Uvo4;hr4MCX8@s)KCG79?omu)sgSLJ|l8CJVhn4%Fik z%kBQzEf0s7ba(5HTOws;!yHt>svx0RX9xh{g9N?c$Y%wp(!C_Sol(&}cV>82>}>Gv zmVRW~m2KNN85wy(7Ucl=S6)@ne^q%(>o4dE#_a*q62tpFpe56nm<4m99uLCvY36@B zS$S7o)PT^Lqr09+!qc>J6Ty4*ox6}+b2D5O0FzS=R?$@6_U+rZrl$IMQ+5q~ck*-+ z(zGw1$;e4b$+y#{(hf+1ncHm{&7fMW(-V}MFX{K@V&9f4+4z0>uODn=8Cb0LT-T}@ zCuI5uSW)Z8CuAyhS8y3fD9#Hlm-d;?x>n+20(9rCAX)A(I}0I_2O}`LMXDf`doM-$ z*J1j5euqiK{?Xqv8$UMKcdRIUn{d9&?tfl9q>@2!`)0Q!^LNiCxP0zu0`GlQU0W4h zW8*h0yFJt>z#0jU8&lpPO;OCEJl^Uu9A#ir#jgiU3q|Y5&=x;eSTb0<&BOp-c+! zi0V)cs#)J8y@`mMPDo=B%4mQ8QO6!ciI0H=dQ1A3O`+ecyB}mel^lMZ7~~ZZafj<@xf#y9N+MSJ23q zJX>?@rjM|IO>UG;5UaKg?`Wfe|Bnq4iJH|r6g$S*`i@+<_8a6tU1HN_3sb1jn$=}T zToJi2E!8|4gRSp zbbO!Itp|TQ+VfZR-~3XJ1}&HWO+h7krKgo9p5>=g#~;Fx~sue zJ=GGlqEz8`t;k<02w{BRa@zJcYKUW0lJcVdRiV)7Q)Gns)Nm%-Eb8598u~q&~5T7^j_j zTR481VC^R$7*QJ&Q5uq;TT}W*X~x$|*W(>>=3N@>JkT*HyKdtwA<9BK27`YJov_5D z1p}D}9~N*;AIjM`Jsk?JNzu{Nq^bFMs2tqvxa?fj8d62%dZ_fLh@1CVaS-1eGl$RR zFgLxF<^FxT+S>E452aOK#40ROR1}vPv?8(f{#anae0R@lY;3 zDdShyMzl>iEM}t5ZwOJ~e)?Lr(|GzRij6Hpyo?gOzrU%DAs>ecX=vaFs`;hWmdnSXffFP~8{E%p|nS;d|lfD7VIYVad@^u9KJD436PW8|z0VT^6 zD4Ar!{?Z|QF0Gr2gy?Op8Fjd3EXR%J2Enbjv_xM$Bj{jzoPg2ND?2tLELbVp=9qBQ z>5m+T#HVI7V8Oyw9}nhBC`Skm`+Lgp0}Z==U z!P$)WuqS0w znl|F5=N2U(;V>mu_J(gWVFz~m72O+rt|nA6!sJZma(*u?)-cU@v=Q4U$`ASX_#PhD zT?VL7G<7<0zYAA$#(H-a?0adNmSJ0cWq`@t3JrJ zHoX`=)#S(3l~Ids{Kq^qR4CqACmqom>KzT4&x^iQuEAp^6?g^sIa`}hx7TWg1==lKkT*P3tKVh_D)N&y0eqG>U{mNl{ z@U4xf?vzBQI_0m#B;X+Ds>zMk2@3Q|GX4{czIm!xVVG_w0sb>e-;4}n8FuO>aTeJ zCvVm|8_?}h;hbAG3DCDE>90)RITzTMb20Os{MCG)^Ohpc{H6ID@z!AL{I7OFMsttj zN?M~}t2(7N>-o7-)%-Pvx80lF9}Io%_=Q1`>G=9Iz?C~y7`L%I6kNL2 zHKBkiSoF!>$-=PS-NA(F#2;1Vl`)}dZl@P!QCp4BPsqYILt|P~6G`6e)+6>N1m0-v5HiB_s)_$s=-BR;`9^(QLfqqW&t z$LL#zBcAkr&UaQ{JpNmW2*w5LZ^?J_Ta+`eG?r%46#W5U3D5@vq=k|AdDVVioEQ!c zA{sbi=OOlH;QpT^P>Ez|%48&=@mnjoWE(MyV+yxd;t+%RBDK_@hL(MdUuZsPCkZPh zz6=GWJ#I~Q2OUzd_{aUys!D05lz#2LB~N*RdWEXjdq_p|&(*A|S8>Z>06E5Y0+7op z^Nm0pPiiU-^$%EvQnmWO9S6ov6TWG4eXAq9c&Qc;@ILdS@z_h*_oHN$P335CM>Rd` zVzkv;8yv&HgwkqTR%j##lJ{O?fcNj1MLsiZqey|aZ|saGN47^_Txtq0NYV_aTHKrQ zTGBy?5{t}?Vj^k7Y8>(pt4no>b-rD1bOk+{iRinOF4bEOBo0_995KLQxy9stOBvV9 zrFMJ6(VpIvTb@T63=p>7vu%8K%L#Bgr?0j$O8Mz0vSSIl4k~s7UI-Nq zhV-PL^>|XA-hHd~Fi+YYzYd&kD(#qn zo(FitT_Y413O)R@xpps5&&stpMj0v4@4_Lb`9g3~pq(G&Osg7|6!?%jhndJ)J~8mu zFlpRLKStrXs)a(o5JAmFHH6|??gIG^Z0Zr&@2F-cwg+d`+?+Ydm?Sdb7&uxRdMO(2 zH5aztcvzz$EqvMiH{#r$2?$5%FL-@s#o~Y<`SULIr`&}0o#_k~>RZxX%<~Lu_@;f#pCaTo~|&I?UJ}yWUxnD9*K$(LX^i>gpUwh$)XNwf;@Fz(wjJK>He4K z48MXZ;XjxIa4pyJ_l%Y-(XWvMPsab;dvPyz21dNSHnI8(wrgqr2lAWaIvd>EIYkNv zSg<0Cy&n^Hcre9hG*(y{G9)qo-$Vvuu?^`r8!)a-n`pzAzxkB{VlV^}SVc1RI~! z5-qiIDy!Jne>xphKY*dhU8s~m!|#p)Tp;kH@F{1ko}bh$WUoVWO)!J}So@xpAW(fs z7f=2BVBT-}@?kDvvdR&wogU|NlM$(OE0V;-w=6=4AfFSdH(=d|TX)y4A~?)J+d@U+ z9xA>0f@z!v%uJR*6am0f2(OuY+BWlKUim{vJ1nZQE;HjyXZep8QE%7B)(|JkH7S~A zzfg4IF0J-_qlg{ew@)T-)IcvT_3!-r?&1rcYO} zIsOAHRH>ST4KFPp(-fmhcigeJ61((Pp$?;osFeNXm}&wZ_DS&G^MM<*v#N8o&=#cm z@JJ_f9(Z#iy-O1s%CwR4JC#I`i&GtEwcgbd`#sZ1`rXzVh2%#=t$%m!N(SnUx*6pc z$UbX3%btI{s(c8+x`R}}T~FUN25F|2bp2D)F&Rtol#+lR67b19<$P}=A2(2v z03u%`^PUM=u&b)&()hxx`TmpZV+$2n`F6S9LhNsHUL^iF{+=<=@`dT(KG)>H_DbnOdnLlZ`ddJ>@sLu&l0q zDv*mU(%({ibw%||Sf{P4W8nOw7UDRA!>yS|NjiN^E#l+|+6&`4A_Vv69NNDDqd$jX zLf*5z9Q!MLn*2tXuRlb@tnSpvsJKOUs4^#q=IUf%oP*DqbGBETgsJc|X&MKG;-lxo zLvn_tFf`JS2_G<015*#JF@+!-l@_8C=?C{5e5@(`7i?L2DcK~CjvJzRmQq-#3{>1S z!=%A0qn1(eI(Z+~>~2v{WnEFv@MNzHBdR?&*)TG!rhX;%BsfBl^K7?`-lPECVQ0G&o@c!s2on58;UjFltm98fZ^JZR= zF!e+Xyr_cM_?=e0QF|vPt1d0gSv9-Z<|vzFS_$Nj-KVBN2=yh-*3exZN_D1VkWc+WX7_qMC&WCqg9z9D z-tbT1cH0A^a}c|`hE#_|K~@24avVKQFeha>%kN0%sa%IEQ}PU64l&n*TI|h-?Z*fH zV`eFNc`11ujNy`)F@A z^86m9GnKH(kmUn)BjlVJ*y29kUD8dLdCM?+jmpk;B-%Qot=HmsDPp)!vz!iMbc%jl zQh9RE0`t3A+S@C&&{%!lI7NMv=CS6xqKMw6yiEyGBg$ z6ra|sjvzuN-J_u~F)?AFNm6qYr8sGvLL=h?YImbXhplFhw^4RVTmDO0U7Qk9c3)CXKw;db( z*s^3wM1-R*ZVQ0B!6RG%9_3w#!RX=KRR@X_ddF-MB`FTsK4vv-e%q(b4AtwzTC7_~ zt^Ft}6*%3dSalnO~UxlNfucn4$Z%%cB4oXsc;ra4+ z7rRzgw%Bn(q2rJlJUsUPfq#ZVyjiD*B!M*@^*Is)R&=3-%;1iyoN&kss*eno$L(-X z2S4wh+G-1R*ZrYsp3yr`_D?oMYWb0aTm$)tl$FjDAQ(s%KJkvy^D-;E0J%j8HL4zi z(K+toHV+Lx$sm4AcEBCAR`4Z@(Ouyas=1&hnE4*(E}lS$N^=!kmmyk3H%ATqL7{LS z?{yvMo6YqmrsXCwRMyrkA(@0mb>*Y`_E z;KCGNqAG(W9N*Y%#7K8}k2|1yq z_)5Pld4E4rRcX3HOnWLOgpf5L=>Fhp3*YIo-H|OQ>^<)81l^6ajpM7d68fd*68mt4 zvd{r==~Ld^rRLgJH|CrQ)s83MP-@Q@vssN7ZLtgh?K&3-4vbEsu^gg5qX9x$Ece_< zkiI-&Vz`SdSoc?t50-SCI7H8mkLDeEGieJIH1UmQ;*d%rn6O8(L}blDR2vkyVvW5YRs5MS5}*qE0ayEzUFoQy3FPBkqoJWz8$NQ1o<-90Mj_+?tMNM46RBj| zhHG~RI1U3`f^PElgpQO^NPt=ENbHV_UWSN-@2i3rLG`cc!KltaRW-fZX>VG=+m$Jw z0+w&jU4k4S+QXd>g2^-k+xD_ z=Nz_(r(AOH&gC0r)k)NT^Sr!FF!DnDDa`vjkQdb9K40+5BUqP`_?O;LjMvX&JKvj7 zZ!~>ZI2i*Xi{!u~za?}NH_W7-v9Pf_!x~FBkXQ{L!DHgaAa1Ir70O2b&YJC^InsVA zMzwX@skQNVTEVW^x)Ke5kT80G4WX0S0aP1JCTBZm#`yD#Lo2V94iRWY^`CdDTt-mZb@XapKB2w<<=~}*$%1&}X3|^C z0TJFFj}ekSFKXfa)~l{%ZV^0)H+!+^+msxNwU5&s^jQ9H(p$(X`~q(#ZXW&d%S~JR zMnWNWroPz`)QL(jFws)5;EM$T6ffw^B=1HC5^0U}h-^EUOyw1iSHiTgZRWok{@zxj zhU5R$F^n=6uUxJ5KhBlklztj)F&~%CS$G%dkh5|{Z`MLCJ4s<7AIFKcQTdgK2wo_2 zb2mN2wXa`6BefLdTIC$rVo#%MdW|1+g&SmQ$V~`)CGI>=f(P3d((+nxyU=5rkGvTO z$#Hkz&^$1(pO5QL@+&=`n4QXt(2kH7`O<{LBDy-gzIk}l8T(f^f7ilg%(hE^^XE9dAP$NqPoOK4Z>oy+z2MIxYOKQher z%dr^WhnZt?UK*L&V|)@ug)px$)F{H>AY-5+-)F{ERP~<`1V&5i6$-n5W9kW5rU*N{ zit?~X!RvjB#|r00;kn6i3tQb5ZQ@g~hX3c@z9u+chS0i#tHi23SjP>KrRbOI2oF!j z8dShlrYCiWUCxPkB6x|>(u-l@f`B@1)BM;<{{k5v3IK8NM@QfhD4?pLh!i3Dwc*mt zbt;e3$wwL*%66}>0e3ihqq)im!>lkRk}PD12HG$7GQ@MmM9*nD&|=@$GzohA$BjCh zb<_7IQV+(=VcSo*3EMbyhkF>eXf6PJ31#%PP$%O@dFH41`(=Yk!@`)XxF4cmt1@;m zp;y#Y|ELv!@5NwsTQkY|;{D@nLlpQRTVV*{X7al|VTfMe7@jZ>C|&zILDKt?>i$6P zjjAi?*rzC0<2LlB%vV!m5WW;_agW*cBQ4j9qebd+%2-+nvWmPfy+nd5(iz-TD-ygJhW! zIVrM0kj^G@5ag8C7dwEK{F`%A#XQkwnHWr$s7HrL%ZGpmXAH3bc&h)mAUHR&6)P^pGH|Vkq304Qdyt(uG zR}(ogpu^PEyVSe;h~J(hw5`qRC;l3x<{#O9))$Cz@vuRzi{CMyqV~*x+^d?xKUi#V znf;WKD=)5kcQ)_~G-1f}U~!*o{^fR0@x(Mh_W5YPCd0Xr#(sbMbiH1j>*s-V(6igx z{w!v5shj8+?RIuI$P@j)JUT8EC|)TVj6Ze-4Q!?JWha1oI7aSK!uIhzTu%5MI(AWW z(oRSR*UngVBh^*z!1oBj?cC+yoAEzfer;hjvcC=RV2VK0(%=1o;FrX)1jCr%>|K2% z1TKFmYtIETGJFUHCQ}k({bSM!QMa$vh>hPnHLpbC(fji5hnVPJ-?_^=<)FN$)UvWo zSiXFYl#)h4A&T;d9`)oM>+X+zV)L40(riQtYygB3 z89rF3f5eBJgSs1IF@EJ_a6dH2|9B@kYF2+Zvq>>MN7646&4U@|A$Oenk?P{*N@f0% zS_$6IB?T0?qa~2C_<4GbdNn@(2QAxKBo;(f42o7&a-fhr^llfxdyfv_IUu(j?Qc)22Uo2b%93~^Wah1{zodie?`vraN!!!yIMF=T7az!XcFfv6KjW*O z=w+v@`bq^cwqc`=%v12Z@uzh=K1fkt4LZ-vN!`@)k6J%Y%H;d7uzl!%e1F5*?qiyg z;(EWdk{>o_Li?6QKFYj}HrZS&g)ooc@*-unSvPyOoZ|Y|&WsnH9$uwYXU^G940V-& zLRQicAMEjFGq`e#_xT_@bA5ucS=@K1%2JMQRVMgg?ZHr2=6*}w*chG5VK%QsmW4Ls zd&foSOek~ezvu4J7plB)W$;u^xaZjt&gm|#E;`}(J+7J9)wDun-;I@syhT@N5a$5Afn(8va*0a+R`jymfPB1#98P@7X*JlHAMmbd^} z&QFAp>r8BpCXyxb=436g4slP|^#lKSkc#rF@L&$D6(SredVxcIhyQj%{$t)Kx|?fc z#3i~IG}r&M2b1I9%`Dy!(9bpK{8&qt;PR==d;#+%l)?Ml+?2V>JgV$b`_I{&-u?ky zn6EH@kq^(xoUpYA;9uEPS?M0G7T?N#W|y7;q>fiR9=gUzallq}vU#Gki|wa_l^zv1`ud;VU{gWJg(JP(fiRm3!@`TNXkpu$1htdFY0w!hTOd%?baL`tdpGE@>PGb2 zg<)US29|>=xDyvjrb_4zjAo;yJzXO~?5=L}bX`>r#|w~+_Erf(#Ad_ZGq_#E7xw2+ zV@Tu6K2Qok9Jn561V$#&(s-OIPKmGAUL*?zEl9}GSd~olNxFqOFEY;`_t?J8_}lj< z#NHBb041iVf%MZ@uauOD)Y7t&56-ox_o=J=CO~D*Ye*>P*(ynes9VH{)_Mh7KcP9i z?H-_$uUJ{`^wx!}J;H1o<&lme&|YDoLa$m0Zw}rVz-a+QH38J-IC`zs0yO(PBLze|0%LWDe>`{KRRZSa z(=Jy@(bT|FdworF=~&xpNkkMn$X+HXfP#FJoSyn*ui5+^pe}(Y1h;+F2Y52T>*iQ+ zjKU{+68d}!Ml1>CIG{?FS&JeJt7|f=ur(FcST)tyA+<#A-*~P5d-&5;Zo89jP~be- z89yON==FwW+r?QxR+x=hvX&Y+&RY*1{*Xz93E_c0Nd}PKn1{qKSmhsvEciiF1TsT` z`jPOLj%?2FSL{x*mdOVRINxjV!Qx{tzN@P#!xjmGAFMz_Osu>@Uz^Al;2CA^`@G9R z0x$Ig#YK?eq?ClpjU!6o>AY6OFVFll3(??fYT~G+<9{$AKRAof;1w#}HJcJ7G(B>= z%keDF9;+S7D{` zeDnG@&)YgPSz`4iK6*fcYisx`Jq2_oeTZ}$3l)SI@5s30X0H%9FvJ6Be>ya4u@F#U zs&KOFIWUPb2*(Z(?uzm6{2Eb#qElzqZjJNFv1YDza1yRLisEEhfR_5!)v&Un21 z_a~}P_IoDM*Kch(A`(Z3 zd>W*A<+>D5x#W*JtqK{+COcOBCBVlv~V(GREmvCo4NMH~yuD4{csXMpoK8 z71D(p9im|0XMk)YZK5(IJ7aTO6d54|wREe0qv9#6WHY?~IsDtmx3?d^rMrlT@dM^Y z2Z@Su;1xJVw^Lh<{ZQ=r_k)2Kp6sv8a=(%V9A@*+pa2O}r68d|BTPkV%Kb2t{ppVs zr^`7dynRyKL*usdt|pDi=4Lv{xw#J#{QUglQljaRwwQUe?Eg?0mu_9-7b6FV=f%O% z)1~#Q7Df@Km4Lm8kseM1>hZ6F>2Ke^&wanCkLSd?HBlP^x@=MXa%jct>1k1ah$xTL z+%vRdHzJ2Kgv9&$7h}E5p*T_G z>x;>2&eoAQJ~HxlpBK)xJIhN?tl@e=-V>Ap8~<7a;*N%&zvx=mzV9xHc$ z7{`;u;9X#j_nnK>IXDA_81TGm@Mz`!EK~{;axNDN?M9=Zs)KS`6=kN_5$8l+;182` za<>tGSGskSuQiu45=>I~Bhc%Y(YxX2aoBnM|5Zf5lRBBjN?c$bPg{pv(J+Gk6ZKb= zPYJ?H<{{J=3aW7gvCUScXhvAD+s8kk`tP0J|B1yHk&$tQequ)4MC>UcTE5^3)(Y9m zqBjHymXVgPzxlD`e7^q~o3(xLEv5Z`}_1h4DJiml#wZ$!5&?yD~9<6@cYLVlzVUV7~?hHNg(` zjp*=R*&3<$@=6C({9cl~nkadM5kbg-+nTPP#Vw)bfAqdqzd@D5gNX-jt5+1Tk)uDq z`#M5Ed`jR3E(KlSgyP)cERDEqqGgfr*Y$NE2c1zr{JcP;c3~KMg~B5gEkj`KNiTS>t2r=UEdCJku`9p7N0cQSc+)XZB% zmk~SvtNilnO3(Yq_gDYj`d{9{ynewyXb;p)3H=H*!vCcy+60ps^>B&793U}nj3y1T zxS}eLG`U$A6CN2P|2rm~&|fMv>!uB=>MpW!vPI0 zp}yGpFRsazg#jK;F|~wu|J4{@cL=$1p>V=~aJd4`GQr~z&xnqtZ~?nSdiA!`3vn$x zMh#0a1HUgN;q^eEf~-xN4jvaOqr%&D0VGr;09s=3FU&*6c67<4{8Mn|^68+&eEmfd7z?1W}gEmgDN0(agZF!eCW`-S?` zyg=zgLxNimJK4FqSE(R`xwzsd4)v}6VkPLq8!J{=JRU6G{WqP9Y$+qZ+gk~76`E5C zk+qXP-bgrFHZVK0dwBCSpPkhF4s7y9^-UZW*VJAbKFl_@j`PfXRjeW11&xL0W(cVF zeh1{-Bq2d;l-S;=lWu)KV2x!Zf;um_!N&?4QK$xdOtqyY^b>|4oAB2W-Q?c*j;v}Q z_<#xxa2+xd(C)Fz(lJ{7g@KlXjPa|O|KmA{yNoJOPtPj{akfFSi>blt-n+ZxZW%T4 z7RyrShle8LhRHe0@_+jNhurlcv^+L+i`=$R^5?f?G5bx%-=%V+LPvo?R!A*aP_`ZA zAX#boFKKht?$mQOx*Eb~SGT;&91Gmab4C+bjM@j?1*GI4*gU}oCZexCxolI0BC>=d z-t*m?uk!}xsiD0F`2uPDQJ7!sutgQvU<~yB#v{K;qM6J&Zr|d+G@u%;6)=lz6YU|b za)SII0WS1Y>7v*??ncb@6y)&X{s$UGhjJN)Fb6a-XI|a_+764S=}1S_tPJ5uMOx7o z+}d`ZMS6Pv1x|_E_peIK#oK@42AU*8MM|)RDPF(0Q5hyCrI%B3LK`vkXSoyhSMK-! zjje55wU_w$-PR6C+IvwB+@#F>`Z9Dq{9ToD-4E}fv0iUH0?gib&rsj))(^CoM|9#Q`J7jM=m{V#aqNTc|Bx-j^c0f_N`o<+aEH1WPB<- zhs#UTM}I7!$%pVk!1G*hZu{h(WRQ5YX{(!($oE9cFQ2O5P||fJPmf zCtc-w5viiV3pI*Y$Vv326ZfJc`*(PwAoesiKPALu%dt^s@Wz5J-o`G(wF1NMUG3-h z(n%uFPb+irUlF#!4;uP!hV#FP>P?GAjdoU!Nd`9NHk@PIu$RRB>VIsqC z4&dCd{F(yBcipJjm94iYA6RBM3^hG;#dy1k>30I%>Ry&1AeIH=mAp5r4^hUgv;Rvt zSgrgov5Y{XQ`m2trNssagou6{+EU*Js02Q+=U*QZOpaO}8T`=LUf*apPCp+MoHco1 zg_1E36_6U)2h8{|6RN3}dVj#kYPU+@#K#4A`s)=H8w|v>wQvj%-pwRh-+lTm_6QbgmO(DME=LutYZSL&u{N8W|g# zocZ!V{cS_>4b_<`MP6x$B=$uL1TcmvUyka8ieD&ZJHN zUZ7#b?QdX=)FSa~o89nDrb8=FteDSxlYh2J9WGqEy#NS}P%}ZdnegynMSNN41-^kj zjVSPVX=13C8!{f*9zpCM3{ZO6Z_#g03I7Pn@`dXiw~o(*FVB(KK0OXH6(D9%ov?}a zD=!L4;%h8^vdf8OfFOIeFxy!|XN)(<;3OI; zB*3q0tr8v25gRjrWNRnvK(GPq0w5SVRS6jzQ`{nvCB)X)kl`z$FI}Dw)A0k3a+SV_ zGaZ2Xr~r6Mw;7?VD08Tbvhpho{C09eKV>8sy+R}a_D2RQE8ZzZ%EaOYW)M8C!ME+0 zD;5=`TWg$ek8k!Gtp-}=44%m`q?Mtvg(Uglyg!NdLn@ANhZ;3Yz;W5DySiLZN{h0Tqwu|5rEi_y~mN0hA<53!+X=W?tN9 z=^OS*4M$|y+9|%i>#g&b5MoyTF^saJ{(}q^oeNIp(3Ee#l(7VR%#m*Kk)e5r{$2Qc z{pkDPNPNfhDf$vd{&{!RdFY1E&t!{uA^?#t6Lc?5SHKkgCT)ZOhbkL{s{H$1whLQ~ zbp=M_r>Rg4b)O_Gi}fCdh+#GITsT^6zE`0}&UJs$#yb^kF*cC`0|qVrl!++KoWvlW z9>pbdB5KcZzxSe7GY#S}S)w74xK|ZR6rRPon;G;~tJtai;vsFAX-tw|)0Jm0t+?_A zD$QEl5BCyIU#ry_CmU<$rjYtrtS5OEbtZHoRZir#wKqkqzy3nyekp$V;5vL};_SBYi&^rPQFnN^ z$s1w!ackr8O|0n`eeF*qS0@F_uw2KtKu6Z2JSGHyOj`(kL4MTUaPK3ZV(fy0J^vQ5 zD*h_+6&ELsh`zCjS`m}}CUr^uMYAK9{Gsh_brpkC;-T+ht9Qg2R761GR6)>6&|~|* z-2C`Iyt6z*1 zB#w=Z@(ljwVV4d6vQdV(+L%qh#^Ebg7f@IhB2lt>NB=|wRwboTY~Fnu4+!naI~A30 z>Zorb$sXcF`2n&tl)YHy66~Oxnyc0*jD#*1x7@7_fLH8Br1- zG_kd@W$=8htb^2&@}`v83KLPqCWWc4=faV&`K?c1^C6ez8_W4J2Pf|kFApbsKf?zb zT#=49#05#tW;2DPHCBQW$dsa%4*Sw`Pm_n>g2KMKQ~IsiRNg$pnNV7-llV>H}LmM2Zy!!a4KMD+VMy^T-44n=%D`($b{zZC&J$4-> z5&SdYeCR~qaD!^NMwJ45gE$@Az;4N^OauO?`}=&bt*Q)VX_8 zRJ8}S9u*5OMK%st@DTqLy2yxDC>x~b#B?QZ3@*qKm-y|`hUkqNqTD^xiJj2HR@f$ww8SYsp z?ZGkWfj4@a7z==haKI3bLiLY8Tg5r+B%||uA+c52d7OFc(b3{=r|EdX{FcNTxYM&f zsX!!4;(%9eF(EE5SG8Wijw8@kLR2I~w(YEMdgrRqhia~0(q)NM*J-R3a;0m~_K|mT ztae28MDm(PC@4w?&>d3K@8c7qtAb?+H^)u7yNw^PgI_b_m>MG)p}_lKe*h{RDi*5u zS+mqz2*a(hjfC=gNI2||Jsu%AYE`Pe`6DfWAY+%CYY)tx86A4U0hVK(*%!M(hmdPF zAOTv31}z@+I8?+a0*s8qPdcgFA6?7a{-H&Ietq z>+-J=%D7ZW!c5(;&K3Cb2WUr}z`uN(Ruvn#(V0r405h3VkPv%1`E%!m4roq z%Wt!%-FFpe7fRpn46<~!PZqAXbFY`~2+#za%K2>nVAM#-n|vvMK5x0MBd^kpc*S~6 zs`9QcyeC$NuP$Ko;mr4&-*7^#1HzXFeqvLE-Gkn%R6I2 z2$8baoVSUC&D`z^#?SRBw~D?~6;#l){EGPXx{4@wMXJNmC>u?p<>SXS)ovQRO4J*4 zkf))d>_URWz|PA|x6_%wH(Q^33OJc50(fPlrI!{RhD+q^)UBA2zg6HSz)69C;@^7a zL*+CIVlOG}EE?GYHlo`FbqB#4^PN3%9~789CE2jw#wtZd-%XyKis~kro}6OGsgCxM zDExhT*BsHD@DLwu>#a#QC-Pm!&>^{e8(2WbL=a5&5a|7KRMNgG+acuAuXyFU<>R9k zpyaG=LAgsE-VoBYz4Pk2wbNypX#iw;;_i_-LNYR;GSQVhGh-DUHXFt_^kfw#P?c-E z{HZ@WF%#1h_lD2?1K)Dj5n|Jz%xG|nv${g)( zX|CS!hkEcZHnK?BTN_SY!RDIy$vna!EL%V>y2zm^|~=lV{qdyislFDVhN+o-zAsLjoo{2|vb%d@WK zcYfl4MftQmX=@=<7M+8iw?=df0_`QaNyY6>yOXNu9?#>ng}9)**kIxd7Z z6v@z(Dyn`BFi1)XAchiU^lGUAn7l#Gi%fYfFJZeUgn)aG`{w>rM?&K->V7u@x(G3KxIQ##_a4Avf#DypEPMQ!43_H#Cps7Xm#tpJ2sv$d zRl=R1688~9v9H`Bu`>53+Uz!0cxfgwBt=(nW8?!o*#_p$KvA#tMa#Z?=KT`W!uG|( zptB>39GnS?mc;hYLGHB3|KqmBI;+VWEIVM!dIWKP zfK$Cg_nmJKW_lU{3B?k)1Ex~w723(k_psGu=r-K&$H5vVf(mreDGC}58!u1%P*kSS z#^aVj;JLj-d1d=;cOudVPZ5bK(Z)Kj8}`q(gilybX8wlxZe`ZlEy1Hzbl*^UxjVF> zu3%VEe4`d*VRwKe-4fY)d%M~;rW8gc!3gT>Bo%0wRYuph?LSyWp$Gv&57Z_=1sc3i znGotl$JcbeF5lV{N*{%?gm>0TcMu#GPno~c{Ui$eh=E;?a1vbnmU>*ol0FhDMTC={Qo$qZ~KnKIirvj%2BU4b7Vd1u+^3l>>QZ(<9r*y>d zHy)d2EpF20+&5~V-mEn2t!(XIN8L&_Uv9i(2Rt1~GGXR2_yO1eF43rkC-@MMh<*Vx z#NPhzC3hEs(%m}0hiq>rP=P#^-uxRyo09&|))D@B^GIJn04}cbRcuFHwy!L&nJTT1W*l|ACdU+;?2JAq>IPGrm|2Al! zBcvEUzb-@(>PF&PBs7!meoe_*YBw*QnJHd6^kII8U(-e7{tEfk4-~Yb?+kn)nK3cq z?{R;Fvo}giDyzb*ZKO6a>-5oOG}TABRWx364Za>%jo}%JmGbs;h`S0W?N`eUTI7{z zt!5G|gfVcHh%r+tu5{dn)_%7>|7Hm-#+R%@&-cim%5cG9>7N>bd&lr+ExbAn`M-Q66Rmi8 zSJ+7r1|qasOCtwM_0ubMfT#79Vzuddar3g0A9@PYWHgt!bZYXj5yW!V6ENuU(c zwWvVykXn~gOh>@U#I^Ual6A5EmNnVVH_o`*=?%#4C^#d9X5eEOwt-=IEu z@(T;}qaj2DoYxVj6IaX1mW3Mvx*h_PbyHK5b-KD|I>eju$d!3>&r`FizwmUXa$W_$*8H{->brCM0j7{!N^5h{nkZ!`N-$b-@eUOnJXyyn2J5_ zhr7w&U)is=6xGm>639kl#(v!8cO73p=iQvjuZ;L5A|u5rDt^^HD)=*uJ=wWfDDXFm z&=xgIDO9$HLNdZBY`u3$B}A<-S0gZvkp9tiYdQgeNZ%de*nK@D7TQd?Yj?_9_&{$W zR=XdE&%S9lY(v{0Byu^Cs?Sjx(QJ6@ySw|>FvgG{zwsrbx;U+tqc8~#TdZIC_KK~{ z7-r&Y^)dF5!I7cYnj9*Mr(5X6{VB*vRO`h*Nv$?`h^*o&vpz%(e8hDJ;S4 zq{Uq~msFr%l#d;2@VJ|Ti;K{Z-SHJasT7x=4!6`uSN3rdwJ5X>k1UOpFCC23Z_Q%zTJ<95IT>~iTgANjGkD$42wa~W$)Eqp>Vdh%vF*P zY5La?4=|gOl9ACH%ZKwp<8;mOJKvsU>9?Z|7VRyLdXpqqei3TsdGr2M^+Dd}PpYRe zigrWd;$o>K#Uw?Y(%z17nW1l~Y<{refUP_&KXdY#;l?L?+?&|-dl(^=PT}~33G0~* zhmOX*ILAlIsr{RwKcVr$;s5n)F}?s-04*B7oh5k648*{B&%QuAITjw=wlD9Q3XDvk zj}D*wUYj9I#zV;jCDRtbm-QfcumO0`%Iq4Dpv5#oaXhKf@{cb+Ln{fv`X%E`P`$Vx zHT?E~x=RfeBO**8Z(?RGpY%K!1&Wp^ulMIRD6$i$Fez+wDGw(byZ8b8M-&lvl zWw|6K(~7lKT?|@kGe3BJ*ERj@;TbS?jQ2ry0+m$X9lHJAF01K+E3FxL~V@! z`R8#X$v(g*b;27!5dQlIG+}WT3e?&wP1(Dh>Y~>n9dW$_+m-N z;j(1yz%XA64xu3gJG%|*>bGF*VPuLl4`})x-{*y9BGYs@S68}29{X@&;&ukLf8r%N zGb`1K^f-m@xDJYDM1+AL;+%_&fvsxLeT1YJAYzWq^Go( zwWjrVbCoXIX*!&%&ev^X7aA%+{g@~S7KQ}CT=Fp(fr~hm<1qg(P6m>x2oJIU7IMw_ zExavzkCh@;5)&_C5*0A+=v2YPfr)sX=D)2fnf;2;(%Gizcj+U&oVas*c$ZF6E_Pgz=8&lNb8y?l(C zZ)u%dNb;(ulfGC!s!&(AKKa7L5a<1FkCM~)=bpsKaPLr1ed?pDzGSPmSC~}A{l(D| z4$Uwej5gHJ(-+z#$fXcnwxGT>2Yd-*%UY^;$?LxQIdDvm&9~x{*H` zEb}#uE_qW`Ob8~2NwtvOpFa!z6Qug$lN#&$c@>wiCuDyw=O0YO(U=%{Au&PnidJ!n zU%oge;)%t-)DRJQDIy<<-#f#eCV&j63l^awL_XEByBmxTwy8IQ9wQ|d=2|y?*VeUH zWVaU;{(*{&W>f6#>tbbh8@fvl<{R^)j%w%mPQgD6}qBeX902ik(AH?nP~4UN~kL-43ku} zKX5WRK*K*+o*8NCNXf0t#H7@izMy1|8Z(*`J{sZ|ZeXDI3}l>t)M!0IMq@JHP-yUo zG!)09wiNx0rXwhlTn&3hETB0e#V^Fm)>(i(-ebtgqxNl_80-nzO?>ELcuVd6@uQcA z_ec2%SM)^-FFkob&-`7k4nBTiPhqxVcU=!FU5_FTi8lfDhWm+ucX&08y|1I5tUbIv zFFf5n8|%ENB&q{F7^jn7P*YNUSF>o)doL#+;B=jf?D{ER;;%;KAcgqCyks}ESkp0l zC1+8D_$5g8QZEf@*)G-%Ln=uz4S+&c(+2g#)wch}XiH-(YO zOJ!OqX@HO^X^3D&$cPpiK1Mc`cK!b8X4{|Z+(=f|V%ts)jLYT*---JCW1^R$LJY(t zpzF@t&d%oukI4n~$^XHppw!7fTrJUel;Qg@vlK_JK~scsfyM?^;*f*e+WUK#FO4&n zvp`0~k1cK_3_2)o5$%h5FgJ9eqt94bMOA;aT-R=2{T|W(B{$kNJlz*XVOZSHf7;>1 zlC8J+l~AYnYc0b@m*0~~p|b=2v5_+FVodrm$B9w|qDcs-~L5L>*=Kj%Nyg8&W+9QpePL2(wFa@&7&?x#-HVwn(wjjv+2t zm`}C7CX4(JwQ&2;Ytd&z_FZS!U-m9X`6t`W&d-kxy)Kt$2f@QDn~_`mkc|FaaEg7y zF=`tnf=^dVeRAq2H+JlV`((6aAshMR`{By5_BMk4Yhs?j6u#k5W-La4;$6BhSf}mp z(I-m%z$ieI>ktmxMa!zAep-N0f0boUjoa`ki0j48-LS7Px-xWHcO7UXdm;3ec?;M4 zWtkuZ_ZiItT<79wFBMmqTETqeS?ks#tF$sdQR!!O>U;9RJ=%DYDLx(z4VOqgf$03i znvYS8YWV#|*ZPa6HULUD3>TDx(}2&J!oTvW5(*~0Vt$zrx%dz{7r9Z)gAgW~VOTTZ z>4pfYa+R3{-s4?gxYDm0g+nLo0ViEj@a8z=6&4`nH+@f6I53A#HF=6i zSx&KdVgz|3=b7RMc;PPK4vNYl!Pc56sXV3N$DA~9E!S`~pZ4gB<{-QA&}QP}RY_XX zbz;ix1Y4!3mue`?pTF=vOEHPCu-(0O-0CIQ?x>;&)I)|$Gk#;^{C699WH35g+mGhb z&GA=Qqr&iMScryd?0Y|myPGRrg_j##9tW(vffm#Q%E=_kPJN?@(LV0jWByYkCyNO* zN(@MH9xr*vF2^PsGxmaakC!biUBqeJ2Ai0DuVwd|l8o?#t0}+RIT?o45HOC$kfJNwE2$ia~E02d_a3@ewnC?DP`qF=%XIjVJ817t+uhn zo`T1h>fr~&&78iRB3pxV^$57i{>2oTKy*x>Xgh&I%TL_3Yii2jtw;t51lfZ7O4s!V zZo-FcRA#`-CgtFS+RqPZa?+;)X(05hH{k8VWv8d3>bKs=b92x52)RGs@|{_|%Q{jn z*O4tA%(VTV1+m7SM^QZozM=8eYk5@NVe#jtJXA@<-*&NOm6p6HXf%=>F|ZjNz~AO` zRb#dKgij$|%(49X+dBZRE}Gk^2^b{{blE2F?s&L;egQ%(kgYU^D$66BjB3>M?pG+0 zsy07R<>_8ZO#9H(K;mr!ZMuBUd+xq?k0a2cwW^pO+Uj{!BDt3*e8KJwr}6_?t1-CWmbJ5e?H6e? zrJLChaAMCdK@Yb>;VoI}^jaLhJNHQ6wy`i0P^)^@|M8mcBLvq;&|cTfZ=c#tX#`3Pc9dOIg>cJ-ND~_ z$tLvL3?;QN-N5bxGBhBkIGmV7CbZ}1Jhq7-^MW3-ySEYf+ujKce}k(VQ@N<`6=+q? zY3lzqS8YUuZ~}J&nb=>B#OklsG9!6f&rs^;6c&|Cr>PYLTKpU?U+$6Z{XD2$U(5Wv zc%_*szB74CJaFYCQSXmzj~^;scNT^rn;Kyy6V12A>u{hw8u{X2vBn+0=_E1DCow~z zGH4S)hmyKJz~ES+t(ZLfiiCRR^)c6wSX~bk7=VrcR@_9V8T~4|xx=^x^RAQ_S;(j5 z!awZNYzefU%?dM_?}q;q-Kw|~mVQ*xhV2?Zw>% z2vFr&dN9z`als1{E0`Uo;hGh0Nm5eQ=yJn(;P2DFEY`X}QhpZ-OvunA{Z!;3H1nU{ zq1Wk%x_U;?=RYqs6z^P*Xq0G5FTehnmnHgN+(PP2+??p>uXzXw)lcdT2hF= zicV+OH5|EIFzw0HEM=4FS=nIuCu<%@8q8y0B z6_julQTYj#7KFzi2>!rx06jp$zeh!X=J-376#{7zKB&P~sBvPL)6#VWoNMwI82|KJ zi$8Zf-e2x5Mipg0P#2XrLFiQg|o1D zYReMt?j~HQ|13cQ*^x6Jga$$GP2X1iZ!ohO8)n`KLoOE&GUE#{758XEW#!R zB?WOtNoj&YLNs1h4vL?MhtJ_cW!N}HMEu@5j$}kn;G?zpTp6|7G;0`t=XuS`yMlTi z`P2FZD@+x;bIQS6@5}KPwS})u^LFT0p1k0*v-Ev(z0XI&Z>{%+?Y0ivZv*r<{i>>MXeT)2Pv?>x38@x<4ZHuc_^!~D@)U}GUU4HYA zk?+4F0+2m0#662o!wf?1ng_99H9a%kFv5s!J4C^qy@8k!GR$Hp4|}ORcY6Z*mfM|ksUl?+BQe>vF+PBAi~+U{sQZ2{Bb5KRpo>J+Z3{q1^jbU} z(a}9sT-R={2YzGW-4E7H_Du9mL z&QMtIU6USo|Dw>6_3F41i1mPml_$EzFH?gpy41g%e8?EN(#QBqJdw%XICrdxKHz-8 z*@tJ~eM7RO(IuW@xwCqO7fbALwC<_r$(x%#8n9&y$*ECX0ZFjBS@K-y-tLLrTCUP- z@qfb}{dIVFUPzdHrzA| z#&a>Vlla*>$e$h^?!DrMebD@>ex%c~JA1HTW0b>^ikCWDG^NG*+_oaZA^V9!!m;qN zkif8`(v%rG=8OWTu=L%#SicibHPirA6^%NH_NFoj{NA`z(3)vk@d=!yH=EFL6WBF}`MY%jk4c{ANm|=XwaIx`u9j~2PB|@bDl+*l=apCB z>A7|;ChcKC@EwA6@i`%IV%GWGmL@pbmB5eD6YSP48fb_2ghw7cv2OjDb!C5B15I+y zYTxDw_Q-mY>i5YWeH!l}M-pxX@OaYTf$EE=zyy0`tvGG@9-Yl)9bemgSb+=g)pGOn zruTo&#Ig?xtZo0bV4feZlIW-C>f0A7oia%?CUGdWYeix>J ztAm6rAifOici&LW15i+vJK^um9|nSfXe>bef>KR_02K}Qj)o*s+oc`{6DbML>J=5Y z%OE^|1eEYyNUr>|gUv7eS(5*xjT?}_l#EHut9$OQh9Cel+w!!Hi>Q&6$Qs|=Ru@co zytOQx8@2d!=Z%EuSKw=;!v+Zri9)`^c%VNyb0hZWor}bQgy)lZ((mlHaQ7JYdUwUw zd6XsF7nz&_KQIG}PoWob<-;zW+t$pMlC5uVB;$L&%Cy9U_MtM7o2VOfQ^#=&+U0;? zvU#^3k@|5#XdUg~XlWY%DQbn|EIvtMXT2}gGF-y&+RtG!DHJv;(V=1jqvrHUE%P$|4#?j5}^Xh-j2yqUm+FZFwAu&^B%X z`@u-GATqoq^6pdE$6xidEO!H8q!^OK(EeCba5ex_M3V40-#D7Jle=3!l){k5X!SaR zS6W4Ry+T<|j3n4_NjyE)gkx;hB})@K7az)XGrBa-5y<@k1-|ZF|1McZt0j37kODC>NpNp%?=OB*)8NIwAY_=2-AV|Ic;#fe1o&gx^$yCmzg&B&U*4Mz&l}^3w1^b zfY9c6Ve3;JTH$-3IyU&Or|%b#g4J)?7EBy3Y$kT+SO1>e5t3(r!uh%VwG>$dWeUw; zv!%dU2>(|WDm;q%g+VSd^yTQn8-Qx;*o%TV`Z=qMigO@)P_x&q_qGrH5-u|pu=yG|HkXu?DOc%Lu)!Ui99`zNlEwBmg~esQ72Dx>gi*0;aeNT9~* zY}oj8z+Z2lid$xeE5cyL=+4G8{DI8+6a6 zKAB~;)GdG-knPc*jAxkD$Qxd2-}_Z?UHS-5AM=Z55^p`}5gZ&$;I4eZ*LJE-B!*`6B{= zuT%z7LeZS?KvLEupHz7Oj7)rxug+VbXP6NLVg!Zc%YHp1I>*Jp!=_jlupERlDv+W= zm1y2!!W2pVp&6weSt1@@zDbP>&=wf*ipC0#AzMd8h9?<ME(>HeEV_w z)H@Mc5@n|Gv;ftrO|T8)tIq(lZ;f4HLQIOjC6iH5U1WMr&Kx!^;-`~+DI7>t{4R+E z_kH`;$5HHI%s@F}pc+L8%V%M}oe-=nJ3~lJE$GeyLJUqw1MvNs7jN~p($f!KaxLiT zT?8u5ZeSEI?gdCRzUgda^1cmASxz5&uJ1Rwvs&)JEt?BAYxZ1c!C@>fmv!d^#{gIlk3eM*I(!BWDWcB|B_{;S_H_ZDXy-d}^HBtj&;A*(-$3&#)t z$(Y4De`Pfp+UF+)G+3H0I;K!uLIpa!szXwnR_HvVMr6 zd43Mu^e4mt)izz+=R6nW_Ba=&(lTZ|WL(O_)2LlvPYT=-uVhJvPH%5=}nCb1THwS)A!3LoXUp0lHbDy4)J@Ug@lmdDqvA0$P3$&Zh16f zXt586KLZYR#%l_ubOCf85l)cMjBFJqm^e_+NNn)WdtDS5#}l{CI3McbKwcW(f(X}W z8uObwq0%yHq*VG7Qb`JcZrirzMo^rEF{cfLpUPC)LR^z zgp;8nh_fHKl#ziPNqrZF63?lef>3u0=evdVz)D}wk(00GJi@|%#pD7>;T~oUulXR< z0M8CgJjuq_RvQUS9AC^{F9nUn&q79EIUp^df$Lm_*a$+k&PmzDv?7V4KH4Uw+d3Hv zt%<0=UllP!ZpA&AZ??J@pf;%5N7{LZgwbFl`x^xl#VX8Uc`{hXUD9Z)3B5YIyp~&`9V4Z5s>9|c!Gsj=RZrT2J`aHsFvHn1V0JM*{WgG*+(i>?u1lV! z+-+IMP}zhj2Nx~DcRR?(8=AkK;O6dORl1Xc16EG7#L1elwFzYdXb}fTc&tKwaK{G* zWVm*+t3nbTr4*Y4OFuE-*P9+gy6{is!fc&(MI!U#yaCbu;p=~nJaUP0!ls;$(=>J{ zd=Zzl^$X9f&k`33B(NOGa_Vej~ znPzcv$5k9VzrccNL||-k^kqd%NUak9w!&jn!W+heh=bIz@K|6@Kz)d>INn~6M1iDt z8@K=Oo^B^$*+)t!-E`USV^p{ZR^k_sXY1mEB}B5n`8#ljf7AFdZi%&b{^NgB5d05> zL*l%;+>rc^W-|vWm@#|_?i75-exfTyAT2PFE}`Awj!amQ;pxrfdy&(h+?d}h&!B;K z_7e>PXSm^k>o@u0sn5(LG>1o!u=F)o_xD`r`cJcFv%%LfR8f^@uhYoezf9Bq|7U#F zVn`f-P&$gA4>Ls*B#hd$M}n1b8{Td!h`~Ofq63~ile|QmY=S_$92(pNnMacWC6bM( z!Ws@6uSZ_?rvwRw4q2}gVBy6I8dp#aO4pr2tHn$D#@9B{v+qQK9PtlkF+!fYOKQ}1 zk|A~ywYYv{cX+P|b=LP&x1Vh{&P4!;41U9J=3&}{u`Rw$zJC7yY+#L>0CbxotHMfw z5gjhi@t}rEahTMDg+3}G4gtYpWK%=sSzvbY`M8nA2Xz9J2_9BK_73ZP?DyP6a2{lY zlBSSZ1T%0*AT^~#eY6xB8dem~tBYh*TJuu?g2RFmgZEBnn`}ll&rmUvlNe4C{4?E! zz_VEY2MSz;Kkh>GLzmOpCIEj5ik9|g1|_JXIj~rwVQ;s%P=Zsh!=jevf!A#kZR~fS zpet`kD1<`Cdr)vM;(7i(oFWnx(pf(!#*=kJmBa|-wq5K-BDo$tcruv5{_UpMszAP= zN51>7vSNtrzaYTETib?X00;(sd`+c&E6W;IKWjA-G}3+rr38gH5)wi)w&BXh3E4y; zk?Tv}+2_p+f0`P%&;nFbsOwW}+K_0m@WjFIvFG&6#gOR8{ zOv<9+?x3Ab{EtkjR3OMOhf%}gjnC+XEibAv(13(MJiQN3Wr&&z^dygR8>@rs_j^z(gs}qdE#Nk zDE}aniD|$IV~a;#(eL~lbd)wpKn>(**FKl%PL`&Uf14`#W}d_dlG+#ChB^n6 z)4&@6aASl(2=2Uxfj)fyj@K&#AsA_I>B^O6pW3AJ^7wh<1FXaPf96P<7D5I#U;dDc z8|cgm%}uYh+nZECf(wOfVZs=p|D-=wqQdrHNN5Hv5(HGrOAg%*-DYFutNA2*P8eFJ zlRj?Jj)RjG0gC{#cEx-qGr@ITqa?w4NRVz=c8gfXlDtC21QvkMWQ#|J;^Ci$wUG1i zy`uS^USrC+CSxl~E~@FhWh739;%)PxD4akZ9SMw2DSMwo zIZ@#0*xm*E;@#Ky-R!>!s^1rHc6n25v@;*6MK~nM!7WkuE8M`yUgrct*b0TN zkxj2_AQ@oT8t^F+=o?)WMA@XVVg`L?R#G}6xEPE!Slc%691vyj3FiX-T_RFaYM3+s z%XzWtkB^}vruHz8j??eNHLsk0xApeR5fATznRacM4H%ur!V=hXc-|*VhnIVS7`#POUMdNN*OuqXsY=0wYiq< z*feRM^8IR!gs+~{#}5r|=3%U5j+y~$(TjOO5}eG(QIF`HKfrn7&}|$eOc;gt-SNeh&px_I8-b~sPJG& z@1L-;{|mwK!>+$5aQ%-*QH80- zAdWlpws2dV7vKItH#*PHXoLDeX;H<_vjZ8rmqEfyyb;cL971_K<3zbeI&j=UT_94{rcI=Gh+E8|jzwH!Qb`g$ z4W+ZRbiC};r&kmt@{vr;Kszo{U?jIBA78iyWJc;GDIp_dzv$Q5!Awo~NfNR@v+^On zupn=FH4!Gn1c&7R$JSd%MHxry!tXG^(A^z^APplOLr9l`q?FX4bV?81AV}vBf=Y=X z4bsvKh;%p7-SFwT_uPBVx!+o|=8svE?>u|&=h^j}+8oCBlooA4ISX4PEod`D5)^X_ zr)oRnd3Z)M2t9diWG?TuawZ~Wo<=3%|vIMyPGo)ga;Du@tXGlG!VEG>U^-m1v}P&cLD2EI{V#?{;G zeVP8As#?ukIsD#5`C?wF@)`bq;Ew(xcWF6KMJZ3Y@Igp$=bL31TI2f~+R&_WfQA|F z9rM+hgBrRr(l*r5EqjmOFKY~P&v*(dclgA$$qM-!aK?okkI99D4i9DTq8K?rQiKFs zOCT=*M)>FV_g^i&(u>%@Jhs@@x!38Rg&;QMVjl8&u+2y8zoG>9uYA#dit{K_0$I6- z@_#<|Migo0djR&pT3%$pylcpF9kHg!LJV2stAz+%ZfksCWjJxA5%WpQrXw(}R{LXFdUe3>-~ z)|9g@G@L9xHkN^$m}o=D_h@|H(Ae$RD<#GDC0vNBhI-~(P5-gGW(XZ41WhT05!UN_I6_jvWVP;Tit^-3_290rQvSkH z0sm!!b$`Qm^|uVzCp_s{xX2bSH!aAW{@+Qq7)YVukyxF{6h>*_1k+h4j?PL4;@v0W zGN~1DW}A?@;ip8fHR})YVw@{|n|AKy(R?vHOs~Dy=nn4$)hvb{tv*E)w|w@il~T2# zJHP}R`7oNFCWY8{o@{Y&Yyf*ayZc%FApekB`s3^8|EqDh>cD8QRkMXGr{=51zy&{( zEZ=##*NpFW8-6nQZhZck8*qM9lIydU_&m|V-^a6IedFP+n*;#u=y#z5pwu&viyxu8->+X@b;w2PvV9xVY;j!W2L`q`yY1p#d^mSQsw9 zb3Q%yT{mq^bH7?HxRc*W(o~!`{NI@`Q%EMTrO)nn{OnbK*~_eo9mypT4$(|@q|8*K z_5Af3Mm%uJjn=QL0l3qFQBeR&Z)K3G#zTt@L6PvHg2TnlZHIF}wu<^+cI=i)#pTeB z2yss*1}8uoF8OGn@k2$QqJ*`do?CTK%JvyzpM>A-%6`0?R?Q2_7w{+U*b)1*W4=v*&|nm^(sVByEKO~GKcvvO?>4J^R?8%%s<9wE3jjSdreG zlNBC4|I9lpjrW$r;R2JwtwMS7cnhlIplg-sAx7cPTPbO2EsPU7V~}eTT3jgEG@M;^ z(KLeTK5GA9lp#4V~!5-L1uLSiY^Yh+;B`pkGkAiPRdpWP!pSgku*{<(F z>#8D;MGp9^&wj81@TYJfr>b2ML5>YB9qj3TDu5CHRty@Pt%IFvh*6LfnxSeAFGYIe zP(jJR3WBztV)N^DQlpW?d1POyKkK0RX~k>z8f6u{L1<-+rTAA>_D%6pQb9pm4b3){ zYPljuIVH{W*WqD_I>BPzSM@Rt&HjFhqD}97f@C_1+7NshNbg(fAh_9sxy<8DVgR)u z%?-poM3Jc2(&9sL31@?z5%s8{p^$MrU^rWdr{mR(*mLx!@4m3ejEWhB!e zM*^^#PrMY=nUaG9XPMi6QPRK%nNPhgjujiceS&d2(KR6XBx3MKWqXSf!#}65bkH)t zP5H6LZT{KG14cvjzxF(dBz#@j1}GC(^R$1 z?_K=2l(0MdFX~);*C5)s6zWJZFid~jt@PCU<+Y#Avx?8b)CC$dc$Q*K7qFMt8&93^ zcgj^36JJ?RK?WU0H^;MZzI>N3_49jY?;N4AlcuY0SE|kpic1U!P<|N+RYA(I5Ctv( z>Wbn}Ea2Qwr-4TRnV2Lvb7knLSXDPbqZS{-%Ml$lMF9Bk8$3I&i-FXF5v?g;crJn+ zLn*>D#~aNE6ZPX4sQiiO{kJ^q@kQW2aSz*Tb2@;z9gWPkCmz&?*gZXL+AL@4cW`Ph z-;;52{B>U2wBNip>{&PO4Y8uFTl60Ii}==*&rh7`tn#{F(49wLZ;}Hv;M9Z0miZim zhBIN^tSrZtlT=}^xyVW9pF<)GT_fkhFxz3I;ruewJswFp+SXz~pULyIP#?knOlqKB zLwM1U4pcS8C&)n2ilEG4@WW`71XAZmb|Z9oPvrv#2)`|pN~RMBXsoj`^^-}R<5Tsm3bJ?5|e9xD;>1b?79Am%mQAv zgoOtCC7TRnI#&azVA+A}Mngaf7x3vY22gi$@>B5oCG7_!QK0mW7A8u%wUsqHryR%} zE7pwzXb84~LNFU-?Uo?5n~$UaB{&sv0iM_8HFCfVFZv!6XehX12!Jms`;xj305i<> z_8@sKq1q077IroqOdkH4B+;0&joaZV-X>YmR0oqFZ6Rw2%kTbA9tO#h1=^pNh`=PA zH|j^W%RaRwBa+9l>D905RT^vxM#usc3208IyMJSdi1}mY+6`Z#3%I-0%Kb&*XZ-wIX_0wT1s?X+?r}$pGb}`Or~d-kmT3{J_%E&Y@!(RL({c3i z$FRlD-h7_>cI~RkvH|EDp}|IbQ?ZSHNw<#xD&zW_yT7+$3!DG%u|SN5MT7TOY!H+o zmg*$cF%5Udz^3HvD#K9p<>%ioQ+{u-{3QrzGxog-STyNWGx$mX&6Xj9BwQ#$dmF*7 z9LF=*JqiU4{iY-5L4$9ENH1u6?;BXR6Amc3kE7$&cl&BzFt;?i0rM5C;Y6No9CB!= zfDa3dl?{zTJSV%DuR^2_Uu9#mpDy}AJ~$zFb7;Q= z%d-vtC*BW5cH6o^HA%7}gh+@BF#ph~>Awepa??c}*;kmm(yh^Q1ceyV7@-$*<3tKk zK`r1QzZ8+ZyWw+zH*DRWSjdzR5GX#1-Pqz3dbs}AO_K%I9=U2`HDUlc-(H*c9Tca0C=VfyfVo1(~>qp@mtVpzu$+OLh3I2%xt!bH#+Cca3X`O zY7)FmJ@lyX)%uL0YRgu8A-(6K^7eS-(erEdHON`lnal(ZG7LO?jEE$O5NTu5p~2&_ zqLG>kJXzxid_jzeG?CV%Lpd$wE?GPp{QO;^3oq7ty4be}Su=J_!XAm8y$DeuOH}f! zzhrT%`q-L8j~xRNwqEr}3s-5Z-kgRWb(#X!ed5mkZj~dxoI8HNpD36;X?SQnQWFv$ z8p5X}G9(+K#LB_2zfK#;97?ApBuD?$)#_3ifImVOTD~qQe9gkzf%fyq{am`a$Rnf( z+i*y{p>cCzf%D_Bej-P>+Icc1>pdO@1S!OS%8QbsNYoc#!!;NR@u`O3IzwRZ;jmccSmyl_bmwJ4UN86b?F8n-E%(*ZX(5m z90tbuD?Lwa0*fZeCts!+;(5PnO>~;DwFq+^ijPv~C7RiOs?-XR9Z(;;Q{1*o3{y4e!Nd|GN}+iox05LqB(#QFX<7VJi= zgGkO7&@hfvtz&@wxZYRztN2q6vwrvx{Fj`v)-C`>#mfHmXAct^OsN{kLf?0HQJdZ> zS{gtmsckIf+Fw}!pltytL4TVGVxNp-E?s(5U`E|#QU%1r_J3K)C;EB=2(Jtxx9QF5 z_{TUL0-En>Sl7+5-FYD7hg89`!IR#&px49>>??D02t5|Nj|@iG$Uc^NGz3MNVIT6Z z3+CYvT?2*V%!Z>Jrv{nTgVVsFnd|=wEF~juI(keXDN0~w(o$RbDeXW$(we-l&P+Hw+;oHM8l#uRicUKhpxD}wh7TCD=+r+UKDBBvu!vHaq5=SG z^10+UaeqXb#;;6I+euD0Iyy?FOtr_@#{O{;Iof>DU*8eSI7pr`)4}*8#&cWkoTVJ^ zKxl9nK#^Pb$~sM^93bv8LN=r*SbL9ie@FfD@~eAMGOyEz5{kxWRSxF5G(rwCHNR{J$>zFBi|De-EmOP0uoi&v^{&)h!N2KR0sKyB#jMIgp&g zK{k|L3s)@FlUIHm8mbFX{wr8;M9TXde}l@${tv(}XFZo(L2$$NAoSC@m)g#ca3Jn4 zZq;9-oL!2{cTMNiK}gxSy)znNz=+7!_tBoSG;{k~fgWwiIn_^g*-UEUv&n~c+R@Za zhV&>=2ZdTgPIjViVxgkJ$ic20JEnXCr)CjH91wgMNsZXpqJ9biXymaLeOIvwkPY6f zP$noHRpw)4!(JK*s=^UKDd)eoqC2-d#wS1q`Al1NSZHc?D#bDZacsW?4$*5~w1Sd2 z!ij_-NZJzOr0?=Js5opmahTo{QFNETGFJrRjDaYgvgaBYRhNT+90Z;cBeMZ_H@dm| z)8y0UzY^F}XQM1-fiOSMhLpI$4a}yOd~WMF^}Z1Gj#L57$X>~hN|Ht&11SV+-ok7U zg=4peQOPKCT{3`JsXr5*rT}S%tL)rU7R<}qVG79PO?4cCXqnZH!?x<{Ycv~Q*!uG1 zRuZN^g*X9?Q?KKUzZOC*sa3d*PLAnavtkd*WS#}-W`pr9_9#S`N-pvQ8{*EmzZ>l) ze=)WFOi`gbSVBp*Jt#W1UGVi%o8yDe{qo%4-dU=kj<=$ByRd=i6SWIie7kBE0Z`6! zmtO`it#zjb!L{uQrNMaDvl?nY7QTL}Ka9Y!|EwL%wtEo@CQ29cL;->cdp8^Xe4eLCZ(^JET$3w||zkGYskel0=eZt~LN zJLiv?^aP$ru@iJC;0~%ifxCS`ufdYQy;dKyWkVDvhH&5e^#L=^%c0%L7cYC4cJ6LW z4rIzEkqmO}%z(Sn?Qg;DI~6?G>>%y!5MZPMd+-Xt*UNkMU${sWJ<+z!vl+wtvsq?D zPjf5R`S(cDLgrAfIZR+El-a=v<6Y}trhGLgJIhiT`E+~UYMt-Ur}EZIK}!DrIO=Z_ zC>F%N_}UZGxI(NfFW5uj4h)aExk87L0Qq4d^ORW(DTc5Sx_F^K_^dqI7Kfl;LMWKd z>AORh$c!)zDXLfFWN&Jk8KD=8Zoh({II_h+VEWiRTS}+YGa!D|gR?n+$KvLMSu2DK zc}0iz@>h%8FAFd-N*ed98aZ;TD49x5f)dh`mFz$XmA)LXMT7k~nXz1O)OI$1LkC7N zTfD|%<`iv?NN{%baJx7mJjG?oa)X&i%8&!@Fzq%Zv%L8-VvX`WjjVpE$JyD*IR=i^ zX(BobHeQE?Jr>q#ympSg;O7g5~o$WYIF8<%?z6sM%8{+Tt-N z$o3Di6RoJ+8t$9A%X1WUhiL{~?>dEnFp2LfSCW@)usb3cF*3f_6(b-tD2{g{v5OLWHZ$(RS_%tZ6 zeWD%SzpLs%!8&T>>GYlRWC#CO#KkWw`#ck;_Dk7I5m%n;S1r5)R=twCIp3v^Vnzjq zRk%tf4R9JT#ToVRfvqR<3!twy)G#4T2Mm<;&D$D|uXY6^U6~F56e)!9X?+h5rq2O7 zT?VI2px5j!etqstCu1+|1M}MW)c4Iv?Gp8HvgaRnu*4AJbGkLL%n$}{bg10_8&NuN z9PlNo4cxitQB>pd*jrpTjL*(QVE+mJ|6n{nWvk&-f2tqi6WF{CwVr;fqA3}= z7phc@_+GEpaIEib_s9Fcw3`epfPMnk*Tdk7ZNaTCydj@6sU<(rDT^L{aRgWHk3EDB zCnMN_7EhBENi@`Fu8n-Xkh-3b%>q%K_`F;y5gv;^T{1nG&GRXaT1!?TrIQ>LJf3jU z=%bLLW9?y~8k@Z{LSaf+JjKB)B$^PEx8k4mvq_ITj78AuFh_if^BQY$J=~3T;!7pqMwe^T_!E(md4`Jyt0Q7_3~i7NnwYDg zTY8xU|EOfJ%T7i|us$AlnjxAaM^E31S>wGKqoVBnl^vdV&_zs;383`HZ zx*P-Eku~vSiHC5Lda<9{e;irnH)-p|yTB-CqH~CoS;_T}&DTX`Rge;l|)c;)1D(@HxDM zctFX^)dhms5Gm}?u1e%U{h6A2&V))N7O3FO%?x~nOB|t()bH2FzUr0Gw@H<6&rf-Z zB7XIMX*jlpSUovhYu(l-l2ch{8N(ErS3TT~Kg$-kC`=S{v&ZEbCbDPLil=ODaJ zjW=y{DRO$%*e{tQ+^O5(^@Gh}v}}@*R-&MJsZ<;nip;hEMy zW+RF`riTYB9rM3aNn$=Dd%jinWb0cFO7()ED4`yb*SOqtb2qQ_%*Z}r}KLUj=%Enaz1I&&z$X#Qe$sL9cZ99WUI$6?Fo_7sWJG>U6X{W z7(Wj#H4eT#kbYv&{x8u>4q~3zSfG0M_^k4G5Z9lT1~jb=RbLUl@6YsSu1Yrx|99D= z3_OIkRVsmRkKsju*NBbCB}u#8C`xFZZ?@U%7mIRX>Rl>7nS3+|aV5{NE#`Uz) z3@U&AwhVv?#f6j0R~yu%YbmedJV!@z;yYLdJ7U5*Cz-Q8Zx3>U2|8NY?e>lNWI905 z1kS&(5`}gYkVz?Kdrvt(7V$FhpXL^mejSgWy2`o@OP|heWbTX*Z4m!}CmX~ELRRT~ z`gR)vBd3)|sRBcEC}=3rx9#HYyqf23`A``wUrbqxX{`LnXIw`Wad(ETFLB&iTykTr(vDcF5J28{)s!FJ2EQ-DQ*k4PgbWvyRYRr;R?3_Od$qavgj`xi?L^+Z zyu`I2#KSx6zTgM~<$?loL9GBvTK4bVsO9VCyOxeZ&Lz6`ZJ{xgAR^qY^ViQj@YZ1@ zd}9$n5X51G#IpeO$xWgz-8@q`OE5_ilIT|# z{j6rz>S`apw)VexEljT4*4_My@~YdrCgZah8DPX9r|gDhN5(8`YmE)y z*T?o&o1>5;!T?R^_0N!$p9I@thzW~80^}Kh`u%KCNo;=i_sNryASulAt!|L}Z2aEA zpYi2=UiyO-U?#Am=|BuXu^ihAg}!$*eTG3YM30*E+-l{pdrF6@Y`F;fvQ*!3|N95} za6xXv|J5@88I=Cd1NC(D^|62t5gDC``+fvE6tu;&SZ12TZwx|i2I0Da1(Sva-`0Zu zeo-_SSNmV{m(2@ujFPA{5u0R2Y}EX#sy!^tI^>X|LyBMrtGu4m{VTuBe5Pj0WkMmboDpB)Zpv`DGZv1E zq= zy`t+63Pn??7JK)}W}I4hcJE|Zc&p*L!`z@6srmc@l;`pr35+YF{+(w~!(XK@H?*+S zn_FSf=v&{b#+Vv{8J;=~owzEK1K|CfzDvbFL|*g+eEsTt_7}P7<|?RZpD%0W1l`Fp zWK>W>+3Kjku0n6^%xN_&sb3_UvE;$4!b4Rh=kHk2LY4#CRrue>K}E>uB3+waI~GK6 zp@b9(SeEQlWIqtn7_)ez&G6s>;!gyFIYkRPEDcm?WU64lr>Ll<-4B zS7<-nQaCA133RO430^u3mWr(Hi&*jGNZfZGX_adlVgV-B;gPIAhLiN2h93hhKN{2N zP-nkm1&yhpV?%>qmx*B2pF<|-pygl=*0VVp03TBWxSmQVW`&&DCcG2^_WWXOM@pM9 z&uGR=wbITn-0MqBe)=B#89QP?L&@H^9{f1bBn8Ut7S+V!w98_wYVZ;FN)e_{5Uq3% zlBGok{}tZ<1Mjy^?n~c5TY>I&?l7$=H6P0rh#r8y*j@G;`$X^Y;CgG!b|1102jEE> zR>(`i{x`R9+_AO~v|;!t${vl%# zyVwW(d}SdDmVGKU+3AjsO!)wc;Q8e|XmtJFjxA>m? zk*$wuA}8kZvv(PWqN4tuo-VF#Zk|En(?ir$GrtCgItPa4XYs$_C%I}f(cG{u#U3An z`NG}7N4ENOI2b@2cIvHRx|X~`Rzo6~(_Z-f`{+X3Pe$oDbWO`uhe}O8^%mQ^`#6{y z;&#N1bw?4`#{79YFU0Mni=H&PPZmqQMtmlc*Y9rsgkgj7|TUP`3 z+HN%=A4G3~FvA_N)nKd;d<;m@NV<5v-QAeSPO9Da21WVS3Kli}M8nS-#u@w`Ya9tE zj>)YXw1RzHpS5j)w<2st+};lXfxD}g;mK=`io$7pbes5 zLoGsTXuFWl(5{t3g2?FRMxTRD@qjoqgtY6_yEWwg+|i#e1?7d3ju*RUgb5%i%(LCu z@0~5qFfW@UTTJ9K0uzyYxZhN+0n_0&(twrLU)6a457s+QzDx9Vb=oSOcO zD}DZ-rU9J{s`aYrwiTL-(YiEv9D=Vm9{=}A?n?<^)Q4KX4~^m$6eO)}P4AufA27fD z4V(id<*|9GR^J_9^~|@lML~M6;d5+Sdrj&a3p8n(EZb1(=2?57QOa!K?;zC9Q zGR^gRunScm<6TOhvKyjDBi1|5?D}gWC?XEq@i^iT9r|ce=kM$M_RKE48_)6aP9Fhr zL{NE1RXlohab@5tbYtT1m!gR$NWlA@-zX6wurndJacK(4_E9XY#`kFE!vFY&(VJL8janw&*kNx-^kV__ShgZqGXBu zQp=ePek#(a{Z(b~4asK;Q)&n}BH_%kNzn6ioQ)qM<8j9+k2Or~ehypp&CIVH< z0s_f-9f5i1^`k7M&$p_q(eXX3d+PsUZQU+f}ok<+J+VTFTr-wyJBb z2+j88Zl|@YXbZ8p1}>-6Vz&3YP z?{`CN^|`a28zmX)8{3S5VF#rm2dsdJ*-Lc5L>~k6mtzc)+sDf2U}dUq`(wIe>L?P2 z|79R7I71LZG!d}65Pl5_?BU&1B+sUn!I$XT*rUez?^!+Nfg+EPP2ZS99h%(H5jHpk z#=zdx>ckFHL*zf}UlaMM!FydA+SqAU4Nk*{nf-P+e3>H<`kqsiozLW|M*$N#`Dhr^ z9AiPlq`i4ClHoB=R%*SUkKCNDY(|vy2f)aXEUbql6_4U&t&wP(!!xu@R}_})>>#t% zNH-};6#}IaAVJZ=g!aPmkov=#CfLLfmo@6QBsRgal}4C;lFty9(I&rMl(j)RyrHzZ zk*qpVRiWoVCXsM=T{m_$aCU45pekGWCw_g`Vntwj=>c#rtx4Gs$X|`}fNtB~j}FCp z3Y@mdf|W#@U`gr(Hb_JE)g^;8d?JN!S;!+z6QwD}2wma) zyo2jM&IOh?@CM=t*Hqq!GmW7n(TAetZKok|d!n+m4$z!fQ4us0kEM0NCxQ!NYAf3I zDp%Vq%1`Qkv*vIMBtQl_LVr6r_~&V zB?=brga;jm5J^U6Q&GubEn?tGxB+p^)iPEzhptN`vZ6Hhls*)M(4@T(c7A*)w#e7D zMm&UFBd%7DF747VIx+a3`t?Z_o+WLl7?q|X{h z|5G*IM<`DiUI?}S^b%DHPXQ!onr<`A2J)h4(crxMr85DWK zdhv59VG42}={5g7Q`2O&fY$vUt<24UYLjl>#>8;6jq!#yHLBA#bxsn zlia4K-m>lScOKSL-pd7qogFzHa?L;Eqv@aexVzh*h7iUvJY{$9J#_S%_dolUfU&LG zDnczN@DXL+E3}mn-1#ce)ON7^_og1L>z~+Za*Rdp?4#kH??)LKvs4J-wFx7fouOyQ z5sor9fajNOzclUx=6cRwg#m(Velq+Eu%RyGm8#``w024uZxRXOL)nlZB<=azkz9U5 zoFDO?cO}MN_+GG!{jvLsVfy!o*1vv>3qTRosQVq54E@fzDL_XQlUF^*Mov3Y(#l2R zYSYVIPTocyLhegUPwi4>jffFJ*zj6c63<0=36Hs#~jSIy6sz%$&cuN9A2Bl2PUlxYaHWI@~ z!`Xqj$3`t^a&P#pLo=xnde z@5e?>PWhRmWrvh{!&D-nEKbq3}QLc6b$QsVfHGQv|$ zre4{)e6~)=b*QbOi*y_oFIO1r_YP5LOId#Xx+(blbvNxGWd@v&Fu5+TuBn7JoTz}v zyLh)6OBSrS%0B6MX|cv6!+r8JL;}opk}edLZb+BQ3rywpf#^vH_7wS3Ip%aXzGJ|C z;vmI7=03YM+}5qiyXbWo4FFM$@}T;1kDe)Nb{22uVvzGZh%y%Q#j{%+T0o zIGd09L)7u3{c+S{ z$LHDac3!qk65BrpI**fZ5?=o0T;#K$S5t59qUbLR`C?^`KHhO^`G3B<)zN(6|KeZ# zLHJ13&3#haOKAKt1G0uVdn~j27eTyQcZQp^pCI%CN$qEX1~8FNb08-3)+qcO$e>CO zQAbLp7S+RE>eEuve0>{g3p5nAnv7EWkE++7vk`ijdCv$M4FPoT?ZR zzww8F8rW~St#*R%uND9FXYff$;NTGKBM6q%#gws;eV`!{)O{;iprU)Swuds+iGro& zk9%-V_A4}SFqkR8MlGEn-OFoyOCa(2XuicV2VL@x#NoR(rH%9N5LD~^H*lsM@`^}~ zpt2qRIn&})Fm=egq#hPAOqR)lDGKkoY%pofS1=b3ovHLfE^Nr}GdJNQn-;_?srfmn zucvD}Ut>64j=K6Ze*PSiljQInN70N7CJ}pAYqM3*RzIY{O{P1k*R{MCMw~p(NcMPi zf8nczTenc~h$Om3HyPbj?>g-kK+>-)ej~pwJ7!yoo%vKrS*%w}ql=o0Y=~k5Uv3TR zLG-gdX?H}|;PJ~y4fagAUwX~^n?aXu+V9_qcCN?Z~5|Gd3O%2bXR`(h7xYmGbrYGhJx8C~e|$`L+0<`kJ-9xulwt2z=^oWBhPG+zle5=(l2s1t-o5frHXS5VY_wP&Dw22qeH# zIs}<|9QYcr3=$ON?SLqPofO&z&8Bso2H@YE593hsI{{K(N(YS@p=*qIFv9)OAI5~h z7Qsa=$cG(ozDcPB#qZz@{oMF0^Fo-wVr;0q~6hguCG$6h}u`VE#~6(nD{ z21t>P;NC#UUrcdOxc&7TeI3j(qC}B@xjZRu;%iJqPa~pNMQs{O_W4A62w7liVx31= zh#f&Iw!B+8B<9&{x_J8aw2uLAQSQ~PPL=dNm<*uVwxMvaA=okx)Z$BMm&a_XZ$#82 zK|;7h(W7htAJkGlZ^b?ptap4w{bi7xI@Jvz9)TXgG!xCbA`k@4NdUhl;U-E`(51*Q zH2cJ>O~l$ZgvZ;tD6{@bQ2bV5$}f*yq$T4|yIz-U@ zc+6IxQpi76U#VFlULwqQ``&SZQG(FN?wXICczU$5xU4@J8n7D~xTHtb63hP@Amf`} zmQ-XJ71p6v@s_oxlz)KPDb+XNdC=_d{`s@9t)fQhCBkRMXe*-M8WK}|gQaEWMaZbm z>b{8$-x7pnj|MV6m^VA0LLjGTCv1=6*e0r0mRGSU=!i%-Y#xnq5{GXD!70KhV00x< zP}Nj2k>npOLt(W;j}%+MYYg^Zm=}m&1qu9H^AL}oin)Uy6OSJkO%S74);z z!Oa#a^Ow?vg(`(Bw&Bnd_mQCn$>@ikkObhVZ=9Z7+=HoYnt%d3qC}C}d-W zht4{@uX!)KfAHf*&gI@y$2zr@dq_JspHFMj?m|~@m-oqiezSdoVO|N>fC2QOurIIm z_>d!yf05WyDK0vmnp{d;{E;BM_mCM3Io+ABRy$yz_i=BkGpmdrR2`bz@ueOte`-Reb`^}+ok@FM!;4ThKmoiMTHke#46FcKTgj;u@% zJP1_NygJU6oO4#lCXU>i%4Y?^{Ulp%Dw;m;H{39M|KE!v*t}r3{%4T#SACTxQX>DC z^r2osk{`HPaN^8Z`1e1$l?-1_@olueT3F;BFTBH$aGnNEWyA>^^)OM%h*S_X-xv)Q zOwI>!*Wy_urNxEur1sl%%XKN^1E<_Jb=(xT2bHIVL zu-545nnLwcA|B-$Fo2KA17$*t%Kd6*ewu}fJYl?0h^_nyLqm0x6O&Lx+J&~~gK|yx zJF~-&m_yNEtf08p&*7IM$PFq3D4l zH5~ngOKi7f=gq`W^&AsP9iq6QN8!H29x)zUWNb$NfzsHla#yhUm$swsA3k23!W2xa zo4(MY?gEf)7+{1R_l!R~mQJpp*@i^!a}Z@mH_gh&=LOV>w&)+E{J|}^A=HML+UJDf zzo-Y(%FSb7BYqgVGlXH}NlM@sA6|y=*YwKbzQlSwv%7~R&(7x$jXWv3n92N_+PM*Z zeqFWISjl+2d#Pv<8pE}q@XBa-Y2dj)K7blEC@AQ#WbI53WW@t$2;c@^#1M*D;*u=l zP(gO?Xnl42M|4B&%=T!@mRbvWALpmpJ6DbtqIo%(C1igC zP$@Glei6wV(sG+Q*7$hW0xZ%V7s!+FKDjTNgQ-faykXqjUu zXu$jZXHUn|qQw1xIchQZ(zYuI8KoB@eG-g4^R7(R>pFc@`_MY{>5?HGa6>W+o$uoWbP0rNG@o|W z%W*t??`T5fg*Ovop@FiO^x{`X~4SKot1i(Hma4N<>?9M((;Vp-NQ?S$h{ z{W;|MHnsGecDe6uuAE?R@P=43zNwcwe5!N(k}E2ec<5m9%$v@KiTIp?szwmRqtMr% zT*EIL!(Q**Sct-}Xok71$=OryR75J>ygN4aZuD*XdwX|T?{obvOYbpe((rpHBv`uQ zFpWuIFa8wzVr(jcyo-KfG;DX!MUc#!oqf0)#k}GXl`a&P^DHUHQ;)#BNdHO4{H>~` zDdi{QLk#Q%=2uMyKPAN7(?4XTc{y7tz}=zWhMHev!7TqU*$}eq#1XkGze6WM4Gx3& zhk6J*hUqBiNg1fADJU3LR`$ypj83)(6QZAty&Y_rZH@J{FQU8$UAQnpeaKcGDrkjy zO9eM~xW-Orq#|WPq^qCIe&(9B9AD2k^)CHjYrjy>B;)q$Cu!c9>l;RD$*uu6<;B+d zo3lR?O>av~O(f3tC#r1Inr_@%a3f44R~Ky@;-6>fILz4!tkGI50D8g{EJO}t)-+td zxO=#fhcB^zja~R<g{>6*a-!%!MkU_gRgMMuNn8- z$UUk)KX#jzI8-ugOuGwpAb9tAGw@^1$j97=kNXcwKTOXq105l}XFivO7Y}Yt77x3D zr#mkbDm|Aj+}k#yO=_Hpr8i}+x^yndX&CQ0!;kBJRt7E|7zQRTm}&z4CZs?d`Y8<_ z^P{zXyk2K6zP!vDzvC~V+v)OfLZky7DpPofdjtP;N$I z=acpH+@!WgRA{gdP*$;A&{p#L?%Ey*njwxJ!Y&U@+}Z%3Vp5?dGd_bEZ}o<&L4Ttf zrk4%t3L3Gu4M1~`Z$pbP2-Zkog+S#;h!oubdQ_7ZBeMVSYcI0xJs^q?W&k^)!Otk5PB@; zuTc!9Ut!hc>|5Go)y_oz=inm6E(!}{Ek0=^AztG;Q+1Lx*GQ2yiT`uVa)q(;57;T? zUj;l+8i^r#im_3$tESvRxtvY-E4wkDKLjvf$@*S-AIAz=wiX$*(*}_n6`+WMhjq!q z2-?^RzdCDU8L1S6rGaOos#ia6q4}G*SC~EwL~&-o_v4rv|GLg(5RVgYkm-( z*X}zWFssN)OA?*7>h0AuzBvVVHZ2xXi(`%1_T=20ZQ*GM>iM|0-fZkZHSff&4{pDF z5u7y0ed)k$1$tvr(XGn_KnZ0_4k~%4>U|ttJ7P~`56*hV{$#oq<-Q$sc3;!YI4;A6 zqc&fE5qI9acJ0a*$bLUQqDsZ%hnmv4T^{&Tb(Cm5VmjP( z+dR)ndSoK%B`ePN`QzUx0^5;5$UF^%f4^5BmwJdKxXpLkcM`p1Jff*wv%C+d_)ORk zOJ6@$5jSu-c25$~ICdS_w;7_9`e%fE4CL3mnRk-LXUq%KT)$1637REVY%JHf@fBwh zxEb~(HO)Beqjce{)^liVJwcR8;D^3keeved!zA2@9u@T;yVI0;ag;?ox?__=xBIw? zi_5YTYhH_!^h@4KM7$WZTK>9XDMlUF6e&%LpgsAd`$(p_rBk<%2kS&)OivhOMC#|Vrb1+b3T@Y2(gPcJd>S}sRuI~@-6-lCBJ%vROy$cfxGZ^_dI)LlEFebMxHe}%vTFs zitzU*-7-@VQ=@ZwE2k#}!VIjS>_i3W^J47mEbP%+Zg7SAtjE0Al}P?AQAAM&vp5-^ zIJ+b_JGyxMRQeXcc+e`T3vkC{vy%#$pAFfR*(8T!+mfmh^|H@FJUxT(ZBI| zUO1h*|I7A@@~Axj+y2_Uto|psZ{Ko#;d%D5m@c%ibV$AZxz0=U{aCh_4lff)V851R z6T|h;;H8mZWCmy}#6#ONnQq3+Mgt~+iPCnav*Txwv6A$dd(As7*uSZ`>8S1O&VVYU z)pxEb6bsFfsM#AW2Y2kOE! zD=aZsey;l`wkE3%WUHDSRvo9>8UEgWDd>?ug$}-h6{?ifrc%u`z1e=^R{|Q0Fc?f@ zl}>`{N^>DaQ7>SlpiEL)yAeL`6G2kV{{q_;GROu8C^m+B?Im>i}ffSGmu-Uu8g7 zANw{5HDi~m`L={`<|sstcn>ddVHw?dcOi-J9!c1S{_`(+eV`$Qkyn7mX~wsanqc%A zQPOoHIfZ;XCT0-)N?okP;N0`1SkuPEK9^$dpYMSmXAev8D8M;FwgH<`q`+-Yr|`UZO=r*3C>Ka6 z7oPQY&++M-PU-4a0BG#j1ppIkUVd635Hc=>+9UNgsd?z2?>Y&nafZ3oVOpUC5tt$DKwJk72`bsAI3v^`2}}cA!@*$G@AbvF zqoyeEmL?r+@%Q~gE&VL(JszIFQi3Cu9F^$(9d;TIs2mM`<`%92Q9$z<*_TR=)z;%G zhzwu3K`YviXY#Ej_nJkX2(Kkq zc4RqlUCQawSE-d=V=csnEctfmL^s6?MwRNRtEr?X*5F~o=j@aIHTACyz#Tt zwPi$4R>%$N_EspQLlPlL%0?wHYLTmx+W|VYYUJFdcK>h=@vnU%Y6bA%(V`E#ol~+(tV;HxDwXB4`l;!Hts2zzKhT)e$~| z5HCOf>Kq!bh#nEToXF&F{_WAeHUNiU|J%AbHiQP_(huFAUH}axvY^$)3ER?&g$TY@ zC*AwRal^e;tqcRp7G$nDG?2^?BQX6PUm&xWs&(DbZ(a~E*DyYNH%eE7oMQQ5ACe!{ zGs7jyVXdyK-}XwJ=D9}}zo>|W(3w!`7D>4|WBm5~djvZKN=8>7lQ}p}ryk#4MxV^9 z#6)vCJx@#cb95=i=E(M~Kt{NzRtM_Q9MdM|Q^;e*514j^SfjXXHB>grgENivX-FAN zOu2_u1-@k&Ua`Z6=Hw(Am6Bc$s7R(zMAw5OB zl0w9@@Ceq!#m_oTBygrdQLf+ag`p!HQx zSJ_w@$(?k0KC+pmsR*iLoKgCF{g1jgd3fyjc*aTbkE>B*LW12-)HCZodCVq`Xd$h4 zGrV4l_ z9I0U;8es7dSyF_e#oZKh2ste4ZOvlb*$+DfeGXCam!_HEXcE&C+JjbNPdrqOly@W7A#3;E{AUR#Ri-d)4|*T8eG za+yC@uNDYyM<-|3rHs$u`bLoZtsNz)fB|}KQ$h`Lx=Rn3HR_L3SQ;hltvF$8@eYdi zU*7poDW{r#i@;GQPu66GMrK;5cZgaE+fUHVYXW9_DvqA84`qPS_5_ipEi-~$2@(y4 zCy8=B#`%_|E6UU#{(6AhIG2<|A`=6_j>8SqF!d(Suf`4%q&qHNqqSCzwk}t~62JVsDxmQxt<6yfn8#YT^DD@zl~rNiVlQSTK}`jnUBoH;{Gl(UP~q`~nQ_33m^1BZTT zgPc06_8*IWH`6@Ellq4Je=VqV=tdL~9^5I6?m&pd7LQ>Lh58afGh9&<=U#HamO#C0TMk2iU9ntl&1r25omV_{pC3&tsE-@ z!B1o2?A0O`COvm8%UksqXK%jvwj*y$yZPPo-X4U3efG-2jw)LvwuihPFJJ$8r*%_X zS1UW;-gTqQ?mY zjef;88hBl46L^jd%|f&m4Ne%#q~&UA&T z9GMSsd|jQ!x-EF2KWIoUBVos>%=`Y-p1WNB)~4J<%yE5x_ZWQtS`eR)(w^4~a{mVPKQ5ux~;#>o6F4)?DpVt2);%WA|hy!AtA zb#)V0;0vcRZPP3>8SWlUbDErX&)St8{5i=E@6ZH3KS5=9^%Q z0-{I)Y{G~?H2S*AqH3^#Z1E@D+)tp~PeNZRe5(9G37goeBF6BxGoD~O{ju}qEi^Mi zDPp7eK-qvlM{u-tpSMyvKt^w-wxLgC%Jwv5G(k%2`twgqvv*I<8y?F&oat_HX@yG) zP4ILS>f8?2d0@<*HW-^R?%Zj`6+g^-;qCnLokGdh&H02xynTqB&w4X>^JHKQkKC^D zc>cHco2}}&M*Ag8bwQ}Ejef?-P|quQYYKbXh(9qC#e>u$j^p8R1Kb;9jenwP;K&R> z{6`~>+AKO0BhMikfR5T4MU!}0tp5y&l+E|IN1qOPfsw{eHT4 z^9uhu_RZo&X8c{n_S8k=xs({f6cZ>HM?UNZZai4cJ^VmNV%PUu8E$;W0ftm|!`u*` z%UQn#RxLi-)tbDXxf*Es)IZDc!i*?^8SuYvc4v6|1aUuLM*Ro(zh%PjC+M|7HJSCU zb3tlg6!ZfsSCtfTuf&Sb^mgm`Y23Q-mDhzBB?P=Z7F4G}*X|i_HRK%FDB{kFQHR2J z{}cm08Xa_GAnP6^`2~xh`n|Qqn~h7VCQhJ+oK$FdfDR?s&iu<(;1Q~)o15v|f7E!E zgbGJAKu`&;=IHNSoA1FiY{j@U>Bw$R0;Fu6SaC27$81lXvcf=RgA%x4LgR|+JTWuG(1Zq_XZ?1gxlwH!UEy|4Vq2({ifI_^Vn#Fbgi z4K&{`3mmyznP10!xO>?@*kZ;rbniJmW>;x*_w^WIZPuP!Y09wEnLKh^qE#YMb-Nal zCSamnsUc7OWbACF<+uGOa{^}}-C+uy)?CmQS{c=;vkMtr8P7tC)OwZD?P_YkoAHCv z(uz>b#-4AL{n`2^DN4-nkKjg(>oTh$0uXfB<}Efbl#IdwOuSdL*SA-FfUT+kkp}l) z?+CXsf%&6_Ch-~wqP5V{7ucFD2Yhaw&{5ga1AvdqapQDMYAH_q4>A9qfrokET6Gk< zB>CP!@u>w$;~lgBMHFT5`Okx2s=jP8ZH5c(Yy1Gp#^Bx?jQh?SE|w?5RKfssv4~~s z$Js&IpBVlBW-BZIYy}4y$cSJ+E#qbjX9vo+CAVfY?-CKY->k@i(~ZgrFzhj3mPQ!5 z`;#r9)$Zy<1UtafF;KIBhS=COz{5_~$AXCz=aP$AcN29eQVn_4%1(VFG*YR{U;0O^ zmteOUBq&#C6DNY5y#h~LWPO+{ut)aYEj72aBRjT=cBFkL*Ed1O8Ow_Z7huRB|0()V z4<1PrX6?y|EjzqRISY)E^0`oWm!XtZmB3A3Oul@=w#8{);CzX*{k2zCLiI*)Mcome zA3%W(pOJeGZ+#w5%k`_BER5aZ2up;r%jWrUbQUha)ldEKGpztFq59QsNni1!_gdsOs-^!5n*x(Iqy}S`18wI5{w^nq>KP2THD0J(-asBY3k5 zY4TSRZUimN&ryeM0yLV=gigh-m?h^h+6LJ$Sqqy$%;mF-lVGfFN+3PatZa1_7vcM^ zYWdM}Y*wF&@_UWR*ssp0XL4pnM6W19sKa8jI)=yDj(E9bo8cIn;{lNlmcr~CRx5O6 zGeid#tl_Iz`NSyk5WZ^W(B2C~m< zZ~TV?R$FKK2P^fK32&6T!zA96s(!y}YBg@L>JN3Plp@=jUC*0*3ys2kupG1A`A*%_ z&z+plQaF=rJ0XGwceX`CvCH!Ur}vo!E5SSoQY-g)TDhD&3&v)JrBwio@(HNM9M!A+ z&<-@N7|5?5Vea)=Hqz{+-rPAcj5Y}TTY|Sq;ELwc@vaHIrdL)6?fT1ki*mcg2ZSD| zCOT_R;!p;RJn{v`8pwV-B)QbeR%ko->YfFP50v`-UeSLPacYQKV<#XuPp{r&OQqCb zv3c2XMET&aBjx|!yF>y1SBewnSKrnz&x~I>fBNyrNCNc*y++EvHcD<5yd}~Tr~rst zU(pqeaB?mEg4KA7GjVTzb?u>+HP2uA3PPz$^0Za8HDxP_h>M_yZxp>_SO3L{tqijq z&*zRx1&`{bRKHwVCW4XrE23q_X^{b$ws``+L;?=NLGN#AqesKkyGGTQb*a5K59#^x z*pS$;)l-sG&49I5BC~{iNf5pcX1$xaGn|N#KN1~UHgfOR%y2>lg&=(|4!}&x_3zgP z3gEoiSRZF%6G%NRX)9)+Wa@9Q#LoWm?S2VTuVRu=8nP5ThSzOKAWe7zcbXEk;WQ3BEY|WN~&A-q&cl{EF)3zuB#ge>+|82 zwq(VU{FrxK?a4~@L8IXBAyYoGS&|*o)YTkO(oKyLHyD@ozKtxSc=3GhgKh1%cVT83 z{!lx zTKWe6nOIY6JkGHdUgO({M9acF#*3v(ue{0BO}&>CbiZu^C`G25WYnO(H}RKmcG6yY zkYmcrS{v3@N&5d3iJ=(rejKkX9honK2ya&v%LYv*v>sKJ+y!hiS9YN&)goBb?G9@0S~| z*jKbek$a#T!87}6P3Em)oOsnB=(WGyEwnb;lX{wC!T_o5vHZj9?!Dpr-e2%CJn9% z>1N0JS07}X?uOHx{2`iot%o~(LhkXlBS4dgkpBD4j**$Pm;z%_3Q_!6;DQalcmMz3H{oiW7KhX`bjo)6A{55iA z5NRk|5mz>?d6O!`JcpMJXsriX6)Y=)`N0AB8yxr{sJ?+Uv_I=?&2$=LsM1so4MPHT zyyuuqf@(0!z6mizaR?WvX6RHdY-^f0MDbRPVL!0}m4F3kR6@O{Ysl541J_#3WwZcz zkwPLV{zkXoFgj8;Z(d4D*3uXg1tbl3O!a`L^-h4pRJ{La0;)k|t1dj*< znd2j5lk3cI?yBLA;YS!0)#xg8+|jNm&50$U*TXD0QXSJ#t|%7tIFA_+Havex`;7pR zTk9)qxV2v6whlDv`79XDcC9aL=o~oROT4B;f~Tw-+`&IVNbJf^2!d@|I6#}DxH>xr zh9CzBnFVZ-9{~Tmu4TglYX2Ugf)-Iy8bW0OtA{q=QUtlpWQRQ=a4{0Gqc?RbC)1Tj zoMSTsXP~_xz)CDUTESs1F3V2lC_s_~ zcvs#pW`r=Uptp4f{UoQ&y_S@AW#v=K$xNI#?KwkC z<3ujd%zx*q$X|2YkUY^qO=N`HpEIS9z&h^-ACn4_o>qlNui}&2YNme~sFNgn1m2Qu z@wxW|@SkX4!^vT#sD^cd+YR(nu{Fze!b&{`p0?8ig-<`ODd2kG1O`3#!Ve%Di!DAt1Md&9BW00U!Vo@;!OZ8j-Gl`1Qq{x*cIxo@ zC(oKpSJ$^|e8~QL)M#6*1HVBtx|15M08^^K>eTZvLTrG>9U@=I>2*K&?9*{eDUzY4-4$t>+v|vT(iOMrArq5#`4QXhO;Q%~)VSGL2 z;pA`%CNshepoq?J0Q%TN&J$S(Ku^FZfQDoKUI`%_K>+6v4VOq*+OSTwBk$95g~cp= z(UzG7^hh*_*o!klRi6w!CJh$r*MWrHO|#!{kJCxg@o0_dtc6WCMD4lzrN=zy<{f&@ z8I`MY&5e$l;(($I+6fp$rMRz%Gbxz3vdV3BviD5C1s96pMzmnh(CnmYpj0t=CiXT+ zR~*m=&bw%FVnp=#X^Aip`}=#EVfrA&-9O7KYvOa=4)rBz16Z5+ypEbw&#;IRG6L%P z;pa&6yLSh`>9mA$0m+;@bx@nA-sP5@7M>6p8obRB=B&4i(+*YhW+}ju#bt!nq8gV* z*Ul(HjTDMF-}1Tsk~>*RIFNha7Y=5Bl#btthu=>Abi5CH5^vNtKHdA-GbA0_R^+Eo zk)M=J?b#&7(Q+WF`}02n-Ri+AT~Q$xK8I|y=o7gOq`HEsKUZI5X*(*Jt=S-b_HRPOTr*Z|ZEMqAo1EJNl#5Xq|y z^Qr}*IzSGkOWN#6PMkO%0#J=BR{kG^o{Y0LgqIv9v~Pc68NxcUDzo*rd$397^p|wZ z$;u;5)r|uAS&^KwPwxYy`-b}pDj)VsNv|5lv`VaKxHMOB0Mx6-+ol`2RJ@L%l3}`` z-lun8H|GSJZ#M$oRSxGR4c|Ta{U^cNNh-5WN8BfL&!ke~+s)2(cFT|P$=m&3F9`pi zQl~S92MqYPx|p1T;QAxL^~XsiaFyWItM<`;^i!Ee{H8BEsGTOf?5yjvn)>m&$NtCj zBD5F?O_05Hdiu~JE5IY!8!S2tz&}oB*uHllMHMYEC6#guPmd75NJDDF|NeZQQn4gM zJnu#+#D-*J)Ov_!3Z(8i9xP@%Y>ooo6+eLIcKq8M_{KaCguHrd%NG$k4xk1o0;K45aAbcC4!V$COjexFV0wY66X>QB@(d+I+t}_py%4p zbu@s~U%Y0qw^?oz0YM9sCi*}QCnjNI>jmSm5T8OqruiB&9k!$0{z)}4__Z|nF``oI zkb*Tn?tZrU^yJWc)6qNpNO-sn|dsl-2S+va30@jY_#EF;ff90YRe8#JpmZQOB z*4XD_|IhZpRbR5!d9l-MqsJXGC}(r<&V4j#yLvM~FMojNmkm7eZACAC@~$KQhLyd^ z*{*#4yQMP`xD8*1-W%>u^`=(8@`^5B* zt%pIb*8L;;^3TS{)3`ZKhUYyyKdVoQ8ozY*shRD2INiD>Q2!FldgKi%xqg+H&bexxKq&X~2{;~6U&FM)LYwDLgS_1jD*hQRAbj{Zk!#G~g zJ+Dsf`rt+vD?5x~31j<1)ls6xBi%C>xFtoTkbrxO`89Y+pQV3|nNxB+z4VzwN33#* z3ak9sWM!ge9*c)?IH_rWQ~P5IqtDlUt4X!H9jzT7o_^nS@%$mC;?MaQxnKG}4Sneo zc$3W)Rtgy1-CcZ>Kvw<{-pzFE1dyBM3xmKZBrl-uY5>1aZKC4US9S~2KRD`4T}$oT zrTo4`N45mWuyHvK(a^-g&v(@McED?IR9+l76AWkRz;hnh!LFWUAA0$(I_x7ZEH~7S zBTZBq4+g|Jb2&vnrC(=Y6qFQKzy;T|6RUej`v4<2(!u5tN$$pJMh^KJ?cYdkskmED zef&0`^1J=a*cGD;|Cl}qDNhs}jx7$Q186L<{j(ME4rVL)dJD|}_4as>`#~!njC7W* zd1t*d93-fXiw#bA=GM!h#fe@>hQSfl;b`!r&N63z<-%tb;jUiQ@sd^$PO;O^Q&U}+ z$EeyM6gRorPjK%1$eVc5!^6@Mzp4wTTqh|FN5DBZ={(fGqm}BNLs47Y4iQ@n2 zo*J0x9`a8ArM)uTh8pJW^uL99m^2%>&)_%MNTTx%VKms*e>*b0>1=A>64C?8s#aFS z(a5p_A#JS;L}qxX3v@qd0rwmcmC?3)k5~+6j6&*j(U)VUxbs5kPyPF3^L;HIT@YH8 zgc3nXLk>$>xLLUQMSFkB0Dw_`06Rb*#Nke)@BHqHiDhUCTFZ2)4rG#UMMg%N%LFDI zMw*v>rE|YH&k_IL*f0F6mn#L(nDsTVDk zlD-3PM`AZB2!?8?A9yPV`8cPa3N|0~Bx?=zoVq$>Qq&lYU=r%3?uT7dFW4Twr3Y$2 zTN$IaAS5#a6QP)Dh>av1w{cYW|8C}`;dlGk!y|BNFH|4!jm_pIK+XN zh>A*H3Tj)~3~WUSOq9nuKF59t#eJOo4Hp3;6FyXr$d8u|xLXZ6UX5@!N0r1=e;E(~ z!w3(`j_Af!G7y;l>_D7|bH`;AjclGVA+pkLkrKH6;(POI_VeQRi*tkY`tbiXX#_f5 zyb@9>1!^vP`=?hEzK^+$JWlWxunv66QR2QF3O$LDDr9_B|9E!4(BbWIbMVL9_uLp` z#~CtLVu7DWC7Yn8;x4x&)E}9e+bV4}RevxfQ3PIpQv7f_^R@&h`Xl2-o|fUQUP)lF zw6B>11q8LSIcK-MTRE2hWh@zkwl!Vb_|+g4Z%O%3%Ogk44cQ&H7o-Yh$U&UbenRjF3xSV%TFIYhp`l;wZ()bW&56j-_rPep+Xb z4(@`HrD3ksVx)3AXg_wZU<%pMlbM319{WjfnAGm=aPf9cgRsH`%$OQV$R|M~ri`NI z&)o06o=GX%MVN$ce-%@=^;#w$CF)>1k!B#>`>5?4iWw0a9vX%ofr*ak3kkc7rxK{q z%F9Lcfr6ZGSoWhcoXTMQ7DPQHsOkemfaWk$?4UI$SB=ZhotY~(P~L)wZm9T#&?*E! z<2lVK(W6AIa~;jALLP;8-2kkr;L(qjhOaCW-2_&QiWXs-Dpv+BwR4oq(d|A4!5>~f zBdbNe&%==GPBM4`Kyj!(;EW*jvE!rJWK^=NHTs0`_RMf+NfpTA2`IQQw>>*?V0$0Y zwu(Cm9jI%Pq(ySZDS@kR>GE6g>{s4kd9X_7k07W>Dq`kxB4{=*DAxpxmgtBXtc0Y} zbQVq-r4;i5T9Hh`*~Ep|(_@UrTSII|7)NmKD-ohdH6dA?3-@X{S3^!aW@qm4J4ch6nA~2*tN1Vu< zZ{Y}R0H|dP3*zNi3Hhe>l@W_?!XSbu{hLqw09Eaj~(3ZWwcX$;``9g9j*Oc^jcSOY~{2trvXCON{+-+kp z;3Q|#(tXAR_B&<9y@h~KMXCKPR*s3rTF~mGAcgKyM7dp-08S;wU5pmvy?CEl!$Z43 zg_5s^FDn3BZ-fd*o^JR@%7w`4XShE1cnKR}`<_~G_f!zhzEzeD-2z~fAaQ-@c;A9; zZVE5!_3f&x6aZBkGyf%sz>Jli0f2G|k8uN?*7fE0#t|NGC}0o_bag73Z5AN&5Gsaj zz-%1(eewD;8r&vZd!QIxj)5{yi+$YjhiMz9D1EBPw#T7-tSakgX;Gco9G$dl_ktuv zqm-Abcp!zU#jpr{u~#|cXU>HIqIHbV?cDy~o8P?J?LoF9M;=Du(mB!L7~dA&dlcDW z(Rg)a_)$!+;%@R~OLbm!O13Fp$EpiR00xH{W*3>hA(RsiyP=5|Wcs!O! zfEs*vy@h0u`((a|I|BenS=-?Nr*+1y=m^ss{=Datmv)>?wQ42hD}eZK9OT~Fker)E z;ga@WGi2VfgN-1DVgt{?8y}Gf-R{M;JpC=?@NB@>fI?5B=;Kau*_Z zD<^lCofC1k{~Ii8A@jZkmLWY0Z0$=m5mJkzM}rwyYzn~PaR0U&;2vRSjfW5Ii(yu4 zCH%$vOFsEogC(()o>6)guj7j+8JOT`wsO?2g!QyNu}D?0&iY{*74*eO99ymSaat-v zTi2lK5ZVMfQfh9#S7L=IZPs2F=G>DLB|V!gg`hAF1sg4o+H?|@W5W|e9LZd!0C+SW z>Db4<0IRAcIa^T?{_0VW&{-_*ME@QQ?or58o{}h`n+F8R805hl5*~++f7BDJ%6+uZ z+sPYT~dZp#f>q5ItbaFQx$it|KZJ7#6gIyv`-QexN3OV&NUh-s-GPDG13Dc^ z(rnu6vz2i_{-VlPv-lwC_Qv4Gdq39wo8ruO?yE#*Y^`_My|<=G0jYvX6Ot>!4}GIg z?R<-bZo5N_LgGMyZw4S!_*$mZ z3K#PKp9D$6zx+En?BNKY;lFO&*PL``zyqWnd;c2092a2^PzS_4x?d?jzC^V4si+m# z07&XMYaeTNcfBW~237|7OJ4;{mTYvU!|;&A4vK5k)0?3mKO}}I(qw*7L7TxrHW2!V zf6T8+qDp88BT`&t7m5%)4C>N&%;d-zTnj;=|MV6&j+E#<6Cj0{eGv7U?%?ZDkd2ds z5{<4QiO^88?M$Oo%3BGpG}1+8i>7l0++cVnhGJqe(rsCXG(%qcR2?fRjEc=u%dTr!j4Sy}eu zoFE@1jA(RbWH8cb@>-mg$z-Nts6ZZgTTvRmG7QxqrtR~??}(L)q_S{p{^3`{_ zl(b+r*X2cJ@ETXEewC-%ChxAr!Xo@*sGF5{C{kG*caEE#sH2E^B1-xfLbm(!YjqY0 z+hqj1tZ)nOaxDAfr<$}*6cy^t8ubbp@n9S0<_AfT2HTbpMnV3Pvm#-0i(E&i9BT*D zVq~O^4o)X)XD17|ll6|J<7g!Zh?h9uz5Ww=LBVU*XlJ>yrnTUI^Lw+&qaM<*;k*B4 zlXQ)eZYR)EVueowWmGa$CPY4-W^4cIIFH%uEh4`q`(_n^ z%|$_dcB2~OX&5V(;_Q;VC(D#60H^07$RYN#c?M)sxsw78{Z5|-rtW_mYu-VHid*$` z3d?KBCJmzB@E}LJ&wg{G<6{nyqNak;p;-dTmY95*2uBc%(GKlHYi{*-uww80blzeR}M6y}OshX*QF|Bt><*-buJW zQ~#|0$$RzRWWKHG{+&J#+h!j%cE0#$Kb-s_l^ARoYiF^W^QWd6Dy^naRZ5t#a_F-g zB|)Sn^8QlEOA8QZDK{YcI9lejnImLvw7oWBJNZ%JEp(?xYErvweG{wL&q&-n_1IJ8 zN}`Bwbu5?Q=C~d4XYJ#rYxSeZPq?`8Df<$icoGAyqtwacMgp%XKj&|h)gBtiP8j-! zxo;7vNvuXh3d$OI7GExMZf}Mp8TvMgURXWf|9rfXcS>GDz>uuTNq%0Q`%FKZ zIm%(vpF+6PZuAbKX3sCxRNBR=4aLueWM00Nu^No__0bi|wxZdh!LaFGJEyK^)07{*Q z=M|l3UeU*2^-_hSDmtA*_tfYYgTfbn8E2y_{A zM@^0n;Jcyqlwn{%>gz@E=}?5l=z)PUxd@vTbMCNUFphawp6o@oNjBiXECP%?TOr3# zS9zaSMx%?Kd}RX5n92ytNg1}Dc}?ocekDjg|7^{uuaZ+;BjICHvUNxUr_>PXuVH1F z&eXItdR!ct-v;ZYGpx4Ajc7!(m$ov7aQef*bKMM#xX)M|A2!hbGM^n1cuIGuF~_sp z41Byt3Dv=}A)Et5slja>Dcodq$z&8`R+{2ERmUT_VrLEhMUx_V?H;?U{6Cs@tZ<&X|4q@#mPrBT9z zHdDiE6hTfGXHea?)enP8W!tvgp@mq)wNpM}My|O#KqAcP}I$dpIolH%eV-0q>Y zM3R6zM;FTCIWd)7uNCUK0U<#Q9u}d}FQr#roiEJ|JN^6?ZblxvV8_VZU$!K$x1ONV z)3qKquda&Yd0kzLU13}}F21a`8^HNsm-lZ`MeR@RTs^~Fz5F2#o(0PwU;p0E^h#&AAm>u$)8hvMdi zHsSl%Nx9VDpA~w02V_ejT6_73T~AYc4^))j2PWdU)%r^c@UX3`Yw+0M< zAfuO)%X-(3{|MP8T4w0w*r__OdEoZ|UzqH>*Eur!C|w^m z313`q7B4)^@gMfA-A_IyxZm9Lce>JYhmUTQk5#_U;{T@h(~%gqx`W2?H9_rT*z`z3 z%*AnHt$oVaxo+U`#Cg@dvEsF3z@Pgv3|xXVI5m0+BSrYV$`{^gdJzw$+p<-k9QWg* zqLIZWtNywHiizYj=8HkUQJ(uqQqoP#>PVG`Uvzji{3!h=DpQB|)YbHSH<;rAH(+p)X^-#9ft4?B+;zCB8lETLH>`%f+^mXBQ z^wGG<^+J(CDOAeJ0F4ucW_Seh%1X}jwJh^;dwwD_b0YKQpLIrl(TBx2WKVw8^SqJF z>pv2eGWTni2Q4=}B3UmOBMGSXR?(&Rb|z-|%uzyoQtyqM)$}t;xkk|RDijDBS?ITI z9K6MoQION73wtAIzb#gl?bO-uCHcv*n$X+xotkHM;YrYH-Yn40F;qD9s~{;0K@2Bj zN&;NdW-Zws;u%#QhNR&7|J|kIuYWd57-zw{`ff}z-2d^ zN!nijkjXM>S>=BDrp)~nmz0br>BjhwF$+DYut=+KXiTpuVK;8na>LHXaUJ}9tZMbx zC7w~j(8OcE_xY7YNkB?G<9p$94j<{_U0JUI@Gy0Sm%qs2#4SgOzon$w!Np+nqSGE& zz)T~3>T6{-Xh)~S@O5MU`8(CynJSANC5(+9_qyA@d{!;D@8s;4c1JCI(|ARHnS0QJ zU*?HFA>T#$ANqaK%G1pYXgVP550Kori6~5)XUw_Y&$>A|rb0-&sjDs)`Mat2-D$qO zXwnTmpPhM_a6hP+ftZ|2@i#9m6E8|{eP0PHai8^4`H@{D{R$m+V(_%uC{L0%WsmFK z#?hHHL(hX>=E?aEZHLsa1Khy|KBnP@k;l0e87>1_6ZH1GOjaB}2~{F4@|>plN*c88 z9{o1vrMpYi;!6%p-)qcZlr|luh|i0-$?QE7``oJFvyxw9?09Fj{f!ku|3s8GHS6Kv zKDt;s>wgaDmi{j)v<{$Duhn;iRpDr;hh1?h0yr09p@x}_*Sh=m<-jI_wK6&@HCUng zH%J2;-Y;E80wWzGr?&n0#!w;QU**{1-$~N6uo0doqFAu%j%Yyvjgi+{87cR1Y9N%` z!{NP#nHA(&YAtmBhdPkcx^cF-J_ z0ooV{H#qft>o-1RkG|d+EpqX$SLtozFiJRDtGshKjw;g}>d`086+A&)S&mJN<;U}ot_x_HjOk6(+ z`;{pd1wwm|t?fZsFKwz??wkqs4ScSdZepds3dBl2Az&HNJA4_`^mu}pmNBRf%yW#H za~_PKC2@x0n1Snk-+lAAHbR5Q%F*51C&x%s8^60*KBe)X6NO|GlIP^li7PbwQ;Tod zMpg$qg~m}>B|4bQT6$JDL(i~Q$GG(;as;|F zMvz%u{X@g&#O0RqYkjsnpV4V12`u(lZ@)pTZ6ejEg zo{_yf7E&No`=3s$J!pFdf^O{gT^=>NmnnYX`#>=~C4+KUAJhG+x($!35ms@f$-K<# z^RV{8mOSYiiB8y_$am-QccpaB7Xy}_$K?Mb>@R@Z3c6)sRJP0vF|!@B9W#^6 zi8(PdQ_RfF%uF)Jj4{W|D96mq%xu4W_f-A=z31HbUX`je+9hq3M$^5zXJ)MtDB9^B z#Vbncl94_}ADYm_+RS*^>d(7BPm!Y;u@zV;3FSpCNub>Oo4@j^DDfZIof=l39H_FD}D?-yf9VHnd#Ne#~F^9#{OgN&v490tPplCmoI6OOCI4 zs2`*{-nX&=@z-TtJa5bb_E!|a_lHZuNHG+_>TV>iDU?vCutTYKovZO!d65*sjQiDE za0i3Yb7N-4uLeI~tt$}#sLv>9jDlmmQ1bs77*YUDh`AAjE?(c?z@*~4Mkx&E*5>Cg z8(<91vOH}#NW_)$KSm;MoLlHo`*f@6Z&vIijsQx2h&*jzwS$b*$Yu`#od0@PV)%!` zc^<8PL`MSHTyM+~%~O3sUB#<09+BdI+y$)RQ6U9&GY0kKXu^huQntv*wtVuuKR@4_ zcr1*|lLnEC)fjkNe;YzX8!+6%(UKNS1#q&NQitL~GR|S44luQR8!<#asa2l5Qy89F zOR{GM&e2)#UfBr7@7b3T>Zf@_U+XR^)M_(HUS}#uWhZh?F|NcU43w0D#d;UeabV(L z5;n|`Uz89{RZr{Z0P2IQD7cAKN)c(cfF7M$5OP6r@j(}AuqJ+B{Jg8(B^17 zhTnHXL#U40H4#oh-p@?vsC|9QIrqjP5z&8rI#D{^a*e$Z9 zTcANy2{ACvpMN=PaJD#Ud{t4waCbJTO-n=W+3pb!b2*t=VPV=0;nDLwU6O9NdGNj( zc;wOdsh85XpdZ)Z+)^FpI`90BO|XCcHb48kj3w@2_WMg|xlv8NbGvA}tbU!ee%*pb zhHpz7B)MU4#+>p!j_khkrJ(c4@X!1YgED%FV*(_!eHp$NUl(AJJ4k5;m*qVK#*7?DQ$m~Cs02i#V^tM>F6RRi{SKomuVFAa4(Op z5BquHln%dLF58*Pn<4ivbdq0O$qL>aph7lg4f40;BIMgh#XJGO`QvVby1l#;^v^8W z7>7wYjiWt?n*iRUs1Lx)59mxNiyP#)&XQ^Gx4&b*R~}@#{#FPvs^Xe=T)*~j^*O5h z(SN_!dE)X14?3qhC&@7(@t++^eA?BTv}9yoNp$|o7~|D(SzbZQ6fWTGAI^Ven~d{A z|MjlS>wlg|5{mW6!9!49uq1F_ z(`+MuNadde)Zn~t`)|%#(}QVa(UZT0!WS%3Qp-Gp0KTxq>vV5iB3!P5zPAt%6JijO!X(Sds<^|r zBEwmjX=LEgaXb$ia8}K*3kKf9>)*$9-*&Qo{G$6D3Z$eAq@)U}>z6-dtQBG+p5BQM z|4PhFN6CO6k}`Y@GD^87zh0?5yBa_yGZgQ$vF&1psi6SWwQI4#pB15-OtEe@adD74!vC zi36!9q5J#?-u?(KVTir*iYK0(t^IbJszcx4F`dNokhJ{p+zNOcNE(ae_{o42n`X-F zeE~bne|fXsKJ_W>l{BB3QeS>FglWN0R8kWzJ&x>g}TK z=DB#R1h1D^_xF?ueK&?!4)=sog5h5%&_R|wEKM-@&cjS7c#>5BZ!Y~oHRJlEJPKW< zm^qhy(5rU;r3P8Toox-@2{d0MJ3qr%47*7aKJ?vQ2NS-f~oi9$7-So3NT<3cq z)i-jA&?sKBI1Zzr5C8cUfQ)A>^W{y_?UmO?^dAvnX7T+*WbAu4(%1D=A$()n4-KlB z@E*rn_wN9Ca;)L!N@qfV=XlyU)E|jw%;+CXQM=2OPP`OeSb zMN`lF#fwW19vK{NUrP;F3=V>Bc?SG6OYmf3#xJ@&=p4@$?JXbBMt)GME_{^&$}(yr z6~{zz3*u+qzCThu6TT<1d_`4-H}`FHcTdY!&l7CgTT#|Za^A+{cbL>=3ID|=5Z53g zE22j7P2*P7Uw`mgg06I{0ra}MJVR5XYj!G6SaB(~lVGmM1{>DI`m$7N#vAiX=jFFE zG)t)QRnkxqf8pK^`ugF#kdVU}Y<9vmFSn1a&&pE7=mEKcqVLNRqoEsFWqhtL-C2)&B(PE&*NTep^Ufx(t)YvzfC3){lrfrJW=24>>@RAC zPJ{j?M~8xeS3kLx+0LU>0rMR{{Hv-6E%FO+8F>i>goifbg_R9+@cFSIR0%M5j`v}= zfa3$D&n5x3z{+4g433q>a9#<83>?BO%~pG9*1r(Z01V7qvc;hZW0-<^m2LE3QrDKWRMWMk8Fdx(S8RT6i$Dy{L-9fgaLIy3 zZD!%bCgM9V{hEdZNlnoC93IpIS!$z871%fU!xaMH#Wac6%tDF+MB4n=N}x~ybsKaN z!;DFSmpozmV@z35XRVmCDP%!2BSE`ApvaU1=o_}>2pAKlD=8`K*0jEpPgWj&QBjdY zP<56&98SQbl9pOlkz+D&c2|+ZkIZ2$oO74DFG4Yq2H1?@M5q_h?de(zv2!x;VxcC_|ohl+lU*>sXXIh|tKl#}IlWQ9gNGl>2XyiA1WK}QUc1EStY(E&JL ziL8ZYr-oKi0Jrh^eS&}fv_G8UVr+kmwzDW^+&O?Zz_({s6)qk)ub_*7tcxuf2R5rx+jLsgQh< zq&T*McwF}{W>xWspsyZ+>3#nD zH=89d`uM))<@rRWv!Z--LtkA-Upsg@9(QW}Mir|X3`3&1%I?Tmk8r9?K2Td2Khh=&Dx zD6WeWFv0s91stLIPkpW1MkT6EY2iN{w_|U3yJ5X62me2tp-=U5#`ty=gqCsE1EPQy zM&N@YZ1|!!nKE8^&$rgIIHAY0bFw0`3Q^u-bm1z8D@Cn3t-tEu;0Y_;apC}rHYlfh z$>L+lFUj9MeK`TQvNyOK0A>Nf)3U>h4_&bcfvKECg*Q6O8DICE_u{xP74wUKf$4*D zInL1U{Vx92W;B#FZMGZJ(ysG%f|14dX0T#q-N)xdRz4Sn#L- zd_q1(?>G4W>_a)5$L5|LlMPDXURXBG$_y#x6g`CWj~bl`M0xV3E2Z_k@)f#!<_ z4!UE^S~plUFM-P}na_0TRz(iY1mMXJ;8gI>0S1pT`seS-=(0tD8sx(G{MG7>@i_qC z6k&^kDSOY)gYs}b`v6ZQ94HHhFhFLku>fpBz)^FIvw>!w0&{AAnnDDeU$!$@DB8^$Ot99H zQ|xF>2fa=H>8xzPegNc}e=p&C6#(M+iJz00-cl`Qi1yZ+IW|2Y3wVaSQuYbJ9}Kiu ziHt#wih%V&la!PS^Ct|GhO31R+Q0f){%hDEjM_Ck93db)+e;9ldg+7Sgc4l14BV(7 zU$)+xG}I6^+$9G>D0-@GF*Lk(_|Xw1VTg!e{r7w0F9CKe1R!)G?(vnCv6(eyPNu`@ z15&ieYv0F!&C!A!8k^8+_vTLLDJWyxqg+%{;01+&kk{3$jB>(yyxp(y>9hmFkw|P&_!)5-aEu&!8zijC!myK$!-3RRA$xi(qs6zSnXy%sc9qO z`&X~SGoX^{>Z6|Pn88BGCzpffI{fobYWx2T(0%c*hWYnr6C(bLWwH{`ghWKg4h^qE zLHv*d@ZJUr?B()@hZADA z?R8NG(30Fus{-P|LYN-CNi9^ggjXIC`>FpZ)-i_a-S3kddXRuQ5 z6htRd1$#+7?@5=jd(9x%HC#M!nVt%UMfhFE;p9*$dw1w*bvYL*#{E9mO%fAQ?+>Pl zL5hjH)x{*jBEzX=TDEhwzATRusivQIboNOtWA){u#5pg^<}=&@>d6YW4|t(!Jb?OR z{kl{ed~RB)L>y}svtOc}k9mn#!m#%J4llBroHK4`MvyVS5w|1y;Sg@r%0D zYtr9-Psg^!1?jJu#*0I|RhuaaEa2NbTo!s3+=#rD7et+sy0S^rUibUan`|}Fm)OEt zk*X2D6GH)oruODwKn*aQ1RRTn8p58cf)Z2FOf|jyEcnF%xeK3}L74vgu;+4yKM#e| zzZ0f(SWEp7jAwf#a+l7f^8+cW{p z_>JMZ9E`))1X1Q60{n{;Q!9u_27bc2th`L07iIE9i_V}pr_GsQ{m*&8JpTwM*T*cw zh@#Bm*x!u7kRgn~#4ut1ftyWNhtj_Z&y@8h^v|0(V*N;Ok8G2elK}i5Vm?KiJpX+* za{_)wbu9pd@~*NUG9SYXw9xeHaUp2B)g+MXlmIZ(mf0jOzy8zpS)Z(l=&U{yfHl#0 z8I2~R*;fD-qIud-;67txabu%@l)13)@$>#u05?D@BDb(m?E5IQ8XT%WaiCR-fE0cZ z8p=JXkeP{!Tyk?Bx;+Qw6eW}mECllrYj6MuKxp}}xfu_MR{|Y`$A6{c_0Km2ob7GN zftCgaMrQifR_1_7Ohdx#jx7iNQ(gFWe-BO?k37$EBNNHwaN3XMGmuNWq+d2xx0Z`8 zu*lu2XAdmL8c>&YoFuC?vts%=0nSxl8hEXCl+oKhl~nQTWHk70HL|S(uYR3yW=356 zX{6q%2+V}m)y?SnQ8{yP#Mr?6e9GYC`kSI=Sw}^;(1uqjvCI4lnEw!qcKV~%Ts4Ql zH*UO*fo2up59dh(h=KOmAF(jW8~Z*i;Dj;(#c4ZV+ra_iPlVa(av`P*#kK^s&~CjsQdtJ$!9?ZtO*&TnkfcH`l!$p+MQ z!I|lB;TvyNX(@-=@XcBNuxux;OYYiG73Bt|5e1A+k|N&8POi#6KXzRKGq&#t@Yzpx zehyYiXm}c!z9B=Y9F<8^;FKWqGF0msagyM7piF_}a?qFwmKMdHpeQxm!()lb;=Bv4G zct`#};qMKT7KRZhto%0N$NWRz7a1v576yVZ#ygAz=Fx<@bG$W|sf8)o82JE-#9 z6nqhqfhv*)SbsBKBAh7(F5l;$o0fY1)6DTUF+(-sEiz13pbpIrIrb8$fTu>2F}bMH25o$> zVeH%nJb_r~BBtd`d}geLWMv0vQO=^dH`j9B1%R zi*dLpdXS#Td;0N*zN<-4z4>5l=|V6_g2T7%-j?I&hR5~n>955whi0UbnQUh`lDbObpRFA8>=nJ@C-$d?pt)An!Dt5K`G8DHkjZ}%BC-A9e1w(sp#lFSz@ZM* zxi`23We#uy$I7XuG2R+TTUe)vsY0YA2oz6(YeV#xV)qn*flNRjQo*B&ka1^QLTKI( zZ~zuHqJQA-j+Uxs{*YW)R(u6D4}BW>M>#cH#7|g}pNQwf;(?wMrvq2V7-Dx$g9A{F zIKjQ&4abwXnT5#qvjw+u{`LwU#fy$^&q|#4&kJvcDr_)UpxD?ZvM< zwCe=!D?G|wyqYhCs*XNt{7yRjMtt>-=d`(f><1Hx3a_KFo>1h3-wvJ37e7R|D+S3F zr4}@NnV8?oA}eR+!F=* z@`mP^k({kJ-VmM#P{wUWc4IC7|1&%K>~*sxt}`3VK!Z1`yp z_XkS>MIvqwh20n;1DMDr8Z*0uxs`*-;7g%t883j88O)C@Ld0l%LM1c*Q#yYkP~t`i z(PRujC}1qS#cqztZK~X~=cQE|0jE^Ql~7n9RF;`M%c)tReIbHsR5Ia|&Z}CLPSYU?G07ys!G=pk&I9%f>g5za&CeBv6&`Wrs`BzvimY_(mw)fAsc23~2 zP@l(fh|`1daX(?=j@yRz@}KRGhGOXXo!zyN|LMrKdlQ)ushNI!Y<+_Buw85{|Dms> z(o$OKZ0E6bo|u@k94Uv-H_!42GlOvP=SE8KGDAIglw|^<4$Xg{roN9abFW6^_~hR+ z{!@8*@Hbi4Wu=?%Wb^)LAaLL34(CW)eZteB5zi4)E4Gn8Ethfmnt3+l@^z!eoZZ4zl@71c?6Wg(piCDb0iu!GZ z`@W4oREGiE{H6?jUR*C0J9mWaK^z}&>h=H-yqve)s~r?%q4A;$`mk#WK3uK1mIVns z<%E14(qR9yR^>swyk_tjm1XE+Y16acb&vE50dN9OZ4 zGc(x*C-LgQ`KNwoSLC5Wm6rr$!a%Ilp>a9tQ2-Mo?A>f@W04e=7zZgg3)C!HLj;^Z zrhd(lPk#mNd}lJBIC$5bn8e_((M1%6?_Ic*n9@N#lM=jzsDz8?6N5^tvn2;uZzD4R zdnU;FBViTl1`%2AQjg+~%5+GyGly}uNZ|YoIDa&B`+X!dyDozde~cmt3KD}Qb0}~~ zi1=b2tp6bHXYdQU1oZO2$`E!)j}O?(sDK>GViX#g`C1aH@fu-b+T7X>3M3FILe(@r zy1zt1{qLherg;&<$bbp*f}IYQkFAh@)1<8P z=M4**_i<{XVcrJ5u!2K^6v;x^@6+CYH;bVUzg9eG9{IcC2mU9Sxh`NU-#sf{?*N7H z9b+8dIRwbhgtc@)H%_rTfCXWOIt*80^dH<2TU#@Mh2IzQe2Q*4|0(~{{$bamOr}Uy zDk)o{etazxb)SlN!OXa(tk%?=tw>lY_wiGwlI75;8O_a*&vc$v$~Zw&-(c2EE%lW9 zq(Q!osqo8~ksRYv+H?0}kG@Uh!U=L@lxr5l%)^Q60-p7VLheo8PyyUVWosmSK}{=^ z=VAWz!xNm;?b(v96KZJI!0k$d=ka%CPv+>UR39@Rg_u?_+CD0>6R58X>PBh?#@Rs^ z=hKv2kAr^;M+w?|GWg#pdOCEJqlaDLg|F}pEHljriNM{zyzh_ylb%O=#(L7p|qGA*FK)c0(4pDV^JVdgS>kI_$PeED-&ktKqm z$M->}olg6^Y6X^f=2iUa#}mvlEp?u)H^iK_JsKNcm)+StXV8kzlKu5BlX;mEqa(1| z=rW}c|8?n#-Rtv>V(}{Rh()rDOi`X+>JqPCnwE2j{veO8Q1XAsc z0^RtZsaInB$$cl}EOq;Em_}y*!C>)wklOX7_(_}iKU04@+CrZkB=sN5klv;2AD86k zALdu9PY&SpZpGNw+L@BbdwT<%yk-I+Z*aE`E^hbN_e#(f1%1#U#zM#hg#i)nYQ0|} z4j_|0YlLp1gCH{BZ`3mQvm4DA2Tsh7&o`j}$S1#4^uM1#&DL9+7)!2bhECcDQrb|B zm(~Vi21)MqG0#i6m&*YCm#o-OjAa@y3l2ydXQ~OX{J!+h%!?Ld#^RzKO6723L7+h^ z0^oprpG@d~S)Iw*fJdq(4SA^h=vcsKf2 zPIuZ?d?a`D`VY>YCBF^aE#VxFrG8a5s_W{Rt3(Eu(93H3Rn}Z+`8AU67xLeFX_jnz zPz2hy-9sxPxsQjlBNqmXV77o_EJtlnKo5ko?TQbRBm!$*cmU^8uk&u=UOiobU^uvXnAeebKxsKjz^_P0}On*Dt^ZwS$yx>)TV(DPj z>*maH0n+`o;u~eoha~%HMc%VswrtpukDa~%zx9qWx}E#!mTH_JD;MQqAzR%`(*>W; z>!+Pxw0@~5)SAj7Iv7M9&vkYBA`go^ioz{VTM1>;0S!L7KlF*sm$IlSo{;t8Gy|0s zfCPPxMk6zR*E#@2K)S!#=0i(ga()cLRQeqEc%ZL|Jj|(&{`-~azZ*}N{2QO6XAM&4 z74>;8_Yb%-d3n-$cW3p{Mzl=l$++h(&C3c-vr6+ktcDS=u^^wbgngv=J#@;sROK=c zYo<>%6FiTHN5&ArOI|iHjZ|E|yKk}^71!}QaHV#tGN$* z?X@?lO-V!`JGoRp{&v(Sse-x{os!M3I<*5*j#EcL5liWfJ;=V zXzObfiTtu3>f;9VmUj?5Sk7pf$h^dH$*I>bt@hZZqKFp65}!&JDPP8O zV|>(Va7mC6DAwhc2MR7s?pxGF+87y!=iU0kcP1UA_uH$6cixlrsIBh0A%I? zlV=E0{xS=})K%!du^P(nXdirC?Wett^+=hWoI5j-T}Bqc-Wra7vjU^rRX z*({c0f3bfe#;_!BA|viid~6whgZ73;Aw*E*12}($ah0?dz(Plei9|p`4%sBw=xb?d z>w%i+iWl`HBtis*f%*fcLlP1U*K^PPhnrWOImAbN1kM@Pv+B*D=7G@9ov*zI;~It&4It+Rxhoo z8Ch1*uRT+e9E_WToeQnxm(@$5@bbf%cd{A>Pla%)wgMoy%4n#hl~v2?rjs=l^hP{Z zQ5dnI6qz^@Q(V+xy#8h=ZMbdbRXCuu8@3>R>tLrH0~^FcjwS=8fBsMhW#W2zcW;v) zZLLmx&^Sy^S~QO+S{fZcmW=hA^aN}L?MC%<%flIei`@pPF276L!=%DP?K>Z8_tqyXbi=68hy?8ny8HwL{xt7pEj#@K za#2Sm9Gd1k#YY#%-zoT_@v1=&eQV$29@8FSk#tYVMH4(!59Cp6q&E0R_%ix;)xJbZ!;RL|hxMou?u;%p0JPIlSk1 z9HN}ZU2A2^7+PAItp5emM4`-`B^ub1z7`wuMjy z^4~K3;=-^7^YL_i(pI-O^-{mKXhaK7FMR*dmduw5Fe4+VI6Z9)G{2VE>f!TQr6!@ptWD^PV5 z>6g4WyV`O?twH;%dGhVvRR?kD!t2kOLQr+#CiMS!Jl7}l(E2>Sxt(A`>=~T!DAL`$=f>a%aDf#k%UXKxa2XD{$biaA=uwd}p^( zc{&nTx9YaD^JS|5|44Ey*BYYZP_B;ypN)*Ze4SMnzYnh(^K+-EPN)6d2V$vx4)m$! z$>{OZ5pVnnvMxNp#5NbX@IUBg8qd5Up!s6=rcRp|nS+W#45+xaqHQ6?muH6=f1Y^& zoG0SEBY(4%fk|9bg{TtijhVJ$!vHpLwFD~@_EdceZ%7dG2IxJMHxPKcXSV4yNeCv=GJxEPDrr3=|<^(bWk>?}nVamuwU zFTb2l--=XlrTUUBpy6}}1LiQwVH{J`WfVcvZFS$Z-9y)}`esW@UA*|Q)5(d#-)`{j z?rwY3%Dg(6tfHD<+2`&xX0*3`VJb(Y&LwgQoD}9{w~$-j;#hfl-OR;RT3(?rr}73E z^+xAxy$%agH78Zg^HNcMtZlpWb(uap?#)8*tY+@;`GbH@NC}KTT)try-T0#ky>-OQ z-tehz@{~TcRl5Dtdb_40*`Rqp|3>Fm$=;lVE>U_8AY@_FZP2?KhoTL$p6?SVNjO+V zy$qq&_j+@AChT|DdWA0%;LT}oB8gEBrzkr4nb6`V7%|`ZL+|gK*AKv&tfp=J0IvyX z=uI9VFE=9y?`+nS**)A+Yk|?^zz&4FJD*2BULyH8MmXO@{{_tq3pwSv;VBqGmuRl( zdVQm(F6C5gY1-dY?21=1g8uR3F=-dGwpsW$tt;H%qvi{?ZcULPPD%lhYQb^EXTR-b z)$ey)(={U4f{Z;i7gyq9YZNkzXR?V(SBI&;a2*JW3&!vy7pfD;(OTl3(BpUX^TN+{ z@Kkj%Rduj*nZ-Fkj>(@7H661r$wj;<+w>XRl$qN+zpLm`mUqA?HXfe4Oe^aZApo0n z+(c)urpyayAHLF!{5JZ&2mAdgM4jiS$W=hU{FR{cp~Yae zG@zhB$YfsHr~bCo6%%{H%@zPS=873THCm^W9@CSi5NaCVn~Bb#cJ*GUKUpognDr>G z*+@to=E$#;mw4v>5*N$au#?CE$}sMZ^W>i!7@_+^+qNUDzkzNVOR*&FV$9x{~Q$^4t02CCbxs{Pin_~n`D@o`4a#! zHt^;qLA)I=*%@R92>tAMvOtEIM*zSRh(TtkZ{goE;{1s;;yx(+_rLOp_yxtZrtw0r z1H5NSxBsyW7H8^#Ip{+bz*#sYe{9oaVQ>g1IwhZI5gPZw?Y|$$Tbs}Y4`!|!e>5V1 z03h>v23>usp)Rc5D-yzpa6vEdWfbsYUJ@w7x?A&O39( z8;w~Qx^sdplgCV}p^$9>`y6c+lJu>ufx4x00HP?hc^yY&7f?6wISMf;|H=S@`w2uf zXFN;W4>dum?PkY&yQf9fCmgZWz&vDu!g1ubI~-a*ij9*Nr>>gasrKIY`#LE_y&J5! zE;>1Q6qKth+@tk#G>DbN*v$EPRsA>57XXNg8khiS{wZTOms>;s!Ec{CGRZ~Z_EWJ3 z%4cu1`S|4;@HekIf-E)IA1wLhT5u4R8@@8$8&FWY-!2+Su)H&blo;|vTEpF#m)3wbC- zpamEf{_zV zO;|&59q0W*7T)Qr>*jjbb~g7w(tyR5$G$}Pqpqx7Q>UbjIZ-&o8gI3%?urp?a{NH! zu*@Q17w8F2W342HLo6|Lu&xb{qMBC13M{PBK^y)60+I0Uw< zov)#Aup{?tG#TrT=E{HF0?6pWg?GSn?@lbqvC{0&2eMnpN$+7tlh zGU7O>1AjPAQe*ySW`O7LC50UnWM?qOx*NQK27VfUU|u)h4|->W=hO^^b+acRUj;j$ zxfG&uW5US`O&2D__1vj=3;4sGc&h^@;=+8R-ZJd;da;tym2X>{E}_q# zStn@jYkIa+p{@v4G_Y}Tu#tC=zgr?wl}7#{h!s>aua;XbhH^V+%u}7$s;RA^9HAHD zekW+pL5Q;6spt3rXT%v9ke)&3Pt$2eL+Vcx{)D!jUz0a)$j=xbNsOeyg-hXEC$Qv^&R>{+0Ju(5CZ%JazP1%2Fi=BDPl*7%5b3?nZSwti+Z z1i_<`&dR!y10jEKOyPT>NXXvMi6PMb@9~;WNeAy=0GS2yVv_Wm-cQ@GR9UB@K>lL` zPO4ny;4u?JnVO8COjebv%x!YZSkJD5DFiGNM$s`ly+59?=5>$G_JX(3h^Qqc#^*)6 zSzpZhtmF=`X``YU<3!XYH)zKy=?pM?W33aNjf~Nsy5tT|N zeYf$$?AE?MH}*T*Nf_9+WV@BMM-Ms*@B5DiIoaq!^xZyJJE$@fog?nz+tR#0KfXMS zce&s8mW2GD(EB*S!2mP@z}hHaZTy}der!s=!jwQ?D~~rc$2L9zVOiY4Q83YG@| z=wc;t2*CN5mClC-Iy%%s0*;*xL9@j8F*7Y8JvN2_^w$6ano1TnSEk?(0$5;dtz|{< zcnl4i)_$jA$b>rlqkVI4H@4Bvl_p_sJ+j=!<|D8*7A#@hW~DtjS*7Vexx!s)vzFXu zJa)ad((rITyz)oLZehMdSGyM1df^|c56)LoQRzCIl$XyZEWMh@O@O4wOf;!?(PtNH zsZqM8>#4uZy|}RllSQ%nxW3(kZl!(Z;^M1;kj*u|u>z*S!x#csfQ?K+&NrFrkfoM3 zgxF@F1-T#`I1HV`aL~LH=y{rs`QZn}DV>q=l2U^UIGm120+(sN*Z?x`TCBisjvyyM zTgdIx8QS6C?UNAnVVjN_qmlRiEU|yC*cFfLI>v$BB{3uhit~^|8HmjZ56=1*9sjdd z>#EB{tGzk;)1oXhmZKQrLAg4CT?GI~pcC5u8-!Vu``*yG3gl>q`~Z34f8jC@g=`Se zDDA)DMvJB`[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%0D4LSdTKZ2*;qgSa86j$tkg3abpj$LRD$? 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 z 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%0Dj#97FtGTV6+1fRe>wPO5 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�OyaO&d!fyEf*BCXPvTJv;G<9r&tM< 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≀r7LV7cI6DagT>S0j! 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�lJ{j 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

    3<;N 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

      9vHYG8LtKJD)V>GQ%p0qN)Y@ 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
      &1*Bn5(O3;ulWttj3fFVd}8aNJq7S7HUBXZ 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¥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

      EXJ3VjTW)#yyiSu)18{jM#7_=5}r@KJA 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 d6YUj`{@Kx1=ICRPI*}v%hC?$O>5xS8 zQ;(s8V3tbJG--^7IR*`0K7ZT^@BVr;_LyUS@wBMCr>$9_(H5-8{WNQ3)f@|_Gxf?- zY|z8)qu09#iH+)~m!iDYM@!9t(9P%CkB)uLy}szCjOvqb57~@9C)cyHdMzOxh`=89RU}niC@{aN3NB@=msli;2B}6kYOFj3h&Bh-WzLVD zfY~Ijs0hDCTwVD@^&%~ksWv`NAj^PHKP_ees1s3$31c(Du3K6HA{XLa$q|N7J1fX- z{v0FY7exc`UaR?Gt&5X-<>9|Yo6Wb@W+VEfXz}}Yi3t7o$IU}pp^|!8a>CZoA4rH# z5U?k0z=^tL%2gOYfaX)Ak6_sC0Q8cj}lLY5b$+01z?_$3aWI^LXi+pd) z(ki2dN|}Irnm1V33*en>c_K3{`fG*>ByqYU1>7X>$dl6Ia%tU8wS<5f^DK9>4 z;4E!6&Q9VD9F_F962)0JXEt6;65SOtB$Eaax#O*dkxuwgK>!$Vn>AalW;klMHV|c! zcvkrMv8fzS@gW+V<@neNf_23P6OJ%4{`b5}o`!L7#si>)q{mRI77*U4UZ;kmGt0%- z6TLa!KmO@p`^ffbwP4Zhkfz$^-qB7?Zz1E$uM?B3{^R;fLGf1@Kq?+af|I+IY zya)?PLIRY%R);gyzhp_8!gMrQvf6vGyRE&lCZkm+gYRSCVz*03KL6Q7zVh<{$#moM za73H~(h~n{Fesa6>`11SHVJp;N!?&4iIHAxltfsH80gt2j{#x3HwwU2EN%>$+UdF% z%CQfpa3JJ5KBTA<@dV)MsbZ&Sq_N8$!% z+Bjk=8OVvi>B){`Hc>zh84RNu&N&(4VRMK5tW z53hyIEVY5@lloN>EpA5D9`SR@F`LerRN3_DgmsE?g8!8<|L-Nk;nIsoPj&%Q8r^~@ zCx8GNuu3OgRY80rUSsrw-P!PmM6^4tR-He59>4=2j;k-r!}=+M&Yg&phwCwaZvbg& z!8*)r1QvEHu)D7%4#uemj=?veIjAaRWX3DxfPQwWQJAqopTR&vNj^JMU!!D@{1Y20pm`>E|k3{B6GDD45Z$w)D(-V6b4vkjmkr8jpZg& z^Wo6rMx(;|FO;%HT3rO$4V3Onj^6$OAAO~(3UUJ=3_WV@?=`k#Vgb`6=OoMY&}ih^ zD*rlKe|>(HD{&4#Ku-_HeMc3dt&QEH^oAox`GIi$+ot>>?pod8f;t@KO*R6A+ja*g z`?BWfOX8KHdZf}0C$c81my8dk(UaY<+4I&HcX#%-_x6#`~lWZb!Na;}SRXXyzh!1(<(66nsFsI{+R=To!PO za7)9tNCgb5h$NHp4r~J(__YrhKtJ3bmUNR{%SD_JQtO`UY*<$Q9Zs0n?QE0^C1t`v zytUFro}8SXo)%B`bW`+rAG9hIs@l~_D-GC zg~@HIO4wz2JxaYBwIvuJCAwcqCW(dk2#SN5T!^i1aDJ}5Ep+Y&F2%W}OmHYo?yIpf zvDJ1J_7@UgVL-7ow{E^Qda@hEO>B>7)$ ze$7evkr5Tgck8TOHq~frBJ*$@T_HG0biu!I-gb$x-W^4WMa`rY;~&LsXoWaz_~Oa^ zGdA13(R$~FdsvUQ-^OBM`_&5zR*N$4pXp2tM|lHvu*H9r4M~4nI{#DM1A+o86eh zOK}m$?xm&}4GZ6zsvWoMyI}-)W|1!4DnrPrZH{lH2kc{dG)8h%9SPa8VajRHaAbwE zX%PglNGlaT*|K1$%pJ17Ix+_14_;Rak({vq zjw@f+29*S5g!lQ463yD?CJq<|lURbjb$Kc%w!amGd$3|cKoMK-#LAMe4O7SY)>2*( za^`rPRmoBe$xz3_srUsZPfRpINz7xr|4Q!h2q!S|OGZCiBgPTBQWq9C)ExNj4G=K_ ztyW~HACwXcnTID>*6ZR_oWG0Y8r8e_w@EoJMbwYq^2}&u^`E;flWq>X>_y`x*B9x~ zG#|_BbI*CnvY$d#SD`yYj~zu0cD6Le+m-9fZZ*}!yyna%O{^sL9!oHhfj`=GIfBhM ze;r29iv9!~waQ66QQrymrbMH0ws8{P&jFSp?B8(Qg}`sFc^!nuu}6WUTEIom0V@iC z$*!pC6#GFD!}EHB(TyshURIK>oObkT8tXcQ)99$iotg#YI$j>HGKQ$!gUYm)!MZ}5 z`C((FSeb@!ovwYBikFK~?5;4C3Q=0BYjSm<$lrgp{=HK!qfwgLilBw_bOV;-+5Qo+ z@f*wHK+_L$-mhq%{G9i(yo)z7tIKC%B+%@rfpg;go65;B9)yKV3H6J5)!7UBM}U9b zKjO=J&$}KSjl4mHD^Sql+OpQ?1S?TMlnKNM1>YtW>+{Vwt6y`q5@x#k@ClRGv|n8^ zQ=!q9YS$;@hMeew!T?kXQxt8gqD?8;OqPT~@Tj@nc)4FbIVmyR-(vaM=HX)bhf1YD zzbvb4Wc2F_=kzMj=8C!aEtc_FCFRLiIy?GyGgN!?hYfizf0=EIr&-&$ zVlqJUw~JY2l2v6FiaDX7G6VLK0&F+$?DD3@3Ew5lWPY!EWa^1y*T+7Z1ztW`=u0q6 z3Y;eImW0i-@9AtY=)ilANczwzsQ{3Y$`kWq?{!7obX^Ws76)|*(;Uey@GCkrQ-gws zj9`B5_vr|Ep%t+0@mDOVK>OSeIG6&g`Y;H?n&^-5$PyaDstQ&!Dm0R)xdp);z?{GH zBmz?9D&qjQAOsk^>4YerN8>*6hOC0oaWG;+xeWRcxE-D~%%h>7Dg+K4?p`774Li9- zpZgll%{)WjRGcfvnUXy83%-x)HoS*`9xH_bzmM*YG8mHc8Ar6@8V-2qy|ID720;xCmym;SWJCsGNYjE{f^ zY@H0c#&s~h5yWXFz7?Vj>&$Qkz%d&xu_I zR|7}qad(>0zT~T*Y9n9Ez-Um!MBJRi4?B`-6JN6$!bgZ!HX$_P_4*w^<@N>!)C7-aMdn1O+NU6L6+f&-a98guQ2 zm@byV*i-q6iE(!|qzfiw=nJ+6Sb{cZ7gw#ZU+|}xU0fF#{w~O)@x<<`%!BtK~V}Y#G&RSL92o= z#cfru*JFG(_YNq0i@(yZSd|YY1)kuQs7=NSz^D8xQ^|HQZeVeL2U-Xl*U zWXj^A+CIgSW7aEP@|wz(s3wJ38fDd%T-T~w3i@7 z{(f42|6WWKbAFe$#br~(h!$)6#U9s|)_T1~{ z*l%yFE`Rf6<+o*gj-QuDi%p!Uc$<{i#EhKM?+qM#7!wDuD zuQ*rnI@AOo9Ju!F@=8U|08P_2f&~mlN6AM9MSx|PY8Ze`0sJx+3`Bx)Uy!xDwgANm z%8TN5LmexLOhu-ivZ8uK+}{U&Tc^$(dMX?-=-cy%Iebf{YGar-*ovo;dA^MbUFbp= zd4+PV+n8d;2^eFh!nm;|rMMOogp~+5uOKIo zGcO~0(AW91t+c_p!+W8JcX6xXT_lEgar@y-8ePud6rEx0PN6RmzH?iW{V3M?Ppb6(IU2I7gps)^&-rFQrc$jisqIL1x;;!(lo;!17Ny#7#7{)+kuyI`2t#uOeQyQo5v z;+roSy(Fd@mqB9iL)}6b^dBpcj}v!;)ZZB3bh?&^<*+lPwxbo+cTv&$P8Kn)k5=HV zgCO*;H5NDtZ+KdUahNu zL6bmUE5l7k^;>rF;5}<mNSw&p)x^frW%IkhWrv9lfImw0fLXw(S*JD_()u~S2{%=v|9{Et z?WQ}VKAr1J)juiX>muz^MiTQxPsM_e=tJ_MRBu1EbD*m%VLKg*paG&)h#6htu-Xtw z6|%;#0Kmhu@U>LKg@^$%t%B0kt-Nh85T|L@hhjt%R4w#kNosHUOPO^H!sS|o^`@KsPGw6Q@LUG?w+IHe3Hrt$OtuL$( z=QLq&A*HNm@G$69-G!IzmD@55;022`KyTYZU0|dwOvh3BRqcKM0J-6>& zyPV;3skLNu+itIFKUcr5)mu4_I~O7cSug3CrYhmmeH5W#?NQHF8EvZJK2Z1V#;N4F z%on`?CUk7xR@Rr-m!Dd5A(@)gMbK5lLY1hW))(Ej|Gbeu!C{`31OxMvr9<0D=i;)({?KICO8MOZV&VTQur_Qw3wSzB<2;8iP*ns)rq= zlr-IlwupvWHVtm zxbRyN$b?p)kEypLr!6CVt4EjiLP*V$Q%d~&ROB+9ru`qAM~$8Bz2lwdI}KPHHu2^u zlvId%vU9Hi8VRa(k^cbA&2du_yQ`4iF{@8a@TB(o>U0BQF`y##dAso8T*Wt!pQ`Hr~?04C<{14^k`r-~p|*ter#|J6?a>lkpyTY{C+DH*f^ETlYpv zZ(^R0T0W9@b^O*|AVk7+*&b^4zLA1pG{>}&cVzGf?&y*})3fY`%3#3tjQgQ~(Pwfx za>_bHfF#epci{r;ORFKM&&$zNU_TPWeXX~<`5U|4-sR>C9AxVQ{U^%LvTSN;tm9)+ z_>kyR)4EM75M!utA@R}EST{gVx-+(GA4PQtqprkGVd?~CPs3<0qoVFKh%9_fkaXFXb|;f+XG=n3C{3ZO<{e^7DCgE1TF{ximC?>&56v0DgQ)Dhw)0Lz-y0Cp8@BS3HVI8!Q; zk>Dd?OU9ws8F#s8WC51B?787PHZHv0+j&!i^O1=qGJSIHt*ugj7VbOGc}0qcpa+70 z5el(YBqC(X8qzp`1uHsb@yWWkwo*Y7r~_KI&_VKyp!fA7u8}FR_P^4G(Wae+;No9)K=<z z4Sp9}k|p)^>etplMwduyiDlZd*;L-QA&S*3vp*(Vvxo9-N2jho_TJ$1v@WH2*)BvQ zP>u8a_}P)187kJLgQj-Ip%>otTe`5M)>AX0x0T_tRN_53xGx%wM;5x2J_O6Pl{NUb z1+*h*ox>LB!M7dx<@<5pzpl9#b^2L**R8j`?|2dolV6ST`&C*ubSt{CA3XS`*7n}l zmEgcB!IEX-C6YXG;(_1iI$~_Wg9i=88M5aI6^Xx3zEu_Iz!BPm^pqB+%P_Ry0nPTH z=e#Rw=e*m%#nR;$s>xgankO$)vg&(dT2#bL4Q0;KlvPgEkMv=16)NMQ*gtvK>5r1^ zkKAJlyG*ju&~w*&{$8n5qe%kzC{6&EY55<|(|wBvr+$c=S*O({0t)WV zVI`Hi>+0ObT5b88+R8V#Y@?bnXOc6??}%fJ#4H3HD#m^ryuXb5#lm#aA%nw|O`0X0 zrWjkr8kQ^kjm6hSFF+~xqrWb!zswvxs;xe{cmO3bNP=eyVM)fx4cW(!VCUK;sz&+3%HX zBFoMMohRn0J%G(FQE@=JIREOpWBO5Mq06v$k@UsnB?v?Aeda#0TH(Ck2Rm@bjA=^r z$n%8t_@6>HqqB)FsCUVQ;k-3be3|%p0JM9x{;2-&8{KY>3gNPv(h0C&l4u6)XSQ_i zhqTlW>&x|3v~;+=xdn7mqqTG*awV5osL#ksZFS}Lv`VCH+NJJ**{ERtZ0EcLamH7IbP#Rl(ldA-)0Jo!W$a>8R|o_1>DL=>T*nNAAIAg$=(Mgn6z0jZK6gm z{0SjIFKAVP+eJQjcHBzn8{d3Gl1#UI6X_Uw z3~&aLA;QV^NQF$6eSl9Z&WJN8d7>b!M9UqC9E@L-7zHt`Drm3`G}300biRDmgVTh(h`M@zB6k~mx$Y6+E zs&=L(nyxXT!10fnCQiZyAea6~SsNry34uuMq~#)Tk~jemYb!I~@|h!7 zx}%#x@YEc0D#(34-rw4{PCwLdw-6DuYC0u`#yD?z^eeIZRp53vm8QNa+B+pMh+w+D zZi;P5spqPYH7m=v=Y3>KL`8_SE$`&s@cNv5%NvS9huJtms1}w0=kadCm)J`&mNuFOS0iGM`~Jx2lsllZu>3@qZ1f4qc<^p#PR)E3CW(KHHL0e= zgd{tZrSJlyQk~(HEX6i#j+B;Q-Hh>-R#qRbpu;LvNN1Do<#mH*kN8TD!S;qqW!5+P zTNtZR9WT4)SXB%Ps14mj28-AJFpPLnUq0l^*%L>24(;r#_=HUA@F+nY9?ii{-F}zZ zGP|Qk64}n~8H*Pk1ZsWootVc(!QWTUjT+>;2?Cv71D#7(M+zU`47?q---2ql+mSlM z4e6+l@V?CaR*WBxZPMKRtJSH(I-}B@trW?(G6HM!$Y9%EtLv(Ky>!MSCiUi~>s>b? zgf`ha#hMykc{yw&FU6LjjkKZho{CHQ>8Ix2esgE<;Po*!<3I&HW>u0pUSfICEDvin z1QA};WE;4ZGxpwEV(+byG%?TKOKBc(9gvWg;R^z{oXNUjrJY+}2ejjmrcfvd~T8f8>rC6=4JiLPojSciB$5RFWX*q#s`J$k&; zy>Xqb;3DX{zr4GtSR(&@c0m~$ZD-XY=u~8UA>d4EB9rxG?TZy_Ux23-!}Q1LI_>q> zchQ*kHPl$3Cg)>hWk%v~k|`C(-&Bj#glC7`7}LGv9z4h-UUJNhAuCRI;vWdfeH#Hd z>B>vdXXv4Fvr5&L#X!Y2SX@&imo_R)Dws0XCb2RTTq#p4W4YbgB*om`DnF1RC&K5* zq!XWj$&EY>2Lt7bp>HNR)23Uq+aZ&?m~|gdg+GI7BXo{hmwgYoinage4hHG#ocTH( z7Ohyis@5zrHmuf)Mewss9YHToud}B4JTcMy{~vpQ+V>4_#LN{wf0%B1?V~J~6Lf0Q zF*r*ommS=xjI?AcseW*~7c{Hw=;V_8M~7FRU7GVYtX4}v1yFWG)$^5)>iOMhJ(|3e znzV#mI{ZGguqQu<@!v_LDqV%Cf4)o+Um?($&j^3=If_@cS8y4 zWrrsLL8gVlmpu7s|6C0YvEk*krBkJ6$CsHK-(4eoi4+u(W z-;FRZx>Qt(Vq3erRu(N1n;F*5?cZqqMgw-=NKKs}&ALh4;@133((pk?6tWcxi^h^4 zi(00e)|}3zPRw^jtxj}2H9IlaC6mRgp$9ksw$;hGYL8oXw{5%u8KC0G{1V7f4o3>m@J6N+TgP5n;gc&ISEN@U2xg`md z-{-u$@Sx#T@4Ci&eupGz=VA;bkB%sUx4PX|uHUyTDtfmItOx9~zV>L7OvIeGO|2iQ zh%Dx_3o+6m<0>oqfcOpZ)Z*xk#7ncGwdYSA_At4+#2*^)gZao#gOe5Ib5BpZs@3F9)F^L1UGrk}Wx*@a?9E5IH zn+50s0wZWK-@;kD%&L4VkhtF&{~w%3&r%2mEuU`|g&>@E(ZBSrBgUON3J0++EzRlm z-d;tST#X`E6K~X^8U(*!oPzr7^uXaXIvJggTUtzN?~;@45s0#h+^_Jcjy z?2JdX)!7XgBP5fqhnG`y_Nnt{%a>|_jdKBQjkfLiqjeeDlx?)6)*iA{_wjonO)C?g zipgzdZ7G@8-JNGDD(Q#q!{&XHw^j!c5gWpcOT^Naz_ln83=_U0&v>VmXg!m!@yJvY z23^iBVEeSvwk6rVr&qhgT9=Z5I~m1rs4NjgeRq*8QMga~i_vf*G7hdLej8vuzwME1 z;S<089mubVQxWA3yM1}V@FIgdcvw#g4Xd@4dHk=`q)VKewG0m)M6qvLJB{S9v?k4$ zDJ^#iO4B~W+R=sG26UC*hX;2l^4{VI5+J|*offj&4O&)@pUmImoIR82CK+?9U>`35 zhl|Q9cgwi{g~lo9sr+Vod}`m7CH;tFr)qK~>kJ3K)C8PN{2wZrY_fzjD0Q6DyJe{| zD)F(4aww)biff9b_Jo>f{`)>ODm3|Rg_(BCxAZV*2i;EKyzqk_W<2rHXnbz5`6lp& z<`oiza?jyy@HKRY%a3od4V1g1?Iqy%liNVF5lxSdv2yaWwHC*;jh*9hKw^E*bu&C- zgjZ_?LmW)|8UxswhK6rlUn@mlx&aANc;Wu?OVD-IfT8|cnN#;=#@!wVtMx$u%P+7W zxQFl^VT>L4C5EHkD3e~q!^9Kz6q>Y(egOB-_O6+uD*0{xMJT9nV=PCv;3!;)5e19kOuNx0D7esQ zxydhDt)!FWluae91u=6HFI`m^8k}$x+vkUeK>+VKo|o)7Nlr*&_=*SBGmtg>stP&I zi9La^!kavTCWs>Lm40BGeZ(UZA~mGm>`^-wQ_7t=S5rpx%WaEH7Yw{KrNp4^tplNn zJ0UWXiTRRiO#6y+6Wec&4>y}zJ4eUbZ%IK{){{uFUN$?e;{0$#hw`D(tuE=PTYXp`)>c< zusP&YKQk4v=mb*}saVlF4Fh48cjeLC%ges>bp4f(7e-0C4B!TmLM%wgzC^H`cW=aj zI`rUO?{RSLdoMkb_*RGnEtMLNRU24Kt*W0aq#3!(SnN4TbCZ`|0^Rrlvr1!y4-$o{ zDZmL%VabH)a!k`ugHBGOq3Lcm_$IEn$aDBe94%vlaG;sg0)c8S3zWqHsS8BIN|@`kenGPzR!!!*@p;u&L`{fO zndC@O&4@=ce@o;!bDA|4AicHUGs4^tHk&SwN zaC7HlWChWn1#-w@`aPJsROF%9UTk;Sn47G9BhRa)@k1zHM7?K);APv1x~yK)XPNs$ z!oRrhW}MuS(xN5$m33~DD-8G3qTuwzDD?U|-b`NLrxDXA))>(WCixYO{$$-~IzEf} zwr*gtLj93A#!tWIlCl=`>-wDBOGT8-%O6F1cl8tK?V8XuHzjClls51u-trZv_G2>I ziV?A9zniITB*AFJTE0j=bVOD7gTAmhy*N#F=-4O*s@JSA;$zC1LUkUYO%HJ^hE)*JsT+@t6gwP>bK!obv#RAGsC6wqK=X)sDafUdZF01q; zZ4%T3*%G0~*ht)03E@(9@ZrHLI}WC-pi%nX4e{=Es=ytNh|Q`*W4eu^UJP#FEa0fo z+dY|u=o9_>z;=+*!nN-ceH(C zTHe^qgt^X@n{DQNHeWRx2M5o0H(wm-Wk4nuLB|kPl7dc3OPM0vaqf+lJ8Ux_7>SRm z>Wl^7)R<-&5*nK)9LoCewhFnJudZSI0IL?Aa;F?=l9?VbrRe&DfdTQWWQOT7Enu-$ zeV!9+mg0l(|0{FLpvEmYLhI3%%uJy)$wS55&<4oKAX!ktZ$T%%vkfij9gZo~dZPJ- z_X+po#A`8YE>{wB`S_MnS+p-Sw3;D`BuE1D+HV?q|M6vD)AvSEHKJ+$gkPss0 zmGhS48-TXsN^Ny!yV=}S8+!w{20Q_E;LA*X&+2-jxeyu zkfscfc+&O-)}VVMx8Ray4&mepEf9-<)@;pwNyOY0R6mWjK&T2u zKfv^wN0R6cmG?EHs#sW*4CNr%!&GukU#AAO`nq}xyLjftvls{G?=eF^Tk5M3 zz2_4qOqngaKy>KD=#t_mXw3My~2>Nm$V* zbNKbgj#|(CH>OCzn;_5)EatjEF6(SwSJ4^Kxv|CH3|kJF_HJl9Tt}88&aLf-LiR#k zml%IM0Y1_KoRHU<3Ea~R`12^^p!PX`w)b2QDZvaGWie}7I$f~L481KQP-rb}l7=u8 zaF;gyM^@E`x0>d(XQ7~jms>%%tIvR!U4O_MbgG(=n8P&r(A~vMcaqJI*VQj*%M1#Y~FtguH|K z)3T6+>j}1K%s)>x$pB8y^P&5TH>_l>OKeqyB#Ev;GQ%?YbPIv#6LzQ zmok|%@{sYV?2fBnzi(aoJ=!UWz(eCRW{_b!oY_@^R?3k%xdj8f@+ah=vP!0V7>+X% zV!Ocl#im;_yYF_8L{;01iIpr_JS0HOhMXlW!yYG$tFNr^nD7#=AytU)pi(q{t4}_H zRgMF%auy!(t`_1B4p-2dOc3$z_#JJB|99p29j}`)r-BBr!}&-G+k3sctK~R3%jqgC z8?hZTl7qFlT3@k-zkDlBUL1D660Vr&!njX_yj{wMc!Z@Y9NFQu;C8y+^-~irrPHXf zTc}i4zpO{yoZXSt-s&3TQ7~uzj+7M%R#iN8n26Naz>@UcajpP~gGMxjN(3R|aF0|>6sMaX zBClf5=|q{^88ce|bW~joh|7jFB&h2bQ)EnAO60nP;#l1TEZit(!mZt1JG@O+=FxmI za!&NKD+z?nmcO|{fPmN^*sU33ieh6`_EW>FjX4Kn)ScBka{8-I(9A1M2`%}S+xNY0 zDWv^!iMn|a*Nsp5-xEmzRDOgd6)J549;z1JoL&#h@fNYvqgFj><4ShHLMYKONa2hL zb<_mT3o?4U3B<6sWxhDpz}|Fra&hMOjKt%b7~s^9w9%G&H+H*vERW}l2b#iyZEC9{ z+__BH!BdSD*tTJ}*&_iS7Xh`+Bv6?DxIiE{%RJ8aBIvnNj@FWH?{3?ee(S1rH}9$; z9*SuTn#_tSeNRJbMf|^_fN(`ax#`8|xEYQb1moDx;GMOMwok_fw)g&Z= zO%X!+`C(a*g*fNEFwMiZBrjl{g<4EUuwv;Ejdw8cRQ^_lZ-(f>1o zncUQ!(!G)uS$qj#S>}6K?Lpe`^C2`>8nFW65yuRT?xw}dSRH1tA1vlYLn z>V^ON^6$SQ|DUBJ`fU0CmRDBS9{%6T>cizns}ENmFF!*5zttxzU-JKbj(>&C#_oP& zbGNzqN|b;bPHo5OtrZGKub*x09O41(5sm@SD2UqTL`?Cs*E_pg+ix~s9qeu&nNJ>U zL|(tZ&F&Nm^@ErDdq1tS2COz5^a=(2+q!KmroY8nTpPL0Vi|AR{;-1FsP&6q3I)s3 zyy2V{7Jy(0#B}=gem(5=@rzMj(eLbHLqAjgJk~RIsEs`kYp?x8=VOVUfnl=#%*$Dl zQ)JR>`981yskNi-PLTH|`I$JmM1O~uRNQ`W#d;R{I}sT{PgJzET1q5iTc;J2M6z!= zm2$L#ORBI_V^{im_`d(PP{2~rH!V>!he%IbUrOLlf4Mw9AN`N}fPN zGCb)2lZUHc=>O;Vx0FmoQFojdMkT{Kq?n@>$qDfAlL#a#dw;1=pgOiBI2qWj(3RW- zV^Pn5RsFWz?X>#!%kNa&67#Nge0h%%S)G@gKWsO*cAq!)nlGo;_7-x!#DtZM#GI<_ z08xOhfBE6|Hs5R8)4NB!J!h_**2A5>vJe`D%M&9T40th5NMn0$N~&CqA5X6$FlW=5Af&2PN1qo7OYFHF>auz$4k zrg?Du5|GW!qwQCld&fKfKYRb$)<%*nio)~pxSr?yhPOuJ86jJUJGPA9d+xXrI z7n03>3TX7_9$w<+m^i@ne&!RBDx2?qM&C^TNfo6yIh(JO&l4pLr?>AuRBf94>8DfZ zDc~Ihf#z{mgBVMpbm8>?F8`fkL z$NtgEl?eV$YfKeOYQAz-?jU3*7EE$WwpL^(KjR+GN0E_u8j;;q4DuPxWHu7^hnRO0 z&@XX`^x#lDkI3>;L!o z^B3QmYTr2Hh@FSR<1RIp)>IN;eLmCxVP;#KhR*3?^0o(sCVBbXZp~kM@nUrzbFgAg zh!BLN%kd4K=k8&gs(|A)wFd15etC);yxkr2io>sB`HI~O^8f*atL`V#^e`qKr7+id z>p6Sx@D{iF1@vU^#u6#i?~d#6DIL9&f7|#PgC5w<1sG|EPn#(bCw3F|_HLUJQmIqi zjv0fvn&Vs3PDdTxUPr@Fg}}vobUjo7L8}IB3_F6?!GCC-etUR!3L?W#{tr9H#~|kZ zR9DIjiJfB}n>xGi1vi_j>i`2Y)=*uHj?-layHPM0Q~2n&&Ewr~0piZ9)_&{sCmi%% z>-3;`a^mkD9{W4+{n5@b$kk{2JIDUf*)a${O&HwvN%Qpl?ap^inC9<~c22+bxBTsR z)CSdi+Y9>V7>eU+FgYih+46t&--FbKG9Mlp&HvM{KAyv`_nY50_iI&}%K_E#ee%ZJ zq=&GlKN+Y`&c8i8IZb?mzI+8=h=^RP;+cZ=a`)^Q)cXQhahUGYWf%YbLW9K7osT91 z^jADbj7zp|I*;O59{%IUzp{=e@8-YY+%s6;|9j2f+|*A`YJS+hj{Hgy@D1(w!2W3) zDkEz}!%=@KqFqX_s_DK|Rc7uGK7aYQ*iKc#*T)Wl3#_tDJzhVJ*(fON??t7JZ;ql{(82@{RfBEZIS~H zW;BJ~xx?KAT||*NE(3V4ItCpGYWYCk{nu&kYeQAJ6Y%)4v%H}{YONw5cK*tM*NFzg+=MFRE2as<={loZ;73q8 z=QOi5*pvmH$FgcQ1LR{E4zD7#0;S-5ECFZu@d|eM0QMR9{_&jrt}Sef&2AfOs3`JM z$vh_NfxxTk@Xz#n4D(>skw?28cDUVv3cIgyBiw?8`s@F9@~zr+o;JQbp2HXCCr#K& zcTNwFYZY8)?T#l#==1pc{PoW1j&xR))%^LkKi~J)S6A(ta-%JyvR&(B_qcU*npLTF zaB_;)KsHEH4ON7lsChuWgP05z_)g@Pb6rXfay9SZ@c8Y{{<(Y#RX4n&x>V-&`+f=aaT}ScQF2?6=PsqwD=aOwNp2&WU8&9r+QU1qbxz73c zf2+G9nE>pATP9g8uIs^M46+8rdTd``^y#7a_P^iouIr+A^zh6tvhR!(YeBj9)L5rO6E2=58Xku4M-QE4> z&cXR!YrlEoZ@Gme%<5PBtyjl8$1VH~aOFy=F06Sw$I4NvJ(_qsZ_mF!-#ON}`~(l@ z+gQ5I43G-auU|L!cFy)s-D-u7=x^#? zEl~#su=Dyg3=aUgZw_DmS9ACD#9AMX$8%Wt<7pCzsY;{Cd|6|Z99cs?N+9IuJoPe- zjw8Yb3E{eAiTDD+f73j$fWT9t4J^s1kZuRxICw|MNxWkvLOit{j4jB)IMFf`q+h4o zg%{MUd87tZ#n!>@{@Lp$`{OmXS(F~Nx8W&4>>jLH^kFNrili#F3BT#o3U=Px3sl%t z0q@(NpalM!zl62&_6XJn!Qb6Q;Lynv`Pb=ejrJAu+ln(ItiwF=Tm2xv7{NUo!M!Ac zdk%toc?j+?g6HRBOan7ErG)4GQ+rsjI!+G{_oY|Z0oXR@$HCRs?k<-}4SOtZ(fmAy zw%C#@&k0mf{h6?3ql%esF1DbH1|7S*32Z?@`gIyx@WNRI05r7 z2j4v~4l&jRLEnF!M<*I5`>*vY{c}EoPAl98 z6CV|wC^^#NmGVZm&l2@$_YMXqAfL-dNM4?f(E&Prb_DVqN@RP7u;CsXO=0lcAo}e9 z^d>fID1`vjg*hhz*ZjOl95w$Xu!~O%1N0GCe)%`sCP3YRnY{`-=Nyd)yDq2QI2Eej z@beU=g!fjOqt?k$&HIagjCbM#ol;7!q0Or#FCCqmhRlu}#vvGVFtZd{8qrWjnPO01 z=Gzy1b)xS_gLYWgW;}gs4-aNr6g`no|GF`Ncru8_PizYw4s0^${xa!a-m*=Tx7HuN ztNB$N{;TGj)&c0t1JIx7&~M9M1T9%K`7WNIzkB?6@dK1EZQ8Y#R4tIEu;!&dr{31! z88!I1F3uOhsL9B>q=DmyRgX=zevIJ`C~cr1Pl7z7wUN3W!br&siDpWZv6XNAA>zWu zRin;GMehtNQnlYF!!5d`aQ5h+k48^Tp?Kd6kH8Uk6c40}X<*43DbY0+EY}*|W$=uY zaGInTLqAITFi|vW1irb4N zRI5jO@il)$RzSav>wHZqK*-AEC-Tcv5+t|j2k}qM0-MLL4o}clOs~`BP@6x+?@s8~ z3H&-cJw!p9p5-@}YQcTmJnR}rt zJF1EQ;?oiGXL`n8P_n;|TOk$kPbfS2>FwERiwos9l%Bmkdeu6hLjJk!HFv)~JSXh% zFDW_DC92M;E;)q~^e>|V`~lBDHi1m2fPQUzd#c7B*HDlAWYqO-`Kim4bz|FpHgAnZ zV>?k~>S%k$wp(J=IECjdSk8-WkA#5j{nz+QPnrCLvL?+x{6oJ%CXq+@MJ4BlXQxMJ zr{~9qho|z&F4{(&5!4@s%0H=074VaqUHOS+M~7T+bO=ue=UgBDg{M;+=Bb8?YXX-v z7OUS_deGWy!rE7DI0f+jJ0LOA$+qR^ws$}XJ9vw~ny*`@{Di-@J#>Nu%EBV~No7JC z{0mA{Ylqwl{j+5>rEb3+*aW zWa^w9@7wR;(YzC@p8Z~mu#Roz<0^K^ws*X9AQZ*Fw!M=kkt6(rzxhm!3)J}0CLlgNq zh|w7I3)Lg@$mUvOrX}O89=dswH!^VbTS_BSIZ`#vpsh!EH}3bObMkZBbB+eK%@e-4 zjC3*m+_ntrT&$k9J$-br&A+I`92RVwCwN0%?dpYkkaD_Kath$R;&K*wC(Eo_ zG6t77x_r^*iAn1+U$)hD*ucv)2iT@sb1S!T?cR>n<&r|udj5P2LAuzA6}+*v*G8M{Y9g44;^aWqixb0!y&12e-~9w(xCX& z%#W&U$ao|to=`?7{*Ty3HRrcG$s+(fZDUsuF(K(Q{u(H?^Ybuqp!Hw-78svT!YzgJ z@wUBo7_$*FqM=4bP*nd-Kd?HIv=&9?dJCv`WSaU&a6JHy^LDUuK^F zc@Br(NZD-FIaun2dy=XQGDUU7#*HUVwR!H5yFIA)JIA$TYj_&yR4(69J}a!*tv{Y) zJJ?VY!P0g42>?MUyoG~QUivlKL% z)U?BL<0!J_b+6HGL>nFzT?X+O=wWx4!Ky*+?$&U1(HRgh%eSY%?ctx-@ZS;qx96Ki z9zSWE4kPl+z>@|4@i&E#30-`KR!c*13XY=mkPTD{KWKNDEwx+K$KOZaq?Ao3a9D^OEU_IFOc-7W#2`?IAxMn^AVSbN3K)mxWlI%wCygrw?EMeG9Mmu(OALl>fQYXXD#md^Yoz zk=RTbaO7pa99@E1fMH^A_liBQ^?Jk4IKxr$YTg-8ZPV|6>~^5B)@%RqV?OKg@MLAf z$G=fA!Sfb=@;oWqP^XH?4KttwWu*7xrH`-Klr z{NMb)Z}88Wk7l7QyRN0k(K}0PQk8s5Pa<;3Jn4Oud(dkuh!qPy)ksmeRC|oQvFiw} z(oyismuVfC@YrDYC`*zhy4D<%&W3@N(Jc9Ij`^RHpWedXbYF(qn1saIkn>vhjR3`( z5klVNTR-dZC{*$tfNH$(?nC3g93-!{h;!$ou*cQ^~bB_{J08@Z56TLRxD)5_ih8YiUyhW{CNy(<9GZ&`}25h&7Xg^xCqUD z4%>eFx*v7?$z*-#G~Ite6vu6`l{%?o_8-{J|Cd5cf@R)_f6FwuT!A2h#pw;yfi zS(XxQrdm$9I>}(~``g!x<`z@-81zQH~6=zf+nc5lQI2>Sb zXWYKb=M)lU5`(y@J_P>I3GwcUNod=*NcVCHRnCf-P7N4$spq zCit3F!hNxy90+#bjH~d5le*XWAl+x6F6(L7xinwHgYz*z+qGk>a_rWPovM0oN)!Hu zpIQo~$syxQm#qA}W#*VzpbH5qb)Vh$io`NFRFdFjb$A}(RpC?P5%DK@Q~0uXM|f-? zBe!>9-`T`W^k#N{W&MW!!eGMk2`8#kQ^2dnPxZUZdUmu{HWJXMVka=DpM6EDhTS#l ziy(xnR8}gjOtKp>@za7-t5TsS3uCxC$zV1dvPr*&Y{ zg(n_GibsDZn85LvQ#(vBVf5I4a()gak^pc(kG~r9oJv6}#$<+@`V$J3>2v&2s*W~o zz9abV14WyvY;9HQe&x^f_c!zx{d`G(!OujXq=G+xfcp1?qF*z9O-4+Dz`thtc>H;6 zzE=A^~zv*#2r#bZaj{Tgo=!~$bVh0WB_9{Jn!C+F@G$+!YgAbs`UvdYHNpnUaA84Foh~YVVg<|ni z-A@)R&oCpVLD<_aqBvySqG1bw4FNj*y{wUXF}YlNx4QUZ{R8e_m&^PcU*k1e%AbjM zaOD|43EH@E3Ia@Peav?gb_}-afV|5k`g@rsr+Yc~=Q-#BhNqx3>@wQQXk4k)YIqTt zhRLzK<|>$rEuv)11D_plF}hc!P7g~p#=oFlQ2~{Hv07VpT3b%HcG>O$lCWO_u~hTR z)0#(0+}t$H@MMk<{UhkblOg=~3!w#o5K6AXaXg39QKy9vUD87h+S6SdE!!2B?TX7( z5xXT6J~xM8c{^YN$FJqNMwJwio2ip;M$0w-?`j_X4Qq`_q&V{A7W(G^SuoY`y;;~J z)n}Z3_l@o(E~C*BSNjEjFUyOYYd|qB$iMv!u;g|YMg}kbyro~5SH4SxPM4id>u&r0 z)2EuIH+9j_{QSikCNxeXh30WwH7~zeRbRg|FKaFu9mp_Z1Nm3o4P1z-Q>jI0aiIh? z>qo&kE(+BlXi0Mjo9@{t{k{U!UZGe4@{{kZV?2QoX(NHKhrf2}Ox=I&;PS9Jl`L>s zd04w{de1$Q1tgs+%{m{DYyQ3rQ}#Gy1fyk_gVLeDp^|!>F2$>p*pB%_I@s_7V=7&I}zPH{P@P-7mcx%JAUz^XLK2`HH=`+F$CTBDm6cJ~p z6^8z`M}ZAp2HhTIXdxadT7tY+0P^Wuf-{3Q`T2y#<+B`Y^pf>324|(<# zw~fQ`Kl(#8hJQ@@=xBIZ!Jm+HIPhcYI{ zNYmD)mTJjA{LU}k(icmT$|8lA3Q@xesCAVmPoDTVlC$IH$)A0AsxY=y%}wLcOioRGpwTwms%734WQe%A&~_27mr3=*_Xz z4V)$n`ikp~=@l+I_(v>7H(l5P=iqt%CAtw>vLU*(f}rp{#oImIkfB@({uE@uBg`Fr z4}VSY0xz{v+sx3-Y?x<-KqoHHNm-}>bbU1+Y_FH@?fPoz{uYDI=yOTfuMf{&?Kksb zU%HSx(d42RmV$h8dc5JRJ$wHfYO(SX$fiA4eP5~8eQs7mR+d1keW-zrZz2SgNYg@Z zrcA6Fg2nlsSG?PjIF(x8j!{_~w6@1IVG{LP&J zm+100ck1$+5?y|IC%`4T{Bq_lpG_l;Nd|39W&vJA9g__5mfsE48BzNzqxbw z-<0b9%R7TF)%}-u=>FMs@|k4P&t%pnrg5A!3C-NZG`^FfqS;$0H;8ZUF^D(i2J!M9 zEtDI?%exGM6_-MKGRlfgPbF0t(}bcYrDHGvvJU68Heb}3>E|4Q_{N`apjRj#@KVuB zpG!(e)~1_9G->tio4X^Th$ih8?t$w!2CV-lvVNa*e#X&p=+5Y~wxyd0Ap0N7>}0p^KJm zGq+*6xjxFKq!i>o&kPxje_5T*IR2l8q`Eo=E!AemaQ^%?8$JE;wES4vOKfV}Wj(}Z z>|#08Ja8WiJDITIxF@=JWXl~j#*DNvI{RE9;b&pl+~bYEb~ePs?!y!O=f4vd26a+9 zM-~_V?|uc1@}qIZ-|#DJCaTn&k&`hl@j=(&w&I$3B_2RwCQKn1ojvN@GDkg>(fGKgi83Vut3^%d+~ zIPYnuCX8$>y3VFXA;zymUfBE6bk)Z!E>}?4 zXf&8gJ_YBL0Ok{&-@_BRXv}>Y)_ti=O=qGEMsDMYDt?lhx}{HSAqU9epfe{=X!wQ> z&C$U^(rrVicFb{3VEsV<(jIQyeQ~M?+L)haj{Aa_32KVYzUUhY=WkDTG2lM5wczjc zdVGVU8)G8u5nk%((2XETaO1x{`F>YlQivx*x`>B2K6YQc&{>2U20{bBo*|U@O`f3hwAou<-iIQSK9Mh$!&Lm~|E@pN;y*~Tkgpj3VQF!F zb%o+TtS+yut*kEnX>n<7b!GLB_z%CwpKt#Dxv#^TY*m&TixpTHpi_Ysyj7WuFXx|E z{{Hg+^}aa*DuCtZzh-U!l+xtHTa{NB(W~O0VvMivHJCMo1CR$$L$1ch?dz}~#EpKp zJ&G_UL!%w_F~w}yi-zH7p&xU)%jLzzl?t@z``@(2VgJo2nhgE@;3Dj8RiqQUlAMA9 zD8yVDs%O3RTYM{htMWR$m|Xq#LwB&UtiFJ6oXRh$&NmBgp{{$>3&xlZ=_LXAWMB|5mSv-Qlny3#Xe?|4#Srxbcs( z2J$}(jSoSUE;aJU4sU3F9)|;52+%6t6ca81jK$PVfBXQ1tj2b79YWvr6r{&@7KbC` z5wE+W}hDCfM!;6^lz2b!bZ-Yy3zG_shp8@=wv z7y_^Z!$@vYRC%Yv?FT)P2w@0-jA+yiG-Z2OJm5n-4s4Kq;;%@tRG61ZEyBI<; ze%Tx#uJ(d>%mv>pWK_}sq*!*=mv2FI>YiTXW%#f|bM<h#FWLDPKN$(5 zVA&%W4PYnRM-}BI{k;Mbhh3T3%abGvN2#coOtZ z#*AHmgS~m0K7SCz22&nGY{cs zj>#tlR17^d3^x8?DX+RcV2UBU{b+2KD@%*dmaztm^O07>k%2ujkN6-%U|Ss)EYKGV z&L`iXu8#TwKP|YAt_72uaLTN9Y{MlLACgy`+U;(UCzY3_sgU7-s2q;^VW%66LkC*k z2Pvz?R%KP*ST+YhB^T1L7!mYK#`FCy?0IB1Zhi^}V|>l^7ji$?oy6m)Pv4ZO{^Q$y z-0(Q8D-5d4H$Q|IC*kN*w~gkc&$lyu`?mFZztk}HWh1koKC(4}t;(X576~_7m4?*H z5letJlOnx*;ELg}0fKNYuhK&HR%J!rxx$Mn2Ms$VznC%Df{OVjTL96N^e9J;fC?ai zOr42f5L|_wW_cyx(=;olk`8n>)+Oz92J>z1=tei@7v3dArAwySz@<09YXS)8c zGT$_U{@2d`vbeYm>N5NPtS>J=Tc-RkYiob#|G&o{kCShmo9tU#zNJPt0?)G^&x7-m z!?WXEs%ChJ`FZVm%^y#Xcg`_)uw94kNPg0AMXEm{nhh7t*)-GEbIJF%Zn?# z{@4Fl|9|9v`Xm3-ANimD$p4g^|LJl-_ao2s_I#}qH#voN{wE4_o6HG?cV1I@qF}6) zC<+6UVmo*NL0<&e^mJ1yzsB5B%`T&>#Qxl3%|L*LChf6_-%QsCk|Ck#(rIS&XE)6N zUuC86-3hP&hk{~%F-4nsosdAtxjnIfx-pEc7do(WqC6Sf7!hd2X*LCR*xrBe)nQ-V zA-0AgeYM6C!q?6Pxw?HxtM1&KtGoBNQnx&u>qm9#a!lR1z#-Q@um?F^(ZLq$PJqO^ z6V%XoYG!pt2NSG25diCM)V{hKXDA_jD3unnb=rB_`5Oj>FdNLYQvY=TE;Z5=b(+3VKRCl5P zboIdWR$Xfbsw$U@x?nUDiRqNCK^AT9M&_>`Q_P4E(4cX-7s zlatXsEbCGhuTCHTL7oEA7YG)TGYoi++(YJI4$f`qiSx=_AJx}46W^E`lSCC2Axz&) z=Ba!T9%+)mv;JgWPz>i%ABO01>#mhgqc zJ!f`%jwd&*1SPZu$8wme;~d?)v4Lnl`vuHvaq;%WLH& z_x^HCOW%-sGgGq-=QncJUX=H5KW%)Oaq=HA?E=HAROb8jAG=HARQb8qf7b9a>o z?i8o{?(%>M*Ifi7KazLG<}Ut8cil#9EIioOe$PJr9$UL|F3bvBKHJt_2tZ<1Wr=Igsw_oW{Q8We&6m+txx*Ug^`<-NUt!%S_lQ z{;o}w+sYrVjlyA+JH^gwqTF`Crtl)8RvIrbqwzo9U6Y1rG1EndU&c?`C>b zdZRl^tb(J`o9V-~k;^cSN^f*oO_bYAAFhq!VH}~mNFnt%G*&#YsW)n-wpEVreuc*Jm%F~>Thv@pTh=Y%5@Y*1?M)qC zF*eIIS8nRQPJ8L$?d`Po=ic(Y%xTMSpNH+^PS^2C+FvG6DMb_(x9O7_G~RT{@3JeUDD_dE~7tv?f7r2OY6&vOKSe%C+2@$Szr1i{@d^Jhhl|sU@L3Z>;7;QbtY{N zU)B#khFGdYl&v?G{L4|)_sm!0@N>7}d98!J!}-^(un-2T=!#PtpG6AB3OB8-8mrCPW}aC_EcN=Q`a{%`-#yo~S<_jN)xLm~7w= z`^$|DD9Gp?m7iXR{;t1s)G|*`pX%r4=b%6Ag}y`<=T8nPVBD+j0JC(&7{1PLVXb~R z7;{8oswP3qa$5J_0K9%MqSt#8as;~F2|sgBZik`u2mspQaI8zFVKIR@MrQ^N;N8(E z{G`y17=~XCDu1}X^>+pl4LV~SLKuIiZk`cQaO6Cu7bH|a02B)fr&I&n+Z8F1)0h%D z;TNqqp2)mWK>0zy!OA7ryZxTSaN|eZ*zn`kybw6Pmb@eWDMm`17>O?4UcGV1Q+OLi)HFb@9QA&2niws6@MQ-0+D2HB1mAQAUAg zE+@U-Ei?cWhEe{!VKBnTdM`HB1r7ZMMN?4khZZB;&sS)?PEWB!Qg5VT!pa; zS!h}Xu`BkWM}459(ZD}CJZb$n&mr2OWk0@+$6+7nCZ4pfG1TIIcQE-}_fDc7@Ryi} z3kdZOPy8SKx!1wyraJ&Z9BST#y&nDxz;)IpUvk{|%fPi4emwH3t zAvl5Pg_awMNS8MOzZ!=F{~~M$lQ{Il0BD51i{j8Ta4&;iFUByDBaDUx1QGfwnB+}x ztJXmuCr>Ye=+ZEKj-45Y6hAYdV5Ed*#5*I<8p9~uAUr&QT`aMVd|pS;9`aSdN(WxJ zD2XX#=|#v@J8X=HenBM(Fz7RXf|kbAfjH=gKBhZpNVBhSEt++x)~T~5uA}HXm2TY255;(!(x2TmO!m)vp27QlX{?iHaZ%je?hk zFpk@KIx!mot*O}+7NH}I+S6g`zb_{rue$TnP^LdrOT6IVxt;_V|Y~V z1Z?ylRh(Ge6<7e21mxDQ&iD9}Dy}u4)?jo+lZh)1zVPsS-~;!VRcESrUNeOkJ&||b zDOO7L!kcZ6$eYKfPrv#kK7Gp5cnJG<&=aZdQ`oyL{!C52k=XrqFNkAi`99l;bj0O> zN>k@oHH>QAzs3w9o;xtKj}ha64d_;aJqNgLaE#`T?$(5+!9do4H)kcwr%&%on0d6O z^{6~yxdc5rq@6{PtJ%$a#Wd$g(!4QO^v+z_WO5V5C|2{RsIwDc0B8?&W1?Kx8m}n# zi2n%_DLkkwyXbv%;_E5o#r&4oH=N^mz`W?ZG09k%akK z#1I(v#{urOxJ}@61Q!@GoCA-?N`$Y*zMe1-h5epA`Z|W#271Ko6oE7lB&3Kg2`sQG z0>UC}pF}Zzq=g~L1=OKB3Tb`Zy`idXz_+N4jDcmai6g!pw68%Z7t-|lAxQ3nZrn%l z@?%I6$vg^|fQ_gPf)eiDlX3VtjG0cblbvAH0qq569(Q*{q1QKbi6O|TpV;a6IzXwY z6O04hHIQDy(WkJJH#GtFQqRn;5@9jYIljL@fwhASP%m9;8Q}$2AWj%nrw8I&U5m(Z z)K{}2$&-tsp&r{>^n4R3Ml*ZwT~07UmPV{b(x8G!K4{Jq@dS%2DL*1I%l#l=%Wk@Na z&jwwTIkW64oKu10>~lb4UQ0r;`cq&iV@|)zg2UPA-u&}Twsi2%jOmcCL-vdj z-~cD=`TPZ}r=64CR*PXt@(GzxBz;GUt+(Kxzk$8$9{ zU$yZWO5s`5t1beVt9j~UH3Aqbz0!l$QW|0eEjK7P;;to%9c?U^y@;%3%p`b@XeURz z)~yH21+++e)k{-C6<2Ia6~U@YTm@FO3)PdEM_!@(05iz=2@uiUsN>I78`T;m5g{G| z^!*tYSN|gFZ4$5YU;%VS|64p0RIv@q89{0y9+8;n(+r?AR=5Y(OE}+RPP-^vT5aN>5CES_!DZjE?5d>pN zIEW{s&>kV}S@;=1$(kqZ`W5WGu+U=9X?G5|B#a2RIavt_`ex!d0M5u0mT9FkYkn?m zg{mQ_Pe9k6p<>)O2tSJMi?HAbJ>CsY4ikjIJ8d7q*zQw3bF~6-=w&T72B#m>CrU&I zm=aZT!NRCwv_c(Bu?`JQXZ?k2ojHGoSzNRH;+-Rl@vj#&>6KvnhroglT0bg-j7}h= zR8<4bhn zl`k)bHQv4!vC`ny_nW*{H0jzztJDy$di33!^WDRPz1Exaqn*=lt7_X}1{0vo3=<&@ z17sw;BvD6QfYFJb3VO;#MK&DS+bHyb0D}(EbRt^HFP}pj3g{81ez3=yN|9_JP!f zu$WUY5q#U+{qFqj;p?;g=1JA>uYwQ)D@-&=vMm4scx}x7t<9LWh8Or(UCjHWXdH@k zkNMyQP2$KvY?4;VByG*uUJ5`mc&IBQQJ7A3c<$YP>lM@Sk3W8>`|m7d`7gKprN-)q zy1tjNvwQyb3^LQ0h0o+jtY7m!TxVWlreG{u z_mUp-o+3OQ8f}ldLrD(?h#0Y~0qT_>jz&lwk!(wsm%tgOv;QLAUbr=6vG!+K;Jhiv zP?qhjab5MVIhk!IY{RM#$rJcwF$hbx`#BxcPnS zq;+^8^nOap7dL9eL+VpM_(!C3yw!b>=aelI3cU|t-q^aWu&r`dyAQ-t0MBWQd%x*SL zkUpAw??L>)po+;~RmfccQsMVo0_H5PjF_6`rNZ*5_SUhb(xi(}(t+h99HYR@ej#s0 z(PYR!cSfV&R{840W8+tH1rzfY^N`jfDfh+QPMPJ!$GbvJ}bXkX*bpRjZ(9^z#mf0M?@ zCj#Qnf*L9?4>pX^sjy`O@1hYGk5_py?D!Q2Y(*)UvB)(zEBLb#%VbsR!i)l7SZ&;H zJvwP&p_LWS1_7qu71dAjCAf5#lR5vd#4vDB()pVWT*Wx2bv4KOSt+{ntmqCV{fkiD z-Mrwrt&24fttkwC;8!pU=dJELxd_GKFB2uf+0CN^0Br4esLw{iNj&BTC~>B7CAb}i zy8nbI7k(Rt8EPAh!k_-42UyPUkZABY323&3rqp?#49nLJ6);&ICyj-fQ`uP!%gXjJ zfab1mhX{hCP5;eV3x(4jJn)K@e)W12JcJ)3DKSz=p<)jJo&MEngG{o@?9$L@h1zG& zY9^y|QeDZATYhD!u~^xZV(Z%tF8Nh$4L9V-u%RA*HCx8GJBDTf(%V~q#{j5onksSk zpIGBp{|5eEUtQevui?k)bNKPasx|}$jI}<)-z#hI@)mw9uQ|28Z0d~`=LRp2!v8A4 zMH^;&X?X>|(+E0YSP=jV!-tyjaVu@(Xm< z$0}OT^vY*_lwKV=xx*<2fc=W zjJ8Ign0|L0cC_As+!{Juu?W&8OttH3Idsqkw$r=yyLg(4R@x5na#5$<6?$>&2VMnD zBI*>B%p=6UI?;GO4u`>rHX56m(FTDhLV(BtDdA%PGmeJyJ)pv#>@v7jh2(;zJ+`>3 zppeC3?-C6==(mQ@l(LVldu+Mqa@w`zJ4#1v!?_Mnt>cR7oR5{gVBiT)L&yQILgbRT zZPfX|m8A?kdH#%*;$J2xYlHCA{uquGIz1BW1JfhkXOsE`dSW>IH_Zs^dVtFMSp8fz zC;{EWVulUoehpwyjnCE12=T^#3$M_J6Yn<#lRMpeO(XvVr08n2q z5+zHb82&Pe#vvbkBhi?nqCife7!17b5yz!NZfo+RQPR>b0tiF&EQokyqoH+UTmF%~ zy^8niP<_Px0RN@?eN_}+yy|7pivj6#NP{2%@Lu2VehxeHcsy&Hn&h}N`Uo7e?uU)5 z2EaN+m>zsx-3#{PX0?_zXeBY}emcS*2%NBkTT7Z3g_cch{3aGd20qA#1{PC;ZHnD= zdwx!PUPgOR1=cEx#hJ57pHfS=LM1HD=o5>67>*gSm!jCW@sN4c4SaQs1dbi& zq)LI_HR+9G<`Cp|$`&6HrSYVkBw@q^P7(|S;GoLDyz*8ZZpJjQL64dbdc*4g$Osy5 zdw50|w8!L$(1Gm|pv_h1arP#_cSdnL8d1?X7U61zZ3aG!KVsn%DfGm10=O+p<$w=Z zyiC99g9fT~LRY3$>N~l*Du0XCz_`fPr_1HMEX3%^GPrfT*GDH=eZa*>#U$LqYJksh z5$I6k_`u7Stt(#D4!)9UXi@Y`Ajx-Dw@2V{=61=G9a&Y6pPxQ8tjKaU3+2$N6QaHE zBAij~B_io`x_l~w%q-~krt8>hbJmJAtHq)~XQ`ata$`w<=B2EAJI>~(cql7gv=43x z!(`zg8dvwoJ8e}ahWhipo z!!8ZTb9m3Nl|piaV6S{NU9^T#;q(F#(RflU(TqAX9U~eAj1e-aXoQrZuN482LWfLL z20q@Y$>feGj?{{I<{B7Mz3tuV%jv*rjR0eN|Nj=ru|qt?o;%QGm3+mfB# z`h{BX?Cd5RkWzis83WKSbgVNS&kC`|wbNLoG`{s@6yST6L3v5yqx~?A>$wbE*X&QG zVOre=;c<&vpjM?S{(~s#m$LTGN^AwgD`I(kMJqK!{3Z`H!@vWD0cp|kd zYn<_4Q5R?~$UG_#?$FOY+{gp^d0EAat2=sIL>oM*vba--!;M1doLmjT^Fowwfq>b$LJggWnGiFG z2J`epgR6-Q6GxUHGlh)u=!K~%)0*tKUpOBXkkxv2OVb>(b@r7x{=8<;lysV6C7xX= z#*wa9_rlL~PnEC=lvLfXnmH#8cu4-#9sa6=Y8x^E=`Y7a^Bgs{y0~A}Rbx|EDN9Uh zi#X#%I_6k-%`@i^?0G-7g$wMPC01xP-T_Pl3OmXh3=JWqM64{kf@xQs)H+@!$YaoL z1`wxp2Dkf$o2h0|ZcGeOZPqNp27LS!j@Su|?lX-eI`761g#(3s-}3Pjk9UzKN9?B5 z;rk0lI`(d~J2NXGvX?~w<`VCv!Mu=yfDg&z%)q4Y@nrckv$75g0y7ls;x#L5YM5ev zzND9)RiQ*PCRXMH(fRu(QAxUBI5)x0ofCFG+?P0 zuMf_vbK>Es%WeT?1w8ZJ6)>Ge{2s=iB?8=)(g~e-wU(wZ!M(Aa$xI$LK&)z`Aj@$)H%>G*H|orIo_b zOrOlubnz@YCy{y*^Jcza5}zkp$P-^wEz9?s1jVewI;pf_>{V=|s(WIivaM6-)k9sv zWfMl1B{bi}*tN&I2&saM6y^%B@WKV^W#iz)aX+_7b_8pO9RA5?yb~%z`^BwmPi%Pm zXgfkF$SziFHUvR>$e+P>(+)f0cG_3Q8FXQbL1w<*@T%`CRk3C8XWEV)`_=dF5$o?S z>F)vkJyM=0@5faw_ju4s1X}k$74y>PmJ_<7-v#vj?7}{O5v1Db^1=29->(EI{ygT*gNI1PY8D82)t4T($4@bk92PwElLaMA<6eF zJ?x3v4ZG;`A6`y+bO6h?Y+Bf~E7B&dTZ*ktMwcF4$q&`BcAP{_>cp3Q3%JJsr^}bU z)p>ihf&>P|?T`M&D7qQI$DjRwO!`QsxIr>s4E~9Pe$}W{i@t-mbi7op%m$%?$DVCo z-+16zvAR;huwP2IlsdYZ!d9lcS}T5{)bylxhp`nUI8u=XZc#(_vOMfYp)zvXU`4!(x*Cc=~jvAurhA zcU|=zt)w_4srNm2?2QLRY8VTvI8D<>*@H zS)O_nRbqq(AtUqh57A?J{3>bwDuRB>TF(~>}5{mh8i zql()=l{YVKOWal<`HbJufk|1`cf;t2IC0_8?4%=D zoOsX_c02`9X?!ByfN~VDR_4AYe^>&_ou#*)zGWfzpV4FxQ6K8+(0X7xDMkTS``F|L zD2I*GQ%jTP96y)d*gi=}3MdJnON8Jr*-862QF*Y#Hy81^JD!ODRJYe@N zF=5LlO7ie3ear#?9x~xs)_5`+h=EJwPsdt|eT|J<-wg%s(exwNozYs2^o1N^8u8p3 zv6Ju5y0WX~U!gBzD?v73S(FdbKwwQA#ibn{+S#6IC>&PzkKsXes01!{ti6b_v4E)L9It+T_>stwN5M8DqP%wbF@jeCn{dj)<2fRfD z&~~pU=pWkaX0 z5Cgy%TRHaH<-t^hH$b7mRdn5_?#pnM&sO_BAj2$los9-zIs>x?+ z6!zH6N36_aHa6DiOV}tcLhO4(7+=-ZNs|=Dd-pcg*Rm|W+kY8gzYNN*Ey7* z3xIO~FjuRxGsqzFQg97O_)1J>R%ge-$8eDDrYGH$n_kseZ4>@YH2R1&bptA7!bc^RaCy zNZ#v~O2){4;ab9~a*>5xwAjKTCG4an-Yj&f$G#3Uw^WnrbBnc%jd6Zn#}wV*NZ-*)O%#@BtWSOT7!eqA%)vVZ!^Hj&4vVdf$1!NVfSxeh3yMJX z!pkv8K70<=Nui;uqc)wBs+&ea-N(EEX!$rjZtlFTWum}@RU%fM;t$4el&lo{tIH8o;rEImKj zQzJaB#QYRajoupWFhBODz@e^G=E6I1ML8?a+ZdGAz!3`=P!Y)xxCdU}CA*lnxQpqc zfFxx9({zyo$1-57SujLd@O7rpr>|?GRH8!nvb5TlSObhn7NpU} zFSpB~tBCx%ilPu&j;pNaY7LmIa&&0iCgn~htTP!&KpYgl&4Vt54y<^tj*XWoPpFZT z7B7^5>H4zPhJ{H#C3zH)b&3U8_g)i388BJa_4?NOU36)qfUmkKJP4(YmGh}0ILncN zFr(;-`K(?fVg(jvLBUbZPxUPVIrhK~ z)~lnPW8hLcXoNW)*DNhyrih^pW#Q>N{%n%Mj>wzRx@W=$Wb^rAHs3nf-9LNXJb&Ff zF2e$^+;%LWDbjISTE4N$i7c043X`5&9j!a|Gi{0#1EB&(E32xkcCv9;b{2EU)h0Dk z$A!;U#a`ViCP0TCb#{y4D-s!<=5tbLq3c*L0~H8f9ac&N(WF5z-@b;tB!v;Ws)tLy z%8mr;WJWu+(TOAlv(l~+$s3KA+2|*~5suMQU6{n91qzicTauyB>8Dx3ExY^KeuPFVYFGX#ntgjz(=AmX!U zz)0!!h%8DkNL@I9HL`bhu$yZuILTZVS^&duaZ>OCEbUuElR3yit08&bhv>r`dP%lY zPug#&nlm!m>(yFH(^%3N=!~E2=kzw{b%R)f8WP%e>a;Xna5bu4RpdT~0Pc7Y_qoo6gj z9N4BfL$ZZ$goiZ5P%S|4y$BULK2{&k;y`$#fj8`dA6mk@9c5gdZz@Pae)D`m7%9f- zI^OS*6Y5wlfjZ|bu|CmEa8Az-F);nKf@dmmh85dThPH69sI+7uG zUk>1l4Qy%$o9&_Rd=@Xu*^YVY z?C^0_Md;9%>IE+Kl#Yv2Tu|mIY6o_(>a=T>!XVCV?zAFWGUwHZ&UjZ0*4?LWK>DFp zKKUr|b|}jH2pt#j>vT<;4Qj}C zDhqTtiDHUUTu&rgBH$DU+!4^sN>HcL@;ZI$G8v#Cgl>!IOq`M!NDiiJ{O9PVPVwUA z(i&N@*gEZdn@73*@n5&zv`$Y_6771{zZwj--rwyDIGM6?1-#>0t>IJg|kQsxli zmj5^ss0!kombPd+p$JvX*OgU8k>>XlCqmATal_yN$<-(_$t?PFgGlu+=HSO<99~*u z7;}l_T5_~pQ=Www8KaMJQB)`!R@*=*6(4kwZCZ0_6wrJdiIZtbcxcS@18 zRO=F^Cz3nJ`nnuT33=43e6nhJ$h1*7$iX0EZ|CHs_2%Gh^WgM+@9_Bi&GF&c(JY8m zNZfFcs4`F`(8zH=%t9fzO3|={kh3xD5=R!U4TdFvRT>eOm-fDiiu5m_a>aZ#ajv@M zi~x-&oIhcXxhqG8G9r*Ve|7FDXGVL=oh)0wx!<%MK+)HoI+XZkn7&-foo)K^m_mKl z>2nlXHIcJVpUv!wS6wdSIy`C~oWDBW*=?R1=G8pkZyhwt&)tBM+)|)0;QiHKt2G_; z!+_9vRuVTD$}zEo{iXC0<8%VlF^c_Sz*u+Xbw&w&qX<)}cB4s5U2HteQrX$xKm6hR zWVZ#&q_x-Dg=KQOgKum^&l#(4tr+WZyUU>++d9yO1;AF&k-=V&eLv~{s*VFAcf4g&fcZZb( z;+?ZqvRjQ%5|s{7&Pf%VEpwk#9?op5#8?$5GidFZ!CXsZ4}F`0&zrP-t(^j@2|si) zix3Pt?IOnHv_DVj-y9YuZK{I4TCY#PePHr{uK3)QDQER`=%_2RAt5$!tZVz3?$0-JE2dDh z;z`+H0hMDQW0>SHR`b~>9CPJWFedYn-M5Xmz=Wdt+qX$?zOYa{V0h+zRP5m4H3*zu(zEYu3uN zv%Y%QmUQ5x^6jy)?T+oq9n8{=;jNY51&fx?@Ew|RkJqKi>^&9R^FdcLk(?tphPQ2B z$aEexEd7n}Io`eu~E*A2{ZCnwp)%hM+=0Q4T3wwsxEC6%oG^;wZ>Qz3@JubI^g?-hIGkIj7q2ZC+Bgh3xIja;6j0|Xy@cw* zb~5*Cv$MMzr-01RE{pFUH_ED)!gBI-%+l(mr~M+bbj+`%US`sPzNK3zbWD>sT#^5- zYNi(Xi-e9mdBZWaI&w1E6chA*cM;iGoXc*dCCu`v(~c}VdrD_i>%j6#<5si_zI8*7 zR%w6^>Y9+K?)mHH-p<+nY1Lc{b>Dy6{IM#5Dzv3v#n3TYa1KoFzL+yJ0Q>grnCoVC zR9nj?j975u)W;Hnmvi9_l>3qu6kT^2(SVCmGl8Fun&+*9Q~UTQ@oIflgb=|hnT|PQ zm6{KhbEFZObhb}BF)(L5`LJfXp06W0IC0t7?s6b~dx(g2R_R4G`fj(729@#p0-TZMnB30I!z&=>#oR0*-u|Fqv z`?{4dm|_v?lsS0JO$cNJQ1DIVlz9j2tFDmKkd{9r2SX<2^LkR={&WZYTWFuv9`%r| zO|efsWK#w9s)uZ*oc-#4Eta%rsZ6cby=i-`r1?b3=4FXwHmM?wYGSn+jxF1&)mp+l zWr_Y#FKXv2}Wonb2B!a<| zW1UGZtE*{oH_2A{bskf7&6uq44j%>=36-(CVXcrr+q$fA1mkdRRXj#Wn~=g z95)Y6vn*M(R#4^3mR|w11kz0C0eF>FNZ2JXhN2owNUbWpqezT~tXr4ziDXQ-uiGn% z!$wH)Fjv)#rb*kIOpl@jFDvAM5sGn8<&+WAHA~k>j$+d+3BEQJ^zbs6cBo3=PY>8= zR0;x4hox>adazL2s&rmkPM?+>4LSEwW}ZN6#G2L?MX6qFESf}1X3+J7qjniNeiZi6 z^R|HU^3GO@0yQGc*p4RadNyQeqT1msH21=aNl{`r6vQ%}8pagyg*n-5dP|Tg-Xy22 zk-VMUTFwOIN08}405kBZi<<%u0B>!y#5)rcVbxs~SqBZGd)||weOQW!>@;dc>!H{< zoS=V(V=}d}$F_L?*&c!qg1YrjqBuY-XSh6TiYC7NXt5yo@REF1&!ZlICp5}ROF8)4F zALH)2C2trHi}l1Nl!t#=8QS`08P}45w99bEZhUSi_aTPjvWjk&dqdaqV7L2Q&x&oY zbDfqN4YJyYofhWanQj`Ae@n+Ta%YfvW5M*u^$VTG$FafAFO_m$2nSaMcO&k$`gQCI z`=W}SXI)R8sj8znnFQ;4zv3`9oV7~jopU&4Y;%5)GD{3RBgW^Q25ak(NjJDt&9f2? zY=x(U`kbtudq`Gy3-|U9cTSUqC#T2Ii%cM|4iEQ})pw4McYaD1?zc`(?eMksJG$mv zEy*FQ8@;v?CIGQBT|aPUx*$qWfkIb;<0 zT#W7@@FHffu107+3LhT3tVTXOT;?SYK5ucvvP|CmDG|g>;*|LV{-%)2++)racwH4A zqmo>@%C|qK)4{t5+*PP+=Vo(VC4-UhCMeKIc4-1EEO^d^kpN7g-W;&CL`2>Ppu{2> zmGjS@o4bHtLsX?pZKPY7K)PA}A38KO;ROY$Jhyl|elbtpgO|TX#k>5OD ztfL5i>W3AFvTUE))$w$w`y-0)rQI}Kd;+ce^6DH#ID>owyBRZtkG9 zyycc~pK${&ODYDFtWQPH{L~FHaxt(&l>%nsh$?F(v7!_^#4K3d7;q$e0rEM-Nshav zN~-51mO8b9peqZw>B-cUYGI)Gb~$}G_r!nQ1QGvi_w?|%Hpg^S%Q;YqkZ5Vbsz!C`o;iFVaz;+Mj1jHfgY_(KQK>6fE z9D2)S1H|!DPPc$u4xwK_26cZRk#TicQvw~vo>>3svf$(b_8UH@B+er=gDN>u6U}Kf z3@K)slT^}EJR(lDK!;`MG>QvRZg;3m>xN^&x(19~0z3vXQpd`%$#1B`6jLBWZT2KX z!e=B%mfevzXwjV_z;+~2Yrh|17E8?dqUx*pXsQA^&fC#gKLz32yk(2b2*WvPX-QcF zf~4oQH`S*{7{uFfd>vsdB|odtjm*;YJ|VUIzd0Jz*MXh#?D|^G*!qEch=(-Rr&eP_ zu6fhOn^f%bI@c}-i*A8JyOZR`XALOnW45LQO~4Y{Lm$z6x(Jev4fb8x6s}V6HgexQ z#MC@+bLlC1_*P9Og0D&dnX^wKzPYWQqy^9=3+TW^G9|sN!?IWhR4>mxNyk7fDbM0WR~73~e-*#4@Sj&iXpS(Dg;D%1YS9 znUgR=9O`Z(j*aSNX73B!5JCotZhISvXP5Xe=~41p7zPe>k>{ks$j4rCpn^B|FxyRH zM!Dnajw;K|Qx1c?v=o3;l#^PAg*2*@F*!)}1gQ%ud|noE7j$SKZZLcO)eCqhCxFUX zPq>?#P2A7i#Pzo}Oy2*sc;n`|;yKyKSyL84IOZu((T(CqjgVm6wZoTvj>PHnw3FxCJc+S8KZgHzRI@Y8By=hCpY~4)JZ>aV}MzyfoJ+K9(Oi2#Qyy^C$q54(^QCl znS~O0g_V=m9am1FXp`K@n)I>W%4YkR>A&2!C?~-u`;_?AT^)2?QycTFWm4y-6FZx# zVNatlp7h3agrM?9CK0Bb*7g3vd5*;p7!Bn5uOlIg3}!MQ>ujLL&XJjhkR%WrQU*tK+On9(OsOz` z-%OZJlxCCp@lGi)b@of0b9?3#m=+SWOWgmJ88EMsq*N;LW#NtODH$&_)=zhY3FHzn zIzlu80=A`ls5;~sHZp@uI;v!$K#KxDb2dEBk!Fn!!VUEH(MbWQ&T6OiQ(> z6D(Re#AeE}XmTqG0nM6V(M_u;hhDSgR!n46)Mv(}(<){pQ)D2eGAb73Q8YVHVKT+s z6pHuBo@kvT-zjmTn=UbfKNRFl%+Hi)yG&%|w@M_|MON?YQ`5 z({{NTyR;*)+~biRT4Wmd7u_-XGtUEsE6*im&ayKjY-~sh1v}llq;=PcIv6_}jFp|q zINIe50)J%w`XlpKDuIqeEGH^?)``xY^+)2bDT%)v1ny!7cJy&NaL6}!h#mit_3J+> z>(`VyJBS8fciR5Q_;vS;U(Vbe4#UAKOo(-;SXPLZs6VoO-8* zmB&lyk^>DmS-gw_Fnji{e8gLFb6GXS`6PwbVk}nE(t0`8qGxet@zRH`fDfz5y-8eIw z)eMQOT=(=0QK(!ZD+ZI9&1$AZR?6g=mCfoaC9*0*1bet;9_b|OB}pOq)!hjqndLp- z2$#+#-yK}S22b9@DbmQgA~z+WUS$W>(mS?d7 zgy;XoVoCTJ#F_Yx2+Dw9x!o3^M%{l6@`Cb^!B`;YCO>m;lPXa!amSK@)UC5}miMfH z56RwjBDT*X`mBor#fW4Q`JRn@NnD6X{5KVB&`a5*oZRsH?#(wwJ zXePgr2N{FY_SYIiek1m#g@#Bw>VxeQjV;CL?2v+<6Gqcuc!oX72X85v0Q|dOVap{jMJELs}>oO-)20y zy3&{ZjQPyE8{3&ZuX;du%1;!`kM+Dvm_C|=&o;cD=1Wz&IkDOau=7NeP~@TeNtLZwa( z+4~0k`P<+8;_sIEyX9HGTjB3kYW9b}IzSc{aDu5<+y;MP)%jwdB=ww=m=vhQ1fesd z1IbeKh-Fdy01PiW=8(pnPXVZihHU?x;Nh%~|}=OpLNgkFN*sK7CsE!^Tyk zZhX2&Fi)bE;fXaUAiM~$U&5Mdbz7n8i^B_l#OF)#$L??lv21l&%%$r)`%dYvY-wTIM{bZJ z4Dg-d)r?o(gV;-Q%Ssq;V!n=UR52plolYaK+?#hfPLxrvc=|LI)U!Vn=6gODpg2?(RN zu&ei{N|DhPqSOGuo#>{4v)j0-)EsGm7Fs;)1@ZMsdxXb4g`l|R zc}!IkplnJXcgL_|%JhnA8b~IJM>`zRZ4~1e#@AWUC(LpPv#ig03HD$=l*18~$c^`1 zGi`y+7$FqH-g7B#g07R|Jd07mEsaGTSB>ckC!NVJ)@;vGW*hUSf2JYkEsaEc5A9Nm z5cQ@Xhcwh%2NBSi35rD_^uy70FhueifrdqAGPm`_?ca9PA?K4}FoMN3!4P|v498U0mUfleG)!os7HFyzvy0p z;0xq-F&WDjLQ;B)NKsy>S`cZU&vGKb!A{yiX zRm>C-AP*A+;elan0^njW1o1T&2i#FV?2uK&#SlwPbscw;S91Jy)}&*{s?EGY4@bB+ zlKTM%$*lWop;k$9H2xMUM!~gQKZtcmc0M=!H}jl^ba&HS)=aP)D^q7jF?15N`rVi! z9@Vu`WJ)lld`-=q+Nrg;C9X48s;9EwB{D>n{VbVNtL%47Nhx#uOfXpZzH{SA1Nh7U zcpcpN^9-A;YmH5BUP^EJ}SmFlq*uR_=D@8oB;xV4h?>jK5Xl^ zHGL1lF?f^oPijPLbPI<)X%bM%$!vnS#pm?*ON+~^|7pDE-3MkO99^r}XpsGN#A)=ijH0vfHgXC`T*&-L{)85`v%LQPhlQ2gKgQWOtV*>(xtp0XG|7BKHBZ4kBkgShhH-QtG?{pTdhOQysvPx=P3A_RZV ziG5a6DqN^yTVJY6QoQ)&4(ZH3EHtVyT~I?w{1Z_P^}ZS>Bk*KXrg3?Lz@k+7d=b4iY+Bne1| zr)t~Ex6V?-L5w>l+XmW7sn>%@vbZtFRf*cOBmL%)Nf9ZSyI4>)7D^D?%#<0{ZZ6u( zW(SQ*#?NNI8;`4*NYsWv>q3`=LhJE7|1%s#I?fo&ER=QL+}oRTdgHnuVH{A~6UlNk zsv9RLi4JPH5Gkuw$nmm5D{H5^kw*RAG}ng6GLL<5Q*}7I3tc{ydOhCy1AXCBi=K;hf3X372}2Y{qT?CX69E%4x=fTF z=dOt4eJpK>RGEL0X5p?Govhn@dY5Rsn1{T`P+t1uX<0+0b~+Jz7SnVCGEe1}QxmPb z>OpQS@noX)J909ciDkjj24118LVQRh+=s9bIdV;*Md-nf(gouOnzUrFU)+7mUJtfYZ|aFi zW;}4$#;p0_E$z`v`W^Da>r;!n<%hTZC#_>tTR}vGb@6P%sEB4rmYZCLmY6>~Hp`qb zV+HyYVc-y82jh7Ok`{Kd5?QERr22@4mXfHP!b51P=P1AmMM9>%L2aEiqr2&>W*UWE zb;bkxYy8Uu7Zip$`WR+pfyj`SXw(#swRENqI|Y04FkLOwL_WZ*)a>`U$nBc5x^dY{ z_t_Vvv%8mnYdW_#5^%Fc^HCC?Jb6(fJ+97sFZfQLO8t;Nt4;KOoY9_6d7n=bA~9o> z6UwAqZV+~ochgA-=B0C3YJS z3GM9nLeCVgu37?BCYn!i7$0{FkHZHE;FA@&C&#Zv@<~B61iu{qt*Z$#3EWAEK_sz} zxa`~Tb5%0A=p7&PkVd1i<+Ymlp8Kun!~jwQ(gE&Oq~*^+2TJ;S$U1C>I_y@C+muU_ z6mD``<#l2_>>Z)Ry)U6@fQgIwnP9D}<00{JzCt+5PW;S`4z9|JP9`0Q?Si6Zc{`AiscPF10trQD)D9FMIfsojRDEtE&;-TM5hd@q`R3WosYs6y1MJ zFt56&#-221^mV3Rv6$esnM-X2Vm>}68$sP)U!A|`jvYt3dLpP*U7g=ZaBF0{HD*@? zm`P7MkpOI9swmTVaFd>4l`s_NP*3tAr(~gK z9Bzu%Qx(EfUjmvwvHEa5XLhHh8P7;5&bh|vY~6p=rF*4(Alq^xxh1lX>r~}B|M*%8 zxSNFBWFkMpV1r06)^RL2_jUA$*gQs;w05bZ*cp!3Oqm%v%FJC= zmols9FKTi^NQT5tH|A7_I+zzF>6Ck%0&K(cG?<04H!#iF2yfNE?|rSpIk8pw4GUgYYI{=Tr%)(n;#AWPg)khoEKzk*6!A zEXhco*i0lYmqsF?Dhr1zC2;5@;-v%AqziaI>__&6Y#C*D?Ay6+Gsmz}dJHRhV^}RQ zhKZz%gk=p=uk(wkG&wptEqsKhOmc3-`IV$L9zB^$#uA^lBiDIx?~n_I%2C7rfi7*7 z;EAPJA9Kn5ZaW;H|BgX0WzybX{o?P5+@ST|NgAv`^#K7_MF>Rr;-(zMw zcH0RhQu$bg^_5J;6t^>uJ@lMW=oR%Uy^qGc^m%Cw%|%YXCwDkuwoW1~P{npPkip-K z&=r29%(r;Tj0-}2?O!NVBSD${f-`PYtKwEcG5hC{VxV&ul#bhtTS_Vpec@SsLu7p` zDf9vziaU0CoPaZ({OlRkg!Wn}sRRjm>y0G`h_{vaL;YUZpL`7BfBHKO|IH}4fR*vF zTaEo*JTF+%siy;AD8Yc(sFVID^pwM!bw4?OmZeKEcFE_<8p#LWfSv07NP?n2~MnwU@P$&=R4q zO^K7Hg*s%NjSg0BM5C*PVbK1FB)(uZ`*J!~3@#Wq$ayqkW+UMh1Pnb!bXRMjm5@FW3jPV0w;n4wO_&1VqDZq)C?5b^7r z9U^0~*f`1LIBjlq!EUnzLIekb5ZaD4N(5QuQL;|pT$GR$2Mup*>}yo?qt1l2EXD|a z<)C63dF&qT9B4!U9^x<T3h>Y_4KxxBU-J50R&-|T9p+<^q?4?BwGUykP zo{ga4?XcSz5@_a3@VsC*zOdL>YAhp~u$#NrBUGtCx7q;#2?iRD48vp(I1#>(RY;c; z5!)rm3gtl@qCZ-UejxyaMBlsgSK2Q}2X96n7Z(_UT3BjyNZRfj6z*6iw1}HWRdOpR zO_#}r7fO((ON)w5%TwcXg5a)ip5kbT-@gq;AN@BlQ839PsA-{vXcE76DALndqE`hh zAb*Onp{uYT)BNHOYeOiv(yyS$3vPd{DHib>HGf5|)LEJ6x+NNo2*0w_v<&He4H?oi zGNjYIYg#I^Au0`$*;V@DHj3x{elXI6Q%XP8YUj?7g2R3GcT`(>X1L^^HwS0_e)Hs{ zdF;Pw9yE`4_Wh%?SNpA9AO33|oHVmOLiJH1=PWmt>i%AMF`6K`Exma0LYPuCyd8C~ zuE+k|ZVk(!8ou@S@P@@nbUD63rHtH9#8%T9v>SDQ?S+3D;z+%tUV#2bClk;@{FRl( zI*8q{2%zTM9e;6oX=!PGX=U-5e|EA%O*TJ;qgzRYO+0KoW*-fTc_FqlHvUmA%nN9@ zk1x9t!2^x$!twl0)SmF2ag38hUeIJCA8QXdJgrxEU*4&BPUaebHkGRwLt<#&2gMm? z_RZ0L16Lf8d>gPZjy)A(hrMniZJVY!k_CMvHgpWUC6r>q--wAH&Yc z09Syhe@80X1~M;1fa}J~ST}rb#t|(hu-TBIB=XT=qZ2AKI^q1MXhO%`P~ef7Fp?l( zp}NY2_!RO*H>i(LeT2sm=*mI4UR3fsXQ{|>QZxcqg(RAd6SX=n!ZCW(v#I|IZ(n)T z!vS5QvZCE#OdIGRts#kMiJ`lKf!Jy;LRf%2J>-;y!x)CaM_e^DmkPage8v8*mzeUM zBkL%tf!ff1-NQ9K96?|4&fz3)X5$p)+XMxB3}TRsXT%8%Wm>Gqa2%(b{+!V5=qmL1 zj1Di^g(J${+r6a8x#`B&wN2jr@ENwC5Ct_c;E{0@Z!E$zUxj0wX7yo!@o2`@r&vc; ziL(^27dRu($u@VhJI37=jc(Lob#AjM_bvrqpi^jv9k-QE#AY%NiRwx%DT)&}#yBsu zifOZmX|4vLh1wCGAa>h4=L8m-xafAwNe=mPAjJ=e`-n-7;Sq6yOc8(NR}oIt2sz0} z`o#70QIOjlu$j0=$KsI=amgtZSK27Bd2UwLZuwq_$Mu`(q zrX;kwUXxcSPQ;$1g%AA85TH;ic+h&)6`I5Vm%}b!g9JuLMT{y!E};Jk$QK7BEJH4w z*i=rgD|O}|iUJMQ2{|D_dSr4U{}}8^4|xjnDly}auie4u{))`%X>VVN3Bi~RaAuIu#!1#=otU!mn{t)9m2ii@Pt}X}q8XcXo zvLoiDha0QSxf?`PA<-fw=H^f zYi59wO+pT^(xs6KXjT%>$6J(wQC2m=1#6&ma~{uxwBS~!OZyl!O1rjrMn=jNcNp@-$#G0P94^!n0x3>{v}?}q@H~y< zT1BFg(H_8eNFw{F4vgh=6qIPvATeG0_Ge?q@<`w zyVLX~Qo4~3>owBwzKw1$xwoT&Dme4N7(78 z4GNeJ!vO^j~84zRw(IYTpFv@QcNEc}Np2RBNjKdvn&29>let}{ZokDlQ z`OBb=PjM95;$pu495`ABeIHV~@P3^{N-?Ie| zCPN*Z?;p_x-HU{=!9pZwaoqi3;W%{0XZQa!Ibl+(ujWF1q#vq;V9WjzCf^Ivklm?nX*!llkZd z-I4;Yf}5~w9}*(2@KsKqYZzZNyNWoakhy{)JRxrq?=sre!;TS&Z21BiITr?G$U@HJ zT_{09$s~@lVhKTj_r^W!@Tbk=w6VA#q{ptSl+arpUd>aab zn3{f!7ONqe?~PNpR$y7$*WT5(>9YGzy2v{MZ7>dQ#ojLaj?qp#oIHSKHKaZ({)H^L z{58qmrQ~AX@hf8s5tW+w$u}v-Iv4V>RHuUhruc4r1(fJYLkBIcXqsdHDO8^TwoV$L zk*NG0W2Ibof^ncQiMN=^AdD?=;w629V@%dyOWZYn;Cla)%Mv^lq{e9XG+aI`uH)CZ|q-z%e_6Vi{kk~;9e_(kbTTWeb=zj>pA{wpgE}Wz*or=Fs z0)}=LR!fDyt=QeG=oA{26JtcKh*nKl5zjzo`e;IDrMs^KnqejF&MQVW7X{;p&mi^) zs^+KKx@Xz11q!bwu~6FPZFNM${w?J3te6jo6un7I#sU>JKWcZyj~vDik|lEYOPFEf zxF{b{GwiVF-Ug&|s;DQf#^%hWi-wn8&ruy6Z3svjH+?n|%N;pXT5>l=2WKYq0Q)&x zb_Bz-HYHXx%IlLchG`&yCWa>Dk|#*cW6d97_mO-`ih1+4Z_|2LT}EQ74MvL6*MFdm z;Y3UY!~h(fT=h{YtM;7)>rQibOcq8zy?v`L%;D91JkSh*z zcr`Y8os#PUw+8#j2lI??ZJ_I>Gn#4WskQH7DN`|;a#@C1q zGUrOa(=j~_6O}z)2G{Nd-9AgI%AC9De+`DA606-NYnEEAK={E$ zEXGV4uW2NK-N4FkVZaFt$-w3c%xbCXIivG8K0eVV>EZQlOjnn17ziAhuR2TQHtXgl z#;t$~#KIp9g+<^LRZQG4wKZfAt|xQ6I>qZD4UYhmS{FCm30r* zoC%5OeeQnlLad8eKeTQDTF532;Iety|C0h5_U%L^cTzJ7+`>?-b&QDeSw9S!UbKh3 zQ7%kMkD$Rp!Ia9vn-y9Dfc1pEOEFg@gp`Kygt%y!6E2ghjE|T!R5Yl2a!0b$e%Z^TMf9Aay&{j?Aq`6stUQr2P-f;U4FV^RJ?)gRwj@ zZ^-2(y5o;+L|Y2GzIYIRB4x@QkB(hNV`ll;?vTM6W2)|q66gz0l-MGnjQA3c)+R&T zvd}z{)jVe}ij585rA z8dZC*3T8@%mwA%GNGeNi^ft{{sY#r(p%ctX#C==tP?87$9h-xqOc3*$*iyJ=c~6N} z>a_(%N1-H69`rVpExu@mnbX<>vJhrE!6(Tyy;+EDxM3}1upE#fpmxMY;&MTn17aI= z`Yya5@eGw{%z{B#|9B8e-%0S|qzS~4c4S}R$Qf+d#=J~AQdnYQId%@m=@QKlno@Bo z`@pF`g|RF@n-j@V6?!HhqpGVYB{Xa+EG&|l9?gwf#MVZ|VVPsy32q;~&?aN0s%C!0 z#$OFPi1oS>iVJP9~UJ3Z2B;f*K!hKqD>5xQXhT}M{J%{ z{w>V8Se46|3Z)mA^SqI^&`+z1Vd(5mf7`AmWQmUY3uDP2%4>5RqNb>jb3c(=n-t2RNMM*q%=v$ZIqTsWZ4+ zY3q{QjvuP?!*UofmTjdA_N?57N`oS0(lsGU7iAlirW^?<|d)*#r_g?Y?-yaEM>2)oQ+`4-SFz#1k#R1>~cvyHhnw^9)$CFNtxvsVVoh{(ymI?ghOBY1I#|j+d)zl?k0)CF3&fcSqmIT=Pwv9#Ri8Z4a5uZU zlb&2Wh%TWIv9<>nZQJyr_9;6$OE;X%$*KT^WL~NC+jB zfqlG_)bT<|3t~G#1}Xgr=K{smrXhFt_!MO$ix}~c%{fC&S**!vnk^y7!V&_>y0(N^ z8Nm{CQNU*E$}FF`mF2FQe2IbKtV`tmFb@mbu!3gotYOu)1%l8Hjf)n|$9l3b__Ap) zLp9{Jz#Am=W=B}CL=aVaiWYOk?yk=$`1&EauBa_d?MpN50^+SnX^sPXeH&!t%zHg8 zyegzw=l2@@eDrZ0b=#@q12awHYiu7*xGA{g#F`~d679&jG`bnE8yj8yKNl*r}iOvd0 zJDV{6+oZ0kdnhK$?BlaUYV) z^y|LmwHGMslyVE>^`Q(H=ET?4tR!s#tS_yx=-JXs zAzNj!?Z^enOKRx)UO|?9UtL+cK|_y#%y+`ZR^&U4P&#Q zWSx$YO=ry8E?^vZP1H&B?&dmic*ob#IGiD0_rZfR?YI)lkz#j{+CVKhxQ`6*4rk12 zD++!W>?EtMwS}ou4ECVS8Wht)H8DajVE2kj(gPtlxQ4OH|{(43EU{>Hm@Uh zFb&LnjWWeRb_l!~#~}vC=-6U+x!ZSL0jxWHlHN^{c_w4B<9+DaSQd_$rHVaPn-6p*}iH5`-i4a7qg_P+a&YMbY=ZlSR zR4QT(rElem4jds~W`BX0GVlxcC_9f?2HLDo1`N#psN(tqWQ?0IcA7(f_}ef*kr{pH z)m2t9UNEo6k%{gUJ9oJ3EQRLSa6PCiNr-(djacd zo}Fi&_lU4s%KTGo17eqwT-#6bJe4e41~~>{8Rj5sD6n0A4;7VxSW_ICm1RANQ&PuW zcCpLvRddnESO7T|1)u7d+-Jz0h-*CR1wD@nSNTJi|{j-p!v-F+YP zk-NTafcIP&zDWgyJA;xoY^x|Dk{lhiRfSGs)#V#E!)-l5x2&hydo*3KK|bzCPS9Nv zO)LZPsL#PAtZ(Pgt%&_oWpBj93VaJqc^UO=n-c6-r($JW_yIm0qotXYP2<|38`YYNc&;(9!o%8j zOO7zo>9)tp_up~{b1wR$aaP4A9ge!;7}>hH#z^4h^jYCrro!QHsT(6~=;Ld;(iJ{> zL+4f?e{BOn$SAZ^fNMUl7Iz_|UtNh}KFBb#8A;ZV059QZ=A?k_yn5GS-x57Oiv8dh zyI}ihQk=iIoo825G-{y(Y0tjCB;6#svQ82+nk{f_O(})3WiZuOE%Zj1)&uofe+CPl za#XJ}5$L1PtiCI0*yQHaA&0~}Cw17N!eGz^)9JcJa+GT8w8a|Y*GAc9VJy@807Mk$ zf{Hn|>!oC2GfZ_ES$QW+IZSc)8`tLGy4}6WSBW#nu97WiZ)PKi7*{7Y0Znmdq!=L&JHQ$n3G+Gu6=%`kRn|pu`J(mxFGyM$ zIIS-X=?Z;_*&W=yM9CAXPpEPxF5;}u$+K>Kg*o7btJ3AtO13z4%FUJY1m@Z~a6P}!Hi=+ItJkiQ+*65&k}>rYkI%4UN^ z4410$?o!EZi3>=wGztxeY3T6Elr(6Tq{MDw4+cNPcvWq6xXWwVHkMk)*s?bz-JX_~ zP|*`H9~~gcrKGLyyaP>+{eMh4S0s?~%_Ykxj6<5}3_qv_hN|YJkU%6Tq4)uFI10Mk z#eBs95XX}+uGMWKCg%jgG7%8c+?+aUxVV-6(d|@qfkEE}RX&BdW7N!XJ4><3IHlTA z;S+5KF3E5vECMz#6mTiRoKiQZ05E~0L_)UZL3LG<-4;+X?N55J@ec4BT`~B8e;z^R1k&rRMq8qUWLwJfI5=jdYYR9R^3O(Hn|TM8}jQQi{G3 z-3Gn!EyoVNmD6%?DHx4)8k_RzuzXA5=XKcY=p2z4_GQ4!J47vs zf$;n%0}WacF_@uV1U<8bgjO4tr>VrEBqztZ*49*2wJ>`VAw+s&Hex*CRm3RmB+M4a@vS(Z`itq@-=-9eg!n*e3pk3B+R4g4h$3o3-Fg1;Uk}TI}m*;-FBXDN4Zaq?(1`$qKzqLiJUbHA6SxLBK4P8?jTIDgCAOu*C#CDEr-s)_ zcZmTy0&%GLE$?MaIlukIWp2 zIo~^xl99<9#x#<%SA!g8MUz-s2|FC{hM7XZ`+agapy5Qo3`W6N$KTNR(lPqVr9KIe zvn&Z5qcEGA`W3$Omls8v?Obx7brgQ;((O2=3!O7ePBh|VNamb4OeC$K#Ey#+{#AZq zIBpDzs=<+>iPzd-jJUB-)TQpItE2L%QzsQrP(;lM+cG)IiBEysfG#Oci-ew_c69JS zQcPf_jEt`VsTJ0d4!ctaG}}N96F>)2g&P<;aj>r?d6oXzimGQPOSHFlPRW$;t`tCxQAZ1LcKswn5esL?&&dQ)ZL^=&{03c zwHotoWKvpduRsp-th{+Zo78bTVFkm2>6l)jz4j`ildDT!!=q1j>@H7V0iJN&H~?a7 zD}1^zNyeKKBQx4Sqp?Hycy>&N=it!)VdwaG=iu}wBBZs3 z|EjsWb9U17Prq&Y`>j{UJI6oytrHbv=(WFh+-&-Xd;adXJI8ODb*y*X#2N>O;>s!j zDe8~~1*#s>bMwd3=E13d)I5IMIz0uDuYU4(j*g&(omcykO<;fLhXz#KZ62NaKYZIf z@DH(_A6n3{lhYmisCD4~aNMHQst6Rr8y&aae0%DDd$|9)d3+-AH4a`cKsV@X|7hp< zwADQEkB$$&Z@qShSlKy&K~(%7TBqM0o}C)ButVVEr5u66Lb?l)Tmt@-28F@|G$ z?Lz~tx6uD4ylfrp?w`G;KufOx%)#NQ45$Tzg}SGQgfjJkY6rUojl69h16~hKcV4yj zTYy3g&$QP%J%D!Ph!fh{;eqU)?eD;t&W?``Pnr$JEC7PZIBuPM=fije-~a1uM*(9X zfO&xPcIRN1W->9;hynkn!?T8e0+`r;?Yu|S$rQbA?lpH$Ti*i>Ky7I63y7Sv*Bs^en>b$B5BY`uZg3&h#{9x3JQ0OMZ4 zSO4n_hL@lhBozd*^9BeL@e7{{Aqsi?(1L#8^d)JePT#=`Lmoc?wH^9zcVylvG}cdw zilA*3JIf^=z_p>~omYp5lUIt8ThvSF7h(zL@Ab~xoj1)Bi&m%;64a~ipBy!JTku1a zyn|h!RUnCdMinf=|8<5F4Fv+p-+>uNFi5yEp}2$(j}-_-Ptc3x+MYAL5Q4R6)!#on zLBf<7-#Oj!X#nu=t0sPO+&ln8(sJC{-90;orHM80Gw9dJ87$V;0Z$nWU(fjIx2@yX zdOZ?N@9nhq&yG_B34J&O+#*~eOu&>tp*cG_+&hIO)U4HsR{Yi;G`jn(Ot9}P{h$1A zVWM6&n?fHuufK26^5qs`8J)BQPlp0V5S-6QVfgfYM$|R;lW#d=@eX-WvJL%|#1|<1 z33>kk$Zz{P)~)Aj%a(*4l`OALU~emIzvxM_%X1LMcXRC!Z4YPuT+T!pAG=_AN~PAU>>4yfBF>`|%kUTDv*^XT8~n8>5L0EOBs&iYCf0`s2Q;3wt^rE|QM ziDm(y=nSD>&!tz8ILa@ZIEphzaZuNobZtpsA{M%V%0y4TzMQZDDJ#UN0HbICXyRl8 zzzMxRV24?gg&(?JfhjSFjIejnE#PBLU8>fhI#f2-a8&a-od~E+s73bpj9@_NHt1v+ zZ)O-PlZn1n(H`V#7x55};sA^;wI+*kOvewKavz@V!ozwdca)!^+o*GkKBSCRWHcAI zx*d+mXWA!@6p}BU9S_|9d2bY5U@~{(JcGTvkyz><2hl}b)5afY;J>f~{xKjl>igdY z?T_II(D@C!JmMWHAgj|`e>aK-FYEpi?6sqA4^xUQdQx1+3|4Vh1(W$6s7&RT3oyH` zT>EDnP(Z>zPtDv`n5m7Ex$UV)E-m0(pRK%}D(71|OWUggxTUg#b1t`67?@M#ReE)> z=U*`hIl4}zXm0qF7L{Yi3@~LLyFbe1iBIOTu5-WeN)1?LHc^#y?ma}RmZH9KT7Kzo zY;4)G(l>EPGQ&J((tc^){N{gyUMjaQ6&R;p9uyaV`-!RJLQDfg;(zJS`IU_dfT?U% zeAwwI?=_WfQfa+n`sk~>XsTAKd+neXjOO{R(?{gpw{B4y6IY{XGJNT@k%Nbf7VPTS z>k@S|hU{*q+PVOC6b1tq5}oFRqs+qfRk!#${G2LC*17COK>{1Nq1w}Ebuy1Sa?zjh zG2v*|FH~oEI+Go!ysH4=WPNIpkYD+r!DJ4jGDlEyKdZ{P1ok`0#GO_u<`1%*9psRHm7}^sDbHbMOB9edYc855K*C->5x#U%@)GQmZn) z>bsr!|1X&T=ldrg-p%vR#rYTK@c0DlD$3-pyqkae;qUL@{fDR4OQ620`*MG7zxH>m zfyAm>@~eyQe*F9aYwXPL1@o5-gvqy>S7nZ1F*GJ?RdtRUoTC<>)c*dy!N2C-h0PCE zU*O~4sOp?N WVzbC6!dD;#lb%QeK`~$?G0R|TvaSqW@m~arnQv^KcLeIB`cMuKc zVN)H*{if>x4^lC%pN{k;=NIBbipLuQTB65$`V6o7{`2Q*-F%|Vr8_6Pt(H#|P5v7< z5eOKcVF$YEQi7~0+i_~I^lKy2dO%6JpFZ_>j#>>9Wsg)c|Jhm%0HMSQKu&mpZsgf<3jnPz zuBQR{-z>e{m>JOXEI`Y%16p22Ko{XvcQAc$1%RF{t!Dws8C)SC8X6x%PnokRv-Sc3 zm7D!yK&#Xv`uvvfFJqkyoXmox_D{)pp&(>3b z@WmYfJxc)^(`ug?&{`T0FpSv&J%3>V0Gx#>AseMYH%6#!aZd!7IU+iNiCjn7&6 z+$arbeJufqwwZGdZvlL5PF{`uC%cCSd#yLMjRZUfwB*bh0s__ZU%Y5n zEI>V&vB_}bE`U~+)>44ZQIeY#N6RmsrvVX7Zp;d3Jq-v%li8==nKc7weRbv@t)>C7 z{4?A1uPiQFfbinuU8jF#H36uAWfuZkT}cAU9au4-H3v`>jnCu!?Y{uf+KP=MfpHGP z$*etEef~TH5H8*<@-CXSl@|qo&cj~V-ze9kwdEW@2^doWtvt&Cl(parhqhh>DABLN zp)KYCnr&ZOU0llnl(j7tZAYt1Ie@ZwNg<930Ht_IA)wVFKr6@tm)5_+=`aS@@g)i^ww4c=y`sR(i=%3prw33DQ;T?=-F~1AeY+~0(zDY zD8-VB0KLd!Y-oy{S**$G5$1l&l5C3rW%BG%*pEJivjJLM&IObfNQwY0WeqL9gP^tc zq5#k=f>tIS#dna8)}9psnqkX+wwMQKR{7|84xm}(qm?{l&nh1|l79lwO!Cp%S`nZb zkiGsqAJ9zl(fWE0pjpM5^`$~U<;9w3S`X93EyvK6tB zX9+sGyNxYD*>|_Gt)~ESVAp6g6RTZMDt=Rqb@e=BU4pXjZmdi2qq`gHp5*|-&}cKv z+EQ{Cxx3YGJrmF!tbR#?ysOpkxs7b{Y`UY(e|;qh=#HlPbw)O_pL?CutgvAm9Zm0d zn)QsQ-vxA+)2wGp+#@__1m)OZw(ud|MA3IHvw(yWD_K^cngbL6x9d_4=$?5A1F ztY#TNh4?PQ(c+6tK-pa?L^k0lYpKt;)|QE}fug?yOn;YoelF6BaI~@}fL=4x-y@!% z1F8rRTOt5Z6VHthz)>)Y!=}1VR2I0@B|x3<^Ay@H>d|vG{rjY%-+5@ymNg)XkA06>Q$sr- zzv<#tTQoElYXH#UaGX2sWu{*v`*5h^tmHx}8X7A#0O*MH*t^rwvsDdf+ME>wT7RAm zD0AM5j_FzS13<@^vhVKh9?N=YoMKz?fb0Pl5#;K+14xnO?10u3WuFEYKcF;IG`ymr zv5gG@p%czMW{r(3-FQctREvNW4ULT~00>R0_vq2Hm1PF>22HB>0<^?{_Pg=;UR(Cc z3IjTj>)3bYkk44}@5YL-@7kmF=Q3+2WKz9Pk7&{Ew_dUC^W%@_-#3rX-|qa^;c*(& z_i}CH6g|)1Qtpg~c8PhG38-~2GoZ{K9XG#kowN=QHf8|y!U0q?uwp>|^9(@Q1DgUU zqenRdD+a`(AKO&#B_6YDRT9u$#N$Md?n>EfOG}x6W)_dvSoC8+-;?L#9a$}_qM3lw zy($E>Rsd*u7CR%ZZIH2q6!GXTn( z{yPX-YfI1b0i_sH5uoM8B0$SC09q{qv@!#r^&&v!XH6WL@&K*P0BE@g(E1F3)`|c< zn*mVa^gk~TXmzOw(2E%WtrQZZ%a95I6;6MGAr%5DULwn-0j(9{D8Y~l0TttDwLG9= z9IcfH^r8^ZdTBuGg-c}VS$ROTL^zs127rsAouZI8co#uH$^u;gtOyVr z5D?G_^ToR!9`NMspz@@ zy7#H*iU7Lz8Keeu-!sVP0_fgnkg7-bK3`jN0Nvw!ZAk##`=o~Ue!(xELpoe3t30{= ztLs9mHlS!sv3N3pCEvLKJ^x;R)Ger`yY`0H^jGN7%H4ak{B?S?X7vaU>au#{l;=!6 zTl{7L^tF(@yfk}Hz7BGkWpJ#jdtEPQ5rzOw-=7P&XJGWxLMb>g6F7{*E(VnzjuVj- zQZW~F^aKOKD-kteiri9WT>iSbf4{MDSl}8sji;^{KsnwV<$C1Yz?Hk@ce;P?Trtqz zlY{eFFU~G4XZcT$?{F#9w>>Dw8+Z2V5YkCUuCu>X7`KBVX8GYTM|ph`U6yRndVJ2%E~hN0((5Yoy60VR zRCI@+>~(@Q1t`~NyBr|C-IfYZm<>@hKL53jV%SI^TLCJX`ze4J*_l^j?}F@J)DC*# zR8Xyf1Wb+wL9hEyhS#DrZx1B9vQNP<$h^%k%edIXarp6SzCB&e+oi-qBf3okDgZv3wotGcfuPsRUQT3KCGh2%PmMbDO1U&t*N zi(b5VCPnBM3ni;7YtO84UBN8y77DMPEvs&czU6P-pM{*An!5%^;BkmVYfhU(usZZyNtvda?XWp;Yg3|5{#pwzOoI zvP}7}wZ#?PttO|1RFr_&UtU#HeMn^a3Uf75G{-^5Z>dChoTBny&sWxT^;gkk1S{g? zI_&lS^?Y^dxf;f6cv@dn)xHhlk6h#VbJgkp3O)t@dcL-#aRT!*go4!-Rd5uJ;1gIl zYEqAG$Jelwp06*iszDx4E^eXV+2V5zg(4#V>p9>wpQcop#(yorlJ zdZ0EI;m`W|D*n6lY;Dp07yhh0TUlTK)6xnQtt~A>!JihFRu z;?inCYB7v+k6%(I2fI7zEEYvMB>=(|#ZaFNRDxzVH#;RqkX(dL5{x>0s?uw#qz{x3 zLvn@2lwMk;rKeO0I^l=PM}`4>)fgn1z+JLY{Ke19M^RUK7{bq#%hcqJG|88@0#1*_eVRY-}+nrc06i>cDU^Y{d0c;``yUOSqlveDHEH$1ye!Q>%Ez@UTq)l=p zyh7YOe(Vl+6VpWrnd35m_o`z+vbVr3VS)Ub=q;vO=?-vFeA#s8L0Zu>u=V7(`FTLU z{=!E5{F7EKIqGT))}Cn%I$(VQAN>7E<|i)L!*rd)La>KfU=NdEd+9p8La@Couss{> z{JT!`b^k*xAIQ7^I?a7;s48~?9zS-LH}prXRRrW;fadx!170T@2y+vvkgu2~45#ai zZh;>`>73Kd)?iZ>cpl5D)eMl2VK}^sP^nA7`B(xD=*qCcg91K+?;p>}@7lul(a!F7 zJ8xh+f*L9nic~U>iFzRKsyh5L{XYC0wyiqyXxGCIw>wZ__cd;WTd+`n{r^tBRlCm9 z#+S!)_~QJe2|MY|>EUs$g6ph}DPQ7o(CeMY*XNYyk2|Z%YW{rNpYMZ;y=vDyIzD`J zyz@4rvR&(B_qcU*npLTFaB{k{zkmL1a|hG*VGUJ;ov3+0y@MD{;`C0$mvdc8q1I~N z0cN$_KbKFT>V|i8+;pE|r*;bDo3n%DSBVn*&Mmr_bbFn1TwJ{n>2jM2w!P~p9^1wE zyzL2DS>;@^?Zp$BaZql&o!$MzUFgr-RT}9y8lJNVQ(FkyWE5`nS80Cb@w~r!-U)|s zs(OEQ0f=K9Mfe4*q(|x3V+nbK6*At&ldE8q|FOz&mi_VnjxOQ|MjB=U&~kYrXfw5H zL0u0fV~{l{<_oE3Fhj4KN0@%{V7Jvgsc{2 z|DzBmROXJHeB0dLuO(+=@_C*ne8Ks^ll!t3CF56AQ)W@d+PGGAclVn+2j_dO{pN|k z2~l9wzSRiqmLO*Sp@VSZ*N+auyJlX7+a8oaiV1?NWV_E3oocy^GFSx z9G)HT5*lf`%_Ft^`uo<=i3OdW6YX6(e29lhR5HU~vnJ;UO>syRKw*Xf=?X{u*f)AVc% ziqzmTvRadpM88yNPQ`Su)LZP-{4a?@xBX7|X@I#&UC>gR(GT^e;DhY`s2bR(m;M4g zF5q)U4eB5fK5Q;0&bHxtZ+M7PtOx(5cWS*i$iN%$FSTZU1-s61{+AvmCx+Li)y}7` z2Xp8a4m+3L(Mh5#_Hco?h1cVLPxaY-gI)BjC4|q**qB4Ssse~>^Ux^#eG!b?*Pdb& znlq>ZtVoT*tk{)UNyeJi3o5L6iU~vOLzeN|!2pHsbJ<~qWGzDm069AX8L@fJvj#ZT z+Q;CxLG;@J^n^_%O345fM9H7?1aN*{M46iZQWJ;2{PJ(Moq;V#j$}}IJombJa*FmE zlxQy_oWcrI6&{$M2c3VQgWY5Zm3f9q7u))o7ptZ%r9oHY-x~10tLo32E)@7)#yd2_ zGo%S4y3{})4~;_p+kb;PZ5m$q?KjILKwm+1+n7SlvckwRse+3wGt~JI`}yCECjd=# zREhKb;4^%)x=4kC=mPpI&=eZT&QJ;!3-3NO-a-H0zkl-EhlTg>=Wh#unG|RNiYA63 z8yL_DgUkvBBb%g9nh^kMQkbzJBM8lA(gUe&PH)q9+NE*xocM{B{ogh#Re!;6JbAyc z@aGtRz<&#%*Vo_AVQFpQ-G48908P67eyLs+V6c9E_^#$xUp3#f4*Xv^f9JbOqw)bM zv*LfzWse^(W100(K@sHfk|Koer9b!d=|C!~QCo9bGv=#beKG;T=gV~q(2b;xz#S8BT3qDYd zH38Maiqza>pvF#JImeR)Sq{G%lf?W#$^L~klv(b#-=G4${Ifsb!PoFrMO%2G@G`4# zqzX4Ro(Pg`>2si#W4ECOS&Kmlp1;Hiq_#21qhlfE*=u)dc2o3?`b1mJ*kU{muC7AP z48!^k>nm5B-eQw#mfl&^W=Hi?$``S*N2PSCqKftgi#-ul z30kz3I`wD|$Ld`3$J65-8c0nk;3!hb&u!SkPIr!}1b^VO5j2{|uMSV}l!9KT%b_-Z zir<~kuM_xnc6x}49zDx%F4ce(Ex1 zSlhOr&0Awk+fEdjI@*-B?UqIJHAN{M;5H$||LYZSMkI)2NVtZL}rE>=(5o<6nO=3i7|&Z)M|6TBhUcJ)F% zNI8HUJMUD%w$~37_3$q!`3V1<52=WMZhH|7%o&tZuym-2#tL5ZFmH80ucOI#!C z4SW$RpfSOW4XMY9*5m776n5+Zx+PFUa|p#5;@cR7X;rG9)OnJ9jwB~cnu6?S{Z^>R zJn1)){ZVATFx2D}zm4S+!&gE^l=CqRkV@UYKvNN^2QVXaCL7KEDRK-0;!B z6ZAc=adNh|*ZQ$}vSI!7(V*s&UCbwoo{z>f_$&4qM5fNN;pZGADYeTv#;SRbwo%uG z-()5DyEr>M67y9x^P?)8cpk~|Ih2w6$RqKGM{O{1sDv6GTi$BMuEsVsKj_cT!&Hny zShN-xpWQ07XVN8_i`oB$Tx>v#Cnpy^pC_jgQW_tn+;AS5WBW(y)cz5vu2s`jK^b>c zDKKavyc$e=+o`j<$=aUMVN;(|gT*jB^z{ zbD>aYKqXO@fGCHM4Y#v6zzKT^Jl+->1cG6^ML)Q`2y4~NX`Q_@XdVO`4!uI8ZumLp zzxqHIMAMzqvlI7F*L!ql1gj3ETHMH8t9Nh9Ie69$BoD9e*FqM=4bSVt7T>$Y4Do|` zIq%=_9?i4C=Sia%d0ytr5%4-Fiv4r^8<-?AJz|6#bdYWzM%JJU<7gCaZD4mVg7(MB z5IVnA;a*vCVlC)DhCdZqsf6a6&eqSvo6gTXRI{+%MJ;`L{8)p>7qqP>3!yfeEZwt) zTob->>U$(^XvB$upttAWEzZCApnu5I-1Y`xVXM~Y<`vOjhL`&e8-08!P4++GgWdT} zUm>#pN%-r=ra0t1GCog_%o`bQn~aHqO)~dAA`eD`fQ;i5>%A1rw=A?{lk*Xw;v0f! z@HA>~Ep94Ko0>4wMOFDR?reG04by%sqqkAA@WhuRfCjJ`>mWo--gL%*-wT$~WU|Sd z5kPM%Du$ii5V1bFB0=Hk?DRy@ZQ?Mlmhy>u{8)d3Cf-L1om(Tvrw=j9E-<&LjMXMx+9rngDgD8Aa>ZqiVN(fZ zyjr}xlk1IyD4lJx_nd?0nZH5$oAn!-v2q__pFmPK^Ghek4?y3K=NM9&Aca$Uo<1F# zhfaWg0iD=>JePDMMA08ltZ<>=Q9gO}i<>`mj;#ZD+W8yZ8Q6+K15segXEMYGu<<&82&0ZB?si`Q08NPD!aDlEXn_jACSXxIvB*qf`x~hB-=% z)2^63P@H5vP{;cdN2#~>j@tos=3li$o3z71%@#ov!nBWxmd{Bz!Rw6~sDWXHJ$z|S z`SHoxF7wu6Leq*C07X@l^$ zAtIA~mRkHh5}sm;MN-yO@=nfH(Ok_qQ&RoBYd$dDSKquR&W+O0COR(s*611la~5^x zAe=nAb6(oSX~?EsMCs}WcD5{)O|w7prRiojK84e` zT(7erV>CbY%5)2orDkm=N~Y-5&~$=ZS|jeke`mR5crIt{TtuXd7sPz8F}P3C5CkmpjhWP}yzFH`?vUkll8z$0CH*2MIZ9?ppq(X;lz-RcMCcLgoaa}`d z-K=fqUO>zokAth&NB^h|m^6CWRZnpnFH`eB6dcN94n_I1*(-^Cs!H=G%P-P$i)5WL z8fL<wX_5ArUhG6NS*p6WV{P|~#i_q-nu%qCh(;KOvOnFkmxcxtG*>*~|bI8;$hsS9ER)@u7($X8g{@8TC^t_emk+BBl?P=UO zsREy?JuRz|jOtEn(pzG7kMfQys3xvZfx0D}M>SIMtrwy!Lh2{)j@UI=-cX z4PTXeT)d&Z{)Xa`+|1!-qP>%P!4^%JMwyuc^> zEqaicxA=r_wMf3<8|fSmug!0b5tP=mry$X0sucxIaB4rwE)BniMRuZkBHxItwqMBH+Wzb%6 zMs?YBMaQgAVLxxa`g6F~+5tfR>{_1kTn8@osX=mkl`BO+UB= zed3o%cNB62lA!0~i79k8DZ{R>Ot+rLDzg|u`B7?E?A1$flnp;&LA7dN z2V7IR^U~>%Wq`Pk0o@9;Q(=+R5m7{Su=skG)m)n#9R8oKm)w+Plgu@OSi+v%NfOCU z3wCBTEmSPoPK&Jkm25%&Z(>%_w_|E7lipn8u1Lv%65^&FzY|q!F{4g~ z?LAZNP8)_C_~<8b>fpY1skNA1^l1bZEN_)LmAD_}D4c&iWy-$ldd?ux5(_#_ul9=G^uKsE|1a1LvbU4$W&BWfT5Hvt zvycZ|_4-g`+NyV2&tCO;r%5WRlDy6`Cg-0v-OZRhgViBjlGd*9|Lme$?%%ePxfi%bZScY-XKF6Ip523F?g{Dv@W6dqC;D6edeY zl2gQ_(#MwfW0L}NDwnj|{y$c%P9vkl!cAeutXp%CYf(k)5=E?N;$%8Wlso9XCqcyJ z=pp{UfE?mGP(wV07_MPu4Tf{IRnID$4#3vPhO!7q!my0YDcX@cW_0_h;vcU)_-JVoYm-k`s^D{lAOfs#BZJHuH=2})xws}K+lG{|Cpq?R`_rWTo4S;oIA=Sz zK2CHM_g{O%O>DmQm&4fQ!S0kg=635dJ)d^Si{v88Tv%#ZUQ5q^a9Eyl@x7gD;??Z{u;;_bJl5KZpC($!+|-AB=s#EN&xcZ@$22>FqG=V08Az!C~`9yx+g^ zN79Lc{12{&_*c*Wu>5RsZFzBwU8JU$BR4^G|MMcN*K6NN3O) z@ZdQm5n?7BbR4`~qEToVjDo9CFucahkx&nqY&aUjTiAu#(D|zf`lWMO^r)jJRW>ZC zCp7RS4Z$LYFVG^-nR;o>AikttZGXae>;B?!><@dB*k1yQ?Dag8xn#Soe*XFe2y2m2 zm^}A|1kC&&nfxL^`&XD^1JFH=csC0O!#d9h?0y$81AWXx0&@(+;!!FQ5P&8@50i#` z>f-S#t{L6FN;HD7sJ4~TgkO0`IXVdm=B&njliO$%bWvqPvAf7gPvE`Ysez)gSx-7S z0Wuy*4+lIUF`1d{!QBG+)$Q@Xrc8-T24kQ%54wt3)qq3+Ru}tx69HNi$x=*9Kwf?7 zNMH@#QwdmbS#{fVmdpqOO%0Qk5S3bV*!JH*TLh4TX-1PVGQNN-`9!_c(>UsfH~0fl z+P~oQ>yRVp5q^Pwx|igtNr67RZ>~o$74bE!dmmTG);b`e7mcoa3p@L4kFBK388vc)OY zOqNBen3-OY-W23j6s+YXRHWA#nG_w=Zp*&qAQuVv*L_8QUyvgOvM1jXlaqedk!5#> zlO82GtP`2sjJo*X#b(!avL~|@t3hO_L52a=#8xgRz1}TwM%;}9Ozwm^)<*?TJO)uJ!1GyyTp#nPn!xR5Uf9`bv+Ss5**|Ba=!3zlZ+b-f8gc|<` z=yG%udzjX3;m0HT9Iyr>o1=VNVVB6xeDHlY#%<y!ipPm`~kNG{7ZLYp4ZOlEUjH$h+>>U6Pq)!Nno7f|C8AnS;F@ z_xCu24Hgg+4a32F98E^;FoV8~0O<#x0+>=vuo&n~ToGx5vy>^CxC!_TFmVvu+rb3% z>o9=%r_Z7|^bFWbkS$_AzDD&NkdGEzbOu9F|0cK<`bL9^A#M8;aEyQ5Tj+|CznlwcJx?>s>c_4-`fLmnxF(zLc0BVGN z>Hff?1r%fOqKWQ>k`0BX6ptvg^vi5(_43^2-h5F+#;PoEad;^7F`U{55sPhszN7RUwU!D_oD!u#!B5XZbjfEsy8%U|+q zBHCkMccGAs*?Q{!bqK;X5sE<+1qh^RLz6M*YzlB+;k2BcoH0yj;!I<@naziz@~2NT z=-lHE9XijU-~uVSEIYe5foFCtL)7NIe7kcw_*HM{UpV9Ir6^Icnqonl*WvR5vbNy* zfPIxMSmxY-O&qEopXBhA!~BkKpd}B4T{4=%>S&{ULsHC0445}~xRxtT$RR@Ci1Hbb%^i2(>{n}jwIV_@VT z2e@hDc7(_eE-D)VTmrlkkW)1dx#W zIPpUgEvP?r6!`im0wBhCE5AiE(HJO&(%5?O?Vx=P^1C9{eh5PTpd0s5TK&lW0P`rT z0y3gDh*&5GOvd47bP&K*jh*ZSqYfxKIQJ+gAOg8B+z)7p`-z?A5TQPujY`)%5P(!Z z-~8DLu&Zivc9m2->2;{e1q#6(WVU*_S}QE>USTR%7+I$W5@20R-DrB^3A98bZv=A& z{4LfwgD1%Nkn*G{)0ez1gIr05KeqhACp3mOPH0aJ;-rhy+eJakv&kz>E`EYs>dwB@ zi9%}BL%R?zwqS58U-;Z&k0*B+0eWH-*6B=?d@&`vGG#^P(RoOG$TL{zbLLSrUV!m! zbb}gFozOuY*S0*hLNpp(9^%g-7wg@!s>7cl_yr;}FR|Wn{uTg*>^FkcHHON4%&-xT zD1l;Y;n3%;A!7z_uDhUD;nWQyw3&5zpFvvQgqI-+jnRmP4!`3}GQiPUQ|B{tBF#H7 zRSnC8l)n$;n^Nip`^x<`g@O*DMG-mfXa8)_MIqHZpYF{+PY}4GHeX2`z*&ZLdMsaO znPKW4CfPU&>4~RAVfZf zEkVz<$$lIy5SzK_!Vu=R$G_eH6CIt8ztnuy>51CO+HmKEJxv5i*e!e;L3WdY_Dr@Mh?6NElGj_5`mf9~f- zwZ@s@LGOl@@)_1&|03#bGB=}ZbTGFuA1fTij-Jfgalhe@@{a7m?&KA(^eCV?QYdG7dGsI&YCpl32+BjL8AXdrgF!pq{GK7H!+bvT^0w*VlcztUmhZy`m51_J!3MORScKA~qD zRYxuI2a5q+;5l!E@W05$XXxnL=I(drZx3Ie?Ke-p`2AIodSDSNEf$R((QG`=0;Mi ziQIc9$!L?$Mm4)shR84C#08pF8<>SiOvYf?=ksLr;tDU}!PirR*_qDY?)=x`v3mD8 z`LcD8|MIx`eG5}6QNQ9)8Zx3M^`jsBgZ*t{@&^EM(SF2f!|{`kOeUMx%7?Y!(1x6- zhU7~ssArp4Q4t^u_L&A6^-_CE zKNH4F08xV~3r|Sy(0x_22m{wcAv~L7@h1!3Ux4>?FSA&XLlif7G~AU%!PrbqpgQYf zYV*7kv-^#+2p`$kT}dCfQW5d1*E!@buYZRHfMc}uP8&T+0M2r-QNBd=ggee1oo-Ih z(-kyva#ndWiY7z;xicCCx5~*V9vfenE0~k-NoS&>^;I%0WW3o^de#x?S=O6ZQAAf2 ztfCWE{H>B*9*Sz1PibE3m6`2CljUEUu+xZDCbmwp>;82&gn4LRlmDJ;X;XY7`}Cgg zh0$q+_}-xUtL<`hx@~OnUUwj;#g?TZ<{8k>q>!4o&?8XI-NFDTM?YQRtQo@v%$9y| zI_>R>fR(0n4)rk|BAKhL`SVA8)J+ba_oIqI-UNr4}T(Hs$|2F31G zarnzbNtbr>=uZJM1v*Nw%@mFE*MWF&vS-HaFm(G*SajjHVep~0Kqv!h@GIEG306L=hJ$9iZ$O*Zw?hQR&a7|FS{_JpJ$PU~Bc1E@ zCg|;ep_K$Zq&~8jg|?x%^ha%ov8kcYGTXsu98KD&F1mZ8_KdXJ&*-)1DM5G3uPikd zE1RC(W8f3N!WMW#ULzauiynRPwuMjL-ugSHI(&_9(GwLjmHq19z(4D&i<>_Bp07TK zAKPEJ&X6;y{pw>zw3Rh@a|=I~*K`&9+v8jF@L~@BR|ziKmAb#QyaF5FXcGE0cxWuI ztk&Tr?9wQ%_J`wJ{^rSoU-N4O&yjV-V{RMjFS`^y_30-T1qsAigf> z(m_ZLcH!`PN?)KWFLJx`9J?Y|>UZO|HO0d&PE2EIb!qLz^7`5;!?@^PA+G?i%gZY( z&z2Wg)}ODfK6|$IeDT>nSAn%U=?@U!@BGSs08?=Q>l`MovWIsm^wZl`#s8q7j{8CU z5%Zz|N=XL>nNuNIe|(Tk`(4tfp$7|o!3b1dv=6$RE#1$tN! z3ZnngrUWdpmkwDLv>_@0JxXouTGkzOftmDf#Z{f$>ydwpF7K|ai(5bNh$$f~Irk;o z4)LWio@Pz z!*8PFA6?Gr4)|bM8dshbykE&@n{*%C0&^Xpvd9(XRMTS>64w~BDHK%$UTVnra8Ic7 z5i<)jj7vPF|78Lqs0XrI`(rqEm50Fe2zXjjl|cs=ho7eT7mL7-*^Jce&tD8qlv-}_ zwFYyv25_OqXK_zR0}m)DHl7kfY7=&AR>inym>*KNtuJVI`OJ6jMr}L zrF%{l8t;}qG#IkD2IJW`g;=GD<)ak5i=p(dj&aWvKSSvW3rC7@T2>)`4}{r^M9u3& z6SQhmN?UdVK!P#{W`Ufh5fpgaBeqK?{uW(eFcbF>K?xpwXl((+Ln{T0uY@?AR`Ys# zeAYxgmeCCx129*9*xT7Z!B=RyrGm?#7sF)CA;p3iz}tSm`#J2)Qw$+v5%c6AIr<3v zweE+FtA=Xg6q_(G_k#Vn`K6YL5Rs+SAY5sYf-+i+fY*{1RTSzyy@q_XhO*ik@EQa` zQk#67=Dd>4kwPD!#|ujC$)?Z`nO8kFbSs3yVvRnj>4$jdZlDa*F}lnGlOA;goZz-d zRMZrF-|dLDhxdtMW-H{^%f=_5Z@ihv5;Gr~#~};@fS@izy!BR{`^Ge;L64dadc*4g zh>OB1;NfY|9+RU+2ewuKHYZ+MICpeUDQ-t2Q+|%+*fZF|07U#T_TfYU@idErwi=7Zp2E<61sK7*+-9LeZ0p9>Ll>0 z^#b4O<p*ftB?v|OCH#DAkGQ6$j#%_T2@V>0B^~UP8-n??}uUcuz z*rBPjs4U0QEI*cGZ^dX@bw7yft$DoIwFXQ_`M0$NVe@cZ;@`@S=!1GBo#_libs?MS z5sF9lI8P~Eo70^PuKXbD=OefwtX?~FSO3mcvc;Z|Kf+xv-Y{XU2^aGx%|HnWJQ%CXgj-cV72Wuf>4?Lp=RbT7mp}fN`VY^p zHm!)~?ojYHpyCbp2uCl;Hf(TaPlttOOW+in!plU&j*B=h##{IoPJff-pt4ZH5K&qK zW!2int4!dwD6e)D#_WsKlx)xwn|?9kC^MJZ4#BB~d#+;u(q_WxUY52#?B7?E1giFA zLO|{K)&TTBUSs088AR4 zUWn1agbfo=4@X0yg$8w znTg3~3&EBPOwaLQpOC0$4>!R;7*0&!e$cSMF=?6qSdaUWSeVd6q1G4|4+GU#FJ6a0 z3MKH4E-B3V0523ovK9_mis>sk1G%53d71%Vf^nuK3`3gdmbk~|YDZzr^V$earyHNu+#e)_(4EmiXbibWoT6E|`jRDApHYf6D$we6 z00kSPYu`$r@<(8)z`#{fqp6);b)Ax8>YEEk!QJr$P3;8TF2>sxcu^Z~n%mmFuyRur9K%6(wG6v2@?#MkUd z``Lg4bw@1m8Hm{{trUGBYyI{fTl1r_im>+ftrM``p1DnVJNBPWgFu_NvnwwH*&!5G zKmR+kGv_EZbA(eE*{uNcD%y+0y1_9Z)R>hNqj6EbH9GCH0SB_X^_46xEnV8H!Cp^& zNO!XW^i_>iDLR4==Sas!=SVb*CT~AKe}3g(EJJ~pg3hQ7Ox)P9k7I;58)_?Sj^;p@ zp6BKXCd0vB(>{z%awTw)17QPF`>cpG2D2un{evxP8)8W*sn)<4`0mId*&;ie4+)GL z4d}=m@T$Zc+;vo{0TyQlQ5G_BrI*pVRJ_U*SV7~3GCP#F-{|vaquo6qN&9sFV{$qz zF2}ab&&glsBOq?LOX(U*{|?9FynFA;tbF^P)m*=l@2}I;J#fhiZ}@6Exu-^EzuR{D zDnFz9Ti%`a&odI3#Jn@#sz$tYs!Z;7SebNcRM-f9V&&9nCNiSsS^RNe`W5*sisD}a zmT`=cnp@>;G0a?(U60-8JcnYCri1tYT&ZKmmSIM^<22+EH=``_#&W zAJKJ5LUWoR#vn$I;1IUIy7F9!r2=+hvQ>TiDqvfc!TkRBYtMUIw<+@e(s>8LAH5Pp z6wGVwI9it5W=bkrI+b4SM&k7{&`d}Bvxa;Z!HByMTB0aI5En06OM*a%YfKLqoN@Zc4P_x0u@)S z*pr3@+NPW}sd`Mc_;GvoqqrY`S_Q(ug{_)iU2qS`V;?^7!}ssY0?))9L97hp))-Pi z)U2p^QMx>ogP0U4xEijEd~69*a)xv-;wvXKb;zz_|3At4#TiYfq)edRxH>zw+#=mV zswr5BfGg8Upglw^QOs(zLo<<~{Re6C-W6owKzM`w82NIvqM|&a!tT_1m;NVj$BD20 zKA+k%4NkOdVAM)Vvn+>M{VgTEG5i{XlCfQy5`Jr3?hGfygN>tbL+OYcf9%KW@;adt zG9=oau~)Z|(~R^1@6&*EycJLlNF@+9!V6s)Cxr&0?^N;#Aj_wm<+C{ljpf5ZAF|;s zFG|N0A8Ta@A~^t9C`ljzhgrw!=Ck>9%=R~ymjh!n47K!8mX~O{Mmc|LqS|q*~`xv9hkbZqg9@u+pvV?(do1^65kw-Mx zZvX6@)CP#JdI|}4{k$9nDf;L3N{1aHmk4K7NcwK~o(r?O2dBr1i?;dF`$OEGBd5;C zvN{*@Q99NypB4j3D@Gs-d&n`%ydYc9IGK+xvUE7RSTF)cai(8JjEJ)PR=4#rRzNW%&i#Og?k;hQjEv3R117~KG`m}vst>H~3!;BI6Gjd?BLybi4z zLN0zj_ju^o12eX3M+V;1e)KsX%||eX2RjLddzFvboJw~=UK+wlUlJc$R+5#?3?J?7sV@TsQ{cYZ1;? zIPGK|TBkQsux3-DY- z0;J9zZg8XcXqHKL+%gg@$#X;Cc@BgD;M^py-RaK+f{kHu)nx(5l*Z&_m4>0fpqfEZ z*An_9o56L0=+!Eq|NSiffQ{7eL1%+3e{MlyPs#}7&bCQcJsPvE@F4A88D-jtChug6 z_$}ADHjJ1UDS)41_s3~yETj{}2}~Fbr{Zk*V+w^soq^MFbTSw|x$$6AzqqlpS-prM z=LaTWud?J*kqeHYJ+n~1;fG7N7Rgrtemv#BudX)rtDl2+?K;n<#bU+loJ*uZq;f!B z0VNs1p}3VQ@fW9m1;JXkhZ!V_?Lb?AbK%=8CFRI%uFrWP*3T$B3!@t*5pkSdb~qNj zasqU>JZ9*be=TdquiNjKK?cTyKG~+h4MI6FiAydScx;M@0zqbRxIQ3Mj3zTm(&Hwx zWs~L*QJ-zao7qehP#tBuYFq84M3_YoHu0eQhbs(jLL@Pkmav&s3q!U55HbcXm`A(` z)1sI;4;uMrEz>UvXoeRa*ekR^Qng(iLNISg#z2^VJ83J5kwbB?YF%=NI`$qF`DLrp zN$i(U;ak2SF3qPvFO5eC!z-e~b$rk-W_%mn8u93M#|30jQY<7SIp8+Hpa^|U#oC69 z2gZ`-LrX}HRd6(~07@_K!7Q?|=|U5O?@-^}bU}*2cc7-=dqKpaYS(Uo2C*sO5D{yK z+ZR2HIw&1P#M2qc=T5Uyplc#)t+U@afz_L?BQ5D`sj_jS&BxBsaA3kl|5<6EX)AfF z|FK)iI7`>qO#9}I_EFODq^-N{Yq5R$Mk3I`4Zk@z=D-~Eu>5iorK8G(*PuP@=}YjD zwWiR>N;H8bD+$ajC$Lq^5{9HF6&h@@#gRa|tVO-%?ORk^=c&I{GqI>E9#`}e2pBg> z?juIspoQl`D^@KsvM(J$4arorGZ_e+-2jcD7--N(W!SF!99djyFwn-u@hdJ^y{Hv$ z#4p_@$JZb#^~YAjhGH#(Pa`f9nh4>DuFqh&dCr3v+YSbTJfL+ZJKNyJey|ZLzf68#IQf}oXWWM1;ZbZDfv;-Qm4WTj-P|2tQC4>rfBZq z-9LD}zrX6_gsYiU1f_O#9_r8hcF0y#CU!)#DN$|5aSNvv7iWe6XE2pBqQ;p-Gz(Fx z*ceR~8& zJz0pCszaeyl#Np}Z1Rf_ht8JFKo}4U!hUE*{*BF1|y7# zD@_6=4LY3>PmY3W!u;H``nAW1BLcD_WSZ@HIo(De!|iO=zas3cs+`eLqxsgsv(eo@;4Eli?O6!BdnB!v9#Y0sY{V#q78#`NqXj zeI1_>3LKF`u@pw`ooPcdy(>?m(XRE5kEbC=w>*jC*>6pSsn`+a-#z}S_R0v#dIFUCc`z{qPuWun;HAWo#h zl$OPX)JP#;QItZvc!X+@j}NN(RD9Gf8uZhX>=SfF(CmGDZ&1|408zYDI^*4}3;PKp zeT?f9WhP8}q9Uc(J9WxzCx96aMt8;FGE|Pib2c0(`rxbljoeipJ-)IRaDb{iuI36f zSi9xy0v~VLgZL@O`mx5To5YD06ISo15C#I?J4?1eY+Ee#_Y;cr-jnb*h&iKV6!S65 zCQkPh3qt8Cv7ymcn$rblAi}385eB?t!UAe|DRXC5ZqXi?$zKEVvPg+X#?izgxqA3`9YRQ)O~} zYG}~{k^yv#pYjW}KKyv2rSUdu^@(~urIouVF5}WpDdXlNJLMP{de<9xTq_k50@9b6+Z6J()3wwl^yRLo)?~y>Uwy=-@hu zQLHvcae*~06Agr$8c_PbcivmZKh3RdW`&{%SBX8|_e;qK9a9*XBoP{Hkf@bT*9G!eOOS12>`pY zK*k?4v&t> zyvdD#^ffJpr7QQ7DiD^950CF}Vy?92O&V0hG>7>IX}=L)N;XaqJB&Lr4CYjD+PTY$ ztOcdx5VTEYkD{Q$>bi^@mW7t2cYM6};^5`(!O8pQhez*U938%XwQ_Z2WgZ19BiSOb zHip1mJaJ(Zspv5RG_`u!Om*4V2wz74c$}2;j>7xGW4aB%t(bv4(h&jb3D|KY@dYdv~Qv zTvC+8Q=-$bYpzeWz5V^epWh!p-LoXS_k8cECE1f6d}B7M#>vg)D_Qn)g5B(U{1IL6 zA}w{v1QW=7^)-t&LP!Va@L@_+!6;CgS})|qRo+nOL@ zYfu!qj-Hc;kVwT#bnEp&dQIY@5~i^7hZ~SLUdOStW{{We z1xov<31G0hb)02M#d*c@B|4_D@Q8@FqNuwv?;?uUN%hM%8|2FOBt6aAIM|kMab07p zH`;CKs_hFFPD#@5S(LtFfkXw%OEGijU2j-oSJ5u^^7ya)xP0UhZptb}inLkPrr7Zq zPW76>&*ge8;hHPOnqIkP&`7j1PFe=j&=llI9uU@Fm6+PvTQ-U`1CS9ADV*X;?OZVM zic13_w~LdBu>w`JvlttXRtRhZ{Xxhsg8^(o0YnpZCs!SpDM2|xZr60CL4EbbYAUvX zYg=F}*M4sYW@oi_@K8)5m8P1hqt5<i}M0yp$V*`SAR?4pCXo_Q43%?2pB4Sb$8o{YyLMM(=0dSoK@7U&c z;>i#>n>wovnUCC~WoR+7(|GW0n7-;;wLLvt!>9uw%k#;5_@rf6V>LEVxfr1x{*)jM zmqfMsuD|={Ryub`SnCdf3}d%31kPSvvwz6P`A02(7>#_R-UI(~G>Xc#4&5hKVf1j} zMF=9l@}f{tH+-#=GsKOGB>=KX>3)pvC!Oh`a(th1B}P%GQYYSNOwx|Pf?o>TE=G~=5d zh)R?+xy#FyBp&o(R+G4jn)YE4K?Q+oqM%R8stwzB5l7HQEqUK$edV*Jbyn|i>^yyN z-39mHhj?2@3#fxM0=5uz{ZG2giknNf6q7bvXIbMYOa&-e-+0}1-MV?cA!}N0xP@D{ z+^`z;muvgws0~Wh9W>pb%etsshbjO+xDA!DLJ=d;jJ{cfetZ#y#>*wOBBTqhCn9vb zR_=kO0Q=_n`s#|%ZILwJ7N-4ek<{K6X3g6oj16Vj+Js*)Q3N8 zEqd`1@cMlP$FD_Se2~}gNFT^AwsO@ZyS49?X4zF#*;OYM?iAHjH;IA|7tN9;9CFj< zU~9=TXtXXxs@rTI@n?3Fe&i%ViUuRG1Fe3&h2Q)0aAfZsHD8?NGgcrhg!8botbs?;G{thHf!m@H5|>XqX#GT zda${5J-C)I{wFN+C&H(LaP^_*_?E*Yq(-=Q zfEtMl^;fBcc)n8r;Rz}4@aSdl1hRBIAyq$$k*05SzD@&-KPmsh**_YO{KaE0Wn z@4m6q_PIc`yauiCRO3xHki;zRPpZp#0M@m9M~WaiNuxI7JV!xxSJZy3FQY?f&a*mh z5_#<)so9v--mB#)@?xB9#BW-jBEPl`2bO1)VQAt_B<%)ZfwRos3zCIYz3!dLz$mTrKQGI^}4C03|1NPaMqSXoGZ`iP{__!EVUGT zN_Dsd@j=ywt%*%%!GJL63(Wgmt7OUMG>zxl z2Dj^NP<3C{HpP9Bj#n7zzDS=-%y(aAaa$VpZmaXvCO;|0tdhysIdm0|R7C7R<&NBQ zvMy+$T+V$96CyQGd-%vz9hx_GqLUj~7tK22ceE{ESOE8tt8ER7CK9`E%=^n4_HqsK zYhy`UV>l7px$b~knJe24tICyGI9_R<@&ISh~0M%BHF z7%fZR`#wuz#;E;i#R`L{Mz8$*(9V>CDENsy<-2IyTIc87p zu>c4*82)k_v6TN*a#0KBZ34c%!hGzQvbG^hz{Nk@hJ0gYY>8*-v7x%>ZEceH8FXJG zkK3LY2sYAuAVHa_IV3xyM^KT!rOqo$y^hZJ&VrGfysRO|nOHqY*YbIXUh}4M=D2?W z!Bl`HycPy?YbE3dGjoTgenyY|*`chrbO_md3xFaE*D;)UMWcMIj|pxPoIy55_;r(S zeCcbdq!>>SV@a_dSL(t{9g*&IlAZ33SRhmdwg3qwOi}2rt*A`15yXz)n0{;UC!yg| zqbP@AF16Y^vjl_+3HbbS5+=Y6+)EST^sa{Jg*Ak#ja_BQi)k9r1hASK-A@Y@KjKP` zXkZV+$R3~aK{g0x&@~%-94ib3^g5v(!2v;GKL32e(kd+Fpu5>{ZdP03qqAayvqB`D zi#1FQhBNy~*C*V+yaDginb5CCfUAX%fC}52FoX=N)}j@L3`dP?kfAahFn)?9OH&IU zEt}ekJdGmH+ur?f#I59jo6*3sD-|%c<%_nUme)rI3=q8AhMfm5A&YNq(QCFVU{>V1 zp+X^5YYsnHWy@qP0IgKxeMA*EEUzt%DI)W}tsSJ+mW1zc zRla{Aw6*7~)w;o(4o+TTf*JT1-mvuNu6rGu+C57NA<8Z+6DM~za zci(egPE5*GN~^&gvU81j*MrJlbJkjAu8pibah%UM!{2J(uJdnp8l9VU-#p(x?486Y zulUXJ$itst%KqN*$yF7W9lt{efUE0q8_M{<)qq{wDk-10 z-6~S-bwYG8k#(G-*L$6`H>hhSR`z;3R$fv$bs|I*bqU79>~Q-X@RL0EnYi4HyP!6kv4DLTf^@!EqR! zH0bc*WBrv$^|v$d0jfN1C(tJ77NK>hme`EAH)5C zt|*8M?YG`kwm#vlUlZ*40%As2rg`IA`~|#G^(oO4K}Nc6dbze<2h1V77+R_Lh`?h2 zvZBBqVzTyZmLdbTT#9g2Apo>m8PK>)s}8Oy!aQT0@Z`gX%PHX9PVe7`?fURxlF{!} z;zlyV^Rbb7@=~Y}OOvPL^SM1zYi@z_io{#7!qK+&o@lpt{ob^?9B;lMhyo?Y<%{nI zr@m7^0I2J%LR^SMN_!dy8~Z6wfokf?kx($6G!`I+BUh`G0D+Qsc{u@$Z)7RJEnyw1 zK?SY?r>YWnq9FXm72vyH_pqx~Xm{i{_#6M?)#e6~)uyJ2n&pjsR3-3oiH58^UFoI; z>^*Z!-$lQlO=iAoHg6mZ*L-#5>(gRjDp|8wI6*1TUYc3f98?KpAA;&&fosL9Yj?xf zAeF+SyM*PNydq*PJ3)!kn-n0W9(;H*l{k%~m6z5XwM|qikM@Ul^F)B-RO2?aNA-Kh zav$m!O?}zXDc)b@U%lY$L6!rusa1)ZRe*$MA)4yNc(0g1LFhI zA1-S#$q>g-m$)^;cgji!=&8gI=2PdE7Cbx804>X~i*jb$qeiCU@GraZhU|U@I+bGe z4h0;sK%L?E>PsJRfY9>#inp{lwC#A5Jgatl&$w zSxup=yklKrAxVAa0b4>=hJ~r}uA^*rQ4DH_l>B;C|GB@q`0M0%O-dp)|M`~NUlBC; z1v{-2ZBU+8AY1CX^ao(+uF_>%MiKL&3~LYcHkL?0fmQo}1gn^evW5JQ#!(?Td$^xN zICLY~RUW92UK$6*xcv88imEiIHlX_5E${r7=)92vZg~uq!XRIk##Ry->QFJJMLVLi zuQwB%{<2DJ9sn7Y<^jpJgMmq-pbdbW!fcZHIRD$6LdrQG1-)jC^r`#TTN8YKbLIfU zr;gpW`N9ujpOZ}QT-%L9LrH6X@CvGAR5vC3xaREZ>Ka(J4S+kXUT&t0-CSGIG*u95 z;Vy(7!um&_)E)@11jM`m)cU4<(8Y6>ZbUqP(RRY93#qv1>up|j0`r9*5D8?Qt3FK%!g=9HZiFFc#za83T5>ylf(;W zn19=-UW)#i|K%Tw?=?%LvrGr6h5CJGqet1? ztonSUm94Bk-(t?L2z`B(Mo7 zx94edc#*&DFb`TpoJ)jqrs95n)}O3>r91Th=z6YKkP#4dkd z^pwIiX;sRS`v(i1@L$uh#u3U9B!d&A-4W6q8l1ZM$+rvs7H`~PsjpdH&dzO$q2-r( z!J1etF(2pZD&sKe#Yw{xZ}uXr1y~^Suo{C~OX;!Qby$t#01U!I%4JE;kVJ=GN%zKT z$@YlL)0WDO8Q@gd0LTw^M%~kLez)TrZye?xJX+DHf2MSYJe0LB)YT%|6q6s+dakRL zD8*Sd2i*c=kpeX;lkXdL+7s&N3l>`4>=h_I@#ZLT3zqlrA64u z)Vg(&506VPS7qK%Cjv?3^tNEDW?hin=8CDc0m9cUFDinZ@eDz-98DO<)llx?K7j$8ddT56p>x<{6+TuMr5#FUR(T9(EfdL|lA z@{_cz5#?1{+(@5bor6k(|4h3S+2NzVgv_HXCA_H%e$l+obY!4I{`M>NTf+Oz;f`He{c3T|+1q?LQ^vEJ>CEX$(~AU0R5 zwCMOljWJXr6KEw^W=aBFwaezrSn>bJXU{>8uh31b+pHv$t!cWz?}VfJIxKT60#P|$ zDHl{wXA&zTZEe~!3)yx%<6@k9yF(8jQ4Qxli^PIgppiX9!@~K@yR;XyQuU8YuLi=h zRO?MJhdDoddnUt3A(WvG(eQX0_jvxw$UWKzuhG}|nyWk#bAP2va)2$X5hMSk>hUi@PgeXdE$78S8_1q)1=BoO#~XSLT;+`OFnL)NZT4nY$R#XtgrF z1=%IVjKi>vS5rfSbU@0+82b7uuy`xJg4Gaa!mIBFdV+~O-f!8h{ewX#j$n2OmPe;5 zDpmd0M^2vM8JzYyRGG|N^*O_F>B<2}XVX;robiZ8`AHJxj6k7>0sFwDIIsnl2Ve!RnfOpMX^NeDB3Z! z92#pt+@W+(LVN%L4!W^ykfLHZ@o7k!ur6oZXr)U|H}yx`|7G0({lde1a}^m|yP))= z?SJx%retw_wrYx$U;Klnq`7lYGcywe@`r}3wXjt)6B!(_XDBM=+1au|Z}@1(kYl2= zv+4cp);ChD`s!xIR0Vf5HEV6+=Y10>AW+nBF7J4bwi|b)U$Sen=*+TaK&x~C$85~R z9;E;#1iF8TkT35!65iP^m=B?PkSeOUulyBTpu(!vo9KFyxtG8q6sjc z;OdI(J3eIJM3peyr|%(qMoe#oc9J~LEsRRF)MPDMq_7Ow(Uf*kc#NVyisSF+u3L`Y zz%hwT09A7G{jI&IG68}KCPXAocXSRiaSUT$wYq(7ts6XjDlW;KNAI4^%tAd&IC#i( zELl`5g4N{2j~z=ZHArn;m2MJ|L*>Cyf`KC}J)X~Ba#dtB8vc|F#B`krAKK2xe+11c z6@6b0N@6{qE*1flrquqq58+?bl}!v^O`j=iHqs3*QZk8n4GX&*59;%|-(Zky{pbF^ zZZ6rB=l!#u{%su;d{}!(fc<6;rel7j3!b&fERpzq>o)ONhQGK3zs2*z!t?WTTKaLI z_BHy-dJXR?HZ#9=8b+10p>&EDiH2y1et?-=6Xen__f3>Q8Hoehzz87aE^2=sBv-ML zH^;-sfkD{%`O(bR=E)P5NflIPw(O>(G*ag3p+NzVRR$?@jQ;@{Br3sm6)KIK^Z zCQ0B}`#}rkymoWPN$17zDB7c223mXGu`A^rxaLhoFJApoiw2|FjU^B)&=Wu}jWv(E zxF{r$jFIGqsYO|<%+56olG43xKITf8s67JLt;D~hHcN8cHy}zV^Z?25UNtt#oAb}O z`G*9c({nnm%2AfqzP0lp++%Nf3lBxFfY!dKq9l9d@RC2q5A`Mx#9EIESzhSCha$KB zlAj#>ATm1qsoJ30ve5VWuvR7NF12^rDz0kbAOIBFgpUN8SPj1aeB%2q@d0d}8%9L3 zF!E;@suJ4kE^aei?4U<4A#wVJ5(ZQ;vBNZ^pxoJmn1rOJm^jA1Q(9fJxgJHF3JDtC z3Cm!VDFX{}Yq}Oi9A3r|7>UyZ{1<0;2m1{LOmpp(iJZ2pzGi32D@!%DKdUqwX6f;; zoexxReG%+@;*Eqi64tzwY0B)ixD6AK7xJ#I_lsv%hA+#oF&bW{NEka@bBWMuSJuv= zkgvIo@e8c@oOI{c7hXwiHo&F z0mNuN#4Wu&bg_1M$RY&BibN`iETJfme-xs_Hi5kp$kL>lrP?-u9LeSmD1n!)x$s;K zrmgc)Cr8H=T9ezasKITgrv%ZIFe;Sn*;%=cR%%`zBig!=Y)jY*e|2f-LrBm*GiH?# z>X6)ULNrlwpO@zvMF8_(VEdkVl_n zF+!8-dJg9LN}d70QwT2juumH1$St4y{7>l@z#79}3Sj><6=*=)9D=)=A`wW?iViQO zJ6_och4T7%Lc`JUXuhlJD_(oD#DJQnr?nM8?LLNE>`P8;BjBcpC0ej>MXZDrZ~IBi z>_O=6+Kd)YN|;hRECXIpzBN|_jw~rfJh_i%4m&6v`$0kQy4Yj>FKcz_6tE=|2de`G zZP6tue6UZEJjM}HHSR(R=88hl9eX%5HS7i0xy0{Z+_p1#x1>1Tr zBGEFb-T(_0amkHqsEQR~pR3hmwD(bKX3W4WjCK!&NWvFN1!i?-0cEgd+5;BwU+O!b zgyRLd3Zx&rEs|@mD5rc(VfiG#y|b;PdVY4lh(|6Ffk?}JVr$F2v=U9XagL^YX)l^? z54)Tqx;%hRO9pLfE5j_y8i=QD3X8FZk&GD4@N>Jsk_tH^!_YI9HBDu`kzb}9j&_11*qm4wfgqMEFkdlr^Xu(3$OO>(3x;LaC82%i34{swYp8zsvn zoI1jooyo3+>nP#!BZWUsa&kk@H^C3Bg-blO#oNL6`3=<#)%RnTmk*V2?C434o1N=! zjYBooW%{Vd%2povSv9g?gYwziG{|^BmhOXayej9Ub0ddT+u{Qwj%3%i7t{0$@XHr+ zA}SpIW0H`5sph80&2o9>Zf9*QGT{)&u}Hd?b)op+)ngiq;OJ(3Kugi)<g!D>EiT&YQm3!R0E2*GRcyRb0w1>nga29o?(gXlUyCqmCH2*p zoE*geYyJWU^udA#68#SK>2FeTU^aCDXq8?-W;*U^n0HruabA`EDrhc<78MFufd1g6 z#@Kdoj454dMEkd4RgQ*?2~>1Mb=6kDDb9BCnw}`1M+pOr03LtTBDx(eAfK1}bF)r&`f=qlg+@F#S z=0t+Sgcm5G74ufVl+CPY@i}{Ve%G#ZW5&4g09i++`38%T?&!@~8Hs*JMY+&?)E<{& zwOOammuJntFsch$@&BwZO53nsw_$eUx_X5oCHJV8@IK7}%#yI%V8jU3knN2xVA>t& zcSTJViFB+vNNF_1#*_|cZMgKe=t!H)=pWBs>0vq8C2ebOGdQzyXT*U=@I$#mB!rnV&EXgBSi zJTF545m0R&WpN{uXWvru3lL`n*lLhAY8`p^-QY(LVUV@wc8#UvR;W&5Od8PH<&P%< z*&f{zx!sWwG7C+SZVT;T@3`*K{NRWI+6fh%ic!lN*@fs2d{}3lzW&fYcqF zRe3uLwr3b!$CR6-pN)!joDFvbmteia^W)Xlw5{Q5TcA{^;)y4(U+JRdR#zQn|yTK6-t+7M`{}MXZKJxOq4BD9xY&JaQz`$xC*~k-3uX_MLJwA_E0y zbK*_0VRa46lO76W%-70J^eVx1uLgJLM$c-Bh18tM!Z{r^VesYjGR3wu6h*6@q0q)B zl*MC}&b_PLOFN93oM;#z?TS{~Aoya`w6DqzKC4VaR@vdJ_GLZz;pWF$OxL*h@&sK~ zS3Rf4jMFW@-T`k8Vn{9CwqcP!{zNT@Qw5Y~S4qdAhTeJ}V4#8ed6p!4zf7-C)Vcp~ z3#Q$MTUI2rWg=ucQ|e_%N834$ep8iA*N6bR%ePP~!PfY`UQ@Gn!x-7BWS`2zd5t6#6WDR5yo4zssK_!xLn2ILJ zdD8LQHqY4`YAkxSnEjEH5?Dpg_a*RGX&GBekE$Qen6z)`o!yhG`Nnjyo}%i<04)&j zs>$pvtYpK7Imx1gPU2awDe4yrYc44H28WRR=L5i~*?hBoZG}g=4t7s7F^- zC@bPB2OLl_<+V=3RyyLTPb4%WNj#AV9Uf<>949*;Ca1)xgx^g zS~+R_Li-w26oWYs4?MSisWO`cUrx~LsMiz{xPol9D~nyKg8zN(RUOEYin8*4ZE?3H za;@b-aW=v0x@4st9PqhgavrB(o289Pa4Le*g1jUHF<58i%7Lw0Y7Z|J8zs6FGrAlh z@mhBUzYbKLqJDc`K!L3cE#TswK}Rw9OXRmT#5Y)+2e39w;tcpLD!2Y!CiQ*n7(M|EOPOCdj?YXDoUd?iZL;-QwvS|qw@-g8BufWYaDw2}14=61AJ zvFSY|B>YyR)03(%kJK0LOPHDE(kFywltJo-9VreiTi^2j4SKSKpoWyKmiG(58&g{o z71X54!cd{YEoT*Ga7F`*cv}4bT>bl(%QPUgqM_h>4Zh!_KN7AKOX0fpFsNZUEQ_g( zOW7KdxUYzFREg`sOe753Zzo=R|E^ZPjWmCGE?kn(m!6k%gW^7Zkm!~irO?JxD&=TQ zijNX21uG6UGWh+6JKkonXMiaT2p~x=vWqA=C?>Nb%QRNZcyWI{ z8M0(1#kRIyucAII)@oN?LsGm-UH69;TK)QvBZ1UOiTQS3m)JB(?X^tVBIeY|Hhbxs zo#vuBCPg`@7bw)f-P4Tmw1A=H#pfl(BmOKC-fg`~<5K_a*fyRyUa?!cq=H02OgC}) zpLLBqdwV6m@&QfQUES_1wz~k11|5Hgqy}>_o|% zy${-Bi`KW)!OhOLZKW4%*s54*DO^obK@G;lZ>MRhT|*fIR1L||WYJcOOFy$}w4-{B zYiH)Zra&vy(NraZm*7-S6p=+eTf=rd!nmk#4$!Y~|WU=<6gi_s6qSasXI7KNW_mg><47w~C2`6$LjeOU{+K7rYGJ*uE^8Sq zSbOD}faE_l4fg&WuK2p8`plZdPmR86H+x0XD^$L;fG=-nF~~9c2Oaolkb%!7Iemg% zw2C@h6bAEiFd3Oy(AOS&UMT7UkV{_=pD}hc?koHFjwc|-7ZuIo69XR04M6nD;qiPj z9T%_X@imNCLMKn(Jq-Ox{(_u%qVHiN`)WO9dj0dB_q)l2*bRO8<=qg!<>@rj>wP=( znlODNQ~tVN8hf`m%f**$w9q;Pe_?z(nytZU?>`2Fg#+a^QbF#GBH1pATm-C5{+@LBel@m;A=o}pr&W5H|1UGl7& zz3u5Rb8EN-ZONPHal3cqp7+9jw>^@|x<|4p^1TYvtC;eK3PSg54`lnWb4QL*a^%17 z=Vm5TuJjQvvy0C;*+1bJX^Npubpp9o!gPo`CVDq8emUP(IRLv(WP0ZD4=DShzxeI5 z?jrW<{ufaNV*P`o(eQ9;{CYdH@Vt|?_Vizd)Z~`+*Ya@svC+lW^WWUhK^NN?iH|ob z>!>n9^ULe*Xx87y>+V+D-S5@S*6pd9-JJ;C0U?a8$I{m4-(pQ)-_PYv7R{%N*;U-# zO`e`e9n?>#o!!sxPG4VxUH6yI&rxc4mhSrA`rh~3ISo6|z!R6<@8bt9_kW(AYn!9e zS>V+8odSDZv51aaX-=o_j?La%$NKkUljghSo^;cz^sg=E2c5Tbz|U?xDeDi9Z?eN9 zS1}vo;AZM#zs>@GND{IYnu5XES1{6qb82*-3t;Kl9U8jBFsQaumqLMz(?0cxq~yXw zV!bB#6f{H*k>&j6Y);kL{!U`s;qLun7cUGK80f$RFhOsEpv^Fxjc;^~7EJi@ZmRam z#qQ)IT|3KF)gaB4pdAOr$Bi{LKm>Sz(*E1bWO@xh>W&0w%(~DRZO5%$knNnqob9?B zJ|~Zs@yYH_l22FKXZ~mCHUHd>>*H?qbG?CY&*u&H`)eP5@Alm9Aj=Mq`+KO5$Nl|f zwhg||x82BZ&*T0+%dYpM?O4x}(1MZccF!*%5C3yw%Nyoo#b9d84Ah!u`}H-drmpo} z=qrnd0rLB=&+kQr!^q-;ND6!dWqy+Wd4;$7h?ho>8@K>3K+wMlNKDyZIQD`lf2Olf ze8-3C$|%GmGi-TjT+qrt1*Yk5mfx5u}!?~S?PZ;yw4*G2AkIJ_0U3!XY? zLbl9l-X8z^Abj|{bq~=y13KGB7mIa-_|T9+LVqUd3kRGR9J7poPOx8655$I!zHR1d`fx|4^ z1=bxR%8<9@zQ_>dHt-QB&n-N~b>vz(kGj0q8%jf$u>yUAJ*#xcT#+1C-+9xWKPN|v zQR-$-V_QS<0;bogXm_*mNI?14krrHt6y*KiJ@u+vYZxRD_o=JZBrP}xtVzU6>k3?Z z(s{g{{eU3`MO-)_}X`xVeDh#Prv@T;DGveMl!bli*X<*=HA6CPNlj*CU4&A&Q{bai>^qW9p_Fef0QLk6b1eK^@2~ zxXnX;)pq-bsRz#>`GyH&ndamK6gjny^D@=PlE(&Q+{cmGimgun( zbF$7ontCVxGW!8JA%k>~895L7n;F1aw#Z7JnO0L?pd#-GE_6K%pxW_X@knF;`4pI>OM#S4w3j0aS0?Z?8@^~l=z-D+^Th03YQt>ZiZNJtz{j==p*(35(ki;Df~hLNRtex@nRu?0K7Cd^7xo0 z-6ahuHvoH>gZ{|S1%P8V{Lu^tJ$03hMeq}Ogk6|)0=u9U%Th?k{`|^J;fhX-n&4LA zfX)qZ9q1P0%+RgvU=79*gFZRV7MI0R9T~~$6`~{Zo_<0;6S;W9+?fl$&GGBuj^&zR z_@ug?i*@i6!S}p@>a^->f}?V-EkxnG&C7b~vh=%9AW#X%iej4UXX-15727^1(;LtQ zf%qDq;ztVF-g3xseza5}Dxj$1c^!J52OGPK zQ|2q~ny5D$AFCYQ+z3tJ@%sw;+f=W!^htO~x5%zMfBtIV*48!`Kh=SKN91V(~6 zO2cT^TDVgM#GCNN-1*E$#|~Z{>I0yR+4|yX^!}LIk|bbXvr>S6FzbVZdifmnCSBF^ zwoK!#vx~eC$MR7WIdJ+4HO0Gq<4mm?)RsK+H zDivBu)%%y4%clq`%S(p!2)9PYc&;u$oKbj?)2=el5s#02!|u}43wz> zYmBQI!;R|xj38eU_GPIfF+BwqUVQj-d}_N*QJdI;glSJvD_j7=AvnPqX?@r*k&R<@#^>u$ z7bHHF)uHF5#q0Eja|C1~>4H3@(8HMX5xVJIa=6bQor3J(QYdwb^I-D9A>H75EHhFh zKFlyWg08}ryx#s%Y|KCOKbupa15QZ3qh`Gz@Q7Kg=5hV=DEd;_i-Bn#qa67SlCUt@ zywVHOAsi`XM10}oNaduG_YKhSyn@rOeW4sb#&72*4vSpwsoXr=?yYW(ZtnKk+L8G$p;wxdfu;G+{vnn?r5<_qm&$61uR2_z$z|Vn;rYxhn)(^E>(R4m zacUCa$_;VBEX5)X6LfqT$upr6b-+?&Oe`;7Z)`Lc*PB(M)oCbetQh>&zz0b_@A@vL zQiAd-XG7p}ZpjmXSV=bPs8>!>q!Fqm=8HkjshX)^;R@zAB7TkomyjpXbMuQ;!rFO} zm$y7a{fXsu?Z+7G(gJboJEXca;mqG0S91$mx{npDhZ)i(Laj@18^S-gLFAfZK<RptF}q>u-)NTvJKdQ1uMqq3NuIbzVm`n+v_kd2as0jy1a~obONdT@$8fCI0~ z4l=_LoZ14@`SbgVa3PO3nwNkYhuh4lQg~igStW9d(GGy@7vb(4={*t-c#wT#Vd9S< z5qrT+IjF`jp0Ti;x99%z%^ex=pc*JKzoIx4C4?rms6w)G&TxoHK?TO_FetorL(luYq{y^KHvX9l?lqvx z1P9@y^6xxR9@jx=H=#hSxRV4WHatcoGf;iuV(j>F41ha3f6j7NnKPix{?nBHYf-V~;g$aB^0G=M0VIhS5TnLm5SaCQ z@tdLa_DuRsd|YOTd5ag^M~4UMc-qtswG7FL<=j+0MwO7Y4^KPyxk5`U;n+4j-MM5b zyVunh>@>i7(DbmcDgr*M9VvI}Bu~EZ!F8GH16}E9LRg`J;(_X(nv~FmmRPb$ ztjJZCk)0&9G7;BmWQZMEgIvS3_c$kqh%ucHt5@~ZIwjKVgNVqf zR&AmnoT-^3`^i7aA|T;bAxQJ&Q{hz>n z!JQ%@Zr+HtkGt)r0ajbMLpMMuR}J#+60h7-eBHna`C}?fg^vK`{s>e&EuI9$jF(*T z#|&to3{g(n5EX&S%s7Etj*^3v2*N?amCuemp*+lKWj^=lw8w&O(1gk*#q@c#am-Q) zts@zL2eIJL?XE(!0-3Q_!lU6@l7F~Gx1IHo9q)2Dhtc>J&da%DyRf1wGf7W{ z82o@BS(So=`UgA5y2Q@79-cZR2@P}n58 zxcb~q6rkZ*9C?M{A(8aS=}}ITB8+otni8cnL=2d{RU1?ERG9tv!ofV$9|-MG%-B2_gR&BtTHu7{IgQ zw3%^vk+Ph+SwwAQW?zw6zRE?m)67#~YLUXLP$F;T52D$3989x`192ZhP#OuPhyM$U zA?8TKM4I=Gs69&FnFHhC^$wa7B75sL8XN$J_1i-%yCMjX#IQyC(?R~CaFerVnH#$w zlvE!-=C}QM==Y7lO&1X7`B~(om`7p%65-Q(vC0{xFw4M!~ib2C@^*E8W8mO0M~9xl^nL|UzSO!E7I^v9~tj!0$Z zL%FCt_}qa~Uq{1y&}(Z;ae_SQ5~q{R1a>%Or(+(Zb(*Ed_R_*EpJxR3_&WfRBs;i5 z-nV?iO@h|~GFY~qr``%yS5=LGMo$sSeFYM8S!jor4sLa3Njyfk6GLLi<40}d;P6Cp zS2|abquP#>4bAzV>Blo5m2FXnMRDbrvV*j9iK9xGh31lL(K+gKwLFH?VbDziLwyur zMuCs2Ar8vQpdlGdO2&*;IK2f3+YwA$XiGqSa6vP>(F?DcO@$*1>^Ue`5s z3$t5CHaa$Hp&Vmv0CACjlg+l2qEaR-&Y#7id9e^!5I546mqb8xr~$hC;~QxYH)JPb z;YIMeMu7>i?qt{Nd^m!BK*2!+$&cPQ4+<_KU(b&M2htf~ZvZP>>2=h^Eux7#lBKSi znlc=pK)8h%OMP&EuO@WLp2)b_!lP&vPK0dvC2~;!M*?rO>|Oya$TTbwm=?W2L8})f@G*lI0!Z3n0EAxh&46eA9KY6^5=|=HV!V*yvST=&h6B*r@ z87Uw=5+DbB)HSLFEn}tY*AmuFjXt@R6hzV725C+ya*YI&P+Nm-W~J{%U_aijBpGrB z9E+Il%+4HAg`gIPT$^qtUjhHXII!>OvmLSoH4R7I_BR5+4lTz7!QFF?G}gCY18)6X z@vhbZYJf_15a7ezQ#HWRX==EVV0F$6U@nA!-l2mnThPCzy7=w4CW74On*UL0*)cCm zy9Y_lTN0_>VNLu-(zqHLDm@5<8)zTQB=+z~KR~VoP4_me6<@~L zQzjv7VwCO?f0M1%U#eyDR?@`)BOIqW`bVP4WDeCDG;Y*u60I2$3VW+eBB(*5YoD+= z9_XuZ{IgD8!x|DK1e})1IKc^FgOo>)QQwZEbdNZC8gvfF8tBx8LcB~MH7k2|mY$%- zQW}LlNFqF(YNknk7YQjnd>Exj%YkxMPZ~EDxG+U+n%6;9M3WXBL5s;o+uFF&rRELF zrCm6XZOlPz+PuQR?SRA;(~Lw3z(ht~f({(MyQ3;c^RXOS^qc z$tAqRsjHsosf00Sn2o45Llrq2zC&o9lD>dzrZ&$QV2BU{V(m@q69!N|(H29>6oE@V zVMKf{�SL$q)+DmiWwskSt5lE1&4sxK30HEW4Ah;%0uVI{b+>L^8#3R1&Okp(+uK zd3-_+(NoJVe^bFw3;74PJ!f<}98W8}KF1XKJtbCegRq4=rrmVnOKFg- zImwEHb1-@rg4xVA4TPv=LNQ?3R0VcE_)Ds0?8IIO%`q|eUFswp)?+@3i9~-Hj8mg# z0r{hfBUk7UkrTnM(PbK$Ra|W`yEjfu@aH`- zpi|k{FeGK;IomGzwfyTbsud=5uacWGot*SbCBaI?x=V) z9{H0D8)m|o*4Yiz<94T+exZ9K%(!2<#iet-aG!&|h+lhKo=pB8A;EGu1H;X9yjI<6 z?_xP*U!IeA#A6EAxY9G)X@u2rYE#1jko0c9QX{upxnv917&46go}arYaoJPaL`%y% zwv4hZW7R+Yj1>$ru!RpM`t3IJ@|bw1p(LcI5>~AFwNN9eDkm2uLGmlxbdr@NY0i@S zKm`_KfK1$WL>Mr-W%lA8!;SI4s)aK1rfa0SgZB~+F@es#MEv>|AiP2fO~e4(bPJNZ zN+Z7t$qd|f&fa$@L~Yt+L5Ku4P>OotKcpN+}qZ(r->81)@>cD!TgoP!+^lPn+*+gphbG)xo!wu5M9FsHq|7TBq-U&JzAIiqZD3H6s4RPGQSBW>Jql^$C#^j$ zxg&-VCNqAPFnbcuYDoUaDb0m+9cTh&sNLDML=`P~lfgPlEG_9LBiyhWP~Ta)X&8J- zDsDrFGY_C49~G)esSSK2eKk+u+0lP<*sv2_oRNT*F+LlqbX(oTI~VhTfWm2mB)5@u zR*eX>px{XwXz+3(6X-}ke|}2dKb3al*U>VK@Jm=ulcvg1YvDz6R<(>)nMjcXwviUL zTA9KUDsGSN5l$2~1Y7Lb|?a5A!j7zNl)_@7WZqUyh`qBmy%wID!P z+PgFP1MF+FBxvUsa3$rBv{zRnGlY_@&I;$~chNvK;CKbeo+4&A=aP>Qf?tD+JWc?2 zD}a=IrkQ*s%WqX^@@s}sZSYpo4nm;bfegeaCN55pOoNHjT>4yN+-u4WJ9YtB|8xe1 zP**&8fDL=NwJwdAM1Ds=@hK(@Fw2qfk!sPzY|2sRfQt;NLS4hMNVGT9Moj|Nz2Yk zAISrt4q`7!C5TxkYV$a&ZSnL201Qd#@@PAP{v>s$m5Kvu?oO}4o$^f3#cvrV^2Xa* zhbBDWM3{Wg{sgLvQG3;2#)NwcQLYfHT4#FKSDZ~?`go+RY0%_P0V-72-#hutKfFZVk$|BUykr5!c0 zi8;PoymTS+-!mSr+@mDC?s~WQZ|`QeMz?z)Y>?o%q8@astXO z(>J=hSb&&g4MVLxFN?8mtG;b6_s+jhOv7mI1{xfk-1XO+?Q0{luy*#x>VwrA`~07@ zE-_b7cv(-m*Vi}eGyus*@4MrE*MNBv9;~mWwJ#p7m^HCFxHz`~wCAJR2C8q*5zi4sTes$eg#|rhP#5%AMnl+ozo}GB3Uj z*jBks+gQE6?Gsc!-T~0fJvQ(zxf}O`nxmbf|Li;D#JTCcyul@b=yP-islmY;zCHse zH+dt=4_N~Tcr@JmoLh5MWkCU?dC^s`3?fnavh&^D+8gtUjK~kFTc_hj{5G7pp!eAL z3W?YAHDF|D6$=Q3tQexLE?eA95>k&KyJvx$f&)nf9skz2Gr1eNZ6E@@&Lp(roOr0( zDf7CI`q@p)-+A!S#P-VkePX#bvD3qn@N`uw0L>TOWoM7#cK{cpXuUi4&V=1_OMy!I z88Ra7FzZReV-ES_-3Td*bA`Y5)HrOO;q&?Y9LHmD2imPK;_$VB-`NGUftp_Pb$LA6 zU0~u+YoDEX+TH!V`j^k_b6RjF)D=8WET6p@e>8MP_R4&1>lzQ1*mKreRmS&tyCE90 z+m3&u%DvGN_mcb59Cj9mHkuoL#G{)eWE-&7u%XbuJtvEuRRIW>NQM|Kp8JO=FCSGL z=1IHZA}1eSkN*pl{niKiwCpKp%Z%?y6j$*79~&C3KRojvYEPC|4~ zHo6sEZwzxlciJS5EiyxnOzkK50UKaN0=#XMT@-_!0*f?3SjElQqbzULf4W(qUE?5$ zQJ#Y}muvxe)h3bOK?^9;dG2pVVp7+PeyT01jySM!V?ZjHksB}wCK%%7MGW6%iGa~N zzUu;mELzpK0}yf{IWGk5YNhoeG-wOd4Q>gwrT?ytAQBU48h`;t*0P=jev~EAlY>$| zVz3I*F@fQ&!tLxKG2#%=KEMO!0%_Kl$v1Fn$i>NPdfv}buLWg5-9RKMc`yq? zA8t;tR~3kiEytF`ConzprX2%If`T&N>z4m3>j!Io+aRS4Egoa+3X$UUz9UmRmBL<| zo~lLmx;o{AS57`Y^%SZ>wP+K3kCCO~(5IEt)>>T;<^c#v6u3psNO)500%NXAWDY=u zVsO-;k0BunsA4w;V+(j*A4ZmneqFB>4n3AJ1g8!7D^fykpyo~_2Y&zzQ zm8dr|rccl~+#}7(meNToG1W<`pn*K}((-F+sl@dz4^}(MbvQ&4iQ-X?-tN!3V|b++`TYQH0iHaWgPl4?ZI0OMy0`59kos zyxboqi(V@SRQ+fq5Sn5zuYy4Paq!X1-eVV+5@+fkpvx$KKjz?|Y1?_uw>9wR-#{$p zY7wRIXtep4F4HC7f&hF7fH;)6IYH#1iE?zuH394eFZV>KJg~v=?Entdklev9{B2A@ zxBGzXMSsUNO{0m?O!mE}4tcIu2e$e*!MF0MM^{q|r)I~7`$PKDca6U{^3vD4`*Av; z^HaBXIOea^?(Wz4mDUq<7B)7Khb)Gu46^=Hk*B~CNM~Af@bAg*r!6L}=WjjajxDK% z=6(K`iMCbJ3wSQ^uNCpR(PIq%*7tv{*j}Cefg8K{B>{-j1N{GvXz8pi42|q;O)bo5 z7--pOndpq|jGX9Dd?= z0T`I+S(#YqnONyr0REHGvoQb={BOAq7pMQsA|L=TcmKa%_x~jS|0v-{K>*;Y%4-4v zUvvLB9f~%7T|KHzbG+CNKx2T6x{jZsS{>=!dKgUYZ(VO4R~TbN??Oc^iN88lZ14H* z@cgrQ1|?3BqEvAp0W$q`DlO|OGi#3Z;d|RI`I$Foo68)XX!`5dgZ`bJm3?UPaot?x zE9x`5i8XN6D$7v?-`}jcy|`d<{k(>MMyEjX`4#xhp8g)XOWJe$?V|s)8KVEq{@b(q z9qM<@tkQEc_w2FV_{Q#8VoLve)%a>&yKT1rjgh^&#`JnU`~DmIla19lQv0r=A2m!e zgk|m5>pijCSbW+TeLK~L*z(aQx*zgD`1Bqiwm;VjxaqLA;L;|@kg{ufxd~J0uS{bx zZPqM_k#B77-^l?vCjjgngzP817#e-w;Of4273n=RB+37asuvY*47?fBB*z)GZ=cB7y39_2-2Z&2zy1^m!fk2?#P` z-s*>$AjmA#G^1};q2fpNKD9w;0&}#>Fam{id>|*Dq)op;+DK^w98u**Q1)rW4cl=- zgX)FJ;RF^ZellS8;_Aq17|o8*PUF1%OlCO|So*Af@=~d9==t`TR)3woZAl z2Wv;S2Q<0=a&F4}75=CfXL@wtJXuTDM&EV^-qy5mvNN-v+SAwN!Y+bg z!Hi#0v}Nv^#HlBL7NiXG&lD9Tt4>ZfH#avE-gf=@8{EE0SSZ_jOE_N71rje$nNn}# zb{i5s+b3x0ikDe!@6txg0m+(8Ti@xV3RG{C)~xj6vFx&Xw35kHJ4-9}Xr{_We(0C% zEp=YOXrJbH!UrAJKROiV-N{JS)yyHw2Xih*eL6m&^2V?7^r8-)KI29(db-zw`#|JK&3gTLD}NocoT6 zfUlJx!M_rncc9;K1stsy;0@J)&+3{`G<*aTY8_Mhvw4FN)LFGw&K| z&6mA~7%=(A5Ca3Sy0cVR*Z3=2#2?T%0fvv$uhy_%(aw#toXR(!jY}6#^q(2e(cJr= z*0;~e{-JeKk^5p?|37&nvZZn~#;^AUoEWpyebZ-C?ruRps0TFZE=9mM0Kh!Ih5--y zkSVaJ(`QF|Jb1e!(S81#J21bj?My%XU0Jat2BycKqK4JI zsTa9B-7PcH^TcOIUPa#E!&xnIRQfC)DtA6c!+Tm)&zpnfp_`J1ksMMUBMCo*XX36y+Mir^z0X0A`1Yo(1n0$ ziWJC#qdmBS;{L!P@%<&rl46F~{ES^j1oeOO4*ctkSfD`bwYb;WP_X)a5LosUDL{m& zvgE2WA|UnoktGuWH|P{$jbVlfHT*~%dKm$2UKhssaP?U* zqqd$N1FW0N$?%$RmUa3Z(L2vjAWy8|<0*ifbgEzmWG&tD@$*Bzs=%3kw8>Qfwsq#9 z>|f@mpuy`}Q5-q}Elsw@owbHT^L9|FbETJKbWt~a?T~rR_%$pk7lJdDvvWRk3x@P0;7Nw)^#$4%mu%Q2ngK} zl>w$NT_WA^L{JLxpSFb*`klHRwaY%~tst6$1@5|T^ypzs=p)l3aHr(!+fIWnA6O|n z;1;w3QsgLBy+Ix9*&XDjw664ik2NxcTG#7S2my}jB%v?n94DrrIboQn0BDA37|NJR z4&+J-!^+8wC7E`FVwW3JvH6egA{mApR4Z=$rRiqqOEZkagU*C(|7{UD8`-GNkd$QP zYV$=@-bBW2=f6-Y1la0O4PZ3{+i>9IWij`VZ**J3);jc4ynse@Tqt3}K;SZmPv9;v zctuO?H$b})sRey21<+I5SKlM8(U-qG=d(8xK*Ntp`2)-~Ul5Jysx%;rx`3IBNsons z4WAKQeY_!sK868ps*diRMOiR`R_yHIFfgnN;!SgWFvZ5t${Awb*l@<`9N*G1axe(L z2AzpWHIYlFzQSDAR5exZYL?0Jy4Kfd{qO4))k;rWyLpo>0%29PzTfC!0Hk0$dN;=O zv}@qx#u&<}ez@r$hw)=O5^vyXrLMu4dv8!#h+Hc6yhDOfoxzj5j+UP6YO5A-##t}f zIRq5ducDZ0!V?*Im4Ah+Vj_BZjfOLG+~&Q?J@jHos}obc2Ghx#?>72njzKHBZ<`ku z<*)b=>5f4yJ{D(aXbj)tx`Z3X+ms2KKm{-cCkBNwK`nC{M8%sih`rNr5um=}>ccs8I4w#`vD+Du<4EThT1i4sQ*NI#X61;d&W!~!|)qaWxGiN|(Lt?St-qLrz%j(dhIZJFNGv7`IE6YhdL z7259EU~uT*+01@FOR~wW8cw?rv&oyFH9w}_uIQeg?*QH2B7?5|?x1-$z<#LZ7qF#j zAjf535X%m7e3#3BpHxl#iZJZC5&ez(RM>8d#bwan|DM#no$Y$GgYLJUmaq}eC>w6V zYcFs^48MAyuY|QE(j5{3_D1b!8fv&!`sUsfUi;UI73;vAAAUfR;V5wa4HNegLuh&E z-x7@p2&NupGvp^*<(xJ37AV*>JMgx9msqnacgZtGJENa}#{{sCPfEFv`)2ri@PwF* z5ooxx8B93>27bqQ5Axp_Npjq|1Z;W763Kuaaoa5&Twx3T?-cj-+vwGu4uS%JFS}^; z>&xxI1083vZ^}heObE#;&MIjt1n^G4-C9UFY^+P6Ao}qpY`r6PrFAa*V45%cxmtIL zEr=@=Qk1@x(qNDQmnAbzyAoe2D-v1TD5cx03&GnvyKn{!J-uDMp#xnXU;C%F;o_$~ z@?YJWmOS&V=5(dORV8uK<=$bSv?OV(AcqIdFbiP)+9nsMq~-#Ux=K6fg@k6wT0)9w zhdI>r>;0e83&S*fnoj*?+YqT(CIfi17TNhBGpaw)-DQZCSF-LuSGiSMN>ulj-T{LE>Bi{$81Z@nHv!a$g#v>j3^}l-LiY}>BC~L6 zRH_pfxs#s2Re!s#*ZNs{)lCC8FsT-rSzuOc>yS*ASmnnE1@nTrO9UMUpLoWisY4Si zPeNfw{TkN;qgCpen={-`8}lH=lrC%I!=Xo1PL4IyFr&(F>r(L$9{TFk8}hmI?msV8TRorKsrK#KUig zhSz&q@BP!g+<~2K4K4xadH=-BzaC?0i=sjQ`t=P~#9|j7?!gd1?6(HH?D>(eiy@^@ z4S7Z62`gD9Axx|*mQ<8F(>&k}PMtDY{|u)93UPwMw_A>ghg0L78zy$FIXkf?o2pGS zCqYCfy8N1X!r6fai8<)9h&HhPWuPGWlpgJ9$tJ~M6vrYI$7|r;0Wulzm^7P~{e?&c z*a8&VQeopFc=FEK3rl z9Vh4N_jLyDC5)0iSLm&GV#=1C&X{xK$W_|L_~dmuK@5D3Nh2pkki!}C?FG38{%!`O zU%g&Tu~9NyHl@)$xZQjWTE*;#S5iuSg6Q+rtJSSX-R+>8+(*-ni2`RJo|KiL4yRgH zr7EJgkcbSx`e6(hX2?`RBcf2`oK@^SZ6{my0`@$Zu9hy`4#BVcAcXOTcW#utKb)#9 zvu)(iYeS^FA1rDak|g4Gh()W`ZR*Eog-S!;!Ira79uc<-+SV{hFwsyjCY{ks-+TZ5 z;|Vy*fu_O9KGjBJ2Z1-Y2*qZp5tqcaG!f>XFHW%)R1a7HzVv~mG%C;t*2M3?Uy5Iv zpAv=?N{rZik>G^tUfMWz4gY<^^_8uyD;vUm5fyiO{xIbZdVKN)1|%ml4H9t%Q}c`R z(3Y8A8?v(O$&MjC;`LO+2sMUCfAJ59A3gYZ%Db0f0!N!)Ow2?e18_6ns`;KgeOX>L zKz`5g7KayJ+PJ}G|Hd__2PtI#RLT8Q_mCAhNw;+g;3qA${gFKB(1vH%b!I4&OU*yi zFz1CtfvqPaR!{a63X(pzVGGmrs6BD0kew#G_sx>-P4uk33usHbxV@Tml5Q~iXLo3a zAf|~28ARAd*AZ<}3gg{u0w|?V_y*h%s}bt;(QX_e*zi$*_8%<<)u%?{vc@MZ7TbSUT5Ky~K1t6H}#!P`zOxzrD z5z?Fa9G&eDGHN2GjL?7ln}9E(3xsf%y=#qt=RhWV{}j=8|8NsuE`D3l$fmDAbW`Zr zsCcXJa2NodA14g17xfQ5sbQF+eD%_SdGty;oD#@xDAm775Ka-x3K9qj)OJR#eS+UD zV@*|wn2m;Upyz=kxPj?h^-|oRE;*o5CAM-pZlQl0Cz4Ju9i&=@INf0YjfnBC5V%Wq)xL#_6fsllewwUg@ZPdlf3Eg|p$}p8g3Qws)RS_XsM4WWCL0B1J z7hid-K-AD=UZ|H+6ml_JFm7Ztq@qL-ahN#$9UMg8mxb2m821{{6b&o@VaNv-s%O!9 zU4qpx?b9Z9kT)%&`@eRxV#z|85{7Ai;Fh1XAR$yG3$_o;wNn6Anv^rXmzPc_3xX)i zY5HmUy}0_smn60hLPEk7RlFjc6xAw%SG8NLMd}7eZB>K(%u?=;;!RfuG+Q#ad zLB(*+sd5tq$GQ;V!~*F{6UOO`SBW&=oPTtiKe|vAT5o;+{J*_#bXfV}ny;CzEg-#t zJFnRk-GyAsCgm2>fn2}fM3;3kC@|VOSqq9SN_H$eGJB%8giH)8K=6e(c=}KB`ud;P ztSjd^!q9sZu~aHuG1bwfo(83vn+i%AbAKDn$60h1ik52rQT+$D6cQFpV+%9Im8Gk) zR9v#P=qe}1cx&(@Dr+G`-Hsd0LRd4OQhRhlug)kGYtL>B;wsJf~zODc{#1neG{?B;uk22f} zXp>sR0F}uF=IFIo!L5qWA%j2qhsN*`*bks!&kw5l9HehPlsu%o_vtkwLLE*4#WzrK zR_0CFoFF^ufIVHkjmxo=lqiM@0z2MH6%X6MC=CNo`rLC#;J&ccu8=i{X);rdsEo~% z);dxtJD-hlvCDc5lrWmG=vZi{SV)DdYx7Bo`216z1TJGG1L%8gy2S{LC%wL(lcQWu zueYY`COSpWpKXmk>0c|)C0Y|RGk8RDk za+3DO7W-4Fc&Pi&S61sk<33&;H)mYibOL#pvT?3aFLaU1q zmrwyoLz?u>3oXlSi1t$Hi5a-$AP__<#I=0+<|LOUWJ*f|Q5u&fpe7>Y?>AKFAE>h} z3SF7wpLj%7BFYNLw9en;s3&$yOsd)gL}$+OqL*|d1lq3n?kvc^#u3g*OT7si^r!_O z0fnxvEt+&i3Cv(SH!vo;o4YnC&n;Y?QZ*34dFGIlmXzr=H6D_~=o3qFJSDX_WFVd| zyK>D+dN6^`MxxZj5=-;`%`Zf^7i|cXl~I&bAa`}H=a<|m{t6kb&qU0x2%o#U!U(oi zc_?0(d4YbSAf8*UF7f=u*nG$V^}z@5fgi9D*7F(HcV6ldn_u zD7Dy5G%0;X|HpR6WJ`-2LqjI>xWT)zzKt-hmbrSFol^A_dghYBv8)8%u9~}?V@g>! zYgQ8eSnFk*X%eZHSpY?jQMkOGd!+tzb;S#7DE`^I?(x#X(r9Jp{tG?(@CmczTndB& z+C_@EKo}Wb67>=3N=iDWCqdCfF2;Z=%q2c+>bq*Ja{&~V=`?dL6 zQHGCZT_yjrY`%F+GFbu6aM}nB5HF2BDXV(Eb8LQ+t3Py%IDM`-WnQHmZI?<8$&DZ+ zufx2)!h&^;sjMR(rdpEKtrZSH^^5(r8X(AR&@O~a>+rl5%V>RkWaO*cKuxx&qg~q7 zB`q!2)=)xCQ+wB=l@tnh{Da91*6%K(&*CweJE@z z&o68s)*V=)2(8bJCu;z=nn+2Jf&|870x7CGalFhYLgm)!#^f$UC3ZzxS~?R^spoaQ z9DODTj4aWLEl|#I)OoHAwXc`npi_)fI)YcpRDC3jkP|)R@Fh(=Bbe!~6ZN_${p*AQKz{|UA;KEjPzx#($ib|t2O6VXE@P+zN19dIg0$) zV<|c`Q7GXFR>9g!irn-BMf7Vdbd#!ePnoDDq&T?DQ{=IdE6i6v+GP?_Sbf3XVr3)x z?8FK>i98gs_BR(+*IPq{SRL_CEl=!a1RmniUE_D}q(veU$xD9jD-3k`xl@{H$mBm` z&2g@-IL!Z3MPFe(4tV&7Regii_!_Mk#RGP`UB~){4YaoDLB*CW_=Ihs>=k<;d7P?#Wc>+Es+Pd7*<2LGC8<`&yrYaffcki}n z1`6qP`qe0QLmP!==U+LZ86M#bPY6b*grn2&aSTS3inz>juWs05TQh6siL(p;R;fGl zxoNvC;=Nj@=Y9gbTn`SL6DTC$>Ot6&VD&R|Yfq5Bb1eE?jCQtK+&ous_h9OFEW4EKD-}cLP2a`R%7?3&fw^)+`HSPQe@!yq@lrdZu)vA*l znLzZB)#J?*rO24i5Bn_tgXPA|Ka#NEps*cFTC{XLj@|j$IojFG71(Nn+wHEn!^ido z!5R~@4lRPVxyi9!%Q2aHUru*eB7x9Y-ESO^^{hYNqBn=R7UBR&K(@cM7qqKYE5BiL zjWTcfcMwF}-$U9*H()X+&_rwU-}~hlOo+7U||Gl;|yea7GhTTb@=`d%)|i(hO?U}0F8fwEaJ zgKT!sdEUAK2ayi!NAP0?K^cGDD_#Mf8xv~aG~O*I>gmWHK!_U5NBx`?PAXNj+5uNz zNDXqsOQ|QSqO!u^0=Q1^Mld}ToCD86O~?mP;3`UB&Nge{*w>(HAsBs|iuMrDO{Kyl z%3cJ*gk#VpzFWOc8*5#9-c`w2@*d(v64|!hyY*-R9gY%{5i4Sa$ighXvSnXiVo6Y< zGX4rF!tUew%&~DS4dQZ|Gx3#m3N( zQ|pB$2WlVncuofSfXgK!>u55vH?EwAo2v;OO$}+&W5c+eKt-_9FHZB%IWa^u-Yh_- z*H}-!<#VTt$5%C1WT6k`>yJQ7(bWs=3iJkkp(&TxS>$3N2uF>a4)%Oa?US&`p-~Sa z!k4IAK=##VcR}(pL3$9^n^uq^-kmk2t#{aS92}K#dmP%MKeJ_`U75dj{F)bUIyT(&;_^jdu`=gF zZfVolzO0QJvf93aPsS-;1{0q1T);0IHFX8RadWBJ|09|-{xr_!XrV~V^FMI&wV+DC zC9}O#oa%6HW)+@MQl*x*mEM=OvUlJbnDMCyEr#H;5o;F;O&Q5cFEN~Odsh-VjAGyt z%lR15i0;<^G&f@o1kq}`EETMr2xac)Y?=rA&0MEkAa0V;rDi&sP~$HkLKB{Z)P&UH zKk#9yF?6M%CZ~Hhm&IiIxB&iAKHkeEJ&8CE64W6xqOXh}?|wUu-9Ucvo?-ZsWsy6!jNh zm&R%AveM3Tfi_w8Z|?gdxQYewVxb`_$?lTPZwM|&<(=r>vDSVQxk|Ne@m}!I9qP=@ zJ{NyCGj0swMP_7AIq7HcLTA7|N>UT1jH+#x5PL0|u=Znl`dqyPG>Q;i{X1waK656p z3;$J`e+`G%*2dO2NJNKn-1GO1c$IrS6?9yU2z?tM*;sR<1^=C&IF#4LIK@b3%ZYG6$f)i;-;QN!6H8WXP}&Xihi*KxfFtpB-8#_3q~03M_Zt5mjt=j>!fqBY4l zUeLG_a=wo2hUpn9J9@ zI$0F7tNp>7w)VkFwGu*9A8x)Jc48d>tU;-BEvMOfv}wm{HRpW27EWF*y(l4OMB*7P z=4xQ(NE&S-)*DL2K)G0M@Ofo8Tr7J3W7z8_bEmn+U!|?oT9@I8mb^kSP#jXP7+%N+ zS_oV#=*hhLJD~uZrh&5>VP5C^-KrfwW^1e=t!Ip#tjUTi((YI|V69MVCtQI>vnQ|@ zbsQX+qE4{cNBD@{EaM{y8=PpDdonJOx&k@t{Z8#)UoA#y`v*kC@GJNLeLe)pqSI4u2TKV3*F`X47@hK~Kk)IbJr7 zfiZNJ-_Qz*lVnmCAYE2lkBotlo2tt&9pVZNK__be#%kB2rt?g~u|)Jo2I8mf0Vrt? z=JHS3rKNmjL(U|TR1-AX}vma)F0ZxarS0Z_Cjytt8% zmv2OcW}-C8O+{AB=fgz7rcj8-o0GFI`>I3W&7!}AsVo=th$NJ(#s`dvCMG6lbjC>L zag=(32_Xl%aslrCAVTdNZO{N2SflU?ojEUFf}cj~pUM)6pqObM0*q)6Q3m>jGbtRY0|UW^PjUzLOh8mr71*$NC) z#6xxqV8#|8gD(*f1Jyzt(bWVbO!<6B1&0=Hu zUji7zhM=NfbOG@!qlU3G4(dvvY#E7tuZi`%`pa){Pv!k#w4ui#=%_l3bT8^eyxO#G z*94prYdf6tdk+Vk55!Iq4h)qhx#foi(`^YzEZfAUlD6pnDLRe&4N|qV+-?bq-0mq3 z8T;+&$4tH44c%p~nL&XiyRxAJS+)mb>pv?7gA7-KfERHn_RiaiHJ9RI;GaK*WSm!~ zI5H(#0z+6H&tY^UEJ+XN58@&e3cK2Au<&kSN4$j+7YpDg$9v#y5mBE9R7J7#r_6WK zn>Wsh8CY}-F>ZXB7-zOIPI4!-dT1ly4|)ICBPu&%>RahsiK*4xXAxmeL{C7KGi(O+ zX?R7Rlw?m;q$@-$aL5v-TuuO zEOnWS)1={p#z)~n^EGF_wbJXeC2?p$$dZfKulg(KKTi&avOe-uQ{IA`mt#V1iWoZp zL{&Aq_Z#&SIYmmkz3N8+!xK3r%DV09M+3u?6Gh3JDYmMfByF!rPp?MDrcFNLwcJLi zyz1TRS8K-`3acjx;|pTX*b*lNsR@*ad?uLALzFNDU9^d}t3oB+DXu>DlB%2>ZRXiebre6Pnlc2BMFc6J`OZ?Wla~vKy(Ka?k@rc8;fsqUu8eP#OJ&-WTSG)uNsE=S zgsE;wW4?f_=JCn|J0CZ9UeHR&v}T`wR2=uHoK&569Ip16aXIzq3uF5qhZt*%k9X*o zbSzsav5`*dsVP?9vb9TN=45)o(!s?LIlZe2k?gv&BeG8oL){*!a(4wDyJM(_?9O6< zxQB4qK1BK`xlLH^2OK_TA|W!VAZlYK#YJ6U&Bh<}9cQ}kh*GSAbZKQOk>L^}SZd2wFidWbRZpK( zRckYCy1CictJYqTwcHa|1x>u6ODeR)|1C~UQP2b{UPe-_TblO0mgX*xI%1XR>PlD? z4cW8{MLLtU(iN5D^aN=h64RwEWoqUG9`!r<-BV;J5ikM&ijC(;p!QM(E}R~x{Lu}R zp}2yGAIaS_gcN30!C1s9=Sr88jPbaK24pj!x$J&?t{_ItaWuTL=55cXNn>%CjZY0M z*tt0BJ#-$a{FvL2n9T1XDM^?Zr`|$7lV)tecDV<^jV@5eoY$7t2tkVRAK0=XhQW@L zFsF;=sHNHUb3mIfKpHKpkXOc{BYPaKy|gVc3{P1c`?>f4`Maa$c&S-YMd%087W z*-1V=4|xr3ZkYpG!gMV%Cxak4(mdg zVKFRO_Z0NP$Ix+^28^MCH7gw<{Lr*=093W_e$jjm1yL+aj#;bbj>iq_gqx2qoirOB z1H%Rf23iHh(5_`br;!nTT7(1oom`NmmZL~TcLsHgm#0u9VrYJ27&qKIS^pep+6*k_ zLB;tEoH($_{QCtEABum{8>BPS$3%!IQ6sv^X^p`~7;M?#(xEnKuI2UE7MfuIW~vf@|zMU=r*=q_F5M_xAN!ved27IB{C_85(<*w?3;V%bus?W)QT zNCRKw<>a7S2%(e$ah^jyr;37EqtTyX=Uu4z0h;8hk@X{H^!6N>3urB8C*DzCj#&d< ztry>nuBPf{r#>KR$0t3EEZxpRaInzr5kqv8I8o*`h}i#Hknl*r1zL|9sf&}8HAE6i zMY&&PX>A`uQZe(kuS5`iQDxwXYwKx%<&fkmv@0wp+4D`ML=T0F<&#M(ez>uWI?pil z(I!N(flH%+!n=#+VJzdY0@SHM>A1%LLisrW1`GW&ol7Bo)i5ysmU`L=&Op}#mCI92 zgy|=i683DWvW<`S;bl0tmT>=NGGe@>OF(uFn7nb;m4^fLfzIf}beZ-~p2NHqbGMVOB& zFBQb=JfN9`B-Ywt*rJ`6x+ z7{_ZwQpRAQz<7)(j6MON&N%7dn*(jAzYon{xjr`63qrZlIJOp3*5S}rsVRXNaiYAhy=bLcFR>8oAQYH|MFbj!32&bb_G)VlJO52#h3Z4M*v`cq>KPV}P z3`aJFF$)<0)ru^nJ|=pP4oDE;M7Sc|DKJj#csOHXII5SQoQ@w;@WGNsPa^Q2hWl;o zb|!-c*T3v^^!@Memgd8WeIXxQ0`@dy{fb8||5q1vmYZ{!t|Td~3`9|C#c$q@lOlAE zk?5Y!b>;af+)8f3whlY8;-&b=Uz_1S2oPMaHyWW~y$ji{-LhVroJ%hiP?-PQKL+fX z&m~xeP;ej`oNl!89fXvs*ee#2`qSK72|z zjp~Uw)dUeRBOMYPBhw!6aY&G9_76R$&)pjUMcxcYXWD!L879hDI=yyweF;K7+D5(% zp^aKztYR2AA3>5iA!}(|e%-VSA)p?KN)j2QY1hng=CM#@Pe+#yBPWL|2td4p1S=qN zUKaI15$`t@gjw5}o}C{L{p3ROo7fFVAs3MYubL<4Ju_B=xE3&NRRAqlBU9O%n?>Ao zmz^_LQp$s$UZP_fm{?%9%UInu@*1lBNp^&Ly*wH#wm)KB1kEsonnSJ<(UfCzy3}$E zCv4f!<@D)ty_xD3;@F$;no5!p7cJ&r00cpRoaw3rr3JUj62k{40eiChmxH z=YYxTL>XkBFGma8Cd4eH?z(3BY;u(%KbwioKbzrKvZeeyL>4F|; z1b~gD;H0d`gZi&;hQ4$HUft%;oU~FQrg))=A+2iv$r^VUVC_}77K;Y3Oe%!ww5E(s zzayXm8F}{9a19O8>-z`If7nklt~3!l4>41lMdGFsmq+iXq_t_xrqxeeBga7_tR z`zk+{;-SB1cwNN8cVJZ|eRQ1XO<{Mq>wrLz+~SnmPu;B!Ql<#&5<5Y`>j=4gWT%Ee z&PL2j3&aQq73KRVE$eVR%5O%&^fQ9&1$rOCc_ijeFx={2SgeZdP&)4Q?sXx6R?_Dq zWs2E})&mvyKH!qo68c~*0EW{cO7*0Xk`%wPF$k9>Np_^jUG#x5G=ozncr(r!2yJ-8 zRO=g+M@RCODG~vDWki7_M8ARf%48jOrxV*~!315$uq8DN-NZ>w3&^mAOp}jGNT?;^LBg$O3=xU{u5DNF5F5(Tz?Nt0 zj;yQLKwL6ryFaB&MUO5mY^sV*huWH|e-kq{YCWNvE|se;?J~5sl>L^j=-}j95Nf8# zXb6h3xYycyhQ3zcO=zN~2d{MJ;eQZF)R1Z0h!AQ`lkN7CL9O57+ESiXG7n!)q8_gS z!87~{@nbd8>N*F1V4C-V-W=yJU&aSJZVEgQs35@>@mtvCF^d0fWCNSThhFneH@)D-@wO)X&v{rZBt%5kKBIKzXeKdG6D(@aET9}s+R zLN{0vj{5HMMNxw%^;q1*ZCo*}#`KesCg5$9xp=cj%xP+CBL!y>1bp0P{1{^BMYJDEPAas$ zIf5aG&-67=^wH5;Hro;ssWdD29Rx?olOl^&@NF@LN8LCLhN<(Sn#(Q)w`daDF_gfn zomNb64x^&|xozM=5zUC@7(?Qm8`$VaP~KvAv-JfkERo?8(iHsK8lYF}6*o7yeY~9P z9xs}!+`0~fopAU?@PrjL%X#fPKOR6XEZB&}EM{KkDuNOTR21-t3QxO!i#FfNSdiVX z!!3O-2X^6nn$CRmK*AhCG&DY~ZE5(j&Qqw70di1fym~I-Pxe>^{ff?fobT6|p@?yY z#<*Mw?Wbi=BxzO_We!W*cHx2S6HHvK3S1u0ZI-!0ICkD@Xl%3fe%jjoieR3A!K(3$ z%SkTz#QOPVubT*WbF}266VR`!=H>yb=aC}pThXUWQv2)kX^^rEsTgNh1-)cror$tf z<2rb{t1#vyR&KhRb)?QuB2u8~6qK#n?GtELIO!kMIyQ5{Y5+7=eZ40#$J|DW~qM663}N z{L{t*5ts_>rblo7XzeNZ*7)+*gop*uJ!Vn*D8O>((f|JQJ045OY_OZF=w*-*@Zx&& zD}w<1GZAmWFvwLl9%hTNfnZxkG}0t0Vso(eN6e0Z;=TRM>{~c%*|T$F98+}h*AR$k z@L?|gdJMNkrN$klaqg1~`qC8VuB@nM5laB`PShksP7rT5ue^`WFred2DwbS3w0hZ&SiVDvjXaI3ywwgck91$m- z^dUD?;yFRGa0OcrjDeU<$vHc>C0@9Rmn0P|>RFcT9JS21%2${~_~qf1R^H zlL4MyacmyA^b4NT=`fU+GvtT_&q#lb)wLq40ZOxL)nVj(v%!E^YeB?KdIodfp2INI zXy;>?*pXobjI=64tW4t7LtcG*)Tl;)tPF8w^yb~As~byB@e|80$e0P#!vWbBs|REd zU%>0x2X(ai=pGK02?*%ZJRVGPINSi$?AMGF6AGCOaYNvI8G`L4CEO#bR%tP8Y1xXq zV$5DiB!synkPEo5Ms1Kb&d7S@qA;nSpW^jfnP$NTQGF7n_WZ>j>N+VH*QH{{l<bv7Hgx!{Dr<2sPb*k*kEB~%y%xG!nlyx%=2vy>nvc>)aQ-7pDQ zfBV(6acL#nZZ@>7!&at9q#-MJlttTu2YTve2X2{En$<>xjgTzHAJimOM!!$iV5!@7 zlHJQNQQUzO=<(pgpZVdiaHx>FXUoU}S5gn{A0YEN2w~h9Q8~s)gU|=Rg2T5pB;2u* z`$LObm;*2BGfOhyBm_o7+Wmjh~+ZI3!Ie+%t9MwxM#$rn-?BWMc)ItZ^(^xvoMjcshjXQWt_ixL0DpP zb4f4qA1#FJueuHNz%H;^Mify>o153dnm4rGst+5922xc};CWEC)=&N}piY$B$T`~B zA$Wzh*yuR{Jh&ar2$WTYA2;k#lZ}&6j{i3}^@i9yFhz$dV zk5L{(9P=14GpUOLWK<B&7u%9{l?c zlmB@dgqz$=!iR}3DKt7<9MzT%>kH@sQ}ileN&+mX&yo}5sgeurWLnmiLbfrq1OuzR zC4@;j;}Aq(-pOk>y~O0B*2qOcP#X-7L|v=f`pI7gz9Z!?lpTT z+j)I{Q9xcpXb1pr2tW-9;dm7*z(u0EBL**~gc(LjSY9?sf>g1Of8@u^31xsjaMx~2 z{So9b$(QXxhmlVOYfvnWfC5gT(u#O{$ecp_7S6v+MSljQhoa{!7CJQno`_iI1)umH=yGHsg2?Szrzfp0 zOKmU~BWKMd$Ia7ogiJ~e?}^wk)!K&=v!kGt51>V0?KKa#Fp+5PQ${AJmzl@^8}XJy zIM^PjfZyiy&$f11|2B`vM--S>-lsm-tZF(aRAtOHfPRcbpz2R7!2%w^f+1^WsKvW=Bi&W3cdo~BuIgf4j$ko z8Hm>PZPFz~sBA1DycX5#Gi4{HqwqF#EO=y~fI_}PCN-vuo1l$02Gm{?SDXdfbn=%6@gU1cgMj+yPk!_E%dLht+FY#X4xz(m^S~G*Bcp7I&{4~;ueNjxD!C#&QM4~p zREXKtXIjFbpxK!{h-RExnx;qW;T8>Di(E@rT8Ld64yn6bhT)orEFR`_?Jr|*mDt_Q zKd0sM=^;XUNKSj>nti2TOx(x}LaH;oS1{W1U-s)_ zE0(J~ih2;;5+@^QLLJ?9H=PhmCT2Lyv2<4LKg+%lQSoHMJV}B+Vi_=2yEdhu$?N#r z2??}s=Abv8HrUn=Tsx4d0cjn_i>0ju0-i}^g$!o0Nna=gQaRWfl2%KmVD6o>`0Tdh zULMzwQEKeqWfOBxsuf@Vst->-njqKC@^C^5%KU_iBM0CaZY z#xSui(#_R(D0YgZu$vD*Zjoa zr~%+4yo5#yQMGYAw7rJYC?9i4DYwonrxRjY5j4UCe)$5Dr`=ds_%D#n8ude*(oB^d z8-=ab-OfdV7DOQ#eoT2;`4SR8${s0h{1Lfsx~6Bi9=oD%hbPqG`Zfn=Wrlptv{Okz z6|dD8cqdw_(KMKu4Sl8?b(g!9-4xj&W0X0ESN@o=f!D^|XJO)(=X-vNRiHZ+bKHLCY2q#ZH-7L_CV9~P=7^^_i|o7{E9(OCk7MVv^q`Kz)}oS}XjaHQQ& z$ZrZ<_}E9(SZ2)r31hwo#-KqVi@(yaKfqE^{yHN%j8)yPIrE$A+tn9%hk1ba3viBn zG{6>q63?dJII&f7RKD#(fd9{DA8wv@EJ?#0^ zJ-2z7?Cmr*Z2`B~Zf~&1>!46Li1PU|@-CM-l@AH6I*} zu=$u+3u#EUS=#9_@%OFEB~07-AYz9h%JKQ}4T{I@DeSxHkOA|u@5Y@k3f7T=e1^SI zZUp$7yxTS!M0;2TJp$WBTTo#6u^bHOtpN;_g)3+h_*^6@w|Af0ocZ;b7u@%-jx&!q zi$Ql)uafeY_*p_D>|BbvNIns!=S(+3g8J^AI60^DCTC{B6Q;#(^iLVhiSO6ktmsPt zMaE*(mM76CuceuHY0z}|w`jI*7M$74fgz8K27GKfrM?L|`fG7&oeH?wo)}0JYURy8 zvpZ^6w%hOB-S90yjha?N|D5`X`Pl`OGQNLv)%yt83bAwgrYCN7TojPB_Be$a%)cT9 zOxRCAEwPnuQ`l}UG%1oxxKZU}v&gIFA)45PDs%`o3k8BV0FJ=H0vYlWIkYA1rDl;y znd`Y78nc{Ag-8raosV8QWDDnSxnv91%1_14pUl#RO~yBCf$|ep7p?RAOr}i#WNwja zf%Vr!2Ucuuz=Yf7RYGYP(nc1=u{6V`gV|UqIC(lg^eDoYv61ir$-q?$rJG+x%U%j2?7k< z-)aT6w!4iz>F0QucoqRuI@a`?ICd}-Y9_2sbN$y-5G7rdkOIlZhrC}ucspI&t8_H} zZ7XnPDz84I&fjDn(5?FuHfNtVb@>=rpT@i4efrk-y}|V#8ptQ-^2#;&>x?d7Op4=8 zlJKd?^4cF<^LEB>Dv!xq(>l}6)hU#o=)83KPK`y)IHf<)su{jt>oU6ti4u1F53>F- zNEn_C8brsoZQHhOd*&Y7wr$(CZQHhO^E_|ucXm&mt-7j`->KAzV0zw$MGbcn?MpEL5 zYH1O7OKMmutzLpuGanEpC6~KPJ#yn&JQby3!02f*D?B?@fYoakt+tRQZT#(V6DTFu zY!EyLTADBtA|jUt)Y^}plXJt!4Jb28nlf&WQaNY-8TFgS6+XQ9HmbpLiXnM6K#GTm zW$zDrb+rh9iZeX1OlNAQ_H$g}jWQahsSc$2{ zH3E>`-yv{A)8OlkLZSCM&6d14=F2FZPJJ^c22~yV zi)kLXJ=I69i@~3kfMrHP=E?%nHO^~&T)L5=RHYI;1?!^Fk*_|#Rg;QVFR3(5Fw<&p zawB6=KoV%tfHhYm!6apHr?t7F0@RHs9%9!KraYnJ6s%ee{AnghV}%E3)oS zmP(gtBz<2TNF=;BY9t)eg&(=r6w@m|9VE_SUDUkD z10a9|3D|f+z()?IqdAmdYIV2- z%L#?qlv8?LRIADR3*y9D7>Ve{GAUISgrrkq5vqyXq4=77rPYzfo#L+$A10LUqh_F- zTM}YSQ7)JXdh=N8-PUXV-eyty8rI`R`6&7tkaH`R70_A&odoF2`AlItncY%!oU_zH z2&msVP!gM{idh(}f~bAke4G&yT!7DCAtEWhb8-!isc@F}Tm-J?w&ioJdXMog_(YW2 zx)oVXqpZX&PW?rygOo5hV)Y4Ps`?aBO=9RM>*89;bER^vEr0<3X6238s}qO%vSmG! z`@nsyj(3Hct;J>VttW210?%b~KL0$!$EeC_Zb&=5SQOlLF4y7O0 z0yEC~753Tm&Y)5AC`ES^u&#n7>i8jO*2EZV&k__JT`=nyx&5uaE<1{E$pLXZDj1$( z+5m>{DPJ<(-QgBW)66uS5OhO7b~;u!(yYvWLTF4lDsO(JT5&D-gj6=B& zaBO<@%2ogjO(|C5C*Pz8*FQj62M|;e&P5ITx=D`fXhAvF*3rs78tzow8RV>jM#M;i z{MP7#0B0Sq4s|=0H!HhK3M2f(1eR%2C83nRn*;irx~n`ON0;v=p^kRFYMOzs#BdXR z>m5aG(sylb?SZ|=Ps@q#k+H|m$<{<77|jbA2b8w{5lEie#y( z5UGmqVTaxJAbEv{+&!zIPcpq|`GIm^us$C|4cV8X@~81#1J`12!+A`-LBa|t%cJsh z7~V(4xG!fGk_8Th;}QdZ)PAyKw^~NnmoG3Pi1&S=jFIk5euq~B@B16nTMB_uc=0mb zb&c2W)U_jK{PQ_gJ;OgY*SNQ< zn9wFCdk`lt4Q{U89j=WkT+T3Z@i6chF6#-{xg>*8sZpWK`50hE58<`2B9NG0T$x6N ztdjE);JTBKya^E1%9g4K6o$sDvQSZEy3a!<6iyJ8mM`1&RffN&r-S;whGu6E4^5t{ zn8<;Bm~omFL^@vbgQ*-kLDO&1?8a)6(=$zCL=Nix%Fo+*xlv`1((_`ogL>F3+lTLt z9I$^er3tE##U{6j#q*S6_77xZx3FL{%56KzH+Ec_+qb|P?>>(XV-pfcjVsMiBDJRs z5c}nK1qf7DsliFc6u|`;u)9}gRc{PjhdskI4GLlmD#IZKEl?h!p>?kn))>zdv5>+5 zjo-x^B2{BJ$Hh*?dlMTTIAJ9;@dfwW-y)3_f?msQ&=f9HAtEq|IGXi zvd;2k#RWztfx%U1YvvSZ2c2*S0aF4BO1ffEZfUyITJ7IMxgTbl(u=rJBjn?j*KSz{ACl?XxtcIwj+ZChcd^Z( z-kTuibTH=Dx0m5{sX&ErWFSkE=EOzLn>f+Rhs_+-yHj1KI5Pz#?=6WipClp2Xn75W z`wWUWbpYbyjNWIF5y5Bc=L9qn#$jz-`#hwPDXN=+{3|#N<+-Sj_b;3y#^B;-O`zLE z83&PCJh;F!aAf|Vm$i8Kw%Zf^)vl~gO_luBrc0rwrjFOEtxi$LKkkEn+yno(3;KQ& z{N+yiPDAC-lx=~^G%Dj$Un`HmM>gpc+jMCUc3UNk@O*&GI#{u`2h%~p#4b?mPpuUb zn!4$t^>c^a$~h(sRi%VIapRN1hJiF8nxlA~h*9A~mO5P1;G|g?1gb0}`!hNj)v2Bi z@HR(kAHA*dTlvzL<=}6t^*8-{%DwYjOO>wwQwc$AQCBkr_gVkz8`^8qucPa9 zj9Q;gjVh@=deH*pg4>*q4b2%$x~`l1(?8uH+z$YUd1_sA5Z^gy;O2M=JurPe8NX|7 znsq>M9@^D`n21S>)S*Px-KY&T48&s~ggmnEp zp=pK)c5*w{?ZyHr>TNp9_1u}MJ|9k<+8XD@49OQ<-QYeWBabm%8kC&fzwCWG?U`TH|%T-$)E(?Gu(uPd;b? z{Z+4q#sqz@O4#%LEzzl>sjIH7LCaNJZH1l_3flh|S{~ zGJ=>jm%`7bituq(@hVC^D}g9-`nt6sqW+D;o!1W;Z%5?__aN9@A|;fm&bC6_Sog9{cY&# z)2U!^|==>g2Ie#eS59+n=5Hf94jDitK)KKxh#NpyDQ3u8Xe?Au3DAH=6;Cy&L?~ulqq-MFTJZVE*m~mZ3(G z_${9#qOH;Qpw)8m$6rM9mYhk=#4$}HzB;x=Q-IQJZzEma=HjwtyVNEZcbRV1<>#ri zTZz3=Ww8vdB>4NODeC)1`gGdQYSE>3KVLf8=v>-i**svEOH$i?2Lv}g{mK!HkNgO-v5K;OFfT;~rK32_~ zt4Q)|YTAqEmv#9>ULnE%O|}Qg^(+60)3DsT_;vFr=^lLRtE!qxaq0c5spcK`!@vE1 z%FgVMxNRfCm2a?ATo>N1hi~JrW@G*5uCqy}gMA2H+DfY%Hpk;VV)sF6gyvnvosNgx z&X(($$}XuzE;r?x#u{s=;u6NYO~yBaMs>fNMNBR7mMOGb(|Y0ElKm|CiAx||(}~Zn z8BW-h?IxCnWAwf`(@*Ynu4po6{#ec8lsoMkF4N@+@d?rDHaImu!v_JgQXvT!LRP~n zSn5qFoy9OlRXFLMn|k6WY{M_>?a$5rhyUTXud(p%Z%r-r;n%O@(ctfgy!{Uyy*$Lx zq-D?&pzrHo{Dv*Gs1-kaY4UH12T9)juQlU@<{X9?IxktSf61sK7?MJRMXpm*_j_gH z_SMw2Gs>98R2N>n@;GP}&QhreAHF7|UWcwmodG=hG@+AJq+y!)Cz8If$eTD0Qd-4m zg6a{59!XJd!cO|Ns-~=8R>MM!yVMhiv}xKU>yQU5$ciU4wgZX4ffk*lOn^wJR@HlZ z$6t}pwWKoxRkslFKK(+{`RA=>C_vnkz$Mx6z-+cJSHjb3t6P^*a__4)mdIEB+^mU3N9i&}y@qTiyOLkL+K~9(ZDGgKgPR839fya(O%73I>;r zl_jsjWgk;XFEJ6%2NZ1xk~$tmgJ1+c#C~2lfLLOB9&e(a8E6}}hk7(UFOUWExM>i> zTmj8Ci`m9>>*tSU)n?$IzOL$)UKv(%mn!}*_uXHU=OtW~t$VR)~g6MUq02lna$6r$z zI(OE_A-Ip~SwYpqju3UYUA3TG9b*ep3TNM!R&L0;`D<|Y7gGpud2g9CP zT9iB@#gb`x%kgZHrCGYHllS8r)}Xn%rm1 zMui?|b{& zE37tux>~1Se<}arprN0?|GRcJ{Ek3vDu3Ahx?6tSjw3bnUN&=EJ#VnrLzh|{UrwQb zSF&_8;+S8^#=pIG5#sv(ZrUP!?|R?<7ALh%>`o>fEm|63zW6u%(x~8n^?RrE{Q#Qx zEuTRDddJ<>{jZo7+&vNitIfZHX3)RCh=?VCN-oaOGhp!Q*q?8+HeLr;`^#)BhBh3n zq0MZ;$9b zz4w^@ey{LDQpRO=MmF=>e;3w-GoJYkZtB$3*4F0#{7RHOH2(IE?##y0ZQz25gcUlA z4DACPbf!igslbz!Js7#3=VqZNI=y5g>0qP&&LH;md_SE*KVDN*$lMT9o}x4o-IbfT z9q4>;+F)3-0h!T(ymnvcy>US2Bcb_8Ry{BnqQ<_v|1o|?`fYS(R#{tfAQiNs&^o3$E&{!aO#SrpWbccIG+4q)xtCm=xwPMUV1|WFJPP1!biefU8=Dwp@-GRF? z-7Z^d*7}<~eDE0SZRYX!M;YZi&RHl{F$VN<9i*`D`G;$z7B+6?ImPNvyuDDFuHbld z@1li0TEI}C#yJ-s26f8Lbb-9$2I3)^_vM#~fVY*ub7Hq1>uXFbqll}bj3Y_1=Aptq z2P90yQAm~9BL$89O!22McvM?sVV(S{$<)bMCkUf>x=7&Za0agbp}Wg$Q+0m61Sy&u z&oX8L{(f$&2;o^HU)2OUnWXc@Kpz=wxku zf}F2~CM1l<2P#*UOH~RNVhEY43XbA&y`o@2-}jRZzDK;v)PsDTXNRgwU~w?8(8o$U zOT2^$mkF+U?5k#OW69I4nZUwy2|i5_2EV))D^k>y;7jDJVtV>} zg#5Xj;+@%7+^+c5-JP6O@;t&{N21gqS3MuPs3zpnEPDIQbHt(uvZgSSg0!XPIr)B! ze7CzeHure3l+yW|R?Fk!`}HjlI5^J?l!qCYMlkOfKY&GJG_~4u;qm_tqG=pzA7B?= zf)`}|SnXD*t!#PkK4_f1oSqkd##jDTKHv0 z?ThRNdUS&owKKv3wO^ZVD`!g9}U?+wBC zaFSc8*akgO(}cGs!KUHy^T9s!y}ic;{Rt#VOPg)@l}9Y+8yN?v@qhR@e%AzmZQ1s5 z;FX@x?y38SUf>mfX5uY4>AB{;%&oiNZk!=n$RPQhc&m4`t+E>YO$D7Aa z0rXDA0#51yqlSP!k}hgL^Ig5!D|%OLJ`rdsGS_qdwJ7w*n>PkSz7Kxe@^M{u=xTU% zvYz`Zf@slpE!FdL@Lslb{V34zvSi#o@;1w`Nu1u3zOLq4! zNvQGFQGXnJ{4hsCVN{(hp}aiv=Kylw4Dtb=;GYdU`Cg0|+FZ45QXBjdgz>>Ell@># zjEUP!4#hp(QT$_g3|D8ycWn;|WzybiN3ByV zi@K^_nSJlEKX>h#x$o}K<*tpGoowz_Hs=h1HnTAqnf7pZzP~JgB_nLgsA_O&_Hxfo zws7ln(AnCu>aAUCy%J9rCNm^|#DsytMskbZ8#XMcP|CuoG5gy;m$j**j1*dpnLbe5 z@eRw_ltM6(do3ymKiR_h{^D z>v?&#d3rxD{slUd<2a%bW+S!H(4cVLnT9rSSFqqrZ3FUv-eRQfeg>Ly1vJ+~X{Zc1 z7;G?=!B;220up1_{_*vd*G5`M6jKL%m9an_hsb79 z`-ngE6qaM0kctyO-Px>K06{>$zkAKXs3|rig3p%&NqW9YohK*e!yh#~X6E0ZoevOf z6;67@{P)1J^U9xP--@YNjgEz9Q-Wy^_j0rd{{CeGNq}6Xr6TpVGfnLJ zV=s|i5Gs-44#W!tAPd7}I-?PyCG`++T$QxtTc7=lT{fR^s*jwqb-e5R?KMoV`HpYDg@m}zlccS29ub{oX;H;FbA>#P9@g$op{L1GSr`j0&(a;Cledb(lu~4F6cD2IE31HFP9?wuK`b$w`V7Z~yvb(Z}_hXMZ7VHvw49 zNM>MbEoN!Eob<1(mPHYTI&}zrMs=_NKaQbzmO||9h1xhjj-NAx%{Np@(?ud|SWf9s zfJ_ZFyPQmnlpH)8)fL-uJ^=qcT?m{!p192TN%Jaxs%g#gY^Jn4nx+trZ*O{px}1q- z6E% zU5Z9TEAW9x3$z|vtN0m!699*YzZ}&9h8y-TjrLo9=(nLgFZAQzJs;@Rk^>*&5%T>GmOWN0 zoj5>JWEEMdm;fiHUu!nV_Q3^i7@u}HZ!{N{!}Ox7cq^;YriAbgCyUywp|LJ5+durH zs>^sZ)QJF9sf^fCmA|UbUPZ`m(arwkV3-Hjd+63@p=(pPRhdQ|4C$3|k*bVMSJ}z~ zv5HVDMOgM2%XS%7y>oR-0aFwQK}1%lt`T&a8Qf;Q{LcWN`tkk;NJfWD6NhDfg z&mFPh#&nDspoyrBGnISrcKG0)Mo2sc6NrtFDJ(uQp3o5NAc{9Y!O0qkFe#fq;+#Rp zGbgqx6LKq~D$+kNA_FjkQbF%U3zj_gIXN|*649KoyNu1qASt|0y^XQ{SIt%TO{c($ z#R*SFi*x0hu1)5rVf?c{3(wO3!4mM|Xg;0BqLp2pyDFmO85 zPCCP_rG^&y`<>4JRSxhbC$rl8l{>qpfmZn>eJCByJ4ObBl++|b9@D4sG`ccw8uO%3 z(h4UV$L7MR-Gc)$?^-x6Vb<|@OGO|NrY%g}Oi4!Y6DO4m2)0KsQcyBJ7Sg90MMd)FhDF)`J%$abxQ=Wk>gZM>YD7Rl-UCb1|O z?@~8{YxqYwGk-f#GB0Zm8X7ZUq5Cc=q(h9L(@d|6a_Ee2cA{>))UqEB7_Y%RbFM9B z$otgnY}{!9BFNZM5In^Spk9yg`IGL7SnAKcI85+Y&qrBYruYY`5gJM%`fJAmi3Bbab9CN z;)!4+rzihR_c?5h#{Qcu8TPxtEg*0V2?}pYm04Z$)CiGelILWt8%6RnoI@oHMdFi$ zdMMBdQ*Fn2aKZn^h~&OFGdnIb-n>f3IXO~mP8gV`*^2W;>z3jf!Cvp7x_w+=Bz;mR zccy|)A^|xT`k*7KRqGa%O0bgkc?0+TmNJ*nw-m4K2hIZoLke}=KBC4*;w(;{(A-mq zA;t&>2zacXbIf??JDN-6JqNt`1KxT%PNFmAK7FKsWb?U62wqGF3*cK~Cq#cG1k@+K zlSD{pHm9DP|1VAk7ZHQlRrqaiI@R53LHjt8@}m}tyGH58DvxL(LOddGW-B+DYjhQX z7QbseDhF%Kq~UIM)cBZoS_|*4e22~dfnkBT9eu9Pm*3l|UiS>-0qCMSDkS0=gfcAb+0$KO z?z79?H^ETt2lRWsiAF#^*@&%V_dKdrmPh!qOWnET9h`J34V|JVKl?q(F06fHftyco zau=@=D|t9Be%1Z$^w>QOd4#z*x0}uP_aakG!gx@>$ehBTu&s?8Lx!xaZrxY z5ogFtNq0329g|C^dwpw^oYmy;K{QnJ68&CyuKy`Q-MujRbYSA)V8Y?)e1BiVn<

      No~t^Jm9M(#yX-i$iyp;RF~Q7x7Q% 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⪻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

      qr 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

      GDiciI1m~HUZ<(Bxi`a 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 z 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䝑HZ7t2HN^TpXwM=ZahQD4kGPLFA=dA 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 -9#5UOHG`YI>~fGSy};Wid^J)Ez_M zrBV`ElCQNXMdL6kh>H|DLgz2IEw0Rhg22o{b0hc4J44#`O8p|S41Z=^W@)_6oP$=9 zn9*cDP}%oXgGb*w^FJ|DGTE1;mTqEd#ug?n@4l~g9*9drU{dmdejLCY?9cTlM25|L z8DN~FM}?;1R|QYGnI9Y^wav<$0c5RNFUgm3=lhoUBu}6$$ReKlZ3#BL-q%}aa^!on zU#8(nU33m?yB6;0R}4RiqFj+zJvRDYHt1Z z*XmgGZfF5>?>5%|#{VfmSwDzM9XCTZoE>!!WBuJbk}t2R@h=MG{+u+!u2@r4h)ie( z;=XxjJyhrL7h39gpsPhW|8S&ru9#BSbT?|{qd z>>#mvo3s4B2_^LH_k5K&o33UB^WML;UC#bKTCU*^c-ulMxP(h_N_h-3;!D;cZN$2a zW!voRUiqs*zg*M5Nx#TRzdXs;&re9i#rhrs<_$}JbKF9qT^w4{JLGKYX_Bn}P&4k* z^aF0t!u+iSPFi_8aG3r9z-b);+Xnh8rbV-TexGtM)zPbGJ$hWFrGK5?_3x{?r*3;Tkx~E7Fp;3(MNZ6Hq&3uB@#;o}fx@AQ@-TMd}TvnQ?(Lik?+Q^O;1< zK9I@_TVMA))*(gQN+y5U0=yjK>F#d&C&E(CIzr-4Brs`_^6!c3&+^*^;4dkOA(@fI z->R688Qa8_=ecDK5wpi_GQsi`?JEY3?%T4TxTnwsSvU-vvab5-%OkOM1kwEgmbSiR zrfFOO=sB&$BgmxfN#u$c1}Zc0q_nM(CVp~F{$Vs+rDaU7oBdJ3@M}?=nQw7J%$*Tg zzr+4VPn=RnTGp8@aTZqD6WoyaUsD>dUvytin%P9>gUg%1^;AI$zIi?sHDaxnMvx{<=^dv)Cb1J(^IeMFkYRrbL_GA_+@>Bl7c>#MH z(S;U1Pz~aNMp8R#vAuD7S>+&hx{#0ZYd}-MHDQ1*6tH*lE17{UW5fgwh`n(3*)4!r zDni!jNs9U$Aq5jSN~&j^_Erfa8{-Cy5c4GrAUEEdP6pYso717Mr3H>{xHRh-7J&YY zU6^DpFxvIaKP-Zxb6`>>JJGJJHj)Eh<8T=9;DaBpH@XJXx|!>ihkVXT<9Lhi`(~rn zBPB^L`dYV~iR?6;%ZZz7{vaB~7M86C*& z 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%0A(=2=CCl0L26IRGwS*tv`D(GG? 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Ǎ_xoQ3@ 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ν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

      ^A!|18=w4S6
      zS^jk}7*MR1Dy$i!^0(vN49B~_edf|WbLL{2>Nl56_$T?!b4akBY+x*P@vlF4^|R%D2RQfG8_)!>kO+;kakfk9X4>dk87aswG{Gut37?JzlA`P9s=4^g
      zP9hJ4W;5d`Np~`d2Vjn742zQ*Xa$h5aI%HOG(I^qnFxc^ki3V|;U`&uG_Qk4JOLFQ
      z-68%@lJk+l4SFGSEPVM}WOWIr{_VbA+fX16n)_5N18fkQtcX4t{_Jf#LF+#1MTk%$)e?~#XRE@()
      z_sYmRy{NArBe_bJao4(&sL}Cz3ro*2UhqU2Jn0&{^Qxlc*iEfym&v
      z7qW4(R@r3k`gkkFo1es-2haWo!P#dT$(X5?kxUZzi^H_V1Wo-eoiHL)lLTlcqs>fo
      z`nfi)>hViGM`pnr^eT>uv3JziIyj1Fj6%23P!VPpbE?F3#{4E3ZCZtrl#g{>nQep7
      zl_|?+z9cw|9*UJyBl;>quTi)+X)qZdZqz!-D@Syug%mbSfnw8?YeEN?Tnuf;;ZI3n
      zCZ|T-yMW{YU)FiO|NmYeV7LjLqOOg2WmG+fE>Bx*8K45-OwJo|(=;Hu2I$5JWs%Ux
      zH#%M$LU@|X&s<^&=kk}Ehg+?Kt!=!LW2A?94<76AkzNU8w5oLWQSug?Q*mZY1R0k`
      zdpnpx+)x`e*3lfI_;9yl9}|cU^GY`UQ&wtJborx1@LUY|5wkIgtfNU_1x&UQJ8v^<
      zvEwmwFbu>GRi=t1>HdMIhwge11`S}>;V=xwdc8`l*37dpD@L?D_|V!`^4vST0f=WG
      zz>UHU{Aduvp%^oYk|jGn^tGo-Q6@+u4=H+`Auq1|h^)F9_@1_iQmB)uMlkPXFXmaTF(Z;gYmyAdjO-TH;jF~CHF@Z*U2SIb
      z16b+)xIj!kq{N(MFD=wNS!N^-F|VnjZn~p$OtXnAcVpASL)bO8nPI|F^*q?
      zkkDZi`P?h(M2dkT`77f5l5@mIQN|_+2ffItP$x@p5Mw`@?V|#%20NFcj87VII{=m$k2bLdxkFzd%Q#%4JMx90+yFFN7JQ13snR4O{8U@
      zZPLqlk)^;1?aVf!px!KIIO45;0S~y-lDmzV!r2TVynl6YcnnkhoFNC$oqiKTNn{AJv-IRL?s&g$I8lA0T|GJ3Z2Yg=`0ey`yIF2Bh*pGj$@_
      z07{0)nH`QXi?G8Syi3OJqL+A+f&)@Omq?H=yQTxydcujUUM?d%G$l0~ab~K=lhtzX
      zm)cLYyE99&`CQZ2O6RG=?iGm5&sNzC?{Ut8CmDQ^C96Os;V1}46g3WmPgDx*?ky1%Xz!Qa&;s3_Dpp_8{K)cmu>1UMgINHv5r#gYq=O
      z$dEH6e5z5T)ThvH9m$<#E`9A)YY2^aq-DnCa-xYTcjdg^Q876$#q=tY=X7Sv9F9D@
      za34)@;$vU>lg?U+Ii)(1R8>mPwqNY*iw}oK8xHI$@f<#vKehws=_m3mfV>xBxZyZY
      zr3?-IJ2zII%Be#cxeo`#{&Vup^2PUp{kHr@qb6MwP!(9FmvFIlm;=>6n@-L0VBj|!
      z_{Mw{*ZtsuGI{^RSHL(4=2ywEh!rz`+!dg_Tnj&l{S{IL#B^x%
      z?k0MN;BPp$Pfqy7=_xecN^HHvCa+>P4rwY|2kAdmIEwq`o1e4^oO>Q3kn?C1Dh<(a
      zM6nJdQCY4a1#hh{_rhqI=p$v9zBbT9JWc5~JjdZWAGK3~S|uT^FJ~Rbl{1Uv;UWj>
      zbO*``&-ZuNj$WN9=|OH$4hCo!DqOq#f+j}G5}h0vB6(ZvkU&{dKzN2f`Bw#jXp_2JCbw$_S3Gf0j%sS)S
      zA;#DMBB6|8nF9o3qvo4fXQ!kFtJj|~T#k&30%>8fUHCV;Qhh7O%Qc%s2O)C&BymI7
      zD}*hf+_HVRLeVmklq(b#!*mg3w{u{v#wtDHuCVNTj~G2Vzh?OFywG+^hgcu3B5z+cJc6J`Yqdq`u2e4oV5
      zgz^11Yb6vy`MF&^dw`&v6|D+
      z0pf&rhZDTOU|3O0qKf1AI5tniaGcE9-Dx6ulL)M4EFeHiyOiANa6^zjFz-lRY&T!IE9I@S|si~kVK3T5;oRkeZ~6qjD$G1ID~apO>y!1W_?(pj@oS3+(QkG*HZ?#C4e7fbmgbhSp^ZX_YL%m7v48oV?7WU8FDq`Pe>!YHuKD-z$uC
      z2&VoRC8=9QHLb8{1+=o28oXz_6wx2U62
      z!{Pu^$C{QvASfR4#d1td&b>l%4d9(2*;zlLTF?$-$*9?sgrIyw$oe+UE+#>@gQozR
      ze&D?aRV7L))vi>cuYPGR(Ut0#W#GTswRT)=`K$KoSC|OOWU#Bly||^z*}Zxy$`M*a
      zINe^HmM-eM`<)|dea?6|PsQAM@Ps7W;MJ!j#xSN&oz2>
      z=y6s3W;io41Aw&@r>Ze>HL?Yhi0#};jE~0lSyI#8P|iY;XPYd^wVVN`odyN4RyZW@
      zh1U_ymnqQb_4`idBF?z7=~E2&?|Ql0?VQ6e$@`VayRWX57|@8>1RE-kDfHIvu8kJ}
      z-7Z&ooz<3`O@v8A*?3a?LfO+n{;+Kv@bXMIvt9mxPd=UfE?IzHpTsO@WzxE_=Dg7*
      za@-VUr0w_>vgy)3;RF9Ev-9n8uTLT)q|9-dWMbI!5FTo@d%DFb3Pzjdt1q$zh
      zfU;F(W2l~~q-E7NTnF4RS+z>3eybd8&+k6C$xC2pzp?qOzUQvQE*<7Omd
      zD^{Xpg;b(C9NOg{l+5+Qujr{u2+t}|K);_iEjSI+Cx9lEMv2K!Sy;yzv9*7aVzTL(t3`d@j|yeND#qU5tDn_KtpTDROSk0n5w(fVr8@Qqe&|
      z<8SO%J93Fygtb}ATutG)Lyq?TMYK`gd441x!?%sfQ#Hg=UsXc8l7P>eB)S;|In
      z`o*Hy1vUT;-*rqu9j!#Fi%4OAg;J7ln-2v?6VPL3&|Eye4aRt1Yw`b
      z@u-@jxcF&75nHM>TUwU4>g>VW`d5ZT&5+a>|t0&Jw=jm>O}!
      z?2us?SqXnX$Hs>@2p)%Y@h*%Xi!BXxuJ!~(H50{0Lw?qD
      zHB?c*Fx*La{%>Ys48BJ{laaoxbjTWLMkG@lBfEKWvi6Xa`bK%!9m7UEexZTRG!-P)
      z!&-c@+(ubv({fNVU7{HcC|YxpUwm;*)1YOocKtNDF$}gxb>#kfk=4fdeP(Op$hekK
      z;fz(Eu|8yP)|9nJk<*{5lo=mNYY`(bAIz|RTD;I)8>e)AYh;L(s!%^}$H~cy3Sc|ozJlsTCdR6<#(*oLo4
      z9@ay>Z66m4MTI7VvPBzXoZO*QM&e4Wg&9qPFe<*tvTS+K7*!tw27eA5cx4tv%fJ6<
      z^M=_wcILEGU}^Nh77v2Z3*JL9gwOz!?qB#`?=NHXb9cimZ3pZHZXYy<*Hs23Hg47!AoVF-b8gfKf~ZmlLmxZ`lZIMHZx
      zu8LEyJ6Pui6ey2$8G!oaGEc_U5HRz>yIcAb@a+q=(e
      zU!HUKp#cql^jGYrU_z4W^q57!#!{#Y%@M!=;9cJWZ0d|^FER{_uBO7=-RB3p9&M1*_;fm
      zQ7TjlL@2rxYS=0}a(T&4a`zWEs%r4QH5Mu(>NkC43W!>=NqFEvuv_$W4
      zpYTsi6aT`5S;{UNEv}nG2cYQu+!L2je|H&(zA7C`dbfmf{02}x{DGkzqOcDPK}65~
      zt54rNa`oj+-6>3TaclSK8>7Ua6!BAMqRR{e~O`CLjb?FJCMZq``H6qn$)rPKFdBw7a(R
      zl)}DeMiwdzvDtR`wz0|RPo16T+q*{$`n0>b|Dwaz9D4|6b#huWg03Aw(&~w*mL*gZ
      zS~BRUkveE(&9a{RC@x1H&}TU%%_TV&CZ-xkUYR}S1O_H8Wc8SvGoX%E8gpX;=s9ay
      zrxahF*#cgKL~Kx}=ab@3m}q@U<0??^@i-y8L!@vMO3_tfI8aQEqGITH9
      zGU5U$qYPO=W^U4(ldpDkbI+m6lyj3E-wpQ+^u?gq^9t37Z4{_`hQ{$iEPLbba-7i+
      z0Kqu*i7JfTjWdExS^h^SyWS%nhu7
      zJE{DH^9u9IQsn*D!iGm{3h7xnR(|H^qwt+4v7{+hmqzH1>Qo4u-En&wd|sZ1H=YiZ
      zWYr*#QH0uJ7k73Il5W4``OMDmjfNb826v$@kzUc-#zmRO0QPE6!LXKM@GVLQ9b4w{
      zNT9!w)eVk+GviJf=c1`lb{2s*Mph!lGR!FmhviMCC7lj1DxD6lTf|T^J=)c)%%~Oj
      z$v#X`D$jA)56r_pJ)HaA_}S5xsJcyH?rQOvYPs)UKpgQof~lPTqRkk_84HRJomVON~Or_xA{{im(%gMl!8=&8V5j6-W
      zUb?1I&LS67CvS=*cLf(oLtBZ$kprlf2+zajLk#DIqXYD3sRv7ef-1|zd@kn0fXU`#
      zDIbj=&86Bx((Wb}*)70dV)59LgFl3f-<62ZS}U4a{7pD#1y8dx#O${qiNdI1VG}uW
      zaMzmOHY6iqf*0ms)#ywoC*OWYW;=-|Xuh;CV|6d+`0=w6XCqWNN(GMqh-_5IS;9W+kWv7=_!0ZlAn*$+Z&$#7m0`O
      zd_ql^>KX3#QZpI5hIZkqIf~$Uo;$u+hB~>3S%SWN9}_vJqn?DB$P>0Hx!K<`vp?w6
      zox$@h!e;H!Ev!#~3sUddw-lbSr$H%S+xg%|D?4eT@mPM8e_a3BM;C4ZxcuJ{T4Uyb
      z$GSGW>}G1&NP(BNa*4WUSmV;L-bU{cRgFHIe>L32zv>1tPW|^@(1Rw(lRpZ4?R7X?
      zTsy^f+lVcM^&h_8k1Zy&Wq0JG9ls7xKFbh%5W=(oy_}go+s?dDhjI^=N(Q#8JXUDo_OLh*)xBbmmCXN*A;%0YMEHS$dz$Y-|XXSDYM~D$ZNwyTnizYKqbkyUd*?
      z%Sx71w1f#sVT7iy6lnzez=Y)1ZCHqkvmnaOpy8IQ5N%}xA)a+w`AnJWLkqyll
      zH9U`0%_3}x)K5416e2f0=3%nuvcboM$csZrwaBo;vYU0}3VZ$qFeT`bO%9j3?U+7Y
      zQKl`oRpl#hH1H!@@nl=BjlwVJrfLLzgvKPb@TvNe0vdd_rmB*W=m-o6v9K=?`#D*K
      z4)rMKEVBw5L1cC%I(_kK4Dn4?`H{AL;DiMH$y84*TsvZBfB~!(hDKg(Xkle9h|Nei
      zMpK-+@NUpF2Ri`d1uZLxxWa01FUe7#!)jnjxIHI~HBM1Pufppfy+qRdn6>TS$QYF|
      zG>FQO6=gYpW#k=+$-za7j0O=tw#6}Nh)t7ot4N=ERwaj%pl}5$0Af1spbmpbkVeM`
      z2fLE@sN(nOF%U5Xicdj32-i(T0%H3sv>kzE5?%)WZwb4ZTNx_+^*#p=OjbQBGHGU5
      zLF{rFgFRXXhtf(P2XJrm1@yYLw*{s1?M^?z``yV&yS==GYAf->I(|Q0B73#05`aO`
      z-yMmCN5EzgtT0V^VgnhD<&0%CnWa2IYq
      z<6ChRvX!3d$cCe^USP?Kx}aXe27sS6vfqLU$FvwaE{OZD1GC{sIVNTw+g!#$UpX^{
      z|KhJ3c0h*4g^+2M%d5%YZCPtVCpPfa;wY`SM>=HG-ob|icBRy+3%nqE9)i$Doi2u#
      z?+k!qg%na`!HF{q2Q{NY7{!geOYdgm3?^cPcc6?y9I-CUGTPPVQoH7yVL@gOvO4Bq
      zA~cplvstqjh{@Q_?3P$F;(&;c6hlOmw>hY9IoWb2D{2VlSjP``e_@f#Sp4&!NDQ_Q
      zo{QD*zg~lzh^XNGm|(Zc7jcuomdBQz7H*1VLC!2TInN6sxl!PF_oX&bx637zD|fMTGH8?B8?m5>=M80Ej?1
      ze7q`#A$c?-w{XyBwtl^|`MR^YyR&&jmh0(LTx6f_H998TE=hG8tIbD*EqV>>ifvh8
      zg`fLy0Nt)r!kAacsRU!(n@kLiN{VrrgIP(2X-@=ijw?Y%C6jk5e}J<9SF61Af5JNJ
      z8bT^@fYVPSIQnlQXHn_JV=XSbD$`OYvu#D1Vo1;9mA=k0YWTmkI(WEo2Go%tl-(XNuIsl+06-TJw5F8
      ztnk~^Lc|vBJlkyjbhNv9^pX=|TQ(10bl&V7zpS1BNo(|bim~53>b%_EeMOPVk+W?y
      zaCr-|D*OJIWZJ6aHLBi>Bo=4(9n>h
      zhfHoh#^~+Td{}e1gEsoT>4MNj(Ly!^7wl!XtD^8?)&?#E$S*G8+8P<`aVBRE>FA<*
      zev5W(r?xk*3`5;mYM40L6vqLL4Y~O7$mPI7T^HDMIAdVLk0+x*Qh>=Y^2QMZZBusD
      z!?UUpTH9os0i2v!TOF7k&`P>nofNq(JAXTTC5;Js1iHBkf>Fap<`Ho6&C?D
      zYb;&^z&oa_yIaKa?@ErH+G1+s9Y?L7oePWsN{9mz1RF@~*dq@I6srZ5u?)fnE5B*Y
      zxEwEYF{ttgA)-&%^s-cWbC=<8C5CCAM9?uvvbhaaAW>ZfEgi34NZXpZznE;CCYcXA
      zk*3m^5RQSooAxeVv8~f=*EqY1-fB}fJbZtzx4Zbp7O%;V`EO$fyHqIexaS+`LgO7q
      zq>!8>J;BhFnh)_6=>|S}r_xj587S&(L(1Xnx+G-c-Qm!caSkIiye7$bAcIWuDL}V&
      z_JI?P_f4Js8S=#Z)~7XzE@|1(BJkM-tD
      zP$C)rSBTYo_I#^?*VwGp`VXbFW6s^S2+qkMVPlgy^nG9k>n|65aw2!<7Vc2E=H0}l
      zU^jUi*v-EN?9Sl-Q)Eo0+CDryIINz)z{M_)ID;4ABp^bpW5Lq{dJ?4(Mc!STYC9V}YiSBxb
      zu&R~i*jEhewRN+QL$=sR-YqgN2%J`OtxP6~npRJIr46Bhq&bhbKUAAS7J)JrbBTh0
      zCtf|1B5;XOiVW}uMqG=WJ)6B-MY?6N$wSV2Q;QFyX&z!}1Qq*UAqQJc0Ng-eFYF#{
      zZslI>;8+da9);zW5^%arECK;&G{mce!{fbec2eOt5y>W`zBE=y8O1acGaEM|Yhp
      z-4Po86cIMc(bO1W>0ph?VA`C5=)Sew=)RU$UaS_hq&~)8)7uZ1xD-X~Z6CipNN+=9
      zJ6_4A5yKNJqi*BK-YD=~H238N${77XJ473v!ko2x<&NAgqD)0&zZ)fYW~zO&v`E>P
      zc?qmw>XGE`mVJuFM5-@i;h{bJ(w4!&LeVmoN-32>3)MHK6unWASAq({
      zz<4nf2eX)7*CTa{j@1;RUw2;&;TnRl;8I>K9mGo*6dJ}kYtEYRvJzm3RGd2V4eMr=
      zqdTTMQ*FYe5nd!IYXJNvYCt@hkP1btS~FpHguy1!_HDM*lMd*e5)kb
      zfn0IiN*XvR9HG3t8qaTm>a*Xw7im#AzR+1+I#>;e-M0&n~D3P$jNbREP&?+i8i-QRM-@
      zD>CwQG#Po+6jpkl#bZdK{3UkkUm}@4N$TS`JuIq6!G4ILl+#4rMa;ZM8Z&RoqExk(
      zlJRqkXR+hnPTK&+FLokQI+ytCX^oyN<%1h*}GKZ
      z`jh;)v74DP-mUBnhUU6m4!3T^K4qg_3aWgKaZOO&@Aue(H@fm*hVUIR5kTVnK$@eC
      z2d*D9qpRX0@ypG(PqfvLKft~Dk)CbsX1AYunrxV|H@1&(?!+@(9vJy-nd2e$LRx^Z
      zoZhQzQia#A(#%P`mGj%|L9qKz0FPt<0|dfFewlVHMhhbSRt2W8HyI2ojC~s=4Mg+@^i<~
      z39<%?Zi8-oW}~S9JWLkUoTv3P4l+hqb?Es^4gcY{PpZu&>Je&jfw-*;d|3P8hzPXWJ~kE6pCt_BWT%
      z;-c@Rx(P39Kjd%KL|>-FDJo8Mb7QW|gP4-i=xfPQ0(%^aU4o?K{SSmiX~jT-nbH}JMVc2%ad&o2LjDe`@D?FEXAXfU@}yB3(jHn
      zIgApt;-hTMM;#`jw(LtxS?E@kgb~1u*M8`EME-{EWfBMIwqn(tm}BeQ$x9fYI}8J$
      zU6Qf$nY6yi$v;z1H%AEuG4L&g4P(f;$yq%61()VGxWRo18Lff
      zgM_e9JL(9=CbB~BLA4D_28*nf)mcys5t#sPOEy?-EfaIrMw~U$D7;t`E!KE#K)x;+
      zkCWi83X-KTfw&jk(c;w^$YY;<7T$e|^}2o#e^U#Hr@jbPpS6yx0yW(ayz4M}a=(|c
      z7#gA2O)N?13vT3~AH^536cAPMMPQ;R{VDi6_q=k_vwaWCXZ9L3@ON@BY>H2bhD<4*
      z#RO5ABiDWSn9o;T5~(5whrtFq_yYtbVlRKgN*B
      zT#@(d#0$o??D|=jqsT|)eufKJr|H8bYDVx3jhOMdjdSK{oY5L*CIe)Pu2j2C?2Wmm
      zWZ1n!CWF^fp6-RW4&_Dlt~dVwRLPDI$#$s-Muv7N*%#hG?&kTkZmYNDZC^aUd~x;C-}(3dy!)xY
      zJJ<{M!-L_gU;p3eFgh9^PhP+O`TEVx+uMKr_P=&G^LDk_Y}b~f_VUR|dleXG{dxIR
      zM>aQAZ8W;*fSXvl<*Wr=%ABrp{!|)94%xm8Uw_I*oOCcWU!;$dk#OIQOV
      zFAN>1Ko7`JX<svSD~URTUjv$bP7qr%!q7UX;aO7V^rG|GaQZfK-ym;Q4h5a?jyK}r>U
      z^qMi=$D><)WN0V=smo`j7p|qqY#y-ya-7m`SK9D8b2G`e>mu2kApFE8l&LUVoPaEY
      zoFI$|4-J8xMv=ZnvE}#Bl7QWQf?MiHHd(HdW}k?Nt-p(@B5GNl?d;2{#X5Db2zAyB
      z93B{SqMJpHN_(FsL{l&n+FEXoO)eSo<%W@#n}e>imPH^
      z7^%X!oa9aLsFo&Co3l^g*#E{ly@`;T=QK2+CbY7aP&!g7+*8A5&wRe2^tw3x$fG+L
      zJ_BtsJK6*X18AVTg9_i$WP*=42UT*l<%}3$#*KhgS}*VJ>~HTMtdsYHv}YQp|@w2?IvVDWHF}L4bvZlV0C}oOx*j`kz
      zb%ExkMg!y-RC!AY^K0OcXPIB~<}tY5Ec5G(M4xGX%_ZiVU+dSF_2JRW&BN_2jHLSf
      z@L-PsEa1mfh>D~|BD#T($S+oJcnMCEaQUS0C1KZh$DTIUlF@oOc!^5c`~qf-*&Y2{
      zgT~C)Tf4h>9Oc_P>S54GPV8Q%aw|kGnTZ@TM%)
      zWRi6i(?^yqc8-LuwN#)T4*BmHuJkCQo07gft3-og$WKI!#I#zlQAw#$e)>F#PP|hT
      zCR2K&B!wF}BrW03zQ6N)`{8@!)IhGB7|Ot9}YFN@dFs&t>`iL)yKKlI<&wp5kPT
      zj3NX0&IgG4p${7T#a2u5hdOZZyWwquMhF!Cmrb$Re4Q+}(a?b+t@1PSH1fxiv^Ik7
      zs9|dM^bUkJR|nU1(HUHmG=s*ZUl-IDr_mo=JL&XwnEFViDdUHLl$1~r@+ldNqzZ6V
      zc?H7zn62a)%Lf6`g=$2^d5|uI+$YMKK@?3TSY|K9A^Xf`}I3
      z#f6aRW9HXnJraxE^09oed+-b>=+VFSo*nES<+B@U$4EP8LHaxgqzk>W
      zd-r7kUNUHc64GB#gl)|oUXI*zhB~$
      z<#Ci(Wzp>ea}CWvkkE6~Wk8>~@oK=(=o0FMU-)gKa&q#lwFMIg>+H0Gg&m@6)ewh`
      zbCoafWu$RyYQ$
      zC_Rj^)fU>5rp-xnMxSzo(M4vO|7RvLt+LF7TZcv(GX#T?$QUo?s@9ajRequ(_FJj3
      zO;(hw;`#p3@oSxgk3{n5yY|pOPa?+bza~#2QYN6d!H4ZdxR@>ia9WF6N*Q3yH-3(V
      z3wciZsdaG33&Cv6@yHD#^guyX97RO#QgmXjw(pZ059!X~AVTQ#7K%tP=b
      z%k3_zUNmeXNx*ef<2!H99lLY`CUa=D+q7(^e_JmtD(5cp#<=tXZv-3K9YURM_o`XS
      zBUGp;#^!7|xK|s2j5Ynsv1l$yXv^}lcOzYt#-hDitvy{HR#dvO9HOO+^eCQ#44B-R
      zXQWJuj=h$@-Cl15BxPz>2===pQzrYgE|BE>B8a}6oZx49S%?oLS6{_{>!SKT^m}Mn
      zz4ED^*-fJe^E(&hwAZXc+F!TVs2rzwtIdcXU%mruYg(ue^Ns}+oj)9~9A3iQ_C3)$
      z+x4B1FsI6345)A$&gOs0`oR+XFfhn4zj`;!cBexs4Z7L}5{
      zOEwMU8$7g$$}yts!tO`OfvW-sOaeGkfvAlXz7)|1f7~odBMCgrMi)0&sN)EyZ2mjhN8eDu}Ts+Kv4I2f#qOVEmne`zuuy15t)Hk@{Qm2_4zbGyAJ;6F!3Umy8W
      zWQB!cDJ>x-rattdX&qTPPLzgT#5lwj#dG(aM+jcAT9h#{O6XCY
      z{(YKkBc-OTCaa>f<9gfqvF$)LT)>zMn4CxBQI&r1v{W%?t@cS5hxR@fHyghg+wjyW
      zr7ZpP7MxAdn@cAr3qUp7RYg@bbwvt~ulV03qq;Jakunp%@^V>{2O_MJubi>!r@dC@
      z56iIo2ux@kF83;u##lyEI?M%S!@EqR0y6b)arfc#4n3zRK`Ftil=!AK_c1tiY03M!d`^#~azB#{lGF#TR7(&#o4u00UL$eZ-ShCD5~N3xY-_xQ)J
      z$3J$qcHvO&v<~3@2phO>_7|AQ3+Nekfjl0yu0aCtbVDR&sO=_R!fc~2!#~iCtWd>~
      zH!TI1rYKBNQfH#IGri#Zo@D-%*vm)83e5}IENIpZ(5Z-jnmd!1a^pP_J@I{dT~}7R5yoRV&%q{A@fqy
      z{U-+bHuVrl9mrM&V?f
      zEYmwO!`%816+k4xNMPr!<63o?d=%L9{gW9E#9+)&?M-1HbnDAmV_>vC^vZ-WUuC$rJ
      zc_f7{0bXNpAQd6Ojn?zavWy=TBmDi>k4>wDk-L)Rb8(>NYVLNgj)TaCbQ2X
      z+Br(eDzGAqUYCx?np~?^-AAMZyrs=XwV*2wFiaF-Eg;P;IZYCP@IIT{h+LI?%Kqim
      zPOGr(OP<}!D~@I}TfaT+^uO*)E0<}BhJLp|DrVM{(Ts`&N2X@2w-ok=MLQ23#Aewj
      zbmu{&I#dzZDsSAiPmULF-=>d@B7Lhg-t_C0naR!eSEPKoQj$kzMre7Z0#-uhzS!J(
      ztD%Hoc8p8@bOkOt{6W^oaIjv-W;O^zg+v1t+~KISP`vHWRO2nSg#GfVOep`##Rx=^
      z_If0NLpT|ACHq4zkR&^ij{h8`<=lhnbV+ork-qrFK5j358fvuoZU2F(%^F{qPc#HH|gx2}d3&4pSBH2KWvc+)*RXH48M%
      zI%ci5Wx(5U^#+(7$Mm{@-YwIDl?v-9mhDLlJfxsaql9SexxG4LeoL=~tihF1*8~+{
      zG^M>)x=s34)nljr!0W2Bu+XG5e!@#BEJA#gam>+FDI2G$GsQS};?<_|p~nd!5dgeo
      z9KE;*nW!nmLBQv;%#>01`9vwLx-{du6pC7Araay~q6p|xB~P(Kk;~{4yJ^Mn$vC8A
      zoJl+G&Rj=sMgX38uOZ+XS}h>}TRfisZ~tu^zYewJJaQ7rUdo~y3V21u*9hw(M1p=-NdZz#G=RXnYLRV_=z^*#NhfOa7nLX?3A>uf3lcXNW2`Ua@PiApSwT8#W;28H
      zu(FyR)RME}dCvnlf*a>M>x3@_`xuQRq9&Y}6_TLE3#WS(jwZ-cE@Ya-FLZCZS5LlW
      zjD$t;VuZ5!moV!Q-3XLfG`}s{KBv(L!VaFG9iPKx`>efbOhkv=X80TMZu$pstZ*&hYC9DV07MeMS1V%y>0!t)xwWf>N%OW`Zt8Qb<>QRu46$f#KTgY0a~~Z
      z-e=*y*q((v)?!;3%dK!7
      zL)t@e6{`4*SOYWcu`7Fc0645~g}V9cd5#*F56YbM8vKa^@bB
      zxCn*jQeZJkzR(~ssNnzhJB1enzxIyA&wey<`?Nc%L1-{{5uazlE#k~vQ@lbv;K|e&
      z=*JIcO;f>(|IGCZ=S0v^EP^Boc&V4nnIHm^VBwkt$G0$Waqa;86pz57_-S)zP8t=D
      zOaqy|E5p=(l>pY-Sf+v{>e$V#UZGn9Q`xi2G91y+g5*DrB;1(k};bzJE4BxE}v{rqA@Hqe;*fE%P*o
      zC$!`rH@}a(gzs#mT$j(XFqs9<#K23uYyDK
      zMs(|Z1;H?91`UBwxrfNsLxU|Pra&E>Hl21jshZoGbr&jpOt
      z%3V7#bAsOAkU8F53WTm3bl6prX&2WUgt~|rag^{0W`=kE6YV(uw&eKRlH+enj;WR$
      zd8Qmng&{Q>f17gr38ozX(Y73aX`71wqgDiI<;DHm75s(mRhZUAy)a7J82t~&EY!iM
      z@dM8jCG{P6K+4efbJ7D6-@k=6rY(?kX|&52jD_eT0}d*~B@BF9WaZ{EVsg|2Buw&M
      z{8)7}6;qF!_Ln#9_;ZYk?$x5i;73#7feJnl>G7oJ>Z_~R8u{WNnChdKGa9P1Bz
      zN@qo9{)|bjQXfciQ%e~l%-I!7s%-aQjws9VvdB20Y?FYZ<^XcOS@<}Q0B=6I*Zkrk
      zA*>^ZSQp?tXBz{6Ly2)dyuA448~NqC
      z74_w@{K7r56rTxW4OL?#s!Krrmsn?pfNhfj-LF)FIt~->Ukt7l$(0W$E8L}!H9@V|
      z7h12ZQMfbDV=UON!FSw&8fy_SDhsoOz@JBljfURzl_>^)UT9kkUa-;vqlGpY%WCDW
      zt~6KcVs*8-nr)Hs1?J}0dFRHq!m!wbSq2!=_yW%VsI7J@-B98AlKR~iCnu|oZ%$8}
      z8Lz&j=;aTUDGRIGV&e6X?g)7KhdG`EBd;4?2L5l*1bJTwX?yS;0t=W|<8n8pQK4z0
      zl&HbsQF@;0eeEyS;FP8|ZhXs}o|dw#`75OVm^D|)5Xqf
      z*LNqYJ{oUz9JKj7_>zqs78v3DdC5>tW{3>~?>Y*jCv(bSelp}RcRpqQE97QV^+I>J
      zyx?JZaP)k6HS4gvk1NZlXJ|O@qd*h0{EuEjQ!Z4J%ac5wVsAO(bc08=CelxyaJVB7@ORqaK
      zU>EPuLLF1QkAujhj&PQ0`nm;Qi*2cb%0*o;?u;U_#S#c0cOhdL!NYKRa-)X9%Q#Zl
      zX0PWHW8j4dZK
      z#k&skWRyt6GK*y9AFnYrX
      zEgriOV-I;A@uOO@7OTDWLQY!BG!wvgR_)1Hb-Rg}anoYWB@y#7qU&a+L)gpL$2+@6
      z80vEK_3rV}-6GIUk6)J&m#<(PyHwygrA5bKkC(lifNFVns}@f~a`ZX+cou}8v2(sHDfsr!4d1N?KKN)gr_z|;me2wkgJjt5P6P;(|9(#%w0Y1^*dT7AFvVCDn@i!6B`@CId&+FK>T1U
      z`QTad!5gPWc-GYuj>vL~uO8M{>u?191Kv0B{RbJk1z(9z;*+^B8-d-Ir@Y$}b44aVsoPL)pAoVcBirK>CoUx;bfRfYlq*2%_Oq^>nKYr&*?+ye+u7Me
      z!yTZ{{-b5MtmS82{y8DCXje!y}B)BTi43kvh^hBNEzj
      zdzHduEI*a8e&BHjk)S)tKyLC^oMHKw9WJ-`6zkgD!N7xYO>@xUBIABiIq94}$Rx+c
      zi_Xb&rpWa0%5!_26CJe^o^)W*d`vy*__!E|h^IvdxmWeS!U-mfNX+t#9Zdp?{Eh&C
      zK!3lXf9x}ktnoV-FpkK#8K^pu4t+~Hc5Q}u#Z1b!PDbam-}6-FCe!REDmjpjgCd#E2Fw6a0W;3vDN({VuCLWw%=
      zc@*|1V{b-k=rd%PK5WUvkvBxF@^CaYF;MDB)Y+X;e{=(65UpmV_`j
      z16;L{(naotH+_b#uR>_6E<2TUk?mq*+N>7+BoBS*>`B*ZG
      zBM%@W@(-4joU;s?Pemk710B7Y0^O2aCy+=%0%
      zc>&3>dHcF(*cXQA9xG#`K?!g0+R8CqaEn0Uf$T&@A=(P
      z7=;&O14B+<6HTY@eJ4>8DJwDOo&c#A$VI9Ci!C2d4cLX~G-r`*v
      z=r4uU(-^)m?spT`*DhKno7YsqE(!l0iB@VC4+`5u3lLuKRs|d`pI=nLP*M
      z@G`u{{ai9LR++}(8RWQ
      z20YQ&??>%gTeYU9&=_(Oot&((oM~!0?J$|ZcF3D@8G0+zz6$eB&6iTamJ;Eev$Cd_
      z63NWWiw0hCBC)$wr~TS$VbBkFZ}2LFkbZa)?l;zm(XrA&cg5ZW0FNe`!Tz(CV*xj2P*R|A97F9j=zK(#8NH4AlP5AX)2kd
      zuByISDI^WF}n?j8us#==0nkJ
      zHj{;{K_RO}OWA|tdxYA=Z<}iwg{juF7#knyE@*02XuM(vT&T
      zGiXMZ;xDGucxc>)6DmcW-$;#-(x;DYND247Td8;n1wq2&g;AcJRLoj)Z3S+D%#_#h
      z8(jV|(ih}LugK$<+B?-n=e~wLa~BxUl)LpWsE+Q4r1nu(z6j>xvI9Tejr_|Ahk8@4
      zz0EkVE>Hbm3)Ckq46Km1h8*r#ZYG5;v0|~q#tD3gL?Mahfy$QU*G5R0E3+z231KRQ
      zaD--b;c!osIf5JtCgE&ccGvtH$r>~<&hqc&?bgc!;Veo!ZB%Vji?Q_%%J=5Wzq|A7
      zaP#nAot-VQ>R<%jIrIO#eR#BUurJC3_ut{@E+rgp|GdLRjJ)?g(!pY-Y#s{uuS3yR
      zX$17F|6V@a+(-NueDHg<+e;LNIwqq$(RjF4%boC9Tuo!wVq>P2V2K}ZHONK*7$w74
      zHkU_PH~d)Too*eDRj+@M#jTihI$v0C%01x@@;_nZ4X?yA4(8<2NozA12rIJv|!luw5}Cf-NKmHCl?>z1x-QC9e(4xe63D2BBPEFE#^VTs
      z(q}k5%)Q9(%B@4g8~NI}Vhb@N+jJ#TvcUz_I=5NaQGcsY(
      zeQxSMds%$$S!H9}{Rw>bOnqrgjA!7o6;e{?CCpI$PE9{s(pCS=gL6CfV0`Iz->nlE
      zUkp6QDiBghDa&Wlg(>_uV7^?1JqJ8T2J~E}98s#H@OBvpT8x4gV|C?bb%p=L`K>NY
      z$~J4H*ib-rJ!wjNOBc+(j}xFH`M4s2qn;%U18)$H;=&+xG#N17X-`~?+)KP8;%{{|
      z1)eb!?)%VZ#7i23q2GN6rH&v^IEdMywZ~7yPyRFDJN!#DG&K5h?v1Ze?X+_9Sak_2
      zT)BDj{CSIi64iXC3nK_VA@;)e*qX^upvGJnL&9n{7Oo~x!m&%^rE27IZ3
      zQ)KHhnBWya100Qq7sYXo&{DtWd*hfYB_wiTgr_VO-oS(y_)nd+d63?ijzpijbX1Bw
      zU06(%Bh?k`jv#IEMfD%}8l~_xskKQQG1=VN_FQ*X(S~-yrCs(^wG+Fl2ZH;EuiRdb
      zyf7;9`l;|6URL}vhVDs?OFcu1C2?+Q3-FhYGh{^>Dk_LqS0hWTe}=a-ygZ;D(Y!^p
      zowoB7y#;9y(BG@=(EGN7LqkSBacXoyNj$2{)L2O1Jrx&|pxZ$%3J+V6PTzLU)LuyI
      z9u{~lW)C&1@CxDqEo6=;WM%UI-AW7$^!MP3#$FI&jL-^eNnu6S3Gohby7Z6Qf({QB
      z`(z>fAiPW$-tZL*A`87R3nlQcWU)znsv?D>Yz7MJ#I5%)Onfm~1=+=C6q_uIF}`>y
      zrGUWZSvRUKi&Q9DK~OvY+g_hs1JOrRS3~X|Qo{C~a-T2KI>5m`(>LZ<6
      z(l06&E>t|O2JqFij67|#`R5Ar2yqb(Kad;9soclKRWk;$=%bvc)+NzL(x|L3J58bv
      z=Yw>KTF=n(CpCds`Cfv2dxx}hi4
      z(2?-R5pcV6k(6l`BeS>d-K}&MW?o&9&(D_(vBXM=!_?d*x7EU3HdHd`&^_;^FR`0G
      zV?PP;StFg?C`Ib^V?a<>$?~kp+&IPPp>t>d;d+@e|Ogj
      zY4o#f#4{5UErotI&2F@y87Mw^j8AHxz1)=n`_Ho<)a+`mFZhVqOMgX+P>rO`g7+tMgSm04zhR?Y2FR#b}i>(5C
      z6weH*#(`i94=w}MTFR4@3|rWw9)(O9Bg<_w{NuQgtz$G}r_PUIZ;~R%yMdOm>lI~+
      zt!jmMHo?$GR6)okNR*Q(Zluz`p;w3u)HlBN;SO%9y@s%do07@BFJhSBy*`V>|AV!^
      z#TobesrYWBbV1S4nOv^qlkbK@n#Z&v68LB=hLe%k7<)Hki;b0yoW;(n^T6U|XX(l_
      zEuac1%Tw@*f1myTA!ol{waO_*D&2C6VJ(~`*-GF-%txQ*HI%rs`%5}f*9F?ibC4#F
      zZ^w8Bh8KKP@)2Lrk-MsRJz$Rv6Z0kQcaaIvd;hkMnY(q$O2zG%Z+CNpM_R2I8E%LuR7iXiOxEtsGdjoF+GG@i
      zle0sdl^mCWf8n!Feq(oPUJcmz+vfJjs3^%2>0_^fHNgdRe7iI+7S-#iGQ?_@H$YI1eKXAsry28QmEe
      zb!jU^7zhf43=6q(-;>WyFO1_H({!PK-U76YTsWnLt}KsETv&v-0y|Pw@QfEF(CZ-V
      zc)@sd%WoXVqKcn|j<#?g&}a*vgNuf_6N!p|qAkpch_;YLhyP3A(6nXge=QK&0Y{T>QDbTLGS5xS(0F@H(wp^zLH1qIk4
      zM2o@D^z8bmR)ed2*mYS5cMeD4$Q__yfV|&f8XRvlf;YzpEpj`*06xeOZm%aA12}Yj
      zSWb;`*oF0=%W1uROB1);Vm1Qj_42`kWwdC8CNSVamqa|g#OO{=9x!o8Nr_|u%k09x
      z;b_&|%Q{z1lY8!8a@}f)HcRak8do>1X0!Ro3rdSZyT53q}W#lhSg7
      zi+ZIrg%`4o4b!`JWpypyw)CUPC>?KLWnnaG`RoTw|dOdXqAz(M4!y
      z;)T$NhG9i)u1Lo@L>vu)y!HqRdia1m0%RKGJvYwEA6l(XqCph3forxw&sCx`Q!UxJ
      z5NL!EXGg0S+Uh{6VIxGT*Xo#sO%V3q)1-BX%Z_zeWcDCQ3JnJB!;yzAhrO%H!`JJk
      zJR(kuVJ^*N^YDYLzaEPVSBe&av*@9Smwl5hQROw#861D(H5Whs26cDpAoF1YQDJ@QTae?}5j-LL*#%>&XsQs55Fw&plR&!s6jE
      z#daA<_=>8P+j=nLQ*~Z%4LrGFL&SGk*i(^*2PvIM>OJ3%aIO-;pJN0#yea5Xh;l_3
      zWJ^>#HM%;fkkbUX1l#7)3p|9#GqLkbfI8AH+)mlx_~O0WpCCXMQV51E3yeYt7s%km?6{mq|2pdI9c;bc-DX^O*kuG^o*5Ce
      zm_YwrHgH`Mv-JwkmwfDGl{`a^Ifrzp;4r?7|5;x?K5^?EzyZfKAOTSzdQeBNQ64uzT^igyLyDWZMKzAAUc
      zI*s3ecEIz<$+5{wO(zTl%%|1S%9okmY1311LL7Y*eAZT6$lQbrGq&Ht7ua~rrWK)y
      zB25(Qoc$iip|w#WDWC@4Li0T*2iDxxDenRiS)fE-2s$*{5cpO#M-0M=mKT^~h10
      zr8N;b^e3r|$ToZ|OS6imo2#j?SVjKwH!9NKs7QaKBK>iwNKwx}IeGLr+wp(;U9B;a
      zFA`;VmAfEJ
      z6~CA+%o0}qSYdSrvP)z16Vx%_nz$)2PsE_EK_s>aK9`m6
      zK4K^>q>qt559_N=&|Olon=B!T;KknxqIkg^ZINjL>2=+JNM2&rhQPE+3BTF*?$sdd
      zi6@U9!8YjkQl@d3i!@C}mi|~SM{!Y8u(C>$
      z_!UAd!B+4-E;YB`ZY#9$7;l_vFblT}!K{vvGS!xH`k|GF>q8#pcl*|B#cE`s*18kh
      z3SEd~O9pV9U%)%Zq@H#$qM;Ir%!cVAM1!BA%4ss{dh1!qNzLuu_+zmu2Mu}c{AMw6
      zt0aKg7sV!XJIE!-peLh0fLr*lJ>G3|-lY6ADG!xLg<}VR5{-Vh%+%ma(D^3PCx4pe
      zXVZH4ZULZboMSeK*;KX4TBQ>nc_
      zvdZq*+i(0i8JHkFG|Rr!{kAwWCcD*^LBk*HLtK2?Pq#)WU=um&h~}p;xb4K^_Ly#`x%=YImqYl
      zvxl^HFUfyxgfy0e5Gko3+uCGD5|9IkRIN91FA>M@_AW4yF@910h}!4ef5uw98cuG$
      z%dnMB+e6JQ;*=yk4-XFowGYmvx=nHE-2M3^?Dnw#&PI>fxi@(3fM*=MpH@Sz|H+&^
      z$K7}?u$Q0HL35|xYxlJ5e_oBDp10Y{HQVrLeU1g5mMKa?vyP4yDqe+(naI*Y)QQFz
      znsj1DwgMIrKBaGr*}E7_Xn<>$lB^k5|8W
      z+`xaIG+(@;lzNz?DB
      zPf4638S=>MbyOt!o^&9t<2d?bEo-DO!{O*%-7*`I`J)aA-nCqkT$!W;IZ$~D=`zsa
      z%cVa7c3ejRUyxRRam-p;cQ}S<5rS#^Zg4qqFHzVX;SnZ=-l&1VI9<0(=CvbVn$K>w
      zI<3vt%k2*Q*ZQe?a((4dQ?N+w?j*9Vz>%)+8uf0$tVyjPsOKG?B{~af6{vJV9p#0Y4n?KD5Kn?(d2vt
      zOBRjDpcuvT1-;C?#WL2^u}E3-=M70sv4lZ*YMB7W(`in+gNL9M#yO|FbR=i~`vW0c
      z{&J+r+y|0~Xyf~Al%s?<*?k(8CP7Gxj*vY#=D1`GNijnG1<+@P%h!(_2A#4fZlzE
      zko!+i#01`T6h=?}M7??O{`?tRX0E|p3dSJ;asC>_tiO7Rp@|Z^McFecg){nFE%$rP
      zXzE?Gkjysc(l_4?PB-y4;hYuR+GjBYhz_mPu-pJ0ITCBlZyVB^!^w0D{1VF1f(|&J
      zTTwpzTs>`4`1v97?snJKj^io(wS{=S8i2EU-VkE;o72;bM@?-!_=OAxQiab!Qy0{J
      z#4kk~dJhZk&g86~*>uKB$mcl=0~Lo+rX|h2STxPnTHY1MFJq3_14#NFY4;_uv%hn^
      zvww8Fx!>BJ7OwzWpuC8bQ8PLawH=kB?Mw|Yfcc3!qSbMsgpN4c*?+OSE%p!gk6vyb
      zZf_N2N^cuv0QvdoJ
      zcy3MDl%@0^Lk4Ju{yM~9wXIy=zAMxr;Qis1)c=
      zoZ;zxj%VNw{ZGuGWeJklj)lY{pE)&m71904+wUGHXX*xVFOwT3JUmA|Iv%MbFC3xipfrkL6Oc$-1DghWXF&Cg
      z6<%oy0VfT{jp{<*5R6H~ew~%C`xRXXLS_LKy_obB%rTmZP>3k1oQyz@G_GpoqpP}#
      zShv=EBB}%T_8cQgJ#Mc4U@6_xN8Q{|TauI`QY?DIb;lWKTQZF_c#`R|LD^?SNBvFY
      zRK%ybU3^}!o;zp}6LEbEm_u4^(2O2J0d0tz$oqBT1>+bm^EIwXm}r`fTTv0!)a*2j^DIE<-1VS1mHWg0BC&=BdV<->3g!gU3x@Si?)K`0jYWMg2k
      z0|cas+}jArzQmTiC2|(wW29TRK&iZJ+G$3As_brIpgls_{9Mm*+6K++U`l_Gl7Ct=
      zi)$|97&RFkT-tk;)~)wgw;p)iIqXdCxLW2=!<#d0Omt~MXEakJmHY_>-xOyi9+=5B
      zVX;wMQXO$rJ$N1XH*bIi`lcy0y(cHDE2pPsq|$H9V5ZF#Ot|(a8$d2kA|QE{Iv!9N
      z>m*-1_?K50zbf)Eo~>d;DLj@HTt!0?Bkqif2aDK;WOB~A
      z+~8Ith@UC@vrK%?ze7KUsSK_`A*heGx(=7}UwOqvhao^uIu3QXa
      z8+R;HW1Hb7eOH2$uYFKC87cgaAy#uMS`O<4`0i}^?&pTMDP&!gIH><7#(xvz`HAsl
      zJYTrq|1?CWtiI(LZ{-GY8d5vt3nd5msJUh^htYIR8e6fvB
      zfz%)kEQ?CkHHT&y{yD9cHd~#&qZggS?W5Pb$JLYkNV$-PNZygK!Q;UVM7_n=0a(Fh4QS!
      zh&K$auYinX_h86NizNiR#3NqC8C2k3{afY{kO%nz($N}oZpuYYNe7qV&BvQtbjil^
      zU4kG2|6_RCxjkk93Z1(Wt|dN1EO5FsYD4ObiTBAgGNbm-QswuG!3|1CK4kjfim$`5
      zdTyT?yTPPC_8W3aq;Rt9X=X-l5hAi?u@q6#^b*tpbHi;BXCc!3qm)mFEacQBar|ZI
      zL!*!QRaY*pi!O0u-US9ng1i)T5?{Ohk>~bq#SjIH5x$DKI^Y^%({OB7iv0(5>LM_x
      zpiG+Q>}bz%Vl`3Z2lRrI{%@y6<{p!yzN8xl7dX31r3KdDpwnA~BjqV~{SLnGAazDn
      zk;>34yWI}5t|YsMh94jPtF!&{=57_9%bYc__PtK;jYdYau~3G)!
      zA%?ZMq1W(HVu+jf8i?6ntn9Fza6G&~|7U!bdyyLXxSd6)}V?
      zufvl<3sL&i$H3WhWtOhy>A)np!%&_!
      z2>Na{fX7rd0QYAm!l|ltHWuoPM)v%Osx%rV<3+|{ea|@nEf<_@Fmndk{F!7rxNc>M
      zLB^IeK2-0>yXbp2$kz1w=+luJ5iBG}e>lB-9bYdI&_@|X*^zy+s?~%GCp_wK0am4N
      zvQEh^^g|wvc$9IJ_*C^-73LbLTYOfFa3K*A71B32fV1Ka^H{3cRpqjEsyg6d1~AXa
      zHKyxTdQb#UfkT{ORcE)t+*Yzunn~s%N#q12YY_Xw1%`Xb@Xy~=NScb1U_y9Tla+;rZL5*HcAsu*Cunf37GvUt5#xX7>{0=J~+)Eb^QQ>E9U<*hgt1BpPfQ~3UpB|iJij%`E1cRs6
      zu+bta1Fg@Dv?Qd-YD7|IpUGoN9+n9u@dmC6450gnmK7h<*?yQUmGE;?IB*;qEl3lPB>&7DWN9xF=n3*i5AVhmF5tV(&<}1@{l5qU9
      zYoe)%wRfr)S!E76qWctXDe&Nsj&SAUg-2~)IpdM2syWvaT$3JIz*Y8v&SiGR3Qbd_
      zUbLHwu1o@=T98$|9f!;wC>hfNlaN>+F0ANMk43T@30dz!slA}DByorpcMB_!q(68D
      z!=A?1sfx!}DC&Z1^hL&X26Ifm(QtNw+10%Q8gg1&G+`!*v>ug8CHa(at~#xQ{pUL`
      zswdDK$g(IJIe+kKJBTnm11%N4-~<=`N$+>
      z3A~mhfD_=nbhc4O!*XvW;ApiroN}w>loU+ZtJg;_t1T2zizABB!y#6H+klHJHUo#E
      z#ll_=;uAGXEaltiVy*+4tgKwJU%gaz7T9fsrY3=(NqLBr=t1c%s%Q}m
      z%+TJeo!#w299|9&5#uSUd9O=Rvp>cVBXFF(_eQurU@Tc~p`$b7f|S4i_Qb(6FZi7h_e{6}l}mp;!*_O_PAg7#q36+N0sR_9ML6^01>^B!t@*+_*4S
      zrML|z;$0A4!=iP`p$v+;M!JA6aDaOuUXPm1k~V-t_c%3zj@EWqqp^R`IXphzks)=g
      zSFd(jS&v(tgRIBT;or{gLF=a@KH0ew)HxIX32U}1mbEh(e
      z%DsE=YJ0zP#F$IelD)0Y(edF9hVv_tZt2h?M?5w|Q9R-JmL)?Nwn>EqRd?hPDKAhh
      zNveyT{TGA~tk@{&*_Xb4lk_yH&`hc#QK^E(s|2s)86G08f1}J!
      zXK3csb83!Kdt0lRgYY_*Zrc=G!69M({JpKh_O?+Z;K&@w*nAjBBaZG{iB;4}O%Gi-
      zIeFChPTM=iTE-aE=pP#bk$MdkBgV0Zp;Q83$p%R+wbh5a3{2cYEly9aJ*&LJ3oo%6
      zPFX{{hi(zXg-HBVt8k=URx6P}-m-#oTIVo?p4B-vH_GdXl6z~aLmU)R1Q-p?8XUYT
      z5x)>K4^GUHnH)%hBYXR{Fi&+|l*nnJ{^Di_aNeu7aT-!h$}wOpi}{eDHv>p1~KR;$IE6V}wL!vh+d)~i<~(x}1OL&cXnxx5X=2zAPO}R%z3XfXtM6ejNEp5)gDbX|t`erX@`nKxQVjJdbi}
      z&amk+p{la7Xn9pu!5MIzb^=2;l5TohXOT{mZPqynkckYet4wBC$a3_c_SUF2!Rvy6?hnj!2bK+-_tpsF
      zd5FhRcQP9BS;UCzq?vPv!~U(*CF@EeG(#eXHoTOhItN5LqEm`Kjl~1q3xR;w1DLv
      z;+sE}Ki>sAaThf2($<~Mx@4329~mI96E7P6Y4J44`&h3gb!o&>8e$=o1Q-t(3BAmp
      z#*5vpjq>i6@!$pKeL)W@+TSLQZ+lIzT=n%kSWl$LYSxVekJ{TcmxQOn}%>x+o
      zPv$Kql}MLrpsJ37@Fhd;3<+pW5$oo-<`dL@xE~R;%-D^Jp8Dka+!;srb?`
      zLnMMr@r@^K8?W5}fq8?l;oV>;29ofgSc~%^F=Cd!=TYE?h~qHJV&EL3+p!-oE{jqM
      z1G{fuAYU-!ngrmVX3>`@TLbQ3TjdMB#OnFFLwV|sS**E>7{pslhFVC7)($f0a7=)d
      zr-!-*z>3lNTUTE99af}r5;>Db6EdO;x%T&Ol};fRL8@_Q;RG@U@~mLR#JPv$#f%Rk
      z%k?8Ek3?dv3|Di*1Eqr`%y!K%@M0C5co0V89=Rn9;kP&JD0`#~Hw6?`SV^YhKwkF~
      zo)492EzS1v_>&r(i7B3mI-(oFj-pIP#jJy0;g{7O{bVjI!LI>!Z?IZlj*xLyD;(&l<#{HXwv&iQ%6H{ZJzN;k)JflQKKgv1!QwN%3L7fGue_Mr`{X>7kt^J
      z{jP%vKmzBNmgFC>DX<6D9sSyAH+CIKm5jXt3`)F1GPjM~H0Cfb3dGb#yMYV5nEH6@
      z?0HdlX;^hUBj$`Os4lC>l9JQGC>?v>J&;9r)$gw-V}l1;j*
      zoy{kY>e7ab28k>=;p`OB5T4iJ`K_XA#DQN+*4-*i`(lOYLq8^i6ePR8c_LA>Gjug(
      z4+UD~APd3{Eh!)p`~yxJj>XX}CvhD8Dsd|0*Jiby+`pt`2New?Vtr+pywqrrWik2=
      zT4ikRycKL9t}JJf{x;4><38Q~!+|Hsd7uJ`0aM~xWhmFbUTF9t7-qQqmt26@%SX+V
      zleLGZryq^)&83gDNFK{YLY^{Ysl*aL%&G#@A^NNeiN@u}iPZBY>Wq%%kUzZA!G{0N
      z;oN%{|CA9SgbJ;I-w^ngzvZJiHm5GE6t*J<^LI-n9;w3pS595)R%do*G&9X!C
      zHgSB=qSN{Uu38Rz+zfy}^0m5H9SY?ViSt#bq3^y`iDbN`a-SIfJZd2Prz>@#l!GZ4+@43Ii4(=6zQ
      zxxgE&#I~`Wb(guQ8;t(UYd`+wZTpqgwRqptkEU@VNKp$3E=khD1`P>F^{_>CQH$f7c4TSJ$eO8AyrCC;%{w+e${gp-6d
      zlp2`}%OpNW0y?_4`tt3nlP7T*P7OjX+7#DVv0AaEG`MysbEckbayO>n()|glX^|!o
      zjdg>B1d;e8%|s>}hc=XZ2V1Xqw^Id}5mHU~aq-
      zbxMxlPtKGHse^^qFn{Zfmd5N-90e;
      zheatlkrC0}4w>$Z*ooZEN-oE$zADH%0m~!ASU?DtM4)@IvQA%iE9)Y@yNywlHICMs
      zOR)GZvQ&0O5pNRL)kX0?AzZ<(;AYVUs&Vdiuf#w9Jvx8*<2kAoU|_#zC~krrl|w*|
      zw|L*70^(h%>uXA2fu0w6BUs{`JJy}Ts)8gWM=uy11vN!3R5EX1#|(vjR#1nuSYE|u
      zkP`+B%V-iA;ujX$bh{liv!e=plci>1>KwX)neDM;sMf96XyxrCT=@`s5YExdYy2|2
      zen_x{T@NM$lmal2tXV)58YLL0h#L+jb*yElBt*zKkQb6ru6HiM
      z2Vc3}cSRx@6udnoccKnDhjIyM-0!*_8^r?@#TSe-iafOXYbrD!g*A~;eQnl)V-*D$
      zuBZ|%xA_l)7V%$gxq(fBZ=%8Z*X5hlVJ3fsoSCfO$M9_*CMH$|
      z2R4#wOX7QR-P@QI8bwLFT1hRRdI4=|a$!04`B`z3Fl0<>q+fIc
      zxwR8*NV?C->bqBiuqU28dL+rqnv)IlB+84oRbYC
      z!NEA>9Mrr-RjMcP#lv!vVmZXRqumQh6Ja-Y0EgBEymJy%#41QMR5Fp-1zia2J9>(0
      z3-no7&q_{4z21#K7OQ$#5mPX~X=;NfV$Ln1{x7xUryrrYM>dyZoZI(xWZRm7yV?mt
      zdzFdf7iIyN^SUEFka~$+4j*Y+10j}1;~bX$Pqn7XIqv05&^Rw@kaYJ
      z1_G!f(hOqqpi6(@JL>209o=E-(9Susp>G-70-^89lJk%II4?t#ruc*cIc-KEy_9nE
      z|0k@nct~g6tyqAfLqx`q>pgcQuT-NecNm4eTjLT)?z)?YZ+7;TW6tyK&EwaH+ljkf!`0J3$Q-BX6PYGqn)#}3aN63+~)Rl3(QJojT+0Z4^8iv-0S4%T>sr<_Gn}U8~J?UQC4SW8V(t4A5Lz*%Wiui
      zy~Bg^*&Y`&EG*Wu@)Y8}w(rlJD`{cE;h>a>i)1uWQ3ISP{0Z}qW6ny4CaEUMN~L1Y
      zD=T-c5GhK9TP@4n>Q1J=(-*#F9GjqqZmRkj3mxMfXC9`%(;kp3N3S4t0p(RP?I`~2
      zbN+W?q;iVi;0QBt3mUwiCSs~2rsDIB`c+ByVcM@3-3$YNnJ$rw5wVoLojV+QtcxK}
      z-fNfK!eJJWq$>TGg3}v?gG6D8fDmM^O;-1IecjZl?&6@n0_3&ga2|J9|%$rCT-)as+RE#_lFu@u(o3lhqI?N>l+T-
      z>haq88<|I|a?w6o5(0XWEV3pum&s_S{G0RisaVo4@kd4qWHO$T_4Ct|!2_mpD*5|9
      zvFQt0kmBFxQHP8>r1E0?Zz3BBGZ0>tcOvR@kaf$Jtq3!UT*B(g(ntDS&F}&-Rq6zW
      zm8k^08%Hs{j1)7GZO7alPVBQ3J2iBdo;+Imh*maH!rT23ms&Tj
      zDZR*Kchw3r9B>L;Y7|4KoUoH2`#zigR^sNwB7eCF?xCUlkZj#>{@I`W3%CA0TR!DP
      z{9-+bU8_Ei0hUF49_Onqfbv*gP7vD~eHN3eZ2UfxyOqU!CR-~@vH4kgc;AfdU!9N5
      z7voLgToo;u&CZy_JcDxPP|t$fJH_-iE?(`l{y?&76Q?Zlde@#L+4nz<_NKe|hjs6d
      zB+$uj#)LXH&a}-&=i@qx@Exk2*%u5yK!5w2laq(agSY@Ao0%q?d(BKb)t;Ks8{~INFhr3)wlc(rjQhHCpH=&#z#@xt4dmgc&
      zHpV6zqpt{Qr3h5OuGIwLU^nLqM;>qWg5vu)dbZRe#+t+W8LXxeJU`sr-#XZ9l*^yQ
      zSK`sicTdE!SQG6fvG!zb_0c2oK&(D|w6^-qH*4RnoEf⋙dALAvsa~mwKn}q?NMy
      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�QdRnhQHm0m>sd5k-tN~dn_b}+l>{!rTY-`|3 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°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%0A(+PAin7+bjQ6s%a56CoCMXdLj8)abdp8P53I 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

      VN2~>h?L#xGZqQOy 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

      n~4=m*3zOAi$CTk3sOt-NO@AiT&6B5 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%0ARP?!5U|4G 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 z�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®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%0AO?vlMB9R?;;9!X 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�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⪖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

        _l}xt-QD#+ZX@&XY-y~I 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.13) + + IF (NOT LIBJSON-C_FOUND) + FETCHCONTENT_DECLARE(libjson-c + URL file://${CMAKE_SOURCE_DIR}/depend/json-c-0.16.tar.gz + URL_MD5 a549a833f886d427148fb5710c3e613e + ) + ENDIF () +ENDIF () +IF (NOT LIBUV_FOUND) + FETCHCONTENT_DECLARE(libuv + URL file://${CMAKE_SOURCE_DIR}/depend/libuv-1.49.2.tar.gz + URL_MD5 b6aa4c4d5a8be9822a50ee9b6cfd00d2) +ENDIF () + +IF (NOT LIBCONFIG_FOUND) + FETCHCONTENT_DECLARE(libconfig + URL file://${CMAKE_SOURCE_DIR}/depend/libconfig-1.7.3.tar.gz + URL_MD5 8f96910eee26118258ac8d4cd128a0b2) +ENDIF () + +IF (LIBZLOG STREQUAL "LIBZLOG-NOTFOUND") + FETCHCONTENT_DECLARE(zlog + URL file://${CMAKE_SOURCE_DIR}/depend/zlog-1.2.18.tar.gz + URL_MD5 5f99a30e61af3b62db4986e277f69cf9) +ENDIF () + +IF (NOT LIBUV_FOUND) + FETCHCONTENT_MAKEAVAILABLE(libuv) +ENDIF () + +IF (NOT LIBCONFIG_FOUND) + FETCHCONTENT_MAKEAVAILABLE(libconfig) +ENDIF () + +IF (LIBZLOG STREQUAL "LIBZLOG-NOTFOUND") + FETCHCONTENT_MAKEAVAILABLE(zlog) +ENDIF () + +IF (USED_JSON_VALIDATE) + IF (NOT LIBJSON-C_FOUND) + FETCHCONTENT_MAKEAVAILABLE(libjson-c) + ENDIF () +ENDIF () +IF (NOT LIBUV_FOUND) + MESSAGE(STATUS "libuv not found, will be used source code to build it ...") + FETCHCONTENT_GETPROPERTIES(libuv) + IF (NOT libuv_POPULATED) + FETCHCONTENT_POPULATE(libuv) + ADD_SUBDIRECTORY(${libuv_SOURCE_DIR} ${libuv_BINARY_DIR}) + ENDIF () + INCLUDE_DIRECTORIES(${libuv_SOURCE_DIR}/include) + LIST(APPEND COMMON_LIBS "uv_a") +ELSE () + MESSAGE(STATUS "libuv found ${LIBUV_VERSION} at ${LIBUV_LIBRARY_DIRS}") + LIST(APPEND COMMON_LIBS "${LIBUV_LDFLAGS}") +ENDIF () + +IF (NOT LIBCONFIG_FOUND) + MESSAGE(STATUS "libconfig not found, will be used source code to build it ...") + FETCHCONTENT_GETPROPERTIES(libconfig) + IF (NOT libconfig_POPULATED) + FETCHCONTENT_POPULATE(libconfig) + ADD_SUBDIRECTORY(${libconfig_SOURCE_DIR} ${libconfig_BINARY_DIR}) + ENDIF () + INCLUDE_DIRECTORIES(${libconfig_SOURCE_DIR}/lib) + LIST(APPEND COMMON_LIBS "config") +ELSE () + MESSAGE(STATUS "libconfig found ${LIBCONFIG_VERSION} at ${LIBCONFIG_LIBRARY_DIRS}") + LIST(APPEND COMMON_LIBS "${LIBCONFIG_LDFLAGS}") +ENDIF () + +IF (LIBZLOG STREQUAL "LIBZLOG-NOTFOUND") + MESSAGE(STATUS "zlog not found, will be used source code to build it ...") + FETCHCONTENT_GETPROPERTIES(zlog) + IF (NOT zlog_POPULATED) + FETCHCONTENT_POPULATE(zlog) + ADD_SUBDIRECTORY(${zlog_SOURCE_DIR} ${zlog_BINARY_DIR}) + ENDIF () + INCLUDE_DIRECTORIES(${zlog_SOURCE_DIR}/src) + LIST(APPEND COMMON_LIBS "zlog") +ELSE () + MESSAGE(STATUS "zlog found of ${LIBZLOG}") + LIST(APPEND COMMON_LIBS "${LIBZLOG}") +ENDIF () + +IF (USED_JSON_VALIDATE) + IF (NOT LIBJSON-C_FOUND) + MESSAGE(STATUS "json-c not found, will be used source code to build it ...") + FETCHCONTENT_GETPROPERTIES(libjson-c) + IF (NOT libjson-c_POPULATED) + FETCHCONTENT_POPULATE(libjson-c) + ADD_SUBDIRECTORY(${libjson-c_SOURCE_DIR} ${libjson-c_BINARY_DIR}) + ENDIF () + EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E make_directory "json-c" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${libjson-c_BINARY_DIR}/json.h" "./json-c/" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${libjson-c_BINARY_DIR}/json_config.h" "." + WORKING_DIRECTORY ${libjson-c_SOURCE_DIR}) + INCLUDE_DIRECTORIES(${libjson-c_SOURCE_DIR}) + LIST(APPEND COMMON_LIBS "json-c") + ELSE () + MESSAGE(STATUS "json-c found ${LIBJSON-C_VERSION} at ${LIBJSON-C_LIBRARY_DIRS}") + LIST(APPEND COMMON_LIBS "${LIBJSON-C_LDFLAGS}") + ENDIF () +ENDIF () \ No newline at end of file diff --git a/depend/zlog-1.2.18.tar.gz b/depend/zlog-1.2.18.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..949e7994a7d5b7380535bd38ecdf2cca73c907fb GIT binary patch literal 130997 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", "\tSpecify the configuration directory path"); + arg_str_t *key1 = arg_str0("k", "key", "Key", "\tSpecify the configuration file cryptographic key."); + arg_lit_t *helpCmd1 = arg_lit0("h", "help", NULL); + arg_end_t *end1 = arg_end(20); + void *pArgTbl1[] = {cmd1, cfgfile, cfgdir, key1, helpCmd1, end1}; + int errCode1 = 0; + + arg_rex_t *cmd2 = arg_rex1(NULL, NULL, "if", NULL, REG_ICASE, NULL); + arg_str_t *server = arg_str1("s", "server", "", "\tMessage queue server address."); + arg_str_t *type = arg_str1("t", "command", "", "\tMessage queue command."); + arg_str_t *key2 = arg_str1("k", "key", "", "\tSystem predefine command \033[1;7mKEY\033[0m value."); + arg_str_t *value2 = arg_str0("v", "value", "value", "\tValue of key when command is need"); + arg_lit_t *helpCmd2 = arg_lit0("h", "help", NULL); + arg_end_t *end2 = arg_end(20); + void *pArgTbl2[] = {cmd2, server, type, key2, value2, helpCmd2, end2}; + int errCode2 = 0; + + arg_rex_t *cmd3 = arg_rex1(NULL, NULL, "base64", NULL, REG_ICASE, NULL); + arg_lit_t *operate3 = arg_litn("o", "operate", 0, 1, "\tBase64 decode, otherwise mean base64 encode"); + arg_str_t *value3 = arg_str0(NULL, NULL, "", NULL); + arg_lit_t *helpCmd3 = arg_lit0("h", "help", NULL); + arg_end_t *end3 = arg_end(20); + void *pArgTbl3[] = {cmd3, operate3, value3, helpCmd3, end3}; + int errCode3 = 0; + + arg_rex_t *cmd4 = arg_rex1(NULL, NULL, "hash", NULL, REG_ICASE, NULL); + arg_file_t *file4 = arg_file0(NULL, NULL, "", NULL); + arg_str_t *alg4 = arg_str0("a", "algorithms", "algorithms", "\tChose \033[1;7mHASH\033[0m algorithms."); + arg_lit_t *helpCmd4 = arg_lit0("h", "help", NULL); + arg_end_t *end4 = arg_end(20); + void *pArgTbl4[] = {cmd4, + alg4, + file4, + arg_rem(NULL, "\tSupport algorithms:"), + arg_rem(NULL, "\t \033[4mmd5\033[0m: file md5 value"), + arg_rem(NULL, "\t \033[4msha1\033[0m: file sha1 value"), + arg_rem(NULL, "\t \033[4msha256\033[0m: file sha256 value"), + helpCmd4, + end4}; + int errCode4 = 0; + + arg_rex_t *cmd5 = arg_rex1(NULL, NULL, "cipher", NULL, REG_ICASE, NULL); + arg_lit_t *operate5 = arg_litn("e", "encrypt", 0, 1, "\tEncryption, Ignore means decryption."); + arg_str_t *alg5 = arg_str0("a", "algorithms", "algorithms", "\tChose \033[1;7mCryptography\033[0m algorithms."); + arg_str_t *key5 = arg_str0("k", "key", "Key", "\tCryptographic key"); + arg_str_t *value5 = arg_str0(NULL, NULL, "", NULL); + arg_lit_t *helpCmd5 = arg_lit0("h", "help", NULL); + arg_end_t *end5 = arg_end(20); + void *pArgTbl5[] = {cmd5, + operate5, + alg5, + key5, + value5, + arg_rem(NULL, "\tSupport algorithms:"), + arg_rem(NULL, "\t \033[4m3des_ecb\033[0m: 3DES ECB with PKCS7 padding"), + arg_rem(NULL, "\t \033[4m3des_cbc\033[0m: 3DES CBC with PKCS7 padding"), + arg_rem(NULL, "\t \033[4m3des_ofb\033[0m: 3DES OFB with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes128_ecb\033[0m: 128 bit AES ECB with PKCS7 padding"), + arg_rem(NULL, + "\t \033[4maes128_ecb_sha1\033[0m: 128 bit AES ECB and used SHA1 key with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes128_cbc\033[0m: 128 bit AES CBC with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes128_ofb\033[0m: 128 bit AES OFB with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes192_ecb\033[0m: 192 bit AES ECB with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes192_cbc\033[0m: 192 bit AES CBC with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes192_ofb\033[0m: 192 bit AES OFB with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes256_ecb\033[0m: 256 bit AES ECB with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes256_cbc\033[0m: 256 bit AES CBC with PKCS7 padding"), + arg_rem(NULL, "\t \033[4maes256_ofb\033[0m: 256 bit AES OFB with PKCS7 padding"), + helpCmd5, + end5}; + int errCode5 = 0; + + arg_rex_t *cmd6 = arg_rex1(NULL, NULL, "config", NULL, REG_ICASE, NULL); + arg_str_t *keyGen = arg_str0("k", "keygen", "", "\tCreate configuration file cryptographic key."); + arg_lit_t *helpCmd6 = arg_lit0("h", "help", NULL); + arg_end_t *end6 = arg_end(20); + void *pArgTbl6[] = {cmd6, keyGen, helpCmd6, end6}; + int errCode6 = 0; + +#ifdef DHCPD_ON + arg_rex_t *cmd8 = arg_rex1(NULL, NULL, "dhcpd", NULL, REG_ICASE, NULL); + arg_file_t *cfgfile8 = arg_filen("c", "config", "[file]", 0, 1, "\tSpecify the current application configuration file path"); + arg_file_t *cfgdir8 = arg_file1("d", "directory", "", "\tSpecify the configuration directory path"); + arg_str_t *ifname = arg_str1("n", "nic", "", "\tSpecify the dhcpd service network interface name."); + arg_str_t *key8 = arg_str0("k", "key", "Key", "\tSpecify the configuration file cryptographic key."); + arg_lit_t *helpCmd8 = arg_lit0("h", "help", NULL); + arg_end_t *end8 = arg_end(20); + void *pArgTbl8[] = {cmd8, cfgfile8, cfgdir8,ifname, key8, helpCmd8, end8}; + int errCode8 = 0; +#endif + +#ifdef OPENDHCPD_ON + arg_rex_t *cmd7 = arg_rex1(NULL, NULL, "dhcpd", NULL, REG_ICASE, NULL); + arg_lit_t *operate7 = arg_lit0("m", "mode", "\tService works on verbatim mode."); + arg_file_t *cfgfile7 = arg_filen("c", "config", "[file]", 0, 1, "\tSpecify the current application configuration file path"); + arg_file_t *cfgdir7 = arg_file1("d", "directory", "", "\tSpecify the configuration directory path"); + arg_str_t *key7 = arg_str0("k", "key", "Key", "\tSpecify the configuration file cryptographic key."); + arg_file_t *inifile = arg_filen("i", "ini", "", 0, 1, "\tSpecify the dhcpd service configuration file path"); + arg_file_t *statfile = arg_filen("s", "state", "", 0, 1, "\tSpecify the dhcpd service state cache file path"); + arg_str_t *ifname = arg_str1("n", "nic", "", "\tSpecify the dhcpd service network interface name."); + arg_int_t *vni = arg_intn("v", "vni", "", 0, 1, "\tSpecify user vxlan vni id."); + arg_lit_t *helpCmd7 = arg_lit0("h", "help", NULL); + arg_end_t *end7 = arg_end(20); + void *pArgTbl7[] = {cmd7, operate7, cfgfile7, cfgdir7, inifile, statfile, ifname, vni, key7, helpCmd7, end7}; + int errCode7 = 0; +#endif + + /***************************************************************** + * 系统帮助参数定义 + ******************************************************************/ + arg_lit_t *help_ = arg_lit0("h", "help", "\tDisplay this help and exit"); + arg_lit_t *version_ = arg_lit0("v", "version", "\tDisplay application version information and exit"); + arg_end_t *end_ = arg_end(20); + void *pArgTbl_[] = {version_, help_, end_}; + int errCode_ = 0; + + ARG_TBL_INFO argTblInfo[] = { + {pArgTbl1, ARRAY_SIZE(pArgTbl1), &errCode1, on_cmd1, cmdn_help, + "\r \033[1;4;36mstart\033[0m: \033[1mRun agent service normally.\033[0m\n"}, +#ifdef OPENDHCPD_ON + {pArgTbl7, ARRAY_SIZE(pArgTbl7), &errCode7, on_cmd7, cmdn_help, "\n \033[1;4;36mdhcpd\033[0m: \033[1mRun DHCP service normally.\033[0m\n"}, +#endif +#ifdef DHCPD_ON + {pArgTbl8, ARRAY_SIZE(pArgTbl8), &errCode8, on_cmd8, cmdn_help, + "\n \033[1;4;36mdhcpd\033[0m: \033[1mRun DHCP service normally.\033[0m\n"}, +#endif + {pArgTbl2, ARRAY_SIZE(pArgTbl2), &errCode2, on_cmd2, cmd2_help, + "\n \033[1;4;36mif\033[0m: \033[1mRun agent interface tools.\033[0m\n"}, + {pArgTbl3, ARRAY_SIZE(pArgTbl3), &errCode3, on_cmd3, cmdn_help, + "\n \033[1;4;36mbase64\033[0m: \033[1mString base64 encode/decode.\033[0m\n"}, + {pArgTbl4, ARRAY_SIZE(pArgTbl4), &errCode4, on_cmd4, cmdn_help, + "\n \033[1;4;36mhash\033[0m: \033[1mCalculate file's hash value.\033[0m\n"}, + {pArgTbl5, ARRAY_SIZE(pArgTbl5), &errCode5, on_cmd5, cmdn_help, + "\n \033[1;4;36mcipher\033[0m: \033[1mSymmetric cryptography for string.\033[0m\n"}, + {pArgTbl6, ARRAY_SIZE(pArgTbl6), &errCode6, on_cmd6, cmdn_help, + "\n \033[1;4;36mconfig\033[0m: \033[1mConfiguration file tools.\033[0m\n"}, + {pArgTbl_, ARRAY_SIZE(pArgTbl_), &errCode_, on_cmd_, NULL, NULL}, + }; + + // clang-format on + + g_pArgTbl = argTblInfo; + g_nArgTbl = ARRAY_SIZE(argTblInfo); + + for (i = 0; i < g_nArgTbl; i++) { + if (arg_nullcheck(argTblInfo[i].argTbl) != 0) { + printf("%s insufficient memory\n", pAppName); + return -ERR_SYS_INIT; + } + } + + cfgfile->filename[0] = "-"; + + for (i = 0; i < g_nArgTbl; i++) { + *argTblInfo[i].pErrCode = arg_parse(argc, argv, argTblInfo[i].argTbl); + } + + for (i = 0; i < g_nArgTbl; i++) { + PARG_TBL_INFO pArg = &argTblInfo[i]; + if (*pArg->pErrCode == 0 && pArg->pCmd) { + + ret = pArg->pCmd(pArg->argTbl, pAppName, pArg); + + if (ret != ERR_SUCCESS && ret != ERR_MENU_EXIT) { + if (pArg->pHelp) { + pArg->pHelp(pArg->argTbl, pAppName, NULL); + } + } else { + flag = TRUE; + } + } + } + + if (flag == FALSE) { + for (i = 0; i < g_nArgTbl - 1; i++) { + PARG_TBL_INFO pArg = &argTblInfo[i]; + + if (*pArg->pErrCode != 0) { + if (get_reg_cmd(pArg->argTbl) > 0 && pArg->pHelp) { + int help = get_help_cmd(pArg->argTbl, pArg)->count; + pArg->pHelp(pArg->argTbl, pAppName, help > 0 ? NULL : get_arg_err(pArg->argTbl, pArg)); + flag = TRUE; + break; + } + } + } + + if (flag == FALSE) { + show_help(pAppName); + } + } + + for (i = 0; i < g_nArgTbl; i++) { + arg_freetable(argTblInfo[i].argTbl, argTblInfo[i].nArgItem); + } + + return ret; +} diff --git a/srcs/libs/configure/config.c b/srcs/libs/configure/config.c new file mode 100644 index 0000000..04cf790 --- /dev/null +++ b/srcs/libs/configure/config.c @@ -0,0 +1,786 @@ +// +// Created by xajhu on 2021/7/30 0030. +// +#include +#include +#include +#include +#include + +#include "uthash/uthash.h" +#include "config.h" +#include "misc.h" +#include "user_errno.h" +#include "crypto.h" +#include "hardware.h" +#include "zlog_module.h" +#include "common.h" + +typedef struct { + CONFIG_ITEM_ID cfgId; + const char *cfgPath; + CONFIG_VALUE_TYPE valType; + const char *defValue; + const char *readme; + const char *pStrId; +} CFG_ITEM, *PCFG_ITEM; + +#define CFG_INT_VALUE(p) (p->value.longValue) +#define CFG_BOOL_VALUE(p) (p->value.longValue == FALSE ? FALSE : TRUE) +#define CFG_FLOAT_VALUE(p) (p->value.floatValue) +#define CFG_STRING_VALUE(p) (p->value.strValue) +#define ENC_HEAD ("AES@") + +typedef union { + long long longValue; + char *strValue; + long double floatValue; + c_vector array; +} CFG_VALUE, *PCFG_VALUE; + +typedef struct { + CONFIG_ITEM_ID cfgId; + const char *pcfgKey; + CONFIG_VALUE_TYPE valType; + const char *defaultValue; + int isChanged; + const char *pMessage; + const char *pStrId; + CFG_VALUE value; + + UT_hash_handle hh; +} CONFIG_ITEM, *PCONFIG_ITEM; + +static config_t g_cfgContent; +static const char *g_cfgFilePath; +static const char *g_pCfgKey = NULL; +PCONFIG_ITEM g_pConfigItem = NULL; + +#define DEF_CFG_ITEM(id, key, type, defVal, desc) \ + { .cfgId = (id), .cfgPath = (key), .valType = (type), .defValue = (defVal), .readme = (desc), .pStrId = (#id) } + +// clang-format off +static CFG_ITEM g_cfgItem[] = { + DEF_CFG_ITEM(CFG_DIRECTORY, "system.config_file_path", VAL_STR, ".", "Configuration files location path"), + DEF_CFG_ITEM(CFG_CURL_CA_PATH, "system.ssl_ca_file_path", VAL_STR, "~/.ssh/ca.crt", "Libcurl access HTTPS CA File"), + DEF_CFG_ITEM(CFG_BANNER_SHOW, "system.show_banner", VAL_BOOL, "1", "Enable/Disable show banner"), + DEF_CFG_ITEM(CFG_HARDWARE_WATCH, "system.system_info_watch", VAL_BOOL, "1", "Monitor cpu, memory, disk, fan, temperature ..."), + DEF_CFG_ITEM(CFG_HARDWARE_REFRESH, "system.system_info_refresh", VAL_INT, "10", "Monitor hardware information upgrade frequency"), + // Agent 配置 + DEF_CFG_ITEM(CFG_AGENT_IPTV_POST_URL, "agent.iptv_report_url", VAL_STR, "", "IPTV report URL"), + DEF_CFG_ITEM(CFG_AGENT_MONITER_URL, "agent.moniter_rep_url", VAL_STR, "", "vCPE moniter report URL"), + /* 系统监控设备相配置 */ + DEF_CFG_ITEM(CFG_WATCH_CPU, "watch_params.cpu", VAL_BOOL, "1", "Monitor cpu information"), + DEF_CFG_ITEM(CFG_WATCH_MEMORY, "watch_params.memory", VAL_BOOL, "1", "Monitor memory information"), + DEF_CFG_ITEM(CFG_WATCH_DISK, "watch_params.disk", VAL_BOOL, "1", "Monitor disk partition information"), + DEF_CFG_ITEM(CFG_WATCH_SENSOR, "watch_params.sensor", VAL_BOOL, "1", "Sensor information refresh frequency"), +/* 数据库相配置 */ +/* Redis配置 */ +#ifdef USED_REDIS + DEF_CFG_ITEM(CFG_DB_REDIS_SERVER, "database.redis_server", VAL_STR, "127.0.0.1", "Redis database server ip address"), + DEF_CFG_ITEM(CFG_DB_REDIS_PORT, "database.redis_port", VAL_INT, "6379", "Redis database server port"), + DEF_CFG_ITEM(CFG_DB_REDIS_PASSWD, "database.redis_passwd", VAL_STR, "", "Redis database server password"), +#endif +/* MySQL配置 */ +#ifdef USED_MYSQL + DEF_CFG_ITEM(CFG_DB_MYSQL_SERVER, "database.mysql_server", VAL_STR, "127.0.0.1", "MySQL database server ip address"), + DEF_CFG_ITEM(CFG_DB_MYSQL_PORT, "database.mysql_port", VAL_INT, "3306", "MySQL database server port"), + DEF_CFG_ITEM(CFG_DB_MYSQL_USER, "database.mysql_user", VAL_STR, "", "MySQL database user name"), + DEF_CFG_ITEM(CFG_DB_MYSQL_PASSWD, "database.mysql_passwd", VAL_STR, "", "MySQL database server password"), + DEF_CFG_ITEM(CFG_DB_MYSQL_DB_NAME, "database.mysql_database", VAL_STR, ".main", "MySQL database used"), +#endif +/* SQLite3配置 */ +#ifdef SQLITE_ON + DEF_CFG_ITEM(CFG_DB_SQLITE_DB_NAME, "database.sqlite_dbname", VAL_STR, "", "SQLite3 database file name"), +#ifdef SQLITE_CRYPTO_ON + DEF_CFG_ITEM(CFG_DB_SQLITE_PASSWD, "database.sqlite_passwd", VAL_STR, "", "SQLite3 database password"), +#endif +#endif +#ifdef ZEROMQ_ON + /* 消息队列相配置 */ + /* ZeroMq配置 */ + DEF_CFG_ITEM(CFG_MQ_SVR_PORT, "zero_mq.svr_port", VAL_INT, "6278", "ZeroMQ server port"), + DEF_CFG_ITEM(CFG_MQ_DATA_PATH, "zero_mq.agent_addr", VAL_STR, "ipc:///tmp/msg_fifo0", "ZeroMQ Agent data path"), +#endif + /* vxLan 隧道配置 */ + DEF_CFG_ITEM(CFG_VXLAN_NIC_NAME, "vxlan_wan.nic", VAL_STR, "", "Network card name to send data"), + DEF_CFG_ITEM(CFG_VXLAN_SUPPORT, "vxlan_wan.enable", VAL_BOOL, "1", "Is support vxLan tune"), + DEF_CFG_ITEM(CFG_VXLAN_PEER_IP, "vxlan_wan.peer_ip", VAL_STR, "", "vxLan peer ip address"), + DEF_CFG_ITEM(CFG_VXLAN_PEER_MAC, "vxlan_wan.peer_mac", VAL_STR, "", "vxLan peer mac address"), + DEF_CFG_ITEM(CFG_VXLAN_PKG_FILTER, "vxlan_wan.pkg_filter", VAL_STR, "", "vxLan package filter"), + /*HTTP Server 配置*/ +#ifdef HTTPSERVER_ON + DEF_CFG_ITEM(CFG_HTTP_SVR_URI, "http_svr.uri", VAL_STR, "http://0.0.0.0:6789", "Network address to listen on"), +#endif + DEF_CFG_ITEM(CFG_PROTO_CRYPTO, "protocol.crypto_type", VAL_INT, "0", "Protocol crypto_cipher algorithm"), + DEF_CFG_ITEM(CFG_PROTO_CRYPTO_KEY, "protocol.crypto_key", VAL_STR, "", "Protocol crypto_cipher keys"), +#ifdef DHCPD_ON + // 配置DHCP服务器 + DEF_CFG_ITEM(CFG_DHCP_LEASE_TIME, "dhcp_server.lease_time", VAL_INT, "36000", "DHCP server lease time"), + DEF_CFG_ITEM(CFG_DHCP_LISTEN_ON, "dhcp_server.listen_on", VAL_ARRAY_STR, "", "DHCP listen interface"), + DEF_CFG_ITEM(CFG_DHCP_REPLICATION_SVR, "dhcp_server.replication", VAL_ARRAY_STR, "", "DHCP replication server configure"), + DEF_CFG_ITEM(CFG_DHCP_RANGE_SET, "dhcp_server.range_set", VAL_ARRAY_OBJ, "", "DHCP IP pool"), + DEF_CFG_ITEM(CFG_DHCP_NET_FILTER, "dhcp_server.net_filter", VAL_STR, "", "DHCP packet filter"), + DEF_CFG_ITEM(CFG_DHCP_MAC_FILTER, "dhcp_server.mac_filter", VAL_ARRAY_STR, "", "DHCP client MAC address black list"), + DEF_CFG_ITEM(CFG_DHCP_NIC_NAME, "dhcp_server.nic", VAL_STR, "ens192", "DHCP server network interface name"), +#endif +}; // clang-format on + +static int cfg_is_upgrade(PCONFIG_ITEM pItem) { + + if (pItem->isChanged) { + pItem->isChanged = FALSE; + return TRUE; + } + + return FALSE; +} + +static const char *load_string_value(const char *pKeyName) { + const char *pCfgVal; + if (config_lookup_string(&g_cfgContent, pKeyName, &pCfgVal) != CONFIG_TRUE) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "No {%s} setting in configuration file.\n", pKeyName); + return NULL; + } + + if (strncmp(ENC_HEAD, pCfgVal, strlen(ENC_HEAD)) == 0) { + if (g_pCfgKey == NULL || strlen(g_pCfgKey) == 0) { + return NULL; + } else { + const char *pKey = get_config_key(g_pCfgKey); + int bufSize, outSize; + unsigned char *buf; + unsigned char *pBuf = base64_decode(&pCfgVal[strlen(ENC_HEAD)], (unsigned int *)&bufSize); + + if (pBuf == NULL || bufSize <= 0) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "{%s} setting [%s] maybe a encryption message, base64 decode error.\n", + pKeyName, pCfgVal); + return NULL; + } + + if (symmetric_decrypto(AES128_ECB_PKCS7PADDING_SHA1PRNG, pBuf, bufSize, &buf, &outSize, pKey) != + ERR_SUCCESS) { + free((void *)pKey); + free(pBuf); + return NULL; + } + + free(pBuf); + free((void *)pKey); + buf[outSize] = 0; + + return (const char *)buf; + } + } else { + return strdup(pCfgVal); + } +} + +static int load_boolean_value(const char *pKeyName) { + int val; + if (config_lookup_bool(&g_cfgContent, pKeyName, &val) != CONFIG_TRUE) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "No {%s} setting in configuration file.\n", pKeyName); + return DEFAULT_INTEGRAL_ERR_VALUE; + } + + return val; +} + +static long long int load_integral_value(const char *pKeyName) { + long long val; + if (config_lookup_int64(&g_cfgContent, pKeyName, &val) != CONFIG_TRUE) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "No {%s} setting in configuration file.\n", pKeyName); + return DEFAULT_INTEGRAL_ERR_VALUE; + } + + return val; +} + +static double load_float_value(const char *pKeyName) { + double val; + if (config_lookup_float(&g_cfgContent, pKeyName, &val) != CONFIG_TRUE) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "No {%s} setting in configuration file.\n", pKeyName); + return DEFAULT_INTEGRAL_ERR_VALUE; + } + + return val; +} + +static int cmp_str(const void *a, const void *b) { + return strcmp((const char *)a, (const char *)b); +} + +static int load_array_str(const char *pKeyName, PCONFIG_ITEM pValue) { + int i; + config_setting_t *pItem = config_lookup(&g_cfgContent, pKeyName); + + if (pItem) { + for (i = 0; i < config_setting_length(pItem); i++) { + const char *pVal = config_setting_get_string_elem(pItem, i); + if (pVal) { + zvect_index idx = 0; + if (!vect_bsearch(pValue->value.array, pVal, cmp_str, &idx)) { + vect_push(pValue->value.array, pVal); + pValue->isChanged = TRUE; + } + } + } + + vect_shrink(pValue->value.array); + return ERR_SUCCESS; + } + + return -ERR_ITEM_UNEXISTS; +} + +static int cmp_dhcp_obj(const void *a, const void *b) { + POBJ_DHCP_RNG pV1 = (POBJ_DHCP_RNG)a; + POBJ_DHCP_RNG pV2 = (POBJ_DHCP_RNG)b; + + if (strcmp(pV1->rangAddr, pV2->rangAddr) == 0 && strcmp(pV1->subnet, pV2->subnet) == 0 && + strcmp(pV1->dnsSvr, pV2->dnsSvr) == 0 && strcmp(pV1->gateway, pV2->gateway) == 0 && pV1->lease == pV2->lease) { + return 0; + } + + return -1; +} + +static int load_array_obj(const char *pKeyName, PCONFIG_ITEM pValue) { + int i; + config_setting_t *pItem = config_lookup(&g_cfgContent, pKeyName); + + if (!pItem) { + return -ERR_ITEM_UNEXISTS; + } + for (i = 0; i < config_setting_length(pItem); i++) { + OBJ_DHCP_RNG v, k; + config_setting_t *pObj = config_setting_get_elem(pItem, i); + + switch (pValue->cfgId) { +#if DHCPD_ON + case CFG_DHCP_RANGE_SET: { + zvect_index idx = -1; + const char *rangAddr, *subnet, *dnsSvr, *gateway; + memset(&v, 0, sizeof(OBJ_DHCP_RNG)); + + if (config_setting_lookup_string(pObj, "dhcp_range", &rangAddr)) { + strcpy(v.rangAddr, rangAddr); + } + + if (config_setting_lookup_string(pObj, "subnet_mask", &subnet)) { + strcpy(v.subnet, subnet); + } + + if (config_setting_lookup_string(pObj, "domain_server", &dnsSvr)) { + strcpy(v.dnsSvr, dnsSvr); + } + + if (config_setting_lookup_string(pObj, "gateway", &gateway)) { + strcpy(v.gateway, gateway); + } + + if (!config_setting_lookup_int(pObj, "lease_time", (int *)&v.lease)) { + v.lease = 0xFFFFFFFF; + } + + if (!config_setting_lookup_int(pObj, "vni", (int *)&v.vni)) { + v.vni = 0; + } + + if (!config_setting_lookup_int(pObj, "gid", (int *)&v.gid)) { + v.gid = 0; + } + + if (!vect_bsearch(pValue->value.array, &v, cmp_dhcp_obj, &idx)) { + memcpy(&k, &v, sizeof(OBJ_DHCP_RNG)); + vect_push(pValue->value.array, &k); + pValue->isChanged = TRUE; + } + } break; +#endif + default: + break; + } + } + + return ERR_SUCCESS; +} + +static int setConfigItemValue(PCONFIG_ITEM pItem, const char *pValue) { + errno = 0; + + if (pItem->valType == VAL_STR) { + if (pItem->value.strValue != NULL) { + free(pItem->value.strValue); + } + + pItem->value.strValue = strdup(pValue); + } else if (pItem->valType == VAL_INT || pItem->valType == VAL_BOOL) { + char *pOver; + long long val = strtoll(pValue, &pOver, 10); + + if ((pOver != NULL && strlen(pOver)) || errno != 0) { + return -ERR_STRING_TO_NUMBER; + } + + pItem->value.longValue = val; + } else if (pItem->valType == VAL_FLOAT) { + char *pOver; + long double val = strtold(pValue, &pOver); + + if ((pOver != NULL && strlen(pOver)) || errno != 0) { + return -ERR_STRING_TO_NUMBER; + } + + pItem->value.floatValue = val; + } else if (pItem->valType == VAL_ARRAY_STR) { + pItem->value.array = vect_create(128, 512, ZV_SEC_WIPE); + } else if (pItem->valType == VAL_ARRAY_OBJ) { + pItem->value.array = vect_create(128, sizeof(OBJ_DHCP_RNG), ZV_SEC_WIPE); + } else { + return -ERR_UN_SUPPORT; + } + + return ERR_SUCCESS; +} + +static int add_new_cfg_item(CONFIG_ITEM_ID id, + const char *pKey, + CONFIG_VALUE_TYPE valType, + const char *pDefVal, + const char *pStrId, + const char *pDesc) { + PCONFIG_ITEM pItem; + int ret; + + HASH_FIND_INT(g_pConfigItem, &id, pItem); + + if (pItem != NULL) { + return -ERR_ITEM_EXISTS; + } + + pItem = (PCONFIG_ITEM)malloc(sizeof(CONFIG_ITEM)); + + if (pItem == NULL) { + return -ERR_MALLOC_MEMORY; + } + + memset(pItem, 0, sizeof(CONFIG_ITEM)); + + pItem->cfgId = id; + pItem->pcfgKey = pKey; + pItem->valType = valType; + pItem->defaultValue = pDefVal; + pItem->pMessage = pDesc; + pItem->pStrId = pStrId; + + ret = setConfigItemValue(pItem, pItem->defaultValue); + + if (ret != ERR_SUCCESS) { + free(pItem); + return ret; + } + + HASH_ADD_INT(g_pConfigItem, cfgId, pItem); + + return ERR_SUCCESS; +} + +static PCFG_VALUE cfg_get_value(CONFIG_ITEM_ID id) { + PCONFIG_ITEM pItem; + + HASH_FIND_INT(g_pConfigItem, &id, pItem); + + if (pItem != NULL) { + return &pItem->value; + } + + return NULL; +} + +static void refreshCfgFileCb() { + PCONFIG_ITEM pItem, pTmp; + int cfgUpgrade = FALSE; + + if (!config_read_file(&g_cfgContent, g_cfgFilePath)) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "%s:%d - %s\n", config_error_file(&g_cfgContent), + config_error_line(&g_cfgContent), config_error_text(&g_cfgContent)); + return; + } + + HASH_ITER(hh, g_pConfigItem, pItem, pTmp) { + char *pStr; + long long iVal; + double fVal; + sds realKey = sdsnew("application."); + realKey = sdscat(realKey, pItem->pcfgKey); + + switch (pItem->valType) { + case VAL_STR: + pStr = (char *)load_string_value(realKey); + if (pStr) { + if (strcmp(pItem->value.strValue, pStr) != 0) { + if (pItem->value.strValue != NULL) { + free(pItem->value.strValue); + } + + pItem->value.strValue = strdup(pStr); + pItem->isChanged = TRUE; + } + + free(pStr); + } + break; + case VAL_BOOL: + iVal = load_boolean_value(realKey); + + if (iVal != DEFAULT_INTEGRAL_ERR_VALUE) { + if (pItem->value.longValue != iVal) { + pItem->value.longValue = iVal; + pItem->isChanged = TRUE; + } + } + + break; + case VAL_INT: + iVal = load_integral_value(realKey); + + if (iVal != DEFAULT_INTEGRAL_ERR_VALUE) { + if (pItem->value.longValue != iVal) { + pItem->value.longValue = iVal; + pItem->isChanged = TRUE; + } + } + + break; + case VAL_FLOAT: + fVal = load_float_value(realKey); + + if (fVal != DEFAULT_INTEGRAL_ERR_VALUE) { + if (pItem->value.floatValue != fVal) { + pItem->value.floatValue = fVal; + pItem->isChanged = TRUE; + } + } + + break; + case VAL_ARRAY_STR: + load_array_str(realKey, pItem); + break; + + case VAL_ARRAY_OBJ: + load_array_obj(realKey, pItem); + break; + + default: + break; + } + + if (pItem->isChanged) { + cfgUpgrade = TRUE; + } + + sdsfree(realKey); + } + + if (cfgUpgrade) { + config_item_dump("Configuration upgrade"); + } +} + +const char *config_item_dump_fmt(const char *titleMessage) { + int i; + const char *pResp; + PCONFIG_ITEM pItem, pTmp; + char tmp2[256]; + sds tmp; + sds s = sdsempty(); + + if (titleMessage && strlen(titleMessage) > 0) { + s = sdscatprintf(s, "%s:\n", titleMessage); + } + + s = sdscat(s, + "--------------------------------------------------------------------------------" + "-----------------------------------------------------------------------\n"); + + s = sdscat(s, + "| id | Key Name | Configuration file key |" + " value |\n"); + + s = sdscat(s, + "--------------------------------------------------------------------------------" + "-----------------------------------------------------------------------\n"); + + HASH_ITER(hh, g_pConfigItem, pItem, pTmp) { + memset(tmp2, 0, 256); + sprintf(tmp2, "%s%s", cfg_is_upgrade(pItem) ? "*" : " ", pItem->pStrId); + switch (pItem->valType) { + case VAL_BOOL: + s = sdscatprintf(s, "|%4d | %-25s | %-45s | %-64s |\n", pItem->cfgId, tmp2, pItem->pcfgKey, + CFG_BOOL_VALUE(pItem) ? "True" : "False"); + break; + case VAL_INT: + s = sdscatprintf(s, "|%4d | %-25s | %-45s | %-64lld |\n", pItem->cfgId, tmp2, pItem->pcfgKey, + CFG_INT_VALUE(pItem)); + break; + case VAL_FLOAT: + s = sdscatprintf(s, "|%4d | %-25s | %-45s | %-64Lf |\n", pItem->cfgId, tmp2, pItem->pcfgKey, + CFG_FLOAT_VALUE(pItem)); + break; + case VAL_STR: + tmp = sdsempty(); + tmp = sdscatprintf(tmp, "\"%s\"", CFG_STRING_VALUE(pItem)); + if (sdslen(tmp) > 63) { + sdsrange(tmp, 0, 59); + tmp = sdscat(tmp, "...\""); + } + s = sdscatprintf(s, "|%4d | %-25s | %-45s | %-64s |\n", pItem->cfgId, tmp2, pItem->pcfgKey, tmp); + sdsfree(tmp); + break; + case VAL_ARRAY_STR: + tmp = sdsempty(); + tmp = sdscat(tmp, "["); + for (i = 0; i < vect_size(pItem->value.array); i++) { + const char *p = (const char *)vect_get_at(pItem->value.array, i); + if (p) { + tmp = sdscatfmt(tmp, "\"%s\",", p); + } + } + sdsrange(tmp, 0, -2); + tmp = sdscat(tmp, "]"); + //tmp = sdscatprintf(tmp, "\"%s\"", CFG_STRING_VALUE(pItem)); + if (sdslen(tmp) > 63) { + sdsrange(tmp, 0, 58); + tmp = sdscat(tmp, "...\"]"); + } + s = sdscatprintf(s, "|%4d | %-25s | %-45s | %-64s |\n", pItem->cfgId, tmp2, pItem->pcfgKey, tmp); + sdsfree(tmp); + break; + case VAL_ARRAY_OBJ: + for (i = 0; i < vect_size(pItem->value.array); i++) { + POBJ_DHCP_RNG p = (POBJ_DHCP_RNG)vect_get_at(pItem->value.array, i); + if (!p) { + continue; + } + + sds title = sdsempty(); + sds keyRang = sdsempty(); + sds keySubnet = sdsempty(); + sds keyDns = sdsempty(); + sds keyGateway = sdsempty(); + + title = sdscatprintf(title, "%s[%d]", pItem->pcfgKey, i); + keyRang = sdscatprintf(keyRang, "\"%s\"", p->rangAddr); + keySubnet = sdscatprintf(keySubnet, "\"%s\"", p->subnet); + keyDns = sdscatprintf(keyDns, "\"%s\"", p->dnsSvr); + keyGateway = sdscatprintf(keyGateway, "\"%s\"", p->gateway); + + s = sdscatprintf(s, "|%4d | %-25s | %-45s | %-64s |\n", pItem->cfgId, tmp2, title, ""); + s = sdscatprintf(s, "| | %-25s | %-45s | %-64u |\n", "", " .vni", p->vni); + s = sdscatprintf(s, "| | %-25s | %-45s | %-64s |\n", "", " .dhcp_range", keyRang); + s = sdscatprintf(s, "| | %-25s | %-45s | %-64s |\n", "", " .subnet_mask", keySubnet); + s = sdscatprintf(s, "| | %-25s | %-45s | %-64s |\n", "", " .domain_server", keyDns); + s = sdscatprintf(s, "| | %-25s | %-45s | %-64s |\n", "", " .gateway", keyGateway); + s = sdscatprintf(s, "| | %-25s | %-45s | %-64u |\n", "", " .lease_time", p->lease); + + sdsfree(title); + sdsfree(keyRang); + sdsfree(keySubnet); + sdsfree(keyDns); + sdsfree(keyGateway); + } + break; + default: + break; + } + } + + s = sdscat(s, + "--------------------------------------------------------------------------------" + "-----------------------------------------------------------------------\n"); + + pResp = strdup(s); + sdsfree(s); + + return pResp; +} + +void config_item_dump(const char *titleMessage) { + const char *pMsg = config_item_dump_fmt(titleMessage); + LOG_MOD(info, ZLOG_MOD_CONFIG, "%s", pMsg); + free((char *)pMsg); +#if 0 + PCONFIG_ITEM pItem, pTmp; + //int i, k = ARRAY_SIZE(g_sysConfigMap); + LOG_MOD(info, ZLOG_MOD_CONFIG, "================== %s ===================\n", titleMessage == NULL ? "" : titleMessage); + HASH_ITER(hh, g_pConfigItem, pItem, pTmp) { + switch (pItem->valType) { + case VAL_BOOL: + LOG_MOD(info, ZLOG_MOD_CONFIG, "%s%-25s: [%-45s] = %s\n", + cfg_is_upgrade(pItem) ? "*" : " ", + pItem->pStrId, + pItem->pcfgKey, + CFG_BOOL_VALUE(pItem) ? "True" : "False"); + break; + case VAL_INT: + LOG_MOD(info, ZLOG_MOD_CONFIG, "%s%-25s: [%-45s] = %lld\n", + cfg_is_upgrade(pItem) ? "*" : " ", + pItem->pStrId, + pItem->pcfgKey, + CFG_INT_VALUE(pItem)); + break; + case VAL_FLOAT: + LOG_MOD(info, ZLOG_MOD_CONFIG, "%s%-25s: [%-45s] = %Lf\n", + cfg_is_upgrade(pItem) ? "*" : " ", + pItem->pStrId, + pItem->pcfgKey, + CFG_FLOAT_VALUE(pItem)); + break; + case VAL_STR: + LOG_MOD(info, ZLOG_MOD_CONFIG, "%s%-25s: [%-45s] = \"%s\"\n", + cfg_is_upgrade(pItem) ? "*" : " ", + pItem->pStrId, + pItem->pcfgKey, + CFG_STRING_VALUE(pItem)); + break; + default: + break; + } + } +#endif +} + +long double cfg_get_float_value(CONFIG_ITEM_ID id) { + PCFG_VALUE pVal = cfg_get_value(id); + + if (pVal) { + return pVal->floatValue; + } else { + return DEFAULT_INTEGRAL_ERR_VALUE; + } +} + +long long cfg_get_integral_value(CONFIG_ITEM_ID id) { + PCFG_VALUE pVal = cfg_get_value(id); + + if (pVal) { + return pVal->longValue; + } else { + return DEFAULT_INTEGRAL_ERR_VALUE; + } +} + +int cfg_get_bool_value(CONFIG_ITEM_ID id) { + PCFG_VALUE pVal = cfg_get_value(id); + + if (pVal) { + return pVal->longValue == FALSE ? FALSE : TRUE; + } else { + return DEFAULT_INTEGRAL_ERR_VALUE; + } +} + +const char *cfg_get_string_value(CONFIG_ITEM_ID id) { + PCFG_VALUE pVal = cfg_get_value(id); + + if (pVal) { + return pVal->strValue; + } else { + return NULL; + } +} + +c_vector cfg_get_vector(CONFIG_ITEM_ID id) { + PCFG_VALUE pVal = cfg_get_value(id); + + if (pVal) { + return pVal->array; + } else { + return NULL; + } +} + +int init_config_system(const char *pCfgFile, const char *pKey) { + int i; + + if (!file_exists(pCfgFile)) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "Configuration file [%s] not exists\n", pCfgFile); + return -ERR_FILE_NOT_EXISTS; + } + + g_pCfgKey = strdup(pKey == NULL ? "" : pKey); + + g_cfgFilePath = strdup(pCfgFile); + + config_init(&g_cfgContent); + + for (i = 0; i < ARRAY_SIZE(g_cfgItem); i++) { + add_new_cfg_item(g_cfgItem[i].cfgId, g_cfgItem[i].cfgPath, g_cfgItem[i].valType, g_cfgItem[i].defValue, + g_cfgItem[i].pStrId, g_cfgItem[i].readme); + } + + // clang-format on + refreshCfgFileCb(); + + return ERR_SUCCESS; +} + +void uninit_config_system() { + PCONFIG_ITEM pItem, pTmp; + HASH_ITER(hh, g_pConfigItem, pItem, pTmp) { + switch (pItem->valType) { + case VAL_ARRAY_STR: + case VAL_ARRAY_OBJ: + vect_destroy(pItem->value.array); + break; + default: + break; + } + } + config_destroy(&g_cfgContent); +} + +const char *get_config_keygen() { + char buf[MAX_PATH]; + CPU_INFO cpuInfo; + + get_cpu_info(&cpuInfo); + + memset(buf, 0, MAX_PATH); + + sprintf(buf, "%d#%s", cpuInfo.nLogicCores, cpuInfo.cpuCoreDesc.cpuName); + + return strdup(buf); +} + +const char *get_config_key(const char *pKeygen) { + int outSize; + unsigned char *buf = NULL; + const char *strRet; + const char *pKey = get_config_keygen(); + + unsigned char *pBase64 = (unsigned char *)base64_decode(pKeygen, (unsigned int *)&outSize); + + if (pBase64 == NULL) { + LOG_MOD(error, ZLOG_MOD_CONFIG, "Base64 decode error: %s\n", pKeygen); + return NULL; + } + + if (symmetric_decrypto(DES3_CBC_PKCS7PADDING, pBase64, outSize, &buf, &outSize, pKey) != ERR_SUCCESS) { + free((void *)pKey); + free((void *)pBase64); + if (buf) { + free(buf); + } + return NULL; + } else { + buf[outSize] = 0; + strRet = strdup((const char *)buf); + } + + free(buf); + free((void *)pKey); + free((void *)pBase64); + return strRet; +} diff --git a/srcs/libs/configure/config_help.c b/srcs/libs/configure/config_help.c new file mode 100644 index 0000000..2e423fc --- /dev/null +++ b/srcs/libs/configure/config_help.c @@ -0,0 +1,188 @@ +// +// Created by xajhu on 2021/7/7 0007. +// +#include "config.h" + +#ifdef USERVNI_ON +static int g_user_vni_id = -1; + +void cfg_set_user_vni_id(int vni) { + if (g_user_vni_id != vni) { + g_user_vni_id = vni; + } +} + +int cfg_get_user_vni_id() { + if (g_user_vni_id > 0xFFFFFF) { + return 0; + } + + return g_user_vni_id; +} +#endif + +unsigned int config_get_proto_crypto_type() { + return cfg_get_integral_value(CFG_PROTO_CRYPTO); +} + +const char *config_get_proto_crypto_key() { + return cfg_get_string_value(CFG_PROTO_CRYPTO_KEY); +} + +#if DHCPD_ON +unsigned int config_get_dhcp_server_lease_time() { + return cfg_get_integral_value(CFG_DHCP_LEASE_TIME); +} + +c_vector config_get_dhcp_server_range_set() { + return cfg_get_vector(CFG_DHCP_RANGE_SET); +} + +c_vector config_get_dhcp_listen_on() { + return cfg_get_vector(CFG_DHCP_LISTEN_ON); +} + +c_vector config_get_dhcp_replication_svr() { + return cfg_get_vector(CFG_DHCP_REPLICATION_SVR); +} + +const char *config_get_dhcp_net_filter() { + return cfg_get_string_value(CFG_DHCP_NET_FILTER); +} + +c_vector config_get_dhcp_mac_filter() { + return cfg_get_vector(CFG_DHCP_MAC_FILTER); +} + +const char *config_get_dhcp_nic_name() { + return cfg_get_string_value(CFG_DHCP_NIC_NAME); +} +#endif + +const char *config_get_agent_iptv_report_url() { + return cfg_get_string_value(CFG_AGENT_IPTV_POST_URL); +} + +const char *config_get_agent_moniter_report_url() { + return cfg_get_string_value(CFG_AGENT_MONITER_URL); +} +#ifdef HTTPSERVER_ON +const char *config_get_http_server_addr() { + return cfg_get_string_value(CFG_HTTP_SVR_URI); +} +#endif +#ifdef LWIP_ON +const char *config_get_vxlan_nic_name() { + return cfg_get_string_value(CFG_VXLAN_NIC_NAME); +} + +const char *config_get_vxlan_peer_ip() { + return cfg_get_string_value(CFG_VXLAN_PEER_IP); +} + +const char *config_get_vxlan_peer_mac() { + return cfg_get_string_value(CFG_VXLAN_PEER_MAC); +} + +const char *config_get_vxlan_pkg_filter() { + return cfg_get_string_value(CFG_VXLAN_PKG_FILTER); +} + +int cfg_get_support_vxlan() { + return cfg_get_bool_value(CFG_VXLAN_SUPPORT); +} +#endif + +const char *config_get_ssl_ca_path() { + return cfg_get_string_value(CFG_CURL_CA_PATH); +} + +const char *cfg_get_config_directory() { + return cfg_get_string_value(CFG_DIRECTORY); +} + +int cfg_get_banner_enable() { + return cfg_get_bool_value(CFG_BANNER_SHOW); +} + +int cfg_get_hardware_watch_enable() { + return cfg_get_bool_value(CFG_HARDWARE_WATCH); +} + +unsigned int cfg_get_hardware_refresh_period() { + return cfg_get_integral_value(CFG_HARDWARE_REFRESH); +} + +int cfg_get_watch_cpu() { + return cfg_get_bool_value(CFG_WATCH_CPU); +} + +int cfg_get_watch_memory() { + return cfg_get_bool_value(CFG_WATCH_MEMORY); +} + +int cfg_get_watch_disk() { + return cfg_get_bool_value(CFG_WATCH_DISK); +} + +int cfg_get_watch_sensor() { + return cfg_get_bool_value(CFG_WATCH_SENSOR); +} + +#ifdef SQLITE_ON +const char *cfg_get_sqlite_db_name() { + return cfg_get_string_value(CFG_DB_SQLITE_DB_NAME); +} + +#ifdef SQLITE_CRYPTO_ON +const char *cfg_get_sqlite_passwd() { + return cfg_get_string_value(CFG_DB_SQLITE_PASSWD); +} +#endif +#endif + +#ifdef USED_REDIS +const char *cfg_get_redis_server() { + return cfg_get_string_value(CFG_DB_REDIS_SERVER); +} + +int cfg_get_redis_port() { + return (unsigned short)cfg_get_integral_value(CFG_DB_REDIS_PORT); +} + +const char *cfg_get_redis_passwd() { + return cfg_get_string_value(CFG_DB_REDIS_PASSWD); +} +#endif + +#ifdef USED_MYSQL +const char *cfg_get_mysql_server() { + return cfg_get_string_value(CFG_DB_MYSQL_SERVER); +} + +int cfg_get_mysql_port() { + return (unsigned short)cfg_get_integral_value(CFG_DB_MYSQL_PORT); +} + +const char *cfg_get_mysql_user() { + return cfg_get_string_value(CFG_DB_MYSQL_USER); +} + +const char *cfg_get_mysql_passwd() { + return cfg_get_string_value(CFG_DB_MYSQL_PASSWD); +} + +const char *cfg_get_mysql_database() { + return cfg_get_string_value(CFG_DB_MYSQL_DB_NAME); +} +#endif + +#ifdef ZEROMQ_ON +int cfg_get_zero_mq_port() { + return (unsigned short)cfg_get_integral_value(CFG_MQ_SVR_PORT); +} + +const char *cfg_get_zero_mq_data_path() { + return cfg_get_string_value(CFG_MQ_DATA_PATH); +} +#endif \ No newline at end of file diff --git a/srcs/libs/crypto_cipher/base64.c b/srcs/libs/crypto_cipher/base64.c new file mode 100644 index 0000000..17369a4 --- /dev/null +++ b/srcs/libs/crypto_cipher/base64.c @@ -0,0 +1,154 @@ +// +// Created by xajhu on 2021/7/2 0002. +// +#include +#include +#include + +#include "crypto.h" +#include "zlog_module.h" + +#if 0 +/** + * Base64 字符串编码, 输出的Base64编码字符串使用换行对齐方式 + * @param pSrc + * @return + */ +const char *base64_encode(unsigned char *pSrc, unsigned int sLen) { + int enSize = 0; + size_t size; + char *pEncode = NULL; + EVP_ENCODE_CTX *pCtx = EVP_ENCODE_CTX_new(); + + if (pCtx == NULL || pSrc == NULL || sLen == 0) { + return (NULL); + } + + size = ((sLen / 3) * 4) + 4 + (sLen / 64) + sLen % 64; + + pEncode = (char *)malloc(size); + memset(pEncode, 0, size); + + EVP_EncodeInit(pCtx); + EVP_EncodeUpdate(pCtx, (unsigned char *)pEncode, &enSize, (const unsigned char *)pSrc, (int)strlen(pSrc)); + EVP_EncodeFinal(pCtx, (unsigned char *)(pEncode + enSize), &enSize); + +// fprintf(stdout, "Src: \n[%s]\n", pSrc); +// fprintf(stdout, "Base64(%d --> %d | %d) Bytes: \n[%s]\n", sLen, size, strlen(pEncode), pEncode); + + EVP_ENCODE_CTX_free(pCtx); + return pEncode; +} + +/** + * Base64 字符串解码, 输入的Base64编码字符串使用换行对齐方式 + * @param pBase64 + * @return + */ +unsigned char *base64_decode(const char *pBase64) { + int enSize = 0; + size_t size = 0; + unsigned char *pDecode = NULL; + EVP_ENCODE_CTX *pCtx = EVP_ENCODE_CTX_new(); + + if (pCtx == NULL || pBase64 == NULL || strlen(pBase64) == 0) { + return (NULL); + } + + size = strlen(pBase64); + pDecode = (unsigned char *)malloc(size); + memset(pDecode, 0, size); + + EVP_DecodeInit(pCtx); + EVP_DecodeUpdate(pCtx, (unsigned char *)pDecode, &enSize, (const unsigned char *)pBase64, (int)strlen(pBase64)); + EVP_DecodeFinal(pCtx, (unsigned char *)(pDecode + enSize), &enSize); + +// fprintf(stdout, "Decode(%d --> %d) Bytes: \n[%s]\n", size, strlen(pDecode), pDecode); + + EVP_ENCODE_CTX_free(pCtx); + return pDecode; +} +#endif + +/** + * Base64 字符串编码, 输出的Base64编码字符串未使用换行对齐方式 + * @param pSrc + * @param sLen + * @return + */ +const char *base64_encode(unsigned char *pSrc, unsigned int sLen) { + int size; + char *pEncode = NULL; + + if (pSrc == NULL || sLen <= 0) { + return (NULL); + } + + size = (int)(((sLen / 3) * 4) + 4 + (sLen / 64) + sLen % 64); + + pEncode = (char *)malloc(size); + memset(pEncode, 0, size); + + EVP_EncodeBlock((unsigned char *)pEncode, (const unsigned char *)pSrc, (int)sLen); + // fprintf(stdout, "Src: \n[%s]\n", pSrc); + // fprintf(stdout, "Base64(%d --> %d | %d) Bytes: \n[%s]\n", sLen, size, strlen(pEncode), pEncode); + + return pEncode; +} + +/** + * Base64 字符串解码, 输入的Base64编码字符串未使用换行对齐方式 + * @param pBase64 + * @param pOutSize + * @return + */ +unsigned char *base64_decode(const char *pBase64, unsigned int *pOutSize) { +#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L + EVP_ENCODE_CTX ctx; +#else + EVP_ENCODE_CTX *pCtx = EVP_ENCODE_CTX_new(); +#endif + int enSize = 0; + int size; + unsigned char *pDecode = NULL; + + if (pBase64 == NULL || strlen(pBase64) == 0) { +#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L + EVP_ENCODE_CTX_free(pCtx); +#endif + return (NULL); + } + + size = (int)strlen(pBase64); + pDecode = (unsigned char *)malloc(size); + memset(pDecode, 0, size); + +#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L + EVP_DecodeInit(&ctx); + EVP_DecodeUpdate(&ctx, pDecode, &enSize, (const unsigned char *)pBase64, strlen(pBase64)); +#else + EVP_DecodeInit(pCtx); + if (EVP_DecodeUpdate(pCtx, pDecode, &enSize, (const unsigned char *)pBase64, size) == -1) { + LOG_MOD(error, ZLOG_MOD_CRYPTO, "Decode [%s] error\n", pBase64); + free(pDecode); + return NULL; + } +#endif + if (pOutSize) { + *pOutSize = enSize; + } + +#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L + EVP_DecodeFinal(&ctx, pDecode + enSize, &size); +#else + if (EVP_DecodeFinal(pCtx, pDecode, &enSize) == -1) { + LOG_MOD(error, ZLOG_MOD_CRYPTO, "Finish decode [%s] error\n", pBase64); + free(pDecode); + return NULL; + } + + EVP_ENCODE_CTX_free(pCtx); +#endif + + return pDecode; +} diff --git a/srcs/libs/crypto_cipher/crypto.c b/srcs/libs/crypto_cipher/crypto.c new file mode 100644 index 0000000..c13992c --- /dev/null +++ b/srcs/libs/crypto_cipher/crypto.c @@ -0,0 +1,177 @@ +// +// Created by xajhu on 2021/7/2 0002. +// +#include +#include +#include + +#include "task_manager.h" +#include "user_errno.h" + +#include "crypto.h" +#include "common.h" + +static uv_mutex_t *pEvpMutex = NULL; + +typedef struct { + CRYPTO_TYPE type; + unsigned char *pInData; + int iInSize; + unsigned char *pOutData; + unsigned char pKey[EVP_MAX_KEY_LENGTH + 1]; + on_evp_crypto onEvpEventCb; +} CRYPT_TASK_PARAMS, *PCRYPT_TASK_PARAMS; + +static void freeEVPWorkCb(uv_work_t *pWork, int UNUSED(status)) { + PCRYPT_TASK_PARAMS pTask = (PCRYPT_TASK_PARAMS)pWork->data; + free(pTask->pInData); + free(pTask); + free(pWork); +} + +static void onEVPWorkCb(uv_work_t *pWork) { + PCRYPT_TASK_PARAMS pTask = (PCRYPT_TASK_PARAMS)pWork->data; + unsigned int uOutSize = 0; + int iError = 0; + + switch (pTask->type) { +#if 0 + case CRYPTO_AES_ENCRYPT: + iError = EvpAESEncrypto(pTask->pInData, + pTask->iInSize, + pTask->pOutData, + &uOutSize, + pTask->pKey); + break; + + case CRYPTO_AES_DECRYPT: + iError = EvpAESDecrypto(pTask->pInData, + pTask->iInSize, + pTask->pOutData, + &uOutSize, + pTask->pKey); + break; +#endif + case CRYPTO_BASE64_ENCODE: + pTask->pOutData = (unsigned char *)base64_encode((unsigned char *)pTask->pInData, pTask->iInSize); + uOutSize = strlen((char *)pTask->pOutData); + break; + + case CRYPTO_BASE64_DECODE: + pTask->pOutData = (unsigned char *)base64_decode((const char *)pTask->pInData, &uOutSize); + //uOutSize = strlen((char *)pTask->pOutData); + break; +#if 0 + case CRYPTO_MD5_FILE: + pTask->pOutData = (unsigned char *)EvpMD5HashFile((const char *)pTask->pInData); + uOutSize = strlen((char *)pTask->pOutData); + break; +#endif + default: + iError = -ERR_UNSUP_EVP_TYPE; + } + + if (iError != 0) { + pTask->onEvpEventCb(pTask->type, pTask->pOutData, 0, pTask->pInData, iError); + } else { + pTask->onEvpEventCb(pTask->type, pTask->pOutData, uOutSize, pTask->pInData, 0); + } +} + +int evp_add_crypto_task(CRYPTO_TYPE type, + unsigned char *pInBuf, + unsigned int iSize, + unsigned char *pOutBuf, + char *pKey, + on_evp_crypto onEvpCryptCb) { + uv_work_t *puvWork = NULL; + PCRYPT_TASK_PARAMS pTask = NULL; + + if (!onEvpCryptCb) { + return -ERR_INPUT_PARAMS; + } + + if (type == CRYPTO_AES_ENCRYPT || type == CRYPTO_AES_DECRYPT) { + if (pKey == NULL || pOutBuf == NULL) { + return -ERR_INPUT_PARAMS; + } + + switch (strlen(pKey) * 8) { + case 128: + case 192: + case 256: + break; + default: + return -ERR_EVP_KEY_SIZE; + } + } else if (type == CRYPTO_MD5_FILE) { + uv_fs_t uvFs; + if (uv_fs_access(get_task_manager(), &uvFs, (const char *)pInBuf, F_OK, NULL) != 0) { + return -ERR_FILE_NOT_EXISTS; + } + } + + pTask = (PCRYPT_TASK_PARAMS)malloc(sizeof(CRYPT_TASK_PARAMS)); + puvWork = (uv_work_t *)malloc(sizeof(uv_work_t)); + + puvWork->data = (void *)pTask; + + pTask->type = type; + pTask->pInData = (unsigned char *)malloc(iSize + 1); + pTask->iInSize = (int)iSize; + pTask->pOutData = pOutBuf; + pTask->onEvpEventCb = onEvpCryptCb; + + memset(pTask->pInData, 0, iSize + 1); + memset(pTask->pKey, 0, EVP_MAX_KEY_LENGTH + 1); + + if (pKey) { + strncpy((char *)pTask->pKey, pKey, EVP_MAX_KEY_LENGTH); + } + + memcpy(pTask->pInData, pInBuf, iSize); + + uv_queue_work(get_task_manager(), puvWork, onEVPWorkCb, freeEVPWorkCb); + + return 0; +} + +static void evpLockCb(int mode, int n, const char *UNUSED(pFile), int UNUSED(line)) { + if (n >= CRYPTO_num_locks()) { + return; + } + + if (mode & CRYPTO_LOCK) { + uv_mutex_lock(&pEvpMutex[n]); + } else { + uv_mutex_unlock(&pEvpMutex[n]); + } +} + +#if OPENSSL_VERSION_NUMBER >= OPENSSL_VERSION_1_0_0 +void evpIdCb(CRYPTO_THREADID *tid) { + CRYPTO_THREADID_set_numeric(tid, (unsigned long)pthread_self()); +} +#else +static unsigned long evpIdCb(void) { + return ((unsigned long)uv_thread_self()); +} +#endif + +void evp_system_init(void) { + int i; + + pEvpMutex = (uv_mutex_t *)malloc(CRYPTO_num_locks() * sizeof(uv_mutex_t)); + + for (i = 0; i < CRYPTO_num_locks(); i++) { + uv_mutex_init(&pEvpMutex[i]); + } + +#if OPENSSL_VERSION_NUMBER >= OPENSSL_VERSION_1_0_0 + CRYPTO_THREADID_set_callback(evpIdCb); +#else + CRYPTO_set_id_callback(evpIdCb); +#endif + + CRYPTO_set_locking_callback(evpLockCb); +} diff --git a/srcs/libs/crypto_cipher/hash_digest.c b/srcs/libs/crypto_cipher/hash_digest.c new file mode 100644 index 0000000..86f1dc3 --- /dev/null +++ b/srcs/libs/crypto_cipher/hash_digest.c @@ -0,0 +1,143 @@ +// +// Created by xajhu on 2021/7/2 0002. +// +#include +#include +#include +#include +#include + +#include "crypto.h" +#include "misc.h" +#include "user_errno.h" +#include "zlog_module.h" + +/** + * 计算文件MD5值 + * @param pFileName + * @param md5 + * @return + */ +int hash_digest_file(HASH_TYPE hashType, const char *pFileName, char **pHashValue) { + unsigned int rdSize = 0; + int fd; + uint8_t hashValue[EVP_MAX_MD_SIZE]; + uint8_t buf[1024]; + EVP_MD_CTX *pCtx; + + if (pHashValue == NULL) { + return (-ERR_INPUT_PARAMS); + } + + memset(hashValue, 0, EVP_MAX_MD_SIZE); + + pCtx = EVP_MD_CTX_create(); + + if (!pCtx) { + return -ERR_EVP_CREATE_CTX; + } + + EVP_MD_CTX_init(pCtx); + + switch (hashType) { + case HASH_TYPE_MD5: + EVP_DigestInit_ex(pCtx, EVP_md5(), NULL); + break; + case HASH_TYPE_SHA1: + EVP_DigestInit_ex(pCtx, EVP_sha1(), NULL); + break; + case HASH_TYPE_SHA256: + EVP_DigestInit_ex(pCtx, EVP_sha256(), NULL); + break; + default: + EVP_MD_CTX_destroy(pCtx); + return (-ERR_INPUT_PARAMS); + } + + fd = open(pFileName, O_RDONLY); + + if (fd == -1) { + LOG_MOD(error, ZLOG_MOD_CRYPTO, "Open File %s error\n", pFileName); + EVP_MD_CTX_destroy(pCtx); + return (-ERR_OPEN_FILE); + } + + do { + rdSize = read(fd, buf, 1024); + EVP_DigestUpdate(pCtx, buf, rdSize); + } while (rdSize > 0); + + close(fd); + + EVP_DigestFinal_ex(pCtx, hashValue, &rdSize); + EVP_MD_CTX_destroy(pCtx); + + *pHashValue = (char *)malloc(EVP_MAX_MD_SIZE * 2 + 1); + + if (*pHashValue == NULL) { + return (-ERR_MALLOC_MEMORY); + } + + memset(*pHashValue, 0, EVP_MAX_MD_SIZE * 2 + 1); + + bin2hex(*pHashValue, hashValue, rdSize); + + return ERR_SUCCESS; +} + +/** + * 计算缓存中的数据的 Hash 值 + * @param pBuf + * @param iBufLen + * @param pHashValue + * @return + */ +int hash_digest_mem(HASH_TYPE hashType, + const unsigned char *pBuf, + unsigned int iBufLen, + unsigned char **pHashValue, + unsigned int *pOutSize) { + EVP_MD_CTX *pCtx; + + if (pHashValue == NULL || pBuf == NULL || pOutSize == NULL) { + return (-ERR_INPUT_PARAMS); + } + + *pHashValue = (unsigned char *)malloc(EVP_MAX_MD_SIZE); + + if (*pHashValue == NULL) { + *pOutSize = 0; + return -ERR_MALLOC_MEMORY; + } + + memset(*pHashValue, 0, EVP_MAX_MD_SIZE); + + pCtx = EVP_MD_CTX_create(); + if (!pCtx) { + *pOutSize = 0; + return -ERR_EVP_CREATE_CTX; + } + + EVP_MD_CTX_init(pCtx); + + switch (hashType) { + case HASH_TYPE_MD5: + EVP_DigestInit_ex(pCtx, EVP_md5(), NULL); + break; + case HASH_TYPE_SHA1: + EVP_DigestInit_ex(pCtx, EVP_sha1(), NULL); + break; + case HASH_TYPE_SHA256: + EVP_DigestInit_ex(pCtx, EVP_sha256(), NULL); + break; + default: + EVP_MD_CTX_destroy(pCtx); + return (-ERR_INPUT_PARAMS); + } + EVP_DigestUpdate(pCtx, pBuf, iBufLen); + EVP_DigestFinal_ex(pCtx, *pHashValue, pOutSize); + + EVP_MD_CTX_destroy(pCtx); + + return ERR_SUCCESS; +} \ No newline at end of file diff --git a/srcs/libs/crypto_cipher/symmetric.c b/srcs/libs/crypto_cipher/symmetric.c new file mode 100644 index 0000000..5d713ae --- /dev/null +++ b/srcs/libs/crypto_cipher/symmetric.c @@ -0,0 +1,259 @@ +// +// Created by xajhu on 2021/7/13 0013. +// +#include +#include +#include +#include + +#include "crypto.h" +#include "user_errno.h" + +static int sha1prng_for_aes_key(const char *pKey, unsigned char *pShaPrng16) { + unsigned int outSize = EVP_MAX_MD_SIZE; + unsigned char data[SHA_DIGEST_LENGTH] = {0}; + unsigned char *pHashValue = NULL; + + int ret = hash_digest_mem(HASH_TYPE_SHA1, (const unsigned char *)pKey, strlen(pKey), &pHashValue, &outSize); + + if (ret != ERR_SUCCESS) { + + if (pHashValue) { + free(pHashValue); + } + + return ret; + } + + memcpy(data, pHashValue, SHA_DIGEST_LENGTH); + free(pHashValue); + + ret = hash_digest_mem(HASH_TYPE_SHA1, data, SHA_DIGEST_LENGTH, &pHashValue, &outSize); + + if (ret != ERR_SUCCESS) { + + if (pHashValue) { + free(pHashValue); + } + + return ret; + } + + memcpy(pShaPrng16, pHashValue, 16); + + free(pHashValue); + + return ERR_SUCCESS; +} + +#define EVP_ENV_INIT(algorithmType, pCipher, keyBuf, pKey) \ + do { \ + switch (algorithmType) { \ + case DES3_ECB_PKCS7PADDING: \ + pCipher = EVP_des_ede3(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case DES3_CBC_PKCS7PADDING: \ + pCipher = EVP_des_ede3_cbc(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case DES3_OFB_PKCS7PADDING: \ + pCipher = EVP_des_ede3_ofb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES128_ECB_PKCS7PADDING: \ + pCipher = EVP_aes_128_ecb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES128_ECB_PKCS7PADDING_SHA1PRNG: \ + if (sha1prng_for_aes_key(pKey, keyBuf) != ERR_SUCCESS) { \ + EVP_CIPHER_CTX_cleanup(pCtx); \ + return -ERR_AES_KEYGEN; \ + } \ + pCipher = EVP_aes_128_ecb(); \ + break; \ + case AES128_CBC_PKCS7PADDING: \ + pCipher = EVP_aes_128_cbc(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES128_OFB_PKCS7PADDING: \ + pCipher = EVP_aes_128_ofb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES192_ECB_PKCS7PADDING: \ + pCipher = EVP_aes_192_ecb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES192_CBC_PKCS7PADDING: \ + pCipher = EVP_aes_192_cbc(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES192_OFB_PKCS7PADDING: \ + pCipher = EVP_aes_192_ofb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES256_ECB_PKCS7PADDING: \ + pCipher = EVP_aes_256_ecb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES256_CBC_PKCS7PADDING: \ + pCipher = EVP_aes_256_cbc(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + case AES256_OFB_PKCS7PADDING: \ + pCipher = EVP_aes_256_ofb(); \ + strncpy((char *)keyBuf, pKey, EVP_CIPHER_key_length(pCipher)); \ + break; \ + default: \ + EVP_CIPHER_CTX_cleanup(pCtx); \ + return -ERR_UNSUP_EVP_TYPE; \ + } \ + } while (0) + +int symmetric_decrypto(AES_TYPE algorithmType, + unsigned char *pInBuf, + unsigned int inSize, + unsigned char **pOutBuf, + int *pOutSize, + const char *pKey) { + int enBytes = 0; + EVP_CIPHER_CTX *pCtx; + unsigned char *pAesBuf; + unsigned char keyBuf[EVP_MAX_KEY_LENGTH]; + unsigned char iv[EVP_MAX_IV_LENGTH] = {0}; + const EVP_CIPHER *pCipher; + + if (!pInBuf || !pOutSize || !pKey || inSize == 0) { + return -ERR_INPUT_PARAMS; + } + + *pOutSize = 0; + + pCtx = EVP_CIPHER_CTX_new(); + + if (!pCtx) { + return -ERR_EVP_CREATE_CTX; + } + + memset(keyBuf, 0, EVP_MAX_KEY_LENGTH); + memset(iv, '0', EVP_MAX_IV_LENGTH); + + EVP_ENV_INIT(algorithmType, pCipher, keyBuf, pKey); + + EVP_CIPHER_CTX_init(pCtx); + + if (EVP_DecryptInit_ex(pCtx, pCipher, NULL, (const unsigned char *)keyBuf, iv) == 0) { + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_EVP_INIT_KEY; + } + + pAesBuf = malloc(inSize + EVP_MAX_BLOCK_LENGTH); + + if (pAesBuf == NULL) { + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_MALLOC_MEMORY; + } + + memset(pAesBuf, 0, inSize + EVP_MAX_BLOCK_LENGTH); + + if (EVP_DecryptUpdate(pCtx, pAesBuf, &enBytes, pInBuf, (int)inSize) == 0) { + free(pAesBuf); + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_EVP_UPDATE; + } + + *pOutBuf = pAesBuf; + pAesBuf += enBytes; + *pOutSize += enBytes; + + if (EVP_DecryptFinal_ex(pCtx, pAesBuf, &enBytes) == 0) { + //free(pOutBuf); // Maybe exception + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_EVP_FINALE; + } + + *pOutSize += enBytes; + + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + + return ERR_SUCCESS; +} + +int symmetric_encrypto(AES_TYPE algorithmType, + unsigned char *pInBuf, + unsigned int inSize, + unsigned char **pOutBuf, + int *pOutSize, + const char *pKey) { + int enBytes = 0; + unsigned char *pAesBuf; + EVP_CIPHER_CTX *pCtx; + unsigned char keyBuf[EVP_MAX_KEY_LENGTH]; + unsigned char iv[EVP_MAX_IV_LENGTH] = {0}; + const EVP_CIPHER *pCipher; + + if (!pInBuf || !pOutSize || !pKey || inSize == 0) { + return -ERR_INPUT_PARAMS; + } + + *pOutSize = 0; + + pCtx = EVP_CIPHER_CTX_new(); + + if (!pCtx) { + return -ERR_EVP_CREATE_CTX; + } + + memset(keyBuf, 0, EVP_MAX_KEY_LENGTH); + memset(iv, '0', EVP_MAX_IV_LENGTH); + + EVP_ENV_INIT(algorithmType, pCipher, keyBuf, pKey); + + EVP_CIPHER_CTX_init(pCtx); + + if (EVP_EncryptInit_ex(pCtx, pCipher, NULL, (const unsigned char *)keyBuf, iv) == 0) { + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_EVP_INIT_KEY; + } + + pAesBuf = malloc(inSize + EVP_MAX_BLOCK_LENGTH); + + if (pAesBuf == NULL) { + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_MALLOC_MEMORY; + } + + memset(pAesBuf, 0, inSize + EVP_MAX_BLOCK_LENGTH); + + if (EVP_EncryptUpdate(pCtx, pAesBuf, &enBytes, pInBuf, (int)inSize) == 0) { + free(pAesBuf); + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_EVP_UPDATE; + } + + *pOutBuf = pAesBuf; + pAesBuf += enBytes; + *pOutSize += enBytes; + + if (EVP_EncryptFinal_ex(pCtx, pAesBuf, &enBytes) == 0) { + //free(pOutBuf); // Maybe exception + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + return -ERR_EVP_FINALE; + } + + *pOutSize += enBytes; + + EVP_CIPHER_CTX_cleanup(pCtx); + EVP_CIPHER_CTX_free(pCtx); + + return ERR_SUCCESS; +} diff --git a/srcs/libs/database/database.c b/srcs/libs/database/database.c new file mode 100644 index 0000000..00dc4a5 --- /dev/null +++ b/srcs/libs/database/database.c @@ -0,0 +1,91 @@ +// +// Created by xajhuang on 2023/3/29. +// +#ifdef SQLITE_ON +#include +#include +#include "zlog_module.h" +#include "user_errno.h" +#include "config.h" +#include "database.h" +#include "common.h" + +static sqlite3 *g_pSqlHandle = NULL; + +int db_sqlite3_init() { + int rc; + const char *pDbPath = cfg_get_sqlite_db_name(); + + if (pDbPath == NULL || strlen(pDbPath) == 0) { + return ERR_SUCCESS; + } + + if (g_pSqlHandle == NULL) { + rc = sqlite3_open_v2(pDbPath, &g_pSqlHandle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + + if (rc != SQLITE_OK) { + LOG_MOD(error, + ZLOG_MOD_DB, + "Create SQLite3 Database at %s error: %s(%d)\n", + pDbPath, + sqlite3_errstr(rc), + rc); + return -ERR_DB_CONNECT; + } + } + + LOG_MOD(info, ZLOG_MOD_DB, "Used SQLite3 database: %s\n", pDbPath); + + return ERR_SUCCESS; +} + +int db_sqlite3_get_rows(const char *pSqlCmd, char ***dbResult, int *pnRow, int *pnColumn, char **pErr) { + if (pSqlCmd == NULL || strlen(pSqlCmd) == 0) { + LOG_MOD(error, ZLOG_MOD_DB, "Input params pSqlCmd error\n"); + return -ERR_INPUT_PARAMS; + } + + if (g_pSqlHandle) { + int rc = sqlite3_get_table(g_pSqlHandle, pSqlCmd, dbResult, pnRow, pnColumn, pErr); + + if (rc != SQLITE_OK) { + LOG_MOD(error, ZLOG_MOD_DB, "Run {%s} SQL command error:\n%s\n", pSqlCmd, sqlite3_errmsg(g_pSqlHandle)); + return -ERR_DB_SQL_EXEC; + } + + return ERR_SUCCESS; + } else { + LOG_MOD(error, ZLOG_MOD_DB, "SQlite3 database uninit\n"); + return -ERR_DB_UNINIT; + } +} + +int db_sqlite3_sql_exec(const char *pSqlCmd, void *pCallback, void *pData, char **pErr) { + + if (pSqlCmd == NULL || strlen(pSqlCmd) == 0) { + LOG_MOD(error, ZLOG_MOD_DB, "Input params pSqlCmd error\n"); + return -ERR_INPUT_PARAMS; + } + + if (g_pSqlHandle) { + int rc = sqlite3_exec(g_pSqlHandle, pSqlCmd, pCallback, pData, pErr); + + if (rc != SQLITE_OK) { + LOG_MOD(error, ZLOG_MOD_DB, "Run {%s} SQL command error:\n%s\n", pSqlCmd, sqlite3_errmsg(g_pSqlHandle)); + return -ERR_DB_SQL_EXEC; + } + + return ERR_SUCCESS; + } else { + LOG_MOD(error, ZLOG_MOD_DB, "SQlite3 database uninit\n"); + return -ERR_DB_UNINIT; + } +} + +void db_sqlite3_uninit() { + if (g_pSqlHandle) { + DEBUG_CODE_LINE(); + sqlite3_close(g_pSqlHandle); + } +} +#endif \ No newline at end of file diff --git a/srcs/libs/database/sqlite3/config.h b/srcs/libs/database/sqlite3/config.h new file mode 100644 index 0000000..4ab9bda --- /dev/null +++ b/srcs/libs/database/sqlite3/config.h @@ -0,0 +1,151 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `fdatasync' function. */ +#define HAVE_FDATASYNC 1 + +/* Define to 1 if you have the `gmtime_r' function. */ +#define HAVE_GMTIME_R 1 + +/* Define to 1 if the system has the type `int16_t'. */ +#define HAVE_INT16_T 1 + +/* Define to 1 if the system has the type `int32_t'. */ +#define HAVE_INT32_T 1 + +/* Define to 1 if the system has the type `int64_t'. */ +#define HAVE_INT64_T 1 + +/* Define to 1 if the system has the type `int8_t'. */ +#define HAVE_INT8_T 1 + +/* Define to 1 if the system has the type `intptr_t'. */ +#define HAVE_INTPTR_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_ISNAN 1 + +/* Define to 1 if you have the `crypto_cipher' library (-lcrypto). */ +#define HAVE_LIBCRYPTO 1 + +/* Define to 1 if you have the `nss3' library (-lnss3). */ +/* #undef HAVE_LIBNSS3 */ + +/* Define to 1 if you have the `tomcrypt' library (-ltomcrypt). */ +/* #undef HAVE_LIBTOMCRYPT */ + +/* Define to 1 if you have the `localtime_r' function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define to 1 if you have the `localtime_s' function. */ +/* #undef HAVE_LOCALTIME_S */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `malloc_usable_size' function. */ +#define HAVE_MALLOC_USABLE_SIZE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `pread' function. */ +#define HAVE_PREAD 1 + +/* Define to 1 if you have the `pread64' function. */ +#define HAVE_PREAD64 1 + +/* Define to 1 if you have the `pwrite' function. */ +#define HAVE_PWRITE 1 + +/* Define to 1 if you have the `pwrite64' function. */ +#define HAVE_PWRITE64 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchrnul' function. */ +#define HAVE_STRCHRNUL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `uint32_t'. */ +#define HAVE_UINT32_T 1 + +/* Define to 1 if the system has the type `uint64_t'. */ +#define HAVE_UINT64_T 1 + +/* Define to 1 if the system has the type `uint8_t'. */ +#define HAVE_UINT8_T 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `usleep' function. */ +#define HAVE_USLEEP 1 + +/* Define to 1 if you have the `utime' function. */ +#define HAVE_UTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ZLIB_H 1 + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "sqlcipher" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "sqlcipher 3.39.2" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "sqlcipher" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.39.2" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +#define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ diff --git a/srcs/libs/database/sqlite3/sqlite3.c b/srcs/libs/database/sqlite3/sqlite3.c new file mode 100644 index 0000000..6ffe69d --- /dev/null +++ b/srcs/libs/database/sqlite3/sqlite3.c @@ -0,0 +1,247045 @@ +/****************************************************************************** +** This file is an amalgamation of many separate C source files from SQLite +** version 3.39.2. By combining all the individual C code files into this +** single large file, the entire code can be compiled as a single translation +** unit. This allows many compilers to do optimizations that would not be +** possible if the files were compiled separately. Performance improvements +** of 5% or more are commonly seen when SQLite is compiled as a single +** translation unit. +** +** This file is all you need to compile SQLite. To use SQLite in other +** programs, you need this file and the "sqlite3.h" header file that defines +** the programming interface to the SQLite library. (If you do not have +** the "sqlite3.h" header file at hand, you will find a copy embedded within +** the text of this file. Search for "Begin file sqlite3.h" to find the start +** of the embedded sqlite3.h header file.) Additional code files may be needed +** if you want a wrapper to interface SQLite with your choice of programming +** language. The code for the "sqlite3" command-line shell is also in a +** separate file. This file contains only code for the core SQLite library. +*/ +#define SQLITE_CORE 1 +#define SQLITE_AMALGAMATION 1 +#ifndef SQLITE_PRIVATE +# define SQLITE_PRIVATE static +#endif +#define SQLITE_UDL_CAPABLE_PARSER 1 +/************** Begin file sqliteInt.h ***************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Internal interface definitions for SQLite. +** +*/ +#ifndef SQLITEINT_H +#define SQLITEINT_H + +/* Special Comments: +** +** Some comments have special meaning to the tools that measure test +** coverage: +** +** NO_TEST - The branches on this line are not +** measured by branch coverage. This is +** used on lines of code that actually +** implement parts of coverage testing. +** +** OPTIMIZATION-IF-TRUE - This branch is allowed to alway be false +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** OPTIMIZATION-IF-FALSE - This branch is allowed to alway be true +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** PREVENTS-HARMLESS-OVERREAD - This branch prevents a buffer overread +** that would be harmless and undetectable +** if it did occur. +** +** In all cases, the special comment must be enclosed in the usual +** slash-asterisk...asterisk-slash comment marks, with no spaces between the +** asterisks and the comment text. +*/ + +/* +** Make sure the Tcl calling convention macro is defined. This macro is +** only used by test code and Tcl integration code. +*/ +#ifndef SQLITE_TCLAPI +# define SQLITE_TCLAPI +#endif + +/* +** Include the header file used to customize the compiler options for MSVC. +** This should be done first so that it can successfully prevent spurious +** compiler warnings due to subsequent content in this file and other files +** that are included by this file. +*/ +/************** Include msvc.h in the middle of sqliteInt.h ******************/ +/************** Begin file msvc.h ********************************************/ +/* +** 2015 January 12 +** +** 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 contains code that is specific to MSVC. +*/ +#ifndef SQLITE_MSVC_H +#define SQLITE_MSVC_H + +#if defined(_MSC_VER) +#pragma warning(disable : 4054) +#pragma warning(disable : 4055) +#pragma warning(disable : 4100) +#pragma warning(disable : 4127) +#pragma warning(disable : 4130) +#pragma warning(disable : 4152) +#pragma warning(disable : 4189) +#pragma warning(disable : 4206) +#pragma warning(disable : 4210) +#pragma warning(disable : 4232) +#pragma warning(disable : 4244) +#pragma warning(disable : 4305) +#pragma warning(disable : 4306) +#pragma warning(disable : 4702) +#pragma warning(disable : 4706) +#endif /* defined(_MSC_VER) */ + +#if defined(_MSC_VER) && !defined(_WIN64) +#undef SQLITE_4_BYTE_ALIGNED_MALLOC +#define SQLITE_4_BYTE_ALIGNED_MALLOC +#endif /* defined(_MSC_VER) && !defined(_WIN64) */ + +#endif /* SQLITE_MSVC_H */ + +/************** End of msvc.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** Special setup for VxWorks +*/ +/************** Include vxworks.h in the middle of sqliteInt.h ***************/ +/************** Begin file vxworks.h *****************************************/ +/* +** 2015-03-02 +** +** 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 contains code that is specific to Wind River's VxWorks +*/ +#if defined(__RTP__) || defined(_WRS_KERNEL) +/* This is VxWorks. Set up things specially for that OS +*/ +#include +#include /* amalgamator: dontcache */ +#define OS_VXWORKS 1 +#define SQLITE_OS_OTHER 0 +#define SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1 +#define SQLITE_OMIT_LOAD_EXTENSION 1 +#define SQLITE_ENABLE_LOCKING_STYLE 0 +#define HAVE_UTIME 1 +#else +/* This is not VxWorks. */ +#define OS_VXWORKS 0 +#define HAVE_FCHOWN 1 +#define HAVE_READLINK 1 +#define HAVE_LSTAT 1 +#endif /* defined(_WRS_KERNEL) */ + +/************** End of vxworks.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** These #defines should enable >2GB file support on POSIX if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any +** system #includes. Hence, this block of code must be the very first +** code in all source files. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: Red Hat 7.2) but you want your code to work +** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in Red Hat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** The previous paragraph was written in 2005. (This paragraph is written +** on 2008-11-28.) These days, all Linux kernels support large files, so +** you should probably leave LFS enabled. But some embedded platforms might +** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful. +** +** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* The GCC_VERSION and MSVC_VERSION macros are used to +** conditionally include optimizations for each of these compilers. A +** value of 0 means that compiler is not being used. The +** SQLITE_DISABLE_INTRINSIC macro means do not use any compiler-specific +** optimizations, and hence set all compiler macros to 0 +** +** There was once also a CLANG_VERSION macro. However, we learn that the +** version numbers in clang are for "marketing" only and are inconsistent +** and unreliable. Fortunately, all versions of clang also recognize the +** gcc version numbers and have reasonable settings for gcc version numbers, +** so the GCC_VERSION macro will be set to a correct non-zero value even +** when compiling with clang. +*/ +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif + +/* +** Some C99 functions in "math.h" are only present for MSVC when its version +** is associated with Visual Studio 2013 or higher. +*/ +#ifndef SQLITE_HAVE_C99_MATH_FUNCS +# if MSVC_VERSION==0 || MSVC_VERSION>=1800 +# define SQLITE_HAVE_C99_MATH_FUNCS (1) +# else +# define SQLITE_HAVE_C99_MATH_FUNCS (0) +# endif +#endif + +/* Needed for various definitions... */ +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif + +#if defined(__OpenBSD__) && !defined(_BSD_SOURCE) +# define _BSD_SOURCE +#endif + +/* +** Macro to disable warnings about missing "break" at the end of a "case". +*/ +#if GCC_VERSION>=7000000 +# define deliberate_fall_through __attribute__((fallthrough)); +#else +# define deliberate_fall_through +#endif + +/* +** For MinGW, check to see if we can include the header file containing its +** version information, among other things. Normally, this internal MinGW +** header file would [only] be included automatically by other MinGW header +** files; however, the contained version information is now required by this +** header file to work around binary compatibility issues (see below) and +** this is the only known way to reliably obtain it. This entire #if block +** would be completely unnecessary if there was any other way of detecting +** MinGW via their preprocessor (e.g. if they customized their GCC to define +** some MinGW-specific macros). When compiling for MinGW, either the +** _HAVE_MINGW_H or _HAVE__MINGW_H (note the extra underscore) macro must be +** defined; otherwise, detection of conditions specific to MinGW will be +** disabled. +*/ +#if defined(_HAVE_MINGW_H) +# include "mingw.h" +#elif defined(_HAVE__MINGW_H) +# include "_mingw.h" +#endif + +/* +** For MinGW version 4.x (and higher), check to see if the _USE_32BIT_TIME_T +** define is required to maintain binary compatibility with the MSVC runtime +** library in use (e.g. for Windows XP). +*/ +#if !defined(_USE_32BIT_TIME_T) && !defined(_USE_64BIT_TIME_T) && \ + defined(_WIN32) && !defined(_WIN64) && \ + defined(__MINGW_MAJOR_VERSION) && __MINGW_MAJOR_VERSION >= 4 && \ + defined(__MSVCRT__) +# define _USE_32BIT_TIME_T +#endif + +/* Optionally #include a user-defined header, whereby compilation options +** may be set prior to where they take effect, but after platform setup. +** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include +** file. +*/ +#ifdef SQLITE_CUSTOM_INCLUDE +# define INC_STRINGIFY_(f) #f +# define INC_STRINGIFY(f) INC_STRINGIFY_(f) +# include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE) +#endif + +/* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear +** first in QNX. Also, the _USE_32BIT_TIME_T macro must appear first for +** MinGW. +*/ +/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ +/************** Begin file sqlite3.h *****************************************/ +/* +** 2001-09-15 +** +** 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 header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are supposed to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef SQLITE3_H +#define SQLITE3_H +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** Facilitate override of interface linkage and calling conventions. +** Be aware that these macros may not be used within this particular +** translation of the amalgamation and its associated header file. +** +** The SQLITE_EXTERN and SQLITE_API macros are used to instruct the +** compiler that the target identifier should have external linkage. +** +** The SQLITE_CDECL macro is used to set the calling convention for +** public functions that accept a variable number of arguments. +** +** The SQLITE_APICALL macro is used to set the calling convention for +** public functions that accept a fixed number of arguments. +** +** The SQLITE_STDCALL macro is no longer used and is now deprecated. +** +** The SQLITE_CALLBACK macro is used to set the calling convention for +** function pointers. +** +** The SQLITE_SYSAPI macro is used to set the calling convention for +** functions provided by the operating system. +** +** Currently, the SQLITE_CDECL, SQLITE_APICALL, SQLITE_CALLBACK, and +** SQLITE_SYSAPI macros are used only when building for environments +** that require non-default calling conventions. +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are supported for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers +** +** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header +** evaluates to a string literal that is the SQLite version in the +** format "X.Y.Z" where X is the major version number (always 3 for +** SQLite3) and Y is the minor version number and Z is the release number.)^ +** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same +** numbers used in [SQLITE_VERSION].)^ +** The SQLITE_VERSION_NUMBER for any given release of SQLite will also +** be larger than the release from which it is derived. Either Y will +** be held constant and Z will be incremented or else Y will be incremented +** and Z will be reset to zero. +** +** Since [version 3.6.18] ([dateof:3.6.18]), +** SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates to +** a string which identifies a particular check-in of SQLite +** within its configuration management system. ^The SQLITE_SOURCE_ID +** string contains the date and time of the check-in (UTC) and a SHA1 +** or SHA3-256 hash of the entire source tree. If the source code has +** been edited in any way since it was last checked in, then the last +** four hexadecimal digits of the hash may be modified. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +*/ +#define SQLITE_VERSION "3.39.2" +#define SQLITE_VERSION_NUMBER 3039002 +#define SQLITE_SOURCE_ID "2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668ealt1" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros +** but are associated with the library instead of the header file. ^(Cautious +** programmers might include assert() statements in their application to +** verify that values returned by these interfaces match the macros in +** the header, and thus ensure that the application is +** compiled with matching library and header files. +** +**
        +** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
        +** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 );
        +** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
        +** 
        )^ +** +** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] +** macro. ^The sqlite3_libversion() function returns a pointer to the +** to the sqlite3_version[] string constant. The sqlite3_libversion() +** function is provided for use in DLLs since DLL users usually do not have +** direct access to string constants within the DLL. ^The +** sqlite3_libversion_number() function returns an integer equal to +** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns +** a pointer to a string constant whose value is the same as the +** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built +** using an edited copy of [the amalgamation], then the last four characters +** of the hash might be different from [SQLITE_SOURCE_ID].)^ +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#else +# define sqlite3_compileoption_used(X) 0 +# define sqlite3_compileoption_get(X) ((void*)0) +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with mutexing code omitted due to the +** [SQLITE_THREADSAFE] compile-time option being set to 0. +** +** SQLite can be compiled with or without mutexes. When +** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** Enabling mutexes incurs a measurable performance penalty. +** So if speed is of utmost importance, it makes sense to disable +** the mutexes. But for maximum safety, mutexes should be enabled. +** ^The default behavior is for mutexes to be enabled. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but +** can be fully or partially disabled using a call to [sqlite3_config()] +** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], +** or [SQLITE_CONFIG_SERIALIZED]. ^(The return value of the +** sqlite3_threadsafe() function shows only the compile-time setting of +** thread safety, not any run-time changes to that setting made by +** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() +** is unchanged by calls to sqlite3_config().)^ +** +** See the [threading mode] documentation for additional information. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** and [sqlite3_close_v2()] are its destructors. There are many other +** interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^The sqlite3_int64 and sqlite_int64 types can store integer values +** between -9223372036854775808 and +9223372036854775807 inclusive. ^The +** sqlite3_uint64 and sqlite_uint64 types can store integer values +** between 0 and +18446744073709551615 inclusive. +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; +# ifdef SQLITE_UINT64_TYPE + typedef SQLITE_UINT64_TYPE sqlite_uint64; +# else + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# endif +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 +** +** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors +** for the [sqlite3] object. +** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if +** the [sqlite3] object is successfully destroyed and all associated +** resources are deallocated. +** +** Ideally, applications should [sqlite3_finalize | finalize] all +** [prepared statements], [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated +** with the [sqlite3] object prior to attempting to close the object. +** ^If the database connection is associated with unfinalized prepared +** statements, BLOB handlers, and/or unfinished sqlite3_backup objects then +** sqlite3_close() will leave the database connection open and return +** [SQLITE_BUSY]. ^If sqlite3_close_v2() is called with unfinalized prepared +** statements, unclosed BLOB handlers, and/or unfinished sqlite3_backups, +** it returns [SQLITE_OK] regardless, but instead of deallocating the database +** connection immediately, it marks the database connection as an unusable +** "zombie" and makes arrangements to automatically deallocate the database +** connection after all prepared statements are finalized, all BLOB handles +** are closed, and all backups have finished. The sqlite3_close_v2() interface +** is intended for use with host languages that are garbage collected, and +** where the order in which destructors are called is arbitrary. +** +** ^If an [sqlite3] object is destroyed while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] +** must be either a NULL +** pointer or an [sqlite3] object pointer obtained +** from [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()], and not previously closed. +** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer +** argument is a harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3*); +SQLITE_API int sqlite3_close_v2(sqlite3*); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 +** +** The sqlite3_exec() interface is a convenience wrapper around +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], +** that allows an application to run multiple statements of SQL +** without having to use a lot of C code. +** +** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, +** semicolon-separate SQL statements passed into its 2nd argument, +** in the context of the [database connection] passed in as its 1st +** argument. ^If the callback function of the 3rd argument to +** sqlite3_exec() is not NULL, then it is invoked for each result row +** coming out of the evaluated SQL statements. ^The 4th argument to +** sqlite3_exec() is relayed through to the 1st argument of each +** callback invocation. ^If the callback pointer to sqlite3_exec() +** is NULL, then no callback is ever invoked and result rows are +** ignored. +** +** ^If an error occurs while evaluating the SQL statements passed into +** sqlite3_exec(), then execution of the current statement stops and +** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() +** is not NULL then any error message is written into memory obtained +** from [sqlite3_malloc()] and passed back through the 5th parameter. +** To avoid memory leaks, the application should invoke [sqlite3_free()] +** on error message strings returned through the 5th parameter of +** sqlite3_exec() after the error message string is no longer needed. +** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors +** occur, then sqlite3_exec() sets the pointer in its 5th parameter to +** NULL before returning. +** +** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() +** routine returns SQLITE_ABORT without invoking the callback again and +** without running any subsequent SQL statements. +** +** ^The 2nd argument to the sqlite3_exec() callback function is the +** number of columns in the result. ^The 3rd argument to the sqlite3_exec() +** callback is an array of pointers to strings obtained as if from +** [sqlite3_column_text()], one for each column. ^If an element of a +** result row is NULL then the corresponding string pointer for the +** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the +** sqlite3_exec() callback is an array of pointers to strings where each +** entry represents the name of corresponding result column as obtained +** from [sqlite3_column_name()]. +** +** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer +** to an empty string, or a pointer that contains only whitespace and/or +** SQL comments, then no SQL statements are evaluated and the database +** is not changed. +** +** Restrictions: +** +**
          +**
        • The application must ensure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
        • The application must not close the [database connection] specified by +** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. +**
        • The application must not modify the SQL statement text passed into +** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
        +*/ +SQLITE_API int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: {result code definitions} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [extended result code definitions] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* Generic error */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Internal use only */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Not used */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ +#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended result code definitions} +** +** In its default configuration, SQLite API routines return one of 30 integer +** [result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include +** support for additional result codes that provide more detailed information +** about errors. These [extended result codes] are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. Or, the extended code for +** the most recent error can be obtained using +** [sqlite3_extended_errcode()]. +*/ +#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) +#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) +#define SQLITE_ERROR_SNAPSHOT (SQLITE_ERROR | (3<<8)) +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) +#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) +#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) +#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) +#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) +#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) +#define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) +#define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_BUSY_TIMEOUT (SQLITE_BUSY | (3<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) +#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) +#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) +#define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ +#define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) +#define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) +#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) +#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) +#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) +#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) +#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) +#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) +#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) +#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) +#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) +#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) +#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) +#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) +#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8)) +#define SQLITE_CONSTRAINT_DATATYPE (SQLITE_CONSTRAINT |(12<<8)) +#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) +#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) +#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) +#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) +#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) /* internal use only */ + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +** +** Only those flags marked as "Ok for sqlite3_open_v2()" may be +** used as the third argument to the [sqlite3_open_v2()] interface. +** The other flags have historically been ignored by sqlite3_open_v2(), +** though future versions of SQLite might change so that an error is +** raised if any of the disallowed bits are passed into sqlite3_open_v2(). +** Applications should not depend on the historical behavior. +** +** Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into +** [sqlite3_open_v2()] does *not* cause the underlying database file +** to be opened using O_EXCL. Passing SQLITE_OPEN_EXCLUSIVE into +** [sqlite3_open_v2()] has historically be a no-op and might become an +** error in future versions of SQLite. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_SUPER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#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() */ +#define SQLITE_OPEN_EXRESCODE 0x02000000 /* Extended result codes */ + +/* Reserved: 0x00F00000 */ +/* Legacy compatibility: */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ + + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** flag indicates that a file cannot be deleted when open. The +** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on +** read-only media and cannot be changed even by processes with +** elevated privileges. +** +** The SQLITE_IOCAP_BATCH_ATOMIC property means that the underlying +** filesystem supports doing multiple write operations atomically when those +** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and +** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_IMMUTABLE 0x00002000 +#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 + +/* +** CAPI3REF: File Locking Levels +** +** SQLite uses one of these integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object +** +** Every file opened by the [sqlite3_vfs.xOpen] method populates an +** [sqlite3_file] object (or, more commonly, a subclass of the +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
          +**
        • [SQLITE_LOCK_NONE], +**
        • [SQLITE_LOCK_SHARED], +**
        • [SQLITE_LOCK_RESERVED], +**
        • [SQLITE_LOCK_PENDING], or +**
        • [SQLITE_LOCK_EXCLUSIVE]. +**
        +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [file control opcodes | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
          +**
        • [SQLITE_IOCAP_ATOMIC] +**
        • [SQLITE_IOCAP_ATOMIC512] +**
        • [SQLITE_IOCAP_ATOMIC1K] +**
        • [SQLITE_IOCAP_ATOMIC2K] +**
        • [SQLITE_IOCAP_ATOMIC4K] +**
        • [SQLITE_IOCAP_ATOMIC8K] +**
        • [SQLITE_IOCAP_ATOMIC16K] +**
        • [SQLITE_IOCAP_ATOMIC32K] +**
        • [SQLITE_IOCAP_ATOMIC64K] +**
        • [SQLITE_IOCAP_SAFE_APPEND] +**
        • [SQLITE_IOCAP_SEQUENTIAL] +**
        • [SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN] +**
        • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] +**
        • [SQLITE_IOCAP_IMMUTABLE] +**
        • [SQLITE_IOCAP_BATCH_ATOMIC] +**
        +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); + int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); + /* Methods above are valid for version 3 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** KEYWORDS: {file control opcodes} {file control opcode} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +**
          +**
        • [[SQLITE_FCNTL_LOCKSTATE]] +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** +**
        • [[SQLITE_FCNTL_SIZE_HINT]] +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +**
        • [[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** +**
        • [[SQLITE_FCNTL_CHUNK_SIZE]] +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +**
        • [[SQLITE_FCNTL_FILE_POINTER]] +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +**
        • [[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. +** +**
        • [[SQLITE_FCNTL_SYNC_OMITTED]] +** No longer in use. +** +**
        • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions super-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
        • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. +** +**
        • [[SQLITE_FCNTL_WIN32_AV_RETRY]] +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer is the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +**
        • [[SQLITE_FCNTL_PERSIST_WAL]] +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary +** write ahead log ([WAL file]) and shared memory +** files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +**
        • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +**
        • [[SQLITE_FCNTL_OVERWRITE]] +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +**
        • [[SQLITE_FCNTL_VFSNAME]] +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +** +**
        • [[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** +**
        • [[SQLITE_FCNTL_PRAGMA]] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** file control is sent to the open [sqlite3_file] object corresponding +** to the database file to which the pragma statement refers. ^The argument +** to the [SQLITE_FCNTL_PRAGMA] file control is an array of +** pointers to strings (char**) in which the second element of the array +** is the name of the pragma and the third element is the argument to the +** pragma or NULL if the pragma has no argument. ^The handler for an +** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element +** of the char** argument point to a string obtained from [sqlite3_mprintf()] +** or the equivalent and that string will become the result of the pragma or +** the error message if the pragma fails. ^If the +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] +** file control returns [SQLITE_OK], then the parser assumes that the +** VFS has handled the PRAGMA itself and the parser generates a no-op +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means +** that the VFS encountered an error while handling the [PRAGMA] and the +** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] +** file control occurs at the beginning of pragma statement analysis and so +** it is able to override built-in [PRAGMA] statements. +** +**
        • [[SQLITE_FCNTL_BUSYHANDLER]] +** ^The [SQLITE_FCNTL_BUSYHANDLER] +** file-control may be invoked by SQLite on the database file handle +** shortly after it is opened in order to provide a custom VFS with access +** to the connection's busy-handler callback. The argument is of type (void**) +** - an array of two (void *) values. The first (void *) actually points +** to a function of type (int (*)(void *)). In order to invoke the connection's +** busy-handler, this function should be invoked with the second (void *) in +** the array as the only argument. If it returns non-zero, then the operation +** should be retried. If it returns zero, the custom VFS should abandon the +** current operation. +** +**
        • [[SQLITE_FCNTL_TEMPFILENAME]] +** ^Applications can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** to have SQLite generate a +** temporary filename using the same algorithm that is followed to generate +** temporary filenames for TEMP tables and other internal uses. The +** argument should be a char** which will be filled with the filename +** written into memory obtained from [sqlite3_malloc()]. The caller should +** invoke [sqlite3_free()] on the result to avoid a memory leak. +** +**
        • [[SQLITE_FCNTL_MMAP_SIZE]] +** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the +** maximum number of bytes that will be used for memory-mapped I/O. +** The argument is a pointer to a value of type sqlite3_int64 that +** is an advisory maximum number of bytes in the file to memory map. The +** pointer is overwritten with the old value. The limit is not changed if +** the value originally pointed to is negative, and so the current limit +** can be queried by passing in a pointer to a negative number. This +** file-control is used internally to implement [PRAGMA mmap_size]. +** +**
        • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** +**
        • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** +**
        • [[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** +**
        • [[SQLITE_FCNTL_WIN32_SET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This +** opcode causes the xFileControl method to swap the file handle with the one +** pointed to by the pArg argument. This capability is used during testing +** and only needs to be supported when SQLITE_TEST is defined. +** +**
        • [[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should not use this file-control. +** +**
        • [[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +**
        • [[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +** +**
        • [[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] +** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then +** the file descriptor is placed in "batch write mode", which +** means all subsequent write operations will be deferred and done +** atomically at the next [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. Systems +** that do not support batch atomic writes will return SQLITE_NOTFOUND. +** ^Following a successful SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and prior to +** the closing [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] or +** [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE], SQLite will make +** no VFS interface calls on the same [sqlite3_file] file descriptor +** except for calls to the xWrite method and the xFileControl method +** with [SQLITE_FCNTL_SIZE_HINT]. +** +**
        • [[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. +** This file control returns [SQLITE_OK] if and only if the writes were +** all performed successfully and have been committed to persistent storage. +** ^Regardless of whether or not it is successful, this file control takes +** the file descriptor out of batch write mode so that all subsequent +** write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_COMMIT_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +**
        • [[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. +** ^This file control takes the file descriptor out of batch write mode +** so that all subsequent write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +**
        • [[SQLITE_FCNTL_LOCK_TIMEOUT]] +** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode is used to configure a VFS +** to block for up to M milliseconds before failing when attempting to +** obtain a file lock using the xLock or xShmLock methods of the VFS. +** The parameter is a pointer to a 32-bit signed integer that contains +** the value that M is to be set to. Before returning, the 32-bit signed +** integer is overwritten with the previous value of M. +** +**
        • [[SQLITE_FCNTL_DATA_VERSION]] +** The [SQLITE_FCNTL_DATA_VERSION] opcode is used to detect changes to +** a database file. The argument is a pointer to a 32-bit unsigned integer. +** The "data version" for the pager is written into the pointer. The +** "data version" changes whenever any change occurs to the corresponding +** database file, either through SQL statements on the same database +** connection or through transactions committed by separate database +** connections possibly in other processes. The [sqlite3_total_changes()] +** interface can be used to find if any database on the connection has changed, +** but that interface responds to changes on TEMP as well as MAIN and does +** not provide a mechanism to detect changes to MAIN only. Also, the +** [sqlite3_total_changes()] interface responds to internal changes only and +** omits changes made by other database connections. The +** [PRAGMA data_version] command provides a mechanism to detect changes to +** a single attached database that occur due to other database connections, +** but omits changes implemented by the database connection on which it is +** called. This file control is the only mechanism to detect changes that +** happen either internally or externally and that are associated with +** a particular attached database. +** +**
        • [[SQLITE_FCNTL_CKPT_START]] +** The [SQLITE_FCNTL_CKPT_START] opcode is invoked from within a checkpoint +** in wal mode before the client starts to copy pages from the wal +** file to the database file. +** +**
        • [[SQLITE_FCNTL_CKPT_DONE]] +** The [SQLITE_FCNTL_CKPT_DONE] opcode is invoked from within a checkpoint +** in wal mode after the client has finished copying pages from the wal +** file to the database file, but before the *-shm file is updated to +** record the fact that the pages have been checkpointed. +**
        +** +**
      1. [[SQLITE_FCNTL_EXTERNAL_READER]] +** The EXPERIMENTAL [SQLITE_FCNTL_EXTERNAL_READER] opcode is used to detect +** whether or not there is a database client in another process with a wal-mode +** transaction open on the database or not. It is only available on unix.The +** (void*) argument passed with this file-control should be a pointer to a +** value of type (int). The integer value is set to 1 if the database is a wal +** mode database and there exists at least one client in another process that +** currently has an SQL transaction open on the database. It is set to 0 if +** the database is not a wal-mode db, or if there is no such connection in any +** other process. This opcode cannot be used to detect transactions opened +** by clients within the current process, only within other processes. +** +** +**
      2. [[SQLITE_FCNTL_CKSM_FILE]] +** Used by the cksmvfs VFS module only. +** +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 +#define SQLITE_FCNTL_PRAGMA 14 +#define SQLITE_FCNTL_BUSYHANDLER 15 +#define SQLITE_FCNTL_TEMPFILENAME 16 +#define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 +#define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 +#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 +#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 +#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 +#define SQLITE_FCNTL_LOCK_TIMEOUT 34 +#define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 +#define SQLITE_FCNTL_CKPT_DONE 37 +#define SQLITE_FCNTL_RESERVE_BYTES 38 +#define SQLITE_FCNTL_CKPT_START 39 +#define SQLITE_FCNTL_EXTERNAL_READER 40 +#define SQLITE_FCNTL_CKSM_FILE 41 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + + +/* +** CAPI3REF: Mutex Handle +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** CAPI3REF: OS Interface Object +** +** An instance of the sqlite3_vfs object defines the interface between +** the SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The VFS interface is sometimes extended by adding new methods onto +** the end. Each time such an extension occurs, the iVersion field +** is incremented. The iVersion value started out as 1 in +** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 +** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased +** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields +** may be appended to the sqlite3_vfs object and the iVersion value +** may increase again in future versions of SQLite. +** Note that due to an oversight, the structure +** of the sqlite3_vfs object changed in the transition from +** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] +** and yet the iVersion field was not increased. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
          +**
        • [SQLITE_OPEN_MAIN_DB] +**
        • [SQLITE_OPEN_MAIN_JOURNAL] +**
        • [SQLITE_OPEN_TEMP_DB] +**
        • [SQLITE_OPEN_TEMP_JOURNAL] +**
        • [SQLITE_OPEN_TRANSIENT_DB] +**
        • [SQLITE_OPEN_SUBJOURNAL] +**
        • [SQLITE_OPEN_SUPER_JOURNAL] +**
        • [SQLITE_OPEN_WAL] +**
        )^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
          +**
        • [SQLITE_OPEN_DELETEONCLOSE] +**
        • [SQLITE_OPEN_EXCLUSIVE] +**
        +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The SQLITE_ACCESS_READ +** flag is never actually used and is not implemented in the built-in +** VFSes of SQLite. The file is named by the second argument and can be a +** directory. The xAccess method returns [SQLITE_OK] on success or some +** non-zero error code if there is an I/O error or if the name of +** the file given in the second argument is illegal. If SQLITE_OK +** is returned, then non-zero or zero is written into *pResOut to indicate +** whether or not the file is accessible. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in future versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method +** +** These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. They determine +** what kind of permissions the xAccess method is looking for. +** With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks whether the file exists. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
          +**
        • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
        • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
        • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
        • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
        +** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given on the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^The sqlite3_initialize() routine initializes the +** SQLite library. ^The sqlite3_shutdown() routine +** deallocates any resources that were allocated by sqlite3_initialize(). +** These routines are designed to aid in process initialization and +** shutdown on embedded systems. Workstation applications using +** SQLite normally do not need to invoke either of these routines. +** +** A call to sqlite3_initialize() is an "effective" call if it is +** the first time sqlite3_initialize() is invoked during the lifetime of +** the process, or if it is the first time sqlite3_initialize() is invoked +** following a call to sqlite3_shutdown(). ^(Only an effective call +** of sqlite3_initialize() does any initialization. All other calls +** are harmless no-ops.)^ +** +** A call to sqlite3_shutdown() is an "effective" call if it is the first +** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only +** an effective call to sqlite3_shutdown() does any deinitialization. +** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ +** +** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() +** is not. The sqlite3_shutdown() interface must only be called from a +** single thread. All open [database connections] must be closed and all +** other SQLite resources must be deallocated prior to invoking +** sqlite3_shutdown(). +** +** Among other things, ^sqlite3_initialize() will invoke +** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() +** will invoke sqlite3_os_end(). +** +** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** ^If for some reason, sqlite3_initialize() is unable to initialize +** the library (perhaps it is unable to allocate a needed resource such +** as a mutex) it returns an [error code] other than [SQLITE_OK]. +** +** ^The sqlite3_initialize() routine is called internally by many other +** SQLite interfaces so that an application usually does not need to +** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] +** calls sqlite3_initialize() so the SQLite library will be automatically +** initialized when [sqlite3_open()] is called if it has not be initialized +** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** compile-time option, then the automatic calls to sqlite3_initialize() +** are omitted and the application must call sqlite3_initialize() directly +** prior to using any other SQLite interface. For maximum portability, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. +** +** The sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** +** The first argument to sqlite3_config() is an integer +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [configuration option] +** in the first argument. +** +** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** ^If the option is unknown or SQLite is unable to set the option +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** METHOD: sqlite3 +** +** The sqlite3_db_config() interface is used to make configuration +** changes to a [database connection]. The interface is similar to +** [sqlite3_config()] except that the changes apply to a single +** [database connection] (specified in the first argument). +** +** The second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. For example, +** it might allocate any required mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MAIN] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
        +** [[SQLITE_CONFIG_SINGLETHREAD]]
        SQLITE_CONFIG_SINGLETHREAD
        +**
        There are no arguments to this option. ^This option sets the +** [threading mode] to Single-thread. In other words, it disables +** all mutexing and puts SQLite into a mode where it can only be used +** by a single thread. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to change the [threading mode] from its default +** value of Single-thread and so [sqlite3_config()] will return +** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD +** configuration option.
        +** +** [[SQLITE_CONFIG_MULTITHREAD]]
        SQLITE_CONFIG_MULTITHREAD
        +**
        There are no arguments to this option. ^This option sets the +** [threading mode] to Multi-thread. In other words, it disables +** mutexing on [database connection] and [prepared statement] objects. +** The application is responsible for serializing access to +** [database connections] and [prepared statements]. But other mutexes +** are enabled so that SQLite will be safe to use in a multi-threaded +** environment as long as no two threads attempt to use the same +** [database connection] at the same time. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Multi-thread [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_MULTITHREAD configuration option.
        +** +** [[SQLITE_CONFIG_SERIALIZED]]
        SQLITE_CONFIG_SERIALIZED
        +**
        There are no arguments to this option. ^This option sets the +** [threading mode] to Serialized. In other words, this option enables +** all mutexes including the recursive +** mutexes on [database connection] and [prepared statement] objects. +** In this mode (which is the default when SQLite is compiled with +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** to [database connections] and [prepared statements] so that the +** application is free to use the same [database connection] or the +** same [prepared statement] in different threads at the same time. +** ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Serialized [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_SERIALIZED configuration option.
        +** +** [[SQLITE_CONFIG_MALLOC]]
        SQLITE_CONFIG_MALLOC
        +**
        ^(The SQLITE_CONFIG_MALLOC option takes a single argument which is +** a pointer to an instance of the [sqlite3_mem_methods] structure. +** The argument specifies +** alternative low-level memory allocation routines to be used in place of +** the memory allocation routines built into SQLite.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
        +** +** [[SQLITE_CONFIG_GETMALLOC]]
        SQLITE_CONFIG_GETMALLOC
        +**
        ^(The SQLITE_CONFIG_GETMALLOC option takes a single argument which +** is a pointer to an instance of the [sqlite3_mem_methods] structure. +** The [sqlite3_mem_methods] +** structure is filled with the currently defined memory allocation routines.)^ +** This option can be used to overload the default memory allocation +** routines with a wrapper that simulations memory allocation failure or +** tracks memory usage, for example.
        +** +** [[SQLITE_CONFIG_SMALL_MALLOC]]
        SQLITE_CONFIG_SMALL_MALLOC
        +**
        ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +** type int, interpreted as a boolean, which if true provides a hint to +** SQLite that it should avoid large memory allocations if possible. +** SQLite will run faster if it is free to make large memory allocations, +** but some application might prefer to run slower in exchange for +** guarantees about memory fragmentation that are possible if large +** allocations are avoided. This hint is normally off. +**
        +** +** [[SQLITE_CONFIG_MEMSTATUS]]
        SQLITE_CONFIG_MEMSTATUS
        +**
        ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +** interpreted as a boolean, which enables or disables the collection of +** memory allocation statistics. ^(When memory allocation statistics are +** disabled, the following SQLite interfaces become non-operational: +**
          +**
        • [sqlite3_hard_heap_limit64()] +**
        • [sqlite3_memory_used()] +**
        • [sqlite3_memory_highwater()] +**
        • [sqlite3_soft_heap_limit64()] +**
        • [sqlite3_status64()] +**
        )^ +** ^Memory allocation statistics are enabled by default unless SQLite is +** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory +** allocation statistics are disabled by default. +**
        +** +** [[SQLITE_CONFIG_SCRATCH]]
        SQLITE_CONFIG_SCRATCH
        +**
        The SQLITE_CONFIG_SCRATCH option is no longer used. +**
        +** +** [[SQLITE_CONFIG_PAGECACHE]]
        SQLITE_CONFIG_PAGECACHE
        +**
        ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool +** that SQLite can use for the database page cache with the default page +** cache implementation. +** This configuration option is a no-op if an application-defined page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. +** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 65536) plus some extra bytes for each +** page header. ^The number of extra bytes needed by the page header +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. +** ^It is harmless, apart from the wasted memory, +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line.
        +** +** [[SQLITE_CONFIG_HEAP]]
        SQLITE_CONFIG_HEAP
        +**
        ^The SQLITE_CONFIG_HEAP option specifies a static memory buffer +** that SQLite will use for all of its dynamic memory allocation needs +** beyond those provided for by [SQLITE_CONFIG_PAGECACHE]. +** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled +** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns +** [SQLITE_ERROR] if invoked otherwise. +** ^There are three arguments to SQLITE_CONFIG_HEAP: +** An 8-byte aligned pointer to the memory, +** the number of bytes in the memory buffer, and the minimum allocation size. +** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
        +** +** [[SQLITE_CONFIG_MUTEX]]
        SQLITE_CONFIG_MUTEX
        +**
        ^(The SQLITE_CONFIG_MUTEX option takes a single argument which is a +** pointer to an instance of the [sqlite3_mutex_methods] structure. +** The argument specifies alternative low-level mutex routines to be used +** in place the mutex routines built into SQLite.)^ ^SQLite makes a copy of +** the content of the [sqlite3_mutex_methods] structure before the call to +** [sqlite3_config()] returns. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will +** return [SQLITE_ERROR].
        +** +** [[SQLITE_CONFIG_GETMUTEX]]
        SQLITE_CONFIG_GETMUTEX
        +**
        ^(The SQLITE_CONFIG_GETMUTEX option takes a single argument which +** is a pointer to an instance of the [sqlite3_mutex_methods] structure. The +** [sqlite3_mutex_methods] +** structure is filled with the currently defined mutex routines.)^ +** This option can be used to overload the default mutex allocation +** routines with a wrapper used to track mutex usage for performance +** profiling or testing, for example. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will +** return [SQLITE_ERROR].
        +** +** [[SQLITE_CONFIG_LOOKASIDE]]
        SQLITE_CONFIG_LOOKASIDE
        +**
        ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine +** the default size of lookaside memory on each [database connection]. +** The first argument is the +** size of each lookaside buffer slot and the second is the number of +** slots allocated to each database connection.)^ ^(SQLITE_CONFIG_LOOKASIDE +** sets the default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** option to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
        +** +** [[SQLITE_CONFIG_PCACHE2]]
        SQLITE_CONFIG_PCACHE2
        +**
        ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +** a pointer to an [sqlite3_pcache_methods2] object. This object specifies +** the interface to a custom page cache implementation.)^ +** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
        +** +** [[SQLITE_CONFIG_GETPCACHE2]]
        SQLITE_CONFIG_GETPCACHE2
        +**
        ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** the current page cache implementation into that object.)^
        +** +** [[SQLITE_CONFIG_LOG]]
        SQLITE_CONFIG_LOG
        +**
        The SQLITE_CONFIG_LOG option is used to configure the SQLite +** global [error log]. +** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
        +** +** [[SQLITE_CONFIG_URI]]
        SQLITE_CONFIG_URI +**
        ^(The SQLITE_CONFIG_URI option takes a single argument of type int. +** If non-zero, then URI handling is globally enabled. If the parameter is zero, +** then URI handling is globally disabled.)^ ^If URI handling is globally +** enabled, all filenames passed to [sqlite3_open()], [sqlite3_open_v2()], +** [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. ^If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. ^(By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined.)^ +** +** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
        SQLITE_CONFIG_COVERING_INDEX_SCAN +**
        ^The SQLITE_CONFIG_COVERING_INDEX_SCAN option takes a single integer +** argument which is interpreted as a boolean in order to enable or disable +** the use of covering indices for full table scans in the query optimizer. +** ^The default setting is determined +** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" +** if that compile-time option is omitted. +** The ability to disable the use of covering indices for full table scans +** is because some incorrectly coded legacy applications might malfunction +** when the optimization is enabled. Providing the ability to +** disable the optimization allows the older, buggy application code to work +** without change even with newer versions of SQLite. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
        SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE +**
        These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
        +** +** [[SQLITE_CONFIG_SQLLOG]] +**
        SQLITE_CONFIG_SQLLOG +**
        This option is only available if sqlite is compiled with the +** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should +** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). +** The second should be of type (void*). The callback is invoked by the library +** in three separate circumstances, identified by the value passed as the +** fourth parameter. If the fourth parameter is 0, then the database connection +** passed as the second argument has just been opened. The third argument +** points to a buffer containing the name of the main database file. If the +** fourth parameter is 1, then the SQL statement that the third parameter +** points to has just been executed. Or, if the fourth parameter is 2, then +** the connection being passed as the second parameter is being closed. The +** third parameter is passed NULL In this case. An example of using this +** configuration option can be seen in the "test_sqllog.c" source file in +** the canonical SQLite source tree.
        +** +** [[SQLITE_CONFIG_MMAP_SIZE]] +**
        SQLITE_CONFIG_MMAP_SIZE +**
        ^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values +** that are the default mmap size limit (the default setting for +** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. +** ^The default setting can be overridden by each database connection using +** either the [PRAGMA mmap_size] command, or by using the +** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size +** will be silently truncated if necessary so that it does not exceed the +** compile-time maximum mmap size set by the +** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ +** ^If either argument to this option is negative, then that argument is +** changed to its compile-time default. +** +** [[SQLITE_CONFIG_WIN32_HEAPSIZE]] +**
        SQLITE_CONFIG_WIN32_HEAPSIZE +**
        ^The SQLITE_CONFIG_WIN32_HEAPSIZE option is only available if SQLite is +** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro +** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value +** that specifies the maximum size of the created heap. +** +** [[SQLITE_CONFIG_PCACHE_HDRSZ]] +**
        SQLITE_CONFIG_PCACHE_HDRSZ +**
        ^The SQLITE_CONFIG_PCACHE_HDRSZ option takes a single parameter which +** is a pointer to an integer and writes into that integer the number of extra +** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE]. +** The amount of extra space required can change depending on the compiler, +** target platform, and SQLite version. +** +** [[SQLITE_CONFIG_PMASZ]] +**
        SQLITE_CONFIG_PMASZ +**
        ^The SQLITE_CONFIG_PMASZ option takes a single parameter which +** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded +** sorter to that integer. The default minimum PMA Size is set by the +** [SQLITE_SORTER_PMASZ] compile-time option. New threads are launched +** to help with sort operations when multithreaded sorting +** is enabled (using the [PRAGMA threads] command) and the amount of content +** to be sorted exceeds the page size times the minimum of the +** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +**
        SQLITE_CONFIG_STMTJRNL_SPILL +**
        ^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +** +** [[SQLITE_CONFIG_SORTERREF_SIZE]] +**
        SQLITE_CONFIG_SORTERREF_SIZE +**
        The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter +** of type (int) - the new value of the sorter-reference size threshold. +** Usually, when SQLite uses an external sort to order records according +** to an ORDER BY clause, all fields required by the caller are present in the +** sorted records. However, if SQLite determines based on the declared type +** of a table column that its values are likely to be very large - larger +** than the configured sorter-reference size threshold - then a reference +** is stored in each sorted record and the required column values loaded +** from the database as records are returned in sorted order. The default +** value for this option is to never use this optimization. Specifying a +** negative value for this option restores the default behaviour. +** This option is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
        SQLITE_CONFIG_MEMDB_MAXSIZE +**
        The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. +**
        +*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ +#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ +#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ +#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ +#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_db_config()] to make sure that +** the call worked. ^The [sqlite3_db_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
        +** [[SQLITE_DBCONFIG_LOOKASIDE]] +**
        SQLITE_DBCONFIG_LOOKASIDE
        +**
        ^This option takes three additional arguments that determine the +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb +** may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the +** size of each lookaside buffer slot. ^The third argument is the number of +** slots. The size of the buffer in the first argument must be greater than +** or equal to the product of the second and third arguments. The buffer +** must be aligned to an 8-byte boundary. ^If the second argument to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
        +** +** [[SQLITE_DBCONFIG_ENABLE_FKEY]] +**
        SQLITE_DBCONFIG_ENABLE_FKEY
        +**
        ^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
        +** +** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]] +**
        SQLITE_DBCONFIG_ENABLE_TRIGGER
        +**
        ^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back. +** +**

        Originally this option disabled all triggers. ^(However, since +** SQLite version 3.35.0, TEMP triggers are still allowed even if +** this option is off. So, in other words, this option now only disables +** triggers in the main database schema or in the schemas of ATTACH-ed +** databases.)^

        +** +** [[SQLITE_DBCONFIG_ENABLE_VIEW]] +**
        SQLITE_DBCONFIG_ENABLE_VIEW
        +**
        ^This option is used to enable or disable [CREATE VIEW | views]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable views, +** positive to enable views or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether views are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the view setting is not reported back. +** +**

        Originally this option disabled all views. ^(However, since +** SQLite version 3.35.0, TEMP views are still allowed even if +** this option is off. So, in other words, this option now only disables +** views in the main database schema or in the schemas of ATTACH-ed +** databases.)^

        +** +** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] +**
        SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
        +**
        ^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back.
        +** +** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] +**
        SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
        +**
        ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +**
        +** +** [[SQLITE_DBCONFIG_MAINDBNAME]]
        SQLITE_DBCONFIG_MAINDBNAME
        +**
        ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +**
        +** +** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] +**
        SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
        +**
        Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - positive to disable checkpoints-on-close, or zero (the +** default) to enable them, and negative to leave the setting unchanged. +** The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +**
        +** +** [[SQLITE_DBCONFIG_ENABLE_QPSG]]
        SQLITE_DBCONFIG_ENABLE_QPSG
        +**
        ^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates +** the [query planner stability guarantee] (QPSG). When the QPSG is active, +** a single SQL query statement will always use the same algorithm regardless +** of values of [bound parameters].)^ The QPSG disables some query optimizations +** that look at the values of bound parameters, which can make some queries +** slower. But the QPSG has the advantage of more predictable behavior. With +** the QPSG active, SQLite will always use the same query plan in the field as +** was used during testing in the lab. +** The first argument to this setting is an integer which is 0 to disable +** the QPSG, positive to enable QPSG, or negative to leave the setting +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether the QPSG is disabled or enabled +** following this call. +**
        +** +** [[SQLITE_DBCONFIG_TRIGGER_EQP]]
        SQLITE_DBCONFIG_TRIGGER_EQP
        +**
        By default, the output of EXPLAIN QUERY PLAN commands does not +** include output for any operations performed by trigger programs. This +** option is used to set or clear (the default) a flag that governs this +** behavior. The first parameter passed to this operation is an integer - +** positive to enable output for trigger programs, or zero to disable it, +** or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. +**
        +** +** [[SQLITE_DBCONFIG_RESET_DATABASE]]
        SQLITE_DBCONFIG_RESET_DATABASE
        +**
        Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run +** [VACUUM] in order to reset a database back to an empty database +** with no schema and no content. The following process works even for +** a badly corrupted database file: +**
          +**
        1. If the database connection is newly opened, make sure it has read the +** database schema by preparing then discarding some query against the +** database, or calling sqlite3_table_column_metadata(), ignoring any +** errors. This step is only necessary if the application desires to keep +** the database in WAL mode after the reset if it was in WAL mode before +** the reset. +**
        2. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0); +**
        3. [sqlite3_exec](db, "[VACUUM]", 0, 0, 0); +**
        4. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0); +**
        +** Because resetting a database is destructive and irreversible, the +** process requires the use of this obscure API and multiple steps to help +** ensure that it does not happen by accident. +** +** [[SQLITE_DBCONFIG_DEFENSIVE]]
        SQLITE_DBCONFIG_DEFENSIVE
        +**
        The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the +** "defensive" flag for a database connection. When the defensive +** flag is enabled, language features that allow ordinary SQL to +** deliberately corrupt the database file are disabled. The disabled +** features include but are not limited to the following: +**
          +**
        • The [PRAGMA writable_schema=ON] statement. +**
        • The [PRAGMA journal_mode=OFF] statement. +**
        • Writes to the [sqlite_dbpage] virtual table. +**
        • Direct writes to [shadow tables]. +**
        +**
        +** +** [[SQLITE_DBCONFIG_WRITABLE_SCHEMA]]
        SQLITE_DBCONFIG_WRITABLE_SCHEMA
        +**
        The SQLITE_DBCONFIG_WRITABLE_SCHEMA option activates or deactivates the +** "writable_schema" flag. This has the same effect and is logically equivalent +** to setting [PRAGMA writable_schema=ON] or [PRAGMA writable_schema=OFF]. +** The first argument to this setting is an integer which is 0 to disable +** the writable_schema, positive to enable writable_schema, or negative to +** leave the setting unchanged. The second parameter is a pointer to an +** integer into which is written 0 or 1 to indicate whether the writable_schema +** is enabled or disabled following this call. +**
        +** +** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]] +**
        SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
        +**
        The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates +** the legacy behavior of the [ALTER TABLE RENAME] command such it +** behaves as it did prior to [version 3.24.0] (2018-06-04). See the +** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for +** additional information. This feature can also be turned on and off +** using the [PRAGMA legacy_alter_table] statement. +**
        +** +** [[SQLITE_DBCONFIG_DQS_DML]] +**
        SQLITE_DBCONFIG_DQS_DML +**
        The SQLITE_DBCONFIG_DQS_DML option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DML statements +** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. +**
        +** +** [[SQLITE_DBCONFIG_DQS_DDL]] +**
        SQLITE_DBCONFIG_DQS_DDL +**
        The SQLITE_DBCONFIG_DQS option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DDL statements, +** such as CREATE TABLE and CREATE INDEX. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. +**
        +** +** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]] +**
        SQLITE_DBCONFIG_TRUSTED_SCHEMA +**
        The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to +** assume that database schemas are untainted by malicious content. +** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite +** takes additional defensive steps to protect the application from harm +** including: +**
          +**
        • Prohibit the use of SQL functions inside triggers, views, +** CHECK constraints, DEFAULT clauses, expression indexes, +** partial indexes, or generated columns +** unless those functions are tagged with [SQLITE_INNOCUOUS]. +**
        • Prohibit the use of virtual tables inside of triggers or views +** unless those virtual tables are tagged with [SQLITE_VTAB_INNOCUOUS]. +**
        +** This setting defaults to "on" for legacy compatibility, however +** all applications are advised to turn it off if possible. This setting +** can also be controlled using the [PRAGMA trusted_schema] statement. +**
        +** +** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] +**
        SQLITE_DBCONFIG_LEGACY_FILE_FORMAT +**
        The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates +** the legacy file format flag. When activated, this flag causes all newly +** created database file to have a schema format version number (the 4-byte +** integer found at offset 44 into the database header) of 1. This in turn +** means that the resulting database file will be readable and writable by +** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, +** newly created databases are generally not understandable by SQLite versions +** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there +** is now scarcely any need to generated database files that are compatible +** all the way back to version 3.0.0, and so this setting is of little +** practical use, but is provided so that SQLite can continue to claim the +** ability to generate new database files that are compatible with version +** 3.0.0. +**

        Note that when the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT setting is on, +** the [VACUUM] command will fail with an obscure error when attempting to +** process a table with generated columns and a descending index. This is +** not considered a bug since SQLite versions 3.3.0 and earlier do not support +** either generated columns or decending indexes. +**

        +**
        +*/ +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ +#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ +#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ +#define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ +#define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ +#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ +#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */ +#define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */ + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 +** +** ^The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. ^The extended result +** codes are disabled by default for historical compatibility. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid +** METHOD: sqlite3 +** +** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) +** has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. ^The rowid is always available +** as an undeclared column named ROWID, OID, or _ROWID_ as long as those +** names are not also used by explicitly declared columns. ^If +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of +** the most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** zero. +** +** As well as being set automatically as rows are inserted into database +** tables, the value returned by this function may be set explicitly by +** [sqlite3_set_last_insert_rowid()] +** +** Some virtual table implementations may INSERT rows into rowid tables as +** part of committing a transaction (e.g. to flush data accumulated in memory +** to disk). In this case subsequent calls to this function return the rowid +** associated with these internal INSERT operations, which leads to +** unintuitive results. Virtual table implementations that do write to rowid +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** control to the user. +** +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned +** by this routine reverts to what it was before the trigger was fired.)^ +** +** ^An [INSERT] that fails due to a constraint violation is not a +** successful [INSERT] and does not change the value returned by this +** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** and INSERT OR ABORT make no changes to the return value of this +** routine when their insertion fails. ^(When INSERT OR REPLACE +** encounters a constraint violation, it does not fail. The +** INSERT continues to completion after deleting rows that caused +** the constraint problem so INSERT OR REPLACE will always change +** the return value of this interface.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** This function is accessible to SQL statements via the +** [last_insert_rowid() SQL function]. +** +** If a separate thread performs a new [INSERT] on the same +** database connection while the [sqlite3_last_insert_rowid()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Set the Last Insert Rowid value. +** METHOD: sqlite3 +** +** The sqlite3_set_last_insert_rowid(D, R) method allows the application to +** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** without inserting a row into the database. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 +** +** ^These functions return the number of rows modified, inserted or +** deleted by the most recently completed INSERT, UPDATE or DELETE +** statement on the database connection specified by the only parameter. +** The two functions are identical except for the type of the return value +** and that if the number of rows modified by the most recent INSERT, UPDATE +** or DELETE is greater than the maximum value supported by type "int", then +** the return value of sqlite3_changes() is undefined. ^Executing any other +** type of SQL statement does not modify the value returned by these functions. +** +** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** [foreign key actions] or [REPLACE] constraint resolution are not counted. +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real +** tables are counted. +** +** Things are more complicated if the sqlite3_changes() function is +** executed while a trigger program is running. This may happen if the +** program uses the [changes() SQL function], or if some other callback +** function invokes sqlite3_changes() directly. Essentially: +** +**
          +**
        • ^(Before entering a trigger program the value returned by +** sqlite3_changes() function is saved. After the trigger program +** has finished, the original value is restored.)^ +** +**
        • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() +** value will be saved and restored after each sub-trigger has run.)^ +**
        +** +** ^This means that if the changes() SQL function (or similar) is used +** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** returns the value as set when the calling statement began executing. +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the +** previous INSERT, UPDATE or DELETE statement within the same trigger. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_changes()] is running then the value returned +** is unpredictable and not meaningful. +** +** See also: +**
          +**
        • the [sqlite3_total_changes()] interface +**
        • the [count_changes pragma] +**
        • the [changes() SQL function] +**
        • the [data_version pragma] +**
        +*/ +SQLITE_API int sqlite3_changes(sqlite3*); +SQLITE_API sqlite3_int64 sqlite3_changes64(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 +** +** ^These functions return the total number of rows inserted, modified or +** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed +** since the database connection was opened, including those executed as +** part of trigger programs. The two functions are identical except for the +** type of the return value and that if the number of rows modified by the +** connection exceeds the maximum value supported by type "int", then +** the return value of sqlite3_total_changes() is undefined. ^Executing +** any other type of SQL statement does not affect the value returned by +** sqlite3_total_changes(). +** +** ^Changes made as part of [foreign key actions] are included in the +** count, but those made as part of REPLACE constraint resolution are +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** are not counted. +** +** The [sqlite3_total_changes(D)] interface only reports the number +** of rows that changed due to SQL statement run against database +** connection D. Any changes by other database connections are ignored. +** To detect changes against a database file from other database +** connections use the [PRAGMA data_version] command or the +** [SQLITE_FCNTL_DATA_VERSION] [file control]. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_total_changes()] is running then the value +** returned is unpredictable and not meaningful. +** +** See also: +**
          +**
        • the [sqlite3_changes()] interface +**
        • the [count_changes pragma] +**
        • the [changes() SQL function] +**
        • the [data_version pragma] +**
        • the [SQLITE_FCNTL_DATA_VERSION] [file control] +**
        +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); +SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 +** +** ^This function causes any pending database operation to abort and +** return at its earliest opportunity. This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** ^It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. But it +** is not safe to call this routine with a [database connection] that +** is closed or might close before sqlite3_interrupt() returns. +** +** ^If an SQL operation is very nearly finished at the time when +** sqlite3_interrupt() is called, then it might not have an opportunity +** to be interrupted and might continue to completion. +** +** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** that is inside an explicit transaction, then the entire transaction +** will be rolled back automatically. +** +** ^The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. ^Any new SQL statements +** that are started after the sqlite3_interrupt() call and before the +** running statement count reaches zero are interrupted as if they had been +** running prior to the sqlite3_interrupt() call. ^New SQL statements +** that are started after the running statement count reaches zero are +** not effected by the sqlite3_interrupt(). +** ^A call to sqlite3_interrupt(D) that occurs when there are no running +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete +** +** These routines are useful during command-line input to determine if the +** currently entered text seems to form a complete SQL statement or +** if additional input is needed before sending the text into +** SQLite for parsing. ^These routines return 1 if the input string +** appears to be a complete SQL statement. ^A statement is judged to be +** complete if it ends with a semicolon token and is not a prefix of a +** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within +** string literals or quoted identifier names or comments are not +** independent tokens (they are part of the token in which they are +** embedded) and thus do not count as a statement terminator. ^Whitespace +** and comments that follow the final semicolon are ignored. +** +** ^These routines return 0 if the statement is incomplete. ^If a +** memory allocation fails, then SQLITE_NOMEM is returned. +** +** ^These routines do not parse the SQL statements thus +** will not detect syntactically incorrect SQL. +** +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior +** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked +** automatically by sqlite3_complete16(). If that initialization fails, +** then the return value from sqlite3_complete16() will be non-zero +** regardless of whether or not the input SQL is complete.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +SQLITE_API int sqlite3_complete(const char *sql); +SQLITE_API int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors +** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 +** +** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X +** that might be invoked with argument P whenever +** an attempt is made to access a database table associated with +** [database connection] D when another thread +** or process has the table locked. +** The sqlite3_busy_handler() interface is used to implement +** [sqlite3_busy_timeout()] and [PRAGMA busy_timeout]. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] +** is returned immediately upon encountering the lock. ^If the busy callback +** is not NULL, then the callback might be invoked with two arguments. +** +** ^The first argument to the busy handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). ^The second argument to +** the busy handler callback is the number of times that the busy handler has +** been invoked previously for the same locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] is returned +** to the application. +** ^If the callback returns non-zero, then another attempt +** is made to access the database and the cycle repeats. +** +** The presence of a busy handler does not guarantee that it will be invoked +** when there is lock contention. ^If SQLite determines that invoking the busy +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** to the application instead of invoking the +** busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^(There can only be a single busy handler defined for each +** [database connection]. Setting a new busy handler clears any +** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] +** or evaluating [PRAGMA busy_timeout=N] will change the +** busy handler and thus clear any previously set busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. In other words, +** the busy handler is not reentrant. Any such actions +** result in undefined behavior. +** +** A busy handler must not close the database connection +** or [prepared statement] that invoked the busy handler. +*/ +SQLITE_API int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*); + +/* +** CAPI3REF: Set A Busy Timeout +** METHOD: sqlite3 +** +** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. ^The handler +** will sleep multiple times until at least "ms" milliseconds of sleeping +** have accumulated. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY]. +** +** ^Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** ^(There can only be a single busy handler for a particular +** [database connection] at any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +** +** See also: [PRAGMA busy_timeout] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
        +**        Name        | Age
        +**        -----------------------
        +**        Alice       | 43
        +**        Bob         | 28
        +**        Cindy       | 21
        +** 
        +** +** There are two columns (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array named azResult. Then azResult holds this content: +** +**
        +**        azResult[0] = "Name";
        +**        azResult[1] = "Age";
        +**        azResult[2] = "Alice";
        +**        azResult[3] = "43";
        +**        azResult[4] = "Bob";
        +**        azResult[5] = "28";
        +**        azResult[6] = "Cindy";
        +**        azResult[7] = "21";
        +** 
        )^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must pass the result table pointer to sqlite3_free_table() in order to +** release the memory that was malloced. Because of the way the +** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling +** function must not try to call [sqlite3_free()] directly. Only +** [sqlite3_free_table()] is able to release the memory properly and safely. +** +** The sqlite3_get_table() interface is implemented as a wrapper around +** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access +** to any internal data structures of SQLite. It uses only the public +** interface defined here. As a consequence, errors that occur in the +** wrapper layer outside of the internal [sqlite3_exec()] call are not +** reflected in subsequent calls to [sqlite3_errcode()] or +** [sqlite3_errmsg()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** These routines understand most of the common formatting options from +** the standard library printf() +** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]). +** See the [built-in printf()] documentation for details. +** +** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc64()]. +** The strings returned by these two routines should be +** released by [sqlite3_free()]. ^Both routines return a +** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. Note that the order of the +** first two parameters is reversed from snprintf().)^ This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. ^(Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer.)^ We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** ^As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. ^The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. So the longest string that can be completely +** written will be n-1 characters. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** See also: [built-in printf()], [printf() SQL function] +*/ +SQLITE_API char *sqlite3_mprintf(const char*,...); +SQLITE_API char *sqlite3_vmprintf(const char*, va_list); +SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** The SQLite core uses these three routines for all of its own +** internal memory allocation needs. "Core" in the previous sentence +** does not include operating-system specific [VFS] implementation. The +** Windows VFS uses native malloc() and free() for some operations. +** +** ^The sqlite3_malloc() routine returns a pointer to a block +** of memory at least N bytes in length, where N is the parameter. +** ^If sqlite3_malloc() is unable to obtain sufficient free +** memory, it returns a NULL pointer. ^If the parameter N to +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^The sqlite3_malloc64(N) routine works just like +** sqlite3_malloc(N) except that N is an unsigned 64-bit integer instead +** of a signed 32-bit integer. +** +** ^Calling sqlite3_free() with a pointer previously returned +** by sqlite3_malloc() or sqlite3_realloc() releases that memory so +** that it might be reused. ^The sqlite3_free() routine is +** a no-op if is called with a NULL pointer. Passing a NULL pointer +** to sqlite3_free() is harmless. After being freed, memory +** should neither be read nor written. Even reading previously freed +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** might result if sqlite3_free() is called with a non-NULL pointer that +** was not obtained from sqlite3_malloc() or sqlite3_realloc(). +** +** ^The sqlite3_realloc(X,N) interface attempts to resize a +** prior memory allocation X to be at least N bytes. +** ^If the X parameter to sqlite3_realloc(X,N) +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N). +** ^If the N parameter to sqlite3_realloc(X,N) is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(X). +** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation +** of at least N bytes in size or NULL if insufficient memory is available. +** ^If M is the size of the prior allocation, then min(N,M) bytes +** of the prior allocation are copied into the beginning of buffer returned +** by sqlite3_realloc(X,N) and the prior allocation is freed. +** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the +** prior allocation is not freed. +** +** ^The sqlite3_realloc64(X,N) interfaces works the same as +** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead +** of a 32-bit signed integer. +** +** ^If X is a memory allocation previously obtained from sqlite3_malloc(), +** sqlite3_malloc64(), sqlite3_realloc(), or sqlite3_realloc64(), then +** sqlite3_msize(X) returns the size of that memory allocation in bytes. +** ^The value returned by sqlite3_msize(X) might be larger than the number +** of bytes requested when X was allocated. ^If X is a NULL pointer then +** sqlite3_msize(X) returns zero. If X points to something that is not +** the beginning of memory allocation, or if it points to a formerly +** valid memory allocation that has now been freed, then the behavior +** of sqlite3_msize(X) is undefined and possibly harmful. +** +** ^The memory returned by sqlite3_malloc(), sqlite3_realloc(), +** sqlite3_malloc64(), and sqlite3_realloc64() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] +** must be either NULL or else pointers obtained from a prior +** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void *sqlite3_realloc64(void*, sqlite3_uint64); +SQLITE_API void sqlite3_free(void*); +SQLITE_API sqlite3_uint64 sqlite3_msize(void*); + +/* +** CAPI3REF: Memory Allocator Statistics +** +** SQLite provides these two interfaces for reporting on the status +** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] +** routines, which form the built-in memory allocation subsystem. +** +** ^The [sqlite3_memory_used()] routine returns the number of bytes +** of memory currently outstanding (malloced but not freed). +** ^The [sqlite3_memory_highwater()] routine returns the maximum +** value of [sqlite3_memory_used()] since the high-water mark +** was last reset. ^The values returned by [sqlite3_memory_used()] and +** [sqlite3_memory_highwater()] include any overhead +** added by SQLite in its implementation of [sqlite3_malloc()], +** but not overhead added by the any underlying system library +** routines that [sqlite3_malloc()] may call. +** +** ^The memory high-water mark is reset to the current value of +** [sqlite3_memory_used()] if and only if the parameter to +** [sqlite3_memory_highwater()] is true. ^The value returned +** by [sqlite3_memory_highwater(1)] is the high-water mark +** prior to the reset. +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_used(void); +SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Pseudo-Random Number Generator +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** the built-in random() and randomblob() SQL functions. This interface allows +** applications to access the same PRNG for other purposes. +** +** ^A call to this routine stores N bytes of randomness into buffer P. +** ^The P parameter can be a NULL pointer. +** +** ^If this routine has not been previously called or if the previous +** call had N less than one or a NULL pointer for P, then the PRNG is +** seeded using randomness obtained from the xRandomness method of +** the default [sqlite3_vfs] object. +** ^If the previous call to this routine had an N of 1 or more and a +** non-NULL P then the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** KEYWORDS: {authorizer callback} +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare_v3()], [sqlite3_prepare16()], [sqlite3_prepare16_v2()], +** and [sqlite3_prepare16_v3()]. ^At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. ^The authorizer callback should +** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. ^If the authorizer callback returns +** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] +** then the [sqlite3_prepare_v2()] or equivalent call that triggered +** the authorizer will fail with an error message. +** +** When the callback returns [SQLITE_OK], that means the operation +** requested is ok. ^When the callback returns [SQLITE_DENY], the +** [sqlite3_prepare_v2()] or equivalent call that triggered the +** authorizer will fail with an error message explaining that +** access is denied. +** +** ^The first parameter to the authorizer callback is a copy of the third +** parameter to the sqlite3_set_authorizer() interface. ^The second parameter +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. ^The third through sixth parameters +** to the callback are either NULL pointers or zero-terminated strings +** that contain additional details about the action to be authorized. +** Applications must always be prepared to encounter a NULL pointer in any +** of the third through the sixth parameters of the authorization callback. +** +** ^If the action code is [SQLITE_READ] +** and the callback returns [SQLITE_IGNORE] then the +** [prepared statement] statement is constructed to substitute +** a NULL value in place of the table column that would have +** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] +** return can be used to deny an untrusted user access to individual +** columns of a table. +** ^When a table is referenced by a [SELECT] but no column values are +** extracted from that table (for example in a query like +** "SELECT count(*) FROM tab") then the [SQLITE_READ] authorizer callback +** is invoked once for that table with a column name that is an empty string. +** ^If the action code is [SQLITE_DELETE] and the callback returns +** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the +** [truncate optimization] is disabled and all rows are deleted individually. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** and limiting database size using the [max_page_count] [PRAGMA] +** in addition to using an authorizer. +** +** ^(Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call.)^ ^Disable the authorizer by installing a NULL callback. +** The authorizer is disabled by default. +** +** The authorizer callback must not do anything that will modify +** the database connection that invoked the authorizer callback. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the +** statement might be re-prepared during [sqlite3_step()] due to a +** schema change. Hence, the application should ensure that the +** correct authorizer callback remains in place during the [sqlite3_step()]. +** +** ^Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. Authorization is not +** performed during statement evaluation in [sqlite3_step()], unless +** as stated in the previous paragraph, sqlite3_step() invokes +** sqlite3_prepare_v2() to reprepare a statement after a schema change. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [conflict resolution mode] +** returned from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** These action code values signify what kind of operation is to be +** authorized. The 3rd and 4th parameters to the authorization +** callback function will be parameters or NULL depending on which of these +** codes is used as the second parameter. ^(The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ +#define SQLITE_RECURSIVE 33 /* NULL NULL */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** +** ^The callback function registered by sqlite3_trace() is invoked at +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the +** SQL statement text as the statement first begins executing. +** ^(Additional sqlite3_trace() callbacks might occur +** as each triggered subprogram is entered. The callbacks for triggers +** contain a UTF-8 SQL comment that identifies the trigger.)^ +** +** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit +** the length of [bound parameter] expansion in the output of sqlite3_trace(). +** +** ^The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes. ^The profile callback contains +** the original statement text and an estimate of wall-clock time +** of how long that statement took to run. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. Invoking +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the +** profile callback. +*/ +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The M argument +** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +**
        +** [[SQLITE_TRACE_STMT]]
        SQLITE_TRACE_STMT
        +**
        ^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]]
        SQLITE_TRACE_PROFILE
        +**
        ^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]]
        SQLITE_TRACE_ROW
        +**
        ^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]]
        SQLITE_TRACE_CLOSE
        +**
        ^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +**
        +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + +/* +** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. ^If N is less than one then the progress +** handler is disabled. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^If the progress callback returns non-zero, the operation is +** interrupted. This feature can be used to implement a +** "Cancel" button on a GUI progress dialog box. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 +** +** ^These routines open an SQLite database file as specified by the +** filename argument. ^The filename argument is interpreted as UTF-8 for +** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte +** order for sqlite3_open16(). ^(A [database connection] handle is usually +** returned in *ppDb, even if an error occurs. The only exception is that +** if SQLite is unable to allocate memory to hold the [sqlite3] object, +** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] +** object.)^ ^(If the database is opened (and/or created) successfully, then +** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding will be UTF-8 for databases created using +** sqlite3_open() or sqlite3_open_v2(). ^The default encoding for databases +** created using sqlite3_open16() will be UTF-16 in the native byte order. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** The sqlite3_open_v2() interface works like sqlite3_open() +** except that it accepts two additional parameters for additional control +** over the new database connection. ^(The flags parameter to +** sqlite3_open_v2() must include, at a minimum, one of the following +** three flag combinations:)^ +** +**
        +** ^(
        [SQLITE_OPEN_READONLY]
        +**
        The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
        )^ +** +** ^(
        [SQLITE_OPEN_READWRITE]
        +**
        The database is opened for reading and writing if possible, or reading +** only if the file is write protected by the operating system. In either +** case the database must already exist, otherwise an error is returned.
        )^ +** +** ^(
        [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
        +**
        The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
        )^ +**
        +** +** In addition to the required flags, the following optional flags are +** also supported: +** +**
        +** ^(
        [SQLITE_OPEN_URI]
        +**
        The filename can be interpreted as a URI if this flag is set.
        )^ +** +** ^(
        [SQLITE_OPEN_MEMORY]
        +**
        The database will be opened as an in-memory database. The database +** is named by the "filename" argument for the purposes of cache-sharing, +** if shared cache mode is enabled, but the "filename" is otherwise ignored. +**
        )^ +** +** ^(
        [SQLITE_OPEN_NOMUTEX]
        +**
        The new database connection will use the "multi-thread" +** [threading mode].)^ This means that separate threads are allowed +** to use SQLite at the same time, as long as each thread is using +** a different [database connection]. +** +** ^(
        [SQLITE_OPEN_FULLMUTEX]
        +**
        The new database connection will use the "serialized" +** [threading mode].)^ This means the multiple threads can safely +** attempt to use the same database connection at the same time. +** (Mutexes will block any actual concurrency, but in this mode +** there is no harm in trying.) +** +** ^(
        [SQLITE_OPEN_SHAREDCACHE]
        +**
        The database is opened [shared cache] enabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** ^(
        [SQLITE_OPEN_PRIVATECACHE]
        +**
        The database is opened [shared cache] disabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** [[OPEN_EXRESCODE]] ^(
        [SQLITE_OPEN_EXRESCODE]
        +**
        The database connection comes up in "extended result code mode". +** In other words, the database behaves has if +** [sqlite3_extended_result_codes(db,1)] where called on the database +** connection as soon as the connection is created. In addition to setting +** the extended result code mode, this flag also causes [sqlite3_open_v2()] +** to return an extended result code.
        +** +** [[OPEN_NOFOLLOW]] ^(
        [SQLITE_OPEN_NOFOLLOW]
        +**
        The database filename is not allowed to be a symbolic link
        +**
        )^ +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** required combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. Historic versions of SQLite +** have silently ignored surplus bits in the flags parameter to +** sqlite3_open_v2(), however that behavior might not be carried through +** into future versions of SQLite and so applications should not rely +** upon it. Note in particular that the SQLITE_OPEN_EXCLUSIVE flag is a no-op +** for sqlite3_open_v2(). The SQLITE_OPEN_EXCLUSIVE does *not* cause +** the open to fail if the database already exists. The SQLITE_OPEN_EXCLUSIVE +** flag is intended for use by the [sqlite3_vfs|VFS interface] only, and not +** by sqlite3_open_v2(). +** +** ^The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system interface that +** the new database connection should use. ^If the fourth parameter is +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. ^This in-memory database will vanish when +** the database connection is closed. Future versions of SQLite might +** make use of additional special filenames that begin with the ":" character. +** It is recommended that when a database filename actually does begin with +** a ":" character you should prefix the filename with a pathname such as +** "./" to avoid ambiguity. +** +** ^If the filename is an empty string, then a private, temporary +** on-disk database will be created. ^This private database will be +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

        URI Filenames

        +** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the third argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path +** is a drive specification (e.g. "C:").)^ +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite and its built-in [VFSes] interpret the +** following query parameters: +** +**
          +**
        • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
        • mode: ^(The mode parameter may be set to either "ro", "rw", +** "rwc", or "memory". Attempting to set it to any other value is +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is +** set to "memory" then a pure [in-memory database] that never reads +** or writes from disk is used. ^It is an error to specify a value for +** the mode parameter that is less restrictive than that specified by +** the flags passed in the third parameter to sqlite3_open_v2(). +** +**
        • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behavior requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +** +**
        • psow: ^The psow parameter indicates whether or not the +** [powersafe overwrite] property does or does not apply to the +** storage media on which the database file resides. +** +**
        • nolock: ^The nolock parameter is a boolean query parameter +** which if set disables file locking in rollback journal modes. This +** is useful for accessing a database on a filesystem that does not +** support locking. Caution: Database corruption might result if two +** or more processes write to the same database and any one of those +** processes uses nolock=1. +** +**
        • immutable: ^The immutable parameter is a boolean query +** parameter that indicates that the database file is stored on +** read-only media. ^When immutable is set, SQLite assumes that the +** database file cannot be changed, even by a process with higher +** privilege, and so the database is opened read-only and all locking +** and change detection is disabled. Caution: Setting the immutable +** property on a database file that does in fact change can result +** in incorrect query results and/or [SQLITE_CORRUPT] errors. +** See also: [SQLITE_IOCAP_IMMUTABLE]. +** +**
        +** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

        URI filename examples

        +** +** +**
        URI filenames Results +**
        file:data.db +** Open the file "data.db" in the current directory. +**
        file:/home/fred/data.db
        +** file:///home/fred/data.db
        +** file://localhost/home/fred/data.db
        +** Open the database file "/home/fred/data.db". +**
        file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
        +** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
        file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
        file:/home/fred/data.db?vfs=unix-dotfile +** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" +** that uses dot-files in place of posix advisory locking. +**
        file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +** Use "ro" instead: "file:data.db?mode=ro". +**
        +** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** sqlite3_open() or sqlite3_open_v2(). +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various +** features that require the use of temporary files may fail. +** +** See also: [sqlite3_temp_directory] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to [VFS|custom VFS implementations], +** that check if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** The first parameter to these interfaces (hereafter referred to +** as F) must be one of: +**
          +**
        • A database filename pointer created by the SQLite core and +** passed into the xOpen() method of a VFS implemention, or +**
        • A filename obtained from [sqlite3_db_filename()], or +**
        • A new filename constructed using [sqlite3_create_filename()]. +**
        +** If the F parameter is not one of the above, then the behavior is +** undefined and probably undesirable. Older versions of SQLite were +** more tolerant of invalid F parameters than newer versions. +** +** If F is a suitable filename (as described in the previous paragraph) +** and if P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F and it +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the +** value of query parameter P is one of "yes", "true", or "on" in any +** case or if the value begins with a non-zero number. The +** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of +** query parameter P is one of "no", "false", or "off" in any case or +** if the value begins with a numeric zero. If P is not a query +** parameter on F or if the value of P does not match any of the +** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** The sqlite3_uri_key(F,N) returns a pointer to the name (not +** the value) of the N-th query parameter for filename F, or a NULL +** pointer if N is less than zero or greater than the number of query +** parameters minus 1. The N value is zero-based so N should be 0 to obtain +** the name of the first query parameter, 1 for the second parameter, and +** so forth. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that the SQLite core passed +** into the xOpen VFS method, then the behavior of this routine is undefined +** and probably undesirable. +** +** Beginning with SQLite [version 3.31.0] ([dateof:3.31.0]) the input F +** parameter can also be the name of a rollback journal file or WAL file +** in addition to the main database file. Prior to version 3.31.0, these +** routines would only work if F was the name of the main database file. +** When the F parameter is the name of the rollback journal or WAL file, +** it has access to all the same query parameters as were found on the +** main database file. +** +** See the [URI filename] documentation for additional information. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); +SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N); + +/* +** CAPI3REF: Translate filenames +** +** These routines are available to [VFS|custom VFS implementations] for +** translating filenames between the main database file, the journal file, +** and the WAL file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** passed by the SQLite core into the VFS, then sqlite3_filename_database(F) +** returns the name of the corresponding database file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** passed by the SQLite core into the VFS, or if F is a database filename +** obtained from [sqlite3_db_filename()], then sqlite3_filename_journal(F) +** returns the name of the corresponding rollback journal file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** that was passed by the SQLite core into the VFS, or if F is a database +** filename obtained from [sqlite3_db_filename()], then +** sqlite3_filename_wal(F) returns the name of the corresponding +** WAL file. +** +** In all of the above, if F is not the name of a database, journal or WAL +** filename passed into the VFS from the SQLite core and F is not the +** return value from [sqlite3_db_filename()], then the result is +** undefined and is likely a memory access violation. +*/ +SQLITE_API const char *sqlite3_filename_database(const char*); +SQLITE_API const char *sqlite3_filename_journal(const char*); +SQLITE_API const char *sqlite3_filename_wal(const char*); + +/* +** CAPI3REF: Database File Corresponding To A Journal +** +** ^If X is the name of a rollback or WAL-mode journal file that is +** passed into the xOpen method of [sqlite3_vfs], then +** sqlite3_database_file_object(X) returns a pointer to the [sqlite3_file] +** object that represents the main database file. +** +** This routine is intended for use in custom [VFS] implementations +** only. It is not a general-purpose interface. +** The argument sqlite3_file_object(X) must be a filename pointer that +** has been passed into [sqlite3_vfs].xOpen method where the +** flags parameter to xOpen contains one of the bits +** [SQLITE_OPEN_MAIN_JOURNAL] or [SQLITE_OPEN_WAL]. Any other use +** of this routine results in undefined and probably undesirable +** behavior. +*/ +SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); + +/* +** CAPI3REF: Create and Destroy VFS Filenames +** +** These interfces are provided for use by [VFS shim] implementations and +** are not useful outside of that context. +** +** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of +** database filename D with corresponding journal file J and WAL file W and +** with N URI parameters key/values pairs in the array P. The result from +** sqlite3_create_filename(D,J,W,N,P) is a pointer to a database filename that +** is safe to pass to routines like: +**
          +**
        • [sqlite3_uri_parameter()], +**
        • [sqlite3_uri_boolean()], +**
        • [sqlite3_uri_int64()], +**
        • [sqlite3_uri_key()], +**
        • [sqlite3_filename_database()], +**
        • [sqlite3_filename_journal()], or +**
        • [sqlite3_filename_wal()]. +**
        +** If a memory allocation error occurs, sqlite3_create_filename() might +** return a NULL pointer. The memory obtained from sqlite3_create_filename(X) +** must be released by a corresponding call to sqlite3_free_filename(Y). +** +** The P parameter in sqlite3_create_filename(D,J,W,N,P) should be an array +** of 2*N pointers to strings. Each pair of pointers in this array corresponds +** to a key and value for a query parameter. The P parameter may be a NULL +** pointer if N is zero. None of the 2*N pointers in the P array may be +** NULL pointers and key pointers should not be empty strings. +** None of the D, J, or W parameters to sqlite3_create_filename(D,J,W,N,P) may +** be NULL pointers, though they can be empty strings. +** +** The sqlite3_free_filename(Y) routine releases a memory allocation +** previously obtained from sqlite3_create_filename(). Invoking +** sqlite3_free_filename(Y) where Y is a NULL pointer is a harmless no-op. +** +** If the Y parameter to sqlite3_free_filename(Y) is anything other +** than a NULL pointer or a pointer previously acquired from +** sqlite3_create_filename(), then bad things such as heap +** corruption or segfaults may occur. The value Y should not be +** used again after sqlite3_free_filename(Y) has been called. This means +** that if the [sqlite3_vfs.xOpen()] method of a VFS has been called using Y, +** then the corresponding [sqlite3_module.xClose() method should also be +** invoked prior to calling sqlite3_free_filename(Y). +*/ +SQLITE_API char *sqlite3_create_filename( + const char *zDatabase, + const char *zJournal, + const char *zWal, + int nParam, + const char **azParam +); +SQLITE_API void sqlite3_free_filename(char*); + +/* +** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 +** +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** ^The sqlite3_extended_errcode() +** interface is the same except that it always returns the +** [extended result code] even when extended result codes are +** disabled. +** +** The values returned by sqlite3_errcode() and/or +** sqlite3_extended_errcode() might change with each API call. +** Except, there are some interfaces that are guaranteed to never +** change the value of the error code. The error-code preserving +** interfaces include the following: +** +**
          +**
        • sqlite3_errcode() +**
        • sqlite3_extended_errcode() +**
        • sqlite3_errmsg() +**
        • sqlite3_errmsg16() +**
        • sqlite3_error_offset() +**
        +** +** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(Memory to hold the error message string is managed internally. +** The application does not need to worry about freeing the result. +** However, the error string might be overwritten or deallocated by +** subsequent calls to other SQLite interface functions.)^ +** +** ^The sqlite3_errstr() interface returns the English-language text +** that describes the [result code], as UTF-8. +** ^(Memory to hold the error message string is managed internally +** and must not be freed by the application)^. +** +** ^If the most recent error references a specific token in the input +** SQL, the sqlite3_error_offset() interface returns the byte offset +** of the start of that token. ^The byte offset returned by +** sqlite3_error_offset() assumes that the input SQL is UTF8. +** ^If the most recent error does not reference a specific token in the input +** SQL, then the sqlite3_error_offset() function returns -1. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** If an interface fails with SQLITE_MISUSE, that means the interface +** was invoked incorrectly by the application. In that case, the +** error code and message may or may not be set. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); +SQLITE_API const char *sqlite3_errstr(int); +SQLITE_API int sqlite3_error_offset(sqlite3 *db); + +/* +** CAPI3REF: Prepared Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. +** +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: +** +**
          +**
        1. Create the prepared statement object using [sqlite3_prepare_v2()]. +**
        2. Bind values to [parameters] using the sqlite3_bind_*() +** interfaces. +**
        3. Run the SQL by calling [sqlite3_step()] one or more times. +**
        4. Reset the prepared statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
        5. Destroy the object using [sqlite3_finalize()]. +**
        +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** METHOD: sqlite3 +** +** ^(This interface allows the size of various constructs to be limited +** on a connection by connection basis. The first parameter is the +** [database connection] whose limit is to be set or queried. The +** second parameter is one of the [limit categories] that define a +** class of constructs to be size limited. The third parameter is the +** new limit for that construct.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (The "_LIMIT_" in the name is changed to "_MAX_".))^ +** ^Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper bound. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** Run-time limits are intended for use in applications that manage +** both their own internal database and also databases that are controlled +** by untrusted external sources. An example application might be a +** web browser that has its own databases for storing history and +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** CAPI3REF: Run-Time Limit Categories +** KEYWORDS: {limit category} {*limit categories} +** +** These constants define various performance limits +** that can be lowered at run-time using [sqlite3_limit()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
        +** [[SQLITE_LIMIT_LENGTH]] ^(
        SQLITE_LIMIT_LENGTH
        +**
        The maximum size of any string or BLOB or table row, in bytes.
        )^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
        SQLITE_LIMIT_SQL_LENGTH
        +**
        The maximum length of an SQL statement, in bytes.
        )^ +** +** [[SQLITE_LIMIT_COLUMN]] ^(
        SQLITE_LIMIT_COLUMN
        +**
        The maximum number of columns in a table definition or in the +** result set of a [SELECT] or the maximum number of columns in an index +** or in an ORDER BY or GROUP BY clause.
        )^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
        SQLITE_LIMIT_EXPR_DEPTH
        +**
        The maximum depth of the parse tree on any expression.
        )^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
        SQLITE_LIMIT_COMPOUND_SELECT
        +**
        The maximum number of terms in a compound SELECT statement.
        )^ +** +** [[SQLITE_LIMIT_VDBE_OP]] ^(
        SQLITE_LIMIT_VDBE_OP
        +**
        The maximum number of instructions in a virtual machine program +** used to implement an SQL statement. If [sqlite3_prepare_v2()] or +** the equivalent tries to allocate space for more than this many opcodes +** in a single prepared statement, an SQLITE_NOMEM error is returned.
        )^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
        SQLITE_LIMIT_FUNCTION_ARG
        +**
        The maximum number of arguments on a function.
        )^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
        SQLITE_LIMIT_ATTACHED
        +**
        The maximum number of [ATTACH | attached databases].)^
        +** +** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] +** ^(
        SQLITE_LIMIT_LIKE_PATTERN_LENGTH
        +**
        The maximum length of the pattern argument to the [LIKE] or +** [GLOB] operators.
        )^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
        SQLITE_LIMIT_VARIABLE_NUMBER
        +**
        The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
        SQLITE_LIMIT_TRIGGER_DEPTH
        +**
        The maximum depth of recursion for triggers.
        )^ +** +** [[SQLITE_LIMIT_WORKER_THREADS]] ^(
        SQLITE_LIMIT_WORKER_THREADS
        +**
        The maximum number of auxiliary worker threads that a single +** [prepared statement] may start.
        )^ +**
        +*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 +#define SQLITE_LIMIT_WORKER_THREADS 11 + +/* +** CAPI3REF: Prepare Flags +** +** These constants define various flags that can be passed into +** "prepFlags" parameter of the [sqlite3_prepare_v3()] and +** [sqlite3_prepare16_v3()] interfaces. +** +** New flags may be added in future releases of SQLite. +** +**
        +** [[SQLITE_PREPARE_PERSISTENT]] ^(
        SQLITE_PREPARE_PERSISTENT
        +**
        The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner +** that the prepared statement will be retained for a long time and +** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] +** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** be used just once or at most a few times and then destroyed using +** [sqlite3_finalize()] relatively soon. The current implementation acts +** on this hint by avoiding the use of [lookaside memory] so as not to +** deplete the limited store of lookaside memory. Future versions of +** SQLite may act on this hint differently. +** +** [[SQLITE_PREPARE_NORMALIZE]]
        SQLITE_PREPARE_NORMALIZE
        +**
        The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
        SQLITE_PREPARE_NO_VTAB
        +**
        The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. +**
        +*/ +#define SQLITE_PREPARE_PERSISTENT 0x01 +#define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt +** +** To execute an SQL statement, it must first be compiled into a byte-code +** program using one of these routines. Or, in other words, these routines +** are constructors for the [prepared statement] object. +** +** The preferred routine to use is [sqlite3_prepare_v2()]. The +** [sqlite3_prepare()] interface is legacy and should be avoided. +** [sqlite3_prepare_v3()] has an extra "prepFlags" option that is used +** for special purposes. +** +** The use of the UTF-8 interfaces is preferred, as SQLite currently +** does all parsing using UTF-8. The UTF-16 interfaces are provided +** as a convenience. The UTF-16 interfaces work by converting the +** input text into UTF-8, then invoking the corresponding UTF-8 interface. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare(), sqlite3_prepare_v2(), +** and sqlite3_prepare_v3() +** interfaces use UTF-8, and sqlite3_prepare16(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() use UTF-16. +** +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string including +** the nul-terminator. +** +** ^If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. +** +** ^*ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set +** to NULL. ^If the input text contains no SQL (if the input is an empty +** string or a comment) then *ppStmt is set to NULL. +** The calling procedure is responsible for deleting the compiled +** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. +** +** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() interfaces are recommended for all new programs. +** The older interfaces (sqlite3_prepare() and sqlite3_prepare16()) +** are retained for backwards compatibility, but their use is discouraged. +** ^In the "vX" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave differently in three ways: +** +**
          +**
        1. +** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. As many as [SQLITE_MAX_SCHEMA_RETRY] +** retries will occur before sqlite3_step() gives up and returns an error. +**
        2. +** +**
        3. +** ^When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. ^The legacy behavior was that +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** and the application would have to make a second call to [sqlite3_reset()] +** in order to find the underlying cause of the problem. With the "v2" prepare +** interfaces, the underlying reason for the error is returned immediately. +**
        4. +** +**
        5. +** ^If the specific value bound to a [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will be automatically recompiled, as if there had been +** a schema change, on the first [sqlite3_step()] call following any change +** to the [sqlite3_bind_text | bindings] of that [parameter]. +** ^The specific value of a WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled. +**
        6. +**
        +** +**

        ^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having +** the extra prepFlags parameter, which is a bit array consisting of zero or +** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The +** sqlite3_prepare_v2() interface works exactly the same as +** sqlite3_prepare_v3() with a zero prepFlags parameter. +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt +** +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8 +** string containing the normalized SQL text of prepared statement P. The +** semantics used to normalize a SQL statement are unspecified and subject +** to change. At a minimum, literal values will be replaced with suitable +** placeholders. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P) +** are managed by SQLite and are automatically freed when the prepared +** statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be freed by the application +** by passing it to [sqlite3_free()]. +** +** ^The sqlite3_normalized_sql() interface is only available if +** the [SQLITE_ENABLE_NORMALIZE] compile-time option is defined. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); +#endif + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**

        +**    SELECT eval('DELETE FROM t1') FROM t2;
        +** 
        +** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. +** +** ^This routine returns false if there is any possibility that the +** statement might change the database file. ^A false return does +** not guarantee that the statement will change the database file. +** ^For example, an UPDATE statement might have a WHERE clause that +** makes it a no-op, but the sqlite3_stmt_readonly() result would still +** be false. ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a +** read-only no-op if the table already exists, but +** sqlite3_stmt_readonly() still returns false for such a statement. +** +** ^If prepared statement X is an [EXPLAIN] or [EXPLAIN QUERY PLAN] +** statement, then sqlite3_stmt_readonly(X) returns the same value as +** if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the +** prepared statement S is an EXPLAIN statement, or 2 if the +** statement S is an EXPLAIN QUERY PLAN. +** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is +** an ordinary statement or a NULL pointer. +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** CAPI3REF: Dynamically Typed Value Object +** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} +** +** SQLite uses the sqlite3_value object to represent all values +** that can be stored in a database table. SQLite uses dynamic typing +** for the values it stores. ^Values stored in sqlite3_value objects +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^The sqlite3_value objects that are passed as parameters into the +** implementation of [application-defined SQL functions] are protected. +** ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()] +** are protected. +** ^The sqlite3_value object returned by +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used as arguments +** to [sqlite3_result_value()], [sqlite3_bind_value()], and +** [sqlite3_value_dup()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct sqlite3_value sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. ^A pointer to an sqlite3_context object +** is always first parameter to [application-defined SQL functions]. +** The application-defined SQL function implementation will pass this +** pointer through into calls to [sqlite3_result_int | sqlite3_result()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt +** +** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, +** literals may be replaced by a [parameter] that matches one of following +** templates: +** +**
          +**
        • ? +**
        • ?NNN +**
        • :VVV +**
        • @VVV +**
        • $VVV +**
        +** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^The values of these +** parameters (also called "host parameter names" or "SQL parameters") +** can be set using the sqlite3_bind_*() routines defined here. +** +** ^The first argument to the sqlite3_bind_*() routines is always +** a pointer to the [sqlite3_stmt] object returned from +** [sqlite3_prepare_v2()] or its variants. +** +** ^The second argument is the index of the SQL parameter to be set. +** ^The leftmost SQL parameter has an index of 1. ^When the same named +** SQL parameter is used more than once, second and subsequent +** occurrences have the same index as the first occurrence. +** ^The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. ^The index +** for "?NNN" parameters is the value of NNN. +** ^The NNN value must be between 1 and the [sqlite3_limit()] +** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 32766). +** +** ^The third argument is the value to bind to the parameter. +** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter +** is ignored and the end result is the same as sqlite3_bind_null(). +** ^If the third parameter to sqlite3_bind_text() is not NULL, then +** it should be a pointer to well-formed UTF8 text. +** ^If the third parameter to sqlite3_bind_text16() is not NULL, then +** it should be a pointer to well-formed UTF16 text. +** ^If the third parameter to sqlite3_bind_text64() is not NULL, then +** it should be a pointer to a well-formed unicode string that is +** either UTF8 if the sixth parameter is SQLITE_UTF8, or UTF16 +** otherwise. +** +** [[byte-order determination rules]] ^The byte-order of +** UTF16 input text is determined by the byte-order mark (BOM, U+FEFF) +** found in first character, which is removed, or in the absence of a BOM +** the byte order is the native byte order of the host +** machine for sqlite3_bind_text16() or the byte order specified in +** the 6th parameter for sqlite3_bind_text64().)^ +** ^If UTF16 input text contains invalid unicode +** characters, then SQLite might change those invalid characters +** into the unicode replacement character: U+FFFD. +** +** ^(In those routines that have a fourth argument, its value is the +** number of bytes in the parameter. To be clear: the value is the +** number of bytes in the value, not the number of characters.)^ +** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** is negative, then the length of the string is +** the number of bytes up to the first zero terminator. +** If the fourth parameter to sqlite3_bind_blob() is negative, then +** the behavior is undefined. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() or sqlite3_bind_text64() then +** that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occurs at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to the BLOB and string binding interfaces controls +** or indicates the lifetime of the object referenced by the third parameter. +** These three options exist: +** ^ (1) A destructor to dispose of the BLOB or string after SQLite has finished +** with it may be passed. ^It is called to dispose of the BLOB or string even +** if the call to the bind API fails, except the destructor is not called if +** the third parameter is a NULL pointer or the fourth parameter is negative. +** ^ (2) The special constant, [SQLITE_STATIC], may be passsed to indicate that +** the application remains responsible for disposing of the object. ^In this +** case, the object and the provided pointer to it must remain valid until +** either the prepared statement is finalized or the same SQL parameter is +** bound to something else, whichever occurs sooner. +** ^ (3) The constant, [SQLITE_TRANSIENT], may be passed to indicate that the +** object is to be copied prior to the return from sqlite3_bind_*(). ^The +** object and pointer to it must remain valid until then. ^SQLite will then +** manage the lifetime of its private copy. +** +** ^The sixth argument to sqlite3_bind_text64() must be one of +** [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE] +** to specify the encoding of the text in the third parameter. If +** the sixth argument to sqlite3_bind_text64() is not one of the +** allowed values shown above, or if the text encoding is different +** from the encoding specified by the sixth parameter, then the behavior +** is undefined. +** +** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. ^A zeroblob uses a fixed amount of memory +** (just an integer to hold its size) while it is being processed. +** Zeroblobs are intended to serve as placeholders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | incremental BLOB I/O] routines. +** ^A negative value for the zeroblob results in a zero-length BLOB. +** +** ^The sqlite3_bind_pointer(S,I,P,T,D) routine causes the I-th parameter in +** [prepared statement] S to have an SQL value of NULL, but to also be +** associated with the pointer P of type T. ^D is either a NULL pointer or +** a pointer to a destructor function for P. ^SQLite will invoke the +** destructor D with a single argument of P when it is finished using +** P. The T parameter should be a static string, preferably a string +** literal. The sqlite3_bind_pointer() routine is part of the +** [pointer passing interface] added for SQLite 3.20.0. +** +** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer +** for the [prepared statement] or with a prepared statement for which +** [sqlite3_step()] has been called more recently than [sqlite3_reset()], +** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() +** routine is passed a [prepared statement] that has been finalized, the +** result is undefined and probably harmful. +** +** ^Bindings are not cleared by the [sqlite3_reset()] routine. +** ^Unbound parameters are interpreted as NULL. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_TOOBIG] might be returned if the size of a string or BLOB +** exceeds limits imposed by [sqlite3_limit]([SQLITE_LIMIT_LENGTH]) or +** [SQLITE_MAX_LENGTH]. +** ^[SQLITE_RANGE] is returned if the parameter +** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. +** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, + void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); + +/* +** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt +** +** ^This routine can be used to find the number of [SQL parameters] +** in a [prepared statement]. SQL parameters are tokens of the +** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as +** placeholders for values that are [sqlite3_bind_blob | bound] +** to the parameters at a later time. +** +** ^(This routine actually returns the index of the largest (rightmost) +** parameter. For all forms except ?NNN, this will correspond to the +** number of unique parameters. If parameters of the ?NNN form are used, +** there may be gaps in the list.)^ +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_name()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt +** +** ^The sqlite3_bind_parameter_name(P,N) interface returns +** the name of the N-th [SQL parameter] in the [prepared statement] P. +** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" +** respectively. +** In other words, the initial ":" or "$" or "@" or "?" +** is included as part of the name.)^ +** ^Parameters of the form "?" without a following integer have no name +** and are referred to as "nameless" or "anonymous parameters". +** +** ^The first host parameter has an index of 1, not 0. +** +** ^If the value N is out of range or if the N-th parameter is +** nameless, then NULL is returned. ^The returned string is +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt +** +** ^Return the index of an SQL parameter given its name. ^The +** index value returned is suitable for use as the second +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero +** is returned if no matching parameter is found. ^The parameter +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()] or +** [sqlite3_prepare16_v3()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_name()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset +** the [sqlite3_bind_blob | bindings] on a [prepared statement]. +** ^Use this routine to reset all host parameters to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt +** +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement] returns no data (for example an [UPDATE]). +** ^However, just because this routine returns a positive number does not +** mean that one or more rows of data will be returned. ^A SELECT statement +** will always have a positive sqlite3_column_count() but depending on the +** WHERE clause constraints and the table content, it might return no rows. +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt +** +** ^These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. ^The sqlite3_column_name() +** interface returns a pointer to a zero-terminated UTF-8 string +** and sqlite3_column_name16() returns a pointer to a zero-terminated +** UTF-16 string. ^The first parameter is the [prepared statement] +** that implements the [SELECT] statement. ^The second parameter is the +** column number. ^The leftmost column is number 0. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the next call to +** sqlite3_column_name() or sqlite3_column_name16() on the same column. +** +** ^If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +** +** ^The name of a result column is the value of the "AS" clause for +** that column, if there is an AS clause. If there is no AS clause +** then the name of the column is unspecified and may change from +** one release of SQLite to the next. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result +** METHOD: sqlite3_stmt +** +** ^These routines provide a means to determine the database, table, and +** table column that is the origin of a particular result column in +** [SELECT] statement. +** ^The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. ^The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. +** ^The returned string is valid until the [prepared statement] is destroyed +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^The first argument to these interfaces is a [prepared statement]. +** ^These functions return information about the Nth result column returned by +** the statement, where N is the second function argument. +** ^The left-most column is column 0 for these routines. +** +** ^If the Nth column returned by the statement is an expression or +** subquery and is not a column value, then all of these functions return +** NULL. ^These routines might also return NULL if a memory allocation error +** occurs. ^Otherwise, they return the name of the attached database, table, +** or column that query result column was extracted from. +** +** ^As with all other SQLite APIs, those whose names end with "16" return +** UTF-16 encoded strings and the other functions return UTF-8. +** +** ^These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result +** METHOD: sqlite3_stmt +** +** ^(The first parameter is a [prepared statement]. +** If this statement is a [SELECT] statement and the Nth column of the +** returned result set of that [SELECT] is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned.)^ ^If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** this routine would return the string "VARIANT" for the second result +** column (i==1), and a NULL pointer for the first result column (i==0).)^ +** +** ^SQLite uses dynamic run-time typing. ^So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. ^Type +** is associated with individual values, not with the containers +** used to hold those values. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement +** METHOD: sqlite3_stmt +** +** After a [prepared statement] has been prepared using any of +** [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], [sqlite3_prepare16_v2()], +** or [sqlite3_prepare16_v3()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "vX" interfaces +** [sqlite3_prepare_v3()], [sqlite3_prepare_v2()], [sqlite3_prepare16_v3()], +** [sqlite3_prepare16_v2()] or the older legacy +** interfaces [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "vX" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** ^In the legacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^With the "v2" interface, any of the other [result codes] or +** [extended result codes] might be returned as well. +** +** ^[SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. ^If the statement is a [COMMIT] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] +** is returned each time a new row of data is ready for processing by the +** caller. The values may be accessed using the [column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** ^[SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** ^With the legacy interface, a more specific error code (for example, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [prepared statement]. ^In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using [sqlite3_prepare_v3()] or [sqlite3_prepare_v2()] +** or [sqlite3_prepare16_v2()] or [sqlite3_prepare16_v3()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, +** then the more specific [error codes] are returned directly +** by sqlite3_step(). The use of the "vX" interfaces is recommended. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column()] family of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
          +**
        • 64-bit signed integer +**
        • 64-bit IEEE floating point number +**
        • string +**
        • BLOB +**
        • NULL +**
        )^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt +** +** Summary: +**
        +**
        sqlite3_column_blobBLOB result +**
        sqlite3_column_doubleREAL result +**
        sqlite3_column_int32-bit INTEGER result +**
        sqlite3_column_int6464-bit INTEGER result +**
        sqlite3_column_textUTF-8 TEXT result +**
        sqlite3_column_text16UTF-16 TEXT result +**
        sqlite3_column_valueThe result as an +** [sqlite3_value|unprotected sqlite3_value] object. +**
            +**
        sqlite3_column_bytesSize of a BLOB +** or a UTF-8 TEXT result in bytes +**
        sqlite3_column_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
        sqlite3_column_typeDefault +** datatype of the result +**
        +** +** Details: +** +** ^These routines return information about a single column of the current +** result row of a query. ^In every case the first argument is a pointer +** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] +** that was returned from [sqlite3_prepare_v2()] or one of its variants) +** and the second argument is the index of the column for which information +** should be returned. ^The leftmost column of the result set has the index 0. +** ^The number of columns in the result can be determined using +** [sqlite3_column_count()]. +** +** If the SQL statement does not currently point to a valid row, or if the +** column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The first six interfaces (_blob, _double, _int, _int64, _text, and _text16) +** each return the value of a result column in a specific data format. If +** the result column is not initially in the requested format (for example, +** if the query returns an integer but the sqlite3_column_text() interface +** is used to extract the value) then an automatic type conversion is performed. +** +** ^The sqlite3_column_type() routine returns the +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. ^The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. +** The return value of sqlite3_column_type() can be used to decide which +** of the first six interface should be used to extract the column value. +** The value returned by sqlite3_column_type() is only meaningful if no +** automatic type conversions have occurred for the value in question. +** After a type conversion, the result of calling sqlite3_column_type() +** is undefined, though harmless. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or a TEXT string, then the sqlite3_column_bytes() +** or sqlite3_column_bytes16() interfaces can be used to determine the size +** of that BLOB or string. +** +** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of +** bytes in the string, not the number of characters. +** +** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero-terminated. ^The return +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** ^Strings returned by sqlite3_column_text16() always have the endianness +** which is native to the platform, regardless of the text encoding set +** for the database. +** +** Warning: ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** Hence, the sqlite3_column_value() interface +** is normally only useful within the implementation of +** [application-defined SQL functions] or [virtual tables], not within +** top-level application code. +** +** These routines may attempt to convert the datatype of the result. +** ^For example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to perform the +** conversion automatically. ^(The following table details the conversions +** that are applied: +** +**
        +** +**
        Internal
        Type
        Requested
        Type
        Conversion +** +**
        NULL INTEGER Result is 0 +**
        NULL FLOAT Result is 0.0 +**
        NULL TEXT Result is a NULL pointer +**
        NULL BLOB Result is a NULL pointer +**
        INTEGER FLOAT Convert from integer to float +**
        INTEGER TEXT ASCII rendering of the integer +**
        INTEGER BLOB Same as INTEGER->TEXT +**
        FLOAT INTEGER [CAST] to INTEGER +**
        FLOAT TEXT ASCII rendering of the float +**
        FLOAT BLOB [CAST] to BLOB +**
        TEXT INTEGER [CAST] to INTEGER +**
        TEXT FLOAT [CAST] to REAL +**
        TEXT BLOB No change +**
        BLOB INTEGER [CAST] to INTEGER +**
        BLOB FLOAT [CAST] to REAL +**
        BLOB TEXT [CAST] to TEXT, ensure zero terminator +**
        +**
        )^ +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
          +**
        • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
        • +**
        • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
        • +**
        • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.
        • +**
        +** +** ^Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometimes they +** are not possible and in those cases prior pointers are invalidated. +** +** The safest policy is to invoke these routines +** in one of the following ways: +** +**
          +**
        • sqlite3_column_text() followed by sqlite3_column_bytes()
        • +**
        • sqlite3_column_blob() followed by sqlite3_column_bytes()
        • +**
        • sqlite3_column_text16() followed by sqlite3_column_bytes16()
        • +**
        +** +** In other words, you should call sqlite3_column_text(), +** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() +** with calls to sqlite3_column_bytes(). +** +** ^The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** As long as the input parameters are correct, these routines will only +** fail if an out-of-memory error occurs during a format conversion. +** Only the following subset of interfaces are subject to out-of-memory +** errors: +** +**
          +**
        • sqlite3_column_blob() +**
        • sqlite3_column_text() +**
        • sqlite3_column_text16() +**
        • sqlite3_column_bytes() +**
        • sqlite3_column_bytes16() +**
        +** +** If an out-of-memory error occurs, then the return value from these +** routines is the same as if the column had contained an SQL NULL value. +** Valid SQL NULL returns can be distinguished from out-of-memory errors +** by invoking the [sqlite3_errcode()] immediately after the suspect +** return value is obtained and before any +** other SQLite interface is called on the same [database connection]. +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt +** +** The sqlite3_reset() function is called to reset a [prepared statement] +** object back to its initial state, ready to be re-executed. +** ^Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions +** KEYWORDS: {function creation routines} +** METHOD: sqlite3 +** +** ^These functions (collectively known as "function creation routines") +** are used to add SQL functions or aggregates or to redefine the behavior +** of existing SQL functions or aggregates. The only differences between +** the three "sqlite3_create_function*" routines are the text encoding +** expected for the second parameter (the name of the function being +** created) and the presence or absence of a destructor callback for +** the application data pointer. Function sqlite3_create_window_function() +** is similar, but allows the user to supply the extra callback functions +** needed by [aggregate window functions]. +** +** ^The first parameter is the [database connection] to which the SQL +** function is to be added. ^If an application uses more than one database +** connection then application-defined SQL functions must be added +** to each database connection separately. +** +** ^The second parameter is the name of the SQL function to be created or +** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^The third parameter (nArg) +** is the number of arguments that the SQL function or +** aggregate takes. ^If this parameter is -1, then the SQL function or +** aggregate may take any number of arguments between 0 and the limit +** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third +** parameter is less than -1 or greater than 127 then the behavior is +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** +** ^The fourth parameter may also optionally include the [SQLITE_DIRECTONLY] +** flag, which if present prevents the function from being invoked from +** within VIEWs, TRIGGERs, CHECK constraints, generated column expressions, +** index expressions, or the WHERE clause of partial indexes. +** +** For best security, the [SQLITE_DIRECTONLY] flag is recommended for +** all application-defined SQL functions that do not need to be +** used inside of triggers, view, CHECK constraints, or other elements of +** the database schema. This flags is especially recommended for SQL +** functions that have side effects or reveal internal application state. +** Without this flag, an attacker might be able to modify the schema of +** a database file to include invocations of the function with parameters +** chosen by the attacker, which the application will then execute when +** the database file is opened and read. +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth parameters passed to the three +** "sqlite3_create_function*" functions, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL function or +** aggregate. ^A scalar SQL function requires an implementation of the xFunc +** callback only; NULL pointers must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^The sixth, seventh, eighth and ninth parameters (xStep, xFinal, xValue +** and xInverse) passed to sqlite3_create_window_function are pointers to +** C-language callbacks that implement the new function. xStep and xFinal +** must both be non-NULL. xValue and xInverse may either both be NULL, in +** which case a regular aggregate function is created, or must both be +** non-NULL, in which case the new function may be used as either an aggregate +** or aggregate window function. More details regarding the implementation +** of aggregate window functions are +** [user-defined window functions|available here]. +** +** ^(If the final parameter to sqlite3_create_function_v2() or +** sqlite3_create_window_function() is not NULL, then it is destructor for +** the application data pointer. The destructor is invoked when the function +** is deleted, either by being overloaded or when the database connection +** closes.)^ ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. ^When the destructor callback is +** invoked, it is passed a single argument which is a copy of the application +** data pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing preferred text encodings. ^SQLite will use +** the implementation that most closely matches the way in which the +** SQL function is used. ^A function implementation with a non-negative +** nArg parameter is a better match than a function implementation with +** a negative nArg. ^A function where the preferred text encoding +** matches the database encoding is a better +** match than a function where the encoding is different. +** ^A function where the encoding difference is between UTF16le and UTF16be +** is a closer match than a function where the encoding difference is +** between UTF8 and UTF16. +** +** ^Built-in functions may be overloaded by new application-defined functions. +** +** ^An application-defined function is permitted to call other +** SQLite interfaces. However, such calls must not +** close the database connection nor finalize or reset the prepared +** statement in which the function is running. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_window_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ +#define SQLITE_UTF16LE 2 /* IMP: R-03371-37637 */ +#define SQLITE_UTF16BE 3 /* IMP: R-51971-34154 */ +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* Deprecated */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +** +**
        +** [[SQLITE_DETERMINISTIC]]
        SQLITE_DETERMINISTIC
        +** The SQLITE_DETERMINISTIC flag means that the new function always gives +** the same output when the input parameters are the same. +** The [abs|abs() function] is deterministic, for example, but +** [randomblob|randomblob()] is not. Functions must +** be deterministic in order to be used in certain contexts such as +** with the WHERE clause of [partial indexes] or in [generated columns]. +** SQLite might also optimize deterministic functions by factoring them +** out of inner loops. +**
        +** +** [[SQLITE_DIRECTONLY]]
        SQLITE_DIRECTONLY
        +** The SQLITE_DIRECTONLY flag means that the function may only be invoked +** from top-level SQL, and cannot be used in VIEWs or TRIGGERs nor in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], or [generated columns]. +** The SQLITE_DIRECTONLY flags is a security feature which is recommended +** for all [application-defined SQL functions], and especially for functions +** that have side-effects or that could potentially leak sensitive +** information. +**
        +** +** [[SQLITE_INNOCUOUS]]
        SQLITE_INNOCUOUS
        +** The SQLITE_INNOCUOUS flag means that the function is unlikely +** to cause problems even if misused. An innocuous function should have +** no side effects and should not depend on any values other than its +** input parameters. The [abs|abs() function] is an example of an +** innocuous function. +** The [load_extension() SQL function] is not innocuous because of its +** side effects. +**

        SQLITE_INNOCUOUS is similar to SQLITE_DETERMINISTIC, but is not +** exactly the same. The [random|random() function] is an example of a +** function that is innocuous but not deterministic. +**

        Some heightened security settings +** ([SQLITE_DBCONFIG_TRUSTED_SCHEMA] and [PRAGMA trusted_schema=OFF]) +** disable the use of SQL functions inside views and triggers and in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], and [generated columns] unless +** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions +** are innocuous. Developers are advised to avoid using the +** SQLITE_INNOCUOUS flag for application-defined functions unless the +** function has been carefully audited and found to be free of potentially +** security-adverse side-effects and information-leaks. +**

        +** +** [[SQLITE_SUBTYPE]]
        SQLITE_SUBTYPE
        +** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call +** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. +** Specifying this flag makes no difference for scalar or aggregate user +** functions. However, if it is not specified for a user-defined window +** function, then any sub-types belonging to arguments passed to the window +** function may be discarded before the window function is called (i.e. +** sqlite3_value_subtype() will always return 0). +**
        +**
        +*/ +#define SQLITE_DETERMINISTIC 0x000000800 +#define SQLITE_DIRECTONLY 0x000080000 +#define SQLITE_SUBTYPE 0x000100000 +#define SQLITE_INNOCUOUS 0x000200000 + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), + void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value +** +** Summary: +**
        +**
        sqlite3_value_blobBLOB value +**
        sqlite3_value_doubleREAL value +**
        sqlite3_value_int32-bit INTEGER value +**
        sqlite3_value_int6464-bit INTEGER value +**
        sqlite3_value_pointerPointer value +**
        sqlite3_value_textUTF-8 TEXT value +**
        sqlite3_value_text16UTF-16 TEXT value in +** the native byteorder +**
        sqlite3_value_text16beUTF-16be TEXT value +**
        sqlite3_value_text16leUTF-16le TEXT value +**
            +**
        sqlite3_value_bytesSize of a BLOB +** or a UTF-8 TEXT in bytes +**
        sqlite3_value_bytes16   +** →  Size of UTF-16 +** TEXT in bytes +**
        sqlite3_value_typeDefault +** datatype of the value +**
        sqlite3_value_numeric_type   +** →  Best numeric datatype of the value +**
        sqlite3_value_nochange   +** →  True if the column is unchanged in an UPDATE +** against a virtual table. +**
        sqlite3_value_frombind   +** →  True if value originated from a [bound parameter] +**
        +** +** Details: +** +** These routines extract type, size, and content information from +** [protected sqlite3_value] objects. Protected sqlite3_value objects +** are used to pass parameter information into the functions that +** implement [application-defined SQL functions] and [virtual tables]. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** is not threadsafe. +** +** ^These routines work just like the corresponding [column access functions] +** except that these routines take a single [protected sqlite3_value] object +** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. +** +** ^The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. ^The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** ^If [sqlite3_value] object V was initialized +** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] +** and if X and Y are strings that compare equal according to strcmp(X,Y), +** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** ^(The sqlite3_value_type(V) interface returns the +** [SQLITE_INTEGER | datatype code] for the initial datatype of the +** [sqlite3_value] object V. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL].)^ +** Other interfaces might change the datatype for an sqlite3_value object. +** For example, if the datatype is initially SQLITE_INTEGER and +** sqlite3_value_text(V) is called to extract a text value for that +** integer, then subsequent calls to sqlite3_value_type(V) might return +** SQLITE_TEXT. Whether or not a persistent internal datatype conversion +** occurs is undefined and may change from one release of SQLite to the next. +** +** ^(The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in other +** words, if the value is a string that looks like a number) +** then the conversion is performed. Otherwise no conversion occurs. +** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ +** +** ^Within the [xUpdate] method of a [virtual table], the +** sqlite3_value_nochange(X) interface returns true if and only if +** the column corresponding to X is unchanged by the UPDATE operation +** that the xUpdate method call was invoked to implement and if +** and the prior [xColumn] method call that was invoked to extracted +** the value for that column returned without setting a result (probably +** because it queried [sqlite3_vtab_nochange()] and found that the column +** was unchanging). ^Within an [xUpdate] method, any value for which +** sqlite3_value_nochange(X) is true will in all other respects appear +** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other +** than within an [xUpdate] method call for an UPDATE statement, then +** the return value is arbitrary and meaningless. +** +** ^The sqlite3_value_frombind(X) interface returns non-zero if the +** value X originated from one of the [sqlite3_bind_int|sqlite3_bind()] +** interfaces. ^If X comes from an SQL literal value, or a table column, +** or an expression, then sqlite3_value_frombind(X) returns zero. +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +** +** As long as the input parameter is correct, these routines can only +** fail if an out-of-memory error occurs during a format conversion. +** Only the following subset of interfaces are subject to out-of-memory +** errors: +** +**
          +**
        • sqlite3_value_blob() +**
        • sqlite3_value_text() +**
        • sqlite3_value_text16() +**
        • sqlite3_value_text16le() +**
        • sqlite3_value_text16be() +**
        • sqlite3_value_bytes() +**
        • sqlite3_value_bytes16() +**
        +** +** If an out-of-memory error occurs, then the return value from these +** routines is the same as if the column had contained an SQL NULL value. +** Valid SQL NULL returns can be distinguished from out-of-memory errors +** by invoking the [sqlite3_errcode()] immediately after the suspect +** return value is obtained and before any +** other SQLite interface is called on the same [database connection]. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API void *sqlite3_value_pointer(sqlite3_value*, const char*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); +SQLITE_API int sqlite3_value_nochange(sqlite3_value*); +SQLITE_API int sqlite3_value_frombind(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. ^If V is a [pointer value], then the result +** of sqlite3_value_dup(V) is a NULL value. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context +** +** Implementations of aggregate SQL functions use this +** routine to allocate memory for storing their state. +** +** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** for a particular aggregate function, SQLite allocates +** N bytes of memory, zeroes out that memory, and returns a pointer +** to the new memory. ^On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function instance, +** the same buffer is returned. Sqlite3_aggregate_context() is normally +** called once for each invocation of the xStep callback and then one +** last time when the xFinal callback is invoked. ^(When no rows match +** an aggregate query, the xStep() callback of the aggregate function +** implementation is never called and xFinal() is called exactly once. +** In those cases, sqlite3_aggregate_context() might be called for the +** first time from within xFinal().)^ +** +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** when first called if N is less than or equal to zero or if a memory +** allocate error occurs. +** +** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is +** determined by the N parameter on first successful call. Changing the +** value of N in any subsequent call to sqlite3_aggregate_context() within +** the same aggregate function instance will not resize the memory +** allocation.)^ Within the xFinal callback, it is customary to set +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** pointless memory allocations occur. +** +** ^SQLite automatically frees the memory allocated by +** sqlite3_aggregate_context() when the aggregate query concludes. +** +** The first parameter must be a copy of the +** [sqlite3_context | SQL function context] that is the first parameter +** to the xStep or xFinal callback routine that implements the aggregate +** function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context +** +** ^The sqlite3_user_data() interface returns a copy of +** the pointer that was the pUserData parameter (the 5th parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context +** +** ^The sqlite3_context_db_handle() interface returns a copy of +** the pointer to the [database connection] (the 1st parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context +** +** These functions may be used by (non-aggregate) SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. An example +** of where this might be useful is in a regular-expression matching +** function. The compiled version of the regular expression can be stored as +** metadata associated with the pattern string. +** Then as long as the pattern string remains the same, +** the compiled regular expression can be reused on multiple +** invocations of the same function. +** +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument +** value to the application-defined function. ^N is zero for the left-most +** function argument. ^If there is no metadata +** associated with the function argument, the sqlite3_get_auxdata(C,N) interface +** returns a NULL pointer. +** +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th +** argument of the application-defined function. ^Subsequent +** calls to sqlite3_get_auxdata(C,N) return P from the most recent +** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or +** NULL if the metadata has been discarded. +** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, +** SQLite will invoke the destructor function X with parameter P exactly +** once, when the metadata is discarded. +** SQLite is free to discard the metadata at any time, including:
          +**
        • ^(when the corresponding function parameter changes)^, or +**
        • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +**
        • ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +**
        • ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^
        +** +** Note the last bullet in particular. The destructor X in +** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the +** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() +** should be called near the end of the function implementation and the +** function implementation should not make any use of P after +** sqlite3_set_auxdata() has been called. +** +** ^(In practice, metadata is preserved between function calls for +** function parameters that are compile-time constants, including literal +** values and [parameters] and expressions composed from the same.)^ +** +** The value of the N parameter to these interfaces should be non-negative. +** Future enhancements may make use of negative N values to define new +** kinds of function caching behavior. +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); +SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior +** +** These are special values for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. ^If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. ^The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** functions used to bind values to host parameters in prepared statements. +** Refer to the [SQL parameter] documentation for additional information. +** +** ^The sqlite3_result_blob() interface sets the result from +** an application-defined function to be the BLOB whose content is pointed +** to by the second parameter and which is N bytes long where N is the +** third parameter. +** +** ^The sqlite3_result_zeroblob(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. +** +** ^The sqlite3_result_double() interface sets the result from +** an application-defined function to be a floating point value specified +** by its 2nd argument. +** +** ^The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. +** ^SQLite uses the string pointed to by the +** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() +** as the text of an error message. ^SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. ^SQLite +** interprets the string from sqlite3_result_error16() as UTF-16 using +** the same [byte-order determination rules] as [sqlite3_bind_text16()]. +** ^If the third parameter to sqlite3_result_error() +** or sqlite3_result_error16() is negative then SQLite takes as the error +** message all text up through the first zero character. +** ^If the third parameter to sqlite3_result_error() or +** sqlite3_result_error16() is non-negative then SQLite takes that many +** bytes (not characters) from the 2nd parameter as the error message. +** ^The sqlite3_result_error() and sqlite3_result_error16() +** routines make a private copy of the error message text before +** they return. Hence, the calling function can deallocate or +** modify the text after they return without harm. +** ^The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. ^By default, +** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an +** error indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an +** error indicating that a memory allocation failed. +** +** ^The sqlite3_result_int() interface sets the return value +** of the application-defined function to be the 32-bit signed integer +** value given in the 2nd argument. +** ^The sqlite3_result_int64() interface sets the return value +** of the application-defined function to be the 64-bit signed integer +** value given in the 2nd argument. +** +** ^The sqlite3_result_null() interface sets the return value +** of the application-defined function to be NULL. +** +** ^The sqlite3_result_text(), sqlite3_result_text16(), +** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces +** set the return value of the application-defined function to be +** a text string which is represented as UTF-8, UTF-16 native byte order, +** UTF-16 little endian, or UTF-16 big endian, respectively. +** ^The sqlite3_result_text64() interface sets the return value of an +** application-defined function to be a text string in an encoding +** specified by the fifth (and last) parameter, which must be one +** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE]. +** ^SQLite takes the text result from the application from +** the 2nd parameter of the sqlite3_result_text* interfaces. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is negative, then SQLite takes result text from the 2nd parameter +** through the first zero character. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is non-negative, then as many bytes (not characters) of the text +** pointed to by the 2nd parameter are taken as the application-defined +** function result. If the 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that +** function as the destructor on the text or BLOB result when it has +** finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces or to +** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite +** assumes that the text or BLOB result is in constant space and does not +** copy the content of the parameter nor call a destructor on the content +** when it has finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained +** from [sqlite3_malloc()] before it returns. +** +** ^For the sqlite3_result_text16(), sqlite3_result_text16le(), and +** sqlite3_result_text16be() routines, and for sqlite3_result_text64() +** when the encoding is not UTF8, if the input UTF16 begins with a +** byte-order mark (BOM, U+FEFF) then the BOM is removed from the +** string and the rest of the string is interpreted according to the +** byte-order specified by the BOM. ^The byte-order specified by +** the BOM at the beginning of the text overrides the byte-order +** specified by the interface procedure. ^So, for example, if +** sqlite3_result_text16le() is invoked with text that begins +** with bytes 0xfe, 0xff (a big-endian byte-order mark) then the +** first two bytes of input are skipped and the remaining input +** is interpreted as UTF16BE text. +** +** ^For UTF16 input text to the sqlite3_result_text16(), +** sqlite3_result_text16be(), sqlite3_result_text16le(), and +** sqlite3_result_text64() routines, if the text contains invalid +** UTF16 characters, the invalid characters might be converted +** into the unicode replacement character, U+FFFD. +** +** ^The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy of the +** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The +** sqlite3_result_value() interface makes a copy of the [sqlite3_value] +** so that the [sqlite3_value] specified in the parameter may change or +** be deallocated after sqlite3_result_value() returns without harm. +** ^A [protected sqlite3_value] object may always be used where an +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an +** SQL NULL value, just like [sqlite3_result_null(C)], except that it +** also associates the host-language pointer P or type T with that +** NULL value such that the pointer can be retrieved within an +** [application-defined SQL function] using [sqlite3_value_pointer()]. +** ^If the D parameter is not NULL, then it is a pointer to a destructor +** for the P parameter. ^SQLite invokes D with P as its only argument +** when SQLite is finished with P. The T parameter should be a static +** string and preferably a string literal. The sqlite3_result_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** If these routines are called from within the different thread +** than the one containing the application-defined function that received +** the [sqlite3_context] pointer, the results are undefined. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_blob64(sqlite3_context*,const void*, + sqlite3_uint64,void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*)); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); + +/* +** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
          +**
        • [SQLITE_UTF8], +**
        • [SQLITE_UTF16LE], +**
        • [SQLITE_UTF16BE], +**
        • [SQLITE_UTF16], or +**
        • [SQLITE_UTF16_ALIGNED]. +**
        )^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCompare. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCompare, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCompare argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The two integer parameters to the collating +** function callback are the length of the two strings, in bytes. The collating +** function must return an integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
          +**
        1. If A==B then B==A. +**
        2. If A==B and B==C then A==C. +**
        3. If A<B THEN B>A. +**
        4. If A<B and B<C then A<C. +**
        +** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 +** +** ^To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** [database connection] to be invoked whenever an undefined collation +** sequence is required. +** +** ^If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). The second argument is the database +** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], +** or [SQLITE_UTF16LE], indicating the most desirable form of the collation +** sequence function required. The fourth parameter is the name of the +** required collation sequence.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); +SQLITE_API int sqlite3_key_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +/* SQLCipher usage note: + + If the current database is plaintext SQLCipher will NOT encrypt it. + If the current database is encrypted and pNew==0 or nNew==0, SQLCipher + will NOT decrypt it. + + This routine will ONLY work on an already encrypted database in order + to change the key. + + Conversion from plaintext-to-encrypted or encrypted-to-plaintext should + use an ATTACHed database and the sqlcipher_export() convenience function + as per the SQLCipher Documentation. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); +SQLITE_API int sqlite3_rekey_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The new key */ +); + +/* +** Specify the activation key for a SEE database. Unless +** activated, none of the SEE routines will work. +*/ +SQLITE_API void sqlite3_activate_see( + const char *zPassPhrase /* Activation phrase */ +); +#endif +/* END SQLCIPHER */ + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** The sqlite3_sleep() function causes the current thread to suspend execution +** for at least a number of milliseconds specified in its parameter. +** +** If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** ^SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all temporary files +** created by SQLite when using a built-in [sqlite3_vfs | VFS] +** will be placed in that directory.)^ ^If this variable +** is a NULL pointer, then SQLite performs a search for an appropriate +** temporary file directory. +** +** Applications are strongly discouraged from using this global variable. +** It is required to set a temporary folder on Windows Runtime (WinRT). +** But for all other platforms, it is highly recommended that applications +** neither read nor write this variable. This global variable is a relic +** that exists for backwards compatibility of legacy applications and should +** be avoided in new projects. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +** Except when requested by the [temp_store_directory pragma], SQLite +** does not free the memory that sqlite3_temp_directory points to. If +** the application wants that memory to be freed, it must do +** so itself, taking care to only do so after all [database connection] +** objects have been destroyed. +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various +** features that require the use of temporary files may fail. Here is an +** example of how to do this using C++ with the Windows Runtime: +** +**
        +** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
        +**       TemporaryFolder->Path->Data();
        +** char zPathBuf[MAX_PATH + 1];
        +** memset(zPathBuf, 0, sizeof(zPathBuf));
        +** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
        +**       NULL, NULL);
        +** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
        +** 
        +*/ +SQLITE_API char *sqlite3_temp_directory; + +/* +** CAPI3REF: Name Of The Folder Holding Database Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all database files +** specified with a relative pathname and created or accessed by +** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed +** to be relative to that directory.)^ ^If this variable is a NULL +** pointer, then SQLite assumes that all database files specified +** with a relative pathname are relative to the current directory +** for the process. Only the windows VFS makes use of this global +** variable; it is ignored by the unix VFS. +** +** Changing the value of this variable while a database connection is +** open can result in a corrupt database. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [data_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [data_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [data_store_directory pragma] should be avoided. +*/ +SQLITE_API char *sqlite3_data_directory; + +/* +** CAPI3REF: Win32 Specific Interface +** +** These interfaces are available only on Windows. The +** [sqlite3_win32_set_directory] interface is used to set the value associated +** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to +** zValue, depending on the value of the type parameter. The zValue parameter +** should be NULL to cause the previous value to be freed via [sqlite3_free]; +** a non-NULL value will be copied into memory obtained from [sqlite3_malloc] +** prior to being used. The [sqlite3_win32_set_directory] interface returns +** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported, +** or [SQLITE_NOMEM] if memory could not be allocated. The value of the +** [sqlite3_data_directory] variable is intended to act as a replacement for +** the current directory on the sub-platforms of Win32 where that concept is +** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and +** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the +** sqlite3_win32_set_directory interface except the string parameter must be +** UTF-8 or UTF-16, respectively. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +); +SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue); +SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue); + +/* +** CAPI3REF: Win32 Directory Types +** +** These macros are only available on Windows. They define the allowed values +** for the type argument to the [sqlite3_win32_set_directory] interface. +*/ +#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1 +#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2 + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 +** +** ^The sqlite3_get_autocommit() interface returns non-zero or +** zero if the given database connection is or is not in autocommit mode, +** respectively. ^Autocommit mode is on by default. +** ^Autocommit mode is disabled by a [BEGIN] statement. +** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. ^The [database connection] +** returned by sqlite3_db_handle is the same [database connection] +** that was the first argument +** to the [sqlite3_prepare_v2()] call (or its variants) that was used to +** create the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Schema Name For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name +** for the N-th database on database connection D, or a NULL pointer of N is +** out of range. An N value of 0 means the main database file. An N of 1 is +** the "temp" schema. Larger values of N correspond to various ATTACH-ed +** databases. +** +** Space to hold the string that is returned by sqlite3_db_name() is managed +** by SQLite itself. The string might be deallocated by any operation that +** changes the schema, including [ATTACH] or [DETACH] or calls to +** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that +** occur on a different thread. Applications that need to +** remember the string long-term should make their own copy. Applications that +** are accessing the same database connection simultaneously on multiple +** threads should mutex-protect calls to this API and should make their own +** private copy of the result prior to releasing the mutex. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to the filename +** associated with database N of connection D. +** ^If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** this function will return either a NULL pointer or an empty string. +** +** ^The string value returned by this routine is owned and managed by +** the database connection. ^The value will be valid until the database N +** is [DETACH]-ed or until the database connection closes. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +** +** If the filename pointer returned by this routine is not NULL, then it +** can be used as the filename input parameter to these routines: +**
          +**
        • [sqlite3_uri_parameter()] +**
        • [sqlite3_uri_boolean()] +**
        • [sqlite3_uri_int64()] +**
        • [sqlite3_filename_database()] +**
        • [sqlite3_filename_journal()] +**
        • [sqlite3_filename_wal()] +**
        +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 +** +** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N +** of connection D is read-only, 0 if it is read/write, or -1 if N is not +** the name of a database on connection D. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine the transaction state of a database +** METHOD: sqlite3 +** +** ^The sqlite3_txn_state(D,S) interface returns the current +** [transaction state] of schema S in database connection D. ^If S is NULL, +** then the highest transaction state of any schema on database connection D +** is returned. Transaction states are (in order of lowest to highest): +**
          +**
        1. SQLITE_TXN_NONE +**
        2. SQLITE_TXN_READ +**
        3. SQLITE_TXN_WRITE +**
        +** ^If the S argument to sqlite3_txn_state(D,S) is not the name of +** a valid schema, then -1 is returned. +*/ +SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); + +/* +** CAPI3REF: Allowed return values from [sqlite3_txn_state()] +** KEYWORDS: {transaction state} +** +** These constants define the current transaction state of a database file. +** ^The [sqlite3_txn_state(D,S)] interface returns one of these +** constants in order to describe the transaction state of schema S +** in [database connection] D. +** +**
        +** [[SQLITE_TXN_NONE]]
        SQLITE_TXN_NONE
        +**
        The SQLITE_TXN_NONE state means that no transaction is currently +** pending.
        +** +** [[SQLITE_TXN_READ]]
        SQLITE_TXN_READ
        +**
        The SQLITE_TXN_READ state means that the database is currently +** in a read transaction. Content has been read from the database file +** but nothing in the database file has changed. The transaction state +** will advanced to SQLITE_TXN_WRITE if any changes occur and there are +** no other conflicting concurrent write transactions. The transaction +** state will revert to SQLITE_TXN_NONE following a [ROLLBACK] or +** [COMMIT].
        +** +** [[SQLITE_TXN_WRITE]]
        SQLITE_TXN_WRITE
        +**
        The SQLITE_TXN_WRITE state means that the database is currently +** in a write transaction. Content has been written to the database file +** but has not yet committed. The transaction state will change to +** to SQLITE_TXN_NONE at the next [ROLLBACK] or [COMMIT].
        +*/ +#define SQLITE_TXN_NONE 0 +#define SQLITE_TXN_READ 1 +#define SQLITE_TXN_WRITE 2 + +/* +** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 +** +** ^This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. ^If pStmt is NULL +** then this interface returns a pointer to the first prepared statement +** associated with the database connection pDb. ^If no prepared statement +** satisfies the conditions of this routine, it returns NULL. +** +** The [database connection] pointer D in a call to +** [sqlite3_next_stmt(D,S)] must refer to an open database +** connection and in particular must not be a NULL pointer. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_commit_hook() interface registers a callback +** function to be invoked whenever a transaction is [COMMIT | committed]. +** ^Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** ^The sqlite3_rollback_hook() interface registers a callback +** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. +** ^Any callback set by a previous call to sqlite3_rollback_hook() +** for the same database connection is overridden. +** ^The pArg argument is passed through to the callback. +** ^If the callback on a commit hook function returns non-zero, +** then the commit is converted into a rollback. +** +** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions +** return the P argument from the previous call of the same function +** on the same [database connection] D, or NULL for +** the first call for each function on D. +** +** The commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^Registering a NULL function disables the callback. +** +** ^When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. ^If the commit hook +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^The rollback hook is invoked on a rollback that results from a commit +** hook returning non-zero, just as it would be with any other rollback. +** +** ^For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. +** ^The rollback callback is not invoked if a transaction is +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Autovacuum Compaction Amount Callback +** METHOD: sqlite3 +** +** ^The sqlite3_autovacuum_pages(D,C,P,X) interface registers a callback +** function C that is invoked prior to each autovacuum of the database +** file. ^The callback is passed a copy of the generic data pointer (P), +** the schema-name of the attached database that is being autovacuumed, +** the the size of the database file in pages, the number of free pages, +** and the number of bytes per page, respectively. The callback should +** return the number of free pages that should be removed by the +** autovacuum. ^If the callback returns zero, then no autovacuum happens. +** ^If the value returned is greater than or equal to the number of +** free pages, then a complete autovacuum happens. +** +**

        ^If there are multiple ATTACH-ed database files that are being +** modified as part of a transaction commit, then the autovacuum pages +** callback is invoked separately for each file. +** +**

        The callback is not reentrant. The callback function should +** not attempt to invoke any other SQLite interface. If it does, bad +** things may happen, including segmentation faults and corrupt database +** files. The callback function should be a simple function that +** does some arithmetic on its input parameters and returns a result. +** +** ^The X parameter to sqlite3_autovacuum_pages(D,C,P,X) is an optional +** destructor for the P parameter. ^If X is not NULL, then X(P) is +** invoked whenever the database connection closes or when the callback +** is overwritten by another invocation of sqlite3_autovacuum_pages(). +** +**

        ^There is only one autovacuum pages callback per database connection. +** ^Each call to the sqlite3_autovacuum_pages() interface overrides all +** previous invocations for that database connection. ^If the callback +** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer, +** then the autovacuum steps callback is cancelled. The return value +** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might +** be some other error code if something goes wrong. The current +** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other +** return codes might be added in future releases. +** +**

        If no autovacuum pages callback is specified (the usual case) or +** a NULL pointer is provided for the callback, +** then the default behavior is to vacuum all free pages. So, in other +** words, the default behavior is the same as if the callback function +** were something like this: +** +**

        +**     unsigned int demonstration_autovac_pages_callback(
        +**       void *pClientData,
        +**       const char *zSchema,
        +**       unsigned int nDbPage,
        +**       unsigned int nFreePage,
        +**       unsigned int nBytePerPage
        +**     ){
        +**       return nFreePage;
        +**     }
        +** 
        +*/ +SQLITE_API int sqlite3_autovacuum_pages( + sqlite3 *db, + unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), + void*, + void(*)(void*) +); + + +/* +** CAPI3REF: Data Change Notification Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_update_hook() interface registers a callback function +** with the [database connection] identified by the first argument +** to be invoked whenever a row is updated, inserted or deleted in +** a [rowid table]. +** ^Any callback set by a previous call to this function +** for the same database connection is overridden. +** +** ^The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted in a rowid table. +** ^The first argument to the callback is a copy of the third argument +** to sqlite3_update_hook(). +** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** or [SQLITE_UPDATE], depending on the operation that caused the callback +** to be invoked. +** ^The third and fourth arguments to the callback contain pointers to the +** database and table name containing the affected row. +** ^The final callback parameter is the [rowid] of the row. +** ^In the case of an update, this is the [rowid] after the update takes place. +** +** ^(The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_sequence).)^ +** ^The update hook is not invoked when [WITHOUT ROWID] tables are modified. +** +** ^In the current implementation, the update hook +** is not invoked when conflicting rows are deleted because of an +** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook +** invoked when rows are deleted using the [truncate optimization]. +** The exceptions defined in this paragraph might change in a future +** release of SQLite. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^The sqlite3_update_hook(D,C,P) function +** returns the P argument from the previous call +** on the same [database connection] D, or NULL for +** the first call on D. +** +** See also the [sqlite3_commit_hook()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache +** +** ^(This routine enables or disables the sharing of the database cache +** and schema data structures between [database connection | connections] +** to the same database. Sharing is enabled if the argument is true +** and disabled if the argument is false.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). +** In prior versions of SQLite, +** sharing was enabled or disabled for each thread separately. +** +** ^(The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** Existing database connections continue to use the sharing mode +** that was in effect at the time they were opened.)^ +** +** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise.)^ +** +** ^Shared cache is disabled by default. It is recommended that it stay +** that way. In other words, do not use this routine. This interface +** continues to be provided for historical compatibility, but its use is +** discouraged. Any use of shared cache is discouraged. If shared cache +** must be used, it is recommended that shared cache only be enabled for +** individual database connections using the [sqlite3_open_v2()] interface +** with the [SQLITE_OPEN_SHAREDCACHE] flag. +** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** +** This interface is threadsafe on processors where writing a +** 32-bit integer is atomic. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** held by the database library. Memory used to cache database +** pages to improve performance is an example of non-essential memory. +** ^sqlite3_release_memory() returns the number of bytes actually freed, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is in effect even +** when the [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** These interfaces impose limits on the amount of heap memory that will be +** by all database connections within a single process. +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The sqlite3_hard_heap_limit64(N) interface sets a hard upper bound of +** N bytes on the amount of memory that will be allocated. ^The +** sqlite3_hard_heap_limit64(N) interface is similar to +** sqlite3_soft_heap_limit64(N) except that memory allocations will fail +** when the hard heap limit is reached. +** +** ^The return value from both sqlite3_soft_heap_limit64() and +** sqlite3_hard_heap_limit64() is the size of +** the heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the heap limit. Hence, the current +** size of heap limits can be determined by invoking +** sqlite3_soft_heap_limit64(-1) or sqlite3_hard_heap_limit(-1). +** +** ^Setting the heap limits to zero disables the heap limiter mechanism. +** +** ^The soft heap limit may not be greater than the hard heap limit. +** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N) +** is invoked with a value of N that is greater than the hard heap limit, +** the the soft heap limit is set to the value of the hard heap limit. +** ^The soft heap limit is automatically enabled whenever the hard heap +** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and +** the soft heap limit is outside the range of 1..N, then the soft heap +** limit is set to N. ^Invoking sqlite3_soft_heap_limit64(0) when the +** hard heap limit is enabled makes the soft heap limit equal to the +** hard heap limit. +** +** The memory allocation limits can also be adjusted using +** [PRAGMA soft_heap_limit] and [PRAGMA hard_heap_limit]. +** +** ^(The heap limits are not enforced in the current implementation +** if one or more of following conditions are true: +** +**
          +**
        • The limit value is set to zero. +**
        • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
        • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
        • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
        )^ +** +** The circumstances under which SQLite will enforce the heap limits may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 +** +** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns +** information about column C of table T in database D +** on [database connection] X.)^ ^The sqlite3_table_column_metadata() +** interface returns SQLITE_OK and fills in the non-NULL pointers in +** the final five arguments with appropriate values if the specified +** column exists. ^The sqlite3_table_column_metadata() interface returns +** SQLITE_ERROR if the specified column does not exist. +** ^If the column-name parameter to sqlite3_table_column_metadata() is a +** NULL pointer, then this routine simply checks for the existence of the +** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it +** does not. If the table name parameter T in a call to +** sqlite3_table_column_metadata(X,D,T,C,...) is NULL then the result is +** undefined behavior. +** +** ^The column is identified by the second, third and fourth parameters to +** this function. ^(The second parameter is either the name of the database +** (i.e. "main", "temp", or an attached database) containing the specified +** table or NULL.)^ ^If it is NULL, then all attached databases are searched +** for the table using the same algorithm used by the database engine to +** resolve unqualified table references. +** +** ^The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. +** +** ^Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. ^Any of these arguments may be +** NULL, in which case the corresponding element of metadata is omitted. +** +** ^(
        +** +**
        Parameter Output
        Type
        Description +** +**
        5th const char* Data type +**
        6th const char* Name of default collation sequence +**
        7th int True if column has a NOT NULL constraint +**
        8th int True if column is part of the PRIMARY KEY +**
        9th int True if column is [AUTOINCREMENT] +**
        +**
        )^ +** +** ^The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid until the next +** call to any SQLite API function. +** +** ^If the specified table is actually a view, an [error code] is returned. +** +** ^If the specified column is "rowid", "oid" or "_rowid_" and the table +** is not a [WITHOUT ROWID] table and an +** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. ^(If there is no +** [INTEGER PRIMARY KEY] column, then the outputs +** for the [rowid] are set as follows: +** +**
        +**     data type: "INTEGER"
        +**     collation sequence: "BINARY"
        +**     not null: 0
        +**     primary key: 1
        +**     auto increment: 0
        +** 
        )^ +** +** ^This function causes all database schemas to be read from disk and +** parsed, if that has not already been done, and returns an error if +** any errors are encountered while loading the schema. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** METHOD: sqlite3 +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** [SQLite extension] library contained in the file zFile. If +** the file cannot be loaded directly, attempts are made to load +** with various operating-system specific extensions added. +** So for example, if "samplelib" cannot be loaded, then names like +** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might +** be tried also. +** +** ^The entry point is zProc. +** ^(zProc may be 0, in which case SQLite will try to come up with an +** entry point name on its own. It first tries "sqlite3_extension_init". +** If that does not work, it constructs a name "sqlite3_X_init" where the +** X is consists of the lower-case equivalent of all ASCII alphabetic +** characters in the filename from the last "/" to the first following +** "." and omitting any initial "lib".)^ +** ^The sqlite3_load_extension() interface returns +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. The calling function +** should free this memory by calling [sqlite3_free()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, +** otherwise an error will be returned. +** +** Security warning: It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 +** +** ^So as not to open security holes in older applications that are +** unprepared to deal with [extension loading], and as a means of disabling +** [extension loading] while evaluating user-entered SQL, the following API +** is provided to turn the [sqlite3_load_extension()] mechanism on and off. +** +** ^Extension loading is off by default. +** ^Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** Security warning: It is recommended that extension loading +** be enabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked [SQLite extension] +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects an integer result as if the signature of the +** entry point where as follows: +** +**
        +**    int xEntryPoint(
        +**      sqlite3 *db,
        +**      const char **pzErrMsg,
        +**      const struct sqlite3_api_routines *pThunk
        +**    );
        +** 
        )^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()] +** and [sqlite3_cancel_auto_extension()] +*/ +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Cancel Automatic Extension Loading +** +** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the +** initialization routine X that was registered using a prior call to +** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] +** routine returns 1 if initialization routine X was successfully +** unregistered and it returns 0 if X was not on the list of initialization +** routines. +*/ +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table module", +** defines the implementation of a [virtual table]. +** This structure consists mostly of methods for the module. +** +** ^A virtual table module is created by filling in a persistent +** instance of this structure and passing a pointer to that instance +** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. +** ^The registration remains valid until it is replaced by a different +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); + /* The methods above are in versions 1 and 2 of the sqlite_module object. + ** Those below are for version 3 and greater. */ + int (*xShadowName)(const char*); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** ^(The aConstraint[] array records WHERE clause constraints of the form: +** +**
        column OP expr
        +** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(The index of the column is stored in +** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot.)^ +** +** ^The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** ^The aConstraint[] array only reports WHERE clause terms that are +** relevant to the particular virtual table being queried. +** +** ^Information about the ORDER BY clause is stored in aOrderBy[]. +** ^Each term of aOrderBy records a column of the ORDER BY clause. +** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. ^If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and might not be checked again by the byte code.)^ ^(The +** aConstraintUsage[].omit flag is an optimization hint. When the omit flag +** is left in its default setting of false, the constraint will always be +** checked separately in byte code. If the omit flag is change to true, then +** the constraint may or may not be checked in byte code. In other words, +** when the omit flag is true there is no guarantee that the constraint will +** not be checked again using byte code.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[sqlite3_free()] is used to free idxPtr if and only if +** needToFreeIdxPtr is true. +** +** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** ^The estimatedCost value is an estimate of the cost of a particular +** strategy. A cost of N indicates that the cost of the strategy is similar +** to a linear scan of an SQLite table with N rows. A cost of log(N) +** indicates that the expense of the operation is similar to that of a +** binary search on a unique indexed field of an SQLite table with N rows. +** +** ^The estimatedRows value is an estimate of the number of rows that +** will be returned by the strategy. +** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** +** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely +** to include crashing the application). The estimatedRows field should +** therefore only be used if [sqlite3_libversion_number()] returns a +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column constrained. -1 for ROWID */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + /* Fields below are only available in SQLite 3.8.2 and later */ + sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ +}; + +/* +** CAPI3REF: Virtual Table Scan Flags +** +** Virtual table implementations are allowed to set the +** [sqlite3_index_info].idxFlags field to some combination of +** these bits. +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros define the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the WHERE clause of +** a query that uses a [virtual table]. +** +** ^The left-hand operand of the operator is given by the corresponding +** aConstraint[].iColumn field. ^An iColumn of -1 indicates the left-hand +** operand is the rowid. +** The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET +** operators have no left-hand operand, and so for those operators the +** corresponding aConstraint[].iColumn is meaningless and should not be +** used. +** +** All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through +** value 255 are reserved to represent functions that are overloaded +** by the [xFindFunction|xFindFunction method] of the virtual table +** implementation. +** +** The right-hand operands for each constraint might be accessible using +** the [sqlite3_vtab_rhs_value()] interface. Usually the right-hand +** operand is only available if it appears as a single constant literal +** in the input SQL. If the right-hand operand is another column or an +** expression (even a constant expression) or a parameter, then the +** sqlite3_vtab_rhs_value() probably will not be able to extract it. +** ^The SQLITE_INDEX_CONSTRAINT_ISNULL and +** SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand +** and hence calls to sqlite3_vtab_rhs_value() for those operators will +** always return SQLITE_NOTFOUND. +** +** The collating sequence to be used for comparison can be found using +** the [sqlite3_vtab_collation()] interface. For most real-world virtual +** tables, the collating sequence of constraints does not matter (for example +** because the constraints are numeric) and so the sqlite3_vtab_collation() +** interface is no commonly needed. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 +#define SQLITE_INDEX_CONSTRAINT_LIMIT 73 +#define SQLITE_INDEX_CONSTRAINT_OFFSET 74 +#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 +** +** ^These routines are used to register a new [virtual table module] name. +** ^Module names must be registered before +** creating a new [virtual table] using the module and before using a +** preexisting [virtual table] for the module. +** +** ^The module name is registered on the [database connection] specified +** by the first parameter. ^The name of the module is given by the +** second parameter. ^The third parameter is a pointer to +** the implementation of the [virtual table module]. ^The fourth +** parameter is an arbitrary client data pointer that is passed through +** into the [xCreate] and [xConnect] methods of the virtual table module +** when a new virtual table is be being created or reinitialized. +** +** ^The sqlite3_create_module_v2() interface has a fifth parameter which +** is a pointer to a destructor for the pClientData. ^SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. ^The destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +** +** ^If the third parameter (the pointer to the sqlite3_module object) is +** NULL then no new module is created and any existing modules with the +** same name are dropped. +** +** See also: [sqlite3_drop_modules()] +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Remove Unnecessary Virtual Table Implementations +** METHOD: sqlite3 +** +** ^The sqlite3_drop_modules(D,L) interface removes all virtual +** table modules from database connection D except those named on list L. +** The L parameter must be either NULL or a pointer to an array of pointers +** to strings where the array is terminated by a single NULL pointer. +** ^If the L parameter is NULL, then all virtual table modules are removed. +** +** See also: [sqlite3_create_module()] +*/ +SQLITE_API int sqlite3_drop_modules( + sqlite3 *db, /* Remove modules from this connection */ + const char **azKeep /* Except, do not remove the ones named here */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** of this object to describe a particular instance +** of the [virtual table]. Each subclass will +** be tailored to the specific needs of the module implementation. +** The purpose of this superclass is to define certain fields that are +** common to all module implementations. +** +** ^Virtual tables methods can set an error message by assigning a +** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should +** take care that any prior string is freed by a call to [sqlite3_free()] +** prior to assigning a new string to zErrMsg. ^After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Number of open cursors */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [virtual table] and are used +** to loop through the virtual table. Cursors are created using the +** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed +** by the [sqlite3_module.xClose | xClose] method. Cursors are used +** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods +** of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^The [xCreate] and [xConnect] methods of a +** [virtual table module] call this interface +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 +** +** ^(Virtual tables can provide alternative implementations of functions +** using the [xFindFunction] method of the [virtual table module]. +** But global versions of those functions +** must exist in order to be overloaded.)^ +** +** ^(This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created.)^ ^The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a placeholder function that can be overloaded +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB +** KEYWORDS: {BLOB handle} {BLOB handles} +** +** An instance of this object represents an open BLOB on which +** [sqlite3_blob_open | incremental BLOB I/O] can be performed. +** ^Objects of this type are created by [sqlite3_blob_open()] +** and destroyed by [sqlite3_blob_close()]. +** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the BLOB. +** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob +** +** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located +** in row iRow, column zColumn, table zTable in database zDb; +** in other words, the same BLOB that would be selected by: +** +**
        +**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
        +** 
        )^ +** +** ^(Parameter zDb is not the filename that contains the database, but +** rather the symbolic name of the database. For attached databases, this is +** the name that appears after the AS keyword in the [ATTACH] statement. +** For the main database file, the database name is "main". For TEMP +** tables, the database name is "temp".)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If the flags parameter is zero, the BLOB is opened for +** read-only access. +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored +** in *ppBlob. Otherwise an [error code] is returned and, unless the error +** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided +** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** on *ppBlob after this function it returns. +** +** This function fails with SQLITE_ERROR if any of the following are true: +**
          +**
        • ^(Database zDb does not exist)^, +**
        • ^(Table zTable does not exist within database zDb)^, +**
        • ^(Table zTable is a WITHOUT ROWID table)^, +**
        • ^(Column zColumn does not exist)^, +**
        • ^(Row iRow is not present in the table)^, +**
        • ^(The specified column of row iRow contains a value that is not +** a TEXT or BLOB value)^, +**
        • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +** constraint and the blob is being opened for read/write access)^, +**
        • ^([foreign key constraints | Foreign key constraints] are enabled, +** column zColumn is part of a [child key] definition and the blob is +** being opened for read/write access)^. +**
        +** +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** A BLOB referenced by sqlite3_blob_open() may be read using the +** [sqlite3_blob_read()] interface and modified by using +** [sqlite3_blob_write()]. The [BLOB handle] can be moved to a +** different row of the same table using the [sqlite3_blob_reopen()] +** interface. However, the column, table, or database of a [BLOB handle] +** cannot be changed after the [BLOB handle] is opened. +** +** ^(If the row that a BLOB handle points to is modified by an +** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects +** then the BLOB handle is marked as "expired". +** This is true if any column of the row is changed, even a column +** other than the one the BLOB handle is open on.)^ +** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(Changes written into a BLOB prior to the BLOB expiring are not +** rolled back by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion.)^ +** +** ^Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. ^The size of a blob may not be changed by this +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function may be used to create a +** zero-filled blob to read or write using the incremental-blob interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +** +** See also: [sqlite3_blob_close()], +** [sqlite3_blob_reopen()], [sqlite3_blob_read()], +** [sqlite3_blob_bytes()], [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob +** +** ^This function is used to move an existing [BLOB handle] so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing [BLOB handle] to a new row is +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob +** +** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed +** unconditionally. Even if this routine returns an error code, the +** handle is still closed.)^ +** +** ^If the blob handle being closed was opened for read-write access, and if +** the database is in auto-commit mode and there are no other open read-write +** blob handles or active write statements, the current transaction is +** committed. ^If an error occurs while committing the transaction, an error +** code is returned and the transaction rolled back. +** +** Calling this function with an argument that is not a NULL pointer or an +** open blob handle results in undefined behaviour. ^Calling this routine +** with a null pointer (such as would be returned by a failed call to +** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function +** is passed a valid open blob handle, the values returned by the +** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob +** +** ^Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. ^The +** incremental blob I/O routines can only read or overwriting existing +** blob content; they cannot change the size of a blob. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(This function is used to read data from an open [BLOB handle] into a +** caller-supplied buffer. N bytes of data are copied into buffer Z +** from the open BLOB, starting at offset iOffset.)^ +** +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is +** less than zero, [SQLITE_ERROR] is returned and no data is read. +** ^The size of the blob (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(On success, sqlite3_blob_read() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. N bytes of data are copied from the buffer Z +** into the open BLOB, starting at offset iOffset.)^ +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** ^If the [BLOB handle] passed as the first argument was not opened for +** writing (the flags parameter to [sqlite3_blob_open()] was zero), +** this function returns [SQLITE_READONLY]. +** +** This function may only modify the contents of the BLOB; it is +** not possible to increase the size of a BLOB using this API. +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** than zero [SQLITE_ERROR] is returned and no data is written. +** +** ^An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred +** before the [BLOB handle] expired are not rolled back by the +** expiration of the handle, though of course those changes might +** have been overwritten by the statement that expired the BLOB handle +** or by other independent statements. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** ^Names are case sensitive. +** ^Names are zero-terminated UTF-8 strings. +** ^If there is no match, a NULL pointer is returned. +** ^If zVfsName is NULL then the default VFS is returned. +** +** ^New VFSes are registered with sqlite3_vfs_register(). +** ^Each new VFS becomes the default VFS if the makeDflt flag is set. +** ^The same VFS can be registered multiple times without injury. +** ^To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. If two different VFSes with the +** same name are registered, the behavior is undefined. If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. +** ^(If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary.)^ +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
          +**
        • SQLITE_MUTEX_PTHREADS +**
        • SQLITE_MUTEX_W32 +**
        • SQLITE_MUTEX_NOOP +**
        +** +** The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. The SQLITE_MUTEX_PTHREADS and +** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix +** and Windows. +** +** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. In this case the +** application must supply a custom mutex implementation using the +** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function +** before calling sqlite3_initialize() or any other public sqlite3_ +** function that calls sqlite3_initialize(). +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() +** routine returns NULL if it is unable to allocate the requested +** mutex. The argument to sqlite3_mutex_alloc() must one of these +** integer constants: +** +**
          +**
        • SQLITE_MUTEX_FAST +**
        • SQLITE_MUTEX_RECURSIVE +**
        • SQLITE_MUTEX_STATIC_MAIN +**
        • SQLITE_MUTEX_STATIC_MEM +**
        • SQLITE_MUTEX_STATIC_OPEN +**
        • SQLITE_MUTEX_STATIC_PRNG +**
        • SQLITE_MUTEX_STATIC_LRU +**
        • SQLITE_MUTEX_STATIC_PMEM +**
        • SQLITE_MUTEX_STATIC_APP1 +**
        • SQLITE_MUTEX_STATIC_APP2 +**
        • SQLITE_MUTEX_STATIC_APP3 +**
        • SQLITE_MUTEX_STATIC_VFS1 +**
        • SQLITE_MUTEX_STATIC_VFS2 +**
        • SQLITE_MUTEX_STATIC_VFS3 +**
        +** +** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) +** cause sqlite3_mutex_alloc() to create +** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other +** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return +** a pointer to a static preexisting mutex. ^Nine static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. ^For the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. Attempting to deallocate a static +** mutex results in undefined behavior. +** +** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. ^If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. ^(Mutexes created using +** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. +** In such cases, the +** mutex must be exited an equal number of times before another thread +** can enter.)^ If the same thread tries to enter any mutex other +** than an SQLITE_MUTEX_RECURSIVE more than once, the behavior is undefined. +** +** ^(Some systems (for example, Windows 95) do not support the operation +** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() +** will always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable +** behavior.)^ +** +** ^The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. +** +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** sqlite3_mutex_leave() is a NULL pointer, then all three routines +** behave as no-ops. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the application has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the application +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** output variable when querying the system for the current mutex +** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. +** +** ^The xMutexInit method defined by this structure is invoked as +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^The xMutexEnd method defined by this structure is invoked as +** part of system shutdown by the sqlite3_shutdown() function. The +** implementation of this method is expected to release all outstanding +** resources obtained by the mutex methods implementation, especially +** those obtained by the xMutexInit method. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
          +**
        • [sqlite3_mutex_alloc()]
        • +**
        • [sqlite3_mutex_free()]
        • +**
        • [sqlite3_mutex_enter()]
        • +**
        • [sqlite3_mutex_try()]
        • +**
        • [sqlite3_mutex_leave()]
        • +**
        • [sqlite3_mutex_held()]
        • +**
        • [sqlite3_mutex_notheld()]
        • +**
        )^ +** +** The only difference is that the public sqlite3_XXX functions enumerated +** above silently ignore any invocations that pass a NULL pointer instead +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case. The results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (i.e. it is acceptable to provide an implementation that segfaults if +** it is passed a NULL pointer). +** +** The xMutexInit() method must be threadsafe. It must be harmless to +** invoke xMutexInit() multiple times within the same process and without +** intervening calls to xMutexEnd(). Second and subsequent calls to +** xMutexInit() must be no-ops. +** +** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. ^However xMutexAlloc() may use SQLite +** memory allocation for a fast or recursive mutex. +** +** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** called, but only if the prior call to xMutexInit returned SQLITE_OK. +** If xMutexInit fails in any way, it is expected to clean up after itself +** prior to returning. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. The SQLite core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provide versions of these +** routines that actually work. If the implementation does not provide working +** versions of these routines, it should at least provide stubs that always +** return true so that one does not get spurious assertion failures. +** +** If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +#ifndef NDEBUG +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); +#endif + +/* +** CAPI3REF: Mutex Types +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MAIN 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ +#define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ + +/* Legacy compatibility: */ +#define SQLITE_MUTEX_STATIC_MASTER 2 + + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 +** +** ^This interface returns a pointer the [sqlite3_mutex] object that +** serializes access to the [database connection] given in the argument +** when the [threading mode] is Serialized. +** ^If the [threading mode] is Single-thread or Multi-thread then this +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 +** KEYWORDS: {file control} +** +** ^The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. ^The +** name of the database is "main" for the main database or "temp" for the +** TEMP database, or the name that appears after the AS keyword for +** databases that are added using the [ATTACH] SQL command. +** ^A NULL pointer can be used in place of "main" to refer to the +** main database file. +** ^The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** A few opcodes for [sqlite3_file_control()] are handled directly +** by the SQLite core and never invoke the +** sqlite3_io_methods.xFileControl method. +** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. The +** [SQLITE_FCNTL_JOURNAL_POINTER] works similarly except that it returns +** the [sqlite3_file] object associated with the journal file instead of +** the main database. The [SQLITE_FCNTL_VFS_POINTER] opcode returns +** a pointer to the underlying [sqlite3_vfs] object for the file. +** The [SQLITE_FCNTL_DATA_VERSION] returns the data version counter +** from the pager. +** +** ^If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. ^This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. +** +** See also: [file control opcodes] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^The sqlite3_test_control() interface is used to read out internal +** state of SQLite and to inject faults into SQLite for testing +** purposes. ^The first parameter is an operation code that determines +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** Applications should not use any of these parameters or the +** [sqlite3_test_control()] interface. +*/ +#define SQLITE_TESTCTRL_FIRST 5 +#define SQLITE_TESTCTRL_PRNG_SAVE 5 +#define SQLITE_TESTCTRL_PRNG_RESTORE 6 +#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#define SQLITE_TESTCTRL_ASSERT 12 +#define SQLITE_TESTCTRL_ALWAYS 13 +#define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ +#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 +#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ +#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 +#define SQLITE_TESTCTRL_NEVER_CORRUPT 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_BYTEORDER 22 +#define SQLITE_TESTCTRL_ISINIT 23 +#define SQLITE_TESTCTRL_SORTER_MMAP 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_PARSER_COVERAGE 26 +#define SQLITE_TESTCTRL_RESULT_INTREAL 27 +#define SQLITE_TESTCTRL_PRNG_SEED 28 +#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 +#define SQLITE_TESTCTRL_SEEK_COUNT 30 +#define SQLITE_TESTCTRL_TRACEFLAGS 31 +#define SQLITE_TESTCTRL_TUNE 32 +#define SQLITE_TESTCTRL_LOGEST 33 +#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */ + +/* +** CAPI3REF: SQL Keyword Checking +** +** These routines provide access to the set of SQL language keywords +** recognized by SQLite. Applications can uses these routines to determine +** whether or not a specific identifier needs to be escaped (for example, +** by enclosing in double-quotes) so as not to confuse the parser. +** +** The sqlite3_keyword_count() interface returns the number of distinct +** keywords understood by SQLite. +** +** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and +** makes *Z point to that keyword expressed as UTF8 and writes the number +** of bytes in the keyword into *L. The string that *Z points to is not +** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns +** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z +** or L are NULL or invalid pointers then calls to +** sqlite3_keyword_name(N,Z,L) result in undefined behavior. +** +** The sqlite3_keyword_check(Z,L) interface checks to see whether or not +** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero +** if it is and zero if not. +** +** The parser used by SQLite is forgiving. It is often possible to use +** a keyword as an identifier as long as such use does not result in a +** parsing ambiguity. For example, the statement +** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and +** creates a new table named "BEGIN" with three columns named +** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid +** using keywords as identifiers. Common techniques used to avoid keyword +** name collisions include: +**
          +**
        • Put all identifier names inside double-quotes. This is the official +** SQL way to escape identifier names. +**
        • Put identifier names inside [...]. This is not standard SQL, +** but it is what SQL Server does and so lots of programmers use this +** technique. +**
        • Begin every identifier with the letter "Z" as no SQL keywords start +** with "Z". +**
        • Include a digit somewhere in every identifier name. +**
        +** +** Note that the number of keywords understood by SQLite can depend on +** compile-time options. For example, "VACUUM" is not a keyword if +** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also, +** new keywords may be added to future releases of SQLite. +*/ +SQLITE_API int sqlite3_keyword_count(void); +SQLITE_API int sqlite3_keyword_name(int,const char**,int*); +SQLITE_API int sqlite3_keyword_check(const char*,int); + +/* +** CAPI3REF: Dynamic String Object +** KEYWORDS: {dynamic string} +** +** An instance of the sqlite3_str object contains a dynamically-sized +** string under construction. +** +** The lifecycle of an sqlite3_str object is as follows: +**
          +**
        1. ^The sqlite3_str object is created using [sqlite3_str_new()]. +**
        2. ^Text is appended to the sqlite3_str object using various +** methods, such as [sqlite3_str_appendf()]. +**
        3. ^The sqlite3_str object is destroyed and the string it created +** is returned using the [sqlite3_str_finish()] interface. +**
        +*/ +typedef struct sqlite3_str sqlite3_str; + +/* +** CAPI3REF: Create A New Dynamic String Object +** CONSTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_new(D)] interface allocates and initializes +** a new [sqlite3_str] object. To avoid memory leaks, the object returned by +** [sqlite3_str_new()] must be freed by a subsequent call to +** [sqlite3_str_finish(X)]. +** +** ^The [sqlite3_str_new(D)] interface always returns a pointer to a +** valid [sqlite3_str] object, though in the event of an out-of-memory +** error the returned object might be a special singleton that will +** silently reject new text, always return SQLITE_NOMEM from +** [sqlite3_str_errcode()], always return 0 for +** [sqlite3_str_length()], and always return NULL from +** [sqlite3_str_finish(X)]. It is always safe to use the value +** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter +** to any of the other [sqlite3_str] methods. +** +** The D parameter to [sqlite3_str_new(D)] may be NULL. If the +** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum +** length of the string contained in the [sqlite3_str] object will be +** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead +** of [SQLITE_MAX_LENGTH]. +*/ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*); + +/* +** CAPI3REF: Finalize A Dynamic String +** DESTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X +** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()] +** that contains the constructed string. The calling application should +** pass the returned value to [sqlite3_free()] to avoid a memory leak. +** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any +** errors were encountered during construction of the string. ^The +** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the +** string in [sqlite3_str] object X is zero bytes long. +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str*); + +/* +** CAPI3REF: Add Content To A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces add content to an sqlite3_str object previously obtained +** from [sqlite3_str_new()]. +** +** ^The [sqlite3_str_appendf(X,F,...)] and +** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf] +** functionality of SQLite to append formatted text onto the end of +** [sqlite3_str] object X. +** +** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S +** onto the end of the [sqlite3_str] object X. N must be non-negative. +** S must contain at least N non-zero bytes of content. To append a +** zero-terminated string in its entirety, use the [sqlite3_str_appendall()] +** method instead. +** +** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of +** zero-terminated string S onto the end of [sqlite3_str] object X. +** +** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the +** single-byte character C onto the end of [sqlite3_str] object X. +** ^This method can be used, for example, to add whitespace indentation. +** +** ^The [sqlite3_str_reset(X)] method resets the string under construction +** inside [sqlite3_str] object X back to zero bytes in length. +** +** These methods do not return a result code. ^If an error occurs, that fact +** is recorded in the [sqlite3_str] object and can be recovered by a +** subsequent call to [sqlite3_str_errcode(X)]. +*/ +SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...); +SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list); +SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N); +SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn); +SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C); +SQLITE_API void sqlite3_str_reset(sqlite3_str*); + +/* +** CAPI3REF: Status Of A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces return the current status of an [sqlite3_str] object. +** +** ^If any prior errors have occurred while constructing the dynamic string +** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return +** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns +** [SQLITE_NOMEM] following any out-of-memory error, or +** [SQLITE_TOOBIG] if the size of the dynamic string exceeds +** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors. +** +** ^The [sqlite3_str_length(X)] method returns the current length, in bytes, +** of the dynamic string under construction in [sqlite3_str] object X. +** ^The length returned by [sqlite3_str_length(X)] does not include the +** zero-termination byte. +** +** ^The [sqlite3_str_value(X)] method returns a pointer to the current +** content of the dynamic string under construction in X. The value +** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X +** and might be freed or altered by any subsequent method on the same +** [sqlite3_str] object. Applications must not used the pointer returned +** [sqlite3_str_value(X)] after any subsequent method call on the same +** object. ^Applications may change the content of the string returned +** by [sqlite3_str_value(X)] as long as they do not write into any bytes +** outside the range of 0 to [sqlite3_str_length(X)] and do not read or +** write any byte after any subsequent sqlite3_str method call. +*/ +SQLITE_API int sqlite3_str_errcode(sqlite3_str*); +SQLITE_API int sqlite3_str_length(sqlite3_str*); +SQLITE_API char *sqlite3_str_value(sqlite3_str*); + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^These interfaces are used to retrieve runtime status information +** about the performance of SQLite, and optionally to reset various +** highwater marks. ^The first argument is an integer code for +** the specific parameter to measure. ^(Recognized integer codes +** are of the form [status parameters | SQLITE_STATUS_...].)^ +** ^The current value of the parameter is returned into *pCurrent. +** ^The highest recorded value is returned in *pHighwater. ^If the +** resetFlag is true, then the highest record value is reset after +** *pHighwater is written. ^(Some parameters do not record the highest +** value. For those parameters +** nothing is written into *pHighwater and the resetFlag is ignored.)^ +** ^(Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent.)^ +** +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. +** +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** These integer constants designate various run-time status parameters +** that can be returned by [sqlite3_status()]. +** +**
        +** [[SQLITE_STATUS_MEMORY_USED]] ^(
        SQLITE_STATUS_MEMORY_USED
        +**
        This parameter is the current amount of memory checked out +** using [sqlite3_malloc()], either directly or indirectly. The +** figure includes calls made to [sqlite3_malloc()] by the application +** and internal memory usage by the SQLite library. Auxiliary page-cache +** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in +** this parameter. The amount returned is the sum of the allocation +** sizes as reported by the xSize method in [sqlite3_mem_methods].
        )^ +** +** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
        SQLITE_STATUS_MALLOC_SIZE
        +**
        This parameter records the largest memory allocation request +** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their +** internal equivalents). Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
        )^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
        SQLITE_STATUS_MALLOC_COUNT
        +**
        This parameter records the number of separate memory allocations +** currently checked out.
        )^ +** +** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
        SQLITE_STATUS_PAGECACHE_USED
        +**
        This parameter returns the number of pages used out of the +** [pagecache memory allocator] that was configured using +** [SQLITE_CONFIG_PAGECACHE]. The +** value returned is in pages, not in bytes.
        )^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
        SQLITE_STATUS_PAGECACHE_OVERFLOW
        +**
        This parameter returns the number of bytes of page cache +** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] +** buffer and where forced to overflow to [sqlite3_malloc()]. The +** returned value includes allocations that overflowed because they +** where too large (they were larger than the "sz" parameter to +** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because +** no space was left in the page cache.
        )^ +** +** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
        SQLITE_STATUS_PAGECACHE_SIZE
        +**
        This parameter records the largest memory allocation request +** handed to the [pagecache memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
        )^ +** +** [[SQLITE_STATUS_SCRATCH_USED]]
        SQLITE_STATUS_SCRATCH_USED
        +**
        No longer used.
        +** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
        SQLITE_STATUS_SCRATCH_OVERFLOW
        +**
        No longer used.
        +** +** [[SQLITE_STATUS_SCRATCH_SIZE]]
        SQLITE_STATUS_SCRATCH_SIZE
        +**
        No longer used.
        +** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
        SQLITE_STATUS_PARSER_STACK
        +**
        The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
        )^ +**
        +** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 /* NOT USED */ +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 /* NOT USED */ +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** METHOD: sqlite3 +** +** ^This interface is used to retrieve runtime status information +** about a single [database connection]. ^The first argument is the +** database connection object to be interrogated. ^The second argument +** is an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow in future releases of SQLite. +** +** ^The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. ^If +** the resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** if a discontinued or unsupported verb is invoked. +** +**
        +** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
        SQLITE_DBSTATUS_LOOKASIDE_USED
        +**
        This parameter returns the number of lookaside memory slots currently +** checked out.
        )^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
        SQLITE_DBSTATUS_LOOKASIDE_HIT
        +**
        This parameter returns the number of malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
        SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
        +**
        This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
        SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
        +**
        This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
        SQLITE_DBSTATUS_CACHE_USED
        +**
        This parameter returns the approximate number of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(
        SQLITE_DBSTATUS_CACHE_USED_SHARED
        +**
        This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
        SQLITE_DBSTATUS_SCHEMA_USED
        +**
        This parameter returns the approximate number of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
        SQLITE_DBSTATUS_STMT_USED
        +**
        This parameter returns the approximate number of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
        +** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
        SQLITE_DBSTATUS_CACHE_HIT
        +**
        This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
        +** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
        SQLITE_DBSTATUS_CACHE_MISS
        +**
        This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
        +** +** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
        SQLITE_DBSTATUS_CACHE_WRITE
        +**
        This parameter returns the number of dirty cache entries that have +** been written to disk. Specifically, the number of pages written to the +** wal file in wal mode databases, or the number of pages written to the +** database file in rollback mode databases. Any pages written as part of +** transaction rollback or database recovery operations are not included. +** If an IO or other error occurs while writing a page to disk, the effect +** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The +** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**
        +** +** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(
        SQLITE_DBSTATUS_CACHE_SPILL
        +**
        This parameter returns the number of dirty cache entries that have +** been written to disk in the middle of a transaction due to the page +** cache overflowing. Transactions are more efficient if they are written +** to disk all at once. When pages spill mid-transaction, that introduces +** additional overhead. This parameter can be used help identify +** inefficiencies that can be resolved by increasing the cache size. +**
        +** +** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
        SQLITE_DBSTATUS_DEFERRED_FKS
        +**
        This parameter returns zero for the current value if and only if +** all foreign key constraints (deferred or immediate) have been +** resolved.)^ ^The highwater mark is always 0. +**
        +**
        +*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_CACHE_WRITE 9 +#define SQLITE_DBSTATUS_DEFERRED_FKS 10 +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_CACHE_SPILL 12 +#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** of times it has performed specific operations.)^ These counters can +** be used to monitor the performance characteristics of the prepared +** statements. For example, if the number of table steps greatly exceeds +** the number of table searches or result rows, that would tend to indicate +** that the prepared statement is using a full table scan rather than +** an index. +** +** ^(This interface is used to retrieve and reset counter values from +** a [prepared statement]. The first argument is the prepared statement +** object to be interrogated. The second argument +** is an integer code for a specific [SQLITE_STMTSTATUS counter] +** to be interrogated.)^ +** ^The current value of the requested counter is returned. +** ^If the resetFlg is true, then the counter is reset to zero after this +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
        +** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
        SQLITE_STMTSTATUS_FULLSCAN_STEP
        +**
        ^This is the number of times that SQLite has stepped forward in +** a table as part of a full table scan. Large numbers for this counter +** may indicate opportunities for performance improvement through +** careful use of indices.
        +** +** [[SQLITE_STMTSTATUS_SORT]]
        SQLITE_STMTSTATUS_SORT
        +**
        ^This is the number of sort operations that have occurred. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance through careful use of indices.
        +** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
        SQLITE_STMTSTATUS_AUTOINDEX
        +**
        ^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
        +** +** [[SQLITE_STMTSTATUS_VM_STEP]]
        SQLITE_STMTSTATUS_VM_STEP
        +**
        ^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +** +** [[SQLITE_STMTSTATUS_REPREPARE]]
        SQLITE_STMTSTATUS_REPREPARE
        +**
        ^This is the number of times that the prepare statement has been +** automatically regenerated due to schema changes or changes to +** [bound parameters] that might affect the query plan. +** +** [[SQLITE_STMTSTATUS_RUN]]
        SQLITE_STMTSTATUS_RUN
        +**
        ^This is the number of times that the prepared statement has +** been run. A single "run" for the purposes of this counter is one +** or more calls to [sqlite3_step()] followed by a call to [sqlite3_reset()]. +** The counter is incremented on the first [sqlite3_step()] call of each +** cycle. +** +** [[SQLITE_STMTSTATUS_FILTER_MISS]] +** [[SQLITE_STMTSTATUS_FILTER HIT]] +**
        SQLITE_STMTSTATUS_FILTER_HIT
        +** SQLITE_STMTSTATUS_FILTER_MISS
        +**
        ^SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join +** step was bypassed because a Bloom filter returned not-found. The +** corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of +** times that the Bloom filter returned a find, and thus the join step +** had to be processed as normal. +** +** [[SQLITE_STMTSTATUS_MEMUSED]]
        SQLITE_STMTSTATUS_MEMUSED
        +**
        ^This is the approximate number of bytes of heap memory +** used to store the prepared statement. ^This value is not actually +** a counter, and so the resetFlg parameter to sqlite3_stmt_status() +** is ignored when the opcode is SQLITE_STMTSTATUS_MEMUSED. +**
        +**
        +*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 +#define SQLITE_STMTSTATUS_REPREPARE 5 +#define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_FILTER_MISS 7 +#define SQLITE_STMTSTATUS_FILTER_HIT 8 +#define SQLITE_STMTSTATUS_MEMUSED 99 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an +** internal buffer by SQLite within the call to [sqlite3_config]. Hence +** the application may discard the parameter after the call to +** [sqlite3_config()] returns.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to the xInit method, +** so the xInit method need not be threadsafe. ^The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. All other methods must be threadsafe +** in multithreaded applications. +** +** ^SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** though this is not guaranteed. ^The +** first parameter, szPage, is the size in bytes of the pages that must +** be allocated by the cache. ^szPage will always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third argument to xCreate(), bPurgeable, is true if the cache being +** created will be used to cache database pages of a file stored on disk, or +** false if it is used for an in-memory database. The cache implementation +** does not have to do anything special based with the value of bPurgeable; +** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(The xCachesize() method may be called at any time by SQLite to set the +** suggested maximum cache-size (number of pages stored by) the cache +** instance passed as the first argument. This is the value configured using +** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable +** parameter, the implementation is not required to do anything with this +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum key value +** is 1. After it has been retrieved using xFetch, the page is considered +** to be "pinned". +** +** If the requested page is already in the page cache, then the page cache +** implementation must return a pointer to the page buffer with its content +** intact. If the requested page is not already in the cache, then the +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
        createFlag Behavior when page is not already in cache +**
        0 Do not allocate a new page. Return NULL. +**
        1 Allocate a new page if it easy and convenient to do so. +** Otherwise return NULL. +**
        2 Make every effort to allocate a new page. Only return +** NULL if allocating a new page is effectively impossible. +**
        +** +** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. If the third parameter, discard, is non-zero, +** then the page must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** discarded. ^Any prior cache entry associated with newKey is guaranteed not +** to be pinned. +** +** When SQLite calls the xTruncate() method, the cache must discard all +** existing cache entries with page numbers (keys) greater than or equal +** to the value of the iLimit parameter passed to xTruncate(). If any +** of these pages are pinned, they are implicitly unpinned, meaning that +** they can be safely discarded. +** +** [[the xDestroy() page cache method]] +** ^The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. ^After +** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] +** handle invalid, and will not use it with any other sqlite3_pcache_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** online backup operation. ^The sqlite3_backup object is created by +** a call to [sqlite3_backup_init()] and is destroyed by a call to +** [sqlite3_backup_finish()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** The backup API copies the content of one database into another. +** It is useful either for creating backups of databases or +** for copying in-memory databases to or from persistent files. +** +** See Also: [Using the SQLite Online Backup API] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is being read; +** it is not locked continuously for the entire backup operation. +** ^Thus, the backup may be performed on a live source database without +** preventing other database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
          +**
        1. sqlite3_backup_init() is called once to initialize the +** backup, +**
        2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
        3. sqlite3_backup_finish() is called to release all resources +** associated with the backup operation. +**
        )^ +** There should be exactly one call to sqlite3_backup_finish() for each +** successful call to sqlite3_backup_init(). +** +** [[sqlite3_backup_init()]] sqlite3_backup_init() +** +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database +** and the database name, respectively. +** ^The database name is "main" for the main database, "temp" for the +** temporary database, or the name specified after the AS keyword in +** an [ATTACH] statement for an attached database. +** ^The S and M arguments passed to +** sqlite3_backup_init(D,N,S,M) identify the [database connection] +** and database name of the source database, respectively. +** ^The source and destination [database connections] (parameters S and D) +** must be different or else sqlite3_backup_init(D,N,S,M) will fail with +** an error. +** +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the +** destination database. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored in the +** destination [database connection] D. +** ^The error code and message for the failed call to sqlite3_backup_init() +** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or +** [sqlite3_errmsg16()] functions. +** ^A successful call to sqlite3_backup_init() returns a pointer to an +** [sqlite3_backup] object. +** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and +** sqlite3_backup_finish() functions to perform the specified backup +** operation. +** +** [[sqlite3_backup_step()]] sqlite3_backup_step() +** +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** the source and destination databases specified by [sqlite3_backup] object B. +** ^If N is negative, all remaining source pages are copied. +** ^If sqlite3_backup_step(B,N) successfully copies N pages and there +** are still more pages to be copied, then the function returns [SQLITE_OK]. +** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages +** from source to destination, then it returns [SQLITE_DONE]. +** ^If an error occurs while running sqlite3_backup_step(B,N), +** then an [error code] is returned. ^As well as [SQLITE_OK] and +** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], +** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
          +**
        1. the destination database was opened read-only, or +**
        2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
        3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
        )^ +** +** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then +** the [sqlite3_busy_handler | busy-handler function] +** is invoked (if one is specified). ^If the +** busy-handler returns non-zero before the lock is available, then +** [SQLITE_BUSY] is returned to the caller. ^In this case the call to +** sqlite3_backup_step() can be retried later. ^If the source +** [database connection] +** is being used to write to the source database when sqlite3_backup_step() +** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this +** case the call to sqlite3_backup_step() can be retried later on. ^(If +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or +** [SQLITE_READONLY] is returned, then +** there is no point in retrying the call to sqlite3_backup_step(). These +** errors are considered fatal.)^ The application must accept +** that the backup operation has failed and pass the backup operation handle +** to the sqlite3_backup_finish() to release associated resources. +** +** ^The first call to sqlite3_backup_step() obtains an exclusive lock +** on the destination file. ^The exclusive lock is not released until either +** sqlite3_backup_finish() is called or the backup operation is complete +** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to +** sqlite3_backup_step() obtains a [shared lock] on the source database that +** lasts for the duration of the sqlite3_backup_step() call. +** ^Because the source database is not locked between calls to +** sqlite3_backup_step(), the source database may be modified mid-way +** through the backup process. ^If the source database is modified by an +** external process or via a database connection other than the one being +** used by the backup operation, then the backup will be automatically +** restarted by the next call to sqlite3_backup_step(). ^If the source +** database is modified by the using the same database connection as is used +** by the backup operation, then the backup database is automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the application +** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). +** ^The sqlite3_backup_finish() interfaces releases all +** resources associated with the [sqlite3_backup] object. +** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any +** active write-transaction on the destination database is rolled back. +** The [sqlite3_backup] object is invalid +** and may not be used following a call to sqlite3_backup_finish(). +** +** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no +** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() completed. +** ^If an out-of-memory condition or IO error occurred during any prior +** sqlite3_backup_step() call on the same [sqlite3_backup] object, then +** sqlite3_backup_finish() returns the corresponding [error code]. +** +** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() +** is not a permanent error and does not affect the return value of +** sqlite3_backup_finish(). +** +** [[sqlite3_backup_remaining()]] [[sqlite3_backup_pagecount()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ +** +** Concurrent Usage of Database Handles +** +** ^The source [database connection] may be used by the application for other +** purposes while a backup operation is underway or being initialized. +** ^If SQLite is compiled and configured to support threadsafe database +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after +** sqlite3_backup_init() is called and before the corresponding call to +** sqlite3_backup_finish(). SQLite does not currently check to see +** if the application incorrectly accesses the destination [database connection] +** and so no error code is reported, but the operations may malfunction +** nevertheless. Use of the destination database connection while a +** backup is in progress might also also cause a mutex deadlock. +** +** If running in [shared cache mode], the application must +** guarantee that the shared cache used by the destination database +** is not accessed while the backup is running. In practice this means +** that the application must guarantee that the disk file being +** backed up to is not accessed by any connection within the process, +** not just the specific connection that was passed to sqlite3_backup_init(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** METHOD: sqlite3 +** +** ^When running in shared-cache mode, a database operation may fail with +** an [SQLITE_LOCKED] error if the required locks on the shared-cache or +** individual tables within the shared-cache cannot be obtained. See +** [SQLite Shared-Cache Mode] for a description of shared-cache locking. +** ^This API may be used to register a callback that SQLite will invoke +** when the connection currently holding the required lock relinquishes it. +** ^This API is only available if the library was compiled with the +** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. +** +** See Also: [Using the SQLite Unlock Notification Feature]. +** +** ^Shared-cache locks are released when a database connection concludes +** its current transaction, either by committing it or rolling it back. +** +** ^When a connection (known as the blocked connection) fails to obtain a +** shared-cache lock and SQLITE_LOCKED is returned to the caller, the +** identity of the database connection (the blocking connection) that +** has locked the required resource is stored internally. ^After an +** application receives an SQLITE_LOCKED error, it may call the +** sqlite3_unlock_notify() method with the blocked connection handle as +** the first argument to register for a callback that will be invoked +** when the blocking connections current transaction is concluded. ^The +** callback is invoked from within the [sqlite3_step] or [sqlite3_close] +** call that concludes the blocking connection's transaction. +** +** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, +** there is a chance that the blocking connection will have already +** concluded its transaction by the time sqlite3_unlock_notify() is invoked. +** If this happens, then the specified callback is invoked immediately, +** from within the call to sqlite3_unlock_notify().)^ +** +** ^If the blocked connection is attempting to obtain a write-lock on a +** shared-cache table, and more than one other connection currently holds +** a read-lock on the same table, then SQLite arbitrarily selects one of +** the other connections to use as the blocking connection. +** +** ^(There may be at most one unlock-notify callback registered by a +** blocked connection. If sqlite3_unlock_notify() is called when the +** blocked connection already has a registered unlock-notify callback, +** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** any sqlite3_xxx API functions from within an unlock-notify callback, a +** crash or deadlock may be the result. +** +** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** When a blocking connection's transaction is concluded, there may be +** more than one blocked connection that has registered for an unlock-notify +** callback. ^If two or more such blocked connections have specified the +** same callback function, then instead of invoking the callback function +** multiple times, it is invoked once with the set of void* context pointers +** specified by the blocked connections bundled together into an array. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** will proceed and the system may remain deadlocked indefinitely. +** +** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock +** detection. ^If a given call to sqlite3_unlock_notify() would put the +** system in a deadlocked state, then SQLITE_LOCKED is returned and no +** unlock-notify callback is registered. The system is said to be in +** a deadlocked state if connection A has registered for an unlock-notify +** callback on the conclusion of connection B's transaction, and connection +** B has itself registered for an unlock-notify callback when connection +** A's transaction is concluded. ^Indirect deadlock is also detected, so +** the system is also considered to be deadlocked if connection B has +** registered for an unlock-notify callback on the conclusion of connection +** C's transaction, where connection C is waiting on connection A. ^Any +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** or "DROP INDEX" query, an infinite loop might be the result. +** +** One way around this problem is to check the extended error code returned +** by an sqlite3_step() call. ^(If there is a blocking connection, then the +** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in +** the special "DROP TABLE/INDEX" case, the extended error code is just +** SQLITE_LOCKED.)^ +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications +** and extensions to compare the contents of two buffers containing UTF-8 +** strings in a case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *, const char *); +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: String Globbing +* +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in +** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); + +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the [error log] +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** is invoked each time data is committed to a database in wal mode. +** +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^The return value is +** a copy of the third parameter from the previous call, if any, or 0. +** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Checkpoints initiated by this mechanism are +** [sqlite3_wal_checkpoint_v2|PASSIVE]. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to +** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ +** +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** [write-ahead log] for database X on [database connection] D to be +** transferred into the database file and for the write-ahead log to +** be reset. See the [checkpointing] documentation for addition +** information. +** +** This interface used to be the only way to cause a checkpoint to +** occur. But then the newer and more powerful [sqlite3_wal_checkpoint_v2()] +** interface was added. This interface is retained for backwards +** compatibility and as a convenience for applications that need to manually +** start a callback but which do not need the full power (and corresponding +** complication) of [sqlite3_wal_checkpoint_v2()]. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint +** operation on database X of [database connection] D in mode M. Status +** information is written back into integers pointed to by L and C.)^ +** ^(The M parameter must be a valid [checkpoint mode]:)^ +** +**
        +**
        SQLITE_CHECKPOINT_PASSIVE
        +** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames +** in the log were checkpointed. ^The [busy-handler callback] +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** ^On the other hand, passive mode might leave the checkpoint unfinished +** if there are concurrent readers or writers. +** +**
        SQLITE_CHECKPOINT_FULL
        +** ^This mode blocks (it invokes the +** [sqlite3_busy_handler|busy-handler callback]) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. ^It then checkpoints all frames in the log file and syncs the +** database file. ^This mode blocks new database writers while it is pending, +** but new database readers are allowed to continue unimpeded. +** +**
        SQLITE_CHECKPOINT_RESTART
        +** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition +** that after checkpointing the log file it blocks (calls the +** [busy-handler callback]) +** until all readers are reading from the database file only. ^This ensures +** that the next writer will restart the log file from the beginning. +** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new +** database writer attempts while it is pending, but does not impede readers. +** +**
        SQLITE_CHECKPOINT_TRUNCATE
        +** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the +** addition that it also truncates the log file to zero bytes just prior +** to a successful return. +**
        +** +** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file or to -1 if the checkpoint could not run because +** of an error or because the database is not in [WAL mode]. ^If pnCkpt is not +** NULL,then *pnCkpt is set to the total number of checkpointed frames in the +** log file (including any that were already checkpointed before the function +** was called) or to -1 if the checkpoint could not run due to an error or +** because the database is not in WAL mode. ^Note that upon successful +** completion of an SQLITE_CHECKPOINT_TRUNCATE, the log file will have been +** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. +** +** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** exclusive "writer" lock on the database file. ^If the writer lock cannot be +** obtained immediately, and a busy-handler is configured, it is invoked and +** the writer lock retried until either the busy-handler returns 0 or the lock +** is successfully obtained. ^The busy-handler is also invoked while waiting for +** database readers as described above. ^If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. ^SQLITE_BUSY is returned in this case. +** +** ^If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases [attached] to +** [database connection] db. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** ^If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. ^If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +** +** ^Unless it returns SQLITE_MISUSE, +** the sqlite3_wal_checkpoint_v2() interface +** sets the error information that is queried by +** [sqlite3_errcode()] and [sqlite3_errmsg()]. +** +** ^The [PRAGMA wal_checkpoint] command can be used to invoke this interface +** from SQL. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint Mode Values +** KEYWORDS: {checkpoint mode} +** +** These constants define all valid values for the "checkpoint mode" passed +** as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface. +** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the +** meaning of each of these checkpoint modes. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ +#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ +#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */ +#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */ + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** In the call sqlite3_vtab_config(D,C,...) the D parameter is the +** [database connection] in which the virtual table is being created and +** which is passed in as the first argument to the [xConnect] or [xCreate] +** method that is invoking sqlite3_vtab_config(). The C parameter is one +** of the [virtual table configuration options]. The presence and meaning +** of parameters after C depend on which [virtual table configuration option] +** is used. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** KEYWORDS: {virtual table configuration options} +** KEYWORDS: {virtual table configuration option} +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
        +** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]] +**
        SQLITE_VTAB_CONSTRAINT_SUPPORT
        +**
        Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
        +** +** [[SQLITE_VTAB_DIRECTONLY]]
        SQLITE_VTAB_DIRECTONLY
        +**
        Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** prohibits that virtual table from being used from within triggers and +** views. +**
        +** +** [[SQLITE_VTAB_INNOCUOUS]]
        SQLITE_VTAB_INNOCUOUS
        +**
        Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** identify that virtual table as being safe to use from within triggers +** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the +** virtual table can do no serious harm even if it is controlled by a +** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS +** flag unless absolutely necessary. +**
        +**
        +*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 +#define SQLITE_VTAB_INNOCUOUS 2 +#define SQLITE_VTAB_DIRECTONLY 3 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE +** +** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn] +** method of a [virtual table], then it might return true if the +** column is being fetched as part of an UPDATE operation during which the +** column value will not change. The virtual table implementation can use +** this hint as permission to substitute a return value that is less +** expensive to compute and that the corresponding +** [xUpdate] method understands as a "no-change" value. +** +** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that +** the column is not changed by the UPDATE statement, then the xColumn +** method can optionally return without setting a result, without calling +** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces]. +** In that case, [sqlite3_value_nochange(X)] will return true for the +** same column in the [xUpdate] method. +** +** The sqlite3_vtab_nochange() routine is an optimization. Virtual table +** implementations should continue to give a correct answer even if the +** sqlite3_vtab_nochange() interface were to always return false. In the +** current implementation, the sqlite3_vtab_nochange() interface does always +** returns false for the enhanced [UPDATE FROM] statement. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); + +/* +** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** METHOD: sqlite3_index_info +** +** This function may only be called from within a call to the [xBestIndex] +** method of a [virtual table]. This function returns a pointer to a string +** that is the name of the appropriate collation sequence to use for text +** comparisons on the constraint identified by its arguments. +** +** The first argument must be the pointer to the [sqlite3_index_info] object +** that is the first parameter to the xBestIndex() method. The second argument +** must be an index into the aConstraint[] array belonging to the +** sqlite3_index_info structure passed to xBestIndex. +** +** Important: +** The first parameter must be the same pointer that is passed into the +** xBestMethod() method. The first parameter may not be a pointer to a +** different [sqlite3_index_info] object, even an exact copy. +** +** The return value is computed as follows: +** +**
          +**
        1. If the constraint comes from a WHERE clause expression that contains +** a [COLLATE operator], then the name of the collation specified by +** that COLLATE operator is returned. +**

        2. If there is no COLLATE operator, but the column that is the subject +** of the constraint specifies an alternative collating sequence via +** a [COLLATE clause] on the column definition within the CREATE TABLE +** statement that was passed into [sqlite3_declare_vtab()], then the +** name of that alternative collating sequence is returned. +**

        3. Otherwise, "BINARY" is returned. +**

        +*/ +SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); + +/* +** CAPI3REF: Determine if a virtual table query is DISTINCT +** METHOD: sqlite3_index_info +** +** This API may only be used from within an [xBestIndex|xBestIndex method] +** of a [virtual table] implementation. The result of calling this +** interface from outside of xBestIndex() is undefined and probably harmful. +** +** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and +** 3. The integer returned by sqlite3_vtab_distinct() +** gives the virtual table additional information about how the query +** planner wants the output to be ordered. As long as the virtual table +** can meet the ordering requirements of the query planner, it may set +** the "orderByConsumed" flag. +** +**
        1. +** ^If the sqlite3_vtab_distinct() interface returns 0, that means +** that the query planner needs the virtual table to return all rows in the +** sort order defined by the "nOrderBy" and "aOrderBy" fields of the +** [sqlite3_index_info] object. This is the default expectation. If the +** virtual table outputs all rows in sorted order, then it is always safe for +** the xBestIndex method to set the "orderByConsumed" flag, regardless of +** the return value from sqlite3_vtab_distinct(). +**

        2. +** ^(If the sqlite3_vtab_distinct() interface returns 1, that means +** that the query planner does not need the rows to be returned in sorted order +** as long as all rows with the same values in all columns identified by the +** "aOrderBy" field are adjacent.)^ This mode is used when the query planner +** is doing a GROUP BY. +**

        3. +** ^(If the sqlite3_vtab_distinct() interface returns 2, that means +** that the query planner does not need the rows returned in any particular +** order, as long as rows with the same values in all "aOrderBy" columns +** are adjacent.)^ ^(Furthermore, only a single row for each particular +** combination of values in the columns identified by the "aOrderBy" field +** needs to be returned.)^ ^It is always ok for two or more rows with the same +** values in all "aOrderBy" columns to be returned, as long as all such rows +** are adjacent. ^The virtual table may, if it chooses, omit extra rows +** that have the same value for all columns identified by "aOrderBy". +** ^However omitting the extra rows is optional. +** This mode is used for a DISTINCT query. +**

        4. +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means +** that the query planner needs only distinct rows but it does need the +** rows to be sorted.)^ ^The virtual table implementation is free to omit +** rows that are identical in all aOrderBy columns, if it wants to, but +** it is not required to omit any rows. This mode is used for queries +** that have both DISTINCT and ORDER BY clauses. +**

        +** +** ^For the purposes of comparing virtual table output values to see if the +** values are same value for sorting purposes, two NULL values are considered +** to be the same. In other words, the comparison operator is "IS" +** (or "IS NOT DISTINCT FROM") and not "==". +** +** If a virtual table implementation is unable to meet the requirements +** specified above, then it must not set the "orderByConsumed" flag in the +** [sqlite3_index_info] object or an incorrect answer may result. +** +** ^A virtual table implementation is always free to return rows in any order +** it wants, as long as the "orderByConsumed" flag is not set. ^When the +** the "orderByConsumed" flag is unset, the query planner will add extra +** [bytecode] to ensure that the final results returned by the SQL query are +** ordered correctly. The use of the "orderByConsumed" flag and the +** sqlite3_vtab_distinct() interface is merely an optimization. ^Careful +** use of the sqlite3_vtab_distinct() interface and the "orderByConsumed" +** flag might help queries against a virtual table to run faster. Being +** overly aggressive and setting the "orderByConsumed" flag when it is not +** valid to do so, on the other hand, might cause SQLite to return incorrect +** results. +*/ +SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*); + +/* +** CAPI3REF: Identify and handle IN constraints in xBestIndex +** +** This interface may only be used from within an +** [xBestIndex|xBestIndex() method] of a [virtual table] implementation. +** The result of invoking this interface from any other context is +** undefined and probably harmful. +** +** ^(A constraint on a virtual table of the form +** "[IN operator|column IN (...)]" is +** communicated to the xBestIndex method as a +** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use +** this constraint, it must set the corresponding +** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under +** the usual mode of handling IN operators, SQLite generates [bytecode] +** that invokes the [xFilter|xFilter() method] once for each value +** on the right-hand side of the IN operator.)^ Thus the virtual table +** only sees a single value from the right-hand side of the IN operator +** at a time. +** +** In some cases, however, it would be advantageous for the virtual +** table to see all values on the right-hand of the IN operator all at +** once. The sqlite3_vtab_in() interfaces facilitates this in two ways: +** +**
          +**
        1. +** ^A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero) +** if and only if the [sqlite3_index_info|P->aConstraint][N] constraint +** is an [IN operator] that can be processed all at once. ^In other words, +** sqlite3_vtab_in() with -1 in the third argument is a mechanism +** by which the virtual table can ask SQLite if all-at-once processing +** of the IN operator is even possible. +** +**

        2. +** ^A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates +** to SQLite that the virtual table does or does not want to process +** the IN operator all-at-once, respectively. ^Thus when the third +** parameter (F) is non-negative, this interface is the mechanism by +** which the virtual table tells SQLite how it wants to process the +** IN operator. +**

        +** +** ^The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times +** within the same xBestIndex method call. ^For any given P,N pair, +** the return value from sqlite3_vtab_in(P,N,F) will always be the same +** within the same xBestIndex call. ^If the interface returns true +** (non-zero), that means that the constraint is an IN operator +** that can be processed all-at-once. ^If the constraint is not an IN +** operator or cannot be processed all-at-once, then the interface returns +** false. +** +** ^(All-at-once processing of the IN operator is selected if both of the +** following conditions are met: +** +**
          +**
        1. The P->aConstraintUsage[N].argvIndex value is set to a positive +** integer. This is how the virtual table tells SQLite that it wants to +** use the N-th constraint. +** +**

        2. The last call to sqlite3_vtab_in(P,N,F) for which F was +** non-negative had F>=1. +**

        )^ +** +** ^If either or both of the conditions above are false, then SQLite uses +** the traditional one-at-a-time processing strategy for the IN constraint. +** ^If both conditions are true, then the argvIndex-th parameter to the +** xFilter method will be an [sqlite3_value] that appears to be NULL, +** but which can be passed to [sqlite3_vtab_in_first()] and +** [sqlite3_vtab_in_next()] to find all values on the right-hand side +** of the IN constraint. +*/ +SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle); + +/* +** CAPI3REF: Find all elements on the right-hand side of an IN constraint. +** +** These interfaces are only useful from within the +** [xFilter|xFilter() method] of a [virtual table] implementation. +** The result of invoking these interfaces from any other context +** is undefined and probably harmful. +** +** The X parameter in a call to sqlite3_vtab_in_first(X,P) or +** sqlite3_vtab_in_next(X,P) must be one of the parameters to the +** xFilter method which invokes these routines, and specifically +** a parameter that was previously selected for all-at-once IN constraint +** processing use the [sqlite3_vtab_in()] interface in the +** [xBestIndex|xBestIndex method]. ^(If the X parameter is not +** an xFilter argument that was selected for all-at-once IN constraint +** processing, then these routines return [SQLITE_MISUSE])^ or perhaps +** exhibit some other undefined or harmful behavior. +** +** ^(Use these routines to access all values on the right-hand side +** of the IN constraint using code like the following: +** +**
        +**    for(rc=sqlite3_vtab_in_first(pList, &pVal);
        +**        rc==SQLITE_OK && pVal
        +**        rc=sqlite3_vtab_in_next(pList, &pVal)
        +**    ){
        +**      // do something with pVal
        +**    }
        +**    if( rc!=SQLITE_OK ){
        +**      // an error has occurred
        +**    }
        +** 
        )^ +** +** ^On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P) +** routines return SQLITE_OK and set *P to point to the first or next value +** on the RHS of the IN constraint. ^If there are no more values on the +** right hand side of the IN constraint, then *P is set to NULL and these +** routines return [SQLITE_DONE]. ^The return value might be +** some other value, such as SQLITE_NOMEM, in the event of a malfunction. +** +** The *ppOut values returned by these routines are only valid until the +** next call to either of these routines or until the end of the xFilter +** method from which these routines were called. If the virtual table +** implementation needs to retain the *ppOut values for longer, it must make +** copies. The *ppOut values are [protected sqlite3_value|protected]. +*/ +SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut); +SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut); + +/* +** CAPI3REF: Constraint values in xBestIndex() +** METHOD: sqlite3_index_info +** +** This API may only be used from within the [xBestIndex|xBestIndex method] +** of a [virtual table] implementation. The result of calling this interface +** from outside of an xBestIndex method are undefined and probably harmful. +** +** ^When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within +** the [xBestIndex] method of a [virtual table] implementation, with P being +** a copy of the [sqlite3_index_info] object pointer passed into xBestIndex and +** J being a 0-based index into P->aConstraint[], then this routine +** attempts to set *V to the value of the right-hand operand of +** that constraint if the right-hand operand is known. ^If the +** right-hand operand is not known, then *V is set to a NULL pointer. +** ^The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if +** and only if *V is set to a value. ^The sqlite3_vtab_rhs_value(P,J,V) +** inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th +** constraint is not available. ^The sqlite3_vtab_rhs_value() interface +** can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if +** something goes wrong. +** +** The sqlite3_vtab_rhs_value() interface is usually only successful if +** the right-hand operand of a constraint is a literal value in the original +** SQL statement. If the right-hand operand is an expression or a reference +** to some other column or a [host parameter], then sqlite3_vtab_rhs_value() +** will probably return [SQLITE_NOTFOUND]. +** +** ^(Some constraints, such as [SQLITE_INDEX_CONSTRAINT_ISNULL] and +** [SQLITE_INDEX_CONSTRAINT_ISNOTNULL], have no right-hand operand. For such +** constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.)^ +** +** ^The [sqlite3_value] object returned in *V is a protected sqlite3_value +** and remains valid for the duration of the xBestIndex method call. +** ^When xBestIndex returns, the sqlite3_value object returned by +** sqlite3_vtab_rhs_value() is automatically deallocated. +** +** The "_rhs_" in the name of this routine is an abbreviation for +** "Right-Hand Side". +*/ +SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal); + +/* +** CAPI3REF: Conflict resolution modes +** KEYWORDS: {conflict resolution mode} +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + +/* +** CAPI3REF: Prepared Statement Scan Status Opcodes +** KEYWORDS: {scanstatus options} +** +** The following constants can be used for the T parameter to the +** [sqlite3_stmt_scanstatus(S,X,T,V)] interface. Each constant designates a +** different metric for sqlite3_stmt_scanstatus() to return. +** +** When the value returned to V is a string, space to hold that string is +** managed by the prepared statement S and will be automatically freed when +** S is finalized. +** +**
        +** [[SQLITE_SCANSTAT_NLOOP]]
        SQLITE_SCANSTAT_NLOOP
        +**
        ^The [sqlite3_int64] variable pointed to by the V parameter will be +** set to the total number of times that the X-th loop has run.
        +** +** [[SQLITE_SCANSTAT_NVISIT]]
        SQLITE_SCANSTAT_NVISIT
        +**
        ^The [sqlite3_int64] variable pointed to by the V parameter will be set +** to the total number of rows examined by all iterations of the X-th loop.
        +** +** [[SQLITE_SCANSTAT_EST]]
        SQLITE_SCANSTAT_EST
        +**
        ^The "double" variable pointed to by the V parameter will be set to the +** query planner's estimate for the average number of rows output from each +** iteration of the X-th loop. If the query planner's estimates was accurate, +** then this value will approximate the quotient NVISIT/NLOOP and the +** product of this value for all prior loops with the same SELECTID will +** be the NLOOP value for the current loop. +** +** [[SQLITE_SCANSTAT_NAME]]
        SQLITE_SCANSTAT_NAME
        +**
        ^The "const char *" variable pointed to by the V parameter will be set +** to a zero-terminated UTF-8 string containing the name of the index or table +** used for the X-th loop. +** +** [[SQLITE_SCANSTAT_EXPLAIN]]
        SQLITE_SCANSTAT_EXPLAIN
        +**
        ^The "const char *" variable pointed to by the V parameter will be set +** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] +** description for the X-th loop. +** +** [[SQLITE_SCANSTAT_SELECTID]]
        SQLITE_SCANSTAT_SELECT
        +**
        ^The "int" variable pointed to by the V parameter will be set to the +** "select-id" for the X-th loop. The select-id identifies which query or +** subquery the loop is part of. The main query has a select-id of zero. +** The select-id is the same value as is output in the first column +** of an [EXPLAIN QUERY PLAN] query. +**
        +*/ +#define SQLITE_SCANSTAT_NLOOP 0 +#define SQLITE_SCANSTAT_NVISIT 1 +#define SQLITE_SCANSTAT_EST 2 +#define SQLITE_SCANSTAT_NAME 3 +#define SQLITE_SCANSTAT_EXPLAIN 4 +#define SQLITE_SCANSTAT_SELECTID 5 + +/* +** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt +** +** This interface returns information about the predicted and measured +** performance for pStmt. Advanced applications can use this +** interface to compare the predicted and the measured performance and +** issue warnings and/or rerun [ANALYZE] if discrepancies are found. +** +** Since this interface is expected to be rarely used, it is only +** available if SQLite is compiled using the [SQLITE_ENABLE_STMT_SCANSTATUS] +** compile-time option. +** +** The "iScanStatusOp" parameter determines which status information to return. +** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior +** of this interface is undefined. +** ^The requested measurement is written into a variable pointed to by +** the "pOut" parameter. +** Parameter "idx" identifies the specific loop to retrieve statistics for. +** Loops are numbered starting from zero. ^If idx is out of range - less than +** zero or greater than or equal to the total number of loops used to implement +** the statement - a non-zero value is returned and the variable that pOut +** points to is unchanged. +** +** ^Statistics might not be available for all loops in all statements. ^In cases +** where there exist loops with no available statistics, this function behaves +** as if the loop did not exist - it returns non-zero and leave the variable +** that pOut points to unchanged. +** +** See also: [sqlite3_stmt_scanstatus_reset()] +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ + void *pOut /* Result written here */ +); + +/* +** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt +** +** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. +** +** This API is only available if the library is built with pre-processor +** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); + +/* +** CAPI3REF: Flush caches to disk mid-transaction +** METHOD: sqlite3 +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** METHOD: sqlite3 +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a database table. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to real database tables; the +** preupdate hook is not invoked for changes to [virtual tables] or to +** system tables like sqlite_sequence or sqlite_stat1. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** +** For an UPDATE or DELETE operation on a [rowid table], the sixth +** parameter passed to the preupdate callback is the initial [rowid] of the +** row being modified or deleted. For an INSERT operation on a rowid table, +** or any operation on a WITHOUT ROWID table, the value of the sixth +** parameter is undefined. For an INSERT or UPDATE on a rowid table the +** seventh parameter is the final rowid value of the row being inserted +** or updated. The value of the seventh parameter passed to the callback +** function is not defined for operations on WITHOUT ROWID tables, or for +** DELETE operations on rowid tables. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** When the [sqlite3_blob_write()] API is used to update a blob column, +** the pre-update hook is invoked with SQLITE_DELETE. This is because the +** in this case the new values are not available. In this case, when a +** callback made with op==SQLITE_DELETE is actuall a write using the +** sqlite3_blob_write() API, the [sqlite3_preupdate_blobwrite()] returns +** the index of the column being written. In other cases, where the +** pre-update hook is being invoked for some other reason, including a +** regular DELETE, sqlite3_preupdate_blobwrite() returns -1. +** +** See also: [sqlite3_update_hook()] +*/ +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_blobwrite(sqlite3 *); +#endif + +/* +** CAPI3REF: Low-level system error code +** METHOD: sqlite3 +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} {sqlite3_snapshot} +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +*/ +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** CONSTRUCTOR: sqlite3_snapshot +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +**
          +**
        • The database handle must not be in [autocommit mode]. +** +**
        • Schema S of [database connection] D must be a [WAL mode] database. +** +**
        • There must not be a write transaction open on schema S of database +** connection D. +** +**
        • One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +**
        +** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** METHOD: sqlite3_snapshot +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface either starts a new read +** transaction or upgrades an existing one for schema S of +** [database connection] D such that the read transaction refers to +** historical [snapshot] P, rather than the most recent change to the +** database. ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK +** on success or an appropriate [error code] if it fails. +** +** ^In order to succeed, the database connection must not be in +** [autocommit mode] when [sqlite3_snapshot_open(D,S,P)] is called. If there +** is already a read transaction open on schema S, then the database handle +** must have no active statements (SELECT statements that have been passed +** to sqlite3_step() but not sqlite3_reset() or sqlite3_finalize()). +** SQLITE_ERROR is returned if either of these conditions is violated, or +** if schema S does not exist, or if the snapshot object is invalid. +** +** ^A call to sqlite3_snapshot_open() will fail to open if the specified +** snapshot has been overwritten by a [checkpoint]. In this case +** SQLITE_ERROR_SNAPSHOT is returned. +** +** If there is already a read transaction open when this function is +** invoked, then the same read transaction remains open (on the same +** database snapshot) if SQLITE_ERROR, SQLITE_BUSY or SQLITE_ERROR_SNAPSHOT +** is returned. If another error code - for example SQLITE_PROTOCOL or an +** SQLITE_IOERR error code - is returned, then the final state of the +** read transaction is undefined. If SQLITE_OK is returned, then the +** read transaction is now open on database snapshot P. +** +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** DESTRUCTOR: sqlite3_snapshot +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** [SQLITE_ENABLE_SNAPSHOT] compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** METHOD: sqlite3_snapshot +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SNAPSHOT] option. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** CAPI3REF: Recover snapshots from a wal file +** METHOD: sqlite3_snapshot +** +** If a [WAL file] remains on disk after all database connections close +** (either through the use of the [SQLITE_FCNTL_PERSIST_WAL] [file control] +** or because the last process to have the database opened exited without +** calling [sqlite3_close()]) and a new connection is subsequently opened +** on that database and [WAL file], the [sqlite3_snapshot_open()] interface +** will only be able to open the last transaction added to the WAL file +** even though the WAL file contains other valid transactions. +** +** This function attempts to scan the WAL file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a WAL mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SNAPSHOT] option. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Serialize a database +** +** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory +** that is a serialization of the S database on [database connection] D. +** If P is not a NULL pointer, then the size of the database in bytes +** is written into *P. +** +** For an ordinary on-disk database file, the serialization is just a +** copy of the disk file. For an in-memory database or a "TEMP" database, +** the serialization is the same sequence of bytes which would be written +** to disk if that database where backed up to disk. +** +** The usual case is that sqlite3_serialize() copies the serialization of +** the database into memory obtained from [sqlite3_malloc64()] and returns +** a pointer to that memory. The caller is responsible for freeing the +** returned value to avoid a memory leak. However, if the F argument +** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations +** are made, and the sqlite3_serialize() function will return a pointer +** to the contiguous memory representation of the database that SQLite +** is currently using for that database, or NULL if the no such contiguous +** memory representation of the database exists. A contiguous memory +** representation of the database will usually only exist if there has +** been a prior call to [sqlite3_deserialize(D,S,...)] with the same +** values of D and S. +** The size of the database is written into *P even if the +** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy +** of the database exists. +** +** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the +** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory +** allocation error occurs. +** +** This interface is omitted if SQLite is compiled with the +** [SQLITE_OMIT_DESERIALIZE] option. +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */ + sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */ + unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_serialize +** +** Zero or more of the following constants can be OR-ed together for +** the F argument to [sqlite3_serialize(D,S,P,F)]. +** +** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return +** a pointer to contiguous in-memory database that it is currently using, +** without making a copy of the database. If SQLite is not currently using +** a contiguous in-memory database, then this option causes +** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be +** using a contiguous in-memory database if it has been initialized by a +** prior call to [sqlite3_deserialize()]. +*/ +#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */ + +/* +** CAPI3REF: Deserialize a database +** +** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the +** [database connection] D to disconnect from database S and then +** reopen S as an in-memory database based on the serialization contained +** in P. The serialized database P is N bytes in size. M is the size of +** the buffer P, which might be larger than N. If M is larger than N, and +** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is +** permitted to add content to the in-memory database as long as the total +** size does not exceed M bytes. +** +** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will +** invoke sqlite3_free() on the serialization buffer when the database +** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then +** SQLite will try to increase the buffer size using sqlite3_realloc64() +** if writes on the database cause it to grow larger than M bytes. +** +** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the +** database is currently in a read transaction or is involved in a backup +** operation. +** +** It is not possible to deserialized into the TEMP database. If the +** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the +** function returns SQLITE_ERROR. +** +** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the +** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then +** [sqlite3_free()] is invoked on argument P prior to returning. +** +** This interface is omitted if SQLite is compiled with the +** [SQLITE_OMIT_DESERIALIZE] option. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_deserialize() +** +** The following are allowed values for 6th argument (the F argument) to +** the [sqlite3_deserialize(D,S,P,N,M,F)] interface. +** +** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization +** in the P argument is held in memory obtained from [sqlite3_malloc64()] +** and that SQLite should take ownership of this memory and automatically +** free it when it has finished using it. Without this flag, the caller +** is responsible for freeing any dynamically allocated memory. +** +** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to +** grow the size of the database using calls to [sqlite3_realloc64()]. This +** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used. +** Without this flag, the deserialized database cannot increase in size beyond +** the number of bytes specified by the M parameter. +** +** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database +** should be treated as read-only. +*/ +#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */ +#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */ +#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */ + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#if 0 +} /* End of the 'extern "C"' block */ +#endif +#endif /* SQLITE3_H */ + +/******** Begin file sqlite3rtree.h *********/ +/* +** 2010 August 30 +** +** 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. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; +typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; + +/* The double-precision datatype used by RTree depends on the +** SQLITE_RTREE_INT_ONLY compile-time option. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 sqlite3_rtree_dbl; +#else + typedef double sqlite3_rtree_dbl; +#endif + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + +/* +** Register a 2nd-generation geometry callback named zScore that can be +** used as part of an R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, + const char *zQueryFunc, + int (*xQueryFunc)(sqlite3_rtree_query_info*), + void *pContext, + void (*xDestructor)(void*) +); + + +/* +** A pointer to a structure of the following type is passed as the +** argument to scored geometry callback registered using +** sqlite3_rtree_query_callback(). +** +** Note that the first 5 fields of this structure are identical to +** sqlite3_rtree_geometry. This structure is a subclass of +** sqlite3_rtree_geometry. +*/ +struct sqlite3_rtree_query_info { + void *pContext; /* pContext from when function registered */ + int nParam; /* Number of function parameters */ + sqlite3_rtree_dbl *aParam; /* value of function parameters */ + void *pUser; /* callback can use this, if desired */ + void (*xDelUser)(void*); /* function to free pUser */ + sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */ + unsigned int *anQueue; /* Number of pending entries in the queue */ + int nCoord; /* Number of coordinates */ + int iLevel; /* Level of current node or entry */ + int mxLevel; /* The largest iLevel value in the tree */ + sqlite3_int64 iRowid; /* Rowid for current entry */ + sqlite3_rtree_dbl rParentScore; /* Score of parent node */ + int eParentWithin; /* Visibility of parent node */ + int eWithin; /* OUT: Visibility */ + sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ +}; + +/* +** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin. +*/ +#define NOT_WITHIN 0 /* Object completely outside of query region */ +#define PARTLY_WITHIN 1 /* Object partially overlaps query region */ +#define FULLY_WITHIN 2 /* Object fully contained within query region */ + + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +** +** An instance of this object is a [session] that can be used to +** record changes to a database. +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +** +** An instance of this object acts as a cursor for iterating +** over the elements of a [changeset] or [patchset]. +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** CONSTRUCTOR: sqlite3_session +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** DESTRUCTOR: sqlite3_session +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); + +/* +** CAPIREF: Conigure a Session Object +** METHOD: sqlite3_session +** +** This method is used to configure a session object after it has been +** created. At present the only valid value for the second parameter is +** [SQLITE_SESSION_OBJCONFIG_SIZE]. +** +** Arguments for sqlite3session_object_config() +** +** The following values may passed as the the 4th parameter to +** sqlite3session_object_config(). +** +**
        SQLITE_SESSION_OBJCONFIG_SIZE
        +** This option is used to set, clear or query the flag that enables +** the [sqlite3session_changeset_size()] API. Because it imposes some +** computational overhead, this API is disabled by default. Argument +** pArg must point to a value of type (int). If the value is initially +** 0, then the sqlite3session_changeset_size() API is disabled. If it +** is greater than 0, then the same API is enabled. Or, if the initial +** value is less than zero, no change is made. In all cases the (int) +** variable is set to 1 if the sqlite3session_changeset_size() API is +** enabled following the current call, or 0 otherwise. +** +** It is an error (SQLITE_MISUSE) to attempt to modify this setting after +** the first table has been attached to the session object. +*/ +SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg); + +/* +*/ +#define SQLITE_SESSION_OBJCONFIG_SIZE 1 + +/* +** CAPI3REF: Enable Or Disable A Session Object +** METHOD: sqlite3_session +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** METHOD: sqlite3_session +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +**
          +**
        • The session object "indirect" flag is set when the change is +** made, or +**
        • The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +**
        +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** METHOD: sqlite3_session +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** +**

        Special sqlite_stat1 Handling

        +** +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** some of the rules above. In SQLite, the schema of sqlite_stat1 is: +**
        +**        CREATE TABLE sqlite_stat1(tbl,idx,stat)
        +**  
        +** +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** are recorded for rows for which (idx IS NULL) is true. However, for such +** rows a zero-length blob (SQL value X'') is stored in the changeset or +** patchset instead of a NULL value. This allows such changesets to be +** manipulated by legacy implementations of sqlite3changeset_invert(), +** concat() and similar. +** +** The sqlite3changeset_apply() function automatically converts the +** zero-length blob back to a NULL value when updating the sqlite_stat1 +** table. However, if the application calls sqlite3changeset_new(), +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** iterator directly (including on a changeset iterator passed to a +** conflict-handler callback) then the X'' value is returned. The application +** must translate X'' to NULL itself if required. +** +** Legacy (older than 3.22.0) versions of the sessions module cannot capture +** changes made to the sqlite_stat1 table. Legacy versions of the +** sqlite3changeset_apply() function silently ignore any modifications to the +** sqlite_stat1 table that are part of a changeset or patchset. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** METHOD: sqlite3_session +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes are not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** METHOD: sqlite3_session +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +**

        Changeset Generation

        +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +**
          +**
        • For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +**
        • For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +**
        +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Return An Upper-limit For The Size Of The Changeset +** METHOD: sqlite3_session +** +** By default, this function always returns 0. For it to return +** a useful result, the sqlite3_session object must have been configured +** to enable this API using sqlite3session_object_config() with the +** SQLITE_SESSION_OBJCONFIG_SIZE verb. +** +** When enabled, this function returns an upper limit, in bytes, for the size +** of the changeset that might be produced if sqlite3session_changeset() were +** called. The final changeset size might be equal to or smaller than the +** size in bytes returned by this function. +*/ +SQLITE_API sqlite3_int64 sqlite3session_changeset_size(sqlite3_session *pSession); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** METHOD: sqlite3_session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +**
          +**
        • Has the same name, +**
        • Has the same set of columns declared in the same order, and +**
        • Has the same PRIMARY KEY definition. +**
        +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +**
          +**
        • For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +**
        • For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +**
        • For each row (primary key) that exists in both tables, but features +** different non-PK values in each, an UPDATE record is added to the +** session. +**
        +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation is successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** METHOD: sqlite3_session +** +** The differences between a patchset and a changeset are that: +** +**
          +**
        • DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +**
        • The original values of any modified fields are omitted from +** UPDATE records. +**
        +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void **ppPatchset /* OUT: Buffer containing patchset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Query for the amount of heap memory used by a session object. +** +** This API returns the total amount of heap memory in bytes currently +** used by the session object passed as the only argument. +*/ +SQLITE_API sqlite3_int64 sqlite3session_memory_used(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** CONSTRUCTOR: sqlite3_changeset_iter +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +**
          +**
        • [sqlite3changeset_next()] +**
        • [sqlite3changeset_op()] +**
        • [sqlite3changeset_new()] +**
        • [sqlite3changeset_old()] +**
        +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +** +** The behavior of sqlite3changeset_start_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter. +** +** Note that the sqlite3changeset_start_v2() API is still experimental +** and therefore subject to change. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); +SQLITE_API int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset, /* Pointer to blob containing changeset */ + int flags /* SESSION_CHANGESETSTART_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_start_v2 +** +** The following flags may passed via the 4th parameter to +** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: +** +**
        SQLITE_CHANGESETAPPLY_INVERT
        +** Invert the changeset while iterating through it. This is equivalent to +** inverting a changeset using sqlite3changeset_invert() before applying it. +** It is an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETSTART_INVERT 0x0002 + + +/* +** CAPI3REF: Advance A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function may only be used with iterators created by the function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** Arguments pOp, pnCol and pzTab may not be NULL. Upon return, three +** outputs are set through these pointers: +** +** *pOp is set to one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], +** depending on the type of change that the iterator currently points to; +** +** *pnCol is set to the number of columns in the table affected by the change; and +** +** *pzTab is set to point to a nul-terminated utf-8 encoded string containing +** the name of the table affected by the current change. The buffer remains +** valid until either sqlite3changeset_next() is called on the iterator +** or until the conflict-handler function returns. +** +** If pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** METHOD: sqlite3_changeset_iter +** +** For each modified table, a changeset includes the following: +** +**
          +**
        • The number of columns in the table, and +**
        • Which of those columns make up the tables PRIMARY KEY. +**
        +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** METHOD: sqlite3_changeset_iter +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +**
        +**   sqlite3changeset_start();
        +**   while( SQLITE_ROW==sqlite3changeset_next() ){
        +**     // Do something with change.
        +**   }
        +**   rc = sqlite3changeset_finalize();
        +**   if( rc!=SQLITE_OK ){
        +**     // An error has occurred
        +**   }
        +** 
        +*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +**
          +**
        • Each DELETE change is changed to an INSERT, and +**
        • Each INSERT change is changed to a DELETE, and +**
        • For each UPDATE change, the old.* and new.* values are exchanged. +**
        +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +SQLITE_API int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +**
        +**   sqlite3_changegroup *pGrp;
        +**   rc = sqlite3_changegroup_new(&pGrp);
        +**   if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA);
        +**   if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB);
        +**   if( rc==SQLITE_OK ){
        +**     rc = sqlite3changegroup_output(pGrp, pnOut, ppOut);
        +**   }else{
        +**     *ppOut = 0;
        +**     *pnOut = 0;
        +**   }
        +** 
        +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +SQLITE_API int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +** +** A changegroup is an object used to combine two or more +** [changesets] or [patchsets] +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** CONSTRUCTOR: sqlite3_changegroup +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +**
          +**
        • It is created using a call to sqlite3changegroup_new(). +** +**
        • Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +**
        • The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +**
        • The object is deleted using a call to sqlite3changegroup_delete(). +**
        +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** METHOD: sqlite3_changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** +** +** +**
        Existing Change New Change Output Change +**
        INSERT INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
        INSERT UPDATE +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +**
        INSERT DELETE +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +**
        UPDATE INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
        UPDATE UPDATE +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +**
        UPDATE DELETE +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +**
        DELETE INSERT +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +**
        DELETE UPDATE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
        DELETE DELETE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
        +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the state +** of the final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** METHOD: sqlite3_changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +** DESTRUCTOR: sqlite3_changegroup +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset or patchset to a database. These functions attempt to +** update the "main" database attached to handle db with the changes found in +** the changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to these functions is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument as the first. If the "filter callback" +** returns zero, then no attempt is made to apply any changes to the table. +** Otherwise, if the return value is non-zero or the xFilter argument to +** is NULL, all changes related to the table are attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +**
          +**
        • The table has the same name as the name recorded in the +** changeset, and +**
        • The table has at least as many columns as recorded in the +** changeset, and +**
        • The table has primary key columns in the same position as +** recorded in the changeset. +**
        +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +**
        +**
        DELETE Changes
        +** For each DELETE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. If the +** database table has more columns than are recorded in the changeset, +** only the values of those non-primary key fields are compared against +** the current database contents - any trailing database table columns +** are ignored. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +**
        INSERT Changes
        +** For each INSERT change, an attempt is made to insert the new row into +** the database. If the changeset row contains fewer fields than the +** database table, the trailing fields are populated with their default +** values. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +**
        UPDATE Changes
        +** For each UPDATE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all modified non-primary key columns also match the values +** stored in the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the modified non-primary key fields contains a value different from an +** original row value stored in the changeset, the conflict-handler function +** is invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +**
        +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the application's conflict +** resolution strategy. +** +** All changes made by these functions are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +** +** If the output parameters (ppRebase) and (pnRebase) are non-NULL and +** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() +** may set (*ppRebase) to point to a "rebase" that may be used with the +** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase) +** is set to the size of the buffer in bytes. It is the responsibility of the +** caller to eventually free any such buffer using sqlite3_free(). The buffer +** is only allocated and populated if one or more conflicts were encountered +** while applying the patchset. See comments surrounding the sqlite3_rebaser +** APIs for further details. +** +** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter. +** +** Note that the sqlite3changeset_apply_v2() API is still experimental +** and therefore subject to change. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase data */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_apply_v2 +** +** The following flags may passed via the 9th parameter to +** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]: +** +**
        +**
        SQLITE_CHANGESETAPPLY_NOSAVEPOINT
        +** Usually, the sessions module encloses all operations performed by +** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The +** SAVEPOINT is committed if the changeset or patchset is successfully +** applied, or rolled back if an error occurs. Specifying this flag +** causes the sessions module to omit this savepoint. In this case, if the +** caller has an open transaction or savepoint when apply_v2() is called, +** it may revert the partially applied changeset by rolling it back. +** +**
        SQLITE_CHANGESETAPPLY_INVERT
        +** Invert the changeset before applying it. This is equivalent to inverting +** a changeset using sqlite3changeset_invert() before applying it. It is +** an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 +#define SQLITE_CHANGESETAPPLY_INVERT 0x0002 + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +**
        +**
        SQLITE_CHANGESET_DATA
        +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +**
        SQLITE_CHANGESET_NOTFOUND
        +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
        SQLITE_CHANGESET_CONFLICT
        +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +**
        SQLITE_CHANGESET_FOREIGN_KEY
        +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +**
        SQLITE_CHANGESET_CONSTRAINT
        +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
        +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +**
        +**
        SQLITE_CHANGESET_OMIT
        +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +**
        SQLITE_CHANGESET_REPLACE
        +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +**
        SQLITE_CHANGESET_ABORT
        +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +**
        +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Rebasing changesets +** EXPERIMENTAL +** +** Suppose there is a site hosting a database in state S0. And that +** modifications are made that move that database to state S1 and a +** changeset recorded (the "local" changeset). Then, a changeset based +** on S0 is received from another site (the "remote" changeset) and +** applied to the database. The database is then in state +** (S1+"remote"), where the exact state depends on any conflict +** resolution decisions (OMIT or REPLACE) made while applying "remote". +** Rebasing a changeset is to update it to take those conflict +** resolution decisions into account, so that the same conflicts +** do not have to be resolved elsewhere in the network. +** +** For example, if both the local and remote changesets contain an +** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)": +** +** local: INSERT INTO t1 VALUES(1, 'v1'); +** remote: INSERT INTO t1 VALUES(1, 'v2'); +** +** and the conflict resolution is REPLACE, then the INSERT change is +** removed from the local changeset (it was overridden). Or, if the +** conflict resolution was "OMIT", then the local changeset is modified +** to instead contain: +** +** UPDATE t1 SET b = 'v2' WHERE a=1; +** +** Changes within the local changeset are rebased as follows: +** +**
        +**
        Local INSERT
        +** This may only conflict with a remote INSERT. If the conflict +** resolution was OMIT, then add an UPDATE change to the rebased +** changeset. Or, if the conflict resolution was REPLACE, add +** nothing to the rebased changeset. +** +**
        Local DELETE
        +** This may conflict with a remote UPDATE or DELETE. In both cases the +** only possible resolution is OMIT. If the remote operation was a +** DELETE, then add no change to the rebased changeset. If the remote +** operation was an UPDATE, then the old.* fields of change are updated +** to reflect the new.* values in the UPDATE. +** +**
        Local UPDATE
        +** This may conflict with a remote UPDATE or DELETE. If it conflicts +** with a DELETE, and the conflict resolution was OMIT, then the update +** is changed into an INSERT. Any undefined values in the new.* record +** from the update change are filled in using the old.* values from +** the conflicting DELETE. Or, if the conflict resolution was REPLACE, +** the UPDATE change is simply omitted from the rebased changeset. +** +** If conflict is with a remote UPDATE and the resolution is OMIT, then +** the old.* values are rebased using the new.* values in the remote +** change. Or, if the resolution is REPLACE, then the change is copied +** into the rebased changeset with updates to columns also updated by +** the conflicting remote UPDATE removed. If this means no columns would +** be updated, the change is omitted. +**
        +** +** A local change may be rebased against multiple remote changes +** simultaneously. If a single key is modified by multiple remote +** changesets, they are combined as follows before the local changeset +** is rebased: +** +**
          +**
        • If there has been one or more REPLACE resolutions on a +** key, it is rebased according to a REPLACE. +** +**
        • If there have been no REPLACE resolutions on a key, then +** the local changeset is rebased according to the most recent +** of the OMIT resolutions. +**
        +** +** Note that conflict resolutions from multiple remote changesets are +** combined on a per-field basis, not per-row. This means that in the +** case of multiple remote UPDATE operations, some fields of a single +** local change may be rebased for REPLACE while others are rebased for +** OMIT. +** +** In order to rebase a local changeset, the remote changeset must first +** be applied to the local database using sqlite3changeset_apply_v2() and +** the buffer of rebase information captured. Then: +** +**
          +**
        1. An sqlite3_rebaser object is created by calling +** sqlite3rebaser_create(). +**
        2. The new object is configured with the rebase buffer obtained from +** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure(). +** If the local changeset is to be rebased against multiple remote +** changesets, then sqlite3rebaser_configure() should be called +** multiple times, in the same order that the multiple +** sqlite3changeset_apply_v2() calls were made. +**
        3. Each local changeset is rebased by calling sqlite3rebaser_rebase(). +**
        4. The sqlite3_rebaser object is deleted by calling +** sqlite3rebaser_delete(). +**
        +*/ +typedef struct sqlite3_rebaser sqlite3_rebaser; + +/* +** CAPI3REF: Create a changeset rebaser object. +** EXPERIMENTAL +** +** Allocate a new changeset rebaser object. If successful, set (*ppNew) to +** point to the new object and return SQLITE_OK. Otherwise, if an error +** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) +** to NULL. +*/ +SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); + +/* +** CAPI3REF: Configure a changeset rebaser object. +** EXPERIMENTAL +** +** Configure the changeset rebaser object to rebase changesets according +** to the conflict resolutions described by buffer pRebase (size nRebase +** bytes), which must have been obtained from a previous call to +** sqlite3changeset_apply_v2(). +*/ +SQLITE_API int sqlite3rebaser_configure( + sqlite3_rebaser*, + int nRebase, const void *pRebase +); + +/* +** CAPI3REF: Rebase a changeset +** EXPERIMENTAL +** +** Argument pIn must point to a buffer containing a changeset nIn bytes +** in size. This function allocates and populates a buffer with a copy +** of the changeset rebased according to the configuration of the +** rebaser object passed as the first argument. If successful, (*ppOut) +** is set to point to the new buffer containing the rebased changeset and +** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the +** responsibility of the caller to eventually free the new buffer using +** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) +** are set to zero and an SQLite error code returned. +*/ +SQLITE_API int sqlite3rebaser_rebase( + sqlite3_rebaser*, + int nIn, const void *pIn, + int *pnOut, void **ppOut +); + +/* +** CAPI3REF: Delete a changeset rebaser object. +** EXPERIMENTAL +** +** Delete the changeset rebaser object and all associated resources. There +** should be one call to this function for each successful invocation +** of sqlite3rebaser_create(). +*/ +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** +** +**
        Streaming functionNon-streaming equivalent
        sqlite3changeset_apply_strm[sqlite3changeset_apply] +**
        sqlite3changeset_apply_strm_v2[sqlite3changeset_apply_v2] +**
        sqlite3changeset_concat_strm[sqlite3changeset_concat] +**
        sqlite3changeset_invert_strm[sqlite3changeset_invert] +**
        sqlite3changeset_start_strm[sqlite3changeset_start] +**
        sqlite3session_changeset_strm[sqlite3session_changeset] +**
        sqlite3session_patchset_strm[sqlite3session_patchset] +**
        +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +**
        +**        int nChangeset,
        +**        void *pChangeset,
        +**  
        +** +** Is replaced by: +** +**
        +**        int (*xInput)(void *pIn, void *pData, int *pnData),
        +**        void *pIn,
        +**  
        +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +**
        +**        int *pnChangeset,
        +**        void **ppChangeset,
        +**  
        +** +** Is replaced by: +** +**
        +**        int (*xOutput)(void *pOut, const void *pData, int nData),
        +**        void *pOut
        +**  
        +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +); +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +); +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3rebaser_rebase_strm( + sqlite3_rebaser *pRebaser, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + +/* +** CAPI3REF: Configure global parameters +** +** The sqlite3session_config() interface is used to make global configuration +** changes to the sessions module in order to tune it to the specific needs +** of the application. +** +** The sqlite3session_config() interface is not threadsafe. If it is invoked +** while any other thread is inside any other sessions method then the +** results are undefined. Furthermore, if it is invoked after any sessions +** related objects have been created, the results are also undefined. +** +** The first argument to the sqlite3session_config() function must be one +** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** interpretation of the (void*) value passed as the second parameter and +** the effect of calling this function depends on the value of the first +** parameter. +** +**
        +**
        SQLITE_SESSION_CONFIG_STRMSIZE
        +** By default, the sessions module streaming interfaces attempt to input +** and output data in approximately 1 KiB chunks. This operand may be used +** to set and query the value of this configuration setting. The pointer +** passed as the second argument must point to a value of type (int). +** If this value is greater than 0, it is used as the new streaming data +** chunk size for both input and output. Before returning, the (int) value +** pointed to by pArg is set to the final value of the streaming interface +** chunk size. +**
        +** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +SQLITE_API int sqlite3session_config(int op, void *pArg); + +/* +** CAPI3REF: Values for sqlite3session_config(). +*/ +#define SQLITE_SESSION_CONFIG_STRMSIZE 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** 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. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#if 0 +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension function's +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +**
        • FTS5_TOKENIZE_DOCUMENT - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +**
        • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +**
        • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +**
        • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +**
        +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +**
        1. By mapping all synonyms to a single token. In this case, using +** the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +**
        2. By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: +** +** +** ... MATCH 'first place' +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** +** ... MATCH '(first OR 1st) place' +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +**
        3. By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do so would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entries in the +** FTS index corresponding to both forms of the first token. +**
        +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +** +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is substituted for "1st" by the tokenizer, then the query: +** +** +** ... MATCH '1s*' +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ + +/************** End of sqlite3.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H) +#include "./config.h" +#define SQLITECONFIG_H 1 +#endif + +/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ +/************** Begin file sqliteLimit.h *************************************/ +/* +** 2007 May 7 +** +** 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 defines various limits of what SQLite can process. +*/ + +/* +** The maximum length of a TEXT or BLOB in bytes. This also +** limits the size of a row in a table or index. +** +** The hard limit is the ability of a 32-bit signed integer +** to count the size: 2^31-1 or 2147483647. +*/ +#ifndef SQLITE_MAX_LENGTH +# define SQLITE_MAX_LENGTH 1000000000 +#endif + +/* +** This is the maximum number of +** +** * Columns in a table +** * Columns in an index +** * Columns in a view +** * Terms in the SET clause of an UPDATE statement +** * Terms in the result set of a SELECT statement +** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. +** * Terms in the VALUES clause of an INSERT statement +** +** The hard upper limit here is 32676. Most database people will +** tell you that in a well-normalized database, you usually should +** not have more than a dozen or so columns in any table. And if +** that is the case, there is no point in having more than a few +** dozen values in any of the other situations described above. +*/ +#ifndef SQLITE_MAX_COLUMN +# define SQLITE_MAX_COLUMN 2000 +#endif + +/* +** The maximum length of a single SQL statement in bytes. +** +** It used to be the case that setting this value to zero would +** turn the limit off. That is no longer true. It is not possible +** to turn this limit off. +*/ +#ifndef SQLITE_MAX_SQL_LENGTH +# define SQLITE_MAX_SQL_LENGTH 1000000000 +#endif + +/* +** The maximum depth of an expression tree. This is limited to +** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might +** want to place more severe limits on the complexity of an +** expression. A value of 0 means that there is no limit. +*/ +#ifndef SQLITE_MAX_EXPR_DEPTH +# define SQLITE_MAX_EXPR_DEPTH 1000 +#endif + +/* +** The maximum number of terms in a compound SELECT statement. +** The code generator for compound SELECT statements does one +** level of recursion for each term. A stack overflow can result +** if the number of terms is too large. In practice, most SQL +** never has more than 3 or 4 terms. Use a value of 0 to disable +** any limit on the number of terms in a compount SELECT. +*/ +#ifndef SQLITE_MAX_COMPOUND_SELECT +# define SQLITE_MAX_COMPOUND_SELECT 500 +#endif + +/* +** The maximum number of opcodes in a VDBE program. +** Not currently enforced. +*/ +#ifndef SQLITE_MAX_VDBE_OP +# define SQLITE_MAX_VDBE_OP 250000000 +#endif + +/* +** The maximum number of arguments to an SQL function. +*/ +#ifndef SQLITE_MAX_FUNCTION_ARG +# define SQLITE_MAX_FUNCTION_ARG 127 +#endif + +/* +** The suggested maximum number of in-memory pages to use for +** the main database table and for temporary tables. +** +** IMPLEMENTATION-OF: R-30185-15359 The default suggested cache size is -2000, +** which means the cache size is limited to 2048000 bytes of memory. +** IMPLEMENTATION-OF: R-48205-43578 The default suggested cache size can be +** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options. +*/ +#ifndef SQLITE_DEFAULT_CACHE_SIZE +# define SQLITE_DEFAULT_CACHE_SIZE -2000 +#endif + +/* +** The default number of frames to accumulate in the log file before +** checkpointing the database in WAL mode. +*/ +#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT +# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 +#endif + +/* +** The maximum number of attached databases. This must be between 0 +** and 125. The upper bound of 125 is because the attached databases are +** counted using a signed 8-bit integer which has a maximum value of 127 +** and we have to allow 2 extra counts for the "main" and "temp" databases. +*/ +#ifndef SQLITE_MAX_ATTACHED +# define SQLITE_MAX_ATTACHED 10 +#endif + + +/* +** The maximum value of a ?nnn wildcard that the parser will accept. +** If the value exceeds 32767 then extra space is required for the Expr +** structure. But otherwise, we believe that the number can be as large +** as a signed 32-bit integer can hold. +*/ +#ifndef SQLITE_MAX_VARIABLE_NUMBER +# define SQLITE_MAX_VARIABLE_NUMBER 32766 +#endif + +/* Maximum page size. The upper bound on this value is 65536. This a limit +** imposed by the use of 16-bit offsets within each page. +** +** Earlier versions of SQLite allowed the user to change this value at +** compile time. This is no longer permitted, on the grounds that it creates +** a library that is technically incompatible with an SQLite library +** compiled with a different limit. If a process operating on a database +** with a page-size of 65536 bytes crashes, then an instance of SQLite +** compiled with the default page-size limit will not be able to rollback +** the aborted transaction. This could lead to database corruption. +*/ +#ifdef SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_PAGE_SIZE +#endif +#define SQLITE_MAX_PAGE_SIZE 65536 + + +/* +** The default size of a database page. +*/ +#ifndef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE 4096 +#endif +#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + +/* +** Ordinarily, if no value is explicitly provided, SQLite creates databases +** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain +** device characteristics (sector-size and atomic write() support), +** SQLite may choose a larger value. This constant is the maximum value +** SQLite will choose on its own. +*/ +#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 +#endif +#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + + +/* +** Maximum number of pages in one database file. +** +** This is really just the default value for the max_page_count pragma. +** This value can be lowered (or raised) at run-time using that the +** max_page_count macro. +*/ +#ifndef SQLITE_MAX_PAGE_COUNT +# define SQLITE_MAX_PAGE_COUNT 1073741823 +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Maximum depth of recursion for triggers. +** +** A value of 1 means that a trigger program will not be able to itself +** fire any triggers. A value of 0 means that no trigger programs at all +** may be executed. +*/ +#ifndef SQLITE_MAX_TRIGGER_DEPTH +# define SQLITE_MAX_TRIGGER_DEPTH 1000 +#endif + +/************** End of sqliteLimit.h *****************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* Disable nuisance warnings on Borland compilers */ +#if defined(__BORLANDC__) +#pragma warn -rch /* unreachable code */ +#pragma warn -ccc /* Condition is always true or false */ +#pragma warn -aus /* Assigned value is never used */ +#pragma warn -csu /* Comparing signed and unsigned */ +#pragma warn -spa /* Suspicious pointer arithmetic */ +#endif + +/* +** WAL mode depends on atomic aligned 32-bit loads and stores in a few +** places. The following macros try to make this explicit. +*/ +#ifndef __has_extension +# define __has_extension(x) 0 /* compatibility with non-clang compilers */ +#endif +#if GCC_VERSION>=4007000 || __has_extension(c_atomic) +# define SQLITE_ATOMIC_INTRINSICS 1 +# define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED) +# define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED) +#else +# define SQLITE_ATOMIC_INTRINSICS 0 +# define AtomicLoad(PTR) (*(PTR)) +# define AtomicStore(PTR,VAL) (*(PTR) = (VAL)) +#endif + +/* +** Include standard header files as necessary +*/ +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* +** The following macros are used to cast pointers to integers and +** integers to pointers. The way you do this varies from one compiler +** to the next, so we have developed the following set of #if statements +** to generate appropriate macros for a wide range of compilers. +** +** The correct "ANSI" way to do this is to use the intptr_t type. +** Unfortunately, that typedef is not available on all compilers, or +** if it is available, it requires an #include of specific headers +** that vary from one machine to the next. +** +** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on +** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). +** So we have to define the macros in different ways depending on the +** compiler. +*/ +#if defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +#elif defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ +# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) +#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ +# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) +# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) +#else /* Generates a warning - but it always works */ +# define SQLITE_INT_TO_PTR(X) ((void*)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(X)) +#endif + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define SQLITE_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define SQLITE_NOINLINE __declspec(noinline) +#else +# define SQLITE_NOINLINE +#endif + +/* +** Make sure that the compiler intrinsics we desire are enabled when +** compiling with an appropriate version of MSVC unless prevented by +** the SQLITE_DISABLE_INTRINSIC define. +*/ +#if !defined(SQLITE_DISABLE_INTRINSIC) +# if defined(_MSC_VER) && _MSC_VER>=1400 +# if !defined(_WIN32_WCE) +# include +# pragma intrinsic(_byteswap_ushort) +# pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_byteswap_uint64) +# pragma intrinsic(_ReadWriteBarrier) +# else +# include +# endif +# endif +#endif + +/* +** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. +** 0 means mutexes are permanently disable and the library is never +** threadsafe. 1 means the library is serialized which is the highest +** level of threadsafety. 2 means the library is multithreaded - multiple +** threads can use SQLite as long as no two threads try to use the same +** database connection at the same time. +** +** Older versions of SQLite used an optional THREADSAFE macro. +** We support that for legacy. +** +** To ensure that the correct value of "THREADSAFE" is reported when querying +** for compile-time options at runtime (e.g. "PRAGMA compile_options"), this +** logic is partially replicated in ctime.c. If it is updated here, it should +** also be updated there. +*/ +#if !defined(SQLITE_THREADSAFE) +# if defined(THREADSAFE) +# define SQLITE_THREADSAFE THREADSAFE +# else +# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ +# endif +#endif + +/* +** Powersafe overwrite is on by default. But can be turned off using +** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. +*/ +#ifndef SQLITE_POWERSAFE_OVERWRITE +# define SQLITE_POWERSAFE_OVERWRITE 1 +#endif + +/* +** EVIDENCE-OF: R-25715-37072 Memory allocation statistics are enabled by +** default unless SQLite is compiled with SQLITE_DEFAULT_MEMSTATUS=0 in +** which case memory allocation statistics are disabled by default. +*/ +#if !defined(SQLITE_DEFAULT_MEMSTATUS) +# define SQLITE_DEFAULT_MEMSTATUS 1 +#endif + +/* +** Exactly one of the following macros must be defined in order to +** specify which memory allocation subsystem to use. +** +** SQLITE_SYSTEM_MALLOC // Use normal system malloc() +** SQLITE_WIN32_MALLOC // Use Win32 native heap API +** SQLITE_ZERO_MALLOC // Use a stub allocator that always fails +** SQLITE_MEMDEBUG // Debugging version of system malloc() +** +** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the +** assert() macro is enabled, each call into the Win32 native heap subsystem +** will cause HeapValidate to be called. If heap validation should fail, an +** assertion will be triggered. +** +** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as +** the default. +*/ +#if defined(SQLITE_SYSTEM_MALLOC) \ + + defined(SQLITE_WIN32_MALLOC) \ + + defined(SQLITE_ZERO_MALLOC) \ + + defined(SQLITE_MEMDEBUG)>1 +# error "Two or more of the following compile-time configuration options\ + are defined but at most one is allowed:\ + SQLITE_SYSTEM_MALLOC, SQLITE_WIN32_MALLOC, SQLITE_MEMDEBUG,\ + SQLITE_ZERO_MALLOC" +#endif +#if defined(SQLITE_SYSTEM_MALLOC) \ + + defined(SQLITE_WIN32_MALLOC) \ + + defined(SQLITE_ZERO_MALLOC) \ + + defined(SQLITE_MEMDEBUG)==0 +# define SQLITE_SYSTEM_MALLOC 1 +#endif + +/* +** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the +** sizes of memory allocations below this value where possible. +*/ +#if !defined(SQLITE_MALLOC_SOFT_LIMIT) +# define SQLITE_MALLOC_SOFT_LIMIT 1024 +#endif + +/* +** We need to define _XOPEN_SOURCE as follows in order to enable +** recursive mutexes on most Unix systems and fchmod() on OpenBSD. +** But _XOPEN_SOURCE define causes problems for Mac OS X, so omit +** it. +*/ +#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) +# define _XOPEN_SOURCE 600 +#endif + +/* +** NDEBUG and SQLITE_DEBUG are opposites. It should always be true that +** defined(NDEBUG)==!defined(SQLITE_DEBUG). If this is not currently true, +** make it true by defining or undefining NDEBUG. +** +** Setting NDEBUG makes the code smaller and faster by disabling the +** assert() statements in the code. So we want the default action +** to be for NDEBUG to be set and NDEBUG to be undefined only if SQLITE_DEBUG +** is set. Thus NDEBUG becomes an opt-in rather than an opt-out +** feature. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif +#if defined(NDEBUG) && defined(SQLITE_DEBUG) +# undef NDEBUG +#endif + +/* +** Enable SQLITE_ENABLE_EXPLAIN_COMMENTS if SQLITE_DEBUG is turned on. +*/ +#if !defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) && defined(SQLITE_DEBUG) +# define SQLITE_ENABLE_EXPLAIN_COMMENTS 1 +#endif + +/* +** The testcase() macro is used to aid in coverage testing. When +** doing coverage testing, the condition inside the argument to +** testcase() must be evaluated both true and false in order to +** get full branch coverage. The testcase() macro is inserted +** to help ensure adequate test coverage in places where simple +** condition/decision coverage is inadequate. For example, testcase() +** can be used to make sure boundary values are tested. For +** bitmask tests, testcase() can be used to make sure each bit +** is significant and used at least once. On switch statements +** where multiple cases go to the same block of code, testcase() +** can insure that all cases are evaluated. +*/ +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) +# ifndef SQLITE_AMALGAMATION + extern unsigned int sqlite3CoverageCounter; +# endif +# define testcase(X) if( X ){ sqlite3CoverageCounter += (unsigned)__LINE__; } +#else +# define testcase(X) +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +/* +** Sometimes we need a small amount of code such as a variable initialization +** to setup for a later assert() statement. We do not want this code to +** appear when assert() is disabled. The following macro is therefore +** used to contain that setup code. The "VVA" acronym stands for +** "Verification, Validation, and Accreditation". In other words, the +** code within VVA_ONLY() will only run during verification processes. +*/ +#ifndef NDEBUG +# define VVA_ONLY(X) X +#else +# define VVA_ONLY(X) +#endif + +/* +** Disable ALWAYS() and NEVER() (make them pass-throughs) for coverage +** and mutation testing +*/ +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif + +/* +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of SQLite to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. +** +** In other words, ALWAYS and NEVER are added for defensive code. +** +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code they specify will +** not be counted as untested code. +*/ +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +/* +** Some conditionals are optimizations only. In other words, if the +** conditionals are replaced with a constant 1 (true) or 0 (false) then +** the correct answer is still obtained, though perhaps not as quickly. +** +** The following macros mark these optimizations conditionals. +*/ +#if defined(SQLITE_MUTATION_TEST) +# define OK_IF_ALWAYS_TRUE(X) (1) +# define OK_IF_ALWAYS_FALSE(X) (0) +#else +# define OK_IF_ALWAYS_TRUE(X) (X) +# define OK_IF_ALWAYS_FALSE(X) (X) +#endif + +/* +** Some malloc failures are only possible if SQLITE_TEST_REALLOC_STRESS is +** defined. We need to defend against those failures when testing with +** SQLITE_TEST_REALLOC_STRESS, but we don't want the unreachable branches +** during a normal build. The following macro can be used to disable tests +** that are always false except when SQLITE_TEST_REALLOC_STRESS is set. +*/ +#if defined(SQLITE_TEST_REALLOC_STRESS) +# define ONLY_IF_REALLOC_STRESS(X) (X) +#elif !defined(NDEBUG) +# define ONLY_IF_REALLOC_STRESS(X) ((X)?(assert(0),1):0) +#else +# define ONLY_IF_REALLOC_STRESS(X) (0) +#endif + +/* +** Declarations used for tracing the operating system interfaces. +*/ +#if defined(SQLITE_FORCE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) + extern int sqlite3OSTrace; +# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X +# define SQLITE_HAVE_OS_TRACE +#else +# define OSTRACE(X) +# undef SQLITE_HAVE_OS_TRACE +#endif + +/* +** Is the sqlite3ErrName() function needed in the build? Currently, +** it is needed by "mutex_w32.c" (when debugging), "os_win.c" (when +** OSTRACE is enabled), and by several "test*.c" files (which are +** compiled using SQLITE_TEST). +*/ +#if defined(SQLITE_HAVE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) +# define SQLITE_NEED_ERR_NAME +#else +# undef SQLITE_NEED_ERR_NAME +#endif + +/* +** SQLITE_ENABLE_EXPLAIN_COMMENTS is incompatible with SQLITE_OMIT_EXPLAIN +*/ +#ifdef SQLITE_OMIT_EXPLAIN +# undef SQLITE_ENABLE_EXPLAIN_COMMENTS +#endif + +/* +** SQLITE_OMIT_VIRTUALTABLE implies SQLITE_OMIT_ALTERTABLE +*/ +#if defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_ALTERTABLE) +# define SQLITE_OMIT_ALTERTABLE +#endif + +/* +** Return true (non-zero) if the input is an integer that is too large +** to fit in 32-bits. This macro is used inside of various testcase() +** macros to verify that we have tested SQLite for large-file support. +*/ +#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) + +/* +** The macro unlikely() is a hint that surrounds a boolean +** expression that is usually false. Macro likely() surrounds +** a boolean expression that is usually true. These hints could, +** in theory, be used by the compiler to generate better code, but +** currently they are just comments for human readers. +*/ +#define likely(X) (X) +#define unlikely(X) (X) + +/************** Include hash.h in the middle of sqliteInt.h ******************/ +/************** Begin file hash.h ********************************************/ +/* +** 2001 September 22 +** +** 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 is the header file for the generic hash-table implementation +** used in SQLite. +*/ +#ifndef SQLITE_HASH_H +#define SQLITE_HASH_H + +/* Forward declarations of structures. */ +typedef struct Hash Hash; +typedef struct HashElem HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, some of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +** +** All elements of the hash table are on a single doubly-linked list. +** Hash.first points to the head of this list. +** +** There are Hash.htsize buckets. Each bucket points to a spot in +** the global doubly-linked list. The contents of the bucket are the +** element pointed to plus the next _ht.count-1 elements in the list. +** +** Hash.htsize and Hash.ht may be zero. In that case lookup is done +** by a linear search of the global list. For small tables, the +** Hash.ht table is never allocated because if there are few elements +** in the table, it is faster to do a linear search than to manage +** the hash table. +*/ +struct Hash { + unsigned int htsize; /* Number of buckets in the hash table */ + unsigned int count; /* Number of entries in this table */ + HashElem *first; /* The first element of the array */ + struct _ht { /* the hash table */ + unsigned int count; /* Number of entries with this hash */ + HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct HashElem { + HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + const char *pKey; /* Key associated with this element */ +}; + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash*); +SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, void *pData); +SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey); +SQLITE_PRIVATE void sqlite3HashClear(Hash*); + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Hash h; +** HashElem *p; +** ... +** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ +** SomeStructure *pData = sqliteHashData(p); +** // do something with pData +** } +*/ +#define sqliteHashFirst(H) ((H)->first) +#define sqliteHashNext(E) ((E)->next) +#define sqliteHashData(E) ((E)->data) +/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ +/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ + +/* +** Number of entries in a hash table +*/ +#define sqliteHashCount(H) ((H)->count) + +#endif /* SQLITE_HASH_H */ + +/************** End of hash.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include parse.h in the middle of sqliteInt.h *****************/ +/************** Begin file parse.h *******************************************/ +#define TK_SEMI 1 +#define TK_EXPLAIN 2 +#define TK_QUERY 3 +#define TK_PLAN 4 +#define TK_BEGIN 5 +#define TK_TRANSACTION 6 +#define TK_DEFERRED 7 +#define TK_IMMEDIATE 8 +#define TK_EXCLUSIVE 9 +#define TK_COMMIT 10 +#define TK_END 11 +#define TK_ROLLBACK 12 +#define TK_SAVEPOINT 13 +#define TK_RELEASE 14 +#define TK_TO 15 +#define TK_TABLE 16 +#define TK_CREATE 17 +#define TK_IF 18 +#define TK_NOT 19 +#define TK_EXISTS 20 +#define TK_TEMP 21 +#define TK_LP 22 +#define TK_RP 23 +#define TK_AS 24 +#define TK_COMMA 25 +#define TK_WITHOUT 26 +#define TK_ABORT 27 +#define TK_ACTION 28 +#define TK_AFTER 29 +#define TK_ANALYZE 30 +#define TK_ASC 31 +#define TK_ATTACH 32 +#define TK_BEFORE 33 +#define TK_BY 34 +#define TK_CASCADE 35 +#define TK_CAST 36 +#define TK_CONFLICT 37 +#define TK_DATABASE 38 +#define TK_DESC 39 +#define TK_DETACH 40 +#define TK_EACH 41 +#define TK_FAIL 42 +#define TK_OR 43 +#define TK_AND 44 +#define TK_IS 45 +#define TK_MATCH 46 +#define TK_LIKE_KW 47 +#define TK_BETWEEN 48 +#define TK_IN 49 +#define TK_ISNULL 50 +#define TK_NOTNULL 51 +#define TK_NE 52 +#define TK_EQ 53 +#define TK_GT 54 +#define TK_LE 55 +#define TK_LT 56 +#define TK_GE 57 +#define TK_ESCAPE 58 +#define TK_ID 59 +#define TK_COLUMNKW 60 +#define TK_DO 61 +#define TK_FOR 62 +#define TK_IGNORE 63 +#define TK_INITIALLY 64 +#define TK_INSTEAD 65 +#define TK_NO 66 +#define TK_KEY 67 +#define TK_OF 68 +#define TK_OFFSET 69 +#define TK_PRAGMA 70 +#define TK_RAISE 71 +#define TK_RECURSIVE 72 +#define TK_REPLACE 73 +#define TK_RESTRICT 74 +#define TK_ROW 75 +#define TK_ROWS 76 +#define TK_TRIGGER 77 +#define TK_VACUUM 78 +#define TK_VIEW 79 +#define TK_VIRTUAL 80 +#define TK_WITH 81 +#define TK_NULLS 82 +#define TK_FIRST 83 +#define TK_LAST 84 +#define TK_CURRENT 85 +#define TK_FOLLOWING 86 +#define TK_PARTITION 87 +#define TK_PRECEDING 88 +#define TK_RANGE 89 +#define TK_UNBOUNDED 90 +#define TK_EXCLUDE 91 +#define TK_GROUPS 92 +#define TK_OTHERS 93 +#define TK_TIES 94 +#define TK_GENERATED 95 +#define TK_ALWAYS 96 +#define TK_MATERIALIZED 97 +#define TK_REINDEX 98 +#define TK_RENAME 99 +#define TK_CTIME_KW 100 +#define TK_ANY 101 +#define TK_BITAND 102 +#define TK_BITOR 103 +#define TK_LSHIFT 104 +#define TK_RSHIFT 105 +#define TK_PLUS 106 +#define TK_MINUS 107 +#define TK_STAR 108 +#define TK_SLASH 109 +#define TK_REM 110 +#define TK_CONCAT 111 +#define TK_PTR 112 +#define TK_COLLATE 113 +#define TK_BITNOT 114 +#define TK_ON 115 +#define TK_INDEXED 116 +#define TK_STRING 117 +#define TK_JOIN_KW 118 +#define TK_CONSTRAINT 119 +#define TK_DEFAULT 120 +#define TK_NULL 121 +#define TK_PRIMARY 122 +#define TK_UNIQUE 123 +#define TK_CHECK 124 +#define TK_REFERENCES 125 +#define TK_AUTOINCR 126 +#define TK_INSERT 127 +#define TK_DELETE 128 +#define TK_UPDATE 129 +#define TK_SET 130 +#define TK_DEFERRABLE 131 +#define TK_FOREIGN 132 +#define TK_DROP 133 +#define TK_UNION 134 +#define TK_ALL 135 +#define TK_EXCEPT 136 +#define TK_INTERSECT 137 +#define TK_SELECT 138 +#define TK_VALUES 139 +#define TK_DISTINCT 140 +#define TK_DOT 141 +#define TK_FROM 142 +#define TK_JOIN 143 +#define TK_USING 144 +#define TK_ORDER 145 +#define TK_GROUP 146 +#define TK_HAVING 147 +#define TK_LIMIT 148 +#define TK_WHERE 149 +#define TK_RETURNING 150 +#define TK_INTO 151 +#define TK_NOTHING 152 +#define TK_FLOAT 153 +#define TK_BLOB 154 +#define TK_INTEGER 155 +#define TK_VARIABLE 156 +#define TK_CASE 157 +#define TK_WHEN 158 +#define TK_THEN 159 +#define TK_ELSE 160 +#define TK_INDEX 161 +#define TK_ALTER 162 +#define TK_ADD 163 +#define TK_WINDOW 164 +#define TK_OVER 165 +#define TK_FILTER 166 +#define TK_COLUMN 167 +#define TK_AGG_FUNCTION 168 +#define TK_AGG_COLUMN 169 +#define TK_TRUEFALSE 170 +#define TK_ISNOT 171 +#define TK_FUNCTION 172 +#define TK_UMINUS 173 +#define TK_UPLUS 174 +#define TK_TRUTH 175 +#define TK_REGISTER 176 +#define TK_VECTOR 177 +#define TK_SELECT_COLUMN 178 +#define TK_IF_NULL_ROW 179 +#define TK_ASTERISK 180 +#define TK_SPAN 181 +#define TK_ERROR 182 +#define TK_SPACE 183 +#define TK_ILLEGAL 184 + +/************** End of parse.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +#include +#include +#include +#include +#include + +/* +** Use a macro to replace memcpy() if compiled with SQLITE_INLINE_MEMCPY. +** This allows better measurements of where memcpy() is used when running +** cachegrind. But this macro version of memcpy() is very slow so it +** should not be used in production. This is a performance measurement +** hack only. +*/ +#ifdef SQLITE_INLINE_MEMCPY +# define memcpy(D,S,N) {char*xxd=(char*)(D);const char*xxs=(const char*)(S);\ + int xxn=(N);while(xxn-->0)*(xxd++)=*(xxs++);} +#endif + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite_int64 +# define float sqlite_int64 +# define LONGDOUBLE_TYPE sqlite_int64 +# ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) +# endif +# define SQLITE_OMIT_DATETIME_FUNCS 1 +# define SQLITE_OMIT_TRACE 1 +# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +# undef SQLITE_HAVE_ISNAN +#endif +#ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (1e99) +#endif + +/* +** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 +** afterward. Having this macro allows us to cause the C compiler +** to omit code used by TEMP tables without messy #ifndef statements. +*/ +#ifdef SQLITE_OMIT_TEMPDB +#define OMIT_TEMPDB 1 +#else +#define OMIT_TEMPDB 0 +#endif + +/* +** The "file format" number is an integer that is incremented whenever +** the VDBE-level file format changes. The following macros define the +** the default file format for new databases and the maximum file format +** that the library can read. +*/ +#define SQLITE_MAX_FILE_FORMAT 4 +#ifndef SQLITE_DEFAULT_FILE_FORMAT +# define SQLITE_DEFAULT_FILE_FORMAT 4 +#endif + +/* +** Determine whether triggers are recursive by default. This can be +** changed at run-time using a pragma. +*/ +#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS +# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 +#endif + +/* +** Provide a default value for SQLITE_TEMP_STORE in case it is not specified +** on the command-line +*/ +#ifndef SQLITE_TEMP_STORE +# define SQLITE_TEMP_STORE 1 +#endif + +/* +** If no value has been provided for SQLITE_MAX_WORKER_THREADS, or if +** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it +** to zero. +*/ +#if SQLITE_TEMP_STORE==3 || SQLITE_THREADSAFE==0 +# undef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS 0 +#endif +#ifndef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS 8 +#endif +#ifndef SQLITE_DEFAULT_WORKER_THREADS +# define SQLITE_DEFAULT_WORKER_THREADS 0 +#endif +#if SQLITE_DEFAULT_WORKER_THREADS>SQLITE_MAX_WORKER_THREADS +# undef SQLITE_MAX_WORKER_THREADS +# define SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_WORKER_THREADS +#endif + +/* +** The default initial allocation for the pagecache when using separate +** pagecaches for each database connection. A positive number is the +** number of pages. A negative number N translations means that a buffer +** of -1024*N bytes is allocated and used for as many pages as it will hold. +** +** The default value of "20" was chosen to minimize the run-time of the +** speedtest1 test program with options: --shrink-memory --reprepare +*/ +#ifndef SQLITE_DEFAULT_PCACHE_INITSZ +# define SQLITE_DEFAULT_PCACHE_INITSZ 20 +#endif + +/* +** Default value for the SQLITE_CONFIG_SORTERREF_SIZE option. +*/ +#ifndef SQLITE_DEFAULT_SORTERREF_SIZE +# define SQLITE_DEFAULT_SORTERREF_SIZE 0x7fffffff +#endif + +/* +** The compile-time options SQLITE_MMAP_READWRITE and +** SQLITE_ENABLE_BATCH_ATOMIC_WRITE are not compatible with one another. +** You must choose one or the other (or neither) but not both. +*/ +#if defined(SQLITE_MMAP_READWRITE) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +#error Cannot use both SQLITE_MMAP_READWRITE and SQLITE_ENABLE_BATCH_ATOMIC_WRITE +#endif + +/* +** GCC does not define the offsetof() macro so we'll have to do it +** ourselves. +*/ +#ifndef offsetof +#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#endif + +/* +** Macros to compute minimum and maximum of two numbers. +*/ +#ifndef MIN +# define MIN(A,B) ((A)<(B)?(A):(B)) +#endif +#ifndef MAX +# define MAX(A,B) ((A)>(B)?(A):(B)) +#endif + +/* +** Swap two objects of type TYPE. +*/ +#define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} + +/* +** Check to see if this machine uses EBCDIC. (Yes, believe it or +** not, there are still machines out there that use EBCDIC.) +*/ +#if 'A' == '\301' +# define SQLITE_EBCDIC 1 +#else +# define SQLITE_ASCII 1 +#endif + +/* +** Integers of known sizes. These typedefs might change for architectures +** where the sizes very. Preprocessor macros are available so that the +** types can be conveniently redefined at compile-type. Like this: +** +** cc '-DUINTPTR_TYPE=long long int' ... +*/ +#ifndef UINT32_TYPE +# ifdef HAVE_UINT32_T +# define UINT32_TYPE uint32_t +# else +# define UINT32_TYPE unsigned int +# endif +#endif +#ifndef UINT16_TYPE +# ifdef HAVE_UINT16_T +# define UINT16_TYPE uint16_t +# else +# define UINT16_TYPE unsigned short int +# endif +#endif +#ifndef INT16_TYPE +# ifdef HAVE_INT16_T +# define INT16_TYPE int16_t +# else +# define INT16_TYPE short int +# endif +#endif +#ifndef UINT8_TYPE +# ifdef HAVE_UINT8_T +# define UINT8_TYPE uint8_t +# else +# define UINT8_TYPE unsigned char +# endif +#endif +#ifndef INT8_TYPE +# ifdef HAVE_INT8_T +# define INT8_TYPE int8_t +# else +# define INT8_TYPE signed char +# endif +#endif +#ifndef LONGDOUBLE_TYPE +# define LONGDOUBLE_TYPE long double +#endif +typedef sqlite_int64 i64; /* 8-byte signed integer */ +typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ +typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ +typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ +typedef INT16_TYPE i16; /* 2-byte signed integer */ +typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ +typedef INT8_TYPE i8; /* 1-byte signed integer */ + +/* +** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value +** that can be stored in a u32 without loss of data. The value +** is 0x00000000ffffffff. But because of quirks of some compilers, we +** have to specify the value in the less intuitive manner shown: +*/ +#define SQLITE_MAX_U32 ((((u64)1)<<32)-1) + +/* +** The datatype used to store estimates of the number of rows in a +** table or index. This is an unsigned integer type. For 99.9% of +** the world, a 32-bit integer is sufficient. But a 64-bit integer +** can be used at compile-time if desired. +*/ +#ifdef SQLITE_64BIT_STATS + typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ +#else + typedef u32 tRowcnt; /* 32-bit is the default */ +#endif + +/* +** Estimated quantities used for query planning are stored as 16-bit +** logarithms. For quantity X, the value stored is 10*log2(X). This +** gives a possible range of values of approximately 1.0e986 to 1e-986. +** But the allowed values are "grainy". Not every value is representable. +** For example, quantities 16 and 17 are both represented by a LogEst +** of 40. However, since LogEst quantities are suppose to be estimates, +** not exact values, this imprecision is not a problem. +** +** "LogEst" is short for "Logarithmic Estimate". +** +** Examples: +** 1 -> 0 20 -> 43 10000 -> 132 +** 2 -> 10 25 -> 46 25000 -> 146 +** 3 -> 16 100 -> 66 1000000 -> 199 +** 4 -> 20 1000 -> 99 1048576 -> 200 +** 10 -> 33 1024 -> 100 4294967296 -> 320 +** +** The LogEst can be negative to indicate fractional values. +** Examples: +** +** 0.5 -> -10 0.1 -> -33 0.0625 -> -40 +*/ +typedef INT16_TYPE LogEst; + +/* +** Set the SQLITE_PTRSIZE macro to the number of bytes in a pointer +*/ +#ifndef SQLITE_PTRSIZE +# if defined(__SIZEOF_POINTER__) +# define SQLITE_PTRSIZE __SIZEOF_POINTER__ +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(_M_ARM) || defined(__arm__) || defined(__x86) || \ + (defined(__APPLE__) && defined(__POWERPC__)) || \ + (defined(__TOS_AIX__) && !defined(__64BIT__)) +# define SQLITE_PTRSIZE 4 +# else +# define SQLITE_PTRSIZE 8 +# endif +#endif + +/* The uptr type is an unsigned integer large enough to hold a pointer +*/ +#if defined(HAVE_STDINT_H) + typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE==4 + typedef u32 uptr; +#else + typedef u64 uptr; +#endif + +/* +** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to +** something between S (inclusive) and E (exclusive). +** +** In other words, S is a buffer and E is a pointer to the first byte after +** the end of buffer S. This macro returns true if P points to something +** contained within the buffer S. +*/ +#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) + + +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSQLITE_BYTEORDER=0 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SQLITE_BYTEORDER +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) +# define SQLITE_BYTEORDER 1234 +# elif defined(sparc) || defined(__ppc__) || \ + defined(__ARMEB__) || defined(__AARCH64EB__) +# define SQLITE_BYTEORDER 4321 +# else +# define SQLITE_BYTEORDER 0 +# endif +#endif +#if SQLITE_BYTEORDER==4321 +# define SQLITE_BIGENDIAN 1 +# define SQLITE_LITTLEENDIAN 0 +# define SQLITE_UTF16NATIVE SQLITE_UTF16BE +#elif SQLITE_BYTEORDER==1234 +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#else +# ifdef SQLITE_AMALGAMATION + const int sqlite3one = 1; +# else + extern const int sqlite3one; +# endif +# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) +# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) +# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) +#endif + +/* +** Constants for the largest and smallest possible 64-bit signed integers. +** These macros are designed to work correctly on both 32-bit and 64-bit +** compilers. +*/ +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define LARGEST_UINT64 (0xffffffff|(((u64)0xffffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +/* +** Round up a number to the next larger multiple of 8. This is used +** to force 8-byte alignment on 64-bit architectures. +** +** ROUND8() always does the rounding, for any argument. +** +** ROUND8P() assumes that the argument is already an integer number of +** pointers in size, and so it is a no-op on systems where the pointer +** size is 8. +*/ +#define ROUND8(x) (((x)+7)&~7) +#if SQLITE_PTRSIZE==8 +# define ROUND8P(x) (x) +#else +# define ROUND8P(x) (((x)+7)&~7) +#endif + +/* +** Round down to the nearest multiple of 8 +*/ +#define ROUNDDOWN8(x) ((x)&~7) + +/* +** Assert that the pointer X is aligned to an 8-byte boundary. This +** macro is used only within assert() to verify that the code gets +** all alignment restrictions correct. +** +** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the +** underlying malloc() implementation might return us 4-byte aligned +** pointers. In that case, only verify 4-byte alignment. +*/ +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) +#else +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) +#endif + +/* +** Disable MMAP on platforms where it is known to not work +*/ +#if defined(__OpenBSD__) || defined(__QNXNTO__) +# undef SQLITE_MAX_MMAP_SIZE +# define SQLITE_MAX_MMAP_SIZE 0 +#endif + +/* +** Default maximum size of memory used by memory-mapped I/O in the VFS +*/ +#ifdef __APPLE__ +# include +#endif +#ifndef SQLITE_MAX_MMAP_SIZE +# if defined(__linux__) \ + || defined(_WIN32) \ + || (defined(__APPLE__) && defined(__MACH__)) \ + || defined(__sun) \ + || defined(__FreeBSD__) \ + || defined(__DragonFly__) +# define SQLITE_MAX_MMAP_SIZE 0x7fff0000 /* 2147418112 */ +# else +# define SQLITE_MAX_MMAP_SIZE 0 +# endif +#endif + +/* +** The default MMAP_SIZE is zero on all platforms. Or, even if a larger +** default MMAP_SIZE is specified at compile-time, make sure that it does +** not exceed the maximum mmap size. +*/ +#ifndef SQLITE_DEFAULT_MMAP_SIZE +# define SQLITE_DEFAULT_MMAP_SIZE 0 +#endif +#if SQLITE_DEFAULT_MMAP_SIZE>SQLITE_MAX_MMAP_SIZE +# undef SQLITE_DEFAULT_MMAP_SIZE +# define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE +#endif + +/* +** TREETRACE_ENABLED will be either 1 or 0 depending on whether or not +** the Abstract Syntax Tree tracing logic is turned on. +*/ +#if !defined(SQLITE_AMALGAMATION) +SQLITE_PRIVATE u32 sqlite3TreeTrace; +#endif +#if defined(SQLITE_DEBUG) \ + && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE) \ + || defined(SQLITE_ENABLE_TREETRACE)) +# define TREETRACE_ENABLED 1 +# define SELECTTRACE(K,P,S,X) \ + if(sqlite3TreeTrace&(K)) \ + sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ + sqlite3DebugPrintf X +#else +# define SELECTTRACE(K,P,S,X) +# define TREETRACE_ENABLED 0 +#endif + +/* +** Macros for "wheretrace" +*/ +SQLITE_PRIVATE u32 sqlite3WhereTrace; +#if defined(SQLITE_DEBUG) \ + && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE)) +# define WHERETRACE(K,X) if(sqlite3WhereTrace&(K)) sqlite3DebugPrintf X +# define WHERETRACE_ENABLED 1 +#else +# define WHERETRACE(K,X) +#endif + + +/* +** An instance of the following structure is used to store the busy-handler +** callback for a given sqlite handle. +** +** The sqlite.busyHandler member of the sqlite struct contains the busy +** callback for the database handle. Each pager opened via the sqlite +** handle is passed a pointer to sqlite.busyHandler. The busy-handler +** callback is currently invoked only from within pager.c. +*/ +typedef struct BusyHandler BusyHandler; +struct BusyHandler { + int (*xBusyHandler)(void *,int); /* The busy callback */ + void *pBusyArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ +}; + +/* +** Name of table that holds the database schema. +** +** The PREFERRED names are used whereever possible. But LEGACY is also +** used for backwards compatibility. +** +** 1. Queries can use either the PREFERRED or the LEGACY names +** 2. The sqlite3_set_authorizer() callback uses the LEGACY name +** 3. The PRAGMA table_list statement uses the PREFERRED name +** +** The LEGACY names are stored in the internal symbol hash table +** in support of (2). Names are translated using sqlite3PreferredTableName() +** for (3). The sqlite3FindTable() function takes care of translating +** names for (1). +** +** Note that "sqlite_temp_schema" can also be called "temp.sqlite_schema". +*/ +#define LEGACY_SCHEMA_TABLE "sqlite_master" +#define LEGACY_TEMP_SCHEMA_TABLE "sqlite_temp_master" +#define PREFERRED_SCHEMA_TABLE "sqlite_schema" +#define PREFERRED_TEMP_SCHEMA_TABLE "sqlite_temp_schema" + + +/* +** The root-page of the schema table. +*/ +#define SCHEMA_ROOT 1 + +/* +** The name of the schema table. The name is different for TEMP. +*/ +#define SCHEMA_TABLE(x) \ + ((!OMIT_TEMPDB)&&(x==1)?LEGACY_TEMP_SCHEMA_TABLE:LEGACY_SCHEMA_TABLE) + +/* +** A convenience macro that returns the number of elements in +** an array. +*/ +#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) + +/* +** Determine if the argument is a power of two +*/ +#define IsPowerOfTwo(X) (((X)&((X)-1))==0) + +/* +** The following value as a destructor means to use sqlite3DbFree(). +** The sqlite3DbFree() routine requires two parameters instead of the +** one parameter that destructors normally want. So we have to introduce +** this magic value that the code knows to handle differently. Any +** pointer will work here as long as it is distinct from SQLITE_STATIC +** and SQLITE_TRANSIENT. +*/ +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear) + +/* +** When SQLITE_OMIT_WSD is defined, it means that the target platform does +** not support Writable Static Data (WSD) such as global and static variables. +** All variables must either be on the stack or dynamically allocated from +** the heap. When WSD is unsupported, the variable declarations scattered +** throughout the SQLite code must become constants instead. The SQLITE_WSD +** macro is used for this purpose. And instead of referencing the variable +** directly, we use its constant as a key to lookup the run-time allocated +** buffer that holds real variable. The constant is also the initializer +** for the run-time allocated buffer. +** +** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL +** macros become no-ops and have zero performance impact. +*/ +#ifdef SQLITE_OMIT_WSD + #define SQLITE_WSD const + #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) + #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) +SQLITE_API int sqlite3_wsd_init(int N, int J); +SQLITE_API void *sqlite3_wsd_find(void *K, int L); +#else + #define SQLITE_WSD + #define GLOBAL(t,v) v + #define sqlite3GlobalConfig sqlite3Config +#endif + +/* +** The following macros are used to suppress compiler warnings and to +** make it clear to human readers when a function parameter is deliberately +** left unused within the body of a function. This usually happens when +** a function is called via a function pointer. For example the +** implementation of an SQL aggregate step callback may not use the +** parameter indicating the number of arguments passed to the aggregate, +** if it knows that this is enforced elsewhere. +** +** When a function parameter is not used at all within the body of a function, +** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. +** However, these macros may also be used to suppress warnings related to +** parameters that may or may not be used depending on compilation options. +** For example those parameters only used in assert() statements. In these +** cases the parameters are named as per the usual conventions. +*/ +#define UNUSED_PARAMETER(x) (void)(x) +#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) + +/* +** Forward references to structures +*/ +typedef struct AggInfo AggInfo; +typedef struct AuthContext AuthContext; +typedef struct AutoincInfo AutoincInfo; +typedef struct Bitvec Bitvec; +typedef struct CollSeq CollSeq; +typedef struct Column Column; +typedef struct Cte Cte; +typedef struct CteUse CteUse; +typedef struct Db Db; +typedef struct DbFixer DbFixer; +typedef struct Schema Schema; +typedef struct Expr Expr; +typedef struct ExprList ExprList; +typedef struct FKey FKey; +typedef struct FuncDestructor FuncDestructor; +typedef struct FuncDef FuncDef; +typedef struct FuncDefHash FuncDefHash; +typedef struct IdList IdList; +typedef struct Index Index; +typedef struct IndexSample IndexSample; +typedef struct KeyClass KeyClass; +typedef struct KeyInfo KeyInfo; +typedef struct Lookaside Lookaside; +typedef struct LookasideSlot LookasideSlot; +typedef struct Module Module; +typedef struct NameContext NameContext; +typedef struct OnOrUsing OnOrUsing; +typedef struct Parse Parse; +typedef struct ParseCleanup ParseCleanup; +typedef struct PreUpdate PreUpdate; +typedef struct PrintfArguments PrintfArguments; +typedef struct RenameToken RenameToken; +typedef struct Returning Returning; +typedef struct RowSet RowSet; +typedef struct Savepoint Savepoint; +typedef struct Select Select; +typedef struct SQLiteThread SQLiteThread; +typedef struct SelectDest SelectDest; +typedef struct SrcItem SrcItem; +typedef struct SrcList SrcList; +typedef struct sqlite3_str StrAccum; /* Internal alias for sqlite3_str */ +typedef struct Table Table; +typedef struct TableLock TableLock; +typedef struct Token Token; +typedef struct TreeView TreeView; +typedef struct Trigger Trigger; +typedef struct TriggerPrg TriggerPrg; +typedef struct TriggerStep TriggerStep; +typedef struct UnpackedRecord UnpackedRecord; +typedef struct Upsert Upsert; +typedef struct VTable VTable; +typedef struct VtabCtx VtabCtx; +typedef struct Walker Walker; +typedef struct WhereInfo WhereInfo; +typedef struct Window Window; +typedef struct With With; + + +/* +** The bitmask datatype defined below is used for various optimizations. +** +** Changing this from a 64-bit to a 32-bit type limits the number of +** tables in a join to 32 instead of 64. But it also reduces the size +** of the library by 738 bytes on ix86. +*/ +#ifdef SQLITE_BITMASK_TYPE + typedef SQLITE_BITMASK_TYPE Bitmask; +#else + typedef u64 Bitmask; +#endif + +/* +** The number of bits in a Bitmask. "BMS" means "BitMask Size". +*/ +#define BMS ((int)(sizeof(Bitmask)*8)) + +/* +** A bit in a Bitmask +*/ +#define MASKBIT(n) (((Bitmask)1)<<(n)) +#define MASKBIT64(n) (((u64)1)<<(n)) +#define MASKBIT32(n) (((unsigned int)1)<<(n)) +#define SMASKBIT32(n) ((n)<=31?((unsigned int)1)<<(n):0) +#define ALLBITS ((Bitmask)-1) + +/* A VList object records a mapping between parameters/variables/wildcards +** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer +** variable number associated with that parameter. See the format description +** on the sqlite3VListAdd() routine for more information. A VList is really +** just an array of integers. +*/ +typedef int VList; + +/* +** Defer sourcing vdbe.h and btree.h until after the "u8" and +** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque +** pointer types (i.e. FuncDef) defined above. +*/ +/************** Include pager.h in the middle of sqliteInt.h *****************/ +/************** Begin file pager.h *******************************************/ +/* +** 2001 September 15 +** +** 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 header file defines the interface that the sqlite page cache +** subsystem. The page cache subsystem reads and writes a file a page +** at a time and provides a journal for rollback. +*/ + +#ifndef SQLITE_PAGER_H +#define SQLITE_PAGER_H + +/* +** Default maximum size for persistent journal files. A negative +** value means no limit. This value may be overridden using the +** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". +*/ +#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 +#endif + +/* +** The type used to represent a page number. The first page in a file +** is called page 1. 0 is used to represent "not a page". +*/ +typedef u32 Pgno; + +/* +** Each open file is managed by a separate instance of the "Pager" structure. +*/ +typedef struct Pager Pager; + +/* +** Handle type for pages. +*/ +typedef struct PgHdr DbPage; + +/* +** Page number PAGER_SJ_PGNO is never used in an SQLite database (it is +** reserved for working around a windows/posix incompatibility). It is +** used in the journal to signify that the remainder of the journal file +** is devoted to storing a super-journal name - there are no more pages to +** roll back. See comments for function writeSuperJournal() in pager.c +** for details. +*/ +#define PAGER_SJ_PGNO_COMPUTED(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) +#define PAGER_SJ_PGNO(x) ((x)->lckPgno) + +/* +** Allowed values for the flags parameter to sqlite3PagerOpen(). +** +** NOTE: These values must match the corresponding BTREE_ values in btree.h. +*/ +#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ +#define PAGER_MEMORY 0x0002 /* In-memory database */ + +/* +** Valid values for the second argument to sqlite3PagerLockingMode(). +*/ +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 + +/* +** Numeric constants that encode the journalmode. +** +** The numeric values encoded here (other than PAGER_JOURNALMODE_QUERY) +** are exposed in the API via the "PRAGMA journal_mode" command and +** therefore cannot be changed without a compatibility break. +*/ +#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ +#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ +#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ +#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ +#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ +#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ +#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ + +/* +** Flags that make up the mask passed to sqlite3PagerGet(). +*/ +#define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */ +#define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */ + +/* +** Flags for sqlite3PagerSetFlags() +** +** Value constraints (enforced via assert()): +** PAGER_FULLFSYNC == SQLITE_FullFSync +** PAGER_CKPT_FULLFSYNC == SQLITE_CkptFullFSync +** PAGER_CACHE_SPILL == SQLITE_CacheSpill +*/ +#define PAGER_SYNCHRONOUS_OFF 0x01 /* PRAGMA synchronous=OFF */ +#define PAGER_SYNCHRONOUS_NORMAL 0x02 /* PRAGMA synchronous=NORMAL */ +#define PAGER_SYNCHRONOUS_FULL 0x03 /* PRAGMA synchronous=FULL */ +#define PAGER_SYNCHRONOUS_EXTRA 0x04 /* PRAGMA synchronous=EXTRA */ +#define PAGER_SYNCHRONOUS_MASK 0x07 /* Mask for four values above */ +#define PAGER_FULLFSYNC 0x08 /* PRAGMA fullfsync=ON */ +#define PAGER_CKPT_FULLFSYNC 0x10 /* PRAGMA checkpoint_fullfsync=ON */ +#define PAGER_CACHESPILL 0x20 /* PRAGMA cache_spill=ON */ +#define PAGER_FLAGS_MASK 0x38 /* All above except SYNCHRONOUS */ + +/* +** The remainder of this file contains the declarations of the functions +** that make up the Pager sub-system API. See source code comments for +** a detailed description of each routine. +*/ + +/* Open and close a Pager connection. */ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs*, + Pager **ppPager, + const char*, + int, + int, + int, + void(*)(DbPage*) +); +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*); +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); + +/* Functions used to configure a Pager object. */ +SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *); +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager*,Pager*); +#endif +/* END SQLCIPHER */ +SQLITE_PRIVATE Pgno sqlite3PagerMaxPageCount(Pager*, Pgno); +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); +SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); +SQLITE_PRIVATE void sqlite3PagerSetFlags(Pager*,unsigned); +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); +SQLITE_PRIVATE int sqlite3PagerFlush(Pager*); + +/* Functions used to obtain and release page references. */ +SQLITE_PRIVATE int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); +SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage*); + +/* Operations on page references. */ +SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); +SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); + +/* Functions used to manage pager transactions and savepoints. */ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); +SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zSuper, int); +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zSuper); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); +SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); +# ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager); +# endif +#endif + +#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT) +SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerWalDb(Pager*, sqlite3*); +#else +# define sqlite3PagerWalWriteLock(y,z) SQLITE_OK +# define sqlite3PagerWalDb(x,y) +#endif + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); +#endif + +#ifdef SQLITE_ENABLE_ZIPVFS +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); +#endif + +/* Functions used to query pager state and configuration. */ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +#endif +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager*, int); +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); + +/* Functions used to truncate the database file. */ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); + +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage*, Pgno, u16); + +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) +void *sqlcipherPagerCodec(DbPage *); +#endif +/* END SQLCIPHER */ + +/* Functions to support testing and debugging. */ +#if !defined(NDEBUG) || defined(SQLITE_TEST) +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); +#endif +#ifdef SQLITE_TEST +SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); +SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); + void disable_simulated_io_errors(void); + void enable_simulated_io_errors(void); +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +#endif /* SQLITE_PAGER_H */ + +/************** End of pager.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include btree.h in the middle of sqliteInt.h *****************/ +/************** Begin file btree.h *******************************************/ +/* +** 2001 September 15 +** +** 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 header file defines the interface that the sqlite B-Tree file +** subsystem. See comments in the source code for a detailed description +** of what each interface routine does. +*/ +#ifndef SQLITE_BTREE_H +#define SQLITE_BTREE_H + +/* TODO: This definition is just included so other modules compile. It +** needs to be revisited. +*/ +#define SQLITE_N_BTREE_META 16 + +/* +** If defined as non-zero, auto-vacuum is enabled by default. Otherwise +** it must be turned on for each database using "PRAGMA auto_vacuum = 1". +*/ +#ifndef SQLITE_DEFAULT_AUTOVACUUM + #define SQLITE_DEFAULT_AUTOVACUUM 0 +#endif + +#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ +#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ +#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ + +/* +** Forward declarations of structure +*/ +typedef struct Btree Btree; +typedef struct BtCursor BtCursor; +typedef struct BtShared BtShared; +typedef struct BtreePayload BtreePayload; + + +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use with this b-tree */ + const char *zFilename, /* Name of database file to open */ + sqlite3 *db, /* Associated database connection */ + Btree **ppBtree, /* Return open Btree* here */ + int flags, /* Flags */ + int vfsFlags /* Flags passed through to VFS open */ +); + +/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the +** following values. +** +** NOTE: These values must match the corresponding PAGER_ values in +** pager.h. +*/ +#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ +#define BTREE_MEMORY 2 /* This is an in-memory DB */ +#define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */ +#define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */ + +SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree*,int); +#if SQLITE_MAX_MMAP_SIZE>0 +SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64); +#endif +SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags(Btree*,unsigned); +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); +SQLITE_PRIVATE Pgno sqlite3BtreeMaxPageCount(Btree*,Pgno); +SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeGetRequestedReserve(Btree*); +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p); +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int,int*); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char*); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int); +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*,int,int); +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, Pgno*, int flags); +SQLITE_PRIVATE int sqlite3BtreeTxnState(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); + +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); +#endif + +/* Savepoints are named, nestable SQL transactions mostly implemented */ +/* in vdbe.c and pager.c See https://sqlite.org/lang_savepoint.html */ +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); + +/* "Checkpoint" only refers to WAL. See https://sqlite.org/wal.html#ckpt */ +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); +#endif + +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); + +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); + +/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR +** of the flags shown below. +** +** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. +** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data +** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With +** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored +** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL +** indices.) +*/ +#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ +#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ + +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, i64*); +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree*, int, int); + +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue); +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); + +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); + +/* +** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta +** should be one of the following values. The integer values are assigned +** to constants so that the offset of the corresponding field in an +** SQLite database header may be found using the following formula: +** +** offset = 36 + (idx * 4) +** +** For example, the free-page-count field is located at byte offset 36 of +** the database file header. The incr-vacuum-flag field is located at +** byte offset 64 (== 36+4*7). +** +** The BTREE_DATA_VERSION value is not really a value stored in the header. +** It is a read-only number computed by the pager. But we merge it with +** the header value access routines since its access pattern is the same. +** Call it a "virtual meta value". +*/ +#define BTREE_FREE_PAGE_COUNT 0 +#define BTREE_SCHEMA_VERSION 1 +#define BTREE_FILE_FORMAT 2 +#define BTREE_DEFAULT_CACHE_SIZE 3 +#define BTREE_LARGEST_ROOT_PAGE 4 +#define BTREE_TEXT_ENCODING 5 +#define BTREE_USER_VERSION 6 +#define BTREE_INCR_VACUUM 7 +#define BTREE_APPLICATION_ID 8 +#define BTREE_DATA_VERSION 15 /* A virtual meta-value */ + +/* +** Kinds of hints that can be passed into the sqlite3BtreeCursorHint() +** interface. +** +** BTREE_HINT_RANGE (arguments: Expr*, Mem*) +** +** The first argument is an Expr* (which is guaranteed to be constant for +** the lifetime of the cursor) that defines constraints on which rows +** might be fetched with this cursor. The Expr* tree may contain +** TK_REGISTER nodes that refer to values stored in the array of registers +** passed as the second parameter. In other words, if Expr.op==TK_REGISTER +** then the value of the node is the value in Mem[pExpr.iTable]. Any +** TK_COLUMN node in the expression tree refers to the Expr.iColumn-th +** column of the b-tree of the cursor. The Expr tree will not contain +** any function calls nor subqueries nor references to b-trees other than +** the cursor being hinted. +** +** The design of the _RANGE hint is aid b-tree implementations that try +** to prefetch content from remote machines - to provide those +** implementations with limits on what needs to be prefetched and thereby +** reduce network bandwidth. +** +** Note that BTREE_HINT_FLAGS with BTREE_BULKLOAD is the only hint used by +** standard SQLite. The other hints are provided for extentions that use +** the SQLite parser and code generator but substitute their own storage +** engine. +*/ +#define BTREE_HINT_RANGE 0 /* Range constraints on queries */ + +/* +** Values that may be OR'd together to form the argument to the +** BTREE_HINT_FLAGS hint for sqlite3BtreeCursorHint(): +** +** The BTREE_BULKLOAD flag is set on index cursors when the index is going +** to be filled with content that is already in sorted order. +** +** The BTREE_SEEK_EQ flag is set on cursors that will get OP_SeekGE or +** OP_SeekLE opcodes for a range search, but where the range of entries +** selected will all have the same key. In other words, the cursor will +** be used only for equality key searches. +** +*/ +#define BTREE_BULKLOAD 0x00000001 /* Used to full index in sorted order */ +#define BTREE_SEEK_EQ 0x00000002 /* EQ seeks only - no range seeks */ + +/* +** Flags passed as the third argument to sqlite3BtreeCursor(). +** +** For read-only cursors the wrFlag argument is always zero. For read-write +** cursors it may be set to either (BTREE_WRCSR|BTREE_FORDELETE) or just +** (BTREE_WRCSR). If the BTREE_FORDELETE bit is set, then the cursor will +** only be used by SQLite for the following: +** +** * to seek to and then delete specific entries, and/or +** +** * to read values that will be used to create keys that other +** BTREE_FORDELETE cursors will seek to and delete. +** +** The BTREE_FORDELETE flag is an optimization hint. It is not used by +** by this, the native b-tree engine of SQLite, but it is available to +** alternative storage engines that might be substituted in place of this +** b-tree system. For alternative storage engines in which a delete of +** the main table row automatically deletes corresponding index rows, +** the FORDELETE flag hint allows those alternative storage engines to +** skip a lot of work. Namely: FORDELETE cursors may treat all SEEK +** and DELETE operations as no-ops, and any READ operation against a +** FORDELETE cursor may return a null row: 0x01 0x00. +*/ +#define BTREE_WRCSR 0x00000004 /* read-write cursor */ +#define BTREE_FORDELETE 0x00000008 /* Cursor is for seek/delete only */ + +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree*, /* BTree containing table to open */ + Pgno iTable, /* Index of root page */ + int wrFlag, /* 1 for writing. 0 for read-only */ + struct KeyInfo*, /* First argument to compare function */ + BtCursor *pCursor /* Space to write cursor structure */ +); +SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void); +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor*, int, ...); +#endif + +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeTableMoveto( + BtCursor*, + i64 intKey, + int bias, + int *pRes +); +SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( + BtCursor*, + UnpackedRecord *pUnKey, + int *pRes +); +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor*, int*); +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); + +/* Allowed flags for sqlite3BtreeDelete() and sqlite3BtreeInsert() */ +#define BTREE_SAVEPOSITION 0x02 /* Leave cursor pointing at NEXT or PREV */ +#define BTREE_AUXDELETE 0x04 /* not the primary delete operation */ +#define BTREE_APPEND 0x08 /* Insert is likely an append */ +#define BTREE_PREFORMAT 0x80 /* Inserted data is a preformated cell */ + +/* An instance of the BtreePayload object describes the content of a single +** entry in either an index or table btree. +** +** Index btrees (used for indexes and also WITHOUT ROWID tables) contain +** an arbitrary key and no data. These btrees have pKey,nKey set to the +** key and the pData,nData,nZero fields are uninitialized. The aMem,nMem +** fields give an array of Mem objects that are a decomposition of the key. +** The nMem field might be zero, indicating that no decomposition is available. +** +** Table btrees (used for rowid tables) contain an integer rowid used as +** the key and passed in the nKey field. The pKey field is zero. +** pData,nData hold the content of the new entry. nZero extra zero bytes +** are appended to the end of the content when constructing the entry. +** The aMem,nMem fields are uninitialized for table btrees. +** +** Field usage summary: +** +** Table BTrees Index Btrees +** +** pKey always NULL encoded key +** nKey the ROWID length of pKey +** pData data not used +** aMem not used decomposed key value +** nMem not used entries in aMem +** nData length of pData not used +** nZero extra zeros after pData not used +** +** This object is used to pass information into sqlite3BtreeInsert(). The +** same information used to be passed as five separate parameters. But placing +** the information into this object helps to keep the interface more +** organized and understandable, and it also helps the resulting code to +** run a little faster by using fewer registers for parameter passing. +*/ +struct BtreePayload { + const void *pKey; /* Key content for indexes. NULL for tables */ + sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */ + const void *pData; /* Data for tables. */ + sqlite3_value *aMem; /* First of nMem value in the unpacked pKey */ + u16 nMem; /* Number of aMem[] value. Might be zero */ + int nData; /* Size of pData. 0 if none. */ + int nZero; /* Extra zero data appended after pData,nData */ +}; + +SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, + int flags, int seekResult); +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags); +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags); +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor*); +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*); +#endif +SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*); + +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(sqlite3*,Btree*,Pgno*aRoot,int nRoot,int,int*); +SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor*); + +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *); +#endif +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor*, unsigned int mask); +SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *pBt); +SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree*); +#else +# define sqlite3BtreeSeekCount(X) 0 +#endif + +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); +#endif +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor*); + +SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3*, BtCursor*, i64*); + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); +SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); +#endif + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); +#endif + +SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor*, BtCursor*, i64); + +/* +** If we are not using shared cache, then there is no need to +** use mutexes to access the BtShared structures. So make the +** Enter and Leave procedures no-ops. +*/ +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnterAll(X) +# define sqlite3BtreeSharable(X) 0 +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeConnectionCount(X) 1 +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); +#ifndef NDEBUG + /* These routines are used inside assert() statements only. */ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); +#endif +#else + +# define sqlite3BtreeLeave(X) +# define sqlite3BtreeLeaveCursor(X) +# define sqlite3BtreeLeaveAll(X) + +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeHoldsAllMutexes(X) 1 +# define sqlite3SchemaMutexHeld(X,Y,Z) 1 +#endif + + +#endif /* SQLITE_BTREE_H */ + +/************** End of btree.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include vdbe.h in the middle of sqliteInt.h ******************/ +/************** Begin file vdbe.h ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Header file for the Virtual DataBase Engine (VDBE) +** +** This header defines the interface to the virtual database engine +** or VDBE. The VDBE implements an abstract machine that runs a +** simple program to access and modify the underlying database. +*/ +#ifndef SQLITE_VDBE_H +#define SQLITE_VDBE_H +/* #include */ + +/* +** A single VDBE is an opaque structure named "Vdbe". Only routines +** in the source file sqliteVdbe.c are allowed to see the insides +** of this structure. +*/ +typedef struct Vdbe Vdbe; + +/* +** The names of the following types declared in vdbeInt.h are required +** for the VdbeOp definition. +*/ +typedef struct sqlite3_value Mem; +typedef struct SubProgram SubProgram; + +/* +** A single instruction of the virtual machine has an opcode +** and as many as three operands. The instruction is recorded +** as an instance of the following structure: +*/ +struct VdbeOp { + u8 opcode; /* What operation to perform */ + signed char p4type; /* One of the P4_xxx constants for p4 */ + u16 p5; /* Fifth parameter is an unsigned 16-bit integer */ + int p1; /* First operand */ + int p2; /* Second parameter (often the jump destination) */ + int p3; /* The third parameter */ + union p4union { /* fourth parameter */ + int i; /* Integer value if p4type==P4_INT32 */ + void *p; /* Generic pointer */ + char *z; /* Pointer to data for string (char array) types */ + i64 *pI64; /* Used when p4type is P4_INT64 */ + double *pReal; /* Used when p4type is P4_REAL */ + FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ + sqlite3_context *pCtx; /* Used when p4type is P4_FUNCCTX */ + CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ + Mem *pMem; /* Used when p4type is P4_MEM */ + VTable *pVtab; /* Used when p4type is P4_VTAB */ + KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ + u32 *ai; /* Used when p4type is P4_INTARRAY */ + SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ + Table *pTab; /* Used when p4type is P4_TABLE */ +#ifdef SQLITE_ENABLE_CURSOR_HINTS + Expr *pExpr; /* Used when p4type is P4_EXPR */ +#endif + } p4; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + char *zComment; /* Comment to improve readability */ +#endif +#ifdef VDBE_PROFILE + u32 cnt; /* Number of times this instruction was executed */ + u64 cycles; /* Total time spent executing this instruction */ +#endif +#ifdef SQLITE_VDBE_COVERAGE + u32 iSrcLine; /* Source-code line that generated this opcode + ** with flags in the upper 8 bits */ +#endif +}; +typedef struct VdbeOp VdbeOp; + + +/* +** A sub-routine used to implement a trigger program. +*/ +struct SubProgram { + VdbeOp *aOp; /* Array of opcodes for sub-program */ + int nOp; /* Elements in aOp[] */ + int nMem; /* Number of memory cells required */ + int nCsr; /* Number of cursors required */ + u8 *aOnce; /* Array of OP_Once flags */ + void *token; /* id that may be used to recursive triggers */ + SubProgram *pNext; /* Next sub-program already visited */ +}; + +/* +** A smaller version of VdbeOp used for the VdbeAddOpList() function because +** it takes up less space. +*/ +struct VdbeOpList { + u8 opcode; /* What operation to perform */ + signed char p1; /* First operand */ + signed char p2; /* Second parameter (often the jump destination) */ + signed char p3; /* Third parameter */ +}; +typedef struct VdbeOpList VdbeOpList; + +/* +** Allowed values of VdbeOp.p4type +*/ +#define P4_NOTUSED 0 /* The P4 parameter is not used */ +#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ +#define P4_STATIC (-1) /* Pointer to a static string */ +#define P4_COLLSEQ (-2) /* P4 is a pointer to a CollSeq structure */ +#define P4_INT32 (-3) /* P4 is a 32-bit signed integer */ +#define P4_SUBPROGRAM (-4) /* P4 is a pointer to a SubProgram structure */ +#define P4_TABLE (-5) /* P4 is a pointer to a Table structure */ +/* Above do not own any resources. Must free those below */ +#define P4_FREE_IF_LE (-6) +#define P4_DYNAMIC (-6) /* Pointer to memory from sqliteMalloc() */ +#define P4_FUNCDEF (-7) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-8) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-9) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-10) /* P4 is a pointer to a Mem* structure */ +#define P4_VTAB (-11) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ +#define P4_INTARRAY (-14) /* P4 is a vector of 32-bit integers */ +#define P4_FUNCCTX (-15) /* P4 is a pointer to an sqlite3_context object */ + +/* Error message codes for OP_Halt */ +#define P5_ConstraintNotNull 1 +#define P5_ConstraintUnique 2 +#define P5_ConstraintCheck 3 +#define P5_ConstraintFK 4 + +/* +** The Vdbe.aColName array contains 5n Mem structures, where n is the +** number of columns of data returned by the statement. +*/ +#define COLNAME_NAME 0 +#define COLNAME_DECLTYPE 1 +#define COLNAME_DATABASE 2 +#define COLNAME_TABLE 3 +#define COLNAME_COLUMN 4 +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#else +# ifdef SQLITE_OMIT_DECLTYPE +# define COLNAME_N 1 /* Store only the name */ +# else +# define COLNAME_N 2 /* Store the name and decltype */ +# endif +#endif + +/* +** The following macro converts a label returned by sqlite3VdbeMakeLabel() +** into an index into the Parse.aLabel[] array that contains the resolved +** address of that label. +*/ +#define ADDR(X) (~(X)) + +/* +** The makefile scans the vdbe.c source file and creates the "opcodes.h" +** header file that defines a number for each opcode used by the VDBE. +*/ +/************** Include opcodes.h in the middle of vdbe.h ********************/ +/************** Begin file opcodes.h *****************************************/ +/* Automatically generated. Do not edit */ +/* See the tool/mkopcodeh.tcl script for details */ +#define OP_Savepoint 0 +#define OP_AutoCommit 1 +#define OP_Transaction 2 +#define OP_Checkpoint 3 +#define OP_JournalMode 4 +#define OP_Vacuum 5 +#define OP_VFilter 6 /* jump, synopsis: iplan=r[P3] zplan='P4' */ +#define OP_VUpdate 7 /* synopsis: data=r[P3@P2] */ +#define OP_Goto 8 /* jump */ +#define OP_Gosub 9 /* jump */ +#define OP_InitCoroutine 10 /* jump */ +#define OP_Yield 11 /* jump */ +#define OP_MustBeInt 12 /* jump */ +#define OP_Jump 13 /* jump */ +#define OP_Once 14 /* jump */ +#define OP_If 15 /* jump */ +#define OP_IfNot 16 /* jump */ +#define OP_IsNullOrType 17 /* jump, synopsis: if typeof(r[P1]) IN (P3,5) goto P2 */ +#define OP_IfNullRow 18 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ +#define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ +#define OP_SeekLT 20 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekLE 21 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGE 22 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGT 23 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IfNotOpen 24 /* jump, synopsis: if( !csr[P1] ) goto P2 */ +#define OP_IfNoHope 25 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NoConflict 26 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NotFound 27 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Found 28 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 29 /* jump, synopsis: intkey=r[P3] */ +#define OP_NotExists 30 /* jump, synopsis: intkey=r[P3] */ +#define OP_Last 31 /* jump */ +#define OP_IfSmaller 32 /* jump */ +#define OP_SorterSort 33 /* jump */ +#define OP_Sort 34 /* jump */ +#define OP_Rewind 35 /* jump */ +#define OP_SorterNext 36 /* jump */ +#define OP_Prev 37 /* jump */ +#define OP_Next 38 /* jump */ +#define OP_IdxLE 39 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGT 40 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxLT 41 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGE 42 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ +#define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ +#define OP_RowSetRead 45 /* jump, synopsis: r[P3]=rowset(P1) */ +#define OP_RowSetTest 46 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 47 /* jump */ +#define OP_FkIfZero 48 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ +#define OP_IfPos 49 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ +#define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ +#define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ +#define OP_Eq 53 /* jump, same as TK_EQ, synopsis: IF r[P3]==r[P1] */ +#define OP_Gt 54 /* jump, same as TK_GT, synopsis: IF r[P3]>r[P1] */ +#define OP_Le 55 /* jump, same as TK_LE, synopsis: IF r[P3]<=r[P1] */ +#define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]=r[P1] */ +#define OP_ElseEq 58 /* jump, same as TK_ESCAPE */ +#define OP_IfNotZero 59 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ +#define OP_DecrJumpZero 60 /* jump, synopsis: if (--r[P1])==0 goto P2 */ +#define OP_IncrVacuum 61 /* jump */ +#define OP_VNext 62 /* jump */ +#define OP_Filter 63 /* jump, synopsis: if key(P3@P4) not in filter(P1) goto P2 */ +#define OP_Init 64 /* jump, synopsis: Start at P2 */ +#define OP_PureFunc 65 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Function 66 /* synopsis: r[P3]=func(r[P2@NP]) */ +#define OP_Return 67 +#define OP_EndCoroutine 68 +#define OP_HaltIfNull 69 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 70 +#define OP_Integer 71 /* synopsis: r[P2]=P1 */ +#define OP_Int64 72 /* synopsis: r[P2]=P4 */ +#define OP_String 73 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_BeginSubrtn 74 /* synopsis: r[P2]=NULL */ +#define OP_Null 75 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 76 /* synopsis: r[P1]=NULL */ +#define OP_Blob 77 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 79 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 80 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 81 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 82 /* synopsis: r[P2]=r[P1] */ +#define OP_FkCheck 83 +#define OP_ResultRow 84 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 85 +#define OP_AddImm 86 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 87 +#define OP_Cast 88 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 89 +#define OP_Compare 90 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 91 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_ZeroOrNull 92 /* synopsis: r[P2] = 0 OR NULL */ +#define OP_Offset 93 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 94 /* synopsis: r[P3]=PX cursor P1 column P2 */ +#define OP_TypeCheck 95 /* synopsis: typecheck(r[P1@P2]) */ +#define OP_Affinity 96 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 97 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 98 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 99 +#define OP_SetCookie 100 +#define OP_ReopenIdx 101 /* synopsis: root=P2 iDb=P3 */ +#define OP_BitAnd 102 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ +#define OP_BitOr 103 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ +#define OP_ShiftLeft 104 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ +#define OP_Add 106 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ +#define OP_Subtract 107 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ +#define OP_Multiply 108 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ +#define OP_Divide 109 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ +#define OP_Remainder 110 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ +#define OP_Concat 111 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ +#define OP_OpenRead 112 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 113 /* synopsis: root=P2 iDb=P3 */ +#define OP_BitNot 114 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ +#define OP_OpenDup 115 +#define OP_OpenAutoindex 116 /* synopsis: nColumn=P2 */ +#define OP_String8 117 /* same as TK_STRING, synopsis: r[P2]='P4' */ +#define OP_OpenEphemeral 118 /* synopsis: nColumn=P2 */ +#define OP_SorterOpen 119 +#define OP_SequenceTest 120 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ +#define OP_OpenPseudo 121 /* synopsis: P3 columns in r[P2] */ +#define OP_Close 122 +#define OP_ColumnsUsed 123 +#define OP_SeekScan 124 /* synopsis: Scan-ahead up to P1 rows */ +#define OP_SeekHit 125 /* synopsis: set P2<=seekHit<=P3 */ +#define OP_Sequence 126 /* synopsis: r[P2]=cursor[P1].ctr++ */ +#define OP_NewRowid 127 /* synopsis: r[P2]=rowid */ +#define OP_Insert 128 /* synopsis: intkey=r[P3] data=r[P2] */ +#define OP_RowCell 129 +#define OP_Delete 130 +#define OP_ResetCount 131 +#define OP_SorterCompare 132 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 133 /* synopsis: r[P2]=data */ +#define OP_RowData 134 /* synopsis: r[P2]=data */ +#define OP_Rowid 135 /* synopsis: r[P2]=PX rowid of P1 */ +#define OP_NullRow 136 +#define OP_SeekEnd 137 +#define OP_IdxInsert 138 /* synopsis: key=r[P2] */ +#define OP_SorterInsert 139 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 140 /* synopsis: key=r[P2@P3] */ +#define OP_DeferredSeek 141 /* synopsis: Move P3 to P1.rowid if needed */ +#define OP_IdxRowid 142 /* synopsis: r[P2]=rowid */ +#define OP_FinishSeek 143 +#define OP_Destroy 144 +#define OP_Clear 145 +#define OP_ResetSorter 146 +#define OP_CreateBtree 147 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ +#define OP_SqlExec 148 +#define OP_ParseSchema 149 +#define OP_LoadAnalysis 150 +#define OP_DropTable 151 +#define OP_DropIndex 152 +#define OP_Real 153 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_DropTrigger 154 +#define OP_IntegrityCk 155 +#define OP_RowSetAdd 156 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 157 +#define OP_FkCounter 158 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 159 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 160 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 161 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 163 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 164 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 165 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 166 +#define OP_CursorLock 167 +#define OP_CursorUnlock 168 +#define OP_TableLock 169 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 170 +#define OP_VCreate 171 +#define OP_VDestroy 172 +#define OP_VOpen 173 +#define OP_VInitIn 174 /* synopsis: r[P2]=ValueList(P1,P3) */ +#define OP_VColumn 175 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 176 +#define OP_Pagecount 177 +#define OP_MaxPgcnt 178 +#define OP_ClrSubtype 179 /* synopsis: r[P1].subtype = 0 */ +#define OP_FilterAdd 180 /* synopsis: filter(P1) += key(P3@P4) */ +#define OP_Trace 181 +#define OP_CursorHint 182 +#define OP_ReleaseReg 183 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 184 +#define OP_Explain 185 +#define OP_Abortable 186 + +/* Properties such as "out2" or "jump" that are specified in +** comments following the "case" for each opcode in the vdbe.c +** are encoded into bitvectors as follows: +*/ +#define OPFLG_JUMP 0x01 /* jump: P2 holds jmp target */ +#define OPFLG_IN1 0x02 /* in1: P1 is an input */ +#define OPFLG_IN2 0x04 /* in2: P2 is an input */ +#define OPFLG_IN3 0x08 /* in3: P3 is an input */ +#define OPFLG_OUT2 0x10 /* out2: P2 is an output */ +#define OPFLG_OUT3 0x20 /* out3: P3 is an output */ +#define OPFLG_INITIALIZER {\ +/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,\ +/* 8 */ 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x03,\ +/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x09, 0x09, 0x09, 0x09,\ +/* 24 */ 0x01, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x01,\ +/* 32 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 40 */ 0x01, 0x01, 0x01, 0x26, 0x26, 0x23, 0x0b, 0x01,\ +/* 48 */ 0x01, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ +/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01,\ +/* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\ +/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,\ +/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02,\ +/* 88 */ 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00,\ +/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x26, 0x26,\ +/* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ +/* 112 */ 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00,\ +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ +/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ +/* 136 */ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00,\ +/* 144 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 152 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\ +/* 160 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,\ +/* 176 */ 0x00, 0x10, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00,\ +/* 184 */ 0x00, 0x00, 0x00,} + +/* The resolve3P2Values() routine is able to run faster if it knows +** the value of the largest JUMP opcode. The smaller the maximum +** JUMP opcode the better, so the mkopcodeh.tcl script that +** generated this include file strives to group all JUMP opcodes +** together near the beginning of the list. +*/ +#define SQLITE_MX_JUMP_OPCODE 64 /* Maximum JUMP opcode */ + +/************** End of opcodes.h *********************************************/ +/************** Continuing where we left off in vdbe.h ***********************/ + +/* +** Additional non-public SQLITE_PREPARE_* flags +*/ +#define SQLITE_PREPARE_SAVESQL 0x80 /* Preserve SQL text */ +#define SQLITE_PREPARE_MASK 0x0f /* Mask of public flags */ + +/* +** Prototypes for the VDBE interface. See comments on the implementation +** for a description of what each of these routines does. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse*); +SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe*,int,const char*); +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe*,int,const char*,...); +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall(Parse*,int,int,int,int,const FuncDef*,int); +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe*,int); +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N); +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p); +#else +# define sqlite3VdbeVerifyNoMallocRequired(A,B) +# define sqlite3VdbeVerifyNoResultRow(A) +#endif +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int); +SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn(Vdbe*,int,int,int); +#else +# define sqlite3VdbeVerifyAbortable(A,B) +# define sqlite3VdbeNoJumpsOutsideSubrtn(A,B,C,D) +#endif +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE void sqlite3VdbeExplain(Parse*,u8,const char*,...); +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse*); +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*); +# define ExplainQueryPlan(P) sqlite3VdbeExplain P +# define ExplainQueryPlanPop(P) sqlite3VdbeExplainPop(P) +# define ExplainQueryPlanParent(P) sqlite3VdbeExplainParent(P) +#else +# define ExplainQueryPlan(P) +# define ExplainQueryPlanPop(P) +# define ExplainQueryPlanParent(P) 0 +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char*,const char*); +#else +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*, int, char*, u16); +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); +SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); +#else +# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) +#endif +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); +SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*); +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); +#endif +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3*,Vdbe*,const char*); +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString(Vdbe*,const char*); +#endif +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); +#ifndef SQLITE_OMIT_TRACE +SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); +#endif +SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); +SQLITE_PRIVATE int sqlite3BlobCompare(const Mem*, const Mem*); + +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(int, const void *, UnpackedRecord *, int); +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); + +typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); + +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); +SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); + +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); +#ifdef SQLITE_ENABLE_BYTECODE_VTAB +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3*); +#endif + +/* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on +** each VDBE opcode. +** +** Use the SQLITE_ENABLE_MODULE_COMMENTS macro to see some extra no-op +** comments in VDBE programs that show key decision points in the code +** generator. +*/ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); +# define VdbeComment(X) sqlite3VdbeComment X +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); +# define VdbeNoopComment(X) sqlite3VdbeNoopComment X +# ifdef SQLITE_ENABLE_MODULE_COMMENTS +# define VdbeModuleComment(X) sqlite3VdbeNoopComment X +# else +# define VdbeModuleComment(X) +# endif +#else +# define VdbeComment(X) +# define VdbeNoopComment(X) +# define VdbeModuleComment(X) +#endif + +/* +** The VdbeCoverage macros are used to set a coverage testing point +** for VDBE branch instructions. The coverage testing points are line +** numbers in the sqlite3.c source file. VDBE branch coverage testing +** only works with an amalagmation build. That's ok since a VDBE branch +** coverage build designed for testing the test suite only. No application +** should ever ship with VDBE branch coverage measuring turned on. +** +** VdbeCoverage(v) // Mark the previously coded instruction +** // as a branch +** +** VdbeCoverageIf(v, conditional) // Mark previous if conditional true +** +** VdbeCoverageAlwaysTaken(v) // Previous branch is always taken +** +** VdbeCoverageNeverTaken(v) // Previous branch is never taken +** +** VdbeCoverageNeverNull(v) // Previous three-way branch is only +** // taken on the first two ways. The +** // NULL option is not possible +** +** VdbeCoverageEqNe(v) // Previous OP_Jump is only interested +** // in distingishing equal and not-equal. +** +** Every VDBE branch operation must be tagged with one of the macros above. +** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and +** -DSQLITE_DEBUG then an ALWAYS() will fail in the vdbeTakeBranch() +** routine in vdbe.c, alerting the developer to the missed tag. +** +** During testing, the test application will invoke +** sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE,...) to set a callback +** routine that is invoked as each bytecode branch is taken. The callback +** contains the sqlite3.c source line number ov the VdbeCoverage macro and +** flags to indicate whether or not the branch was taken. The test application +** is responsible for keeping track of this and reporting byte-code branches +** that are never taken. +** +** See the VdbeBranchTaken() macro and vdbeTakeBranch() function in the +** vdbe.c source file for additional information. +*/ +#ifdef SQLITE_VDBE_COVERAGE +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe*,int); +# define VdbeCoverage(v) sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageIf(v,x) if(x)sqlite3VdbeSetLineNumber(v,__LINE__) +# define VdbeCoverageAlwaysTaken(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x5000000); +# define VdbeCoverageNeverTaken(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x6000000); +# define VdbeCoverageNeverNull(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000); +# define VdbeCoverageNeverNullIf(v,x) \ + if(x)sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000); +# define VdbeCoverageEqNe(v) \ + sqlite3VdbeSetLineNumber(v,__LINE__|0x8000000); +# define VDBE_OFFSET_LINENO(x) (__LINE__+x) +#else +# define VdbeCoverage(v) +# define VdbeCoverageIf(v,x) +# define VdbeCoverageAlwaysTaken(v) +# define VdbeCoverageNeverTaken(v) +# define VdbeCoverageNeverNull(v) +# define VdbeCoverageNeverNullIf(v,x) +# define VdbeCoverageEqNe(v) +# define VDBE_OFFSET_LINENO(x) 0 +#endif + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*); +#else +# define sqlite3VdbeScanStatus(a,b,c,d,e) +#endif + +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) +SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, VdbeOp*); +#endif + +#endif /* SQLITE_VDBE_H */ + +/************** End of vdbe.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pcache.h in the middle of sqliteInt.h ****************/ +/************** Begin file pcache.h ******************************************/ +/* +** 2008 August 05 +** +** 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 header file defines the interface that the sqlite page cache +** subsystem. +*/ + +#ifndef _PCACHE_H_ + +typedef struct PgHdr PgHdr; +typedef struct PCache PCache; + +/* +** Every page in the cache is controlled by an instance of the following +** structure. +*/ +struct PgHdr { + sqlite3_pcache_page *pPage; /* Pcache object page handle */ + void *pData; /* Page data */ + void *pExtra; /* Extra content */ + PCache *pCache; /* PRIVATE: Cache that owns this page */ + PgHdr *pDirty; /* Transient list of dirty sorted by pgno */ + Pager *pPager; /* The pager this page is part of */ + Pgno pgno; /* Page number for this page */ +#ifdef SQLITE_CHECK_PAGES + u32 pageHash; /* Hash of page content */ +#endif + u16 flags; /* PGHDR flags defined below */ + + /********************************************************************** + ** Elements above, except pCache, are public. All that follow are + ** private to pcache.c and should not be accessed by other modules. + ** pCache is grouped with the public elements for efficiency. + */ + i16 nRef; /* Number of users of this page */ + PgHdr *pDirtyNext; /* Next element in list of dirty pages */ + PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ + /* NB: pDirtyNext and pDirtyPrev are undefined if the + ** PgHdr object is not dirty */ +}; + +/* Bit values for PgHdr.flags */ +#define PGHDR_CLEAN 0x001 /* Page not on the PCache.pDirty list */ +#define PGHDR_DIRTY 0x002 /* Page is on the PCache.pDirty list */ +#define PGHDR_WRITEABLE 0x004 /* Journaled and ready to modify */ +#define PGHDR_NEED_SYNC 0x008 /* Fsync the rollback journal before + ** writing this page to the database */ +#define PGHDR_DONT_WRITE 0x010 /* Do not write content to disk */ +#define PGHDR_MMAP 0x020 /* This is an mmap page object */ + +#define PGHDR_WAL_APPEND 0x040 /* Appended to wal file */ + +/* Initialize and shutdown the page cache subsystem */ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void); +SQLITE_PRIVATE void sqlite3PcacheShutdown(void); + +/* Page cache buffer management: +** These routines implement SQLITE_CONFIG_PAGECACHE. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); + +/* Create a new pager cache. +** Under memory stress, invoke xStress to try to make pages clean. +** Only clean and unpinned pages can be reclaimed. +*/ +SQLITE_PRIVATE int sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *pToInit /* Preallocated space for the PCache */ +); + +/* Modify the page-size after the cache has been created. */ +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *, int); + +/* Return the size in bytes of a PCache object. Used to preallocate +** storage space. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void); + +/* One release per successful fetch. Page is pinned until released. +** Reference counted. +*/ +SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch(PCache*, Pgno, int createFlag); +SQLITE_PRIVATE int sqlite3PcacheFetchStress(PCache*, Pgno, sqlite3_pcache_page**); +SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish(PCache*, Pgno, sqlite3_pcache_page *pPage); +SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); + +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache*); + +/* Change a page number. Used by incr-vacuum. */ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); + +/* Remove all pages with pgno>x. Reset the cache if x==0 */ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); + +/* Get a list of all dirty pages in the cache, sorted by page number */ +SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); + +/* Reset and close the cache object */ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); + +/* Clear flags from pages of the page cache */ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); + +/* Discard the contents of the cache */ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); + +/* Return the total number of outstanding page references */ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); + +/* Increment the reference count of an existing page */ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); + +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); + +/* Return the total number of pages stored in the cache */ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* Iterate through all dirty pages currently stored in the cache. This +** interface is only available if SQLITE_CHECK_PAGES is defined when the +** library is built. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); +#endif + +#if defined(SQLITE_DEBUG) +/* Check invariants on a PgHdr object */ +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr*); +#endif + +/* Set and get the suggested cache-size for the specified pager-cache. +** +** If no global maximum is configured, then the system attempts to limit +** the total number of pages cached by purgeable pager-caches to the sum +** of the suggested cache-sizes. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); +#endif + +/* Set or get the suggested spill-size for the specified pager-cache. +** +** The spill-size is the minimum number of pages in cache before the cache +** will attempt to spill dirty pages by calling xStress. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *, int); + +/* Free up as much memory as possible from the page cache */ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* Try to return memory used by the pcache module to the main memory heap */ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); +#endif + +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); + +/* Return the header size */ +SQLITE_PRIVATE int sqlite3HeaderSizePcache(void); +SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); + +/* Number of dirty pages as a percentage of the configured cache size */ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*); + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); +#endif + +#endif /* _PCACHE_H_ */ + +/************** End of pcache.h **********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include os.h in the middle of sqliteInt.h ********************/ +/************** Begin file os.h **********************************************/ +/* +** 2001 September 16 +** +** 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 header file (together with is companion C source-code file +** "os.c") attempt to abstract the underlying operating system so that +** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. +*/ +#ifndef _SQLITE_OS_H_ +#define _SQLITE_OS_H_ + +/* +** Attempt to automatically detect the operating system and setup the +** necessary pre-processor macros for it. +*/ +/************** Include os_setup.h in the middle of os.h *********************/ +/************** Begin file os_setup.h ****************************************/ +/* +** 2013 November 25 +** +** 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 contains pre-processor directives related to operating system +** detection and/or setup. +*/ +#ifndef SQLITE_OS_SETUP_H +#define SQLITE_OS_SETUP_H + +/* +** Figure out if we are dealing with Unix, Windows, or some other operating +** system. +** +** After the following block of preprocess macros, all of SQLITE_OS_UNIX, +** SQLITE_OS_WIN, and SQLITE_OS_OTHER will defined to either 1 or 0. One of +** the three will be 1. The other two will be 0. +*/ +#if defined(SQLITE_OS_OTHER) +# if SQLITE_OS_OTHER==1 +# undef SQLITE_OS_UNIX +# define SQLITE_OS_UNIX 0 +# undef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# else +# undef SQLITE_OS_OTHER +# endif +#endif +#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) +# define SQLITE_OS_OTHER 0 +# ifndef SQLITE_OS_WIN +# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ + defined(__MINGW32__) || defined(__BORLANDC__) +# define SQLITE_OS_WIN 1 +# define SQLITE_OS_UNIX 0 +# else +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 1 +# endif +# else +# define SQLITE_OS_UNIX 0 +# endif +#else +# ifndef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# endif +#endif + +#endif /* SQLITE_OS_SETUP_H */ + +/************** End of os_setup.h ********************************************/ +/************** Continuing where we left off in os.h *************************/ + +/* If the SET_FULLSYNC macro is not defined above, then make it +** a no-op +*/ +#ifndef SET_FULLSYNC +# define SET_FULLSYNC(x,y) +#endif + +/* Maximum pathname length. Note: FILENAME_MAX defined by stdio.h +*/ +#ifndef SQLITE_MAX_PATHLEN +# define SQLITE_MAX_PATHLEN FILENAME_MAX +#endif + +/* Maximum number of symlinks that will be resolved while trying to +** expand a filename in xFullPathname() in the VFS. +*/ +#ifndef SQLITE_MAX_SYMLINK +# define SQLITE_MAX_SYMLINK 200 +#endif + +/* +** The default size of a disk sector +*/ +#ifndef SQLITE_DEFAULT_SECTOR_SIZE +# define SQLITE_DEFAULT_SECTOR_SIZE 4096 +#endif + +/* +** Temporary files are named starting with this prefix followed by 16 random +** alphanumeric characters, and no file extension. They are stored in the +** OS's standard temporary file directory, and are deleted prior to exit. +** If sqlite is being embedded in another program, you may wish to change the +** prefix to reflect your program's name, so that if your program exits +** prematurely, old temporary files can be easily identified. This can be done +** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. +** +** 2006-10-31: The default prefix used to be "sqlite_". But then +** Mcafee started using SQLite in their anti-virus product and it +** started putting files with the "sqlite" name in the c:/temp folder. +** This annoyed many windows users. Those users would then do a +** Google search for "sqlite", find the telephone numbers of the +** developers and call to wake them up at night and complain. +** For this reason, the default name prefix is changed to be "sqlite" +** spelled backwards. So the temp files are still identified, but +** anybody smart enough to figure out the code is also likely smart +** enough to know that calling the developer will not help get rid +** of the file. +*/ +#ifndef SQLITE_TEMP_FILE_PREFIX +# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#endif + +/* +** The following values may be passed as the second argument to +** sqlite3OsLock(). The various locks exhibit the following semantics: +** +** SHARED: Any number of processes may hold a SHARED lock simultaneously. +** RESERVED: A single process may hold a RESERVED lock on a file at +** any time. Other processes may hold and obtain new SHARED locks. +** PENDING: A single process may hold a PENDING lock on a file at +** any one time. Existing SHARED locks may persist, but no new +** SHARED locks may be obtained by other processes. +** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. +** +** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a +** process that requests an EXCLUSIVE lock may actually obtain a PENDING +** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to +** sqlite3OsLock(). +*/ +#define NO_LOCK 0 +#define SHARED_LOCK 1 +#define RESERVED_LOCK 2 +#define PENDING_LOCK 3 +#define EXCLUSIVE_LOCK 4 + +/* +** File Locking Notes: (Mostly about windows but also some info for Unix) +** +** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because +** those functions are not available. So we use only LockFile() and +** UnlockFile(). +** +** LockFile() prevents not just writing but also reading by other processes. +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the +** same time, unless they are unlucky and choose the same lock byte. +** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. +** There can only be one writer. A RESERVED_LOCK is obtained by locking +** a single byte of the file that is designated as the reserved lock byte. +** A PENDING_LOCK is obtained by locking a designated byte different from +** the RESERVED_LOCK byte. +** +** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, +** which means we can use reader/writer locks. When reader/writer locks +** are used, the lock is placed on the same range of bytes that is used +** for probabilistic locking in Win95/98/ME. Hence, the locking scheme +** will support two or more Win95 readers or two or more WinNT readers. +** But a single Win95 reader will lock out all WinNT readers and a single +** WinNT reader will lock out all other Win95 readers. +** +** The following #defines specify the range of bytes used for locking. +** SHARED_SIZE is the number of bytes available in the pool from which +** a random byte is selected for a shared lock. The pool of bytes for +** shared locks begins at SHARED_FIRST. +** +** The same locking strategy and +** byte ranges are used for Unix. This leaves open the possibility of having +** clients on win95, winNT, and unix all talking to the same shared file +** and all locking correctly. To do so would require that samba (or whatever +** tool is being used for file sharing) implements locks correctly between +** windows and unix. I'm guessing that isn't likely to happen, but by +** using the same locking range we are at least open to the possibility. +** +** Locking in windows is manditory. For this reason, we cannot store +** actual data in the bytes used for locking. The pager never allocates +** the pages involved in locking therefore. SHARED_SIZE is selected so +** that all locks will fit on a single page even at the minimum page size. +** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE +** is set high so that we don't have to allocate an unused page except +** for very large databases. But one should test the page skipping logic +** by setting PENDING_BYTE low and running the entire regression suite. +** +** Changing the value of PENDING_BYTE results in a subtly incompatible +** file format. Depending on how it is changed, you might not notice +** the incompatibility right away, even running a full regression test. +** The default location of PENDING_BYTE is the first byte past the +** 1GB boundary. +** +*/ +#ifdef SQLITE_OMIT_WSD +# define PENDING_BYTE (0x40000000) +#else +# define PENDING_BYTE sqlite3PendingByte +#endif +#define RESERVED_BYTE (PENDING_BYTE+1) +#define SHARED_FIRST (PENDING_BYTE+2) +#define SHARED_SIZE 510 + +/* +** Wrapper around OS specific sqlite3_os_init() function. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void); + +/* +** Functions for accessing sqlite3_file methods +*/ +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*); +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); +#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); +#endif /* SQLITE_OMIT_WAL */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **); +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *); + + +/* +** Functions for accessing sqlite3_vfs methods +*/ +SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); +SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*); +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); + +/* +** Convenience functions for opening and closing files using +** sqlite3_malloc() to obtain space for the file-handle structure. +*/ +SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); + +#endif /* _SQLITE_OS_H_ */ + +/************** End of os.h **************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include mutex.h in the middle of sqliteInt.h *****************/ +/************** Begin file mutex.h *******************************************/ +/* +** 2007 August 28 +** +** 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 contains the common header for all mutex implementations. +** The sqliteInt.h header #includes this file so that it is available +** to all source files. We break it out in an effort to keep the code +** better organized. +** +** NOTE: source files should *not* #include this header file directly. +** Source files should #include the sqliteInt.h file and let that file +** include this one indirectly. +*/ + + +/* +** Figure out what version of the code to use. The choices are +** +** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The +** mutexes implementation cannot be overridden +** at start-time. +** +** SQLITE_MUTEX_NOOP For single-threaded applications. No +** mutual exclusion is provided. But this +** implementation can be overridden at +** start-time. +** +** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. +** +** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. +*/ +#if !SQLITE_THREADSAFE +# define SQLITE_MUTEX_OMIT +#endif +#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) +# if SQLITE_OS_UNIX +# define SQLITE_MUTEX_PTHREADS +# elif SQLITE_OS_WIN +# define SQLITE_MUTEX_W32 +# else +# define SQLITE_MUTEX_NOOP +# endif +#endif + +#ifdef SQLITE_MUTEX_OMIT +/* +** If this is a no-op implementation, implement everything as macros. +*/ +#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) +#define sqlite3_mutex_free(X) +#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_try(X) SQLITE_OK +#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_held(X) ((void)(X),1) +#define sqlite3_mutex_notheld(X) ((void)(X),1) +#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) +#define sqlite3MutexInit() SQLITE_OK +#define sqlite3MutexEnd() +#define MUTEX_LOGIC(X) +#else +#define MUTEX_LOGIC(X) X +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +#endif /* defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* The SQLITE_EXTRA_DURABLE compile-time option used to set the default +** synchronous setting to EXTRA. It is no longer supported. +*/ +#ifdef SQLITE_EXTRA_DURABLE +# warning Use SQLITE_DEFAULT_SYNCHRONOUS=3 instead of SQLITE_EXTRA_DURABLE +# define SQLITE_DEFAULT_SYNCHRONOUS 3 +#endif + +/* +** Default synchronous levels. +** +** Note that (for historcal reasons) the PAGER_SYNCHRONOUS_* macros differ +** from the SQLITE_DEFAULT_SYNCHRONOUS value by 1. +** +** PAGER_SYNCHRONOUS DEFAULT_SYNCHRONOUS +** OFF 1 0 +** NORMAL 2 1 +** FULL 3 2 +** EXTRA 4 3 +** +** The "PRAGMA synchronous" statement also uses the zero-based numbers. +** In other words, the zero-based numbers are used for all external interfaces +** and the one-based values are used internally. +*/ +#ifndef SQLITE_DEFAULT_SYNCHRONOUS +# define SQLITE_DEFAULT_SYNCHRONOUS 2 +#endif +#ifndef SQLITE_DEFAULT_WAL_SYNCHRONOUS +# define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS +#endif + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zDbSName; /* Name of this database. (schema name, not filename) */ + Btree *pBt; /* The B*Tree structure for this database file */ + u8 safety_level; /* How aggressive at syncing data to disk */ + u8 bSyncSet; /* True if "PRAGMA synchronous=N" has been run */ + Schema *pSchema; /* Pointer to database schema (possibly shared) */ +}; + +/* +** An instance of the following structure stores a database schema. +** +** Most Schema objects are associated with a Btree. The exception is +** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. +** In shared cache mode, a single Schema object can be shared by multiple +** Btrees that refer to the same underlying BtShared object. +** +** Schema objects are automatically deallocated when the last Btree that +** references them is destroyed. The TEMP Schema is manually freed by +** sqlite3_close(). +* +** A thread must be holding a mutex on the corresponding Btree in order +** to access Schema content. This implies that the thread must also be +** holding a mutex on the sqlite3 connection pointer that owns the Btree. +** For a TEMP Schema, only the connection mutex is required. +*/ +struct Schema { + int schema_cookie; /* Database schema version number for this file */ + int iGeneration; /* Generation counter. Incremented with each change */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash fkeyHash; /* All foreign keys by referenced table name */ + Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ + u8 file_format; /* Schema format version for this file */ + u8 enc; /* Text encoding used by this database */ + u16 schemaFlags; /* Flags associated with this schema */ + int cache_size; /* Number of pages to use in the cache */ +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.pSchema->flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->schemaFlags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->schemaFlags&=~(P) + +/* +** Allowed values for the DB.pSchema->flags field. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ +#define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_ResetWanted 0x0008 /* Reset the schema when nSchemaLock==0 */ + +/* +** The number of different kinds of things that can be limited +** using the sqlite3_limit() interface. +*/ +#define SQLITE_N_LIMIT (SQLITE_LIMIT_WORKER_THREADS+1) + +/* +** Lookaside malloc is a set of fixed-size buffers that can be used +** to satisfy small transient memory allocation requests for objects +** associated with a particular database connection. The use of +** lookaside malloc provides a significant performance enhancement +** (approx 10%) by avoiding numerous malloc/free requests while parsing +** SQL statements. +** +** The Lookaside structure holds configuration information about the +** lookaside malloc subsystem. Each available memory allocation in +** the lookaside subsystem is stored on a linked list of LookasideSlot +** objects. +** +** Lookaside allocations are only allowed for objects that are associated +** with a particular database connection. Hence, schema information cannot +** be stored in lookaside because in shared cache mode the schema information +** is shared by multiple database connections. Therefore, while parsing +** schema information, the Lookaside.bEnabled flag is cleared so that +** lookaside allocations are not used to construct the schema objects. +** +** New lookaside allocations are only allowed if bDisable==0. When +** bDisable is greater than zero, sz is set to zero which effectively +** disables lookaside without adding a new test for the bDisable flag +** in a performance-critical path. sz should be set by to szTrue whenever +** bDisable changes back to zero. +** +** Lookaside buffers are initially held on the pInit list. As they are +** used and freed, they are added back to the pFree list. New allocations +** come off of pFree first, then pInit as a fallback. This dual-list +** allows use to compute a high-water mark - the maximum number of allocations +** outstanding at any point in the past - by subtracting the number of +** allocations on the pInit list from the total number of allocations. +** +** Enhancement on 2019-12-12: Two-size-lookaside +** The default lookaside configuration is 100 slots of 1200 bytes each. +** The larger slot sizes are important for performance, but they waste +** a lot of space, as most lookaside allocations are less than 128 bytes. +** The two-size-lookaside enhancement breaks up the lookaside allocation +** into two pools: One of 128-byte slots and the other of the default size +** (1200-byte) slots. Allocations are filled from the small-pool first, +** failing over to the full-size pool if that does not work. Thus more +** lookaside slots are available while also using less memory. +** This enhancement can be omitted by compiling with +** SQLITE_OMIT_TWOSIZE_LOOKASIDE. +*/ +struct Lookaside { + u32 bDisable; /* Only operate the lookaside when zero */ + u16 sz; /* Size of each buffer in bytes */ + u16 szTrue; /* True value of sz, even if disabled */ + u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ + u32 nSlot; /* Number of lookaside slots allocated */ + u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ + LookasideSlot *pInit; /* List of buffers not previously used */ + LookasideSlot *pFree; /* List of available buffers */ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + LookasideSlot *pSmallInit; /* List of small buffers not prediously used */ + LookasideSlot *pSmallFree; /* List of available small buffers */ + void *pMiddle; /* First byte past end of full-size buffers and + ** the first byte of LOOKASIDE_SMALL buffers */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + void *pStart; /* First byte of available memory space */ + void *pEnd; /* First byte past end of available space */ +}; +struct LookasideSlot { + LookasideSlot *pNext; /* Next buffer in the list of free buffers */ +}; + +#define DisableLookaside db->lookaside.bDisable++;db->lookaside.sz=0 +#define EnableLookaside db->lookaside.bDisable--;\ + db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue + +/* Size of the smaller allocations in two-size lookside */ +#ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define LOOKASIDE_SMALL 0 +#else +# define LOOKASIDE_SMALL 128 +#endif + +/* +** A hash table for built-in function definitions. (Application-defined +** functions use a regular table table from hash.h.) +** +** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. +** Collisions are on the FuncDef.u.pHash chain. Use the SQLITE_FUNC_HASH() +** macro to compute a hash on the function name. +*/ +#define SQLITE_FUNC_HASH_SZ 23 +struct FuncDefHash { + FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ +}; +#define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ) + +#ifdef SQLITE_USER_AUTHENTICATION +/* +** Information held in the "sqlite3" database connection object and used +** to manage user authentication. +*/ +typedef struct sqlite3_userauth sqlite3_userauth; +struct sqlite3_userauth { + u8 authLevel; /* Current authentication level */ + int nAuthPW; /* Size of the zAuthPW in bytes */ + char *zAuthPW; /* Password used to authenticate */ + char *zAuthUser; /* User name used to authenticate */ +}; + +/* Allowed values for sqlite3_userauth.authLevel */ +#define UAUTH_Unknown 0 /* Authentication not yet checked */ +#define UAUTH_Fail 1 /* User authentication failed */ +#define UAUTH_User 2 /* Authenticated as a normal user */ +#define UAUTH_Admin 3 /* Authenticated as an administrator */ + +/* Functions used only by user authorization logic */ +SQLITE_PRIVATE int sqlite3UserAuthTable(const char*); +SQLITE_PRIVATE int sqlite3UserAuthCheckLogin(sqlite3*,const char*,u8*); +SQLITE_PRIVATE void sqlite3UserAuthInit(sqlite3*); +SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); + +#endif /* SQLITE_USER_AUTHENTICATION */ + +/* +** typedef for the authorization callback function. +*/ +#ifdef SQLITE_USER_AUTHENTICATION + typedef int (*sqlite3_xauth)(void*,int,const char*,const char*,const char*, + const char*, const char*); +#else + typedef int (*sqlite3_xauth)(void*,int,const char*,const char*,const char*, + const char*); +#endif + +#ifndef SQLITE_OMIT_DEPRECATED +/* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing +** in the style of sqlite3_trace() +*/ +#define SQLITE_TRACE_LEGACY 0x40 /* Use the legacy xTrace */ +#define SQLITE_TRACE_XPROFILE 0x80 /* Use the legacy xProfile */ +#else +#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_XPROFILE 0 +#endif /* SQLITE_OMIT_DEPRECATED */ +#define SQLITE_TRACE_NONLEGACY_MASK 0x0f /* Normal flags */ + +/* +** Maximum number of sqlite3.aDb[] entries. This is the number of attached +** databases plus 2 for "main" and "temp". +*/ +#define SQLITE_MAX_DB (SQLITE_MAX_ATTACHED+2) + +/* +** Each database connection is an instance of the following structure. +*/ +struct sqlite3 { + sqlite3_vfs *pVfs; /* OS Interface */ + struct Vdbe *pVdbe; /* List of active virtual machines */ + CollSeq *pDfltColl; /* BINARY collseq for the database encoding */ + sqlite3_mutex *mutex; /* Connection mutex */ + Db *aDb; /* All backends */ + int nDb; /* Number of backends currently in use */ + u32 mDbFlags; /* flags recording internal state */ + u64 flags; /* flags settable by pragmas. See below */ + i64 lastRowid; /* ROWID of most recent insert (see above) */ + i64 szMmap; /* Default mmap_size setting */ + u32 nSchemaLock; /* Do not reset the schema when non-zero */ + unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ + int errCode; /* Most recent error code (SQLITE_*) */ + int errByteOffset; /* Byte offset of error in SQL statement */ + int errMask; /* & result codes with this before returning */ + int iSysErrno; /* Errno value from last system error */ + u32 dbOptFlags; /* Flags to enable/disable optimizations */ + u8 enc; /* Text encoding */ + u8 autoCommit; /* The auto-commit flag. */ + u8 temp_store; /* 1: file 2: memory 0: default */ + u8 mallocFailed; /* True if we have seen a malloc failure */ + u8 bBenignMalloc; /* Do not require OOMs if true */ + u8 dfltLockMode; /* Default locking-mode for attached dbs */ + signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ + u8 suppressErr; /* Do not issue error messages if true */ + u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ + u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ + u8 mTrace; /* zero or more SQLITE_TRACE flags */ + u8 noSharedCache; /* True if no shared-cache backends */ + u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ + u8 eOpenState; /* Current condition of the connection */ + int nextPagesize; /* Pagesize after VACUUM if >0 */ + i64 nChange; /* Value returned by sqlite3_changes() */ + i64 nTotalChange; /* Value returned by sqlite3_total_changes() */ + int aLimit[SQLITE_N_LIMIT]; /* Limits */ + int nMaxSorterMmap; /* Maximum size of regions mapped by sorter */ + struct sqlite3InitInfo { /* Information used during initialization */ + Pgno newTnum; /* Rootpage of table being initialized */ + u8 iDb; /* Which db file is being initialized */ + u8 busy; /* TRUE if currently initializing */ + unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ + unsigned imposterTable : 1; /* Building an imposter table */ + unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ + const char **azInit; /* "type", "name", and "tbl_name" columns */ + } init; + int nVdbeActive; /* Number of VDBEs currently running */ + int nVdbeRead; /* Number of active VDBEs that read or write */ + int nVdbeWrite; /* Number of active VDBEs that read and write */ + int nVdbeExec; /* Number of nested calls to VdbeExec() */ + int nVDestroy; /* Number of active OP_VDestroy operations */ + int nExtension; /* Number of loaded extensions */ + void **aExtension; /* Array of shared library handles */ + union { + void (*xLegacy)(void*,const char*); /* mTrace==SQLITE_TRACE_LEGACY */ + int (*xV2)(u32,void*,void*,void*); /* All other mTrace values */ + } trace; + void *pTraceArg; /* Argument to the trace function */ +#ifndef SQLITE_OMIT_DEPRECATED + void (*xProfile)(void*,const char*,u64); /* Profiling function */ + void *pProfileArg; /* Argument to profile function */ +#endif + void *pCommitArg; /* Argument to xCommitCallback() */ + int (*xCommitCallback)(void*); /* Invoked at every commit. */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ + void (*xRollbackCallback)(void*); /* Invoked at every commit. */ + void *pUpdateArg; + void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + void *pAutovacPagesArg; /* Client argument to autovac_pages */ + void (*xAutovacDestr)(void*); /* Destructor for pAutovacPAgesArg */ + unsigned int (*xAutovacPages)(void*,const char*,u32,u32,u32); + Parse *pParse; /* Current parse */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ + void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64 + ); + PreUpdate *pPreUpdate; /* Context for active pre-update callback */ +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ +#ifndef SQLITE_OMIT_WAL + int (*xWalCallback)(void *, sqlite3 *, const char *, int); + void *pWalArg; +#endif + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); + void *pCollNeededArg; + sqlite3_value *pErr; /* Most recent error message */ + union { + volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ + double notUsed1; /* Spacer */ + } u1; + Lookaside lookaside; /* Lookaside malloc configuration */ +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; /* Access authorization function */ + void *pAuthArg; /* 1st argument to the access auth function */ +#endif +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int (*xProgress)(void *); /* The progress callback */ + void *pProgressArg; /* Argument to the progress callback */ + unsigned nProgressOps; /* Number of opcodes for progress callback */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nVTrans; /* Allocated size of aVTrans */ + Hash aModule; /* populated by sqlite3_create_module() */ + VtabCtx *pVtabCtx; /* Context for active vtab connect/create */ + VTable **aVTrans; /* Virtual tables with open transactions */ + VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ +#endif + Hash aFunc; /* Hash table of connection functions */ + Hash aCollSeq; /* All collating sequences */ + BusyHandler busyHandler; /* Busy callback */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ + Savepoint *pSavepoint; /* List of active savepoints */ + int nAnalysisLimit; /* Number of index rows to ANALYZE */ + int busyTimeout; /* Busy handler timeout, in msec */ + int nSavepoint; /* Number of non-transaction savepoints */ + int nStatement; /* Number of nested statement-transactions */ + i64 nDeferredCons; /* Net deferred constraints this transaction. */ + i64 nDeferredImmCons; /* Net deferred immediate constraints */ + int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + /* The following variables are all protected by the STATIC_MAIN + ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + ** + ** When X.pUnlockConnection==Y, that means that X is waiting for Y to + ** unlock so that it can proceed. + ** + ** When X.pBlockingConnection==Y, that means that something that X tried + ** tried to do recently failed with an SQLITE_LOCKED error due to locks + ** held by Y. + */ + sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ + sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ + void *pUnlockArg; /* Argument to xUnlockNotify */ + void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ + sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ +#endif +#ifdef SQLITE_USER_AUTHENTICATION + sqlite3_userauth auth; /* User authentication information */ +#endif +}; + +/* +** A macro to discover the encoding of a database. +*/ +#define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc) +#define ENC(db) ((db)->enc) + +/* +** A u64 constant where the lower 32 bits are all zeros. Only the +** upper 32 bits are included in the argument. Necessary because some +** C-compilers still do not accept LL integer literals. +*/ +#define HI(X) ((u64)(X)<<32) + +/* +** Possible values for the sqlite3.flags. +** +** Value constraints (enforced via assert()): +** SQLITE_FullFSync == PAGER_FULLFSYNC +** SQLITE_CkptFullFSync == PAGER_CKPT_FULLFSYNC +** SQLITE_CacheSpill == PAGER_CACHE_SPILL +*/ +#define SQLITE_WriteSchema 0x00000001 /* OK to update SQLITE_SCHEMA */ +#define SQLITE_LegacyFileFmt 0x00000002 /* Create new databases in format 1 */ +#define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */ +#define SQLITE_FullFSync 0x00000008 /* Use full fsync on the backend */ +#define SQLITE_CkptFullFSync 0x00000010 /* Use full fsync for checkpoint */ +#define SQLITE_CacheSpill 0x00000020 /* OK to spill pager cache */ +#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ +#define SQLITE_TrustedSchema 0x00000080 /* Allow unsafe functions and + ** vtabs in the schema definition */ +#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ + /* result set is empty */ +#define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommit 0x00000400 /* READ UNCOMMITTED in shared-cache */ +#define SQLITE_NoCkptOnClose 0x00000800 /* No checkpoint on close()/DETACH */ +#define SQLITE_ReverseOrder 0x00001000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x00002000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x00004000 /* Enforce foreign key constraints */ +#define SQLITE_AutoIndex 0x00008000 /* Enable automatic indexes */ +#define SQLITE_LoadExtension 0x00010000 /* Enable load_extension */ +#define SQLITE_LoadExtFunc 0x00020000 /* Enable load_extension() SQL func */ +#define SQLITE_EnableTrigger 0x00040000 /* True to enable triggers */ +#define SQLITE_DeferFKs 0x00080000 /* Defer all FK constraints */ +#define SQLITE_QueryOnly 0x00100000 /* Disable database changes */ +#define SQLITE_CellSizeCk 0x00200000 /* Check btree cell sizes on load */ +#define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */ +#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee*/ +#define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */ +#define SQLITE_ResetDatabase 0x02000000 /* Reset the database */ +#define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ +#define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ +#define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ +#define SQLITE_DqsDDL 0x20000000 /* dbl-quoted strings allowed in DDL*/ +#define SQLITE_DqsDML 0x40000000 /* dbl-quoted strings allowed in DML*/ +#define SQLITE_EnableView 0x80000000 /* Enable the use of views */ +#define SQLITE_CountRows HI(0x00001) /* Count rows changed by INSERT, */ + /* DELETE, or UPDATE and return */ + /* the count using a callback. */ +#define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */ + +/* Flags used only if debugging */ +#ifdef SQLITE_DEBUG +#define SQLITE_SqlTrace HI(0x0100000) /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing HI(0x0200000) /* Debug listings of VDBE progs */ +#define SQLITE_VdbeTrace HI(0x0400000) /* True to trace VDBE execution */ +#define SQLITE_VdbeAddopTrace HI(0x0800000) /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_VdbeEQP HI(0x1000000) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x2000000) /* PRAGMA parser_trace=ON */ +#endif + +/* +** Allowed values for sqlite3.mDbFlags +*/ +#define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ +#define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ +#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_EncodingFixed 0x0040 /* No longer possible to change enc. */ + +/* +** Bits of the sqlite3.dbOptFlags field that are used by the +** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to +** selectively disable various optimizations. +*/ +#define SQLITE_QueryFlattener 0x00000001 /* Query flattening */ +#define SQLITE_WindowFunc 0x00000002 /* Use xInverse for window functions */ +#define SQLITE_GroupByOrder 0x00000004 /* GROUPBY cover of ORDERBY */ +#define SQLITE_FactorOutConst 0x00000008 /* Constant factoring */ +#define SQLITE_DistinctOpt 0x00000010 /* DISTINCT using indexes */ +#define SQLITE_CoverIdxScan 0x00000020 /* Covering index scans */ +#define SQLITE_OrderByIdxJoin 0x00000040 /* ORDER BY of joins via index */ +#define SQLITE_Transitive 0x00000080 /* Transitive constraints */ +#define SQLITE_OmitNoopJoin 0x00000100 /* Omit unused tables in joins */ +#define SQLITE_CountOfView 0x00000200 /* The count-of-view optimization */ +#define SQLITE_CursorHints 0x00000400 /* Add OP_CursorHint opcodes */ +#define SQLITE_Stat4 0x00000800 /* Use STAT4 data */ + /* TH3 expects this value ^^^^^^^^^^ to be 0x0000800. Don't change it */ +#define SQLITE_PushDown 0x00001000 /* The push-down optimization */ +#define SQLITE_SimplifyJoin 0x00002000 /* Convert LEFT JOIN to JOIN */ +#define SQLITE_SkipScan 0x00004000 /* Skip-scans */ +#define SQLITE_PropagateConst 0x00008000 /* The constant propagation opt */ +#define SQLITE_MinMaxOpt 0x00010000 /* The min/max optimization */ +#define SQLITE_SeekScan 0x00020000 /* The OP_SeekScan optimization */ +#define SQLITE_OmitOrderBy 0x00040000 /* Omit pointless ORDER BY */ + /* TH3 expects this value ^^^^^^^^^^ to be 0x40000. Coordinate any change */ +#define SQLITE_BloomFilter 0x00080000 /* Use a Bloom filter on searches */ +#define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */ +#define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */ +#define SQLITE_ReleaseReg 0x00400000 /* Use OP_ReleaseReg for testing */ +#define SQLITE_FlttnUnionAll 0x00800000 /* Disable the UNION ALL flattener */ + /* TH3 expects this value ^^^^^^^^^^ See flatten04.test */ +#define SQLITE_AllOpts 0xffffffff /* All optimizations */ + +/* +** Macros for testing whether or not optimizations are enabled or disabled. +*/ +#define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) +#define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) + +/* +** Return true if it OK to factor constant expressions into the initialization +** code. The argument is a Parse object for the code generator. +*/ +#define ConstFactorOk(P) ((P)->okConstFactor) + +/* Possible values for the sqlite3.eOpenState field. +** The numbers are randomly selected such that a minimum of three bits must +** change to convert any number to another or to zero +*/ +#define SQLITE_STATE_OPEN 0x76 /* Database is open */ +#define SQLITE_STATE_CLOSED 0xce /* Database is closed */ +#define SQLITE_STATE_SICK 0xba /* Error and awaiting close */ +#define SQLITE_STATE_BUSY 0x6d /* Database currently in use */ +#define SQLITE_STATE_ERROR 0xd5 /* An SQLITE_MISUSE error occurred */ +#define SQLITE_STATE_ZOMBIE 0xa7 /* Close with last statement close */ + +/* +** Each SQL function is defined by an instance of the following +** structure. For global built-in functions (ex: substr(), max(), count()) +** a pointer to this structure is held in the sqlite3BuiltinFunctions object. +** For per-connection application-defined functions, a pointer to this +** structure is held in the db->aHash hash table. +** +** The u.pHash field is used by the global built-ins. The u.pDestructor +** field is used by per-connection app-def functions. +*/ +struct FuncDef { + i8 nArg; /* Number of arguments. -1 means unlimited */ + u32 funcFlags; /* Some combination of SQLITE_FUNC_* */ + void *pUserData; /* User data parameter */ + FuncDef *pNext; /* Next function with same name */ + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**); /* func or agg-step */ + void (*xFinalize)(sqlite3_context*); /* Agg finalizer */ + void (*xValue)(sqlite3_context*); /* Current agg value */ + void (*xInverse)(sqlite3_context*,int,sqlite3_value**); /* inverse agg-step */ + const char *zName; /* SQL name of the function. */ + union { + FuncDef *pHash; /* Next with a different name but the same hash */ + FuncDestructor *pDestructor; /* Reference counted destructor function */ + } u; /* pHash if SQLITE_FUNC_BUILTIN, pDestructor otherwise */ +}; + +/* +** This structure encapsulates a user-function destructor callback (as +** configured using create_function_v2()) and a reference counter. When +** create_function_v2() is called to create a function with a destructor, +** a single object of this type is allocated. FuncDestructor.nRef is set to +** the number of FuncDef objects created (either 1 or 3, depending on whether +** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor +** member of each of the new FuncDef objects is set to point to the allocated +** FuncDestructor. +** +** Thereafter, when one of the FuncDef objects is deleted, the reference +** count on this object is decremented. When it reaches 0, the destructor +** is invoked and the FuncDestructor structure freed. +*/ +struct FuncDestructor { + int nRef; + void (*xDestroy)(void *); + void *pUserData; +}; + +/* +** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF +** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. And +** SQLITE_FUNC_CONSTANT must be the same as SQLITE_DETERMINISTIC. There +** are assert() statements in the code to verify this. +** +** Value constraints (enforced via assert()): +** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg +** SQLITE_FUNC_ANYORDER == NC_OrderAgg == SF_OrderByReqd +** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG +** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG +** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API +** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS +** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API +*/ +#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ +#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */ +#define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ +#define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ +#define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ +#define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ +/* 0x0200 -- available for reuse */ +#define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ +#define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */ +#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ +#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a + ** single query - might change over time */ +#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ +/* 0x8000 -- available for reuse */ +#define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ +#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ +#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ +#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ +#define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ +#define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ +#define SQLITE_FUNC_BUILTIN 0x00800000 /* This is a built-in function */ +#define SQLITE_FUNC_ANYORDER 0x08000000 /* count/min/max aggregate */ + +/* Identifier numbers for each in-line function */ +#define INLINEFUNC_coalesce 0 +#define INLINEFUNC_implies_nonnull_row 1 +#define INLINEFUNC_expr_implies_expr 2 +#define INLINEFUNC_expr_compare 3 +#define INLINEFUNC_affinity 4 +#define INLINEFUNC_iif 5 +#define INLINEFUNC_sqlite_offset 6 +#define INLINEFUNC_unlikely 99 /* Default case */ + +/* +** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are +** used to create the initializers for the FuncDef structures. +** +** FUNCTION(zName, nArg, iArg, bNC, xFunc) +** Used to create a scalar function definition of a function zName +** implemented by C function xFunc that accepts nArg arguments. The +** value passed as iArg is cast to a (void*) and made available +** as the user-data (sqlite3_user_data()) for the function. If +** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. +** +** VFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag. +** +** SFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_DIRECTONLY flag. +** +** INLINE_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a function that is implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** TEST_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a test-only function implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** DFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions +** and functions like sqlite_version() that can change, but not during +** a single query. The iArg is ignored. The user-data is always set +** to a NULL pointer. The bNC parameter is not used. +** +** MFUNCTION(zName, nArg, xPtr, xFunc) +** For math-library functions. xPtr is an arbitrary pointer. +** +** PURE_DATE(zName, nArg, iArg, bNC, xFunc) +** Used for "pure" date/time functions, this macro is like DFUNCTION +** except that it does set the SQLITE_FUNC_CONSTANT flags. iArg is +** ignored and the user-data for these functions is set to an +** arbitrary non-NULL pointer. The bNC parameter is not used. +** +** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** WAGGREGATE(zName, nArg, iArg, xStep, xFinal, xValue, xInverse) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** LIKEFUNC(zName, nArg, pArg, flags) +** Used to create a scalar function definition of a function zName +** that accepts nArg arguments and is implemented by a call to C +** function likeFunc. Argument pArg is cast to a (void *) and made +** available as the function user-data (sqlite3_user_data()). The +** FuncDef.flags variable is set to the value passed as the flags +** parameter. +*/ +#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define MFUNCTION(zName, nArg, xPtr, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ + xPtr, 0, xFunc, 0, 0, 0, #zName, {0} } +#define JFUNCTION(zName, nArg, iArg, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|\ + SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define INLINE_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define TEST_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ + SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ + 0, 0, xFunc, 0, 0, 0, #zName, {0} } +#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + (void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} } +#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + pArg, 0, xFunc, 0, 0, 0, #zName, } +#define LIKEFUNC(zName, nArg, arg, flags) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ + (void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} } +#define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \ + SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}} +#define INTERNAL_FUNCTION(zName, nArg, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + 0, 0, xFunc, 0, 0, 0, #zName, {0} } + + +/* +** All current savepoints are stored in a linked list starting at +** sqlite3.pSavepoint. The first element in the list is the most recently +** opened savepoint. Savepoints are added to the list by the vdbe +** OP_Savepoint instruction. +*/ +struct Savepoint { + char *zName; /* Savepoint name (nul-terminated) */ + i64 nDeferredCons; /* Number of deferred fk violations */ + i64 nDeferredImmCons; /* Number of deferred imm fk. */ + Savepoint *pNext; /* Parent savepoint (if any) */ +}; + +/* +** The following are used as the second parameter to sqlite3Savepoint(), +** and as the P1 argument to the OP_Savepoint instruction. +*/ +#define SAVEPOINT_BEGIN 0 +#define SAVEPOINT_RELEASE 1 +#define SAVEPOINT_ROLLBACK 2 + + +/* +** Each SQLite module (virtual table definition) is defined by an +** instance of the following structure, stored in the sqlite3.aModule +** hash table. +*/ +struct Module { + const sqlite3_module *pModule; /* Callback pointers */ + const char *zName; /* Name passed to create_module() */ + int nRefModule; /* Number of pointers to this object */ + void *pAux; /* pAux passed to create_module() */ + void (*xDestroy)(void *); /* Module destructor function */ + Table *pEpoTab; /* Eponymous table for this module */ +}; + +/* +** Information about each column of an SQL table is held in an instance +** of the Column structure, in the Table.aCol[] array. +** +** Definitions: +** +** "table column index" This is the index of the column in the +** Table.aCol[] array, and also the index of +** the column in the original CREATE TABLE stmt. +** +** "storage column index" This is the index of the column in the +** record BLOB generated by the OP_MakeRecord +** opcode. The storage column index is less than +** or equal to the table column index. It is +** equal if and only if there are no VIRTUAL +** columns to the left. +** +** Notes on zCnName: +** The zCnName field stores the name of the column, the datatype of the +** column, and the collating sequence for the column, in that order, all in +** a single allocation. Each string is 0x00 terminated. The datatype +** is only included if the COLFLAG_HASTYPE bit of colFlags is set and the +** collating sequence name is only included if the COLFLAG_HASCOLL bit is +** set. +*/ +struct Column { + char *zCnName; /* Name of this column */ + unsigned notNull :4; /* An OE_ code for handling a NOT NULL constraint */ + unsigned eCType :4; /* One of the standard types */ + char affinity; /* One of the SQLITE_AFF_... values */ + u8 szEst; /* Est size of value in this column. sizeof(INT)==1 */ + u8 hName; /* Column name hash for faster lookup */ + u16 iDflt; /* 1-based index of DEFAULT. 0 means "none" */ + u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ +}; + +/* Allowed values for Column.eCType. +** +** Values must match entries in the global constant arrays +** sqlite3StdTypeLen[] and sqlite3StdType[]. Each value is one more +** than the offset into these arrays for the corresponding name. +** Adjust the SQLITE_N_STDTYPE value if adding or removing entries. +*/ +#define COLTYPE_CUSTOM 0 /* Type appended to zName */ +#define COLTYPE_ANY 1 +#define COLTYPE_BLOB 2 +#define COLTYPE_INT 3 +#define COLTYPE_INTEGER 4 +#define COLTYPE_REAL 5 +#define COLTYPE_TEXT 6 +#define SQLITE_N_STDTYPE 6 /* Number of standard types */ + +/* Allowed values for Column.colFlags. +** +** Constraints: +** TF_HasVirtual == COLFLAG_VIRTUAL +** TF_HasStored == COLFLAG_STORED +** TF_HasHidden == COLFLAG_HIDDEN +*/ +#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ +#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ +#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ +#define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ +#define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ +#define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ +#define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ +#define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ +#define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */ +#define COLFLAG_NOEXPAND 0x0400 /* Omit this column when expanding "*" */ +#define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ +#define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ + +/* +** A "Collating Sequence" is defined by an instance of the following +** structure. Conceptually, a collating sequence consists of a name and +** a comparison routine that defines the order of that sequence. +** +** If CollSeq.xCmp is NULL, it means that the +** collating sequence is undefined. Indices built on an undefined +** collating sequence may not be read or written. +*/ +struct CollSeq { + char *zName; /* Name of the collating sequence, UTF-8 encoded */ + u8 enc; /* Text encoding handled by xCmp() */ + void *pUser; /* First argument to xCmp() */ + int (*xCmp)(void*,int, const void*, int, const void*); + void (*xDel)(void*); /* Destructor for pUser */ +}; + +/* +** A sort order can be either ASC or DESC. +*/ +#define SQLITE_SO_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ +#define SQLITE_SO_UNDEFINED -1 /* No sort order specified */ + +/* +** Column affinity types. +** +** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and +** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve +** the speed a little by numbering the values consecutively. +** +** But rather than start with 0 or 1, we begin with 'A'. That way, +** when multiple affinity types are concatenated into a string and +** used as the P4 operand, they will be more readable. +** +** Note also that the numeric types are grouped together so that testing +** for a numeric type is a single comparison. And the BLOB type is first. +*/ +#define SQLITE_AFF_NONE 0x40 /* '@' */ +#define SQLITE_AFF_BLOB 0x41 /* 'A' */ +#define SQLITE_AFF_TEXT 0x42 /* 'B' */ +#define SQLITE_AFF_NUMERIC 0x43 /* 'C' */ +#define SQLITE_AFF_INTEGER 0x44 /* 'D' */ +#define SQLITE_AFF_REAL 0x45 /* 'E' */ + +#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) + +/* +** The SQLITE_AFF_MASK values masks off the significant bits of an +** affinity value. +*/ +#define SQLITE_AFF_MASK 0x47 + +/* +** Additional bit values that can be ORed with an affinity without +** changing the affinity. +** +** The SQLITE_NOTNULL flag is a combination of NULLEQ and JUMPIFNULL. +** It causes an assert() to fire if either operand to a comparison +** operator is NULL. It is added to certain comparison operators to +** prove that the operands are always NOT NULL. +*/ +#define SQLITE_JUMPIFNULL 0x10 /* jumps if either operand is NULL */ +#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ +#define SQLITE_NOTNULL 0x90 /* Assert that operands are never NULL */ + +/* +** An object of this type is created for each virtual table present in +** the database schema. +** +** If the database schema is shared, then there is one instance of this +** structure for each database connection (sqlite3*) that uses the shared +** schema. This is because each database connection requires its own unique +** instance of the sqlite3_vtab* handle used to access the virtual table +** implementation. sqlite3_vtab* handles can not be shared between +** database connections, even when the rest of the in-memory database +** schema is shared, as the implementation often stores the database +** connection handle passed to it via the xConnect() or xCreate() method +** during initialization internally. This database connection handle may +** then be used by the virtual table implementation to access real tables +** within the database. So that they appear as part of the callers +** transaction, these accesses need to be made via the same database +** connection as that used to execute SQL operations on the virtual table. +** +** All VTable objects that correspond to a single table in a shared +** database schema are initially stored in a linked-list pointed to by +** the Table.pVTable member variable of the corresponding Table object. +** When an sqlite3_prepare() operation is required to access the virtual +** table, it searches the list for the VTable that corresponds to the +** database connection doing the preparing so as to use the correct +** sqlite3_vtab* handle in the compiled query. +** +** When an in-memory Table object is deleted (for example when the +** schema is being reloaded for some reason), the VTable objects are not +** deleted and the sqlite3_vtab* handles are not xDisconnect()ed +** immediately. Instead, they are moved from the Table.pVTable list to +** another linked list headed by the sqlite3.pDisconnect member of the +** corresponding sqlite3 structure. They are then deleted/xDisconnected +** next time a statement is prepared using said sqlite3*. This is done +** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. +** Refer to comments above function sqlite3VtabUnlockList() for an +** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect +** list without holding the corresponding sqlite3.mutex mutex. +** +** The memory for objects of this type is always allocated by +** sqlite3DbMalloc(), using the connection handle stored in VTable.db as +** the first argument. +*/ +struct VTable { + sqlite3 *db; /* Database connection associated with this table */ + Module *pMod; /* Pointer to module implementation */ + 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) */ +}; + +/* 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, virtual table, and view is represented +** in memory by an instance of the following structure. +*/ +struct Table { + char *zName; /* Name of the table or view */ + Column *aCol; /* Information about each column */ + Index *pIndex; /* List of SQL indexes on this table. */ + char *zColAff; /* String defining the affinity of each column */ + ExprList *pCheck; /* All CHECK constraints */ + /* ... also used as column name list in a VIEW */ + Pgno tnum; /* Root BTree page for this table */ + u32 nTabRef; /* Number of pointers to this Table */ + u32 tabFlags; /* Mask of TF_* values */ + i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ + i16 nCol; /* Number of columns in this table */ + i16 nNVCol; /* Number of columns that are not VIRTUAL */ + LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ + LogEst szTabRow; /* Estimated size of each table row in bytes */ +#ifdef SQLITE_ENABLE_COSTMULT + LogEst costMult; /* Cost multiplier for using this table */ +#endif + u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ + u8 eTabType; /* 0: normal, 1: virtual, 2: view */ + union { + struct { /* Used by ordinary tables: */ + int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + ExprList *pDfltList; /* DEFAULT clauses on various columns. + ** Or the AS clause for generated columns. */ + } tab; + struct { /* Used by views: */ + Select *pSelect; /* View definition */ + } view; + struct { /* Used by virtual tables only: */ + int nArg; /* Number of arguments to the module */ + char **azArg; /* 0: module 1: schema 2: vtab name 3...: args */ + VTable *p; /* List of VTable objects. */ + } vtab; + } u; + Trigger *pTrigger; /* List of triggers on this object */ + Schema *pSchema; /* Schema that contains this table */ +}; + +/* +** Allowed values for Table.tabFlags. +** +** TF_OOOHidden applies to tables or view that have hidden columns that are +** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING +** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden, +** the TF_OOOHidden attribute would apply in this case. Such tables require +** special handling during INSERT processing. The "OOO" means "Out Of Order". +** +** Constraints: +** +** TF_HasVirtual == COLFLAG_VIRTUAL +** TF_HasStored == COLFLAG_STORED +** TF_HasHidden == COLFLAG_HIDDEN +*/ +#define TF_Readonly 0x00000001 /* Read-only system table */ +#define TF_HasHidden 0x00000002 /* Has one or more hidden columns */ +#define TF_HasPrimaryKey 0x00000004 /* Table has a primary key */ +#define TF_Autoincrement 0x00000008 /* Integer primary key is autoincrement */ +#define TF_HasStat1 0x00000010 /* nRowLogEst set from sqlite_stat1 */ +#define TF_HasVirtual 0x00000020 /* Has one or more VIRTUAL columns */ +#define TF_HasStored 0x00000040 /* Has one or more STORED columns */ +#define TF_HasGenerated 0x00000060 /* Combo: HasVirtual + HasStored */ +#define TF_WithoutRowid 0x00000080 /* No rowid. PRIMARY KEY is the key */ +#define TF_StatsUsed 0x00000100 /* Query planner decisions affected by + ** Index.aiRowLogEst[] values */ +#define TF_NoVisibleRowid 0x00000200 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x00000400 /* Out-of-Order hidden columns */ +#define TF_HasNotNull 0x00000800 /* Contains NOT NULL constraints */ +#define TF_Shadow 0x00001000 /* True for a shadow table */ +#define TF_HasStat4 0x00002000 /* STAT4 info available for this table */ +#define TF_Ephemeral 0x00004000 /* An ephemeral table */ +#define TF_Eponymous 0x00008000 /* An eponymous virtual table */ +#define TF_Strict 0x00010000 /* STRICT mode */ + +/* +** Allowed values for Table.eTabType +*/ +#define TABTYP_NORM 0 /* Ordinary table */ +#define TABTYP_VTAB 1 /* Virtual table */ +#define TABTYP_VIEW 2 /* A view */ + +#define IsView(X) ((X)->eTabType==TABTYP_VIEW) +#define IsOrdinaryTable(X) ((X)->eTabType==TABTYP_NORM) + +/* +** Test to see whether or not a table is a virtual table. This is +** done as a macro so that it will be optimized out when virtual +** table support is omitted from the build. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +# define IsVirtual(X) ((X)->eTabType==TABTYP_VTAB) +# define ExprIsVtab(X) \ + ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->eTabType==TABTYP_VTAB) +#else +# define IsVirtual(X) 0 +# define ExprIsVtab(X) 0 +#endif + +/* +** Macros to determine if a column is hidden. IsOrdinaryHiddenColumn() +** only works for non-virtual tables (ordinary tables and views) and is +** always false unless SQLITE_ENABLE_HIDDEN_COLUMNS is defined. The +** IsHiddenColumn() macro is general purpose. +*/ +#if defined(SQLITE_ENABLE_HIDDEN_COLUMNS) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +#elif !defined(SQLITE_OMIT_VIRTUALTABLE) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) 0 +#else +# define IsHiddenColumn(X) 0 +# define IsOrdinaryHiddenColumn(X) 0 +#endif + + +/* Does the table have a rowid */ +#define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0) +#define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0) + +/* +** Each foreign key constraint is an instance of the following structure. +** +** A foreign key is associated with two tables. The "from" table is +** the table that contains the REFERENCES clause that creates the foreign +** key. The "to" table is the table that is named in the REFERENCES clause. +** Consider this example: +** +** CREATE TABLE ex1( +** a INTEGER PRIMARY KEY, +** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) +** ); +** +** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". +** Equivalent names: +** +** from-table == child-table +** to-table == parent-table +** +** Each REFERENCES clause generates an instance of the following structure +** which is attached to the from-table. The to-table need not exist when +** the from-table is created. The existence of the to-table is not checked. +** +** The list of all parents for child Table X is held at X.pFKey. +** +** A list of all children for a table named Z (which might not even exist) +** is held in Schema.fkeyHash with a hash key of Z. +*/ +struct FKey { + Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ + FKey *pNextFrom; /* Next FKey with the same in pFrom. Next parent of pFrom */ + char *zTo; /* Name of table that the key points to (aka: Parent) */ + FKey *pNextTo; /* Next with the same zTo. Next child of zTo. */ + FKey *pPrevTo; /* Previous with the same zTo */ + int nCol; /* Number of columns in this key */ + /* EV: R-30323-21917 */ + u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ + u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ + Trigger *apTrigger[2];/* Triggers for aAction[] actions */ + struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ + int iFrom; /* Index of column in pFrom */ + char *zCol; /* Name of column in zTo. If NULL use PRIMARY KEY */ + } aCol[1]; /* One entry for each of nCol columns */ +}; + +/* +** SQLite supports many different ways to resolve a constraint +** error. ROLLBACK processing means that a constraint violation +** causes the operation in process to fail and for the current transaction +** to be rolled back. ABORT processing means the operation in process +** fails and any prior changes from that one operation are backed out, +** but the transaction is not rolled back. FAIL processing means that +** the operation in progress stops and returns an error code. But prior +** changes due to the same operation are not backed out and no rollback +** occurs. IGNORE means that the particular row that caused the constraint +** error is not inserted or updated. Processing continues and no error +** is returned. REPLACE means that preexisting database rows that caused +** a UNIQUE constraint violation are removed so that the new insert or +** update can proceed. Processing continues and no error is reported. +** UPDATE applies to insert operations only and means that the insert +** is omitted and the DO UPDATE clause of an upsert is run instead. +** +** RESTRICT, SETNULL, SETDFLT, and CASCADE actions apply only to foreign keys. +** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the +** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign +** key is set to NULL. SETDFLT means that the foreign key is set +** to its default value. CASCADE means that a DELETE or UPDATE of the +** referenced table row is propagated into the row that holds the +** foreign key. +** +** The OE_Default value is a place holder that means to use whatever +** conflict resolution algorthm is required from context. +** +** The following symbolic values are used to record which type +** of conflict resolution action to take. +*/ +#define OE_None 0 /* There is no constraint to check */ +#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ +#define OE_Abort 2 /* Back out changes but do no rollback transaction */ +#define OE_Fail 3 /* Stop the operation but leave all prior changes */ +#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ +#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ +#define OE_Update 6 /* Process as a DO UPDATE in an upsert */ +#define OE_Restrict 7 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 8 /* Set the foreign key value to NULL */ +#define OE_SetDflt 9 /* Set the foreign key value to its default */ +#define OE_Cascade 10 /* Cascade the changes */ +#define OE_Default 11 /* Do whatever the default action is */ + + +/* +** An instance of the following structure is passed as the first +** argument to sqlite3VdbeKeyCompare and is used to control the +** comparison of the two index keys. +** +** Note that aSortOrder[] and aColl[] have nField+1 slots. There +** are nField slots for the columns of an index then one extra slot +** for the rowid at the end. +*/ +struct KeyInfo { + u32 nRef; /* Number of references to this KeyInfo object */ + u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ + u16 nKeyField; /* Number of key columns in the index */ + u16 nAllField; /* Total columns, including key plus others */ + sqlite3 *db; /* The database connection */ + u8 *aSortFlags; /* Sort order for each column. */ + CollSeq *aColl[1]; /* Collating sequence for each term of the key */ +}; + +/* +** Allowed bit values for entries in the KeyInfo.aSortFlags[] array. +*/ +#define KEYINFO_ORDER_DESC 0x01 /* DESC sort order */ +#define KEYINFO_ORDER_BIGNULL 0x02 /* NULL is larger than any other value */ + +/* +** This object holds a record which has been parsed out into individual +** fields, for the purposes of doing a comparison. +** +** A record is an object that contains one or more fields of data. +** Records are used to store the content of a table row and to store +** the key of an index. A blob encoding of a record is created by +** the OP_MakeRecord opcode of the VDBE and is disassembled by the +** OP_Column opcode. +** +** An instance of this object serves as a "key" for doing a search on +** an index b+tree. The goal of the search is to find the entry that +** is closed to the key described by this object. This object might hold +** just a prefix of the key. The number of fields is given by +** pKeyInfo->nField. +** +** The r1 and r2 fields are the values to return if this key is less than +** or greater than a key in the btree, respectively. These are normally +** -1 and +1 respectively, but might be inverted to +1 and -1 if the b-tree +** is in DESC order. +** +** The key comparison functions actually return default_rc when they find +** an equals comparison. default_rc can be -1, 0, or +1. If there are +** multiple entries in the b-tree with the same key (when only looking +** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to +** cause the search to find the last match, or +1 to cause the search to +** find the first match. +** +** The key comparison functions will set eqSeen to true if they ever +** get and equal results when comparing this structure to a b-tree record. +** When default_rc!=0, the search might end up on the record immediately +** before the first match or immediately after the last match. The +** eqSeen field will indicate whether or not an exact match exists in the +** b-tree. +*/ +struct UnpackedRecord { + KeyInfo *pKeyInfo; /* Collation and sort-order information */ + Mem *aMem; /* Values */ + union { + char *z; /* Cache of aMem[0].z for vdbeRecordCompareString() */ + i64 i; /* Cache of aMem[0].u.i for vdbeRecordCompareInt() */ + } u; + int n; /* Cache of aMem[0].n used by vdbeRecordCompareString() */ + u16 nField; /* Number of entries in apMem[] */ + i8 default_rc; /* Comparison result if keys are equal */ + u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */ + i8 r1; /* Value to return if (lhs < rhs) */ + i8 r2; /* Value to return if (lhs > rhs) */ + u8 eqSeen; /* True if an equality comparison has been seen */ +}; + + +/* +** Each SQL index is represented in memory by an +** instance of the following structure. +** +** The columns of the table that are to be indexed are described +** by the aiColumn[] field of this structure. For example, suppose +** we have the following table and index: +** +** CREATE TABLE Ex1(c1 int, c2 int, c3 text); +** CREATE INDEX Ex2 ON Ex1(c3,c1); +** +** In the Table structure describing Ex1, nCol==3 because there are +** three columns in the table. In the Index structure describing +** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. +** The second column to be indexed (c1) has an index of 0 in +** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. +** +** While parsing a CREATE TABLE or CREATE INDEX statement in order to +** generate VDBE code (as opposed to parsing one read from an sqlite_schema +** table as part of parsing an existing database schema), transient instances +** of this structure may be created. In this case the Index.tnum variable is +** used to store the address of a VDBE instruction, not a database page +** number (it cannot - the database page is not allocated until the VDBE +** program is executed). See convertToWithoutRowidTable() for details. +*/ +struct Index { + char *zName; /* Name of this index */ + i16 *aiColumn; /* Which columns are used by this index. 1st is 0 */ + LogEst *aiRowLogEst; /* From ANALYZE: Est. rows selected by each column */ + Table *pTable; /* The SQL table being indexed */ + char *zColAff; /* String defining the affinity of each column */ + Index *pNext; /* The next index associated with the same table */ + Schema *pSchema; /* Schema containing this index */ + u8 *aSortOrder; /* for each column: True==DESC, False==ASC */ + const char **azColl; /* Array of collation sequence names for index */ + Expr *pPartIdxWhere; /* WHERE clause for partial indices */ + ExprList *aColExpr; /* Column expressions */ + Pgno tnum; /* DB Page containing root of this index */ + LogEst szIdxRow; /* Estimated average row size in bytes */ + u16 nKeyCol; /* Number of columns forming the key */ + u16 nColumn; /* Number of columns stored in the index */ + u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ + unsigned bUnordered:1; /* Use this index for == or IN queries only */ + unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ + unsigned isResized:1; /* True if resizeIndexObject() has been called */ + unsigned isCovering:1; /* True if this is a covering index */ + unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ + unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ + unsigned bNoQuery:1; /* Do not use this index to optimize queries */ + unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ + unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */ +#ifdef SQLITE_ENABLE_STAT4 + int nSample; /* Number of elements in aSample[] */ + int nSampleCol; /* Size of IndexSample.anEq[] and so on */ + tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ + IndexSample *aSample; /* Samples of the left-most key */ + tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */ + tRowcnt nRowEst0; /* Non-logarithmic number of rows in the index */ +#endif + Bitmask colNotIdxed; /* 0 for unindexed columns in pTab */ +}; + +/* +** Allowed values for Index.idxType +*/ +#define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ +#define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ +#define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ + +/* Return true if index X is a PRIMARY KEY index */ +#define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) + +/* Return true if index X is a UNIQUE index */ +#define IsUniqueIndex(X) ((X)->onError!=OE_None) + +/* The Index.aiColumn[] values are normally positive integer. But +** there are some negative values that have special meaning: +*/ +#define XN_ROWID (-1) /* Indexed column is the rowid */ +#define XN_EXPR (-2) /* Indexed column is an expression */ + +/* +** Each sample stored in the sqlite_stat4 table is represented in memory +** using a structure of this type. See documentation at the top of the +** analyze.c source file for additional information. +*/ +struct IndexSample { + void *p; /* Pointer to sampled record */ + int n; /* Size of record in bytes */ + tRowcnt *anEq; /* Est. number of rows where the key equals this sample */ + tRowcnt *anLt; /* Est. number of rows where key is less than this sample */ + tRowcnt *anDLt; /* Est. number of distinct keys less than this sample */ +}; + +/* +** Possible values to use within the flags argument to sqlite3GetToken(). +*/ +#define SQLITE_TOKEN_QUOTED 0x1 /* Token is a quoted identifier. */ +#define SQLITE_TOKEN_KEYWORD 0x2 /* Token is a keyword. */ + +/* +** Each token coming out of the lexer is an instance of +** this structure. Tokens are also used as part of an expression. +** +** The memory that "z" points to is owned by other objects. Take care +** that the owner of the "z" string does not deallocate the string before +** the Token goes out of scope! Very often, the "z" points to some place +** in the middle of the Parse.zSql text. But it might also point to a +** static string. +*/ +struct Token { + const char *z; /* Text of the token. Not NULL-terminated! */ + unsigned int n; /* Number of characters in this token */ +}; + +/* +** An instance of this structure contains information needed to generate +** code for a SELECT that contains aggregate functions. +** +** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a +** pointer to this structure. The Expr.iAgg field is the index in +** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate +** code for that node. +** +** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the +** original Select structure that describes the SELECT statement. These +** fields do not need to be freed when deallocating the AggInfo structure. +*/ +struct AggInfo { + u8 directMode; /* Direct rendering mode means take data directly + ** from source tables rather than from accumulators */ + u8 useSortingIdx; /* In direct mode, reference the sorting index rather + ** than the source table */ + int sortingIdx; /* Cursor number of the sorting index */ + int sortingIdxPTab; /* Cursor number of pseudo-table */ + 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 */ + struct AggInfo_col { /* For each column used in source tables */ + Table *pTab; /* Source table */ + Expr *pCExpr; /* The original expression */ + int iTable; /* Cursor number of the source table */ + int iMem; /* Memory location that acts as accumulator */ + i16 iColumn; /* Column number within the source table */ + i16 iSorterColumn; /* Column number in the sorting index */ + } *aCol; + int nColumn; /* Number of used entries in aCol[] */ + int nAccumulator; /* Number of columns that show through to the output. + ** Additional columns are used only as parameters to + ** aggregate functions */ + struct AggInfo_func { /* For each aggregate function */ + Expr *pFExpr; /* Expression encoding the function */ + FuncDef *pFunc; /* The aggregate function implementation */ + int iMem; /* Memory location that acts as accumulator */ + int iDistinct; /* Ephemeral table used to enforce DISTINCT */ + int iDistAddr; /* Address of OP_OpenEphemeral */ + } *aFunc; + int nFunc; /* Number of entries in aFunc[] */ + u32 selId; /* Select to which this AggInfo belongs */ +}; + +/* +** The datatype ynVar is a signed integer, either 16-bit or 32-bit. +** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater +** than 32767 we have to make it 32-bit. 16-bit is preferred because +** it uses less memory in the Expr object, which is a big memory user +** in systems with lots of prepared statements. And few applications +** need more than about 10 or 20 variables. But some extreme users want +** to have prepared statements with over 32766 variables, and for them +** the option is available (at compile-time). +*/ +#if SQLITE_MAX_VARIABLE_NUMBER<32767 +typedef i16 ynVar; +#else +typedef int ynVar; +#endif + +/* +** Each node of an expression in the parse tree is an instance +** of this structure. +** +** Expr.op is the opcode. The integer parser token codes are reused +** as opcodes here. For example, the parser defines TK_GE to be an integer +** code representing the ">=" operator. This same integer code is reused +** to represent the greater-than-or-equal-to operator in the expression +** tree. +** +** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, +** or TK_STRING), then Expr.u.zToken contains the text of the SQL literal. If +** the expression is a variable (TK_VARIABLE), then Expr.u.zToken contains the +** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), +** then Expr.u.zToken contains the name of the function. +** +** Expr.pRight and Expr.pLeft are the left and right subexpressions of a +** binary operator. Either or both may be NULL. +** +** Expr.x.pList is a list of arguments if the expression is an SQL function, +** a CASE expression or an IN expression of the form " IN (, ...)". +** Expr.x.pSelect is used if the expression is a sub-select or an expression of +** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the +** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is +** valid. +** +** An expression of the form ID or ID.ID refers to a column in a table. +** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is +** the integer cursor number of a VDBE cursor pointing to that table and +** Expr.iColumn is the column number for the specific column. If the +** expression is used as a result in an aggregate SELECT, then the +** value is also stored in the Expr.iAgg column in the aggregate so that +** it can be accessed after all aggregates are computed. +** +** If the expression is an unbound variable marker (a question mark +** character '?' in the original SQL) then the Expr.iTable holds the index +** number for that variable. +** +** If the expression is a subquery then Expr.iColumn holds an integer +** register number containing the result of the subquery. If the +** subquery gives a constant result, then iTable is -1. If the subquery +** gives a different answer at different times during statement processing +** then iTable is the address of a subroutine that computes the subquery. +** +** If the Expr is of type OP_Column, and the table it is selecting from +** is a disk table or the "old.*" pseudo-table, then pTab points to the +** corresponding table definition. +** +** ALLOCATION NOTES: +** +** Expr objects can use a lot of memory space in database schema. To +** help reduce memory requirements, sometimes an Expr object will be +** truncated. And to reduce the number of memory allocations, sometimes +** two or more Expr objects will be stored in a single memory allocation, +** together with Expr.u.zToken strings. +** +** If the EP_Reduced and EP_TokenOnly flags are set when +** an Expr object is truncated. When EP_Reduced is set, then all +** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees +** are contained within the same memory allocation. Note, however, that +** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately +** allocated, regardless of whether or not EP_Reduced is set. +*/ +struct Expr { + u8 op; /* Operation performed by this node */ + char affExpr; /* affinity, or RAISE type */ + u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op + ** TK_COLUMN: the value of p5 for OP_Column + ** TK_AGG_FUNCTION: nesting depth + ** TK_FUNCTION: NC_SelfRef flag if needs OP_PureFunc */ +#ifdef SQLITE_DEBUG + u8 vvaFlags; /* Verification flags. */ +#endif + u32 flags; /* Various flags. EP_* See below */ + union { + char *zToken; /* Token value. Zero terminated and dequoted */ + int iValue; /* Non-negative integer value if EP_IntValue */ + } u; + + /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + + Expr *pLeft; /* Left subnode */ + Expr *pRight; /* Right subnode */ + union { + ExprList *pList; /* op = IN, EXISTS, SELECT, CASE, FUNCTION, BETWEEN */ + Select *pSelect; /* EP_xIsSelect and op = IN, EXISTS, SELECT */ + } x; + + /* If the EP_Reduced flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + +#if SQLITE_MAX_EXPR_DEPTH>0 + int nHeight; /* Height of the tree headed by this node */ +#endif + int iTable; /* TK_COLUMN: cursor number of table holding column + ** TK_REGISTER: register number + ** TK_TRIGGER: 1 -> new, 0 -> old + ** EP_Unlikely: 134217728 times likelihood + ** TK_IN: ephemerial table holding RHS + ** TK_SELECT_COLUMN: Number of columns on the LHS + ** TK_SELECT: 1st register of result vector */ + ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. + ** TK_VARIABLE: variable number (always >= 1). + ** TK_SELECT_COLUMN: column of the result vector */ + i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ + union { + int iJoin; /* If EP_OuterON or EP_InnerON, the right table */ + int iOfst; /* else: start of token from start of statement */ + } w; + AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ + union { + Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL + ** for a column of an index on an expression */ + Window *pWin; /* EP_WinFunc: Window/Filter defn for a function */ + struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ + } sub; + } y; +}; + +/* The following are the meanings of bits in the Expr.flags field. +** Value restrictions: +** +** EP_Agg == NC_HasAgg == SF_HasAgg +** EP_Win == NC_HasWin +*/ +#define EP_OuterON 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_InnerON 0x000002 /* Originates in ON/USING of an inner join */ +#define EP_Distinct 0x000004 /* Aggregate function with DISTINCT keyword */ +#define EP_HasFunc 0x000008 /* Contains one or more functions of any kind */ +#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ +#define EP_FixedCol 0x000020 /* TK_Column with a known fixed value */ +#define EP_VarSelect 0x000040 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000080 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000100 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000200 /* Tree contains a TK_COLLATE operator */ +#define EP_Commuted 0x000400 /* Comparison operator has been commuted */ +#define EP_IntValue 0x000800 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x001000 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x002000 /* Operator does not contribute to affinity */ +#define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ +#define EP_Win 0x008000 /* Contains window functions */ +#define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_MemToken 0x020000 /* Need to sqlite3DbFree() Expr.zToken */ +#define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */ +#define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x200000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x400000 /* Tree contains a TK_SELECT operator */ +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ +#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ +#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ +#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ +#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ +#define EP_FromDDL 0x40000000 /* Originates from sqlite_schema */ + /* 0x80000000 // Available */ + +/* The EP_Propagate mask is a set of properties that automatically propagate +** upwards into parent nodes. +*/ +#define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc) + +/* Macros can be used to test, set, or clear bits in the +** Expr.flags field. +*/ +#define ExprHasProperty(E,P) (((E)->flags&(P))!=0) +#define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) +#define ExprSetProperty(E,P) (E)->flags|=(P) +#define ExprClearProperty(E,P) (E)->flags&=~(P) +#define ExprAlwaysTrue(E) (((E)->flags&(EP_OuterON|EP_IsTrue))==EP_IsTrue) +#define ExprAlwaysFalse(E) (((E)->flags&(EP_OuterON|EP_IsFalse))==EP_IsFalse) + +/* Macros used to ensure that the correct members of unions are accessed +** in Expr. +*/ +#define ExprUseUToken(E) (((E)->flags&EP_IntValue)==0) +#define ExprUseUValue(E) (((E)->flags&EP_IntValue)!=0) +#define ExprUseXList(E) (((E)->flags&EP_xIsSelect)==0) +#define ExprUseXSelect(E) (((E)->flags&EP_xIsSelect)!=0) +#define ExprUseYTab(E) (((E)->flags&(EP_WinFunc|EP_Subrtn))==0) +#define ExprUseYWin(E) (((E)->flags&EP_WinFunc)!=0) +#define ExprUseYSub(E) (((E)->flags&EP_Subrtn)!=0) + +/* Flags for use with Expr.vvaFlags +*/ +#define EP_NoReduce 0x01 /* Cannot EXPRDUP_REDUCE this Expr */ +#define EP_Immutable 0x02 /* Do not change this Expr node */ + +/* The ExprSetVVAProperty() macro is used for Verification, Validation, +** and Accreditation only. It works like ExprSetProperty() during VVA +** processes but is a no-op for delivery. +*/ +#ifdef SQLITE_DEBUG +# define ExprSetVVAProperty(E,P) (E)->vvaFlags|=(P) +# define ExprHasVVAProperty(E,P) (((E)->vvaFlags&(P))!=0) +# define ExprClearVVAProperties(E) (E)->vvaFlags = 0 +#else +# define ExprSetVVAProperty(E,P) +# define ExprHasVVAProperty(E,P) 0 +# define ExprClearVVAProperties(E) +#endif + +/* +** Macros to determine the number of bytes required by a normal Expr +** struct, an Expr struct with the EP_Reduced flag set in Expr.flags +** and an Expr struct with the EP_TokenOnly flag set. +*/ +#define EXPR_FULLSIZE sizeof(Expr) /* Full size */ +#define EXPR_REDUCEDSIZE offsetof(Expr,iTable) /* Common features */ +#define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */ + +/* +** Flags passed to the sqlite3ExprDup() function. See the header comment +** above sqlite3ExprDup() for details. +*/ +#define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ + +/* +** True if the expression passed as an argument was a function with +** an OVER() clause (a window function). +*/ +#ifdef SQLITE_OMIT_WINDOWFUNC +# define IsWindowFunc(p) 0 +#else +# define IsWindowFunc(p) ( \ + ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ + ) +#endif + +/* +** A list of expressions. Each expression may optionally have a +** name. An expr/name combination can be used in several ways, such +** as the list of "expr AS ID" fields following a "SELECT" or in the +** list of "ID = expr" items in an UPDATE. A list of expressions can +** also be used as the argument to a function, in which case the a.zName +** field is not used. +** +** In order to try to keep memory usage down, the Expr.a.zEName field +** is used for multiple purposes: +** +** eEName Usage +** ---------- ------------------------- +** ENAME_NAME (1) the AS of result set column +** (2) COLUMN= of an UPDATE +** +** ENAME_TAB DB.TABLE.NAME used to resolve names +** of subqueries +** +** ENAME_SPAN Text of the original result set +** expression. +*/ +struct ExprList { + int nExpr; /* Number of expressions on the list */ + int nAlloc; /* Number of a[] slots allocated */ + struct ExprList_item { /* For each expression in the list */ + Expr *pExpr; /* The parse tree for this expression */ + char *zEName; /* Token associated with this expression */ + struct { + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ + unsigned eEName :2; /* Meaning of zEName */ + unsigned done :1; /* Indicates when processing is finished */ + unsigned reusable :1; /* Constant expression is reusable */ + unsigned bSorterRef :1; /* Defer evaluation until after sorting */ + unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */ + unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */ + unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */ + unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should + ** not be expanded by "*" in parent queries */ + } fg; + union { + struct { /* Used by any ExprList other than Parse.pConsExpr */ + u16 iOrderByCol; /* For ORDER BY, column number in result set */ + u16 iAlias; /* Index into Parse.aAlias[] for zName */ + } x; + int iConstExprReg; /* Register in which Expr value is cached. Used only + ** by Parse.pConstExpr */ + } u; + } a[1]; /* One slot for each expression in the list */ +}; + +/* +** Allowed values for Expr.a.eEName +*/ +#define ENAME_NAME 0 /* The AS clause of a result set */ +#define ENAME_SPAN 1 /* Complete text of the result set expression */ +#define ENAME_TAB 2 /* "DB.TABLE.NAME" for the result set */ + +/* +** An instance of this structure can hold a simple list of identifiers, +** such as the list "a,b,c" in the following statements: +** +** INSERT INTO t(a,b,c) VALUES ...; +** CREATE INDEX idx ON t(a,b,c); +** CREATE TRIGGER trig BEFORE UPDATE ON t(a,b,c) ...; +** +** The IdList.a.idx field is used when the IdList represents the list of +** column names after a table name in an INSERT statement. In the statement +** +** INSERT INTO t(a,b,c) ... +** +** If "a" is the k-th column of table "t", then IdList.a[0].idx==k. +*/ +struct IdList { + int nId; /* Number of identifiers on the list */ + u8 eU4; /* Which element of a.u4 is valid */ + struct IdList_item { + char *zName; /* Name of the identifier */ + union { + int idx; /* Index in some Table.aCol[] of a column named zName */ + Expr *pExpr; /* Expr to implement a USING variable -- NOT USED */ + } u4; + } a[1]; +}; + +/* +** Allowed values for IdList.eType, which determines which value of the a.u4 +** is valid. +*/ +#define EU4_NONE 0 /* Does not use IdList.a.u4 */ +#define EU4_IDX 1 /* Uses IdList.a.u4.idx */ +#define EU4_EXPR 2 /* Uses IdList.a.u4.pExpr -- NOT CURRENTLY USED */ + +/* +** The SrcItem object represents a single term in the FROM clause of a query. +** The SrcList object is mostly an array of SrcItems. +** +** Union member validity: +** +** u1.zIndexedBy fg.isIndexedBy && !fg.isTabFunc +** u1.pFuncArg fg.isTabFunc && !fg.isIndexedBy +** u2.pIBIndex fg.isIndexedBy && !fg.isCte +** u2.pCteUse fg.isCte && !fg.isIndexedBy +*/ +struct SrcItem { + Schema *pSchema; /* Schema to which this item is fixed */ + char *zDatabase; /* Name of database holding this table */ + char *zName; /* Name of the table */ + char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */ + Table *pTab; /* An SQL table corresponding to zName */ + Select *pSelect; /* A SELECT statement used in place of a table name */ + int addrFillSub; /* Address of subroutine to manifest a subquery */ + int regReturn; /* Register holding return address of addrFillSub */ + int regResult; /* Registers holding results of a co-routine */ + struct { + u8 jointype; /* Type of join between this table and the previous */ + unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ + unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ + unsigned isTabFunc :1; /* True if table-valued-function syntax */ + unsigned isCorrelated :1; /* True if sub-query is correlated */ + unsigned isMaterialized:1; /* This is a materialized view */ + unsigned viaCoroutine :1; /* Implemented as a co-routine */ + unsigned isRecursive :1; /* True for recursive reference in WITH */ + unsigned fromDDL :1; /* Comes from sqlite_schema */ + unsigned isCte :1; /* This is a CTE */ + unsigned notCte :1; /* This item may not match a CTE */ + unsigned isUsing :1; /* u3.pUsing is valid */ + unsigned isOn :1; /* u3.pOn was once valid and non-NULL */ + unsigned isSynthUsing :1; /* u3.pUsing is synthensized from NATURAL */ + unsigned isNestedFrom :1; /* pSelect is a SF_NestedFrom subquery */ + } fg; + int iCursor; /* The VDBE cursor number used to access this table */ + union { + Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */ + IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */ + } u3; + Bitmask colUsed; /* Bit N (1<" clause */ + ExprList *pFuncArg; /* Arguments to table-valued-function */ + } u1; + union { + Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */ + CteUse *pCteUse; /* CTE Usage info info fg.isCte is true */ + } u2; +}; + +/* +** The OnOrUsing object represents either an ON clause or a USING clause. +** It can never be both at the same time, but it can be neither. +*/ +struct OnOrUsing { + Expr *pOn; /* The ON clause of a join */ + IdList *pUsing; /* The USING clause of a join */ +}; + +/* +** The following structure describes the FROM clause of a SELECT statement. +** Each table or subquery in the FROM clause is a separate element of +** the SrcList.a[] array. +** +** With the addition of multiple database support, the following structure +** can also be used to describe a particular table such as the table that +** is modified by an INSERT, DELETE, or UPDATE statement. In standard SQL, +** such a table must be a simple name: ID. But in SQLite, the table can +** now be identified by a database name, a dot, then the table name: ID.ID. +** +** The jointype starts out showing the join type between the current table +** and the next table on the list. The parser builds the list this way. +** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each +** jointype expresses the join between the table and the previous table. +** +** In the colUsed field, the high-order bit (bit 63) is set if the table +** contains more than 63 columns and the 64-th or later column is used. +*/ +struct SrcList { + int nSrc; /* Number of tables or subqueries in the FROM clause */ + u32 nAlloc; /* Number of entries allocated in a[] below */ + SrcItem a[1]; /* One entry for each identifier on the list */ +}; + +/* +** Permitted values of the SrcList.a.jointype field +*/ +#define JT_INNER 0x01 /* Any kind of inner or cross join */ +#define JT_CROSS 0x02 /* Explicit use of the CROSS keyword */ +#define JT_NATURAL 0x04 /* True for a "natural" join */ +#define JT_LEFT 0x08 /* Left outer join */ +#define JT_RIGHT 0x10 /* Right outer join */ +#define JT_OUTER 0x20 /* The "OUTER" keyword is present */ +#define JT_LTORJ 0x40 /* One of the LEFT operands of a RIGHT JOIN + ** Mnemonic: Left Table Of Right Join */ +#define JT_ERROR 0x80 /* unknown or unsupported join type */ + +/* +** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() +** and the WhereInfo.wctrlFlags member. +** +** Value constraints (enforced via assert()): +** WHERE_USE_LIMIT == SF_FixedLimit +*/ +#define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */ +#define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */ +#define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */ +#define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */ +#define WHERE_ONEPASS_MULTIROW 0x0008 /* ONEPASS is ok with multiple rows */ +#define WHERE_DUPLICATES_OK 0x0010 /* Ok to return a row more than once */ +#define WHERE_OR_SUBCLAUSE 0x0020 /* Processing a sub-WHERE as part of + ** the OR optimization */ +#define WHERE_GROUPBY 0x0040 /* pOrderBy is really a GROUP BY */ +#define WHERE_DISTINCTBY 0x0080 /* pOrderby is really a DISTINCT clause */ +#define WHERE_WANT_DISTINCT 0x0100 /* All output needs to be distinct */ +#define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ +#define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */ +#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ +#define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */ + /* 0x2000 not currently used */ +#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ + /* 0x8000 not currently used */ + +/* Allowed return values from sqlite3WhereIsDistinct() +*/ +#define WHERE_DISTINCT_NOOP 0 /* DISTINCT keyword not used */ +#define WHERE_DISTINCT_UNIQUE 1 /* No duplicates */ +#define WHERE_DISTINCT_ORDERED 2 /* All duplicates are adjacent */ +#define WHERE_DISTINCT_UNORDERED 3 /* Duplicates are scattered */ + +/* +** A NameContext defines a context in which to resolve table and column +** names. The context consists of a list of tables (the pSrcList) field and +** a list of named expression (pEList). The named expression list may +** be NULL. The pSrc corresponds to the FROM clause of a SELECT or +** to the table being operated on by INSERT, UPDATE, or DELETE. The +** pEList corresponds to the result set of a SELECT and is NULL for +** other statements. +** +** NameContexts can be nested. When resolving names, the inner-most +** context is searched first. If no match is found, the next outer +** context is checked. If there is still no match, the next context +** is checked. This process continues until either a match is found +** or all contexts are check. When a match is found, the nRef member of +** the context containing the match is incremented. +** +** Each subquery gets a new NameContext. The pNext field points to the +** NameContext in the parent query. Thus the process of scanning the +** NameContext list corresponds to searching through successively outer +** subqueries looking for a match. +*/ +struct NameContext { + Parse *pParse; /* The parser */ + SrcList *pSrcList; /* One or more tables used to resolve names */ + union { + ExprList *pEList; /* Optional list of result-set columns */ + AggInfo *pAggInfo; /* Information about aggregates at this level */ + Upsert *pUpsert; /* ON CONFLICT clause information from an upsert */ + int iBaseReg; /* For TK_REGISTER when parsing RETURNING */ + } uNC; + NameContext *pNext; /* Next outer name context. NULL for outermost */ + int nRef; /* Number of names resolved by this context */ + int nNcErr; /* Number of errors encountered while resolving names */ + int ncFlags; /* Zero or more NC_* flags defined below */ + Select *pWinSelect; /* SELECT statement for any window functions */ +}; + +/* +** Allowed values for the NameContext, ncFlags field. +** +** Value constraints (all checked via assert()): +** NC_HasAgg == SF_HasAgg == EP_Agg +** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** NC_OrderAgg == SF_OrderByReqd == SQLITE_FUNC_ANYORDER +** NC_HasWin == EP_Win +** +*/ +#define NC_AllowAgg 0x000001 /* Aggregate functions are allowed here */ +#define NC_PartIdx 0x000002 /* True if resolving a partial index WHERE */ +#define NC_IsCheck 0x000004 /* True if resolving a CHECK constraint */ +#define NC_GenCol 0x000008 /* True for a GENERATED ALWAYS AS clause */ +#define NC_HasAgg 0x000010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x000020 /* True if resolving columns of CREATE INDEX */ +#define NC_SelfRef 0x00002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */ +#define NC_VarSelect 0x000040 /* A correlated subquery has been seen */ +#define NC_UEList 0x000080 /* True if uNC.pEList is used */ +#define NC_UAggInfo 0x000100 /* True if uNC.pAggInfo is used */ +#define NC_UUpsert 0x000200 /* True if uNC.pUpsert is used */ +#define NC_UBaseReg 0x000400 /* True if uNC.iBaseReg is used */ +#define NC_MinMaxAgg 0x001000 /* min/max aggregates seen. See note above */ +#define NC_Complex 0x002000 /* True if a function or subquery seen */ +#define NC_AllowWin 0x004000 /* Window functions are allowed here */ +#define NC_HasWin 0x008000 /* One or more window functions seen */ +#define NC_IsDDL 0x010000 /* Resolving names in a CREATE statement */ +#define NC_InAggFunc 0x020000 /* True if analyzing arguments to an agg func */ +#define NC_FromDDL 0x040000 /* SQL text comes from sqlite_schema */ +#define NC_NoSelect 0x080000 /* Do not descend into sub-selects */ +#define NC_OrderAgg 0x8000000 /* Has an aggregate other than count/min/max */ + +/* +** An instance of the following object describes a single ON CONFLICT +** clause in an upsert. +** +** The pUpsertTarget field is only set if the ON CONFLICT clause includes +** conflict-target clause. (In "ON CONFLICT(a,b)" the "(a,b)" is the +** conflict-target clause.) The pUpsertTargetWhere is the optional +** WHERE clause used to identify partial unique indexes. +** +** pUpsertSet is the list of column=expr terms of the UPDATE statement. +** The pUpsertSet field is NULL for a ON CONFLICT DO NOTHING. The +** pUpsertWhere is the WHERE clause for the UPDATE and is NULL if the +** WHERE clause is omitted. +*/ +struct Upsert { + ExprList *pUpsertTarget; /* Optional description of conflict target */ + Expr *pUpsertTargetWhere; /* WHERE clause for partial index targets */ + ExprList *pUpsertSet; /* The SET clause from an ON CONFLICT UPDATE */ + Expr *pUpsertWhere; /* WHERE clause for the ON CONFLICT UPDATE */ + Upsert *pNextUpsert; /* Next ON CONFLICT clause in the list */ + u8 isDoUpdate; /* True for DO UPDATE. False for DO NOTHING */ + /* Above this point is the parse tree for the ON CONFLICT clauses. + ** The next group of fields stores intermediate data. */ + void *pToFree; /* Free memory when deleting the Upsert object */ + /* All fields above are owned by the Upsert object and must be freed + ** when the Upsert is destroyed. The fields below are used to transfer + ** information from the INSERT processing down into the UPDATE processing + ** while generating code. The fields below are owned by the INSERT + ** statement and will be freed by INSERT processing. */ + Index *pUpsertIdx; /* UNIQUE constraint specified by pUpsertTarget */ + SrcList *pUpsertSrc; /* Table to be updated */ + int regData; /* First register holding array of VALUES */ + int iDataCur; /* Index of the data cursor */ + int iIdxCur; /* Index of the first index cursor */ +}; + +/* +** An instance of the following structure contains all information +** needed to generate code for a single SELECT statement. +** +** See the header comment on the computeLimitRegisters() routine for a +** detailed description of the meaning of the iLimit and iOffset fields. +** +** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes. +** These addresses must be stored so that we can go back and fill in +** the P4_KEYINFO and P2 parameters later. Neither the KeyInfo nor +** the number of columns in P2 can be computed at the same time +** as the OP_OpenEphm instruction is coded because not +** enough information about the compound query is known at that point. +** The KeyInfo for addrOpenTran[0] and [1] contains collating sequences +** for the result set. The KeyInfo for addrOpenEphm[2] contains collating +** sequences for the ORDER BY clause. +*/ +struct Select { + u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ + LogEst nSelectRow; /* Estimated number of result rows */ + u32 selFlags; /* Various SF_* values */ + int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ + u32 selId; /* Unique identifier number for this SELECT */ + int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ + ExprList *pEList; /* The fields of the result */ + SrcList *pSrc; /* The FROM clause */ + Expr *pWhere; /* The WHERE clause */ + ExprList *pGroupBy; /* The GROUP BY clause */ + Expr *pHaving; /* The HAVING clause */ + ExprList *pOrderBy; /* The ORDER BY clause */ + Select *pPrior; /* Prior select in a compound select statement */ + Select *pNext; /* Next select to the left in a compound */ + Expr *pLimit; /* LIMIT expression. NULL means not used. */ + With *pWith; /* WITH clause attached to this select. Or NULL. */ +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin; /* List of window functions */ + Window *pWinDefn; /* List of named window definitions */ +#endif +}; + +/* +** Allowed values for Select.selFlags. The "SF" prefix stands for +** "Select Flag". +** +** Value constraints (all checked via assert()) +** SF_HasAgg == NC_HasAgg +** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX +** SF_OrderByReqd == NC_OrderAgg == SQLITE_FUNC_ANYORDER +** SF_FixedLimit == WHERE_USE_LIMIT +*/ +#define SF_Distinct 0x0000001 /* Output should be DISTINCT */ +#define SF_All 0x0000002 /* Includes the ALL keyword */ +#define SF_Resolved 0x0000004 /* Identifiers have been resolved */ +#define SF_Aggregate 0x0000008 /* Contains agg functions or a GROUP BY */ +#define SF_HasAgg 0x0000010 /* Contains aggregate functions */ +#define SF_UsesEphemeral 0x0000020 /* Uses the OpenEphemeral opcode */ +#define SF_Expanded 0x0000040 /* sqlite3SelectExpand() called on this */ +#define SF_HasTypeInfo 0x0000080 /* FROM subqueries have Table metadata */ +#define SF_Compound 0x0000100 /* Part of a compound query */ +#define SF_Values 0x0000200 /* Synthesized from VALUES clause */ +#define SF_MultiValue 0x0000400 /* Single VALUES term with multiple rows */ +#define SF_NestedFrom 0x0000800 /* Part of a parenthesized FROM clause */ +#define SF_MinMaxAgg 0x0001000 /* Aggregate containing min() or max() */ +#define SF_Recursive 0x0002000 /* The recursive part of a recursive CTE */ +#define SF_FixedLimit 0x0004000 /* nSelectRow set by a constant LIMIT */ +#define SF_MaybeConvert 0x0008000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Converted 0x0010000 /* By convertCompoundSelectToSubquery() */ +#define SF_IncludeHidden 0x0020000 /* Include hidden columns in output */ +#define SF_ComplexResult 0x0040000 /* Result contains subquery or function */ +#define SF_WhereBegin 0x0080000 /* Really a WhereBegin() call. Debug Only */ +#define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */ +#define SF_View 0x0200000 /* SELECT statement is a view */ +#define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */ +#define SF_UFSrcCheck 0x0800000 /* Check pSrc as required by UPDATE...FROM */ +#define SF_PushDown 0x1000000 /* SELECT has be modified by push-down opt */ +#define SF_MultiPart 0x2000000 /* Has multiple incompatible PARTITIONs */ +#define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ +#define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */ + +/* True if S exists and has SF_NestedFrom */ +#define IsNestedFrom(S) ((S)!=0 && ((S)->selFlags&SF_NestedFrom)!=0) + +/* +** The results of a SELECT can be distributed in several ways, as defined +** by one of the following macros. The "SRT" prefix means "SELECT Result +** Type". +** +** SRT_Union Store results as a key in a temporary index +** identified by pDest->iSDParm. +** +** SRT_Except Remove results from the temporary index pDest->iSDParm. +** +** SRT_Exists Store a 1 in memory cell pDest->iSDParm if the result +** set is not empty. +** +** SRT_Discard Throw the results away. This is used by SELECT +** statements within triggers whose only purpose is +** the side-effects of functions. +** +** SRT_Output Generate a row of output (using the OP_ResultRow +** opcode) for each row in the result set. +** +** SRT_Mem Only valid if the result is a single column. +** Store the first column of the first result row +** in register pDest->iSDParm then abandon the rest +** of the query. This destination implies "LIMIT 1". +** +** SRT_Set The result must be a single column. Store each +** row of result as the key in table pDest->iSDParm. +** Apply the affinity pDest->affSdst before storing +** results. Used to implement "IN (SELECT ...)". +** +** SRT_EphemTab Create an temporary table pDest->iSDParm and store +** the result there. The cursor is left open after +** returning. This is like SRT_Table except that +** this destination uses OP_OpenEphemeral to create +** the table first. +** +** SRT_Coroutine Generate a co-routine that returns a new row of +** results each time it is invoked. The entry point +** of the co-routine is stored in register pDest->iSDParm +** and the result row is stored in pDest->nDest registers +** starting with pDest->iSdst. +** +** SRT_Table Store results in temporary table pDest->iSDParm. +** SRT_Fifo This is like SRT_EphemTab except that the table +** is assumed to already be open. SRT_Fifo has +** the additional property of being able to ignore +** the ORDER BY clause. +** +** SRT_DistFifo Store results in a temporary table pDest->iSDParm. +** But also use temporary table pDest->iSDParm+1 as +** a record of all prior results and ignore any duplicate +** rows. Name means: "Distinct Fifo". +** +** SRT_Queue Store results in priority queue pDest->iSDParm (really +** an index). Append a sequence number so that all entries +** are distinct. +** +** SRT_DistQueue Store results in priority queue pDest->iSDParm only if +** the same record has never been stored before. The +** index at pDest->iSDParm+1 hold all prior stores. +** +** SRT_Upfrom Store results in the temporary table already opened by +** pDest->iSDParm. If (pDest->iSDParm<0), then the temp +** table is an intkey table - in this case the first +** column returned by the SELECT is used as the integer +** key. If (pDest->iSDParm>0), then the table is an index +** table. (pDest->iSDParm) is the number of key columns in +** each index record in this case. +*/ +#define SRT_Union 1 /* Store result as keys in an index */ +#define SRT_Except 2 /* Remove result from a UNION index */ +#define SRT_Exists 3 /* Store 1 if the result is not empty */ +#define SRT_Discard 4 /* Do not save the results anywhere */ +#define SRT_DistFifo 5 /* Like SRT_Fifo, but unique results only */ +#define SRT_DistQueue 6 /* Like SRT_Queue, but unique results only */ + +/* The DISTINCT clause is ignored for all of the above. Not that +** IgnorableDistinct() implies IgnorableOrderby() */ +#define IgnorableDistinct(X) ((X->eDest)<=SRT_DistQueue) + +#define SRT_Queue 7 /* Store result in an queue */ +#define SRT_Fifo 8 /* Store result as data with an automatic rowid */ + +/* The ORDER BY clause is ignored for all of the above */ +#define IgnorableOrderby(X) ((X->eDest)<=SRT_Fifo) + +#define SRT_Output 9 /* Output each row of result */ +#define SRT_Mem 10 /* Store result in a memory cell */ +#define SRT_Set 11 /* Store results as keys in an index */ +#define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */ +#define SRT_Coroutine 13 /* Generate a single row of result */ +#define SRT_Table 14 /* Store result as data with an automatic rowid */ +#define SRT_Upfrom 15 /* Store result as data with rowid */ + +/* +** An instance of this object describes where to put of the results of +** a SELECT statement. +*/ +struct SelectDest { + u8 eDest; /* How to dispose of the results. One of SRT_* above. */ + int iSDParm; /* A parameter used by the eDest disposal method */ + int iSDParm2; /* A second parameter for the eDest disposal method */ + int iSdst; /* Base register where results are written */ + int nSdst; /* Number of registers allocated */ + char *zAffSdst; /* Affinity used when eDest==SRT_Set */ + ExprList *pOrderBy; /* Key columns for SRT_Queue and SRT_DistQueue */ +}; + +/* +** During code generation of statements that do inserts into AUTOINCREMENT +** tables, the following information is attached to the Table.u.autoInc.p +** pointer of each autoincrement table to record some side information that +** the code generator needs. We have to keep per-table autoincrement +** information in case inserts are done within triggers. Triggers do not +** normally coordinate their activities, but we do need to coordinate the +** loading and saving of autoincrement information. +*/ +struct AutoincInfo { + AutoincInfo *pNext; /* Next info block in a list of them all */ + Table *pTab; /* Table this info block refers to */ + int iDb; /* Index in sqlite3.aDb[] of database holding pTab */ + int regCtr; /* Memory register holding the rowid counter */ +}; + +/* +** At least one instance of the following structure is created for each +** trigger that may be fired while parsing an INSERT, UPDATE or DELETE +** statement. All such objects are stored in the linked list headed at +** Parse.pTriggerPrg and deleted once statement compilation has been +** completed. +** +** A Vdbe sub-program that implements the body and WHEN clause of trigger +** TriggerPrg.pTrigger, assuming a default ON CONFLICT clause of +** TriggerPrg.orconf, is stored in the TriggerPrg.pProgram variable. +** The Parse.pTriggerPrg list never contains two entries with the same +** values for both pTrigger and orconf. +** +** The TriggerPrg.aColmask[0] variable is set to a mask of old.* columns +** accessed (or set to 0 for triggers fired as a result of INSERT +** statements). Similarly, the TriggerPrg.aColmask[1] variable is set to +** a mask of new.* columns used by the program. +*/ +struct TriggerPrg { + Trigger *pTrigger; /* Trigger this program was coded from */ + TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */ + SubProgram *pProgram; /* Program implementing pTrigger/orconf */ + int orconf; /* Default ON CONFLICT policy */ + u32 aColmask[2]; /* Masks of old.*, new.* columns accessed */ +}; + +/* +** The yDbMask datatype for the bitmask of all attached databases. +*/ +#if SQLITE_MAX_ATTACHED>30 + typedef unsigned char yDbMask[(SQLITE_MAX_ATTACHED+9)/8]; +# define DbMaskTest(M,I) (((M)[(I)/8]&(1<<((I)&7)))!=0) +# define DbMaskZero(M) memset((M),0,sizeof(M)) +# define DbMaskSet(M,I) (M)[(I)/8]|=(1<<((I)&7)) +# define DbMaskAllZero(M) sqlite3DbMaskAllZero(M) +# define DbMaskNonZero(M) (sqlite3DbMaskAllZero(M)==0) +#else + typedef unsigned int yDbMask; +# define DbMaskTest(M,I) (((M)&(((yDbMask)1)<<(I)))!=0) +# define DbMaskZero(M) (M)=0 +# define DbMaskSet(M,I) (M)|=(((yDbMask)1)<<(I)) +# define DbMaskAllZero(M) (M)==0 +# define DbMaskNonZero(M) (M)!=0 +#endif + +/* +** An instance of the ParseCleanup object specifies an operation that +** should be performed after parsing to deallocation resources obtained +** during the parse and which are no longer needed. +*/ +struct ParseCleanup { + ParseCleanup *pNext; /* Next cleanup task */ + void *pPtr; /* Pointer to object to deallocate */ + void (*xCleanup)(sqlite3*,void*); /* Deallocation routine */ +}; + +/* +** An SQL parser context. A copy of this structure is passed through +** the parser and down into all the parser action routine in order to +** carry around information that is global to the entire parse. +** +** The structure is divided into two parts. When the parser and code +** generate call themselves recursively, the first part of the structure +** is constant but the second part is reset at the beginning and end of +** each recursion. +** +** The nTableLock and aTableLock variables are only used if the shared-cache +** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are +** used to store the set of table-locks required by the statement being +** compiled. Function sqlite3TableLock() is used to add entries to the +** list. +*/ +struct Parse { + sqlite3 *db; /* The main database structure */ + char *zErrMsg; /* An error message */ + Vdbe *pVdbe; /* An engine for executing database bytecode */ + int rc; /* Return code from execution */ + u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ + u8 checkSchema; /* Causes schema cookie check after an error */ + u8 nested; /* Number of nested calls to the parser/code generator */ + u8 nTempReg; /* Number of temporary registers in aTempReg[] */ + u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ + u8 mayAbort; /* True if statement may throw an ABORT exception */ + u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ + u8 okConstFactor; /* OK to factor out constants */ + u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 disableVtab; /* Disable all virtual tables for this parse */ + u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) + u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */ +#endif + int nRangeReg; /* Size of the temporary register block */ + int iRangeReg; /* First register in temporary register block */ + int nErr; /* Number of errors seen */ + int nTab; /* Number of previously allocated VDBE cursors */ + int nMem; /* Number of memory cells used so far */ + int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ + int iSelfTab; /* Table associated with an index on expr, or negative + ** of the base register during check-constraint eval */ + int nLabel; /* The *negative* of the number of labels used */ + int nLabelAlloc; /* Number of slots in aLabel */ + int *aLabel; /* Space to hold the labels */ + ExprList *pConstExpr;/* Constant expressions */ + Token constraintName;/* Name of the constraint currently being parsed */ + yDbMask writeMask; /* Start a write transaction on these databases */ + yDbMask cookieMask; /* Bitmask of schema verified databases */ + int regRowid; /* Register holding rowid of CREATE TABLE entry */ + int regRoot; /* Register holding root page number for new objects */ + int nMaxArg; /* Max args passed to user function by sub-program */ + int nSelect; /* Number of SELECT stmts. Counter for Select.selId */ +#ifndef SQLITE_OMIT_SHARED_CACHE + int nTableLock; /* Number of locks in aTableLock */ + TableLock *aTableLock; /* Required table locks for shared-cache mode */ +#endif + AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ + Parse *pToplevel; /* Parse structure for main program (or NULL) */ + Table *pTriggerTab; /* Table triggers are being coded for */ + TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ + ParseCleanup *pCleanup; /* List of cleanup operations to run after parse */ + union { + int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ + Returning *pReturning; /* The RETURNING clause */ + } u1; + u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ + u32 oldmask; /* Mask of old.* columns referenced */ + u32 newmask; /* Mask of new.* columns referenced */ + u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ + u8 bReturning; /* Coding a RETURNING trigger */ + u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ + u8 disableTriggers; /* True to disable triggers */ + + /************************************************************************** + ** Fields above must be initialized to zero. The fields that follow, + ** down to the beginning of the recursive section, do not need to be + ** initialized as they will be set before being used. The boundary is + ** determined by offsetof(Parse,aTempReg). + **************************************************************************/ + + int aTempReg[8]; /* Holding area for temporary registers */ + Parse *pOuterParse; /* Outer Parse object when nested */ + Token sNameToken; /* Token with unqualified schema object name */ + + /************************************************************************ + ** Above is constant between recursions. Below is reset before and after + ** each recursion. The boundary between these two regions is determined + ** using offsetof(Parse,sLastToken) so the sLastToken field must be the + ** first field in the recursive region. + ************************************************************************/ + + Token sLastToken; /* The last token parsed */ + ynVar nVar; /* Number of '?' variables seen in the SQL so far */ + u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ + u8 explain; /* True if the EXPLAIN flag is found on the query */ + u8 eParseMode; /* PARSE_MODE_XXX constant */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int nVtabLock; /* Number of virtual tables to lock */ +#endif + int nHeight; /* Expression tree height of current sub-select */ +#ifndef SQLITE_OMIT_EXPLAIN + int addrExplain; /* Address of current OP_Explain opcode */ +#endif + VList *pVList; /* Mapping between variable names and numbers */ + Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ + const char *zTail; /* All SQL text past the last semicolon parsed */ + Table *pNewTable; /* A table being constructed by CREATE TABLE */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ + Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ + const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + Token sArg; /* Complete text of a module argument */ + Table **apVtabLock; /* Pointer to virtual tables needing locking */ +#endif + With *pWith; /* Current WITH clause, or NULL */ +#ifndef SQLITE_OMIT_ALTERTABLE + RenameToken *pRename; /* Tokens subject to renaming by ALTER TABLE */ +#endif +}; + +/* Allowed values for Parse.eParseMode +*/ +#define PARSE_MODE_NORMAL 0 +#define PARSE_MODE_DECLARE_VTAB 1 +#define PARSE_MODE_RENAME 2 +#define PARSE_MODE_UNMAP 3 + +/* +** Sizes and pointers of various parts of the Parse object. +*/ +#define PARSE_HDR(X) (((char*)(X))+offsetof(Parse,zErrMsg)) +#define PARSE_HDR_SZ (offsetof(Parse,aTempReg)-offsetof(Parse,zErrMsg)) /* Recursive part w/o aColCache*/ +#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */ +#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */ +#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */ + +/* +** Return true if currently inside an sqlite3_declare_vtab() call. +*/ +#ifdef SQLITE_OMIT_VIRTUALTABLE + #define IN_DECLARE_VTAB 0 +#else + #define IN_DECLARE_VTAB (pParse->eParseMode==PARSE_MODE_DECLARE_VTAB) +#endif + +#if defined(SQLITE_OMIT_ALTERTABLE) + #define IN_RENAME_OBJECT 0 +#else + #define IN_RENAME_OBJECT (pParse->eParseMode>=PARSE_MODE_RENAME) +#endif + +#if defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE) + #define IN_SPECIAL_PARSE 0 +#else + #define IN_SPECIAL_PARSE (pParse->eParseMode!=PARSE_MODE_NORMAL) +#endif + +/* +** An instance of the following structure can be declared on a stack and used +** to save the Parse.zAuthContext value so that it can be restored later. +*/ +struct AuthContext { + const char *zAuthContext; /* Put saved Parse.zAuthContext here */ + Parse *pParse; /* The Parse structure */ +}; + +/* +** Bitfield flags for P5 value in various opcodes. +** +** Value constraints (enforced via assert()): +** OPFLAG_LENGTHARG == SQLITE_FUNC_LENGTH +** OPFLAG_TYPEOFARG == SQLITE_FUNC_TYPEOF +** OPFLAG_BULKCSR == BTREE_BULKLOAD +** OPFLAG_SEEKEQ == BTREE_SEEK_EQ +** OPFLAG_FORDELETE == BTREE_FORDELETE +** OPFLAG_SAVEPOSITION == BTREE_SAVEPOSITION +** OPFLAG_AUXDELETE == BTREE_AUXDELETE +*/ +#define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ + /* Also used in P2 (not P5) of OP_Delete */ +#define OPFLAG_NOCHNG 0x01 /* OP_VColumn nochange for UPDATE */ +#define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ +#define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */ +#define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ +#define OPFLAG_APPEND 0x08 /* This is likely to be an append */ +#define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */ +#define OPFLAG_ISNOOP 0x40 /* OP_Delete does pre-update-hook only */ +#define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */ +#define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */ +#define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */ +#define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */ +#define OPFLAG_FORDELETE 0x08 /* OP_Open should use BTREE_FORDELETE */ +#define OPFLAG_P2ISREG 0x10 /* P2 to OP_Open** is a register number */ +#define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */ +#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete/Insert: save cursor pos */ +#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */ +#define OPFLAG_NOCHNG_MAGIC 0x6d /* OP_MakeRecord: serialtype 10 is ok */ +#define OPFLAG_PREFORMAT 0x80 /* OP_Insert uses preformatted cell */ + +/* +** Each trigger present in the database schema is stored as an instance of +** struct Trigger. +** +** Pointers to instances of struct Trigger are stored in two ways. +** 1. In the "trigHash" hash table (part of the sqlite3* that represents the +** database). This allows Trigger structures to be retrieved by name. +** 2. All triggers associated with a single table form a linked list, using the +** pNext member of struct Trigger. A pointer to the first element of the +** linked list is stored as the "pTrigger" member of the associated +** struct Table. +** +** The "step_list" member points to the first element of a linked list +** containing the SQL statements specified as the trigger program. +*/ +struct Trigger { + char *zName; /* The name of the trigger */ + char *table; /* The table or view to which the trigger applies */ + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */ + u8 tr_tm; /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ + u8 bReturning; /* This trigger implements a RETURNING clause */ + Expr *pWhen; /* The WHEN clause of the expression (may be NULL) */ + IdList *pColumns; /* If this is an UPDATE OF trigger, + the is stored here */ + Schema *pSchema; /* Schema containing the trigger */ + Schema *pTabSchema; /* Schema containing the table */ + TriggerStep *step_list; /* Link list of trigger program steps */ + Trigger *pNext; /* Next trigger associated with the table */ +}; + +/* +** A trigger is either a BEFORE or an AFTER trigger. The following constants +** determine which. +** +** If there are multiple triggers, you might of some BEFORE and some AFTER. +** In that cases, the constants below can be ORed together. +*/ +#define TRIGGER_BEFORE 1 +#define TRIGGER_AFTER 2 + +/* +** An instance of struct TriggerStep is used to store a single SQL statement +** that is a part of a trigger-program. +** +** Instances of struct TriggerStep are stored in a singly linked list (linked +** using the "pNext" member) referenced by the "step_list" member of the +** associated struct Trigger instance. The first element of the linked list is +** the first step of the trigger-program. +** +** The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or +** "SELECT" statement. The meanings of the other members is determined by the +** value of "op" as follows: +** +** (op == TK_INSERT) +** orconf -> stores the ON CONFLICT algorithm +** pSelect -> The content to be inserted - either a SELECT statement or +** a VALUES clause. +** zTarget -> Dequoted name of the table to insert into. +** pIdList -> If this is an INSERT INTO ... () VALUES ... +** statement, then this stores the column-names to be +** inserted into. +** pUpsert -> The ON CONFLICT clauses for an Upsert +** +** (op == TK_DELETE) +** zTarget -> Dequoted name of the table to delete from. +** pWhere -> The WHERE clause of the DELETE statement if one is specified. +** Otherwise NULL. +** +** (op == TK_UPDATE) +** zTarget -> Dequoted name of the table to update. +** pWhere -> The WHERE clause of the UPDATE statement if one is specified. +** Otherwise NULL. +** pExprList -> A list of the columns to update and the expressions to update +** them to. See sqlite3Update() documentation of "pChanges" +** argument. +** +** (op == TK_SELECT) +** pSelect -> The SELECT statement +** +** (op == TK_RETURNING) +** pExprList -> The list of expressions that follow the RETURNING keyword. +** +*/ +struct TriggerStep { + u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT, + ** or TK_RETURNING */ + u8 orconf; /* OE_Rollback etc. */ + Trigger *pTrig; /* The trigger that this step is a part of */ + Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */ + char *zTarget; /* Target table for DELETE, UPDATE, INSERT */ + SrcList *pFrom; /* FROM clause for UPDATE statement (if any) */ + Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */ + ExprList *pExprList; /* SET clause for UPDATE, or RETURNING clause */ + IdList *pIdList; /* Column names for INSERT */ + Upsert *pUpsert; /* Upsert clauses on an INSERT */ + char *zSpan; /* Original SQL text of this command */ + TriggerStep *pNext; /* Next in the link-list */ + TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */ +}; + +/* +** Information about a RETURNING clause +*/ +struct Returning { + Parse *pParse; /* The parse that includes the RETURNING clause */ + ExprList *pReturnEL; /* List of expressions to return */ + Trigger retTrig; /* The transient trigger that implements RETURNING */ + TriggerStep retTStep; /* The trigger step */ + int iRetCur; /* Transient table holding RETURNING results */ + int nRetCol; /* Number of in pReturnEL after expansion */ + int iRetReg; /* Register array for holding a row of RETURNING */ +}; + +/* +** An objected used to accumulate the text of a string where we +** do not necessarily know how big the string will be in the end. +*/ +struct sqlite3_str { + sqlite3 *db; /* Optional database for lookaside. Can be NULL */ + char *zText; /* The string collected so far */ + u32 nAlloc; /* Amount of space allocated in zText */ + u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */ + u32 nChar; /* Length of the string so far */ + u8 accError; /* SQLITE_NOMEM or SQLITE_TOOBIG */ + u8 printfFlags; /* SQLITE_PRINTF flags below */ +}; +#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */ +#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */ +#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */ + +#define isMalloced(X) (((X)->printfFlags & SQLITE_PRINTF_MALLOCED)!=0) + + +/* +** A pointer to this structure is used to communicate information +** from sqlite3Init and OP_ParseSchema into the sqlite3InitCallback. +*/ +typedef struct { + sqlite3 *db; /* The database being initialized */ + char **pzErrMsg; /* Error message stored here */ + int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ + int rc; /* Result code stored here */ + u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ + Pgno mxPage; /* Maximum page number. 0 for no limit. */ +} InitData; + +/* +** Allowed values for mInitFlags +*/ +#define INITFLAG_AlterMask 0x0003 /* Types of ALTER */ +#define INITFLAG_AlterRename 0x0001 /* Reparse after a RENAME */ +#define INITFLAG_AlterDrop 0x0002 /* Reparse after a DROP COLUMN */ +#define INITFLAG_AlterAdd 0x0003 /* Reparse after an ADD COLUMN */ + +/* Tuning parameters are set using SQLITE_TESTCTRL_TUNE and are controlled +** on debug-builds of the CLI using ".testctrl tune ID VALUE". Tuning +** parameters are for temporary use during development, to help find +** optimial values for parameters in the query planner. The should not +** be used on trunk check-ins. They are a temporary mechanism available +** for transient development builds only. +** +** Tuning parameters are numbered starting with 1. +*/ +#define SQLITE_NTUNE 6 /* Should be zero for all trunk check-ins */ +#ifdef SQLITE_DEBUG +# define Tuning(X) (sqlite3Config.aTune[(X)-1]) +#else +# define Tuning(X) 0 +#endif + +/* +** Structure containing global configuration data for the SQLite library. +** +** This structure also contains some state information. +*/ +struct Sqlite3Config { + int bMemstat; /* True to enable memory status */ + u8 bCoreMutex; /* True to enable core mutexing */ + u8 bFullMutex; /* True to enable full mutexing */ + u8 bOpenUri; /* True to interpret filenames as URIs */ + u8 bUseCis; /* Use covering indices for full-scans */ + u8 bSmallMalloc; /* Avoid large memory allocations if true */ + u8 bExtraSchemaChecks; /* Verify type,name,tbl_name in schema */ + int mxStrlen; /* Maximum string length */ + int neverCorrupt; /* Database is always well-formed */ + int szLookaside; /* Default lookaside buffer size */ + int nLookaside; /* Default lookaside buffer count */ + int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ + sqlite3_mem_methods m; /* Low-level memory allocation interface */ + sqlite3_mutex_methods mutex; /* Low-level mutex interface */ + sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */ + void *pHeap; /* Heap storage space */ + int nHeap; /* Size of pHeap[] */ + int mnReq, mxReq; /* Min and max heap requests sizes */ + sqlite3_int64 szMmap; /* mmap() space per open file */ + sqlite3_int64 mxMmap; /* Maximum value for szMmap */ + void *pPage; /* Page cache memory */ + int szPage; /* Size of each page in pPage[] */ + int nPage; /* Number of pages in pPage[] */ + int mxParserStack; /* maximum depth of the parser stack */ + int sharedCacheEnabled; /* true if shared-cache mode enabled */ + u32 szPma; /* Maximum Sorter PMA size */ + /* The above might be initialized to non-zero. The following need to always + ** initially be zero, however. */ + int isInit; /* True after initialization has finished */ + int inProgress; /* True while initialization in progress */ + int isMutexInit; /* True after mutexes are initialized */ + int isMallocInit; /* True after malloc is initialized */ + int isPCacheInit; /* True after malloc is initialized */ + int nRefInitMutex; /* Number of users of pInitMutex */ + sqlite3_mutex *pInitMutex; /* Mutex used by sqlite3_initialize() */ + void (*xLog)(void*,int,const char*); /* Function for logging */ + void *pLogArg; /* First argument to xLog() */ +#ifdef SQLITE_ENABLE_SQLLOG + void(*xSqllog)(void*,sqlite3*,const char*, int); + void *pSqllogArg; +#endif +#ifdef SQLITE_VDBE_COVERAGE + /* The following callback (if not NULL) is invoked on every VDBE branch + ** operation. Set the callback using SQLITE_TESTCTRL_VDBE_COVERAGE. + */ + void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ + void *pVdbeBranchArg; /* 1st argument */ +#endif +#ifndef SQLITE_OMIT_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif +#ifndef SQLITE_UNTESTABLE + int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ +#endif + int bLocaltimeFault; /* True to fail localtime() calls */ + int (*xAltLocaltime)(const void*,void*); /* Alternative localtime() routine */ + int iOnceResetThreshold; /* When to reset OP_Once counters */ + u32 szSorterRef; /* Min size in bytes to use sorter-refs */ + unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ + /* vvvv--- must be last ---vvv */ +#ifdef SQLITE_DEBUG + sqlite3_int64 aTune[SQLITE_NTUNE]; /* Tuning parameters */ +#endif +}; + +/* +** This macro is used inside of assert() statements to indicate that +** the assert is only valid on a well-formed database. Instead of: +** +** assert( X ); +** +** One writes: +** +** assert( X || CORRUPT_DB ); +** +** CORRUPT_DB is true during normal operation. CORRUPT_DB does not indicate +** that the database is definitely corrupt, only that it might be corrupt. +** For most test cases, CORRUPT_DB is set to false using a special +** sqlite3_test_control(). This enables assert() statements to prove +** things that are always true for well-formed databases. +*/ +#define CORRUPT_DB (sqlite3Config.neverCorrupt==0) + +/* +** Context pointer passed down through the tree-walk. +*/ +struct Walker { + Parse *pParse; /* Parser context. */ + int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */ + int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ + void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ + int walkerDepth; /* Number of subqueries */ + u16 eCode; /* A small processing code */ + union { /* Extra data for callback */ + NameContext *pNC; /* Naming context */ + int n; /* A counter */ + int iCur; /* A cursor number */ + SrcList *pSrcList; /* FROM clause */ + struct CCurHint *pCCurHint; /* Used by codeCursorHint() */ + struct RefSrcList *pRefSrcList; /* sqlite3ReferencesSrcList() */ + int *aiCol; /* array of column indexes */ + struct IdxCover *pIdxCover; /* Check for index coverage */ + struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */ + ExprList *pGroupBy; /* GROUP BY clause */ + Select *pSelect; /* HAVING to WHERE clause ctx */ + struct WindowRewrite *pRewrite; /* Window rewrite context */ + struct WhereConst *pConst; /* WHERE clause constants */ + struct RenameCtx *pRename; /* RENAME COLUMN context */ + struct Table *pTab; /* Table of generated column */ + SrcItem *pSrcItem; /* A single FROM clause item */ + DbFixer *pFix; + } u; +}; + +/* +** The following structure contains information used by the sqliteFix... +** routines as they walk the parse tree to make database references +** explicit. +*/ +struct DbFixer { + Parse *pParse; /* The parsing context. Error messages written here */ + Walker w; /* Walker object */ + Schema *pSchema; /* Fix items to this schema */ + u8 bTemp; /* True for TEMP schema entries */ + const char *zDb; /* Make sure all objects are contained in this database */ + const char *zType; /* Type of the container - used for error messages */ + const Token *pName; /* Name of the container - used for error messages */ +}; + +/* Forward declarations */ +SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); +SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker*, Select*); +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker*, Select*); +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker*, Select*); +SQLITE_PRIVATE int sqlite3WalkerDepthIncrease(Walker*,Select*); +SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker*,Select*); +SQLITE_PRIVATE void sqlite3WalkWinDefnDummyCallback(Walker*,Select*); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker*, Select*); +#endif + +#ifndef SQLITE_OMIT_CTE +SQLITE_PRIVATE void sqlite3SelectPopWith(Walker*, Select*); +#else +# define sqlite3SelectPopWith 0 +#endif + +/* +** Return code from the parse-tree walking primitives and their +** callbacks. +*/ +#define WRC_Continue 0 /* Continue down into children */ +#define WRC_Prune 1 /* Omit children but continue walking siblings */ +#define WRC_Abort 2 /* Abandon the tree walk */ + +/* +** A single common table expression +*/ +struct Cte { + char *zName; /* Name of this CTE */ + ExprList *pCols; /* List of explicit column names, or NULL */ + Select *pSelect; /* The definition of this CTE */ + const char *zCteErr; /* Error message for circular references */ + CteUse *pUse; /* Usage information for this CTE */ + u8 eM10d; /* The MATERIALIZED flag */ +}; + +/* +** Allowed values for the materialized flag (eM10d): +*/ +#define M10d_Yes 0 /* AS MATERIALIZED */ +#define M10d_Any 1 /* Not specified. Query planner's choice */ +#define M10d_No 2 /* AS NOT MATERIALIZED */ + +/* +** An instance of the With object represents a WITH clause containing +** one or more CTEs (common table expressions). +*/ +struct With { + int nCte; /* Number of CTEs in the WITH clause */ + int bView; /* Belongs to the outermost Select of a view */ + With *pOuter; /* Containing WITH clause, or NULL */ + Cte a[1]; /* For each CTE in the WITH clause.... */ +}; + +/* +** The Cte object is not guaranteed to persist for the entire duration +** of code generation. (The query flattener or other parser tree +** edits might delete it.) The following object records information +** about each Common Table Expression that must be preserved for the +** duration of the parse. +** +** The CteUse objects are freed using sqlite3ParserAddCleanup() rather +** than sqlite3SelectDelete(), which is what enables them to persist +** until the end of code generation. +*/ +struct CteUse { + int nUse; /* Number of users of this CTE */ + int addrM9e; /* Start of subroutine to compute materialization */ + int regRtn; /* Return address register for addrM9e subroutine */ + int iCur; /* Ephemeral table holding the materialization */ + LogEst nRowEst; /* Estimated number of rows in the table */ + u8 eM10d; /* The MATERIALIZED flag */ +}; + + +#ifdef SQLITE_DEBUG +/* +** An instance of the TreeView object is used for printing the content of +** data structures on sqlite3DebugPrintf() using a tree-like view. +*/ +struct TreeView { + int iLevel; /* Which level of the tree we are on */ + u8 bLine[100]; /* Draw vertical in column i if bLine[i] is true */ +}; +#endif /* SQLITE_DEBUG */ + +/* +** This object is used in various ways, most (but not all) related to window +** functions. +** +** (1) A single instance of this structure is attached to the +** the Expr.y.pWin field for each window function in an expression tree. +** This object holds the information contained in the OVER clause, +** plus additional fields used during code generation. +** +** (2) All window functions in a single SELECT form a linked-list +** attached to Select.pWin. The Window.pFunc and Window.pExpr +** fields point back to the expression that is the window function. +** +** (3) The terms of the WINDOW clause of a SELECT are instances of this +** object on a linked list attached to Select.pWinDefn. +** +** (4) For an aggregate function with a FILTER clause, an instance +** of this object is stored in Expr.y.pWin with eFrmType set to +** TK_FILTER. In this case the only field used is Window.pFilter. +** +** The uses (1) and (2) are really the same Window object that just happens +** to be accessible in two different ways. Use case (3) are separate objects. +*/ +struct Window { + char *zName; /* Name of window (may be NULL) */ + char *zBase; /* Name of base window for chaining (may be NULL) */ + ExprList *pPartition; /* PARTITION BY clause */ + ExprList *pOrderBy; /* ORDER BY clause */ + u8 eFrmType; /* TK_RANGE, TK_GROUPS, TK_ROWS, or 0 */ + u8 eStart; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ + u8 eEnd; /* UNBOUNDED, CURRENT, PRECEDING or FOLLOWING */ + u8 bImplicitFrame; /* True if frame was implicitly specified */ + u8 eExclude; /* TK_NO, TK_CURRENT, TK_TIES, TK_GROUP, or 0 */ + Expr *pStart; /* Expression for " PRECEDING" */ + Expr *pEnd; /* Expression for " FOLLOWING" */ + Window **ppThis; /* Pointer to this object in Select.pWin list */ + Window *pNextWin; /* Next window function belonging to this SELECT */ + Expr *pFilter; /* The FILTER expression */ + FuncDef *pWFunc; /* The function */ + int iEphCsr; /* Partition buffer or Peer buffer */ + int regAccum; /* Accumulator */ + int regResult; /* Interim result */ + int csrApp; /* Function cursor (used by min/max) */ + int regApp; /* Function register (also used by min/max) */ + int regPart; /* Array of registers for PARTITION BY values */ + Expr *pOwner; /* Expression object this window is attached to */ + int nBufferCol; /* Number of columns in buffer table */ + int iArgCol; /* Offset of first argument for this function */ + int regOne; /* Register containing constant value 1 */ + int regStartRowid; + int regEndRowid; + u8 bExprArgs; /* Defer evaluation of window function arguments + ** due to the SQLITE_SUBTYPE flag */ +}; + +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3*, Window*); +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window*); +SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p); +SQLITE_PRIVATE Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); +SQLITE_PRIVATE void sqlite3WindowAttach(Parse*, Expr*, Window*); +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin); +SQLITE_PRIVATE int sqlite3WindowCompare(const Parse*, const Window*, const Window*, int); +SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse*, Select*); +SQLITE_PRIVATE void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); +SQLITE_PRIVATE int sqlite3WindowRewrite(Parse*, Select*); +SQLITE_PRIVATE void sqlite3WindowUpdate(Parse*, Window*, Window*, FuncDef*); +SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p); +SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p); +SQLITE_PRIVATE void sqlite3WindowFunctions(void); +SQLITE_PRIVATE void sqlite3WindowChain(Parse*, Window*, Window*); +SQLITE_PRIVATE Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); +#else +# define sqlite3WindowDelete(a,b) +# define sqlite3WindowFunctions() +# define sqlite3WindowAttach(a,b,c) +#endif + +/* +** Assuming zIn points to the first byte of a UTF-8 character, +** advance zIn to point to the first byte of the next UTF-8 character. +*/ +#define SQLITE_SKIP_UTF8(zIn) { \ + if( (*(zIn++))>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + +/* +** The SQLITE_*_BKPT macros are substitutes for the error codes with +** the same name but without the _BKPT suffix. These macros invoke +** routines that report the line-number on which the error originated +** using sqlite3_log(). The routines also provide a convenient place +** to set a debugger breakpoint. +*/ +SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType); +SQLITE_PRIVATE int sqlite3CorruptError(int); +SQLITE_PRIVATE int sqlite3MisuseError(int); +SQLITE_PRIVATE int sqlite3CantopenError(int); +#define SQLITE_CORRUPT_BKPT sqlite3CorruptError(__LINE__) +#define SQLITE_MISUSE_BKPT sqlite3MisuseError(__LINE__) +#define SQLITE_CANTOPEN_BKPT sqlite3CantopenError(__LINE__) +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int); +SQLITE_PRIVATE int sqlite3IoerrnomemError(int); +# define SQLITE_NOMEM_BKPT sqlite3NomemError(__LINE__) +# define SQLITE_IOERR_NOMEM_BKPT sqlite3IoerrnomemError(__LINE__) +#else +# define SQLITE_NOMEM_BKPT SQLITE_NOMEM +# define SQLITE_IOERR_NOMEM_BKPT SQLITE_IOERR_NOMEM +#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_CORRUPT_PGNO) +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); +# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptPgnoError(__LINE__,(P)) +#else +# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptError(__LINE__) +#endif + +/* +** FTS3 and FTS4 both require virtual table support +*/ +#if defined(SQLITE_OMIT_VIRTUALTABLE) +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + +/* +** FTS4 is really an extension for FTS3. It is enabled using the +** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also call +** the SQLITE_ENABLE_FTS4 macro to serve as an alias for SQLITE_ENABLE_FTS3. +*/ +#if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3) +# define SQLITE_ENABLE_FTS3 1 +#endif + +/* +** The ctype.h header is needed for non-ASCII systems. It is also +** needed by FTS3 when FTS3 is included in the amalgamation. +*/ +#if !defined(SQLITE_ASCII) || \ + (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION)) +# include +#endif + +/* +** The following macros mimic the standard library functions toupper(), +** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The +** sqlite versions only work for ASCII characters, regardless of locale. +*/ +#ifdef SQLITE_ASCII +# define sqlite3Toupper(x) ((x)&~(sqlite3CtypeMap[(unsigned char)(x)]&0x20)) +# define sqlite3Isspace(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x01) +# define sqlite3Isalnum(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x06) +# define sqlite3Isalpha(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x02) +# define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04) +# define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08) +# define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)]) +# define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80) +#else +# define sqlite3Toupper(x) toupper((unsigned char)(x)) +# define sqlite3Isspace(x) isspace((unsigned char)(x)) +# define sqlite3Isalnum(x) isalnum((unsigned char)(x)) +# define sqlite3Isalpha(x) isalpha((unsigned char)(x)) +# define sqlite3Isdigit(x) isdigit((unsigned char)(x)) +# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x)) +# define sqlite3Tolower(x) tolower((unsigned char)(x)) +# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`') +#endif +SQLITE_PRIVATE int sqlite3IsIdChar(u8); + +/* +** Internal function prototypes +*/ +SQLITE_PRIVATE int sqlite3StrICmp(const char*,const char*); +SQLITE_PRIVATE int sqlite3Strlen30(const char*); +#define sqlite3Strlen30NN(C) (strlen(C)&0x3fffffff) +SQLITE_PRIVATE char *sqlite3ColumnType(Column*,char*); +#define sqlite3StrNICmp sqlite3_strnicmp + +SQLITE_PRIVATE int sqlite3MallocInit(void); +SQLITE_PRIVATE void sqlite3MallocEnd(void); +SQLITE_PRIVATE void *sqlite3Malloc(u64); +SQLITE_PRIVATE void *sqlite3MallocZero(u64); +SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3*, u64); +SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*); +SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64); +SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*); +SQLITE_PRIVATE void *sqlite3Realloc(void*, u64); +SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); +SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64); +SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*); +SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3*, void*); +SQLITE_PRIVATE int sqlite3MallocSize(const void*); +SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, const void*); +SQLITE_PRIVATE void *sqlite3PageMalloc(int); +SQLITE_PRIVATE void sqlite3PageFree(void*); +SQLITE_PRIVATE void sqlite3MemSetDefault(void); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); +#endif +SQLITE_PRIVATE int sqlite3HeapNearlyFull(void); + +/* +** On systems with ample stack space and that support alloca(), make +** use of alloca() to obtain space for large automatic objects. By default, +** obtain space from malloc(). +** +** The alloca() routine never returns NULL. This will cause code paths +** that deal with sqlite3StackAlloc() failures to be unreachable. +*/ +#ifdef SQLITE_USE_ALLOCA +# define sqlite3StackAllocRaw(D,N) alloca(N) +# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N) +# define sqlite3StackFree(D,P) +#else +# define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N) +# define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N) +# define sqlite3StackFree(D,P) sqlite3DbFree(D,P) +#endif + +/* Do not allow both MEMSYS5 and MEMSYS3 to be defined together. If they +** are, disable MEMSYS3 +*/ +#ifdef SQLITE_ENABLE_MEMSYS5 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void); +#undef SQLITE_ENABLE_MEMSYS3 +#endif +#ifdef SQLITE_ENABLE_MEMSYS3 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); +#endif + + +#ifndef SQLITE_MUTEX_OMIT +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void); +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int); +SQLITE_PRIVATE int sqlite3MutexInit(void); +SQLITE_PRIVATE int sqlite3MutexEnd(void); +#endif +#if !defined(SQLITE_MUTEX_OMIT) && !defined(SQLITE_MUTEX_NOOP) +SQLITE_PRIVATE void sqlite3MemoryBarrier(void); +#else +# define sqlite3MemoryBarrier() +#endif + +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int); +SQLITE_PRIVATE void sqlite3StatusUp(int, int); +SQLITE_PRIVATE void sqlite3StatusDown(int, int); +SQLITE_PRIVATE void sqlite3StatusHighwater(int, int); +SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3*,int*); + +/* Access to mutexes used by sqlite3_status() */ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void); + +#if defined(SQLITE_ENABLE_MULTITHREADED_CHECKS) && !defined(SQLITE_MUTEX_OMIT) +SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*); +#else +# define sqlite3MutexWarnOnContention(x) +#endif + +#ifndef SQLITE_OMIT_FLOATING_POINT +# define EXP754 (((u64)0x7ff)<<52) +# define MAN754 ((((u64)1)<<52)-1) +# define IsNaN(X) (((X)&EXP754)==EXP754 && ((X)&MAN754)!=0) +SQLITE_PRIVATE int sqlite3IsNaN(double); +#else +# define IsNaN(X) 0 +# define sqlite3IsNaN(X) 0 +#endif + +/* +** An instance of the following structure holds information about SQL +** functions arguments that are the parameters to the printf() function. +*/ +struct PrintfArguments { + int nArg; /* Total number of arguments */ + int nUsed; /* Number of arguments used so far */ + sqlite3_value **apArg; /* The argument values */ +}; + +SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); +SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) +SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...); +#endif +#if defined(SQLITE_TEST) +SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); +#endif + +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView*, const char *zFormat, ...); +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); +SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); +SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewBareIdList(TreeView*, const IdList*, const char*); +SQLITE_PRIVATE void sqlite3TreeViewIdList(TreeView*, const IdList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewColumnList(TreeView*, const Column*, int, u8); +SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*); +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); +SQLITE_PRIVATE void sqlite3TreeViewUpsert(TreeView*, const Upsert*, u8); +#if TREETRACE_ENABLED +SQLITE_PRIVATE void sqlite3TreeViewDelete(const With*, const SrcList*, const Expr*, + const ExprList*,const Expr*, const Trigger*); +SQLITE_PRIVATE void sqlite3TreeViewInsert(const With*, const SrcList*, + const IdList*, const Select*, const ExprList*, + int, const Upsert*, const Trigger*); +SQLITE_PRIVATE void sqlite3TreeViewUpdate(const With*, const SrcList*, const ExprList*, + const Expr*, int, const ExprList*, const Expr*, + const Upsert*, const Trigger*); +#endif +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3TreeViewTriggerStep(TreeView*, const TriggerStep*, u8, u8); +SQLITE_PRIVATE void sqlite3TreeViewTrigger(TreeView*, const Trigger*, u8, u8); +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView*, const Window*, u8); +SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8); +#endif +SQLITE_PRIVATE void sqlite3ShowExpr(const Expr*); +SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList*); +SQLITE_PRIVATE void sqlite3ShowIdList(const IdList*); +SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList*); +SQLITE_PRIVATE void sqlite3ShowSelect(const Select*); +SQLITE_PRIVATE void sqlite3ShowWith(const With*); +SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert*); +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep*); +SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep*); +SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger*); +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger*); +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3ShowWindow(const Window*); +SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window*); +#endif +#endif + +SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); +SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int); +SQLITE_PRIVATE void sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*); +SQLITE_PRIVATE void sqlite3DequoteToken(Token*); +SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); +SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); +SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*); +SQLITE_PRIVATE void sqlite3FinishCoding(Parse*); +SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); +SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); +SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); +#endif +SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); +SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); +SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*); +SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, const Token*, int); +SQLITE_PRIVATE void sqlite3ExprFunctionUsable(Parse*,const Expr*,const FuncDef*); +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); +SQLITE_PRIVATE void sqlite3ExprDeferredDelete(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse*, Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); +SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse*, int, ExprList*); +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int,int); +SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,const Token*,int); +SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index*); +SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); +SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**); +SQLITE_PRIVATE int sqlite3InitOne(sqlite3*, int, char**, u32); +SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); +#endif +SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*); +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int); +SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*); +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*); +SQLITE_PRIVATE void sqlite3ColumnSetExpr(Parse*,Table*,Column*,Expr*); +SQLITE_PRIVATE Expr *sqlite3ColumnExpr(Table*,Column*); +SQLITE_PRIVATE void sqlite3ColumnSetColl(sqlite3*,Column*,const char*zColl); +SQLITE_PRIVATE const char *sqlite3ColumnColl(Column*); +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*); +SQLITE_PRIVATE void sqlite3GenerateColumnNames(Parse *pParse, Select *pSelect); +SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); +SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *, int); +SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index*, i16); +#ifdef SQLITE_OMIT_GENERATED_COLUMNS +# define sqlite3TableColumnToStorage(T,X) (X) /* No-op pass-through */ +# define sqlite3StorageColumnToTable(T,X) (X) /* No-op pass-through */ +#else +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table*, i16); +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table*, i16); +#endif +SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); +#else +# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ +#endif +SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token,Token); +SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int); +SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); +SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*, const char*, const char*); +SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); +SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); +SQLITE_PRIVATE void sqlite3AddGenerated(Parse*,Expr*,Token*); +SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u32,Select*); +SQLITE_PRIVATE void sqlite3AddReturning(Parse*,ExprList*); +SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, + sqlite3_vfs**,char**,char **); +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +SQLITE_PRIVATE int sqlite3CodecQueryParameters(sqlite3*,const char*,const char*); +#else +# define sqlite3CodecQueryParameters(A,B,C) 0 +#endif +/* END SQLCIPHER */ +SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); + +#ifdef SQLITE_UNTESTABLE +# define sqlite3FaultSim(X) SQLITE_OK +#else +SQLITE_PRIVATE int sqlite3FaultSim(int); +#endif + +SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32); +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32); +SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32, void*); +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec*); +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*); +#endif + +SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*); +SQLITE_PRIVATE void sqlite3RowSetDelete(void*); +SQLITE_PRIVATE void sqlite3RowSetClear(void*); +SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64); +SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, int iBatch, i64); +SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*); + +SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,ExprList*,Select*,int,int); + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*,Table*); +#else +# define sqlite3ViewGetColumnNames(A,B) 0 +#endif + +#if SQLITE_MAX_ATTACHED>30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask); +#endif +SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int); +SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int); +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*); +SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3*, Index*); +#ifndef SQLITE_OMIT_AUTOINCREMENT +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse); +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse); +#else +# define sqlite3AutoincrementBegin(X) +# define sqlite3AutoincrementEnd(X) +#endif +SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns(Parse*, int, Table*); +#endif +SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); +SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); +SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, + Token*, Select*, OnOrUsing*); +SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*); +SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, SrcItem *); +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse*,SrcList*); +SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*); +SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*); +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3*, OnOrUsing*); +SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*); +SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); +SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, + Expr*, int, int, u8); +SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int); +SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*); +SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, + Expr*,ExprList*,u32,Expr*); +SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); +SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int); +SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) +SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*); +#endif +SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe*,int,const char*); +SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*); +SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*, + Upsert*); +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*, + ExprList*,Select*,u16,int); +SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*); +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo*); +SQLITE_PRIVATE void sqlite3WhereMinMaxOptEarlyOut(Vdbe*,WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*); +#define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */ +#define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */ +#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo*); +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); +SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Table*, Column*, int); +#endif +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); +#define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ +#define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ +#define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ +#define SQLITE_ECEL_OMITREF 0x08 /* Omit if ExprList.u.x.iOrderByCol */ +SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); +SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); +#define LOCATE_VIEW 0x01 +#define LOCATE_NOERR 0x02 +SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); +SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char*); +SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,SrcItem *); +SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); +SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); +SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); +SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, const Token*); +SQLITE_PRIVATE int sqlite3ExprCompare(const Parse*,const Expr*,const Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*,Expr*,int); +SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList*,const ExprList*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(const Parse*,const Expr*,const Expr*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int); +SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); +SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse*, Expr*, SrcList*); +SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3PrngSaveState(void); +SQLITE_PRIVATE void sqlite3PrngRestoreState(void); +#endif +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3*,int); +SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int); +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int); +SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int); +SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*); +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *); +SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); +SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char*); +SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*); +SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*); +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int); +SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr*,const SrcItem*); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); +#endif +SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); +SQLITE_PRIVATE int sqlite3IsRowid(const char*); +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); +SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int); +SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn(Expr*,int*,int); +SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, + u8,u8,int,int*,int*,Upsert*); +#ifdef SQLITE_ENABLE_NULL_TRIM +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe*,Table*); +#else +# define sqlite3SetMakeRecordP5(A,B) +#endif +SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); +SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, u8, int, u8*, int*, int*); +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse*, int, int); +SQLITE_PRIVATE void sqlite3MultiWrite(Parse*); +SQLITE_PRIVATE void sqlite3MayAbort(Parse*); +SQLITE_PRIVATE void sqlite3HaltConstraint(Parse*, int, int, char*, i8, u8); +SQLITE_PRIVATE void sqlite3UniqueConstraint(Parse*, int, Index*); +SQLITE_PRIVATE void sqlite3RowidConstraint(Parse*, int, Table*); +SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,const Expr*,int); +SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,const ExprList*,int); +SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,const SrcList*,int); +SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,const IdList*); +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,const Select*,int); +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch(int,const char*); +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); +SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); +SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum*,sqlite3_value*); +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) +SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3*); +#endif +SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*); +SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*); +SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int); +SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p); + +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int); +#endif + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,SrcList*, + Expr*,int, int); +SQLITE_PRIVATE void sqlite3FinishTrigger(Parse*, TriggerStep*, Token*); +SQLITE_PRIVATE void sqlite3DropTrigger(Parse*, SrcList*, int); +SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse*, Trigger*); +SQLITE_PRIVATE Trigger *sqlite3TriggersExist(Parse *, Table*, int, ExprList*, int *pMask); +SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *, Table *); +SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, int, Table *, + int, int, int); +SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int); + void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*); +SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(Parse*,Token*, IdList*, + Select*,u8,Upsert*, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(Parse*,Token*,SrcList*,ExprList*, + Expr*, u8, const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(Parse*,Token*, Expr*, + const char*,const char*); +SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*); +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*); +SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int); +SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc(Parse*, TriggerStep*); +# define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p)) +# define sqlite3IsToplevel(p) ((p)->pToplevel==0) +#else +# define sqlite3TriggersExist(B,C,D,E,F) 0 +# define sqlite3DeleteTrigger(A,B) +# define sqlite3DropTriggerPtr(A,B) +# define sqlite3UnlinkAndDeleteTrigger(A,B,C) +# define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I) +# define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F) +# define sqlite3TriggerList(X, Y) 0 +# define sqlite3ParseToplevel(p) p +# define sqlite3IsToplevel(p) 1 +# define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0 +# define sqlite3TriggerStepSrc(A,B) 0 +#endif + +SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); +SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol); +SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem*,int); +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int,u32); +SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); +SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); +#ifndef SQLITE_OMIT_AUTHORIZATION +SQLITE_PRIVATE void sqlite3AuthRead(Parse*,Expr*,Schema*,SrcList*); +SQLITE_PRIVATE int sqlite3AuthCheck(Parse*,int, const char*, const char*, const char*); +SQLITE_PRIVATE void sqlite3AuthContextPush(Parse*, AuthContext*, const char*); +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext*); +SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int); +#else +# define sqlite3AuthRead(a,b,c,d) +# define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK +# define sqlite3AuthContextPush(a,b,c) +# define sqlite3AuthContextPop(a) ((void)(a)) +#endif +SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName); +SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*); +SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*); +SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); +SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); +SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); +SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); +SQLITE_PRIVATE int sqlite3RealSameAsInt(double,sqlite3_int64); +SQLITE_PRIVATE void sqlite3Int64ToText(i64,char*); +SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8); +SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); +SQLITE_PRIVATE int sqlite3GetUInt32(const char*, u32*); +SQLITE_PRIVATE int sqlite3Atoi(const char*); +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); +#endif +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); +SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); +SQLITE_PRIVATE LogEst sqlite3LogEst(u64); +SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); +SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); +SQLITE_PRIVATE VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); +SQLITE_PRIVATE const char *sqlite3VListNumToName(VList*,int); +SQLITE_PRIVATE int sqlite3VListNameToNum(VList*,const char*,int); + +/* +** Routines to read and write variable-length integers. These used to +** be defined locally, but now we use the varint routines in the util.c +** file. +*/ +SQLITE_PRIVATE int sqlite3PutVarint(unsigned char*, u64); +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *, u64 *); +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *, u32 *); +SQLITE_PRIVATE int sqlite3VarintLen(u64 v); + +/* +** The common case is for a varint to be a single byte. They following +** macros handle the common case without a procedure call, but then call +** the procedure for larger varints. +*/ +#define getVarint32(A,B) \ + (u8)((*(A)<(u8)0x80)?((B)=(u32)*(A)),1:sqlite3GetVarint32((A),(u32 *)&(B))) +#define getVarint32NR(A,B) \ + B=(u32)*(A);if(B>=0x80)sqlite3GetVarint32((A),(u32*)&(B)) +#define putVarint32(A,B) \ + (u8)(((u32)(B)<(u32)0x80)?(*(A)=(unsigned char)(B)),1:\ + sqlite3PutVarint((A),(B))) +#define getVarint sqlite3GetVarint +#define putVarint sqlite3PutVarint + + +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*); +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); +SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2); +SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity); +SQLITE_PRIVATE char sqlite3TableColumnAffinity(const Table*,int); +SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr); +SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8); +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char*, i64*); +SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); +SQLITE_PRIVATE void sqlite3Error(sqlite3*,int); +SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3*); +SQLITE_PRIVATE void sqlite3SystemError(sqlite3*,int); +SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n); +SQLITE_PRIVATE u8 sqlite3HexToInt(int h); +SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); + +#if defined(SQLITE_NEED_ERR_NAME) +SQLITE_PRIVATE const char *sqlite3ErrName(int); +#endif + +#ifndef SQLITE_OMIT_DESERIALIZE +SQLITE_PRIVATE int sqlite3MemdbInit(void); +#endif + +SQLITE_PRIVATE const char *sqlite3ErrStr(int); +SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse); +SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int); +SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq*); +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName); +SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8); +SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr); +SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,const Expr*,const Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(const Parse *pParse, Expr*, const Token*, int); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(const Parse*,Expr*,const char*); +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr*); +SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); +SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3*); +SQLITE_PRIVATE int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, i64); +SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3MulInt64(i64*,i64); +SQLITE_PRIVATE int sqlite3AbsInt32(int); +#ifdef SQLITE_ENABLE_8_3_NAMES +SQLITE_PRIVATE void sqlite3FileSuffix3(const char*, char*); +#else +# define sqlite3FileSuffix3(X,Y) +#endif +SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,u8); + +SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, u8); +SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8); +SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, + void(*)(void*)); +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value*); +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*); +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context*); +#endif +SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *); +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); +#endif +SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, const Expr *, u8, u8, sqlite3_value **); +SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[]; +SQLITE_PRIVATE const char sqlite3StrBINARY[]; +SQLITE_PRIVATE const unsigned char sqlite3StdTypeLen[]; +SQLITE_PRIVATE const char sqlite3StdTypeAffinity[]; +SQLITE_PRIVATE const char sqlite3StdTypeMap[]; +SQLITE_PRIVATE const char *sqlite3StdType[]; +SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; +SQLITE_PRIVATE const unsigned char *sqlite3aLTb; +SQLITE_PRIVATE const unsigned char *sqlite3aEQb; +SQLITE_PRIVATE const unsigned char *sqlite3aGTb; +SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; +SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; +#ifndef SQLITE_OMIT_WSD +SQLITE_PRIVATE int sqlite3PendingByte; +#endif +#endif /* SQLITE_AMALGAMATION */ +#ifdef VDBE_PROFILE +SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt; +#endif +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, Pgno, Pgno); +SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*); +SQLITE_PRIVATE void sqlite3AlterFunctions(void); +SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); +SQLITE_PRIVATE void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); +SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); +SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); +SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*, int); +SQLITE_PRIVATE void sqlite3CodeRhsOfIN(Parse*, Expr*, int); +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); +SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse*, SrcItem*); +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); +SQLITE_PRIVATE int sqlite3MatchEName( + const struct ExprList_item*, + const char*, + const char*, + const char* +); +SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr*); +SQLITE_PRIVATE u8 sqlite3StrIHash(const char*); +SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); +SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); +SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); +SQLITE_PRIVATE int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); +SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); +SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *); +SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse*, SrcList*, const Token*); +SQLITE_PRIVATE const void *sqlite3RenameTokenMap(Parse*, const void*, const Token*); +SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse*, const void *pTo, const void *pFrom); +SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse*, ExprList*); +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); +SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*); +SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*); +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*); +SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*); +SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *); +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB); +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*); +SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*); +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int); +SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); +SQLITE_PRIVATE void sqlite3SchemaClear(void *); +SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *, Btree *); +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3*,int,int); +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList(Parse*, ExprList*, int, int); +SQLITE_PRIVATE const char *sqlite3SelectOpName(int); +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse*, ExprList*); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); +#endif +SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, + void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*,int,sqlite3_value **), + void (*)(sqlite3_context*), + void (*)(sqlite3_context*), + void (*)(sqlite3_context*,int,sqlite3_value **), + FuncDestructor *pDestructor +); +SQLITE_PRIVATE void sqlite3NoopDestructor(void*); +SQLITE_PRIVATE void *sqlite3OomFault(sqlite3*); +SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); +SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); + +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); +SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum*, int); +SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); +SQLITE_PRIVATE void sqlite3StrAccumSetError(StrAccum*, u8); +SQLITE_PRIVATE void sqlite3ResultStrAccum(sqlite3_context*,StrAccum*); +SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int); +SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); +SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3*,const char*); +SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3*,const Expr*); + +SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *); +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); + +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse*, Expr*); +#else +# define sqlite3ExprCheckIN(x,y) SQLITE_OK +#endif + +#ifdef SQLITE_ENABLE_STAT4 +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); +SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); +SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord*); +SQLITE_PRIVATE int sqlite3Stat4Column(sqlite3*, const void*, int, int, sqlite3_value**); +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int); +#endif + +/* +** The interface to the LEMON-generated parser +*/ +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64), Parse*); +SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*)); +#endif +SQLITE_PRIVATE void sqlite3Parser(void*, int, Token); +SQLITE_PRIVATE int sqlite3ParserFallback(int); +#ifdef YYTRACKMAXSTACKDEPTH +SQLITE_PRIVATE int sqlite3ParserStackPeak(void*); +#endif + +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3*); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*); +#else +# define sqlite3CloseExtensions(X) +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3TableLock(Parse *, int, Pgno, u8, const char *); +#else + #define sqlite3TableLock(v,w,x,y,z) +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*); +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3VtabClear(D,T) +# define sqlite3VtabSync(X,Y) SQLITE_OK +# define sqlite3VtabRollback(X) +# define sqlite3VtabCommit(X) +# define sqlite3VtabInSync(db) 0 +# define sqlite3VtabLock(X) +# define sqlite3VtabUnlock(X) +# define sqlite3VtabModuleUnref(D,X) +# define sqlite3VtabUnlockList(X) +# define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK +# define sqlite3GetVTable(X,Y) ((VTable*)0) +#else +SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*); +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p); +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe*); +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db); +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db); +SQLITE_PRIVATE void sqlite3VtabLock(VTable *); +SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *); +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3*,Module*); +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*); +SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int); +SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); +SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*); +SQLITE_PRIVATE Module *sqlite3VtabCreateModule( + sqlite3*, + const char*, + const sqlite3_module*, + void*, + void(*)(void*) + ); +# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) +#endif +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName); +SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*); +SQLITE_PRIVATE void sqlite3MarkAllShadowTablesOf(sqlite3*, Table*); +#else +# define sqlite3ShadowTableName(A,B) 0 +# define sqlite3IsShadowTableOf(A,B,C) 0 +# define sqlite3MarkAllShadowTablesOf(A,B) +#endif +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); +SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int); +SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*); +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*); +SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse*, Token*); +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **); +SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*); +SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); +SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); + +SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); +#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ + && !defined(SQLITE_OMIT_VIRTUALTABLE) +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info*); +#endif +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); +SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); +SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse*,sqlite3*); +SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse*); +SQLITE_PRIVATE void *sqlite3ParserAddCleanup(Parse*,void(*)(sqlite3*,void*),void*); +#ifdef SQLITE_ENABLE_NORMALIZE +SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); +#endif +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*); +SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); +SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse*,const Expr*); +SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, const Expr*, const Expr*); +SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*); +SQLITE_PRIVATE const char *sqlite3JournalModename(int); +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*); +SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int); +#endif +#ifndef SQLITE_OMIT_CTE +SQLITE_PRIVATE Cte *sqlite3CteNew(Parse*,Token*,ExprList*,Select*,u8); +SQLITE_PRIVATE void sqlite3CteDelete(sqlite3*,Cte*); +SQLITE_PRIVATE With *sqlite3WithAdd(Parse*,With*,Cte*); +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3*,With*); +SQLITE_PRIVATE With *sqlite3WithPush(Parse*, With*, u8); +#else +# define sqlite3CteNew(P,T,E,S) ((void*)0) +# define sqlite3CteDelete(D,C) +# define sqlite3CteWithAdd(P,W,C) ((void*)0) +# define sqlite3WithDelete(x,y) +# define sqlite3WithPush(x,y,z) ((void*)0) +#endif +#ifndef SQLITE_OMIT_UPSERT +SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*,Upsert*); +SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3*,Upsert*); +SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3*,Upsert*); +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*); +SQLITE_PRIVATE void sqlite3UpsertDoUpdate(Parse*,Upsert*,Table*,Index*,int); +SQLITE_PRIVATE Upsert *sqlite3UpsertOfIndex(Upsert*,Index*); +SQLITE_PRIVATE int sqlite3UpsertNextIsIPK(Upsert*); +#else +#define sqlite3UpsertNew(u,v,w,x,y,z) ((Upsert*)0) +#define sqlite3UpsertDelete(x,y) +#define sqlite3UpsertDup(x,y) ((Upsert*)0) +#define sqlite3UpsertOfIndex(x,y) ((Upsert*)0) +#define sqlite3UpsertNextIsIPK(x) 0 +#endif + + +/* Declarations for functions in fkey.c. All of these are replaced by +** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign +** key functionality is available. If OMIT_TRIGGER is defined but +** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In +** this case foreign keys are parsed, but no other functionality is +** provided (enforcement of FK constraints requires the triggers sub-system). +*/ +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE void sqlite3FkCheck(Parse*, Table*, int, int, int*, int); +SQLITE_PRIVATE void sqlite3FkDropTable(Parse*, SrcList *, Table*); +SQLITE_PRIVATE void sqlite3FkActions(Parse*, Table*, ExprList*, int, int*, int); +SQLITE_PRIVATE int sqlite3FkRequired(Parse*, Table*, int*, int); +SQLITE_PRIVATE u32 sqlite3FkOldmask(Parse*, Table*); +SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *); +SQLITE_PRIVATE void sqlite3FkClearTriggerCache(sqlite3*,int); +#else + #define sqlite3FkActions(a,b,c,d,e,f) + #define sqlite3FkCheck(a,b,c,d,e,f) + #define sqlite3FkDropTable(a,b,c) + #define sqlite3FkOldmask(a,b) 0 + #define sqlite3FkRequired(a,b,c,d) 0 + #define sqlite3FkReferences(a) 0 + #define sqlite3FkClearTriggerCache(a,b) +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *, Table*); +SQLITE_PRIVATE int sqlite3FkLocateIndex(Parse*,Table*,FKey*,Index**,int**); +#else + #define sqlite3FkDelete(a,b) + #define sqlite3FkLocateIndex(a,b,c,d,e) +#endif + + +/* +** Available fault injectors. Should be numbered beginning with 0. +*/ +#define SQLITE_FAULTINJECTOR_MALLOC 0 +#define SQLITE_FAULTINJECTOR_COUNT 1 + +/* +** The interface to the code in fault.c used for identifying "benign" +** malloc failures. This is only present if SQLITE_UNTESTABLE +** is not defined. +*/ +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void); +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); +#else + #define sqlite3BeginBenignMalloc() + #define sqlite3EndBenignMalloc() +#endif + +/* +** Allowed return values from sqlite3FindInIndex() +*/ +#define IN_INDEX_ROWID 1 /* Search the rowid of the table */ +#define IN_INDEX_EPH 2 /* Search an ephemeral b-tree */ +#define IN_INDEX_INDEX_ASC 3 /* Existing index ASCENDING */ +#define IN_INDEX_INDEX_DESC 4 /* Existing index DESCENDING */ +#define IN_INDEX_NOOP 5 /* No table available. Use comparisons */ +/* +** Allowed flags for the 3rd parameter to sqlite3FindInIndex(). +*/ +#define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ +#define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ +#define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ +SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); + +SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *); +#endif + +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p); +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *); + +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p); +#if SQLITE_MAX_EXPR_DEPTH>0 +SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select *); +SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int); +#else + #define sqlite3SelectExprHeight(x) 0 + #define sqlite3ExprCheckHeight(x,y) +#endif + +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8*); +SQLITE_PRIVATE void sqlite3Put4byte(u8*, u32); + +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *, sqlite3 *); +SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db); +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db); +#else + #define sqlite3ConnectionBlocked(x,y) + #define sqlite3ConnectionUnlocked(x) + #define sqlite3ConnectionClosed(x) +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *); +#endif +#if defined(YYCOVERAGE) +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*); +#endif + +/* +** If the SQLITE_ENABLE IOTRACE exists then the global variable +** sqlite3IoTrace is a pointer to a printf-like routine used to +** print I/O tracing messages. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +# define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; } +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe*); +SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); +#else +# define IOTRACE(A) +# define sqlite3VdbeIOTraceSql(X) +#endif + +/* +** These routines are available for the mem2.c debugging memory allocator +** only. They are used to verify that different "types" of memory +** allocations are properly tracked by the system. +** +** sqlite3MemdebugSetType() sets the "type" of an allocation to one of +** the MEMTYPE_* macros defined below. The type must be a bitmask with +** a single bit set. +** +** sqlite3MemdebugHasType() returns true if any of the bits in its second +** argument match the type set by the previous sqlite3MemdebugSetType(). +** sqlite3MemdebugHasType() is intended for use inside assert() statements. +** +** sqlite3MemdebugNoType() returns true if none of the bits in its second +** argument match the type set by the previous sqlite3MemdebugSetType(). +** +** Perhaps the most important point is the difference between MEMTYPE_HEAP +** and MEMTYPE_LOOKASIDE. If an allocation is MEMTYPE_LOOKASIDE, that means +** it might have been allocated by lookaside, except the allocation was +** too large or lookaside was already full. It is important to verify +** that allocations that might have been satisfied by lookaside are not +** passed back to non-lookaside free() routines. Asserts such as the +** example above are placed on the non-lookaside free() routines to verify +** this constraint. +** +** All of this is no-op for a production build. It only comes into +** play when the SQLITE_MEMDEBUG compile-time option is used. +*/ +#ifdef SQLITE_MEMDEBUG +SQLITE_PRIVATE void sqlite3MemdebugSetType(void*,u8); +SQLITE_PRIVATE int sqlite3MemdebugHasType(const void*,u8); +SQLITE_PRIVATE int sqlite3MemdebugNoType(const void*,u8); +#else +# define sqlite3MemdebugSetType(X,Y) /* no-op */ +# define sqlite3MemdebugHasType(X,Y) 1 +# define sqlite3MemdebugNoType(X,Y) 1 +#endif +#define MEMTYPE_HEAP 0x01 /* General heap allocations */ +#define MEMTYPE_LOOKASIDE 0x02 /* Heap that might have been lookaside */ +#define MEMTYPE_PCACHE 0x04 /* Page cache allocations */ + +/* +** Threading interface +*/ +#if SQLITE_MAX_WORKER_THREADS>0 +SQLITE_PRIVATE int sqlite3ThreadCreate(SQLiteThread**,void*(*)(void*),void*); +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread*, void**); +#endif + +#if defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3*); +#endif +#if defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3*); +#endif + +SQLITE_PRIVATE int sqlite3ExprVectorSize(const Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprIsVector(const Expr *pExpr); +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr*, int); +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(Parse*,Expr*,int,int); +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse*, Expr*); + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt); +#endif + +#endif /* SQLITEINT_H */ + +/************** End of sqliteInt.h *******************************************/ +/************** Begin file os_common.h ***************************************/ +/* +** 2004 May 22 +** +** 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 contains macros and a little bit of code that is common to +** all of the platform-specific files (os_*.c) and is #included into those +** files. +** +** This file should be #included by the os_*.c files only. It is not a +** general purpose header file. +*/ +#ifndef _OS_COMMON_H_ +#define _OS_COMMON_H_ + +/* +** At least two bugs have slipped in because we changed the MEMORY_DEBUG +** macro to SQLITE_DEBUG and some older makefiles have not yet made the +** switch. The following code should catch this problem at compile-time. +*/ +#ifdef MEMORY_DEBUG +# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." +#endif + +/* +** Macros for performance tracing. Normally turned off. Only works +** on i486 hardware. +*/ +#ifdef SQLITE_PERFORMANCE_TRACE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/************** Include hwtime.h in the middle of os_common.h ****************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** 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 contains inline asm code for retrieving "high-performance" +** counters for x86 and x86_64 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long val; + __asm__ __volatile__ ("rdtsc" : "=A" (val)); + return val; + } + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + /* + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in os_common.h ******************/ + +static sqlite_uint64 g_start; +static sqlite_uint64 g_elapsed; +#define TIMER_START g_start=sqlite3Hwtime() +#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start +#define TIMER_ELAPSED g_elapsed +#else +#define TIMER_START +#define TIMER_END +#define TIMER_ELAPSED ((sqlite_uint64)0) +#endif + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; +#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) +#define SimulateIOError(CODE) \ + if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ + || sqlite3_io_error_pending-- == 1 ) \ + { local_ioerr(); CODE; } +static void local_ioerr(){ + IOTRACE(("IOERR\n")); + sqlite3_io_error_hit++; + if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; +} +#define SimulateDiskfullError(CODE) \ + if( sqlite3_diskfull_pending ){ \ + if( sqlite3_diskfull_pending == 1 ){ \ + local_ioerr(); \ + sqlite3_diskfull = 1; \ + sqlite3_io_error_hit = 1; \ + CODE; \ + }else{ \ + sqlite3_diskfull_pending--; \ + } \ + } +#else +#define SimulateIOErrorBenign(X) +#define SimulateIOError(A) +#define SimulateDiskfullError(A) +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; +#define OpenCounter(X) sqlite3_open_file_count+=(X) +#else +#define OpenCounter(X) +#endif /* defined(SQLITE_TEST) */ + +#endif /* !defined(_OS_COMMON_H_) */ + +/************** End of os_common.h *******************************************/ +/************** Begin file ctime.c *******************************************/ +/* DO NOT EDIT! +** This file is automatically generated by the script in the canonical +** SQLite source tree at tool/mkctimec.tcl. +** +** To modify this header, edit any of the various lists in that script +** which specify categories of generated conditionals in this file. +*/ + +/* +** 2010 February 23 +** +** 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 routines used to report what compile-time options +** SQLite was built with. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */ + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H) +/* #include "./config.h" */ +#define SQLITECONFIG_H 1 +#endif + +/* These macros are provided to "stringify" the value of the define +** for those options in which the value is meaningful. */ +#define CTIMEOPT_VAL_(opt) #opt +#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) + +/* Like CTIMEOPT_VAL, but especially for SQLITE_DEFAULT_LOOKASIDE. This +** option requires a separate macro because legal values contain a single +** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE="100,100") */ +#define CTIMEOPT_VAL2_(opt1,opt2) #opt1 "," #opt2 +#define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt) +/* #include "sqliteInt.h" */ + +/* +** An array of names of all compile-time options. This array should +** be sorted A-Z. +** +** This array looks large, but in a typical installation actually uses +** only a handful of compile-time options, so most times this array is usually +** rather short and uses little memory space. +*/ +static const char * const sqlite3azCompileOpt[] = { + +#ifdef SQLITE_32BIT_ROWID + "32BIT_ROWID", +#endif +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC + "4_BYTE_ALIGNED_MALLOC", +#endif +#ifdef SQLITE_64BIT_STATS + "64BIT_STATS", +#endif +#ifdef SQLITE_ALLOW_COVERING_INDEX_SCAN +# if SQLITE_ALLOW_COVERING_INDEX_SCAN != 1 + "ALLOW_COVERING_INDEX_SCAN=" CTIMEOPT_VAL(SQLITE_ALLOW_COVERING_INDEX_SCAN), +# endif +#endif +#ifdef SQLITE_ALLOW_URI_AUTHORITY + "ALLOW_URI_AUTHORITY", +#endif +#ifdef SQLITE_ATOMIC_INTRINSICS + "ATOMIC_INTRINSICS=" CTIMEOPT_VAL(SQLITE_ATOMIC_INTRINSICS), +#endif +#ifdef SQLITE_BITMASK_TYPE + "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE), +#endif +#ifdef SQLITE_BUG_COMPATIBLE_20160819 + "BUG_COMPATIBLE_20160819", +#endif +#ifdef SQLITE_CASE_SENSITIVE_LIKE + "CASE_SENSITIVE_LIKE", +#endif +#ifdef SQLITE_CHECK_PAGES + "CHECK_PAGES", +#endif +#if defined(__clang__) && defined(__clang_major__) + "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "." + CTIMEOPT_VAL(__clang_minor__) "." + CTIMEOPT_VAL(__clang_patchlevel__), +#elif defined(_MSC_VER) + "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER), +#elif defined(__GNUC__) && defined(__VERSION__) + "COMPILER=gcc-" __VERSION__, +#endif +#ifdef SQLITE_COVERAGE_TEST + "COVERAGE_TEST", +#endif +#ifdef SQLITE_DEBUG + "DEBUG", +#endif +#ifdef SQLITE_DEFAULT_AUTOMATIC_INDEX + "DEFAULT_AUTOMATIC_INDEX", +#endif +#ifdef SQLITE_DEFAULT_AUTOVACUUM + "DEFAULT_AUTOVACUUM", +#endif +#ifdef SQLITE_DEFAULT_CACHE_SIZE + "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE), +#endif +#ifdef SQLITE_DEFAULT_CKPTFULLFSYNC + "DEFAULT_CKPTFULLFSYNC", +#endif +#ifdef SQLITE_DEFAULT_FILE_FORMAT + "DEFAULT_FILE_FORMAT=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_FORMAT), +#endif +#ifdef SQLITE_DEFAULT_FILE_PERMISSIONS + "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS), +#endif +#ifdef SQLITE_DEFAULT_FOREIGN_KEYS + "DEFAULT_FOREIGN_KEYS", +#endif +#ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + "DEFAULT_JOURNAL_SIZE_LIMIT=" CTIMEOPT_VAL(SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT), +#endif +#ifdef SQLITE_DEFAULT_LOCKING_MODE + "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), +#endif +#ifdef SQLITE_DEFAULT_LOOKASIDE + "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL2(SQLITE_DEFAULT_LOOKASIDE), +#endif +#ifdef SQLITE_DEFAULT_MEMSTATUS +# if SQLITE_DEFAULT_MEMSTATUS != 1 + "DEFAULT_MEMSTATUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_MEMSTATUS), +# endif +#endif +#ifdef SQLITE_DEFAULT_MMAP_SIZE + "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), +#endif +#ifdef SQLITE_DEFAULT_PAGE_SIZE + "DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_PAGE_SIZE), +#endif +#ifdef SQLITE_DEFAULT_PCACHE_INITSZ + "DEFAULT_PCACHE_INITSZ=" CTIMEOPT_VAL(SQLITE_DEFAULT_PCACHE_INITSZ), +#endif +#ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS + "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS), +#endif +#ifdef SQLITE_DEFAULT_RECURSIVE_TRIGGERS + "DEFAULT_RECURSIVE_TRIGGERS", +#endif +#ifdef SQLITE_DEFAULT_ROWEST + "DEFAULT_ROWEST=" CTIMEOPT_VAL(SQLITE_DEFAULT_ROWEST), +#endif +#ifdef SQLITE_DEFAULT_SECTOR_SIZE + "DEFAULT_SECTOR_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_SECTOR_SIZE), +#endif +#ifdef SQLITE_DEFAULT_SYNCHRONOUS + "DEFAULT_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_SYNCHRONOUS), +#endif +#ifdef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT + "DEFAULT_WAL_AUTOCHECKPOINT=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_AUTOCHECKPOINT), +#endif +#ifdef SQLITE_DEFAULT_WAL_SYNCHRONOUS + "DEFAULT_WAL_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_SYNCHRONOUS), +#endif +#ifdef SQLITE_DEFAULT_WORKER_THREADS + "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS), +#endif +#ifdef SQLITE_DIRECT_OVERFLOW_READ + "DIRECT_OVERFLOW_READ", +#endif +#ifdef SQLITE_DISABLE_DIRSYNC + "DISABLE_DIRSYNC", +#endif +#ifdef SQLITE_DISABLE_FTS3_UNICODE + "DISABLE_FTS3_UNICODE", +#endif +#ifdef SQLITE_DISABLE_FTS4_DEFERRED + "DISABLE_FTS4_DEFERRED", +#endif +#ifdef SQLITE_DISABLE_INTRINSIC + "DISABLE_INTRINSIC", +#endif +#ifdef SQLITE_DISABLE_LFS + "DISABLE_LFS", +#endif +#ifdef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS + "DISABLE_PAGECACHE_OVERFLOW_STATS", +#endif +#ifdef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + "DISABLE_SKIPAHEAD_DISTINCT", +#endif +#ifdef SQLITE_ENABLE_8_3_NAMES + "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES), +#endif +#ifdef SQLITE_ENABLE_API_ARMOR + "ENABLE_API_ARMOR", +#endif +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + "ENABLE_ATOMIC_WRITE", +#endif +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + "ENABLE_BATCH_ATOMIC_WRITE", +#endif +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + "ENABLE_BYTECODE_VTAB", +#endif +#ifdef SQLITE_ENABLE_CEROD + "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), +#endif +#ifdef SQLITE_ENABLE_COLUMN_METADATA + "ENABLE_COLUMN_METADATA", +#endif +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + "ENABLE_COLUMN_USED_MASK", +#endif +#ifdef SQLITE_ENABLE_COSTMULT + "ENABLE_COSTMULT", +#endif +#ifdef SQLITE_ENABLE_CURSOR_HINTS + "ENABLE_CURSOR_HINTS", +#endif +#ifdef SQLITE_ENABLE_DBPAGE_VTAB + "ENABLE_DBPAGE_VTAB", +#endif +#ifdef SQLITE_ENABLE_DBSTAT_VTAB + "ENABLE_DBSTAT_VTAB", +#endif +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + "ENABLE_EXPENSIVE_ASSERT", +#endif +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + "ENABLE_EXPLAIN_COMMENTS", +#endif +#ifdef SQLITE_ENABLE_FTS3 + "ENABLE_FTS3", +#endif +#ifdef SQLITE_ENABLE_FTS3_PARENTHESIS + "ENABLE_FTS3_PARENTHESIS", +#endif +#ifdef SQLITE_ENABLE_FTS3_TOKENIZER + "ENABLE_FTS3_TOKENIZER", +#endif +#ifdef SQLITE_ENABLE_FTS4 + "ENABLE_FTS4", +#endif +#ifdef SQLITE_ENABLE_FTS5 + "ENABLE_FTS5", +#endif +#ifdef SQLITE_ENABLE_GEOPOLY + "ENABLE_GEOPOLY", +#endif +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS + "ENABLE_HIDDEN_COLUMNS", +#endif +#ifdef SQLITE_ENABLE_ICU + "ENABLE_ICU", +#endif +#ifdef SQLITE_ENABLE_IOTRACE + "ENABLE_IOTRACE", +#endif +#ifdef SQLITE_ENABLE_LOAD_EXTENSION + "ENABLE_LOAD_EXTENSION", +#endif +#ifdef SQLITE_ENABLE_LOCKING_STYLE + "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), +#endif +#ifdef SQLITE_ENABLE_MATH_FUNCTIONS + "ENABLE_MATH_FUNCTIONS", +#endif +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + "ENABLE_MEMORY_MANAGEMENT", +#endif +#ifdef SQLITE_ENABLE_MEMSYS3 + "ENABLE_MEMSYS3", +#endif +#ifdef SQLITE_ENABLE_MEMSYS5 + "ENABLE_MEMSYS5", +#endif +#ifdef SQLITE_ENABLE_MULTIPLEX + "ENABLE_MULTIPLEX", +#endif +#ifdef SQLITE_ENABLE_NORMALIZE + "ENABLE_NORMALIZE", +#endif +#ifdef SQLITE_ENABLE_NULL_TRIM + "ENABLE_NULL_TRIM", +#endif +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + "ENABLE_OFFSET_SQL_FUNC", +#endif +#ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK + "ENABLE_OVERSIZE_CELL_CHECK", +#endif +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + "ENABLE_PREUPDATE_HOOK", +#endif +#ifdef SQLITE_ENABLE_QPSG + "ENABLE_QPSG", +#endif +#ifdef SQLITE_ENABLE_RBU + "ENABLE_RBU", +#endif +#ifdef SQLITE_ENABLE_RTREE + "ENABLE_RTREE", +#endif +#ifdef SQLITE_ENABLE_SESSION + "ENABLE_SESSION", +#endif +#ifdef SQLITE_ENABLE_SNAPSHOT + "ENABLE_SNAPSHOT", +#endif +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + "ENABLE_SORTER_REFERENCES", +#endif +#ifdef SQLITE_ENABLE_SQLLOG + "ENABLE_SQLLOG", +#endif +#ifdef SQLITE_ENABLE_STAT4 + "ENABLE_STAT4", +#endif +#ifdef SQLITE_ENABLE_STMTVTAB + "ENABLE_STMTVTAB", +#endif +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + "ENABLE_STMT_SCANSTATUS", +#endif +#ifdef SQLITE_ENABLE_TREETRACE + "ENABLE_TREETRACE", +#endif +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + "ENABLE_UNKNOWN_SQL_FUNCTION", +#endif +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + "ENABLE_UNLOCK_NOTIFY", +#endif +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + "ENABLE_UPDATE_DELETE_LIMIT", +#endif +#ifdef SQLITE_ENABLE_URI_00_ERROR + "ENABLE_URI_00_ERROR", +#endif +#ifdef SQLITE_ENABLE_VFSTRACE + "ENABLE_VFSTRACE", +#endif +#ifdef SQLITE_ENABLE_WHERETRACE + "ENABLE_WHERETRACE", +#endif +#ifdef SQLITE_ENABLE_ZIPVFS + "ENABLE_ZIPVFS", +#endif +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS + "EXPLAIN_ESTIMATED_ROWS", +#endif +#ifdef SQLITE_EXTRA_IFNULLROW + "EXTRA_IFNULLROW", +#endif +#ifdef SQLITE_EXTRA_INIT + "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT), +#endif +#ifdef SQLITE_EXTRA_SHUTDOWN + "EXTRA_SHUTDOWN=" CTIMEOPT_VAL(SQLITE_EXTRA_SHUTDOWN), +#endif +#ifdef SQLITE_FTS3_MAX_EXPR_DEPTH + "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH), +#endif +#ifdef SQLITE_FTS5_ENABLE_TEST_MI + "FTS5_ENABLE_TEST_MI", +#endif +#ifdef SQLITE_FTS5_NO_WITHOUT_ROWID + "FTS5_NO_WITHOUT_ROWID", +#endif +/* BEGIN SQLCIPHER */ +#if SQLITE_HAS_CODEC + "HAS_CODEC", +#endif +/* END SQLCIPHER */ +#if HAVE_ISNAN || SQLITE_HAVE_ISNAN + "HAVE_ISNAN", +#endif +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX +# if SQLITE_HOMEGROWN_RECURSIVE_MUTEX != 1 + "HOMEGROWN_RECURSIVE_MUTEX=" CTIMEOPT_VAL(SQLITE_HOMEGROWN_RECURSIVE_MUTEX), +# endif +#endif +#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS + "IGNORE_AFP_LOCK_ERRORS", +#endif +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + "IGNORE_FLOCK_LOCK_ERRORS", +#endif +#ifdef SQLITE_INLINE_MEMCPY + "INLINE_MEMCPY", +#endif +#ifdef SQLITE_INT64_TYPE + "INT64_TYPE", +#endif +#ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX + "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX), +#endif +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + "LIKE_DOESNT_MATCH_BLOBS", +#endif +#ifdef SQLITE_LOCK_TRACE + "LOCK_TRACE", +#endif +#ifdef SQLITE_LOG_CACHE_SPILL + "LOG_CACHE_SPILL", +#endif +#ifdef SQLITE_MALLOC_SOFT_LIMIT + "MALLOC_SOFT_LIMIT=" CTIMEOPT_VAL(SQLITE_MALLOC_SOFT_LIMIT), +#endif +#ifdef SQLITE_MAX_ATTACHED + "MAX_ATTACHED=" CTIMEOPT_VAL(SQLITE_MAX_ATTACHED), +#endif +#ifdef SQLITE_MAX_COLUMN + "MAX_COLUMN=" CTIMEOPT_VAL(SQLITE_MAX_COLUMN), +#endif +#ifdef SQLITE_MAX_COMPOUND_SELECT + "MAX_COMPOUND_SELECT=" CTIMEOPT_VAL(SQLITE_MAX_COMPOUND_SELECT), +#endif +#ifdef SQLITE_MAX_DEFAULT_PAGE_SIZE + "MAX_DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_DEFAULT_PAGE_SIZE), +#endif +#ifdef SQLITE_MAX_EXPR_DEPTH + "MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_EXPR_DEPTH), +#endif +#ifdef SQLITE_MAX_FUNCTION_ARG + "MAX_FUNCTION_ARG=" CTIMEOPT_VAL(SQLITE_MAX_FUNCTION_ARG), +#endif +#ifdef SQLITE_MAX_LENGTH + "MAX_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LENGTH), +#endif +#ifdef SQLITE_MAX_LIKE_PATTERN_LENGTH + "MAX_LIKE_PATTERN_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LIKE_PATTERN_LENGTH), +#endif +#ifdef SQLITE_MAX_MEMORY + "MAX_MEMORY=" CTIMEOPT_VAL(SQLITE_MAX_MEMORY), +#endif +#ifdef SQLITE_MAX_MMAP_SIZE + "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), +#endif +#ifdef SQLITE_MAX_MMAP_SIZE_ + "MAX_MMAP_SIZE_=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE_), +#endif +#ifdef SQLITE_MAX_PAGE_COUNT + "MAX_PAGE_COUNT=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_COUNT), +#endif +#ifdef SQLITE_MAX_PAGE_SIZE + "MAX_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_SIZE), +#endif +#ifdef SQLITE_MAX_SCHEMA_RETRY + "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), +#endif +#ifdef SQLITE_MAX_SQL_LENGTH + "MAX_SQL_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_SQL_LENGTH), +#endif +#ifdef SQLITE_MAX_TRIGGER_DEPTH + "MAX_TRIGGER_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_TRIGGER_DEPTH), +#endif +#ifdef SQLITE_MAX_VARIABLE_NUMBER + "MAX_VARIABLE_NUMBER=" CTIMEOPT_VAL(SQLITE_MAX_VARIABLE_NUMBER), +#endif +#ifdef SQLITE_MAX_VDBE_OP + "MAX_VDBE_OP=" CTIMEOPT_VAL(SQLITE_MAX_VDBE_OP), +#endif +#ifdef SQLITE_MAX_WORKER_THREADS + "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS), +#endif +#ifdef SQLITE_MEMDEBUG + "MEMDEBUG", +#endif +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT + "MIXED_ENDIAN_64BIT_FLOAT", +#endif +#ifdef SQLITE_MMAP_READWRITE + "MMAP_READWRITE", +#endif +#ifdef SQLITE_MUTEX_NOOP + "MUTEX_NOOP", +#endif +#ifdef SQLITE_MUTEX_OMIT + "MUTEX_OMIT", +#endif +#ifdef SQLITE_MUTEX_PTHREADS + "MUTEX_PTHREADS", +#endif +#ifdef SQLITE_MUTEX_W32 + "MUTEX_W32", +#endif +#ifdef SQLITE_NEED_ERR_NAME + "NEED_ERR_NAME", +#endif +#ifdef SQLITE_NO_SYNC + "NO_SYNC", +#endif +#ifdef SQLITE_OMIT_ALTERTABLE + "OMIT_ALTERTABLE", +#endif +#ifdef SQLITE_OMIT_ANALYZE + "OMIT_ANALYZE", +#endif +#ifdef SQLITE_OMIT_ATTACH + "OMIT_ATTACH", +#endif +#ifdef SQLITE_OMIT_AUTHORIZATION + "OMIT_AUTHORIZATION", +#endif +#ifdef SQLITE_OMIT_AUTOINCREMENT + "OMIT_AUTOINCREMENT", +#endif +#ifdef SQLITE_OMIT_AUTOINIT + "OMIT_AUTOINIT", +#endif +#ifdef SQLITE_OMIT_AUTOMATIC_INDEX + "OMIT_AUTOMATIC_INDEX", +#endif +#ifdef SQLITE_OMIT_AUTORESET + "OMIT_AUTORESET", +#endif +#ifdef SQLITE_OMIT_AUTOVACUUM + "OMIT_AUTOVACUUM", +#endif +#ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION + "OMIT_BETWEEN_OPTIMIZATION", +#endif +#ifdef SQLITE_OMIT_BLOB_LITERAL + "OMIT_BLOB_LITERAL", +#endif +#ifdef SQLITE_OMIT_CAST + "OMIT_CAST", +#endif +#ifdef SQLITE_OMIT_CHECK + "OMIT_CHECK", +#endif +#ifdef SQLITE_OMIT_COMPLETE + "OMIT_COMPLETE", +#endif +#ifdef SQLITE_OMIT_COMPOUND_SELECT + "OMIT_COMPOUND_SELECT", +#endif +#ifdef SQLITE_OMIT_CONFLICT_CLAUSE + "OMIT_CONFLICT_CLAUSE", +#endif +#ifdef SQLITE_OMIT_CTE + "OMIT_CTE", +#endif +#if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT) + "OMIT_DATETIME_FUNCS", +#endif +#ifdef SQLITE_OMIT_DECLTYPE + "OMIT_DECLTYPE", +#endif +#ifdef SQLITE_OMIT_DEPRECATED + "OMIT_DEPRECATED", +#endif +#ifdef SQLITE_OMIT_DESERIALIZE + "OMIT_DESERIALIZE", +#endif +#ifdef SQLITE_OMIT_DISKIO + "OMIT_DISKIO", +#endif +#ifdef SQLITE_OMIT_EXPLAIN + "OMIT_EXPLAIN", +#endif +#ifdef SQLITE_OMIT_FLAG_PRAGMAS + "OMIT_FLAG_PRAGMAS", +#endif +#ifdef SQLITE_OMIT_FLOATING_POINT + "OMIT_FLOATING_POINT", +#endif +#ifdef SQLITE_OMIT_FOREIGN_KEY + "OMIT_FOREIGN_KEY", +#endif +#ifdef SQLITE_OMIT_GET_TABLE + "OMIT_GET_TABLE", +#endif +#ifdef SQLITE_OMIT_HEX_INTEGER + "OMIT_HEX_INTEGER", +#endif +#ifdef SQLITE_OMIT_INCRBLOB + "OMIT_INCRBLOB", +#endif +#ifdef SQLITE_OMIT_INTEGRITY_CHECK + "OMIT_INTEGRITY_CHECK", +#endif +#ifdef SQLITE_OMIT_INTROSPECTION_PRAGMAS + "OMIT_INTROSPECTION_PRAGMAS", +#endif +#ifdef SQLITE_OMIT_JSON + "OMIT_JSON", +#endif +#ifdef SQLITE_OMIT_LIKE_OPTIMIZATION + "OMIT_LIKE_OPTIMIZATION", +#endif +#ifdef SQLITE_OMIT_LOAD_EXTENSION + "OMIT_LOAD_EXTENSION", +#endif +#ifdef SQLITE_OMIT_LOCALTIME + "OMIT_LOCALTIME", +#endif +#ifdef SQLITE_OMIT_LOOKASIDE + "OMIT_LOOKASIDE", +#endif +#ifdef SQLITE_OMIT_MEMORYDB + "OMIT_MEMORYDB", +#endif +#ifdef SQLITE_OMIT_OR_OPTIMIZATION + "OMIT_OR_OPTIMIZATION", +#endif +#ifdef SQLITE_OMIT_PAGER_PRAGMAS + "OMIT_PAGER_PRAGMAS", +#endif +#ifdef SQLITE_OMIT_PARSER_TRACE + "OMIT_PARSER_TRACE", +#endif +#ifdef SQLITE_OMIT_POPEN + "OMIT_POPEN", +#endif +#ifdef SQLITE_OMIT_PRAGMA + "OMIT_PRAGMA", +#endif +#ifdef SQLITE_OMIT_PROGRESS_CALLBACK + "OMIT_PROGRESS_CALLBACK", +#endif +#ifdef SQLITE_OMIT_QUICKBALANCE + "OMIT_QUICKBALANCE", +#endif +#ifdef SQLITE_OMIT_REINDEX + "OMIT_REINDEX", +#endif +#ifdef SQLITE_OMIT_SCHEMA_PRAGMAS + "OMIT_SCHEMA_PRAGMAS", +#endif +#ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + "OMIT_SCHEMA_VERSION_PRAGMAS", +#endif +#ifdef SQLITE_OMIT_SHARED_CACHE + "OMIT_SHARED_CACHE", +#endif +#ifdef SQLITE_OMIT_SHUTDOWN_DIRECTORIES + "OMIT_SHUTDOWN_DIRECTORIES", +#endif +#ifdef SQLITE_OMIT_SUBQUERY + "OMIT_SUBQUERY", +#endif +#ifdef SQLITE_OMIT_TCL_VARIABLE + "OMIT_TCL_VARIABLE", +#endif +#ifdef SQLITE_OMIT_TEMPDB + "OMIT_TEMPDB", +#endif +#ifdef SQLITE_OMIT_TEST_CONTROL + "OMIT_TEST_CONTROL", +#endif +#ifdef SQLITE_OMIT_TRACE +# if SQLITE_OMIT_TRACE != 1 + "OMIT_TRACE=" CTIMEOPT_VAL(SQLITE_OMIT_TRACE), +# endif +#endif +#ifdef SQLITE_OMIT_TRIGGER + "OMIT_TRIGGER", +#endif +#ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION + "OMIT_TRUNCATE_OPTIMIZATION", +#endif +#ifdef SQLITE_OMIT_UTF16 + "OMIT_UTF16", +#endif +#ifdef SQLITE_OMIT_VACUUM + "OMIT_VACUUM", +#endif +#ifdef SQLITE_OMIT_VIEW + "OMIT_VIEW", +#endif +#ifdef SQLITE_OMIT_VIRTUALTABLE + "OMIT_VIRTUALTABLE", +#endif +#ifdef SQLITE_OMIT_WAL + "OMIT_WAL", +#endif +#ifdef SQLITE_OMIT_WSD + "OMIT_WSD", +#endif +#ifdef SQLITE_OMIT_XFER_OPT + "OMIT_XFER_OPT", +#endif +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + "PCACHE_SEPARATE_HEADER", +#endif +#ifdef SQLITE_PERFORMANCE_TRACE + "PERFORMANCE_TRACE", +#endif +#ifdef SQLITE_POWERSAFE_OVERWRITE +# if SQLITE_POWERSAFE_OVERWRITE != 1 + "POWERSAFE_OVERWRITE=" CTIMEOPT_VAL(SQLITE_POWERSAFE_OVERWRITE), +# endif +#endif +#ifdef SQLITE_PREFER_PROXY_LOCKING + "PREFER_PROXY_LOCKING", +#endif +#ifdef SQLITE_PROXY_DEBUG + "PROXY_DEBUG", +#endif +#ifdef SQLITE_REVERSE_UNORDERED_SELECTS + "REVERSE_UNORDERED_SELECTS", +#endif +#ifdef SQLITE_RTREE_INT_ONLY + "RTREE_INT_ONLY", +#endif +#ifdef SQLITE_SECURE_DELETE + "SECURE_DELETE", +#endif +#ifdef SQLITE_SMALL_STACK + "SMALL_STACK", +#endif +#ifdef SQLITE_SORTER_PMASZ + "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ), +#endif +#ifdef SQLITE_SOUNDEX + "SOUNDEX", +#endif +#ifdef SQLITE_STAT4_SAMPLES + "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES), +#endif +#ifdef SQLITE_STMTJRNL_SPILL + "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL), +#endif +#ifdef SQLITE_SUBSTR_COMPATIBILITY + "SUBSTR_COMPATIBILITY", +#endif +#if (!defined(SQLITE_WIN32_MALLOC) \ + && !defined(SQLITE_ZERO_MALLOC) \ + && !defined(SQLITE_MEMDEBUG) \ + ) || defined(SQLITE_SYSTEM_MALLOC) + "SYSTEM_MALLOC", +#endif +#ifdef SQLITE_TCL + "TCL", +#endif +#ifdef SQLITE_TEMP_STORE + "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), +#endif +#ifdef SQLITE_TEST + "TEST", +#endif +#if defined(SQLITE_THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), +#elif defined(THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE), +#else + "THREADSAFE=1", +#endif +#ifdef SQLITE_UNLINK_AFTER_CLOSE + "UNLINK_AFTER_CLOSE", +#endif +#ifdef SQLITE_UNTESTABLE + "UNTESTABLE", +#endif +#ifdef SQLITE_USER_AUTHENTICATION + "USER_AUTHENTICATION", +#endif +#ifdef SQLITE_USE_ALLOCA + "USE_ALLOCA", +#endif +#ifdef SQLITE_USE_FCNTL_TRACE + "USE_FCNTL_TRACE", +#endif +#ifdef SQLITE_USE_URI + "USE_URI", +#endif +#ifdef SQLITE_VDBE_COVERAGE + "VDBE_COVERAGE", +#endif +#ifdef SQLITE_WIN32_MALLOC + "WIN32_MALLOC", +#endif +#ifdef SQLITE_ZERO_MALLOC + "ZERO_MALLOC", +#endif + +} ; + +SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ + *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]); + return (const char**)sqlite3azCompileOpt; +} + +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/************** End of ctime.c ***********************************************/ +/************** Begin file global.c ******************************************/ +/* +** 2008 June 13 +** +** 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 contains definitions of global variables and constants. +*/ +/* #include "sqliteInt.h" */ + +/* An array to map all upper-case characters into their corresponding +** lower-case character. +** +** SQLite only considers US-ASCII (or EBCDIC) characters. We do not +** handle case conversions for the UTF character set since the tables +** involved are nearly as big or bigger than SQLite itself. +*/ +SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { +#ifdef SQLITE_ASCII + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, + 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161, + 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, + 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, + 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233, + 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251, + 252,253,254,255, +#endif +#ifdef SQLITE_EBCDIC + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 0x */ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */ + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */ + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */ + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */ + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */ + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 6x */ + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 7x */ + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */ + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 9x */ + 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */ + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */ + 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */ + 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */ + 224,225,162,163,164,165,166,167,168,169,234,235,236,237,238,239, /* Ex */ + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, /* Fx */ +#endif +/* All of the upper-to-lower conversion data is above. The following +** 18 integers are completely unrelated. They are appended to the +** sqlite3UpperToLower[] array to avoid UBSAN warnings. Here's what is +** going on: +** +** The SQL comparison operators (<>, =, >, <=, <, and >=) are implemented +** by invoking sqlite3MemCompare(A,B) which compares values A and B and +** returns negative, zero, or positive if A is less then, equal to, or +** greater than B, respectively. Then the true false results is found by +** consulting sqlite3aLTb[opcode], sqlite3aEQb[opcode], or +** sqlite3aGTb[opcode] depending on whether the result of compare(A,B) +** is negative, zero, or positive, where opcode is the specific opcode. +** The only works because the comparison opcodes are consecutive and in +** this order: NE EQ GT LE LT GE. Various assert()s throughout the code +** ensure that is the case. +** +** These elements must be appended to another array. Otherwise the +** index (here shown as [256-OP_Ne]) would be out-of-bounds and thus +** be undefined behavior. That's goofy, but the C-standards people thought +** it was a good idea, so here we are. +*/ +/* NE EQ GT LE LT GE */ + 1, 0, 0, 1, 1, 0, /* aLTb[]: Use when compare(A,B) less than zero */ + 0, 1, 0, 1, 0, 1, /* aEQb[]: Use when compare(A,B) equals zero */ + 1, 0, 1, 0, 0, 1 /* aGTb[]: Use when compare(A,B) greater than zero*/ +}; +SQLITE_PRIVATE const unsigned char *sqlite3aLTb = &sqlite3UpperToLower[256-OP_Ne]; +SQLITE_PRIVATE const unsigned char *sqlite3aEQb = &sqlite3UpperToLower[256+6-OP_Ne]; +SQLITE_PRIVATE const unsigned char *sqlite3aGTb = &sqlite3UpperToLower[256+12-OP_Ne]; + +/* +** The following 256 byte lookup table is used to support SQLites built-in +** equivalents to the following standard library functions: +** +** isspace() 0x01 +** isalpha() 0x02 +** isdigit() 0x04 +** isalnum() 0x06 +** isxdigit() 0x08 +** toupper() 0x20 +** SQLite identifier character 0x40 +** Quote character 0x80 +** +** Bit 0x20 is set if the mapped character requires translation to upper +** case. i.e. if the character is a lower-case ASCII character. +** If x is a lower-case ASCII character, then its upper-case equivalent +** is (x - 0x20). Therefore toupper() can be implemented as: +** +** (x & ~(map[x]&0x20)) +** +** The equivalent of tolower() is implemented using the sqlite3UpperToLower[] +** array. tolower() is used more often than toupper() by SQLite. +** +** Bit 0x40 is set if the character is non-alphanumeric and can be used in an +** SQLite identifier. Identifiers are alphanumerics, "_", "$", and any +** non-ASCII UTF character. Hence the test for whether or not a character is +** part of an identifier is 0x46. +*/ +SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00..07 ........ */ + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10..17 ........ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 18..1f ........ */ + 0x01, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, /* 20..27 !"#$%&' */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 28..2f ()*+,-./ */ + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* 30..37 01234567 */ + 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 38..3f 89:;<=>? */ + + 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x02, /* 40..47 @ABCDEFG */ + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 48..4f HIJKLMNO */ + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 50..57 PQRSTUVW */ + 0x02, 0x02, 0x02, 0x80, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */ + 0x80, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */ + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 68..6f hijklmno */ + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 70..77 pqrstuvw */ + 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, /* 78..7f xyz{|}~. */ + + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 80..87 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 88..8f ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 90..97 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 98..9f ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a0..a7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a8..af ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b0..b7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b8..bf ........ */ + + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c0..c7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c8..cf ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d0..d7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d8..df ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e0..e7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e8..ef ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* f0..f7 ........ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */ +}; + +/* EVIDENCE-OF: R-02982-34736 In order to maintain full backwards +** compatibility for legacy applications, the URI filename capability is +** disabled by default. +** +** EVIDENCE-OF: R-38799-08373 URI filenames can be enabled or disabled +** using the SQLITE_USE_URI=1 or SQLITE_USE_URI=0 compile-time options. +** +** EVIDENCE-OF: R-43642-56306 By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** SQLITE_USE_URI symbol defined. +** +** URI filenames are enabled by default if SQLITE_HAS_CODEC is +** enabled. +*/ +#ifndef SQLITE_USE_URI +/* BEGIN SQLCIPHER */ +# ifdef SQLITE_HAS_CODEC +# define SQLITE_USE_URI 1 +# else +# define SQLITE_USE_URI 0 +# endif +/* END SQLCIPHER */ +#endif + +/* EVIDENCE-OF: R-38720-18127 The default setting is determined by the +** SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if +** that compile-time option is omitted. +*/ +#if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) +# define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 +#else +# if !SQLITE_ALLOW_COVERING_INDEX_SCAN +# error "Compile-time disabling of covering index scan using the\ + -DSQLITE_ALLOW_COVERING_INDEX_SCAN=0 option is deprecated.\ + Contact SQLite developers if this is a problem for you, and\ + delete this #error macro to continue with your build." +# endif +#endif + +/* The minimum PMA size is set to this value multiplied by the database +** page size in bytes. +*/ +#ifndef SQLITE_SORTER_PMASZ +# define SQLITE_SORTER_PMASZ 250 +#endif + +/* Statement journals spill to disk when their size exceeds the following +** threshold (in bytes). 0 means that statement journals are created and +** written to disk immediately (the default behavior for SQLite versions +** before 3.12.0). -1 means always keep the entire statement journal in +** memory. (The statement journal is also always held entirely in memory +** if journal_mode=MEMORY or if temp_store=MEMORY, regardless of this +** setting.) +*/ +#ifndef SQLITE_STMTJRNL_SPILL +# define SQLITE_STMTJRNL_SPILL (64*1024) +#endif + +/* +** The default lookaside-configuration, the format "SZ,N". SZ is the +** number of bytes in each lookaside slot (should be a multiple of 8) +** and N is the number of slots. The lookaside-configuration can be +** changed as start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) +** or at run-time for an individual database connection using +** sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE); +** +** With the two-size-lookaside enhancement, less lookaside is required. +** The default configuration of 1200,40 actually provides 30 1200-byte slots +** and 93 128-byte slots, which is more lookaside than is available +** using the older 1200,100 configuration without two-size-lookaside. +*/ +#ifndef SQLITE_DEFAULT_LOOKASIDE +# ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define SQLITE_DEFAULT_LOOKASIDE 1200,100 /* 120KB of memory */ +# else +# define SQLITE_DEFAULT_LOOKASIDE 1200,40 /* 48KB of memory */ +# endif +#endif + + +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + +/* +** The following singleton contains the global configuration for +** the SQLite library. +*/ +SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { + SQLITE_DEFAULT_MEMSTATUS, /* bMemstat */ + 1, /* bCoreMutex */ + SQLITE_THREADSAFE==1, /* bFullMutex */ + SQLITE_USE_URI, /* bOpenUri */ + SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ + 0, /* bSmallMalloc */ + 1, /* bExtraSchemaChecks */ + 0x7ffffffe, /* mxStrlen */ + 0, /* neverCorrupt */ + SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ + SQLITE_STMTJRNL_SPILL, /* nStmtSpill */ + {0,0,0,0,0,0,0,0}, /* m */ + {0,0,0,0,0,0,0,0,0}, /* mutex */ + {0,0,0,0,0,0,0,0,0,0,0,0,0},/* pcache2 */ + (void*)0, /* pHeap */ + 0, /* nHeap */ + 0, 0, /* mnHeap, mxHeap */ + SQLITE_DEFAULT_MMAP_SIZE, /* szMmap */ + SQLITE_MAX_MMAP_SIZE, /* mxMmap */ + (void*)0, /* pPage */ + 0, /* szPage */ + SQLITE_DEFAULT_PCACHE_INITSZ, /* nPage */ + 0, /* mxParserStack */ + 0, /* sharedCacheEnabled */ + SQLITE_SORTER_PMASZ, /* szPma */ + /* All the rest should always be initialized to zero */ + 0, /* isInit */ + 0, /* inProgress */ + 0, /* isMutexInit */ + 0, /* isMallocInit */ + 0, /* isPCacheInit */ + 0, /* nRefInitMutex */ + 0, /* pInitMutex */ + 0, /* xLog */ + 0, /* pLogArg */ +#ifdef SQLITE_ENABLE_SQLLOG + 0, /* xSqllog */ + 0, /* pSqllogArg */ +#endif +#ifdef SQLITE_VDBE_COVERAGE + 0, /* xVdbeBranch */ + 0, /* pVbeBranchArg */ +#endif +#ifndef SQLITE_OMIT_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif +#ifndef SQLITE_UNTESTABLE + 0, /* xTestCallback */ +#endif + 0, /* bLocaltimeFault */ + 0, /* xAltLocaltime */ + 0x7ffffffe, /* iOnceResetThreshold */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ + 0, /* iPrngSeed */ +#ifdef SQLITE_DEBUG + {0,0,0,0,0,0} /* aTune */ +#endif +}; + +/* +** Hash table for global functions - functions common to all +** database connections. After initialization, this table is +** read-only. +*/ +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; + +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) +/* +** Counter used for coverage testing. Does not come into play for +** release builds. +** +** Access to this global variable is not mutex protected. This might +** result in TSAN warnings. But as the variable does not exist in +** release builds, that should not be a concern. +*/ +SQLITE_PRIVATE unsigned int sqlite3CoverageCounter; +#endif /* SQLITE_COVERAGE_TEST || SQLITE_DEBUG */ + +#ifdef VDBE_PROFILE +/* +** The following performance counter can be used in place of +** sqlite3Hwtime() for profiling. This is a no-op on standard builds. +*/ +SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt = 0; +#endif + +/* +** The value of the "pending" byte must be 0x40000000 (1 byte past the +** 1-gibabyte boundary) in a compatible database. SQLite never uses +** the database page that contains the pending byte. It never attempts +** to read or write that page. The pending byte page is set aside +** for use by the VFS layers as space for managing file locks. +** +** During testing, it is often desirable to move the pending byte to +** a different position in the file. This allows code that has to +** deal with the pending byte to run on files that are much smaller +** than 1 GiB. The sqlite3_test_control() interface can be used to +** move the pending byte. +** +** IMPORTANT: Changing the pending byte to any value other than +** 0x40000000 results in an incompatible database file format! +** Changing the pending byte during operation will result in undefined +** and incorrect behavior. +*/ +#ifndef SQLITE_OMIT_WSD +SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; +#endif + +/* +** Tracing flags set by SQLITE_TESTCTRL_TRACEFLAGS. +*/ +SQLITE_PRIVATE u32 sqlite3TreeTrace = 0; +SQLITE_PRIVATE u32 sqlite3WhereTrace = 0; + +/* #include "opcodes.h" */ +/* +** Properties of opcodes. The OPFLG_INITIALIZER macro is +** created by mkopcodeh.awk during compilation. Data is obtained +** from the comments following the "case OP_xxxx:" statements in +** the vdbe.c file. +*/ +SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; + +/* +** Name of the default collating sequence +*/ +SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY"; + +/* +** Standard typenames. These names must match the COLTYPE_* definitions. +** Adjust the SQLITE_N_STDTYPE value if adding or removing entries. +** +** sqlite3StdType[] The actual names of the datatypes. +** +** sqlite3StdTypeLen[] The length (in bytes) of each entry +** in sqlite3StdType[]. +** +** sqlite3StdTypeAffinity[] The affinity associated with each entry +** in sqlite3StdType[]. +** +** sqlite3StdTypeMap[] The type value (as returned from +** sqlite3_column_type() or sqlite3_value_type()) +** for each entry in sqlite3StdType[]. +*/ +SQLITE_PRIVATE const unsigned char sqlite3StdTypeLen[] = { 3, 4, 3, 7, 4, 4 }; +SQLITE_PRIVATE const char sqlite3StdTypeAffinity[] = { + SQLITE_AFF_NUMERIC, + SQLITE_AFF_BLOB, + SQLITE_AFF_INTEGER, + SQLITE_AFF_INTEGER, + SQLITE_AFF_REAL, + SQLITE_AFF_TEXT +}; +SQLITE_PRIVATE const char sqlite3StdTypeMap[] = { + 0, + SQLITE_BLOB, + SQLITE_INTEGER, + SQLITE_INTEGER, + SQLITE_FLOAT, + SQLITE_TEXT +}; +SQLITE_PRIVATE const char *sqlite3StdType[] = { + "ANY", + "BLOB", + "INT", + "INTEGER", + "REAL", + "TEXT" +}; + +/************** End of global.c **********************************************/ +/************** Begin file status.c ******************************************/ +/* +** 2008 June 18 +** +** 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 module implements the sqlite3_status() interface and related +** functionality. +*/ +/* #include "sqliteInt.h" */ +/************** Include vdbeInt.h in the middle of status.c ******************/ +/************** Begin file vdbeInt.h *****************************************/ +/* +** 2003 September 6 +** +** 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 is the header file for information that is private to the +** VDBE. This information used to all be at the top of the single +** source code file "vdbe.c". When that file became too big (over +** 6000 lines long) it was split up into several smaller files and +** this header information was factored out. +*/ +#ifndef SQLITE_VDBEINT_H +#define SQLITE_VDBEINT_H + +/* +** The maximum number of times that a statement will try to reparse +** itself before giving up and returning SQLITE_SCHEMA. +*/ +#ifndef SQLITE_MAX_SCHEMA_RETRY +# define SQLITE_MAX_SCHEMA_RETRY 50 +#endif + +/* +** VDBE_DISPLAY_P4 is true or false depending on whether or not the +** "explain" P4 display logic is enabled. +*/ +#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ + || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) \ + || defined(SQLITE_ENABLE_BYTECODE_VTAB) +# define VDBE_DISPLAY_P4 1 +#else +# define VDBE_DISPLAY_P4 0 +#endif + +/* +** SQL is translated into a sequence of instructions to be +** executed by a virtual machine. Each instruction is an instance +** of the following structure. +*/ +typedef struct VdbeOp Op; + +/* +** Boolean values +*/ +typedef unsigned Bool; + +/* Opaque type used by code in vdbesort.c */ +typedef struct VdbeSorter VdbeSorter; + +/* Elements of the linked list at Vdbe.pAuxData */ +typedef struct AuxData AuxData; + +/* Types of VDBE cursors */ +#define CURTYPE_BTREE 0 +#define CURTYPE_SORTER 1 +#define CURTYPE_VTAB 2 +#define CURTYPE_PSEUDO 3 + +/* +** A VdbeCursor is an superclass (a wrapper) for various cursor objects: +** +** * A b-tree cursor +** - In the main database or in an ephemeral database +** - On either an index or a table +** * A sorter +** * A virtual table +** * A one-row "pseudotable" stored in a single register +*/ +typedef struct VdbeCursor VdbeCursor; +struct VdbeCursor { + u8 eCurType; /* One of the CURTYPE_* values above */ + i8 iDb; /* Index of cursor database in db->aDb[] */ + u8 nullRow; /* True if pointing to a row with no data */ + u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ + u8 isTable; /* True for rowid tables. False for indexes */ +#ifdef SQLITE_DEBUG + u8 seekOp; /* Most recent seek operation on this cursor */ + u8 wrFlag; /* The wrFlag argument to sqlite3BtreeCursor() */ +#endif + Bool isEphemeral:1; /* True for an ephemeral table */ + Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ + Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ + Bool noReuse:1; /* OpenEphemeral may not reuse this cursor */ + u16 seekHit; /* See the OP_SeekHit and OP_IfNoHope opcodes */ + union { /* pBtx for isEphermeral. pAltMap otherwise */ + Btree *pBtx; /* Separate file holding temporary table */ + u32 *aAltMap; /* Mapping from table to index column numbers */ + } ub; + i64 seqCount; /* Sequence counter */ + + /* Cached OP_Column parse information is only valid if cacheStatus matches + ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of + ** CACHE_STALE (0) and so setting cacheStatus=CACHE_STALE guarantees that + ** the cache is out of date. */ + u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ + int seekResult; /* Result of previous sqlite3BtreeMoveto() or 0 + ** if there have been no prior seeks on the cursor. */ + /* seekResult does not distinguish between "no seeks have ever occurred + ** on this cursor" and "the most recent seek was an exact match". + ** For CURTYPE_PSEUDO, seekResult is the register holding the record */ + + /* When a new VdbeCursor is allocated, only the fields above are zeroed. + ** The fields that follow are uninitialized, and must be individually + ** initialized prior to first use. */ + VdbeCursor *pAltCursor; /* Associated index cursor from which to read */ + union { + BtCursor *pCursor; /* CURTYPE_BTREE or _PSEUDO. Btree cursor */ + sqlite3_vtab_cursor *pVCur; /* CURTYPE_VTAB. Vtab cursor */ + VdbeSorter *pSorter; /* CURTYPE_SORTER. Sorter object */ + } uc; + KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ + u32 iHdrOffset; /* Offset to next unparsed byte of the header */ + Pgno pgnoRoot; /* Root page of the open btree cursor */ + i16 nField; /* Number of fields in the header */ + u16 nHdrParsed; /* Number of header fields parsed so far */ + i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ + u32 *aOffset; /* Pointer to aType[nField] */ + const u8 *aRow; /* Data for the current row, if all on one page */ + u32 payloadSize; /* Total number of bytes in the record */ + u32 szRow; /* Byte available in aRow */ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + u64 maskUsed; /* Mask of columns used by this cursor */ +#endif + + /* 2*nField extra array elements allocated for aType[], beyond the one + ** static element declared in the structure. nField total array slots for + ** aType[] and nField+1 array slots for aOffset[] */ + u32 aType[1]; /* Type values record decode. MUST BE LAST */ +}; + +/* Return true if P is a null-only cursor +*/ +#define IsNullCursor(P) \ + ((P)->eCurType==CURTYPE_PSEUDO && (P)->nullRow && (P)->seekResult==0) + + +/* +** A value for VdbeCursor.cacheStatus that means the cache is always invalid. +*/ +#define CACHE_STALE 0 + +/* +** When a sub-program is executed (OP_Program), a structure of this type +** is allocated to store the current value of the program counter, as +** well as the current memory cell array and various other frame specific +** values stored in the Vdbe struct. When the sub-program is finished, +** these values are copied back to the Vdbe from the VdbeFrame structure, +** restoring the state of the VM to as it was before the sub-program +** began executing. +** +** The memory for a VdbeFrame object is allocated and managed by a memory +** cell in the parent (calling) frame. When the memory cell is deleted or +** overwritten, the VdbeFrame object is not freed immediately. Instead, it +** is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame +** list is deleted when the VM is reset in VdbeHalt(). The reason for doing +** this instead of deleting the VdbeFrame immediately is to avoid recursive +** calls to sqlite3VdbeMemRelease() when the memory cells belonging to the +** child frame are released. +** +** The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is +** set to NULL if the currently executing frame is the main program. +*/ +typedef struct VdbeFrame VdbeFrame; +struct VdbeFrame { + Vdbe *v; /* VM this frame belongs to */ + VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */ + Op *aOp; /* Program instructions for parent frame */ + i64 *anExec; /* Event counters from parent frame */ + Mem *aMem; /* Array of memory cells for parent frame */ + VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ + u8 *aOnce; /* Bitmask used by OP_Once */ + void *token; /* Copy of SubProgram.token */ + i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ +#if SQLITE_DEBUG + u32 iFrameMagic; /* magic number for sanity checking */ +#endif + int nCursor; /* Number of entries in apCsr */ + int pc; /* Program Counter in parent (calling) frame */ + int nOp; /* Size of aOp array */ + int nMem; /* Number of entries in aMem */ + int nChildMem; /* Number of memory cells for child frame */ + int nChildCsr; /* Number of cursors for child frame */ + i64 nChange; /* Statement changes (Vdbe.nChange) */ + i64 nDbChange; /* Value of db->nChange */ +}; + +/* Magic number for sanity checking on VdbeFrame objects */ +#define SQLITE_FRAME_MAGIC 0x879fb71e + +/* +** Return a pointer to the array of registers allocated for use +** by a VdbeFrame. +*/ +#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) + +/* +** Internally, the vdbe manipulates nearly all SQL values as Mem +** structures. Each Mem struct may cache multiple representations (string, +** integer etc.) of the same value. +*/ +struct sqlite3_value { + union MemValue { + double r; /* Real value used when MEM_Real is set in flags */ + i64 i; /* Integer value used when MEM_Int is set in flags */ + int nZero; /* Extra zero bytes when MEM_Zero and MEM_Blob set */ + const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */ + FuncDef *pDef; /* Used only when flags==MEM_Agg */ + } u; + char *z; /* String or BLOB value */ + int n; /* Number of characters in string value, excluding '\0' */ + u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ + u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ + u8 eSubtype; /* Subtype for this value */ + /* ShallowCopy only needs to copy the information above */ + sqlite3 *db; /* The associated database connection */ + int szMalloc; /* Size of the zMalloc allocation */ + u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */ + char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ + void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */ +#ifdef SQLITE_DEBUG + Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ + u16 mScopyFlags; /* flags value immediately after the shallow copy */ +#endif +}; + +/* +** Size of struct Mem not including the Mem.zMalloc member or anything that +** follows. +*/ +#define MEMCELLSIZE offsetof(Mem,db) + +/* One or more of the following flags are set to indicate the +** representations of the value stored in the Mem struct. +** +** * MEM_Null An SQL NULL value +** +** * MEM_Null|MEM_Zero An SQL NULL with the virtual table +** UPDATE no-change flag set +** +** * MEM_Null|MEM_Term| An SQL NULL, but also contains a +** MEM_Subtype pointer accessible using +** sqlite3_value_pointer(). +** +** * MEM_Null|MEM_Cleared Special SQL NULL that compares non-equal +** to other NULLs even using the IS operator. +** +** * MEM_Str A string, stored in Mem.z with +** length Mem.n. Zero-terminated if +** MEM_Term is set. This flag is +** incompatible with MEM_Blob and +** MEM_Null, but can appear with MEM_Int, +** MEM_Real, and MEM_IntReal. +** +** * MEM_Blob A blob, stored in Mem.z length Mem.n. +** Incompatible with MEM_Str, MEM_Null, +** MEM_Int, MEM_Real, and MEM_IntReal. +** +** * MEM_Blob|MEM_Zero A blob in Mem.z of length Mem.n plus +** MEM.u.i extra 0x00 bytes at the end. +** +** * MEM_Int Integer stored in Mem.u.i. +** +** * MEM_Real Real stored in Mem.u.r. +** +** * MEM_IntReal Real stored as an integer in Mem.u.i. +** +** If the MEM_Null flag is set, then the value is an SQL NULL value. +** For a pointer type created using sqlite3_bind_pointer() or +** sqlite3_result_pointer() the MEM_Term and MEM_Subtype flags are also set. +** +** If the MEM_Str flag is set then Mem.z points at a string representation. +** Usually this is encoded in the same unicode encoding as the main +** database (see below for exceptions). If the MEM_Term flag is also +** set, then the string is nul terminated. The MEM_Int and MEM_Real +** flags may coexist with the MEM_Str flag. +*/ +#define MEM_Undefined 0x0000 /* Value is undefined */ +#define MEM_Null 0x0001 /* Value is NULL (or a pointer) */ +#define MEM_Str 0x0002 /* Value is a string */ +#define MEM_Int 0x0004 /* Value is an integer */ +#define MEM_Real 0x0008 /* Value is a real number */ +#define MEM_Blob 0x0010 /* Value is a BLOB */ +#define MEM_IntReal 0x0020 /* MEM_Int that stringifies like MEM_Real */ +#define MEM_AffMask 0x003f /* Mask of affinity bits */ + +/* Extra bits that modify the meanings of the core datatypes above +*/ +#define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */ + /* 0x0080 // Available */ +#define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ +#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */ +#define MEM_Zero 0x0400 /* Mem.i contains count of 0s appended to blob */ +#define MEM_Subtype 0x0800 /* Mem.eSubtype is valid */ +#define MEM_TypeMask 0x0dbf /* Mask of type bits */ + +/* Bits that determine the storage for Mem.z for a string or blob or +** aggregate accumulator. +*/ +#define MEM_Dyn 0x1000 /* Need to call Mem.xDel() on Mem.z */ +#define MEM_Static 0x2000 /* Mem.z points to a static string */ +#define MEM_Ephem 0x4000 /* Mem.z points to an ephemeral string */ +#define MEM_Agg 0x8000 /* Mem.z points to an agg function context */ + +/* Return TRUE if Mem X contains dynamically allocated content - anything +** that needs to be deallocated to avoid a leak. +*/ +#define VdbeMemDynamic(X) \ + (((X)->flags&(MEM_Agg|MEM_Dyn))!=0) + +/* +** Clear any existing type flags from a Mem and replace them with f +*/ +#define MemSetTypeFlag(p, f) \ + ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f) + +/* +** True if Mem X is a NULL-nochng type. +*/ +#define MemNullNochng(X) \ + (((X)->flags&MEM_TypeMask)==(MEM_Null|MEM_Zero) \ + && (X)->n==0 && (X)->u.nZero==0) + +/* +** Return true if a memory cell has been initialized and is valid. +** is for use inside assert() statements only. +** +** A Memory cell is initialized if at least one of the +** MEM_Null, MEM_Str, MEM_Int, MEM_Real, MEM_Blob, or MEM_IntReal bits +** is set. It is "undefined" if all those bits are zero. +*/ +#ifdef SQLITE_DEBUG +#define memIsValid(M) ((M)->flags & MEM_AffMask)!=0 +#endif + +/* +** Each auxiliary data pointer stored by a user defined function +** implementation calling sqlite3_set_auxdata() is stored in an instance +** of this structure. All such structures associated with a single VM +** are stored in a linked list headed at Vdbe.pAuxData. All are destroyed +** when the VM is halted (if not before). +*/ +struct AuxData { + int iAuxOp; /* Instruction number of OP_Function opcode */ + int iAuxArg; /* Index of function argument. */ + void *pAux; /* Aux data pointer */ + void (*xDeleteAux)(void*); /* Destructor for the aux data */ + AuxData *pNextAux; /* Next element in list */ +}; + +/* +** The "context" argument for an installable function. A pointer to an +** instance of this structure is the first argument to the routines used +** implement the SQL functions. +** +** There is a typedef for this structure in sqlite.h. So all routines, +** even the public interface to SQLite, can use a pointer to this structure. +** But this file is the only place where the internal details of this +** structure are known. +** +** This structure is defined inside of vdbeInt.h because it uses substructures +** (Mem) which are only defined there. +*/ +struct sqlite3_context { + Mem *pOut; /* The return value is stored here */ + FuncDef *pFunc; /* Pointer to function information */ + Mem *pMem; /* Memory cell used to store aggregate context */ + Vdbe *pVdbe; /* The VM that owns this context */ + int iOp; /* Instruction number of OP_Function */ + int isError; /* Error code returned by the function. */ + u8 enc; /* Encoding to use for results */ + u8 skipFlag; /* Skip accumulator loading if true */ + u8 argc; /* Number of arguments */ + sqlite3_value *argv[1]; /* Argument set */ +}; + +/* A bitfield type for use inside of structures. Always follow with :N where +** N is the number of bits. +*/ +typedef unsigned bft; /* Bit Field Type */ + +/* The ScanStatus object holds a single value for the +** sqlite3_stmt_scanstatus() interface. +*/ +typedef struct ScanStatus ScanStatus; +struct ScanStatus { + int addrExplain; /* OP_Explain for loop */ + int addrLoop; /* Address of "loops" counter */ + int addrVisit; /* Address of "rows visited" counter */ + int iSelectID; /* The "Select-ID" for this loop */ + LogEst nEst; /* Estimated output rows per loop */ + char *zName; /* Name of table or index */ +}; + +/* The DblquoteStr object holds the text of a double-quoted +** string for a prepared statement. A linked list of these objects +** is constructed during statement parsing and is held on Vdbe.pDblStr. +** When computing a normalized SQL statement for an SQL statement, that +** list is consulted for each double-quoted identifier to see if the +** identifier should really be a string literal. +*/ +typedef struct DblquoteStr DblquoteStr; +struct DblquoteStr { + DblquoteStr *pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ +}; + +/* +** An instance of the virtual machine. This structure contains the complete +** state of the virtual machine. +** +** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare() +** is really a pointer to an instance of this structure. +*/ +struct Vdbe { + sqlite3 *db; /* The database connection that owns this statement */ + Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ + Parse *pParse; /* Parsing context used to create this Vdbe */ + ynVar nVar; /* Number of entries in aVar[] */ + int nMem; /* Number of memory locations currently allocated */ + int nCursor; /* Number of slots in apCsr[] */ + u32 cacheCtr; /* VdbeCursor row cache generation counter */ + int pc; /* The program counter */ + int rc; /* Value to return */ + i64 nChange; /* Number of db changes made since last reset */ + int iStatement; /* Statement number (or 0 if has no opened stmt) */ + i64 iCurrentTime; /* Value of julianday('now') for this statement */ + i64 nFkConstraint; /* Number of imm. FK constraints this VM */ + i64 nStmtDefCons; /* Number of def. constraints when stmt started */ + i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ + + /* When allocating a new Vdbe object, all of the fields below should be + ** initialized to zero or NULL */ + + Op *aOp; /* Space to hold the virtual machine's program */ + int nOp; /* Number of instructions in the program */ + int nOpAlloc; /* Slots allocated for aOp[] */ + Mem *aColName; /* Column names to return */ + Mem *pResultSet; /* Pointer to an array of results */ + char *zErrMsg; /* Error message written here */ + VList *pVList; /* Name of variables */ +#ifndef SQLITE_OMIT_TRACE + i64 startTime; /* Time when query started - used for profiling */ +#endif +#ifdef SQLITE_DEBUG + int rcApp; /* errcode set by sqlite3_result_error_code() */ + u32 nWrite; /* Number of write operations that have occurred */ +#endif + u16 nResColumn; /* Number of columns in one row of the result set */ + u8 errorAction; /* Recovery action to do in case of an error */ + u8 minWriteFileFormat; /* Minimum file format for writable database files */ + u8 prepFlags; /* SQLITE_PREPARE_* flags */ + u8 eVdbeState; /* On of the VDBE_*_STATE values */ + bft expired:2; /* 1: recompile VM immediately 2: when convenient */ + bft explain:2; /* True if EXPLAIN present on SQL command */ + bft changeCntOn:1; /* True to update the change-counter */ + bft usesStmtJournal:1; /* True if uses a statement journal */ + bft readOnly:1; /* True for statements that do not write */ + bft bIsReader:1; /* True for statements that read */ + yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ + yDbMask lockMask; /* Subset of btreeMask that requires a lock */ + u32 aCounter[9]; /* Counters used by sqlite3_stmt_status() */ + char *zSql; /* Text of the SQL statement that generated this */ +#ifdef SQLITE_ENABLE_NORMALIZE + char *zNormSql; /* Normalization of the associated SQL statement */ + DblquoteStr *pDblStr; /* List of double-quoted string literals */ +#endif + void *pFree; /* Free this when deleting the vdbe */ + VdbeFrame *pFrame; /* Parent frame */ + VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */ + int nFrame; /* Number of frames in pFrame list */ + u32 expmask; /* Binding to these vars invalidates VM */ + SubProgram *pProgram; /* Linked list of all sub-programs used by VM */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + i64 *anExec; /* Number of times each op has been executed */ + int nScan; /* Entries in aScan[] */ + ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */ +#endif +}; + +/* +** The following are allowed values for Vdbe.eVdbeState +*/ +#define VDBE_INIT_STATE 0 /* Prepared statement under construction */ +#define VDBE_READY_STATE 1 /* Ready to run but not yet started */ +#define VDBE_RUN_STATE 2 /* Run in progress */ +#define VDBE_HALT_STATE 3 /* Finished. Need reset() or finalize() */ + +/* +** Structure used to store the context required by the +** sqlite3_preupdate_*() API functions. +*/ +struct PreUpdate { + Vdbe *v; + VdbeCursor *pCsr; /* Cursor to read old values from */ + int op; /* One of SQLITE_INSERT, UPDATE, DELETE */ + u8 *aRecord; /* old.* database record */ + KeyInfo keyinfo; + UnpackedRecord *pUnpacked; /* Unpacked version of aRecord[] */ + UnpackedRecord *pNewUnpacked; /* Unpacked version of new.* record */ + int iNewReg; /* Register for new.* values */ + int iBlobWrite; /* Value returned by preupdate_blobwrite() */ + i64 iKey1; /* First key value passed to hook */ + i64 iKey2; /* Second key value passed to hook */ + Mem *aNew; /* Array of new.* values */ + Table *pTab; /* Schema object being upated */ + Index *pPk; /* PK index if pTab is WITHOUT ROWID */ +}; + +/* +** An instance of this object is used to pass an vector of values into +** OP_VFilter, the xFilter method of a virtual table. The vector is the +** set of values on the right-hand side of an IN constraint. +** +** The value as passed into xFilter is an sqlite3_value with a "pointer" +** type, such as is generated by sqlite3_result_pointer() and read by +** sqlite3_value_pointer. Such values have MEM_Term|MEM_Subtype|MEM_Null +** and a subtype of 'p'. The sqlite3_vtab_in_first() and _next() interfaces +** know how to use this object to step through all the values in the +** right operand of the IN constraint. +*/ +typedef struct ValueList ValueList; +struct ValueList { + BtCursor *pCsr; /* An ephemeral table holding all values */ + sqlite3_value *pOut; /* Register to hold each decoded output value */ +}; + +/* Size of content associated with serial types that fit into a +** single-byte varint. +*/ +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[]; +#endif + +/* +** Function prototypes +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); +SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe*,VdbeCursor*); +void sqliteVdbePopStack(Vdbe*,int); +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p); +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*); +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); +SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in); +# define swapMixedEndianFloat(X) X = sqlite3FloatSwap(X) +#else +# define swapMixedEndianFloat(X) +#endif +SQLITE_PRIVATE void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); + +int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); +SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); +SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); +SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*); +#if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) +SQLITE_PRIVATE int sqlite3VdbeNextOpcode(Vdbe*,Mem*,int,int*,int*,Op**); +SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3*,Op*); +#endif +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) +SQLITE_PRIVATE char *sqlite3VdbeDisplayComment(sqlite3*,const Op*,const char*); +#endif +#if !defined(SQLITE_OMIT_EXPLAIN) +SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*); +#endif +SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int); +SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int); +SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem*, Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemSetStr(Mem*, const char*, i64, u8, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64); +#ifdef SQLITE_OMIT_FLOATING_POINT +# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64 +#else +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double); +#endif +SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(Mem*, void*, const char*, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem*,sqlite3*,u16); +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*); +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int); +#else +SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem*,int); +#endif +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*); +#endif +SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8); +SQLITE_PRIVATE int sqlite3IntFloatCompare(i64,double); +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*); +SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); +SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); +SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset(BtCursor*,u32,Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem*p); +SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); +#endif +#if !defined(SQLITE_OMIT_EXPLAIN) || defined(SQLITE_ENABLE_BYTECODE_VTAB) +SQLITE_PRIVATE const char *sqlite3OpcodeName(int); +#endif +SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); +SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame*); +#endif +SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void*); /* Destructor on Mem */ +SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*); /* Actually deletes the Frame */ +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( + Vdbe*,VdbeCursor*,int,const char*,Table*,i64,int,int); +#endif +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p); + +SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *, int, VdbeCursor *); +SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *, VdbeSorter *); +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *); +SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *, Mem *); +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *); +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *); +SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *); +SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *); + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*); +#else +# define sqlite3VdbeIncrWriteCounter(V,C) +# define sqlite3VdbeAssertAbortable(V) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); +#else +# define sqlite3VdbeEnter(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); +#else +# define sqlite3VdbeLeave(X) +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*); +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem*); +#endif + +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); +#else +# define sqlite3VdbeCheckFk(p,i) 0 +#endif + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr); +#endif +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem); +#endif + +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); + #define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0) +#else + #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK + #define ExpandBlob(P) SQLITE_OK +#endif + +#endif /* !defined(SQLITE_VDBEINT_H) */ + +/************** End of vdbeInt.h *********************************************/ +/************** Continuing where we left off in status.c *********************/ + +/* +** Variables in which to record status information. +*/ +#if SQLITE_PTRSIZE>4 +typedef sqlite3_int64 sqlite3StatValueType; +#else +typedef u32 sqlite3StatValueType; +#endif +typedef struct sqlite3StatType sqlite3StatType; +static SQLITE_WSD struct sqlite3StatType { + sqlite3StatValueType nowValue[10]; /* Current value */ + sqlite3StatValueType mxValue[10]; /* Maximum value */ +} sqlite3Stat = { {0,}, {0,} }; + +/* +** Elements of sqlite3Stat[] are protected by either the memory allocator +** mutex, or by the pcache1 mutex. The following array determines which. +*/ +static const char statMutex[] = { + 0, /* SQLITE_STATUS_MEMORY_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_OVERFLOW */ + 0, /* SQLITE_STATUS_SCRATCH_USED */ + 0, /* SQLITE_STATUS_SCRATCH_OVERFLOW */ + 0, /* SQLITE_STATUS_MALLOC_SIZE */ + 0, /* SQLITE_STATUS_PARSER_STACK */ + 1, /* SQLITE_STATUS_PAGECACHE_SIZE */ + 0, /* SQLITE_STATUS_SCRATCH_SIZE */ + 0, /* SQLITE_STATUS_MALLOC_COUNT */ +}; + + +/* The "wsdStat" macro will resolve to the status information +** state vector. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdStat can refer directly +** to the "sqlite3Stat" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat) +# define wsdStat x[0] +#else +# define wsdStatInit +# define wsdStat sqlite3Stat +#endif + +/* +** Return the current value of a status parameter. The caller must +** be holding the appropriate mutex. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int op){ + wsdStatInit; + assert( op>=0 && op=0 && op=0 && op=0 && opwsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = wsdStat.nowValue[op]; + } +} +SQLITE_PRIVATE void sqlite3StatusDown(int op, int N){ + wsdStatInit; + assert( N>=0 ); + assert( op>=0 && op=0 && op=0 ); + newValue = (sqlite3StatValueType)X; + assert( op>=0 && op=0 && opwsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = newValue; + } +} + +/* +** Query status information. +*/ +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +){ + sqlite3_mutex *pMutex; + wsdStatInit; + if( op<0 || op>=ArraySize(wsdStat.nowValue) ){ + return SQLITE_MISUSE_BKPT; + } +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + pMutex = statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex(); + sqlite3_mutex_enter(pMutex); + *pCurrent = wsdStat.nowValue[op]; + *pHighwater = wsdStat.mxValue[op]; + if( resetFlag ){ + wsdStat.mxValue[op] = wsdStat.nowValue[op]; + } + sqlite3_mutex_leave(pMutex); + (void)pMutex; /* Prevent warning when SQLITE_THREADSAFE=0 */ + return SQLITE_OK; +} +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ + sqlite3_int64 iCur = 0, iHwtr = 0; + int rc; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + rc = sqlite3_status64(op, &iCur, &iHwtr, resetFlag); + if( rc==0 ){ + *pCurrent = (int)iCur; + *pHighwater = (int)iHwtr; + } + return rc; +} + +/* +** Return the number of LookasideSlot elements on the linked list +*/ +static u32 countLookasideSlots(LookasideSlot *p){ + u32 cnt = 0; + while( p ){ + p = p->pNext; + cnt++; + } + return cnt; +} + +/* +** Count the number of slots of lookaside memory that are outstanding +*/ +SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ + u32 nInit = countLookasideSlots(db->lookaside.pInit); + u32 nFree = countLookasideSlots(db->lookaside.pFree); +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + nInit += countLookasideSlots(db->lookaside.pSmallInit); + nFree += countLookasideSlots(db->lookaside.pSmallFree); +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; + return db->lookaside.nSlot - (nInit+nFree); +} + +/* +** Query status information for a single database connection +*/ +SQLITE_API int sqlite3_db_status( + sqlite3 *db, /* The database connection whose status is desired */ + int op, /* Status verb */ + int *pCurrent, /* Write current value here */ + int *pHighwater, /* Write high-water mark here */ + int resetFlag /* Reset high-water mark if true */ +){ + int rc = SQLITE_OK; /* Return code */ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pCurrent==0|| pHighwater==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + switch( op ){ + case SQLITE_DBSTATUS_LOOKASIDE_USED: { + *pCurrent = sqlite3LookasideUsed(db, pHighwater); + if( resetFlag ){ + LookasideSlot *p = db->lookaside.pFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pInit; + db->lookaside.pInit = db->lookaside.pFree; + db->lookaside.pFree = 0; + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + p = db->lookaside.pSmallFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = 0; + } +#endif + } + break; + } + + case SQLITE_DBSTATUS_LOOKASIDE_HIT: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: { + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 ); + *pCurrent = 0; + *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT]; + if( resetFlag ){ + db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; + } + break; + } + + /* + ** Return an approximation for the amount of memory currently used + ** by all pagers associated with the given database connection. The + ** highwater mark is meaningless and is returned as zero. + */ + case SQLITE_DBSTATUS_CACHE_USED_SHARED: + case SQLITE_DBSTATUS_CACHE_USED: { + int totalUsed = 0; + int i; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + Pager *pPager = sqlite3BtreePager(pBt); + int nByte = sqlite3PagerMemUsed(pPager); + if( op==SQLITE_DBSTATUS_CACHE_USED_SHARED ){ + nByte = nByte / sqlite3BtreeConnectionCount(pBt); + } + totalUsed += nByte; + } + } + sqlite3BtreeLeaveAll(db); + *pCurrent = totalUsed; + *pHighwater = 0; + break; + } + + /* + ** *pCurrent gets an accurate estimate of the amount of memory used + ** to store the schema for all databases (main, temp, and any ATTACHed + ** databases. *pHighwater is set to zero. + */ + case SQLITE_DBSTATUS_SCHEMA_USED: { + int i; /* Used to iterate through schemas */ + int nByte = 0; /* Used to accumulate return value */ + + sqlite3BtreeEnterAll(db); + db->pnBytesFreed = &nByte; + for(i=0; inDb; i++){ + Schema *pSchema = db->aDb[i].pSchema; + if( ALWAYS(pSchema!=0) ){ + HashElem *p; + + nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * ( + pSchema->tblHash.count + + pSchema->trigHash.count + + pSchema->idxHash.count + + pSchema->fkeyHash.count + ); + nByte += sqlite3_msize(pSchema->tblHash.ht); + nByte += sqlite3_msize(pSchema->trigHash.ht); + nByte += sqlite3_msize(pSchema->idxHash.ht); + nByte += sqlite3_msize(pSchema->fkeyHash.ht); + + for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){ + sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p)); + } + for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ + sqlite3DeleteTable(db, (Table *)sqliteHashData(p)); + } + } + } + db->pnBytesFreed = 0; + sqlite3BtreeLeaveAll(db); + + *pHighwater = 0; + *pCurrent = nByte; + break; + } + + /* + ** *pCurrent gets an accurate estimate of the amount of memory used + ** to store all prepared statements. + ** *pHighwater is set to zero. + */ + case SQLITE_DBSTATUS_STMT_USED: { + struct Vdbe *pVdbe; /* Used to iterate through VMs */ + int nByte = 0; /* Used to accumulate return value */ + + db->pnBytesFreed = &nByte; + for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){ + sqlite3VdbeDelete(pVdbe); + } + db->pnBytesFreed = 0; + + *pHighwater = 0; /* IMP: R-64479-57858 */ + *pCurrent = nByte; + + break; + } + + /* + ** Set *pCurrent to the total cache hits or misses encountered by all + ** pagers the database handle is connected to. *pHighwater is always set + ** to zero. + */ + case SQLITE_DBSTATUS_CACHE_SPILL: + op = SQLITE_DBSTATUS_CACHE_WRITE+1; + /* no break */ deliberate_fall_through + case SQLITE_DBSTATUS_CACHE_HIT: + case SQLITE_DBSTATUS_CACHE_MISS: + case SQLITE_DBSTATUS_CACHE_WRITE:{ + int i; + int nRet = 0; + assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 ); + assert( SQLITE_DBSTATUS_CACHE_WRITE==SQLITE_DBSTATUS_CACHE_HIT+2 ); + + for(i=0; inDb; i++){ + if( db->aDb[i].pBt ){ + Pager *pPager = sqlite3BtreePager(db->aDb[i].pBt); + sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet); + } + } + *pHighwater = 0; /* IMP: R-42420-56072 */ + /* IMP: R-54100-20147 */ + /* IMP: R-29431-39229 */ + *pCurrent = nRet; + break; + } + + /* Set *pCurrent to non-zero if there are unresolved deferred foreign + ** key constraints. Set *pCurrent to zero if all foreign key constraints + ** have been satisfied. The *pHighwater is always set to zero. + */ + case SQLITE_DBSTATUS_DEFERRED_FKS: { + *pHighwater = 0; /* IMP: R-11967-56545 */ + *pCurrent = db->nDeferredImmCons>0 || db->nDeferredCons>0; + break; + } + + default: { + rc = SQLITE_ERROR; + } + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/************** End of status.c **********************************************/ +/************** Begin file date.c ********************************************/ +/* +** 2003 October 31 +** +** 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 contains the C functions that implement date and time +** functions for SQLite. +** +** There is only one exported symbol in this file - the function +** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. +** All other code has file scope. +** +** SQLite processes all times and dates as julian day numbers. The +** dates and times are stored as the number of days since noon +** in Greenwich on November 24, 4714 B.C. according to the Gregorian +** calendar system. +** +** 1970-01-01 00:00:00 is JD 2440587.5 +** 2000-01-01 00:00:00 is JD 2451544.5 +** +** This implementation requires years to be expressed as a 4-digit number +** which means that only dates between 0000-01-01 and 9999-12-31 can +** be represented, even though julian day numbers allow a much wider +** range of dates. +** +** The Gregorian calendar system is used for all dates and times, +** even those that predate the Gregorian calendar. Historians usually +** use the julian calendar for dates prior to 1582-10-15 and for some +** dates afterwards, depending on locale. Beware of this difference. +** +** The conversion algorithms are implemented based on descriptions +** in the following text: +** +** Jean Meeus +** Astronomical Algorithms, 2nd Edition, 1998 +** ISBN 0-943396-61-1 +** Willmann-Bell, Inc +** Richmond, Virginia (USA) +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ +#include + +#ifndef SQLITE_OMIT_DATETIME_FUNCS + +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So declare a substitute. The substitute function itself is +** defined in "os_win.c". +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +struct tm *__cdecl localtime(const time_t *); +#endif + +/* +** A structure for holding a single date and time. +*/ +typedef struct DateTime DateTime; +struct DateTime { + sqlite3_int64 iJD; /* The julian day number times 86400000 */ + int Y, M, D; /* Year, month, and day */ + int h, m; /* Hour and minutes */ + int tz; /* Timezone offset in minutes */ + double s; /* Seconds */ + char validJD; /* True (1) if iJD is valid */ + char rawS; /* Raw numeric value stored in s */ + char validYMD; /* True (1) if Y,M,D are valid */ + char validHMS; /* True (1) if h,m,s are valid */ + char validTZ; /* True (1) if tz is valid */ + char tzSet; /* Timezone was set explicitly */ + char isError; /* An overflow has occurred */ +}; + + +/* +** Convert zDate into one or more integers according to the conversion +** specifier zFormat. +** +** zFormat[] contains 4 characters for each integer converted, except for +** the last integer which is specified by three characters. The meaning +** of a four-character format specifiers ABCD is: +** +** A: number of digits to convert. Always "2" or "4". +** B: minimum value. Always "0" or "1". +** C: maximum value, decoded as: +** a: 12 +** b: 14 +** c: 24 +** d: 31 +** e: 59 +** f: 9999 +** D: the separator character, or \000 to indicate this is the +** last number to convert. +** +** Example: To translate an ISO-8601 date YYYY-MM-DD, the format would +** be "40f-21a-20c". The "40f-" indicates the 4-digit year followed by "-". +** The "21a-" indicates the 2-digit month followed by "-". The "20c" indicates +** the 2-digit day which is the last integer in the set. +** +** The function returns the number of successful conversions. +*/ +static int getDigits(const char *zDate, const char *zFormat, ...){ + /* The aMx[] array translates the 3rd character of each format + ** spec into a max size: a b c d e f */ + static const u16 aMx[] = { 12, 14, 24, 31, 59, 9999 }; + va_list ap; + int cnt = 0; + char nextC; + va_start(ap, zFormat); + do{ + char N = zFormat[0] - '0'; + char min = zFormat[1] - '0'; + int val = 0; + u16 max; + + assert( zFormat[2]>='a' && zFormat[2]<='f' ); + max = aMx[zFormat[2] - 'a']; + nextC = zFormat[3]; + val = 0; + while( N-- ){ + if( !sqlite3Isdigit(*zDate) ){ + goto end_getDigits; + } + val = val*10 + *zDate - '0'; + zDate++; + } + if( val<(int)min || val>(int)max || (nextC!=0 && nextC!=*zDate) ){ + goto end_getDigits; + } + *va_arg(ap,int*) = val; + zDate++; + cnt++; + zFormat += 4; + }while( nextC ); +end_getDigits: + va_end(ap); + return cnt; +} + +/* +** Parse a timezone extension on the end of a date-time. +** The extension is of the form: +** +** (+/-)HH:MM +** +** Or the "zulu" notation: +** +** Z +** +** If the parse is successful, write the number of minutes +** of change in p->tz and return 0. If a parser error occurs, +** return non-zero. +** +** A missing specifier is not considered an error. +*/ +static int parseTimezone(const char *zDate, DateTime *p){ + int sgn = 0; + int nHr, nMn; + int c; + while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tz = 0; + c = *zDate; + if( c=='-' ){ + sgn = -1; + }else if( c=='+' ){ + sgn = +1; + }else if( c=='Z' || c=='z' ){ + zDate++; + goto zulu_time; + }else{ + return c!=0; + } + zDate++; + if( getDigits(zDate, "20b:20e", &nHr, &nMn)!=2 ){ + return 1; + } + zDate += 5; + p->tz = sgn*(nMn + nHr*60); +zulu_time: + while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tzSet = 1; + return *zDate!=0; +} + +/* +** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF. +** The HH, MM, and SS must each be exactly 2 digits. The +** fractional seconds FFFF can be one or more digits. +** +** Return 1 if there is a parsing error and 0 on success. +*/ +static int parseHhMmSs(const char *zDate, DateTime *p){ + int h, m, s; + double ms = 0.0; + if( getDigits(zDate, "20c:20e", &h, &m)!=2 ){ + return 1; + } + zDate += 5; + if( *zDate==':' ){ + zDate++; + if( getDigits(zDate, "20e", &s)!=1 ){ + return 1; + } + zDate += 2; + if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){ + double rScale = 1.0; + zDate++; + while( sqlite3Isdigit(*zDate) ){ + ms = ms*10.0 + *zDate - '0'; + rScale *= 10.0; + zDate++; + } + ms /= rScale; + } + }else{ + s = 0; + } + p->validJD = 0; + p->rawS = 0; + p->validHMS = 1; + p->h = h; + p->m = m; + p->s = s + ms; + if( parseTimezone(zDate, p) ) return 1; + p->validTZ = (p->tz!=0)?1:0; + return 0; +} + +/* +** Put the DateTime object into its error state. +*/ +static void datetimeError(DateTime *p){ + memset(p, 0, sizeof(*p)); + p->isError = 1; +} + +/* +** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume +** that the YYYY-MM-DD is according to the Gregorian calendar. +** +** Reference: Meeus page 61 +*/ +static void computeJD(DateTime *p){ + int Y, M, D, A, B, X1, X2; + + if( p->validJD ) return; + if( p->validYMD ){ + Y = p->Y; + M = p->M; + D = p->D; + }else{ + Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ + M = 1; + D = 1; + } + if( Y<-4713 || Y>9999 || p->rawS ){ + datetimeError(p); + return; + } + if( M<=2 ){ + Y--; + M += 12; + } + A = Y/100; + B = 2 - A + (A/4); + X1 = 36525*(Y+4716)/100; + X2 = 306001*(M+1)/10000; + p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000); + p->validJD = 1; + if( p->validHMS ){ + p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000); + if( p->validTZ ){ + p->iJD -= p->tz*60000; + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; + } + } +} + +/* +** Parse dates of the form +** +** YYYY-MM-DD HH:MM:SS.FFF +** YYYY-MM-DD HH:MM:SS +** YYYY-MM-DD HH:MM +** YYYY-MM-DD +** +** Write the result into the DateTime structure and return 0 +** on success and 1 if the input string is not a well-formed +** date. +*/ +static int parseYyyyMmDd(const char *zDate, DateTime *p){ + int Y, M, D, neg; + + if( zDate[0]=='-' ){ + zDate++; + neg = 1; + }else{ + neg = 0; + } + if( getDigits(zDate, "40f-21a-21d", &Y, &M, &D)!=3 ){ + return 1; + } + zDate += 10; + while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; } + if( parseHhMmSs(zDate, p)==0 ){ + /* We got the time */ + }else if( *zDate==0 ){ + p->validHMS = 0; + }else{ + return 1; + } + p->validJD = 0; + p->validYMD = 1; + p->Y = neg ? -Y : Y; + p->M = M; + p->D = D; + if( p->validTZ ){ + computeJD(p); + } + return 0; +} + +/* +** Set the time to the current time reported by the VFS. +** +** Return the number of errors. +*/ +static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ + p->iJD = sqlite3StmtCurrentTime(context); + if( p->iJD>0 ){ + p->validJD = 1; + return 0; + }else{ + return 1; + } +} + +/* +** Input "r" is a numeric quantity which might be a julian day number, +** or the number of seconds since 1970. If the value if r is within +** range of a julian day number, install it as such and set validJD. +** If the value is a valid unix timestamp, put it in p->s and set p->rawS. +*/ +static void setRawDateNumber(DateTime *p, double r){ + p->s = r; + p->rawS = 1; + if( r>=0.0 && r<5373484.5 ){ + p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); + p->validJD = 1; + } +} + +/* +** Attempt to parse the given string into a julian day number. Return +** the number of errors. +** +** The following are acceptable forms for the input string: +** +** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM +** DDDD.DD +** now +** +** In the first form, the +/-HH:MM is always optional. The fractional +** seconds extension (the ".FFF") is optional. The seconds portion +** (":SS.FFF") is option. The year and date can be omitted as long +** as there is a time string. The time string can be omitted as long +** as there is a year and date. +*/ +static int parseDateOrTime( + sqlite3_context *context, + const char *zDate, + DateTime *p +){ + double r; + if( parseYyyyMmDd(zDate,p)==0 ){ + return 0; + }else if( parseHhMmSs(zDate, p)==0 ){ + return 0; + }else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){ + return setDateTimeToCurrent(context, p); + }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){ + setRawDateNumber(p, r); + return 0; + } + return 1; +} + +/* The julian day number for 9999-12-31 23:59:59.999 is 5373484.4999999. +** Multiplying this by 86400000 gives 464269060799999 as the maximum value +** for DateTime.iJD. +** +** But some older compilers (ex: gcc 4.2.1 on older Macs) cannot deal with +** such a large integer literal, so we have to encode it. +*/ +#define INT_464269060799999 ((((i64)0x1a640)<<32)|0x1072fdff) + +/* +** Return TRUE if the given julian day number is within range. +** +** The input is the JulianDay times 86400000. +*/ +static int validJulianDay(sqlite3_int64 iJD){ + return iJD>=0 && iJD<=INT_464269060799999; +} + +/* +** Compute the Year, Month, and Day from the julian day number. +*/ +static void computeYMD(DateTime *p){ + int Z, A, B, C, D, E, X1; + if( p->validYMD ) return; + if( !p->validJD ){ + p->Y = 2000; + p->M = 1; + p->D = 1; + }else if( !validJulianDay(p->iJD) ){ + datetimeError(p); + return; + }else{ + Z = (int)((p->iJD + 43200000)/86400000); + A = (int)((Z - 1867216.25)/36524.25); + A = Z + 1 + A - (A/4); + B = A + 1524; + C = (int)((B - 122.1)/365.25); + D = (36525*(C&32767))/100; + E = (int)((B-D)/30.6001); + X1 = (int)(30.6001*E); + p->D = B - D - X1; + p->M = E<14 ? E-1 : E-13; + p->Y = p->M>2 ? C - 4716 : C - 4715; + } + p->validYMD = 1; +} + +/* +** Compute the Hour, Minute, and Seconds from the julian day number. +*/ +static void computeHMS(DateTime *p){ + int s; + if( p->validHMS ) return; + computeJD(p); + s = (int)((p->iJD + 43200000) % 86400000); + p->s = s/1000.0; + s = (int)p->s; + p->s -= s; + p->h = s/3600; + s -= p->h*3600; + p->m = s/60; + p->s += s - p->m*60; + p->rawS = 0; + p->validHMS = 1; +} + +/* +** Compute both YMD and HMS +*/ +static void computeYMD_HMS(DateTime *p){ + computeYMD(p); + computeHMS(p); +} + +/* +** Clear the YMD and HMS and the TZ +*/ +static void clearYMD_HMS_TZ(DateTime *p){ + p->validYMD = 0; + p->validHMS = 0; + p->validTZ = 0; +} + +#ifndef SQLITE_OMIT_LOCALTIME +/* +** On recent Windows platforms, the localtime_s() function is available +** as part of the "Secure CRT". It is essentially equivalent to +** localtime_r() available under most POSIX platforms, except that the +** order of the parameters is reversed. +** +** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx. +** +** If the user has not indicated to use localtime_r() or localtime_s() +** already, check for an MSVC build environment that provides +** localtime_s(). +*/ +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S \ + && defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE) +#undef HAVE_LOCALTIME_S +#define HAVE_LOCALTIME_S 1 +#endif + +/* +** The following routine implements the rough equivalent of localtime_r() +** using whatever operating-system specific localtime facility that +** is available. This routine returns 0 on success and +** non-zero on any kind of error. +** +** If the sqlite3GlobalConfig.bLocaltimeFault variable is non-zero then this +** routine will always fail. If bLocaltimeFault is nonzero and +** sqlite3GlobalConfig.xAltLocaltime is not NULL, then xAltLocaltime() is +** invoked in place of the OS-defined localtime() function. +** +** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C +** library function localtime_r() is used to assist in the calculation of +** local time. +*/ +static int osLocaltime(time_t *t, struct tm *pTm){ + int rc; +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S + struct tm *pX; +#if SQLITE_THREADSAFE>0 + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); +#endif + sqlite3_mutex_enter(mutex); + pX = localtime(t); +#ifndef SQLITE_UNTESTABLE + if( sqlite3GlobalConfig.bLocaltimeFault ){ + if( sqlite3GlobalConfig.xAltLocaltime!=0 + && 0==sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm) + ){ + pX = pTm; + }else{ + pX = 0; + } + } +#endif + if( pX ) *pTm = *pX; +#if SQLITE_THREADSAFE>0 + sqlite3_mutex_leave(mutex); +#endif + rc = pX==0; +#else +#ifndef SQLITE_UNTESTABLE + if( sqlite3GlobalConfig.bLocaltimeFault ){ + if( sqlite3GlobalConfig.xAltLocaltime!=0 ){ + return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm); + }else{ + return 1; + } + } +#endif +#if HAVE_LOCALTIME_R + rc = localtime_r(t, pTm)==0; +#else + rc = localtime_s(pTm, t); +#endif /* HAVE_LOCALTIME_R */ +#endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */ + return rc; +} +#endif /* SQLITE_OMIT_LOCALTIME */ + + +#ifndef SQLITE_OMIT_LOCALTIME +/* +** Assuming the input DateTime is UTC, move it to its localtime equivalent. +*/ +static int toLocaltime( + DateTime *p, /* Date at which to calculate offset */ + sqlite3_context *pCtx /* Write error here if one occurs */ +){ + time_t t; + struct tm sLocal; + int iYearDiff; + + /* Initialize the contents of sLocal to avoid a compiler warning. */ + memset(&sLocal, 0, sizeof(sLocal)); + + computeJD(p); + if( p->iJD<2108667600*(i64)100000 /* 1970-01-01 */ + || p->iJD>2130141456*(i64)100000 /* 2038-01-18 */ + ){ + /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only + ** works for years between 1970 and 2037. For dates outside this range, + ** SQLite attempts to map the year into an equivalent year within this + ** range, do the calculation, then map the year back. + */ + DateTime x = *p; + computeYMD_HMS(&x); + iYearDiff = (2000 + x.Y%4) - x.Y; + x.Y += iYearDiff; + x.validJD = 0; + computeJD(&x); + t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); + }else{ + iYearDiff = 0; + t = (time_t)(p->iJD/1000 - 21086676*(i64)10000); + } + if( osLocaltime(&t, &sLocal) ){ + sqlite3_result_error(pCtx, "local time unavailable", -1); + return SQLITE_ERROR; + } + p->Y = sLocal.tm_year + 1900 - iYearDiff; + p->M = sLocal.tm_mon + 1; + p->D = sLocal.tm_mday; + p->h = sLocal.tm_hour; + p->m = sLocal.tm_min; + p->s = sLocal.tm_sec + (p->iJD%1000)*0.001; + p->validYMD = 1; + p->validHMS = 1; + p->validJD = 0; + p->rawS = 0; + p->validTZ = 0; + p->isError = 0; + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_LOCALTIME */ + +/* +** The following table defines various date transformations of the form +** +** 'NNN days' +** +** Where NNN is an arbitrary floating-point number and "days" can be one +** of several units of time. +*/ +static const struct { + u8 nName; /* Length of the name */ + char zName[7]; /* Name of the transformation */ + float rLimit; /* Maximum NNN value for this transform */ + float rXform; /* Constant used for this transform */ +} aXformType[] = { + { 6, "second", 4.6427e+14, 1.0 }, + { 6, "minute", 7.7379e+12, 60.0 }, + { 4, "hour", 1.2897e+11, 3600.0 }, + { 3, "day", 5373485.0, 86400.0 }, + { 5, "month", 176546.0, 2592000.0 }, + { 4, "year", 14713.0, 31536000.0 }, +}; + +/* +** Process a modifier to a date-time stamp. The modifiers are +** as follows: +** +** NNN days +** NNN hours +** NNN minutes +** NNN.NNNN seconds +** NNN months +** NNN years +** start of month +** start of year +** start of week +** start of day +** weekday N +** unixepoch +** localtime +** utc +** +** Return 0 on success and 1 if there is any kind of error. If the error +** is in a system call (i.e. localtime()), then an error message is written +** to context pCtx. If the error is an unrecognized modifier, no error is +** written to pCtx. +*/ +static int parseModifier( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* The text of the modifier */ + int n, /* Length of zMod in bytes */ + DateTime *p, /* The date/time value to be modified */ + int idx /* Parameter index of the modifier */ +){ + int rc = 1; + double r; + switch(sqlite3UpperToLower[(u8)z[0]] ){ + case 'a': { + /* + ** auto + ** + ** If rawS is available, then interpret as a julian day number, or + ** a unix timestamp, depending on its magnitude. + */ + if( sqlite3_stricmp(z, "auto")==0 ){ + if( idx>1 ) return 1; /* IMP: R-33611-57934 */ + if( !p->rawS || p->validJD ){ + rc = 0; + p->rawS = 0; + }else if( p->s>=-21086676*(i64)10000 /* -4713-11-24 12:00:00 */ + && p->s<=(25340230*(i64)10000)+799 /* 9999-12-31 23:59:59 */ + ){ + r = p->s*1000.0 + 210866760000000.0; + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)(r + 0.5); + p->validJD = 1; + p->rawS = 0; + rc = 0; + } + } + break; + } + case 'j': { + /* + ** julianday + ** + ** Always interpret the prior number as a julian-day value. If this + ** is not the first modifier, or if the prior argument is not a numeric + ** value in the allowed range of julian day numbers understood by + ** SQLite (0..5373484.5) then the result will be NULL. + */ + if( sqlite3_stricmp(z, "julianday")==0 ){ + if( idx>1 ) return 1; /* IMP: R-31176-64601 */ + if( p->validJD && p->rawS ){ + rc = 0; + p->rawS = 0; + } + } + break; + } +#ifndef SQLITE_OMIT_LOCALTIME + case 'l': { + /* localtime + ** + ** Assuming the current time value is UTC (a.k.a. GMT), shift it to + ** show local time. + */ + if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){ + rc = toLocaltime(p, pCtx); + } + break; + } +#endif + case 'u': { + /* + ** unixepoch + ** + ** Treat the current value of p->s as the number of + ** seconds since 1970. Convert to a real julian day number. + */ + if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){ + if( idx>1 ) return 1; /* IMP: R-49255-55373 */ + r = p->s*1000.0 + 210866760000000.0; + if( r>=0.0 && r<464269060800000.0 ){ + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)(r + 0.5); + p->validJD = 1; + p->rawS = 0; + rc = 0; + } + } +#ifndef SQLITE_OMIT_LOCALTIME + else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){ + if( p->tzSet==0 ){ + i64 iOrigJD; /* Original localtime */ + i64 iGuess; /* Guess at the corresponding utc time */ + int cnt = 0; /* Safety to prevent infinite loop */ + int iErr; /* Guess is off by this much */ + + computeJD(p); + iGuess = iOrigJD = p->iJD; + iErr = 0; + do{ + DateTime new; + memset(&new, 0, sizeof(new)); + iGuess -= iErr; + new.iJD = iGuess; + new.validJD = 1; + rc = toLocaltime(&new, pCtx); + if( rc ) return rc; + computeJD(&new); + iErr = new.iJD - iOrigJD; + }while( iErr && cnt++<3 ); + memset(p, 0, sizeof(*p)); + p->iJD = iGuess; + p->validJD = 1; + p->tzSet = 1; + } + rc = SQLITE_OK; + } +#endif + break; + } + case 'w': { + /* + ** weekday N + ** + ** Move the date to the same time on the next occurrence of + ** weekday N where 0==Sunday, 1==Monday, and so forth. If the + ** date is already on the appropriate weekday, this is a no-op. + */ + if( sqlite3_strnicmp(z, "weekday ", 8)==0 + && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)>0 + && (n=(int)r)==r && n>=0 && r<7 ){ + sqlite3_int64 Z; + computeYMD_HMS(p); + p->validTZ = 0; + p->validJD = 0; + computeJD(p); + Z = ((p->iJD + 129600000)/86400000) % 7; + if( Z>n ) Z -= 7; + p->iJD += (n - Z)*86400000; + clearYMD_HMS_TZ(p); + rc = 0; + } + break; + } + case 's': { + /* + ** start of TTTTT + ** + ** Move the date backwards to the beginning of the current day, + ** or month or year. + */ + if( sqlite3_strnicmp(z, "start of ", 9)!=0 ) break; + if( !p->validJD && !p->validYMD && !p->validHMS ) break; + z += 9; + computeYMD(p); + p->validHMS = 1; + p->h = p->m = 0; + p->s = 0.0; + p->rawS = 0; + p->validTZ = 0; + p->validJD = 0; + if( sqlite3_stricmp(z,"month")==0 ){ + p->D = 1; + rc = 0; + }else if( sqlite3_stricmp(z,"year")==0 ){ + p->M = 1; + p->D = 1; + rc = 0; + }else if( sqlite3_stricmp(z,"day")==0 ){ + rc = 0; + } + break; + } + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + double rRounder; + int i; + for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} + if( sqlite3AtoF(z, &r, n, SQLITE_UTF8)<=0 ){ + rc = 1; + break; + } + if( z[n]==':' ){ + /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the + ** specified number of hours, minutes, seconds, and fractional seconds + ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be + ** omitted. + */ + const char *z2 = z; + DateTime tx; + sqlite3_int64 day; + if( !sqlite3Isdigit(*z2) ) z2++; + memset(&tx, 0, sizeof(tx)); + if( parseHhMmSs(z2, &tx) ) break; + computeJD(&tx); + tx.iJD -= 43200000; + day = tx.iJD/86400000; + tx.iJD -= day*86400000; + if( z[0]=='-' ) tx.iJD = -tx.iJD; + computeJD(p); + clearYMD_HMS_TZ(p); + p->iJD += tx.iJD; + rc = 0; + break; + } + + /* If control reaches this point, it means the transformation is + ** one of the forms like "+NNN days". */ + z += n; + while( sqlite3Isspace(*z) ) z++; + n = sqlite3Strlen30(z); + if( n>10 || n<3 ) break; + if( sqlite3UpperToLower[(u8)z[n-1]]=='s' ) n--; + computeJD(p); + rc = 1; + rRounder = r<0 ? -0.5 : +0.5; + for(i=0; i-aXformType[i].rLimit && rM += (int)r; + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + p->validJD = 0; + r -= (int)r; + break; + } + case 5: { /* Special processing to add years */ + int y = (int)r; + assert( strcmp(aXformType[i].zName,"year")==0 ); + computeYMD_HMS(p); + p->Y += y; + p->validJD = 0; + r -= (int)r; + break; + } + } + computeJD(p); + p->iJD += (sqlite3_int64)(r*1000.0*aXformType[i].rXform + rRounder); + rc = 0; + break; + } + } + clearYMD_HMS_TZ(p); + break; + } + default: { + break; + } + } + return rc; +} + +/* +** Process time function arguments. argv[0] is a date-time stamp. +** argv[1] and following are modifiers. Parse them all and write +** the resulting time into the DateTime structure p. Return 0 +** on success and 1 if there are any errors. +** +** If there are zero parameters (if even argv[0] is undefined) +** then assume a default value of "now" for argv[0]. +*/ +static int isDate( + sqlite3_context *context, + int argc, + sqlite3_value **argv, + DateTime *p +){ + int i, n; + const unsigned char *z; + int eType; + memset(p, 0, sizeof(*p)); + if( argc==0 ){ + if( !sqlite3NotPureFunc(context) ) return 1; + return setDateTimeToCurrent(context, p); + } + if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT + || eType==SQLITE_INTEGER ){ + setRawDateNumber(p, sqlite3_value_double(argv[0])); + }else{ + z = sqlite3_value_text(argv[0]); + if( !z || parseDateOrTime(context, (char*)z, p) ){ + return 1; + } + } + for(i=1; iisError || !validJulianDay(p->iJD) ) return 1; + return 0; +} + + +/* +** The following routines implement the various date and time functions +** of SQLite. +*/ + +/* +** julianday( TIMESTRING, MOD, MOD, ...) +** +** Return the julian day number of the date specified in the arguments +*/ +static void juliandayFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + computeJD(&x); + sqlite3_result_double(context, x.iJD/86400000.0); + } +} + +/* +** unixepoch( TIMESTRING, MOD, MOD, ...) +** +** Return the number of seconds (including fractional seconds) since +** the unix epoch of 1970-01-01 00:00:00 GMT. +*/ +static void unixepochFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + computeJD(&x); + sqlite3_result_int64(context, x.iJD/1000 - 21086676*(i64)10000); + } +} + +/* +** datetime( TIMESTRING, MOD, MOD, ...) +** +** Return YYYY-MM-DD HH:MM:SS +*/ +static void datetimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + int Y, s; + char zBuf[24]; + computeYMD_HMS(&x); + Y = x.Y; + if( Y<0 ) Y = -Y; + zBuf[1] = '0' + (Y/1000)%10; + zBuf[2] = '0' + (Y/100)%10; + zBuf[3] = '0' + (Y/10)%10; + zBuf[4] = '0' + (Y)%10; + zBuf[5] = '-'; + zBuf[6] = '0' + (x.M/10)%10; + zBuf[7] = '0' + (x.M)%10; + zBuf[8] = '-'; + zBuf[9] = '0' + (x.D/10)%10; + zBuf[10] = '0' + (x.D)%10; + zBuf[11] = ' '; + zBuf[12] = '0' + (x.h/10)%10; + zBuf[13] = '0' + (x.h)%10; + zBuf[14] = ':'; + zBuf[15] = '0' + (x.m/10)%10; + zBuf[16] = '0' + (x.m)%10; + zBuf[17] = ':'; + s = (int)x.s; + zBuf[18] = '0' + (s/10)%10; + zBuf[19] = '0' + (s)%10; + zBuf[20] = 0; + if( x.Y<0 ){ + zBuf[0] = '-'; + sqlite3_result_text(context, zBuf, 20, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, &zBuf[1], 19, SQLITE_TRANSIENT); + } + } +} + +/* +** time( TIMESTRING, MOD, MOD, ...) +** +** Return HH:MM:SS +*/ +static void timeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + int s; + char zBuf[16]; + computeHMS(&x); + zBuf[0] = '0' + (x.h/10)%10; + zBuf[1] = '0' + (x.h)%10; + zBuf[2] = ':'; + zBuf[3] = '0' + (x.m/10)%10; + zBuf[4] = '0' + (x.m)%10; + zBuf[5] = ':'; + s = (int)x.s; + zBuf[6] = '0' + (s/10)%10; + zBuf[7] = '0' + (s)%10; + zBuf[8] = 0; + sqlite3_result_text(context, zBuf, 8, SQLITE_TRANSIENT); + } +} + +/* +** date( TIMESTRING, MOD, MOD, ...) +** +** Return YYYY-MM-DD +*/ +static void dateFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + int Y; + char zBuf[16]; + computeYMD(&x); + Y = x.Y; + if( Y<0 ) Y = -Y; + zBuf[1] = '0' + (Y/1000)%10; + zBuf[2] = '0' + (Y/100)%10; + zBuf[3] = '0' + (Y/10)%10; + zBuf[4] = '0' + (Y)%10; + zBuf[5] = '-'; + zBuf[6] = '0' + (x.M/10)%10; + zBuf[7] = '0' + (x.M)%10; + zBuf[8] = '-'; + zBuf[9] = '0' + (x.D/10)%10; + zBuf[10] = '0' + (x.D)%10; + zBuf[11] = 0; + if( x.Y<0 ){ + zBuf[0] = '-'; + sqlite3_result_text(context, zBuf, 11, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, &zBuf[1], 10, SQLITE_TRANSIENT); + } + } +} + +/* +** strftime( FORMAT, TIMESTRING, MOD, MOD, ...) +** +** Return a string described by FORMAT. Conversions as follows: +** +** %d day of month +** %f ** fractional seconds SS.SSS +** %H hour 00-24 +** %j day of year 000-366 +** %J ** julian day number +** %m month 01-12 +** %M minute 00-59 +** %s seconds since 1970-01-01 +** %S seconds 00-59 +** %w day of week 0-6 sunday==0 +** %W week of year 00-53 +** %Y year 0000-9999 +** %% % +*/ +static void strftimeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + size_t i,j; + sqlite3 *db; + const char *zFmt; + sqlite3_str sRes; + + + if( argc==0 ) return; + zFmt = (const char*)sqlite3_value_text(argv[0]); + if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; + db = sqlite3_context_db_handle(context); + sqlite3StrAccumInit(&sRes, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + + computeJD(&x); + computeYMD_HMS(&x); + for(i=j=0; zFmt[i]; i++){ + if( zFmt[i]!='%' ) continue; + if( j59.999 ) s = 59.999; + sqlite3_str_appendf(&sRes, "%06.3f", s); + break; + } + case 'H': { + sqlite3_str_appendf(&sRes, "%02d", x.h); + break; + } + case 'W': /* Fall thru */ + case 'j': { + int nDay; /* Number of days since 1st day of year */ + DateTime y = x; + y.validJD = 0; + y.M = 1; + y.D = 1; + computeJD(&y); + nDay = (int)((x.iJD-y.iJD+43200000)/86400000); + if( zFmt[i]=='W' ){ + int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ + wd = (int)(((x.iJD+43200000)/86400000)%7); + sqlite3_str_appendf(&sRes,"%02d",(nDay+7-wd)/7); + }else{ + sqlite3_str_appendf(&sRes,"%03d",nDay+1); + } + break; + } + case 'J': { + sqlite3_str_appendf(&sRes,"%.16g",x.iJD/86400000.0); + break; + } + case 'm': { + sqlite3_str_appendf(&sRes,"%02d",x.M); + break; + } + case 'M': { + sqlite3_str_appendf(&sRes,"%02d",x.m); + break; + } + case 's': { + i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); + sqlite3_str_appendf(&sRes,"%lld",iS); + break; + } + case 'S': { + sqlite3_str_appendf(&sRes,"%02d",(int)x.s); + break; + } + case 'w': { + sqlite3_str_appendchar(&sRes, 1, + (char)(((x.iJD+129600000)/86400000) % 7) + '0'); + break; + } + case 'Y': { + sqlite3_str_appendf(&sRes,"%04d",x.Y); + break; + } + case '%': { + sqlite3_str_appendchar(&sRes, 1, '%'); + break; + } + default: { + sqlite3_str_reset(&sRes); + return; + } + } + } + if( jpMethods ){ + pId->pMethods->xClose(pId); + pId->pMethods = 0; + } +} +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xRead(id, pBuf, amt, offset); +} +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xWrite(id, pBuf, amt, offset); +} +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file *id, i64 size){ + return id->pMethods->xTruncate(id, size); +} +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){ + DO_OS_MALLOC_TEST(id); + return flags ? id->pMethods->xSync(id, flags) : SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xFileSize(id, pSize); +} +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file *id, int lockType){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xLock(id, lockType); +} +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file *id, int lockType){ + return id->pMethods->xUnlock(id, lockType); +} +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xCheckReservedLock(id, pResOut); +} + +/* +** Use sqlite3OsFileControl() when we are doing something that might fail +** and we need to know about the failures. Use sqlite3OsFileControlHint() +** when simply tossing information over the wall to the VFS and we do not +** really care if the VFS receives and understands the information since it +** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() +** routine has no return value since the return value would be meaningless. +*/ +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ + if( id->pMethods==0 ) return SQLITE_NOTFOUND; +#ifdef SQLITE_TEST + if( op!=SQLITE_FCNTL_COMMIT_PHASETWO + && op!=SQLITE_FCNTL_LOCK_TIMEOUT + && op!=SQLITE_FCNTL_CKPT_DONE + && op!=SQLITE_FCNTL_CKPT_START + ){ + /* 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. + ** + ** The CKPT_DONE and CKPT_START file-controls are write-only signals + ** to the cksumvfs. Their return code is meaningless and is ignored + ** by the SQLite core, so there is no point in simulating OOMs for them. + */ + DO_OS_MALLOC_TEST(id); + } +#endif + return id->pMethods->xFileControl(id, op, pArg); +} +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ + if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg); +} + +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){ + int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; + return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); +} +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ + if( NEVER(id->pMethods==0) ) return 0; + return id->pMethods->xDeviceCharacteristics(id); +} +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ + return id->pMethods->xShmLock(id, offset, n, flags); +} +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id){ + id->pMethods->xShmBarrier(id); +} +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){ + return id->pMethods->xShmUnmap(id, deleteFlag); +} +SQLITE_PRIVATE int sqlite3OsShmMap( + sqlite3_file *id, /* Database file handle */ + int iPage, + int pgsz, + int bExtend, /* True to extend file if necessary */ + void volatile **pp /* OUT: Pointer to mapping */ +){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); +} +#endif /* SQLITE_OMIT_WAL */ + +#if SQLITE_MAX_MMAP_SIZE>0 +/* The real implementation of xFetch and xUnfetch */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ + DO_OS_MALLOC_TEST(id); + return id->pMethods->xFetch(id, iOff, iAmt, pp); +} +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ + return id->pMethods->xUnfetch(id, iOff, p); +} +#else +/* No-op stubs to use when memory-mapped I/O is disabled */ +SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ + *pp = 0; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ + return SQLITE_OK; +} +#endif + +/* +** The next group of routines are convenience wrappers around the +** VFS methods. +*/ +SQLITE_PRIVATE int sqlite3OsOpen( + sqlite3_vfs *pVfs, + const char *zPath, + sqlite3_file *pFile, + int flags, + int *pFlagsOut +){ + int rc; + DO_OS_MALLOC_TEST(0); + /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed + ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, + ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before + ** reaching the VFS. */ + rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x1087f7f, pFlagsOut); + assert( rc==SQLITE_OK || pFile->pMethods==0 ); + return rc; +} +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + DO_OS_MALLOC_TEST(0); + assert( dirSync==0 || dirSync==1 ); + return pVfs->xDelete!=0 ? pVfs->xDelete(pVfs, zPath, dirSync) : SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3OsAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + DO_OS_MALLOC_TEST(0); + return pVfs->xAccess(pVfs, zPath, flags, pResOut); +} +SQLITE_PRIVATE int sqlite3OsFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nPathOut, + char *zPathOut +){ + DO_OS_MALLOC_TEST(0); + zPathOut[0] = 0; + return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); +} +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + assert( zPath!=0 ); + assert( strlen(zPath)<=SQLITE_MAX_PATHLEN ); /* tag-20210611-1 */ + return pVfs->xDlOpen(pVfs, zPath); +} +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + pVfs->xDlError(pVfs, nByte, zBufOut); +} +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){ + return pVfs->xDlSym(pVfs, pHdle, zSym); +} +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ + pVfs->xDlClose(pVfs, pHandle); +} +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + if( sqlite3Config.iPrngSeed ){ + memset(zBufOut, 0, nByte); + if( ALWAYS(nByte>(signed)sizeof(unsigned)) ) nByte = sizeof(unsigned int); + memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); + return SQLITE_OK; + }else{ + return pVfs->xRandomness(pVfs, nByte, zBufOut); + } + +} +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ + return pVfs->xSleep(pVfs, nMicro); +} +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ + return pVfs->xGetLastError ? pVfs->xGetLastError(pVfs, 0, 0) : 0; +} +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ + int rc; + /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64() + ** method to get the current date and time if that method is available + ** (if iVersion is 2 or greater and the function pointer is not NULL) and + ** will fall back to xCurrentTime() if xCurrentTimeInt64() is + ** unavailable. + */ + if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ + rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); + }else{ + double r; + rc = pVfs->xCurrentTime(pVfs, &r); + *pTimeOut = (sqlite3_int64)(r*86400000.0); + } + return rc; +} + +SQLITE_PRIVATE int sqlite3OsOpenMalloc( + sqlite3_vfs *pVfs, + const char *zFile, + sqlite3_file **ppFile, + int flags, + int *pOutFlags +){ + int rc; + sqlite3_file *pFile; + pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); + if( pFile ){ + rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); + if( rc!=SQLITE_OK ){ + sqlite3_free(pFile); + *ppFile = 0; + }else{ + *ppFile = pFile; + } + }else{ + *ppFile = 0; + rc = SQLITE_NOMEM_BKPT; + } + assert( *ppFile!=0 || rc!=SQLITE_OK ); + return rc; +} +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){ + assert( pFile ); + sqlite3OsClose(pFile); + sqlite3_free(pFile); +} + +/* +** This function is a wrapper around the OS specific implementation of +** sqlite3_os_init(). The purpose of the wrapper is to provide the +** ability to simulate a malloc failure, so that the handling of an +** error in sqlite3_os_init() by the upper layers can be tested. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void){ + void *p = sqlite3_malloc(10); + if( p==0 ) return SQLITE_NOMEM_BKPT; + sqlite3_free(p); + return sqlite3_os_init(); +} + +/* +** The list of all registered VFS implementations. +*/ +static sqlite3_vfs * SQLITE_WSD vfsList = 0; +#define vfsList GLOBAL(sqlite3_vfs *, vfsList) + +/* +** Locate a VFS by name. If no name is given, simply return the +** first VFS on the list. +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ + sqlite3_vfs *pVfs = 0; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex; +#endif +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return 0; +#endif +#if SQLITE_THREADSAFE + mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); +#endif + sqlite3_mutex_enter(mutex); + for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ + if( zVfs==0 ) break; + if( strcmp(zVfs, pVfs->zName)==0 ) break; + } + sqlite3_mutex_leave(mutex); + return pVfs; +} + +/* +** Unlink a VFS from the linked list +*/ +static void vfsUnlink(sqlite3_vfs *pVfs){ + assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)) ); + if( pVfs==0 ){ + /* No-op */ + }else if( vfsList==pVfs ){ + vfsList = pVfs->pNext; + }else if( vfsList ){ + sqlite3_vfs *p = vfsList; + while( p->pNext && p->pNext!=pVfs ){ + p = p->pNext; + } + if( p->pNext==pVfs ){ + p->pNext = pVfs->pNext; + } + } +} + +/* +** Register a VFS with the system. It is harmless to register the same +** VFS multiple times. The new VFS becomes the default if makeDflt is +** true. +*/ +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ + MUTEX_LOGIC(sqlite3_mutex *mutex;) +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif +#ifdef SQLITE_ENABLE_API_ARMOR + if( pVfs==0 ) return SQLITE_MISUSE_BKPT; +#endif + + MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + if( makeDflt || vfsList==0 ){ + pVfs->pNext = vfsList; + vfsList = pVfs; + }else{ + pVfs->pNext = vfsList->pNext; + vfsList->pNext = pVfs; + } + assert(vfsList); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/* +** Unregister a VFS so that it is no longer accessible. +*/ +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ + MUTEX_LOGIC(sqlite3_mutex *mutex;) +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + sqlite3_mutex_enter(mutex); + vfsUnlink(pVfs); + sqlite3_mutex_leave(mutex); + return SQLITE_OK; +} + +/************** End of os.c **************************************************/ +/************** Begin file fault.c *******************************************/ +/* +** 2008 Jan 22 +** +** 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 contains code to support the concept of "benign" +** malloc failures (when the xMalloc() or xRealloc() method of the +** sqlite3_mem_methods structure fails to allocate a block of memory +** and returns 0). +** +** Most malloc failures are non-benign. After they occur, SQLite +** abandons the current operation and returns an error code (usually +** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily +** fatal. For example, if a malloc fails while resizing a hash table, this +** is completely recoverable simply by not carrying out the resize. The +** hash table will continue to function normally. So a malloc failure +** during a hash table resize is a benign fault. +*/ + +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_UNTESTABLE + +/* +** Global variables. +*/ +typedef struct BenignMallocHooks BenignMallocHooks; +static SQLITE_WSD struct BenignMallocHooks { + void (*xBenignBegin)(void); + void (*xBenignEnd)(void); +} sqlite3Hooks = { 0, 0 }; + +/* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks +** structure. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdHooks can refer directly +** to the "sqlite3Hooks" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdHooksInit \ + BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks) +# define wsdHooks x[0] +#else +# define wsdHooksInit +# define wsdHooks sqlite3Hooks +#endif + + +/* +** Register hooks to call when sqlite3BeginBenignMalloc() and +** sqlite3EndBenignMalloc() are called, respectively. +*/ +SQLITE_PRIVATE void sqlite3BenignMallocHooks( + void (*xBenignBegin)(void), + void (*xBenignEnd)(void) +){ + wsdHooksInit; + wsdHooks.xBenignBegin = xBenignBegin; + wsdHooks.xBenignEnd = xBenignEnd; +} + +/* +** This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that +** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc() +** indicates that subsequent malloc failures are non-benign. +*/ +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void){ + wsdHooksInit; + if( wsdHooks.xBenignBegin ){ + wsdHooks.xBenignBegin(); + } +} +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ + wsdHooksInit; + if( wsdHooks.xBenignEnd ){ + wsdHooks.xBenignEnd(); + } +} + +#endif /* #ifndef SQLITE_UNTESTABLE */ + +/************** End of fault.c ***********************************************/ +/************** Begin file mem0.c ********************************************/ +/* +** 2008 October 28 +** +** 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 contains a no-op memory allocation drivers for use when +** SQLITE_ZERO_MALLOC is defined. The allocation drivers implemented +** here always fail. SQLite will not operate with these drivers. These +** are merely placeholders. Real drivers must be substituted using +** sqlite3_config() before SQLite will operate. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#ifdef SQLITE_ZERO_MALLOC + +/* +** No-op versions of all memory allocation routines +*/ +static void *sqlite3MemMalloc(int nByte){ return 0; } +static void sqlite3MemFree(void *pPrior){ return; } +static void *sqlite3MemRealloc(void *pPrior, int nByte){ return 0; } +static int sqlite3MemSize(void *pPrior){ return 0; } +static int sqlite3MemRoundup(int n){ return n; } +static int sqlite3MemInit(void *NotUsed){ return SQLITE_OK; } +static void sqlite3MemShutdown(void *NotUsed){ return; } + +/* +** This routine is the only routine in this file with external linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +#endif /* SQLITE_ZERO_MALLOC */ + +/************** End of mem0.c ************************************************/ +/************** Begin file mem1.c ********************************************/ +/* +** 2007 August 14 +** +** 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 contains low-level memory allocation drivers for when +** SQLite will use the standard C-library malloc/realloc/free interface +** to obtain the memory it needs. +** +** This file contains implementations of the low-level memory allocation +** routines specified in the sqlite3_mem_methods object. The content of +** this file is only used if SQLITE_SYSTEM_MALLOC is defined. The +** SQLITE_SYSTEM_MALLOC macro is defined automatically if neither the +** SQLITE_MEMDEBUG nor the SQLITE_WIN32_MALLOC macros are defined. The +** default configuration is to use memory allocation routines in this +** file. +** +** C-preprocessor macro summary: +** +** HAVE_MALLOC_USABLE_SIZE The configure script sets this symbol if +** the malloc_usable_size() interface exists +** on the target platform. Or, this symbol +** can be set manually, if desired. +** If an equivalent interface exists by +** a different name, using a separate -D +** option to rename it. +** +** SQLITE_WITHOUT_ZONEMALLOC Some older macs lack support for the zone +** memory allocator. Set this symbol to enable +** building on older macs. +** +** SQLITE_WITHOUT_MSIZE Set this symbol to disable the use of +** _msize() on windows systems. This might +** be necessary when compiling for Delphi, +** for example. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is the default. It is +** used when no other memory allocator is specified using compile-time +** macros. +*/ +#ifdef SQLITE_SYSTEM_MALLOC +#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) + +/* +** Use the zone allocator available on apple products unless the +** SQLITE_WITHOUT_ZONEMALLOC symbol is defined. +*/ +#include +#include +#ifdef SQLITE_MIGHT_BE_SINGLE_CORE +#include +#endif /* SQLITE_MIGHT_BE_SINGLE_CORE */ +static malloc_zone_t* _sqliteZone_; +#define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x)) +#define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x)); +#define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y)) +#define SQLITE_MALLOCSIZE(x) \ + (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x)) + +#else /* if not __APPLE__ */ + +/* +** Use standard C library malloc and free on non-Apple systems. +** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined. +*/ +#define SQLITE_MALLOC(x) malloc(x) +#define SQLITE_FREE(x) free(x) +#define SQLITE_REALLOC(x,y) realloc((x),(y)) + +/* +** The malloc.h header file is needed for malloc_usable_size() function +** on some systems (e.g. Linux). +*/ +#if HAVE_MALLOC_H && HAVE_MALLOC_USABLE_SIZE +# define SQLITE_USE_MALLOC_H 1 +# define SQLITE_USE_MALLOC_USABLE_SIZE 1 +/* +** The MSVCRT has malloc_usable_size(), but it is called _msize(). The +** use of _msize() is automatic, but can be disabled by compiling with +** -DSQLITE_WITHOUT_MSIZE. Using the _msize() function also requires +** the malloc.h header file. +*/ +#elif defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE) +# define SQLITE_USE_MALLOC_H +# define SQLITE_USE_MSIZE +#endif + +/* +** Include the malloc.h header file, if necessary. Also set define macro +** SQLITE_MALLOCSIZE to the appropriate function name, which is _msize() +** for MSVC and malloc_usable_size() for most other systems (e.g. Linux). +** The memory size function can always be overridden manually by defining +** the macro SQLITE_MALLOCSIZE to the desired function name. +*/ +#if defined(SQLITE_USE_MALLOC_H) +# include +# if defined(SQLITE_USE_MALLOC_USABLE_SIZE) +# if !defined(SQLITE_MALLOCSIZE) +# define SQLITE_MALLOCSIZE(x) malloc_usable_size(x) +# endif +# elif defined(SQLITE_USE_MSIZE) +# if !defined(SQLITE_MALLOCSIZE) +# define SQLITE_MALLOCSIZE _msize +# endif +# endif +#endif /* defined(SQLITE_USE_MALLOC_H) */ + +#endif /* __APPLE__ or not __APPLE__ */ + +/* +** Like malloc(), but remember the size of the allocation +** so that we can find it later using sqlite3MemSize(). +** +** For this low-level routine, we are guaranteed that nByte>0 because +** cases of nByte<=0 will be intercepted and dealt with by higher level +** routines. +*/ +static void *sqlite3MemMalloc(int nByte){ +#ifdef SQLITE_MALLOCSIZE + void *p; + testcase( ROUND8(nByte)==nByte ); + p = SQLITE_MALLOC( nByte ); + if( p==0 ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); + } + return p; +#else + sqlite3_int64 *p; + assert( nByte>0 ); + testcase( ROUND8(nByte)!=nByte ); + p = SQLITE_MALLOC( nByte+8 ); + if( p ){ + p[0] = nByte; + p++; + }else{ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); + } + return (void *)p; +#endif +} + +/* +** Like free() but works for allocations obtained from sqlite3MemMalloc() +** or sqlite3MemRealloc(). +** +** For this low-level routine, we already know that pPrior!=0 since +** cases where pPrior==0 will have been intecepted and dealt with +** by higher-level routines. +*/ +static void sqlite3MemFree(void *pPrior){ +#ifdef SQLITE_MALLOCSIZE + SQLITE_FREE(pPrior); +#else + sqlite3_int64 *p = (sqlite3_int64*)pPrior; + assert( pPrior!=0 ); + p--; + SQLITE_FREE(p); +#endif +} + +/* +** Report the allocated size of a prior return from xMalloc() +** or xRealloc(). +*/ +static int sqlite3MemSize(void *pPrior){ +#ifdef SQLITE_MALLOCSIZE + assert( pPrior!=0 ); + return (int)SQLITE_MALLOCSIZE(pPrior); +#else + sqlite3_int64 *p; + assert( pPrior!=0 ); + p = (sqlite3_int64*)pPrior; + p--; + return (int)p[0]; +#endif +} + +/* +** Like realloc(). Resize an allocation previously obtained from +** sqlite3MemMalloc(). +** +** For this low-level interface, we know that pPrior!=0. Cases where +** pPrior==0 while have been intercepted by higher-level routine and +** redirected to xMalloc. Similarly, we know that nByte>0 because +** cases where nByte<=0 will have been intercepted by higher-level +** routines and redirected to xFree. +*/ +static void *sqlite3MemRealloc(void *pPrior, int nByte){ +#ifdef SQLITE_MALLOCSIZE + void *p = SQLITE_REALLOC(pPrior, nByte); + if( p==0 ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, + "failed memory resize %u to %u bytes", + SQLITE_MALLOCSIZE(pPrior), nByte); + } + return p; +#else + sqlite3_int64 *p = (sqlite3_int64*)pPrior; + assert( pPrior!=0 && nByte>0 ); + assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */ + p--; + p = SQLITE_REALLOC(p, nByte+8 ); + if( p ){ + p[0] = nByte; + p++; + }else{ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, + "failed memory resize %u to %u bytes", + sqlite3MemSize(pPrior), nByte); + } + return (void*)p; +#endif +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int sqlite3MemRoundup(int n){ + return ROUND8(n); +} + +/* +** Initialize this module. +*/ +static int sqlite3MemInit(void *NotUsed){ +#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) + int cpuCount; + size_t len; + if( _sqliteZone_ ){ + return SQLITE_OK; + } + len = sizeof(cpuCount); + /* One usually wants to use hw.acctivecpu for MT decisions, but not here */ + sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0); + if( cpuCount>1 ){ + /* defer MT decisions to system malloc */ + _sqliteZone_ = malloc_default_zone(); + }else{ + /* only 1 core, use our own zone to contention over global locks, + ** e.g. we have our own dedicated locks */ + _sqliteZone_ = malloc_create_zone(4096, 0); + malloc_set_zone_name(_sqliteZone_, "Sqlite_Heap"); + } +#endif /* defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) */ + UNUSED_PARAMETER(NotUsed); + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void sqlite3MemShutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + return; +} + +/* +** This routine is the only routine in this file with external linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +#endif /* SQLITE_SYSTEM_MALLOC */ + +/************** End of mem1.c ************************************************/ +/************** Begin file mem2.c ********************************************/ +/* +** 2007 August 15 +** +** 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 contains low-level memory allocation drivers for when +** SQLite will use the standard C-library malloc/realloc/free interface +** to obtain the memory it needs while adding lots of additional debugging +** information to each allocation in order to help detect and fix memory +** leaks and memory usage errors. +** +** This file contains implementations of the low-level memory allocation +** routines specified in the sqlite3_mem_methods object. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is used only if the +** SQLITE_MEMDEBUG macro is defined +*/ +#ifdef SQLITE_MEMDEBUG + +/* +** The backtrace functionality is only available with GLIBC +*/ +#ifdef __GLIBC__ + extern int backtrace(void**,int); + extern void backtrace_symbols_fd(void*const*,int,int); +#else +# define backtrace(A,B) 1 +# define backtrace_symbols_fd(A,B,C) +#endif +/* #include */ + +/* +** Each memory allocation looks like this: +** +** ------------------------------------------------------------------------ +** | Title | backtrace pointers | MemBlockHdr | allocation | EndGuard | +** ------------------------------------------------------------------------ +** +** The application code sees only a pointer to the allocation. We have +** to back up from the allocation pointer to find the MemBlockHdr. The +** MemBlockHdr tells us the size of the allocation and the number of +** backtrace pointers. There is also a guard word at the end of the +** MemBlockHdr. +*/ +struct MemBlockHdr { + i64 iSize; /* Size of this allocation */ + struct MemBlockHdr *pNext, *pPrev; /* Linked list of all unfreed memory */ + char nBacktrace; /* Number of backtraces on this alloc */ + char nBacktraceSlots; /* Available backtrace slots */ + u8 nTitle; /* Bytes of title; includes '\0' */ + u8 eType; /* Allocation type code */ + int iForeGuard; /* Guard word for sanity */ +}; + +/* +** Guard words +*/ +#define FOREGUARD 0x80F5E153 +#define REARGUARD 0xE4676B53 + +/* +** Number of malloc size increments to track. +*/ +#define NCSIZE 1000 + +/* +** All of the static variables used by this module are collected +** into a single structure named "mem". This is to keep the +** static variables organized and to reduce namespace pollution +** when this module is combined with other in the amalgamation. +*/ +static struct { + + /* + ** Mutex to control access to the memory allocation subsystem. + */ + sqlite3_mutex *mutex; + + /* + ** Head and tail of a linked list of all outstanding allocations + */ + struct MemBlockHdr *pFirst; + struct MemBlockHdr *pLast; + + /* + ** The number of levels of backtrace to save in new allocations. + */ + int nBacktrace; + void (*xBacktrace)(int, int, void **); + + /* + ** Title text to insert in front of each block + */ + int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ + char zTitle[100]; /* The title text */ + + /* + ** sqlite3MallocDisallow() increments the following counter. + ** sqlite3MallocAllow() decrements it. + */ + int disallow; /* Do not allow memory allocation */ + + /* + ** Gather statistics on the sizes of memory allocations. + ** nAlloc[i] is the number of allocation attempts of i*8 + ** bytes. i==NCSIZE is the number of allocation attempts for + ** sizes more than NCSIZE*8 bytes. + */ + int nAlloc[NCSIZE]; /* Total number of allocations */ + int nCurrent[NCSIZE]; /* Current number of allocations */ + int mxCurrent[NCSIZE]; /* Highwater mark for nCurrent */ + +} mem; + + +/* +** Adjust memory usage statistics +*/ +static void adjustStats(int iSize, int increment){ + int i = ROUND8(iSize)/8; + if( i>NCSIZE-1 ){ + i = NCSIZE - 1; + } + if( increment>0 ){ + mem.nAlloc[i]++; + mem.nCurrent[i]++; + if( mem.nCurrent[i]>mem.mxCurrent[i] ){ + mem.mxCurrent[i] = mem.nCurrent[i]; + } + }else{ + mem.nCurrent[i]--; + assert( mem.nCurrent[i]>=0 ); + } +} + +/* +** Given an allocation, find the MemBlockHdr for that allocation. +** +** This routine checks the guards at either end of the allocation and +** if they are incorrect it asserts. +*/ +static struct MemBlockHdr *sqlite3MemsysGetHeader(const void *pAllocation){ + struct MemBlockHdr *p; + int *pInt; + u8 *pU8; + int nReserve; + + p = (struct MemBlockHdr*)pAllocation; + p--; + assert( p->iForeGuard==(int)FOREGUARD ); + nReserve = ROUND8(p->iSize); + pInt = (int*)pAllocation; + pU8 = (u8*)pAllocation; + assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD ); + /* This checks any of the "extra" bytes allocated due + ** to rounding up to an 8 byte boundary to ensure + ** they haven't been overwritten. + */ + while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 ); + return p; +} + +/* +** Return the number of bytes currently allocated at address p. +*/ +static int sqlite3MemSize(void *p){ + struct MemBlockHdr *pHdr; + if( !p ){ + return 0; + } + pHdr = sqlite3MemsysGetHeader(p); + return (int)pHdr->iSize; +} + +/* +** Initialize the memory allocation subsystem. +*/ +static int sqlite3MemInit(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( (sizeof(struct MemBlockHdr)&7) == 0 ); + if( !sqlite3GlobalConfig.bMemstat ){ + /* If memory status is enabled, then the malloc.c wrapper will already + ** hold the STATIC_MEM mutex when the routines here are invoked. */ + mem.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + return SQLITE_OK; +} + +/* +** Deinitialize the memory allocation subsystem. +*/ +static void sqlite3MemShutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + mem.mutex = 0; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int sqlite3MemRoundup(int n){ + return ROUND8(n); +} + +/* +** Fill a buffer with pseudo-random bytes. This is used to preset +** the content of a new memory allocation to unpredictable values and +** to clear the content of a freed allocation to unpredictable values. +*/ +static void randomFill(char *pBuf, int nByte){ + unsigned int x, y, r; + x = SQLITE_PTR_TO_INT(pBuf); + y = nByte | 1; + while( nByte >= 4 ){ + x = (x>>1) ^ (-(int)(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(int*)pBuf = r; + pBuf += 4; + nByte -= 4; + } + while( nByte-- > 0 ){ + x = (x>>1) ^ (-(int)(x&1) & 0xd0000001); + y = y*1103515245 + 12345; + r = x ^ y; + *(pBuf++) = r & 0xff; + } +} + +/* +** Allocate nByte bytes of memory. +*/ +static void *sqlite3MemMalloc(int nByte){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + int *pInt; + void *p = 0; + int totalSize; + int nReserve; + sqlite3_mutex_enter(mem.mutex); + assert( mem.disallow==0 ); + nReserve = ROUND8(nByte); + totalSize = nReserve + sizeof(*pHdr) + sizeof(int) + + mem.nBacktrace*sizeof(void*) + mem.nTitle; + p = malloc(totalSize); + if( p ){ + z = p; + pBt = (void**)&z[mem.nTitle]; + pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace]; + pHdr->pNext = 0; + pHdr->pPrev = mem.pLast; + if( mem.pLast ){ + mem.pLast->pNext = pHdr; + }else{ + mem.pFirst = pHdr; + } + mem.pLast = pHdr; + pHdr->iForeGuard = FOREGUARD; + pHdr->eType = MEMTYPE_HEAP; + pHdr->nBacktraceSlots = mem.nBacktrace; + pHdr->nTitle = mem.nTitle; + if( mem.nBacktrace ){ + void *aAddr[40]; + pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1; + memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*)); + assert(pBt[0]); + if( mem.xBacktrace ){ + mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]); + } + }else{ + pHdr->nBacktrace = 0; + } + if( mem.nTitle ){ + memcpy(z, mem.zTitle, mem.nTitle); + } + pHdr->iSize = nByte; + adjustStats(nByte, +1); + pInt = (int*)&pHdr[1]; + pInt[nReserve/sizeof(int)] = REARGUARD; + randomFill((char*)pInt, nByte); + memset(((char*)pInt)+nByte, 0x65, nReserve-nByte); + p = (void*)pInt; + } + sqlite3_mutex_leave(mem.mutex); + return p; +} + +/* +** Free memory. +*/ +static void sqlite3MemFree(void *pPrior){ + struct MemBlockHdr *pHdr; + void **pBt; + char *z; + assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 + || mem.mutex!=0 ); + pHdr = sqlite3MemsysGetHeader(pPrior); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + sqlite3_mutex_enter(mem.mutex); + if( pHdr->pPrev ){ + assert( pHdr->pPrev->pNext==pHdr ); + pHdr->pPrev->pNext = pHdr->pNext; + }else{ + assert( mem.pFirst==pHdr ); + mem.pFirst = pHdr->pNext; + } + if( pHdr->pNext ){ + assert( pHdr->pNext->pPrev==pHdr ); + pHdr->pNext->pPrev = pHdr->pPrev; + }else{ + assert( mem.pLast==pHdr ); + mem.pLast = pHdr->pPrev; + } + z = (char*)pBt; + z -= pHdr->nTitle; + adjustStats((int)pHdr->iSize, -1); + randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + + (int)pHdr->iSize + sizeof(int) + pHdr->nTitle); + free(z); + sqlite3_mutex_leave(mem.mutex); +} + +/* +** Change the size of an existing memory allocation. +** +** For this debugging implementation, we *always* make a copy of the +** allocation into a new place in memory. In this way, if the +** higher level code is using pointer to the old allocation, it is +** much more likely to break and we are much more liking to find +** the error. +*/ +static void *sqlite3MemRealloc(void *pPrior, int nByte){ + struct MemBlockHdr *pOldHdr; + void *pNew; + assert( mem.disallow==0 ); + assert( (nByte & 7)==0 ); /* EV: R-46199-30249 */ + pOldHdr = sqlite3MemsysGetHeader(pPrior); + pNew = sqlite3MemMalloc(nByte); + if( pNew ){ + memcpy(pNew, pPrior, (int)(nByteiSize ? nByte : pOldHdr->iSize)); + if( nByte>pOldHdr->iSize ){ + randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - (int)pOldHdr->iSize); + } + sqlite3MemFree(pPrior); + } + return pNew; +} + +/* +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. +*/ +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + static const sqlite3_mem_methods defaultMethods = { + sqlite3MemMalloc, + sqlite3MemFree, + sqlite3MemRealloc, + sqlite3MemSize, + sqlite3MemRoundup, + sqlite3MemInit, + sqlite3MemShutdown, + 0 + }; + sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods); +} + +/* +** Set the "type" of an allocation. +*/ +SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){ + if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); + pHdr->eType = eType; + } +} + +/* +** Return TRUE if the mask of type in eType matches the type of the +** allocation p. Also return true if p==NULL. +** +** This routine is designed for use within an assert() statement, to +** verify the type of an allocation. For example: +** +** assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); +*/ +SQLITE_PRIVATE int sqlite3MemdebugHasType(const void *p, u8 eType){ + int rc = 1; + if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ + if( (pHdr->eType&eType)==0 ){ + rc = 0; + } + } + return rc; +} + +/* +** Return TRUE if the mask of type in eType matches no bits of the type of the +** allocation p. Also return true if p==NULL. +** +** This routine is designed for use within an assert() statement, to +** verify the type of an allocation. For example: +** +** assert( sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); +*/ +SQLITE_PRIVATE int sqlite3MemdebugNoType(const void *p, u8 eType){ + int rc = 1; + if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ + struct MemBlockHdr *pHdr; + pHdr = sqlite3MemsysGetHeader(p); + assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ + if( (pHdr->eType&eType)!=0 ){ + rc = 0; + } + } + return rc; +} + +/* +** Set the number of backtrace levels kept for each allocation. +** A value of zero turns off backtracing. The number is always rounded +** up to a multiple of 2. +*/ +SQLITE_PRIVATE void sqlite3MemdebugBacktrace(int depth){ + if( depth<0 ){ depth = 0; } + if( depth>20 ){ depth = 20; } + depth = (depth+1)&0xfe; + mem.nBacktrace = depth; +} + +SQLITE_PRIVATE void sqlite3MemdebugBacktraceCallback(void (*xBacktrace)(int, int, void **)){ + mem.xBacktrace = xBacktrace; +} + +/* +** Set the title string for subsequent allocations. +*/ +SQLITE_PRIVATE void sqlite3MemdebugSettitle(const char *zTitle){ + unsigned int n = sqlite3Strlen30(zTitle) + 1; + sqlite3_mutex_enter(mem.mutex); + if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1; + memcpy(mem.zTitle, zTitle, n); + mem.zTitle[n] = 0; + mem.nTitle = ROUND8(n); + sqlite3_mutex_leave(mem.mutex); +} + +SQLITE_PRIVATE void sqlite3MemdebugSync(){ + struct MemBlockHdr *pHdr; + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + void **pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + mem.xBacktrace((int)pHdr->iSize, pHdr->nBacktrace-1, &pBt[1]); + } +} + +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ + FILE *out; + struct MemBlockHdr *pHdr; + void **pBt; + int i; + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ + char *z = (char*)pHdr; + z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle; + fprintf(out, "**** %lld bytes at %p from %s ****\n", + pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???"); + if( pHdr->nBacktrace ){ + fflush(out); + pBt = (void**)pHdr; + pBt -= pHdr->nBacktraceSlots; + backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out)); + fprintf(out, "\n"); + } + } + fprintf(out, "COUNTS:\n"); + for(i=0; i=1 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); + assert( size>=2 ); + if( size <= MX_SMALL ){ + memsys3UnlinkFromList(i, &mem3.aiSmall[size-2]); + }else{ + hash = size % N_HASH; + memsys3UnlinkFromList(i, &mem3.aiHash[hash]); + } +} + +/* +** Link the chunk at mem3.aPool[i] so that is on the list rooted +** at *pRoot. +*/ +static void memsys3LinkIntoList(u32 i, u32 *pRoot){ + assert( sqlite3_mutex_held(mem3.mutex) ); + mem3.aPool[i].u.list.next = *pRoot; + mem3.aPool[i].u.list.prev = 0; + if( *pRoot ){ + mem3.aPool[*pRoot].u.list.prev = i; + } + *pRoot = i; +} + +/* +** Link the chunk at index i into either the appropriate +** small chunk list, or into the large chunk hash table. +*/ +static void memsys3Link(u32 i){ + u32 size, hash; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( i>=1 ); + assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); + assert( size>=2 ); + if( size <= MX_SMALL ){ + memsys3LinkIntoList(i, &mem3.aiSmall[size-2]); + }else{ + hash = size % N_HASH; + memsys3LinkIntoList(i, &mem3.aiHash[hash]); + } +} + +/* +** If the STATIC_MEM mutex is not already held, obtain it now. The mutex +** will already be held (obtained by code in malloc.c) if +** sqlite3GlobalConfig.bMemStat is true. +*/ +static void memsys3Enter(void){ + if( sqlite3GlobalConfig.bMemstat==0 && mem3.mutex==0 ){ + mem3.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + sqlite3_mutex_enter(mem3.mutex); +} +static void memsys3Leave(void){ + sqlite3_mutex_leave(mem3.mutex); +} + +/* +** Called when we are unable to satisfy an allocation of nBytes. +*/ +static void memsys3OutOfMemory(int nByte){ + if( !mem3.alarmBusy ){ + mem3.alarmBusy = 1; + assert( sqlite3_mutex_held(mem3.mutex) ); + sqlite3_mutex_leave(mem3.mutex); + sqlite3_release_memory(nByte); + sqlite3_mutex_enter(mem3.mutex); + mem3.alarmBusy = 0; + } +} + + +/* +** Chunk i is a free chunk that has been unlinked. Adjust its +** size parameters for check-out and return a pointer to the +** user portion of the chunk. +*/ +static void *memsys3Checkout(u32 i, u32 nBlock){ + u32 x; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( i>=1 ); + assert( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ); + assert( mem3.aPool[i+nBlock-1].u.hdr.prevSize==nBlock ); + x = mem3.aPool[i-1].u.hdr.size4x; + mem3.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2); + mem3.aPool[i+nBlock-1].u.hdr.prevSize = nBlock; + mem3.aPool[i+nBlock-1].u.hdr.size4x |= 2; + return &mem3.aPool[i]; +} + +/* +** Carve a piece off of the end of the mem3.iKeyBlk free chunk. +** Return a pointer to the new allocation. Or, if the key chunk +** is not large enough, return 0. +*/ +static void *memsys3FromKeyBlk(u32 nBlock){ + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( mem3.szKeyBlk>=nBlock ); + if( nBlock>=mem3.szKeyBlk-1 ){ + /* Use the entire key chunk */ + void *p = memsys3Checkout(mem3.iKeyBlk, mem3.szKeyBlk); + mem3.iKeyBlk = 0; + mem3.szKeyBlk = 0; + mem3.mnKeyBlk = 0; + return p; + }else{ + /* Split the key block. Return the tail. */ + u32 newi, x; + newi = mem3.iKeyBlk + mem3.szKeyBlk - nBlock; + assert( newi > mem3.iKeyBlk+1 ); + mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.prevSize = nBlock; + mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.size4x |= 2; + mem3.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1; + mem3.szKeyBlk -= nBlock; + mem3.aPool[newi-1].u.hdr.prevSize = mem3.szKeyBlk; + x = mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x & 2; + mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x = mem3.szKeyBlk*4 | x; + if( mem3.szKeyBlk < mem3.mnKeyBlk ){ + mem3.mnKeyBlk = mem3.szKeyBlk; + } + return (void*)&mem3.aPool[newi]; + } +} + +/* +** *pRoot is the head of a list of free chunks of the same size +** or same size hash. In other words, *pRoot is an entry in either +** mem3.aiSmall[] or mem3.aiHash[]. +** +** This routine examines all entries on the given list and tries +** to coalesce each entries with adjacent free chunks. +** +** If it sees a chunk that is larger than mem3.iKeyBlk, it replaces +** the current mem3.iKeyBlk with the new larger chunk. In order for +** this mem3.iKeyBlk replacement to work, the key chunk must be +** linked into the hash tables. That is not the normal state of +** affairs, of course. The calling routine must link the key +** chunk before invoking this routine, then must unlink the (possibly +** changed) key chunk once this routine has finished. +*/ +static void memsys3Merge(u32 *pRoot){ + u32 iNext, prev, size, i, x; + + assert( sqlite3_mutex_held(mem3.mutex) ); + for(i=*pRoot; i>0; i=iNext){ + iNext = mem3.aPool[i].u.list.next; + size = mem3.aPool[i-1].u.hdr.size4x; + assert( (size&1)==0 ); + if( (size&2)==0 ){ + memsys3UnlinkFromList(i, pRoot); + assert( i > mem3.aPool[i-1].u.hdr.prevSize ); + prev = i - mem3.aPool[i-1].u.hdr.prevSize; + if( prev==iNext ){ + iNext = mem3.aPool[prev].u.list.next; + } + memsys3Unlink(prev); + size = i + size/4 - prev; + x = mem3.aPool[prev-1].u.hdr.size4x & 2; + mem3.aPool[prev-1].u.hdr.size4x = size*4 | x; + mem3.aPool[prev+size-1].u.hdr.prevSize = size; + memsys3Link(prev); + i = prev; + }else{ + size /= 4; + } + if( size>mem3.szKeyBlk ){ + mem3.iKeyBlk = i; + mem3.szKeyBlk = size; + } + } +} + +/* +** Return a block of memory of at least nBytes in size. +** Return NULL if unable. +** +** This function assumes that the necessary mutexes, if any, are +** already held by the caller. Hence "Unsafe". +*/ +static void *memsys3MallocUnsafe(int nByte){ + u32 i; + u32 nBlock; + u32 toFree; + + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( sizeof(Mem3Block)==8 ); + if( nByte<=12 ){ + nBlock = 2; + }else{ + nBlock = (nByte + 11)/8; + } + assert( nBlock>=2 ); + + /* STEP 1: + ** Look for an entry of the correct size in either the small + ** chunk table or in the large chunk hash table. This is + ** successful most of the time (about 9 times out of 10). + */ + if( nBlock <= MX_SMALL ){ + i = mem3.aiSmall[nBlock-2]; + if( i>0 ){ + memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock-2]); + return memsys3Checkout(i, nBlock); + } + }else{ + int hash = nBlock % N_HASH; + for(i=mem3.aiHash[hash]; i>0; i=mem3.aPool[i].u.list.next){ + if( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ){ + memsys3UnlinkFromList(i, &mem3.aiHash[hash]); + return memsys3Checkout(i, nBlock); + } + } + } + + /* STEP 2: + ** Try to satisfy the allocation by carving a piece off of the end + ** of the key chunk. This step usually works if step 1 fails. + */ + if( mem3.szKeyBlk>=nBlock ){ + return memsys3FromKeyBlk(nBlock); + } + + + /* STEP 3: + ** Loop through the entire memory pool. Coalesce adjacent free + ** chunks. Recompute the key chunk as the largest free chunk. + ** Then try again to satisfy the allocation by carving a piece off + ** of the end of the key chunk. This step happens very + ** rarely (we hope!) + */ + for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){ + memsys3OutOfMemory(toFree); + if( mem3.iKeyBlk ){ + memsys3Link(mem3.iKeyBlk); + mem3.iKeyBlk = 0; + mem3.szKeyBlk = 0; + } + for(i=0; i=nBlock ){ + return memsys3FromKeyBlk(nBlock); + } + } + } + + /* If none of the above worked, then we fail. */ + return 0; +} + +/* +** Free an outstanding memory allocation. +** +** This function assumes that the necessary mutexes, if any, are +** already held by the caller. Hence "Unsafe". +*/ +static void memsys3FreeUnsafe(void *pOld){ + Mem3Block *p = (Mem3Block*)pOld; + int i; + u32 size, x; + assert( sqlite3_mutex_held(mem3.mutex) ); + assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] ); + i = p - mem3.aPool; + assert( (mem3.aPool[i-1].u.hdr.size4x&1)==1 ); + size = mem3.aPool[i-1].u.hdr.size4x/4; + assert( i+size<=mem3.nPool+1 ); + mem3.aPool[i-1].u.hdr.size4x &= ~1; + mem3.aPool[i+size-1].u.hdr.prevSize = size; + mem3.aPool[i+size-1].u.hdr.size4x &= ~2; + memsys3Link(i); + + /* Try to expand the key using the newly freed chunk */ + if( mem3.iKeyBlk ){ + while( (mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x&2)==0 ){ + size = mem3.aPool[mem3.iKeyBlk-1].u.hdr.prevSize; + mem3.iKeyBlk -= size; + mem3.szKeyBlk += size; + memsys3Unlink(mem3.iKeyBlk); + x = mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x & 2; + mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x = mem3.szKeyBlk*4 | x; + mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.prevSize = mem3.szKeyBlk; + } + x = mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x & 2; + while( (mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.size4x&1)==0 ){ + memsys3Unlink(mem3.iKeyBlk+mem3.szKeyBlk); + mem3.szKeyBlk += mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.size4x/4; + mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x = mem3.szKeyBlk*4 | x; + mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.prevSize = mem3.szKeyBlk; + } + } +} + +/* +** Return the size of an outstanding allocation, in bytes. The +** size returned omits the 8-byte header overhead. This only +** works for chunks that are currently checked out. +*/ +static int memsys3Size(void *p){ + Mem3Block *pBlock; + assert( p!=0 ); + pBlock = (Mem3Block*)p; + assert( (pBlock[-1].u.hdr.size4x&1)!=0 ); + return (pBlock[-1].u.hdr.size4x&~3)*2 - 4; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int memsys3Roundup(int n){ + if( n<=12 ){ + return 12; + }else{ + return ((n+11)&~7) - 4; + } +} + +/* +** Allocate nBytes of memory. +*/ +static void *memsys3Malloc(int nBytes){ + sqlite3_int64 *p; + assert( nBytes>0 ); /* malloc.c filters out 0 byte requests */ + memsys3Enter(); + p = memsys3MallocUnsafe(nBytes); + memsys3Leave(); + return (void*)p; +} + +/* +** Free memory. +*/ +static void memsys3Free(void *pPrior){ + assert( pPrior ); + memsys3Enter(); + memsys3FreeUnsafe(pPrior); + memsys3Leave(); +} + +/* +** Change the size of an existing memory allocation +*/ +static void *memsys3Realloc(void *pPrior, int nBytes){ + int nOld; + void *p; + if( pPrior==0 ){ + return sqlite3_malloc(nBytes); + } + if( nBytes<=0 ){ + sqlite3_free(pPrior); + return 0; + } + nOld = memsys3Size(pPrior); + if( nBytes<=nOld && nBytes>=nOld-128 ){ + return pPrior; + } + memsys3Enter(); + p = memsys3MallocUnsafe(nBytes); + if( p ){ + if( nOld>1)!=(size&1) ){ + fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]); + assert( 0 ); + break; + } + if( size&1 ){ + fprintf(out, "%p %6d bytes checked out\n", &mem3.aPool[i], (size/4)*8-8); + }else{ + fprintf(out, "%p %6d bytes free%s\n", &mem3.aPool[i], (size/4)*8-8, + i==mem3.iKeyBlk ? " **key**" : ""); + } + } + for(i=0; i0; j=mem3.aPool[j].u.list.next){ + fprintf(out, " %p(%d)", &mem3.aPool[j], + (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); + } + fprintf(out, "\n"); + } + for(i=0; i0; j=mem3.aPool[j].u.list.next){ + fprintf(out, " %p(%d)", &mem3.aPool[j], + (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); + } + fprintf(out, "\n"); + } + fprintf(out, "key=%d\n", mem3.iKeyBlk); + fprintf(out, "nowUsed=%d\n", mem3.nPool*8 - mem3.szKeyBlk*8); + fprintf(out, "mxUsed=%d\n", mem3.nPool*8 - mem3.mnKeyBlk*8); + sqlite3_mutex_leave(mem3.mutex); + if( out==stdout ){ + fflush(stdout); + }else{ + fclose(out); + } +#else + UNUSED_PARAMETER(zFilename); +#endif +} + +/* +** This routine is the only routine in this file with external +** linkage. +** +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. The +** arguments specify the block of memory to manage. +** +** This routine is only called by sqlite3_config(), and therefore +** is not required to be threadsafe (it is not). +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ + static const sqlite3_mem_methods mempoolMethods = { + memsys3Malloc, + memsys3Free, + memsys3Realloc, + memsys3Size, + memsys3Roundup, + memsys3Init, + memsys3Shutdown, + 0 + }; + return &mempoolMethods; +} + +#endif /* SQLITE_ENABLE_MEMSYS3 */ + +/************** End of mem3.c ************************************************/ +/************** Begin file mem5.c ********************************************/ +/* +** 2007 October 14 +** +** 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 contains the C functions that implement a memory +** allocation subsystem for use by SQLite. +** +** This version of the memory allocation subsystem omits all +** use of malloc(). The application gives SQLite a block of memory +** before calling sqlite3_initialize() from which allocations +** are made and returned by the xMalloc() and xRealloc() +** implementations. Once sqlite3_initialize() has been called, +** the amount of memory available to SQLite is fixed and cannot +** be changed. +** +** This version of the memory allocation subsystem is included +** in the build only if SQLITE_ENABLE_MEMSYS5 is defined. +** +** This memory allocator uses the following algorithm: +** +** 1. All memory allocation sizes are rounded up to a power of 2. +** +** 2. If two adjacent free blocks are the halves of a larger block, +** then the two blocks are coalesced into the single larger block. +** +** 3. New memory is allocated from the first available free block. +** +** This algorithm is described in: J. M. Robson. "Bounds for Some Functions +** Concerning Dynamic Storage Allocation". Journal of the Association for +** Computing Machinery, Volume 21, Number 8, July 1974, pages 491-499. +** +** Let n be the size of the largest allocation divided by the minimum +** allocation size (after rounding all sizes up to a power of 2.) Let M +** be the maximum amount of memory ever outstanding at one time. Let +** N be the total amount of memory available for allocation. Robson +** proved that this memory allocator will never breakdown due to +** fragmentation as long as the following constraint holds: +** +** N >= M*(1 + log2(n)/2) - n + 1 +** +** The sqlite3_status() logic tracks the maximum values of n and M so +** that an application can, at any time, verify this constraint. +*/ +/* #include "sqliteInt.h" */ + +/* +** This version of the memory allocator is used only when +** SQLITE_ENABLE_MEMSYS5 is defined. +*/ +#ifdef SQLITE_ENABLE_MEMSYS5 + +/* +** A minimum allocation is an instance of the following structure. +** Larger allocations are an array of these structures where the +** size of the array is a power of 2. +** +** The size of this object must be a power of two. That fact is +** verified in memsys5Init(). +*/ +typedef struct Mem5Link Mem5Link; +struct Mem5Link { + int next; /* Index of next free chunk */ + int prev; /* Index of previous free chunk */ +}; + +/* +** Maximum size of any allocation is ((1<=0 && i=0 && iLogsize<=LOGMAX ); + assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + + next = MEM5LINK(i)->next; + prev = MEM5LINK(i)->prev; + if( prev<0 ){ + mem5.aiFreelist[iLogsize] = next; + }else{ + MEM5LINK(prev)->next = next; + } + if( next>=0 ){ + MEM5LINK(next)->prev = prev; + } +} + +/* +** Link the chunk at mem5.aPool[i] so that is on the iLogsize +** free list. +*/ +static void memsys5Link(int i, int iLogsize){ + int x; + assert( sqlite3_mutex_held(mem5.mutex) ); + assert( i>=0 && i=0 && iLogsize<=LOGMAX ); + assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + + x = MEM5LINK(i)->next = mem5.aiFreelist[iLogsize]; + MEM5LINK(i)->prev = -1; + if( x>=0 ){ + assert( xprev = i; + } + mem5.aiFreelist[iLogsize] = i; +} + +/* +** Obtain or release the mutex needed to access global data structures. +*/ +static void memsys5Enter(void){ + sqlite3_mutex_enter(mem5.mutex); +} +static void memsys5Leave(void){ + sqlite3_mutex_leave(mem5.mutex); +} + +/* +** Return the size of an outstanding allocation, in bytes. +** This only works for chunks that are currently checked out. +*/ +static int memsys5Size(void *p){ + int iSize, i; + assert( p!=0 ); + i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); + assert( i>=0 && i0 ); + + /* No more than 1GiB per allocation */ + if( nByte > 0x40000000 ) return 0; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* Keep track of the maximum allocation request. Even unfulfilled + ** requests are counted */ + if( (u32)nByte>mem5.maxRequest ){ + mem5.maxRequest = nByte; + } +#endif + + + /* Round nByte up to the next valid power of two */ + for(iFullSz=mem5.szAtom,iLogsize=0; iFullSzLOGMAX ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes", nByte); + return 0; + } + i = mem5.aiFreelist[iBin]; + memsys5Unlink(i, iBin); + while( iBin>iLogsize ){ + int newSize; + + iBin--; + newSize = 1 << iBin; + mem5.aCtrl[i+newSize] = CTRL_FREE | iBin; + memsys5Link(i+newSize, iBin); + } + mem5.aCtrl[i] = iLogsize; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* Update allocator performance statistics. */ + mem5.nAlloc++; + mem5.totalAlloc += iFullSz; + mem5.totalExcess += iFullSz - nByte; + mem5.currentCount++; + mem5.currentOut += iFullSz; + if( mem5.maxCount=0 && iBlock0 ); + assert( mem5.currentOut>=(size*mem5.szAtom) ); + mem5.currentCount--; + mem5.currentOut -= size*mem5.szAtom; + assert( mem5.currentOut>0 || mem5.currentCount==0 ); + assert( mem5.currentCount>0 || mem5.currentOut==0 ); +#endif + + mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize; + while( ALWAYS(iLogsize>iLogsize) & 1 ){ + iBuddy = iBlock - size; + assert( iBuddy>=0 ); + }else{ + iBuddy = iBlock + size; + if( iBuddy>=mem5.nBlock ) break; + } + if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break; + memsys5Unlink(iBuddy, iLogsize); + iLogsize++; + if( iBuddy0 ){ + memsys5Enter(); + p = memsys5MallocUnsafe(nBytes); + memsys5Leave(); + } + return (void*)p; +} + +/* +** Free memory. +** +** The outer layer memory allocator prevents this routine from +** being called with pPrior==0. +*/ +static void memsys5Free(void *pPrior){ + assert( pPrior!=0 ); + memsys5Enter(); + memsys5FreeUnsafe(pPrior); + memsys5Leave(); +} + +/* +** Change the size of an existing memory allocation. +** +** The outer layer memory allocator prevents this routine from +** being called with pPrior==0. +** +** nBytes is always a value obtained from a prior call to +** memsys5Round(). Hence nBytes is always a non-negative power +** of two. If nBytes==0 that means that an oversize allocation +** (an allocation larger than 0x40000000) was requested and this +** routine should return 0 without freeing pPrior. +*/ +static void *memsys5Realloc(void *pPrior, int nBytes){ + int nOld; + void *p; + assert( pPrior!=0 ); + assert( (nBytes&(nBytes-1))==0 ); /* EV: R-46199-30249 */ + assert( nBytes>=0 ); + if( nBytes==0 ){ + return 0; + } + nOld = memsys5Size(pPrior); + if( nBytes<=nOld ){ + return pPrior; + } + p = memsys5Malloc(nBytes); + if( p ){ + memcpy(p, pPrior, nOld); + memsys5Free(pPrior); + } + return p; +} + +/* +** Round up a request size to the next valid allocation size. If +** the allocation is too large to be handled by this allocation system, +** return 0. +** +** All allocations must be a power of two and must be expressed by a +** 32-bit signed integer. Hence the largest allocation is 0x40000000 +** or 1073741824 bytes. +*/ +static int memsys5Roundup(int n){ + int iFullSz; + if( n<=mem5.szAtom*2 ){ + if( n<=mem5.szAtom ) return mem5.szAtom; + return mem5.szAtom*2; + } + if( n>0x40000000 ) return 0; + for(iFullSz=mem5.szAtom*8; iFullSz=n ) return iFullSz/2; + return iFullSz; +} + +/* +** Return the ceiling of the logarithm base 2 of iValue. +** +** Examples: memsys5Log(1) -> 0 +** memsys5Log(2) -> 1 +** memsys5Log(4) -> 2 +** memsys5Log(5) -> 3 +** memsys5Log(8) -> 3 +** memsys5Log(9) -> 4 +*/ +static int memsys5Log(int iValue){ + int iLog; + for(iLog=0; (iLog<(int)((sizeof(int)*8)-1)) && (1<mem5.szAtom ){ + mem5.szAtom = mem5.szAtom << 1; + } + + mem5.nBlock = (nByte / (mem5.szAtom+sizeof(u8))); + mem5.zPool = zByte; + mem5.aCtrl = (u8 *)&mem5.zPool[mem5.nBlock*mem5.szAtom]; + + for(ii=0; ii<=LOGMAX; ii++){ + mem5.aiFreelist[ii] = -1; + } + + iOffset = 0; + for(ii=LOGMAX; ii>=0; ii--){ + int nAlloc = (1<mem5.nBlock); + } + + /* If a mutex is required for normal operation, allocate one */ + if( sqlite3GlobalConfig.bMemstat==0 ){ + mem5.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); + } + + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void memsys5Shutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + mem5.mutex = 0; + return; +} + +#ifdef SQLITE_TEST +/* +** Open the file indicated and write a log of all unfreed memory +** allocations into that log. +*/ +SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ + FILE *out; + int i, j, n; + int nMinLog; + + if( zFilename==0 || zFilename[0]==0 ){ + out = stdout; + }else{ + out = fopen(zFilename, "w"); + if( out==0 ){ + fprintf(stderr, "** Unable to output memory debug output log: %s **\n", + zFilename); + return; + } + } + memsys5Enter(); + nMinLog = memsys5Log(mem5.szAtom); + for(i=0; i<=LOGMAX && i+nMinLog<32; i++){ + for(n=0, j=mem5.aiFreelist[i]; j>=0; j = MEM5LINK(j)->next, n++){} + fprintf(out, "freelist items of size %d: %d\n", mem5.szAtom << i, n); + } + fprintf(out, "mem5.nAlloc = %llu\n", mem5.nAlloc); + fprintf(out, "mem5.totalAlloc = %llu\n", mem5.totalAlloc); + fprintf(out, "mem5.totalExcess = %llu\n", mem5.totalExcess); + fprintf(out, "mem5.currentOut = %u\n", mem5.currentOut); + fprintf(out, "mem5.currentCount = %u\n", mem5.currentCount); + fprintf(out, "mem5.maxOut = %u\n", mem5.maxOut); + fprintf(out, "mem5.maxCount = %u\n", mem5.maxCount); + fprintf(out, "mem5.maxRequest = %u\n", mem5.maxRequest); + memsys5Leave(); + if( out==stdout ){ + fflush(stdout); + }else{ + fclose(out); + } +} +#endif + +/* +** This routine is the only routine in this file with external +** linkage. It returns a pointer to a static sqlite3_mem_methods +** struct populated with the memsys5 methods. +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ + static const sqlite3_mem_methods memsys5Methods = { + memsys5Malloc, + memsys5Free, + memsys5Realloc, + memsys5Size, + memsys5Roundup, + memsys5Init, + memsys5Shutdown, + 0 + }; + return &memsys5Methods; +} + +#endif /* SQLITE_ENABLE_MEMSYS5 */ + +/************** End of mem5.c ************************************************/ +/************** Begin file mutex.c *******************************************/ +/* +** 2007 August 14 +** +** 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 contains the C functions that implement mutexes. +** +** This file contains code that is common across all mutex implementations. +*/ +/* #include "sqliteInt.h" */ + +#if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT) +/* +** For debugging purposes, record when the mutex subsystem is initialized +** and uninitialized so that we can assert() if there is an attempt to +** allocate a mutex while the system is uninitialized. +*/ +static SQLITE_WSD int mutexIsInit = 0; +#endif /* SQLITE_DEBUG && !defined(SQLITE_MUTEX_OMIT) */ + + +#ifndef SQLITE_MUTEX_OMIT + +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS +/* +** This block (enclosed by SQLITE_ENABLE_MULTITHREADED_CHECKS) contains +** the implementation of a wrapper around the system default mutex +** implementation (sqlite3DefaultMutex()). +** +** Most calls are passed directly through to the underlying default +** mutex implementation. Except, if a mutex is configured by calling +** sqlite3MutexWarnOnContention() on it, then if contention is ever +** encountered within xMutexEnter() a warning is emitted via sqlite3_log(). +** +** This type of mutex is used as the database handle mutex when testing +** apps that usually use SQLITE_CONFIG_MULTITHREAD mode. +*/ + +/* +** Type for all mutexes used when SQLITE_ENABLE_MULTITHREADED_CHECKS +** is defined. Variable CheckMutex.mutex is a pointer to the real mutex +** allocated by the system mutex implementation. Variable iType is usually set +** to the type of mutex requested - SQLITE_MUTEX_RECURSIVE, SQLITE_MUTEX_FAST +** or one of the static mutex identifiers. Or, if this is a recursive mutex +** that has been configured using sqlite3MutexWarnOnContention(), it is +** set to SQLITE_MUTEX_WARNONCONTENTION. +*/ +typedef struct CheckMutex CheckMutex; +struct CheckMutex { + int iType; + sqlite3_mutex *mutex; +}; + +#define SQLITE_MUTEX_WARNONCONTENTION (-1) + +/* +** Pointer to real mutex methods object used by the CheckMutex +** implementation. Set by checkMutexInit(). +*/ +static SQLITE_WSD const sqlite3_mutex_methods *pGlobalMutexMethods; + +#ifdef SQLITE_DEBUG +static int checkMutexHeld(sqlite3_mutex *p){ + return pGlobalMutexMethods->xMutexHeld(((CheckMutex*)p)->mutex); +} +static int checkMutexNotheld(sqlite3_mutex *p){ + return pGlobalMutexMethods->xMutexNotheld(((CheckMutex*)p)->mutex); +} +#endif + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int checkMutexInit(void){ + pGlobalMutexMethods = sqlite3DefaultMutex(); + return SQLITE_OK; +} +static int checkMutexEnd(void){ + pGlobalMutexMethods = 0; + return SQLITE_OK; +} + +/* +** Allocate a mutex. +*/ +static sqlite3_mutex *checkMutexAlloc(int iType){ + static CheckMutex staticMutexes[] = { + {2, 0}, {3, 0}, {4, 0}, {5, 0}, + {6, 0}, {7, 0}, {8, 0}, {9, 0}, + {10, 0}, {11, 0}, {12, 0}, {13, 0} + }; + CheckMutex *p = 0; + + assert( SQLITE_MUTEX_RECURSIVE==1 && SQLITE_MUTEX_FAST==0 ); + if( iType<2 ){ + p = sqlite3MallocZero(sizeof(CheckMutex)); + if( p==0 ) return 0; + p->iType = iType; + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2>=ArraySize(staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &staticMutexes[iType-2]; + } + + if( p->mutex==0 ){ + p->mutex = pGlobalMutexMethods->xMutexAlloc(iType); + if( p->mutex==0 ){ + if( iType<2 ){ + sqlite3_free(p); + } + p = 0; + } + } + + return (sqlite3_mutex*)p; +} + +/* +** Free a mutex. +*/ +static void checkMutexFree(sqlite3_mutex *p){ + assert( SQLITE_MUTEX_RECURSIVE<2 ); + assert( SQLITE_MUTEX_FAST<2 ); + assert( SQLITE_MUTEX_WARNONCONTENTION<2 ); + +#if SQLITE_ENABLE_API_ARMOR + if( ((CheckMutex*)p)->iType<2 ) +#endif + { + CheckMutex *pCheck = (CheckMutex*)p; + pGlobalMutexMethods->xMutexFree(pCheck->mutex); + sqlite3_free(pCheck); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#endif +} + +/* +** Enter the mutex. +*/ +static void checkMutexEnter(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + if( pCheck->iType==SQLITE_MUTEX_WARNONCONTENTION ){ + if( SQLITE_OK==pGlobalMutexMethods->xMutexTry(pCheck->mutex) ){ + return; + } + sqlite3_log(SQLITE_MISUSE, + "illegal multi-threaded access to database connection" + ); + } + pGlobalMutexMethods->xMutexEnter(pCheck->mutex); +} + +/* +** Enter the mutex (do not block). +*/ +static int checkMutexTry(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + return pGlobalMutexMethods->xMutexTry(pCheck->mutex); +} + +/* +** Leave the mutex. +*/ +static void checkMutexLeave(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + pGlobalMutexMethods->xMutexLeave(pCheck->mutex); +} + +sqlite3_mutex_methods const *multiThreadedCheckMutex(void){ + static const sqlite3_mutex_methods sMutex = { + checkMutexInit, + checkMutexEnd, + checkMutexAlloc, + checkMutexFree, + checkMutexEnter, + checkMutexTry, + checkMutexLeave, +#ifdef SQLITE_DEBUG + checkMutexHeld, + checkMutexNotheld +#else + 0, + 0 +#endif + }; + return &sMutex; +} + +/* +** Mark the SQLITE_MUTEX_RECURSIVE mutex passed as the only argument as +** one on which there should be no contention. +*/ +SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex *p){ + if( sqlite3GlobalConfig.mutex.xMutexAlloc==checkMutexAlloc ){ + CheckMutex *pCheck = (CheckMutex*)p; + assert( pCheck->iType==SQLITE_MUTEX_RECURSIVE ); + pCheck->iType = SQLITE_MUTEX_WARNONCONTENTION; + } +} +#endif /* ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS */ + +/* +** Initialize the mutex system. +*/ +SQLITE_PRIVATE int sqlite3MutexInit(void){ + int rc = SQLITE_OK; + if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){ + /* If the xMutexAlloc method has not been set, then the user did not + ** install a mutex implementation via sqlite3_config() prior to + ** sqlite3_initialize() being called. This block copies pointers to + ** the default implementation into the sqlite3GlobalConfig structure. + */ + sqlite3_mutex_methods const *pFrom; + sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; + + if( sqlite3GlobalConfig.bCoreMutex ){ +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS + pFrom = multiThreadedCheckMutex(); +#else + pFrom = sqlite3DefaultMutex(); +#endif + }else{ + pFrom = sqlite3NoopMutex(); + } + pTo->xMutexInit = pFrom->xMutexInit; + pTo->xMutexEnd = pFrom->xMutexEnd; + pTo->xMutexFree = pFrom->xMutexFree; + pTo->xMutexEnter = pFrom->xMutexEnter; + pTo->xMutexTry = pFrom->xMutexTry; + pTo->xMutexLeave = pFrom->xMutexLeave; + pTo->xMutexHeld = pFrom->xMutexHeld; + pTo->xMutexNotheld = pFrom->xMutexNotheld; + sqlite3MemoryBarrier(); + pTo->xMutexAlloc = pFrom->xMutexAlloc; + } + assert( sqlite3GlobalConfig.mutex.xMutexInit ); + rc = sqlite3GlobalConfig.mutex.xMutexInit(); + +#ifdef SQLITE_DEBUG + GLOBAL(int, mutexIsInit) = 1; +#endif + + sqlite3MemoryBarrier(); + return rc; +} + +/* +** Shutdown the mutex system. This call frees resources allocated by +** sqlite3MutexInit(). +*/ +SQLITE_PRIVATE int sqlite3MutexEnd(void){ + int rc = SQLITE_OK; + if( sqlite3GlobalConfig.mutex.xMutexEnd ){ + rc = sqlite3GlobalConfig.mutex.xMutexEnd(); + } + +#ifdef SQLITE_DEBUG + GLOBAL(int, mutexIsInit) = 0; +#endif + + return rc; +} + +/* +** Retrieve a pointer to a static mutex or allocate a new dynamic one. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){ +#ifndef SQLITE_OMIT_AUTOINIT + if( id<=SQLITE_MUTEX_RECURSIVE && sqlite3_initialize() ) return 0; + if( id>SQLITE_MUTEX_RECURSIVE && sqlite3MutexInit() ) return 0; +#endif + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + return sqlite3GlobalConfig.mutex.xMutexAlloc(id); +} + +SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){ + if( !sqlite3GlobalConfig.bCoreMutex ){ + return 0; + } + assert( GLOBAL(int, mutexIsInit) ); + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + return sqlite3GlobalConfig.mutex.xMutexAlloc(id); +} + +/* +** Free a dynamic mutex. +*/ +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexFree ); + sqlite3GlobalConfig.mutex.xMutexFree(p); + } +} + +/* +** Obtain the mutex p. If some other thread already has the mutex, block +** until it can be obtained. +*/ +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexEnter ); + sqlite3GlobalConfig.mutex.xMutexEnter(p); + } +} + +/* +** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another +** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY. +*/ +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ + int rc = SQLITE_OK; + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexTry ); + return sqlite3GlobalConfig.mutex.xMutexTry(p); + } + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was previously +** entered by the same thread. The behavior is undefined if the mutex +** is not currently entered. If a NULL pointer is passed as an argument +** this function is a no-op. +*/ +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ + if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexLeave ); + sqlite3GlobalConfig.mutex.xMutexLeave(p); + } +} + +#ifndef NDEBUG +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexHeld ); + return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p); +} +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld ); + return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); +} +#endif + +#endif /* !defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.c ***********************************************/ +/************** Begin file mutex_noop.c **************************************/ +/* +** 2008 October 07 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains the C functions that implement mutexes. +** +** This implementation in this file does not provide any mutual +** exclusion and is thus suitable for use only in applications +** that use SQLite in a single thread. The routines defined +** here are place-holders. Applications can substitute working +** mutex routines at start-time using the +** +** sqlite3_config(SQLITE_CONFIG_MUTEX,...) +** +** interface. +** +** If compiled with SQLITE_DEBUG, then additional logic is inserted +** that does error checking on mutexes to make sure they are being +** called correctly. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_MUTEX_OMIT + +#ifndef SQLITE_DEBUG +/* +** Stub routines for all mutex methods. +** +** This routines provide no mutual exclusion or error checking. +*/ +static int noopMutexInit(void){ return SQLITE_OK; } +static int noopMutexEnd(void){ return SQLITE_OK; } +static sqlite3_mutex *noopMutexAlloc(int id){ + UNUSED_PARAMETER(id); + return (sqlite3_mutex*)8; +} +static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } +static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } +static int noopMutexTry(sqlite3_mutex *p){ + UNUSED_PARAMETER(p); + return SQLITE_OK; +} +static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ + static const sqlite3_mutex_methods sMutex = { + noopMutexInit, + noopMutexEnd, + noopMutexAlloc, + noopMutexFree, + noopMutexEnter, + noopMutexTry, + noopMutexLeave, + + 0, + 0, + }; + + return &sMutex; +} +#endif /* !SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +** In this implementation, error checking is provided for testing +** and debugging purposes. The mutexes still do not provide any +** mutual exclusion. +*/ + +/* +** The mutex object +*/ +typedef struct sqlite3_debug_mutex { + int id; /* The mutex type */ + int cnt; /* Number of entries without a matching leave */ +} sqlite3_debug_mutex; + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +static int debugMutexHeld(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + return p==0 || p->cnt>0; +} +static int debugMutexNotheld(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + return p==0 || p->cnt==0; +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int debugMutexInit(void){ return SQLITE_OK; } +static int debugMutexEnd(void){ return SQLITE_OK; } + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. +*/ +static sqlite3_mutex *debugMutexAlloc(int id){ + static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_VFS3 - 1]; + sqlite3_debug_mutex *pNew = 0; + switch( id ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + pNew = sqlite3Malloc(sizeof(*pNew)); + if( pNew ){ + pNew->id = id; + pNew->cnt = 0; + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( id-2<0 || id-2>=ArraySize(aStatic) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + pNew = &aStatic[id-2]; + pNew->id = id; + break; + } + } + return (sqlite3_mutex*)pNew; +} + +/* +** This routine deallocates a previously allocated mutex. +*/ +static void debugMutexFree(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->cnt==0 ); + if( p->id==SQLITE_MUTEX_RECURSIVE || p->id==SQLITE_MUTEX_FAST ){ + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#endif + } +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void debugMutexEnter(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); + p->cnt++; +} +static int debugMutexTry(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); + p->cnt++; + return SQLITE_OK; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void debugMutexLeave(sqlite3_mutex *pX){ + sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; + assert( debugMutexHeld(pX) ); + p->cnt--; + assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) ); +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ + static const sqlite3_mutex_methods sMutex = { + debugMutexInit, + debugMutexEnd, + debugMutexAlloc, + debugMutexFree, + debugMutexEnter, + debugMutexTry, + debugMutexLeave, + + debugMutexHeld, + debugMutexNotheld + }; + + return &sMutex; +} +#endif /* SQLITE_DEBUG */ + +/* +** If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation +** is used regardless of the run-time threadsafety setting. +*/ +#ifdef SQLITE_MUTEX_NOOP +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + return sqlite3NoopMutex(); +} +#endif /* defined(SQLITE_MUTEX_NOOP) */ +#endif /* !defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex_noop.c ******************************************/ +/************** Begin file mutex_unix.c **************************************/ +/* +** 2007 August 28 +** +** 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 contains the C functions that implement mutexes for pthreads +*/ +/* #include "sqliteInt.h" */ + +/* +** The code in this file is only used if we are compiling threadsafe +** under unix with pthreads. +** +** Note that this implementation requires a version of pthreads that +** supports recursive mutexes. +*/ +#ifdef SQLITE_MUTEX_PTHREADS + +#include + +/* +** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields +** are necessary under two condidtions: (1) Debug builds and (2) using +** home-grown mutexes. Encapsulate these conditions into a single #define. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX) +# define SQLITE_MUTEX_NREF 1 +#else +# define SQLITE_MUTEX_NREF 0 +#endif + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + pthread_mutex_t mutex; /* Mutex controlling the lock */ +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + int id; /* Mutex type */ +#endif +#if SQLITE_MUTEX_NREF + volatile int nRef; /* Number of entrances */ + volatile pthread_t owner; /* Thread that is within this mutex */ + int trace; /* True to trace changes */ +#endif +}; +#if SQLITE_MUTEX_NREF +# define SQLITE3_MUTEX_INITIALIZER(id) \ + {PTHREAD_MUTEX_INITIALIZER,id,0,(pthread_t)0,0} +#elif defined(SQLITE_ENABLE_API_ARMOR) +# define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER, id } +#else +#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER } +#endif + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. On some platforms, +** there might be race conditions that can cause these routines to +** deliver incorrect results. In particular, if pthread_equal() is +** not an atomic operation, then these routines might delivery +** incorrect results. On most platforms, pthread_equal() is a +** comparison of two integers and is therefore atomic. But we are +** told that HPUX is not such a platform. If so, then these routines +** will not always work correctly on HPUX. +** +** On those platforms where pthread_equal() is not atomic, SQLite +** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to +** make sure no assert() statements are evaluated and hence these +** routines are never called. +*/ +#if !defined(NDEBUG) || defined(SQLITE_DEBUG) +static int pthreadMutexHeld(sqlite3_mutex *p){ + return (p->nRef!=0 && pthread_equal(p->owner, pthread_self())); +} +static int pthreadMutexNotheld(sqlite3_mutex *p){ + return p->nRef==0 || pthread_equal(p->owner, pthread_self())==0; +} +#endif + +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the implementation of xShmBarrier in the VFS in cases +** where SQLite is compiled without mutexes. +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) && GCC_VERSION>=4001000 + __sync_synchronize(); +#endif +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int pthreadMutexInit(void){ return SQLITE_OK; } +static int pthreadMutexEnd(void){ return SQLITE_OK; } + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. SQLite +** will unwind its stack and return an error. The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
          +**
        • SQLITE_MUTEX_FAST +**
        • SQLITE_MUTEX_RECURSIVE +**
        • SQLITE_MUTEX_STATIC_MAIN +**
        • SQLITE_MUTEX_STATIC_MEM +**
        • SQLITE_MUTEX_STATIC_OPEN +**
        • SQLITE_MUTEX_STATIC_PRNG +**
        • SQLITE_MUTEX_STATIC_LRU +**
        • SQLITE_MUTEX_STATIC_PMEM +**
        • SQLITE_MUTEX_STATIC_APP1 +**
        • SQLITE_MUTEX_STATIC_APP2 +**
        • SQLITE_MUTEX_STATIC_APP3 +**
        • SQLITE_MUTEX_STATIC_VFS1 +**
        • SQLITE_MUTEX_STATIC_VFS2 +**
        • SQLITE_MUTEX_STATIC_VFS3 +**
        +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Six static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +static sqlite3_mutex *pthreadMutexAlloc(int iType){ + static sqlite3_mutex staticMutexes[] = { + SQLITE3_MUTEX_INITIALIZER(2), + SQLITE3_MUTEX_INITIALIZER(3), + SQLITE3_MUTEX_INITIALIZER(4), + SQLITE3_MUTEX_INITIALIZER(5), + SQLITE3_MUTEX_INITIALIZER(6), + SQLITE3_MUTEX_INITIALIZER(7), + SQLITE3_MUTEX_INITIALIZER(8), + SQLITE3_MUTEX_INITIALIZER(9), + SQLITE3_MUTEX_INITIALIZER(10), + SQLITE3_MUTEX_INITIALIZER(11), + SQLITE3_MUTEX_INITIALIZER(12), + SQLITE3_MUTEX_INITIALIZER(13) + }; + sqlite3_mutex *p; + switch( iType ){ + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, we will have to + ** build our own. See below. */ + pthread_mutex_init(&p->mutex, 0); +#else + /* Use a recursive mutex if it is available */ + pthread_mutexattr_t recursiveAttr; + pthread_mutexattr_init(&recursiveAttr); + pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&p->mutex, &recursiveAttr); + pthread_mutexattr_destroy(&recursiveAttr); +#endif +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + p->id = SQLITE_MUTEX_RECURSIVE; +#endif + } + break; + } + case SQLITE_MUTEX_FAST: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + pthread_mutex_init(&p->mutex, 0); +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + p->id = SQLITE_MUTEX_FAST; +#endif + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2<0 || iType-2>=ArraySize(staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &staticMutexes[iType-2]; + break; + } + } +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + assert( p==0 || p->id==iType ); +#endif + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +static void pthreadMutexFree(sqlite3_mutex *p){ + assert( p->nRef==0 ); +#if SQLITE_ENABLE_API_ARMOR + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ) +#endif + { + pthread_mutex_destroy(&p->mutex); + sqlite3_free(p); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#endif +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void pthreadMutexEnter(sqlite3_mutex *p){ + assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, then we have to grow + ** our own. This implementation assumes that pthread_equal() + ** is atomic - that it cannot be deceived into thinking self + ** and p->owner are equal if p->owner changes between two values + ** that are not equal to self while the comparison is taking place. + ** This implementation also assumes a coherent cache - that + ** separate processes cannot read different values from the same + ** address at the same time. If either of these two conditions + ** are not met, then the mutexes will fail and problems will result. + */ + { + pthread_t self = pthread_self(); + if( p->nRef>0 && pthread_equal(p->owner, self) ){ + p->nRef++; + }else{ + pthread_mutex_lock(&p->mutex); + assert( p->nRef==0 ); + p->owner = self; + p->nRef = 1; + } + } +#else + /* Use the built-in recursive mutexes if they are available. + */ + pthread_mutex_lock(&p->mutex); +#if SQLITE_MUTEX_NREF + assert( p->nRef>0 || p->owner==0 ); + p->owner = pthread_self(); + p->nRef++; +#endif +#endif + +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} +static int pthreadMutexTry(sqlite3_mutex *p){ + int rc; + assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + /* If recursive mutexes are not available, then we have to grow + ** our own. This implementation assumes that pthread_equal() + ** is atomic - that it cannot be deceived into thinking self + ** and p->owner are equal if p->owner changes between two values + ** that are not equal to self while the comparison is taking place. + ** This implementation also assumes a coherent cache - that + ** separate processes cannot read different values from the same + ** address at the same time. If either of these two conditions + ** are not met, then the mutexes will fail and problems will result. + */ + { + pthread_t self = pthread_self(); + if( p->nRef>0 && pthread_equal(p->owner, self) ){ + p->nRef++; + rc = SQLITE_OK; + }else if( pthread_mutex_trylock(&p->mutex)==0 ){ + assert( p->nRef==0 ); + p->owner = self; + p->nRef = 1; + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } + } +#else + /* Use the built-in recursive mutexes if they are available. + */ + if( pthread_mutex_trylock(&p->mutex)==0 ){ +#if SQLITE_MUTEX_NREF + p->owner = pthread_self(); + p->nRef++; +#endif + rc = SQLITE_OK; + }else{ + rc = SQLITE_BUSY; + } +#endif + +#ifdef SQLITE_DEBUG + if( rc==SQLITE_OK && p->trace ){ + printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void pthreadMutexLeave(sqlite3_mutex *p){ + assert( pthreadMutexHeld(p) ); +#if SQLITE_MUTEX_NREF + p->nRef--; + if( p->nRef==0 ) p->owner = 0; +#endif + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + +#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX + if( p->nRef==0 ){ + pthread_mutex_unlock(&p->mutex); + } +#else + pthread_mutex_unlock(&p->mutex); +#endif + +#ifdef SQLITE_DEBUG + if( p->trace ){ + printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); + } +#endif +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + static const sqlite3_mutex_methods sMutex = { + pthreadMutexInit, + pthreadMutexEnd, + pthreadMutexAlloc, + pthreadMutexFree, + pthreadMutexEnter, + pthreadMutexTry, + pthreadMutexLeave, +#ifdef SQLITE_DEBUG + pthreadMutexHeld, + pthreadMutexNotheld +#else + 0, + 0 +#endif + }; + + return &sMutex; +} + +#endif /* SQLITE_MUTEX_PTHREADS */ + +/************** End of mutex_unix.c ******************************************/ +/************** Begin file mutex_w32.c ***************************************/ +/* +** 2007 August 14 +** +** 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 contains the C functions that implement mutexes for Win32. +*/ +/* #include "sqliteInt.h" */ + +#if SQLITE_OS_WIN +/* +** Include code that is common to all os_*.c files +*/ +/* #include "os_common.h" */ + +/* +** Include the header file for the Windows VFS. +*/ +/************** Include os_win.h in the middle of mutex_w32.c ****************/ +/************** Begin file os_win.h ******************************************/ +/* +** 2013 November 25 +** +** 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 contains code that is specific to Windows. +*/ +#ifndef SQLITE_OS_WIN_H +#define SQLITE_OS_WIN_H + +/* +** Include the primary Windows SDK header file. +*/ +#include "windows.h" + +#ifdef __CYGWIN__ +# include +# include /* amalgamator: dontcache */ +#endif + +/* +** Determine if we are dealing with Windows NT. +** +** We ought to be able to determine if we are compiling for Windows 9x or +** Windows NT using the _WIN32_WINNT macro as follows: +** +** #if defined(_WIN32_WINNT) +** # define SQLITE_OS_WINNT 1 +** #else +** # define SQLITE_OS_WINNT 0 +** #endif +** +** However, Visual Studio 2005 does not set _WIN32_WINNT by default, as +** it ought to, so the above test does not work. We'll just assume that +** everything is Windows NT unless the programmer explicitly says otherwise +** by setting SQLITE_OS_WINNT to 0. +*/ +#if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT) +# define SQLITE_OS_WINNT 1 +#endif + +/* +** Determine if we are dealing with Windows CE - which has a much reduced +** API. +*/ +#if defined(_WIN32_WCE) +# define SQLITE_OS_WINCE 1 +#else +# define SQLITE_OS_WINCE 0 +#endif + +/* +** Determine if we are dealing with WinRT, which provides only a subset of +** the full Win32 API. +*/ +#if !defined(SQLITE_OS_WINRT) +# define SQLITE_OS_WINRT 0 +#endif + +/* +** For WinCE, some API function parameters do not appear to be declared as +** volatile. +*/ +#if SQLITE_OS_WINCE +# define SQLITE_WIN32_VOLATILE +#else +# define SQLITE_WIN32_VOLATILE volatile +#endif + +/* +** For some Windows sub-platforms, the _beginthreadex() / _endthreadex() +** functions are not available (e.g. those not using MSVC, Cygwin, etc). +*/ +#if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 && !defined(__CYGWIN__) +# define SQLITE_OS_WIN_THREADS 1 +#else +# define SQLITE_OS_WIN_THREADS 0 +#endif + +#endif /* SQLITE_OS_WIN_H */ + +/************** End of os_win.h **********************************************/ +/************** Continuing where we left off in mutex_w32.c ******************/ +#endif + +/* +** The code in this file is only used if we are compiling multithreaded +** on a Win32 system. +*/ +#ifdef SQLITE_MUTEX_W32 + +/* +** Each recursive mutex is an instance of the following structure. +*/ +struct sqlite3_mutex { + CRITICAL_SECTION mutex; /* Mutex controlling the lock */ + int id; /* Mutex type */ +#ifdef SQLITE_DEBUG + volatile int nRef; /* Number of enterances */ + volatile DWORD owner; /* Thread holding this mutex */ + volatile LONG trace; /* True to trace changes */ +#endif +}; + +/* +** These are the initializer values used when declaring a "static" mutex +** on Win32. It should be noted that all mutexes require initialization +** on the Win32 platform. +*/ +#define SQLITE_W32_MUTEX_INITIALIZER { 0 } + +#ifdef SQLITE_DEBUG +#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \ + 0L, (DWORD)0, 0 } +#else +#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id } +#endif + +#ifdef SQLITE_DEBUG +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use only inside assert() statements. +*/ +static int winMutexHeld(sqlite3_mutex *p){ + return p->nRef!=0 && p->owner==GetCurrentThreadId(); +} + +static int winMutexNotheld2(sqlite3_mutex *p, DWORD tid){ + return p->nRef==0 || p->owner!=tid; +} + +static int winMutexNotheld(sqlite3_mutex *p){ + DWORD tid = GetCurrentThreadId(); + return winMutexNotheld2(p, tid); +} +#endif + +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the xShmBarrier method of the VFS in cases when SQLite is +** compiled without mutexes (SQLITE_THREADSAFE=0). +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) + __sync_synchronize(); +#elif MSVC_VERSION>=1300 + _ReadWriteBarrier(); +#elif defined(MemoryBarrier) + MemoryBarrier(); +#endif +} + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static sqlite3_mutex winMutex_staticMutexes[] = { + SQLITE3_MUTEX_INITIALIZER(2), + SQLITE3_MUTEX_INITIALIZER(3), + SQLITE3_MUTEX_INITIALIZER(4), + SQLITE3_MUTEX_INITIALIZER(5), + SQLITE3_MUTEX_INITIALIZER(6), + SQLITE3_MUTEX_INITIALIZER(7), + SQLITE3_MUTEX_INITIALIZER(8), + SQLITE3_MUTEX_INITIALIZER(9), + SQLITE3_MUTEX_INITIALIZER(10), + SQLITE3_MUTEX_INITIALIZER(11), + SQLITE3_MUTEX_INITIALIZER(12), + SQLITE3_MUTEX_INITIALIZER(13) +}; + +static int winMutex_isInit = 0; +static int winMutex_isNt = -1; /* <0 means "need to query" */ + +/* As the winMutexInit() and winMutexEnd() functions are called as part +** of the sqlite3_initialize() and sqlite3_shutdown() processing, the +** "interlocked" magic used here is probably not strictly necessary. +*/ +static LONG SQLITE_WIN32_VOLATILE winMutex_lock = 0; + +SQLITE_API int sqlite3_win32_is_nt(void); /* os_win.c */ +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds); /* os_win.c */ + +static int winMutexInit(void){ + /* The first to increment to 1 does actual initialization */ + if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){ + int i; + for(i=0; i +**
      3. SQLITE_MUTEX_FAST +**
      4. SQLITE_MUTEX_RECURSIVE +**
      5. SQLITE_MUTEX_STATIC_MAIN +**
      6. SQLITE_MUTEX_STATIC_MEM +**
      7. SQLITE_MUTEX_STATIC_OPEN +**
      8. SQLITE_MUTEX_STATIC_PRNG +**
      9. SQLITE_MUTEX_STATIC_LRU +**
      10. SQLITE_MUTEX_STATIC_PMEM +**
      11. SQLITE_MUTEX_STATIC_APP1 +**
      12. SQLITE_MUTEX_STATIC_APP2 +**
      13. SQLITE_MUTEX_STATIC_APP3 +**
      14. SQLITE_MUTEX_STATIC_VFS1 +**
      15. SQLITE_MUTEX_STATIC_VFS2 +**
      16. SQLITE_MUTEX_STATIC_VFS3 +** +** +** The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. But SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. Six static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +*/ +static sqlite3_mutex *winMutexAlloc(int iType){ + sqlite3_mutex *p; + + switch( iType ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->id = iType; +#ifdef SQLITE_DEBUG +#ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC + p->trace = 1; +#endif +#endif +#if SQLITE_OS_WINRT + InitializeCriticalSectionEx(&p->mutex, 0, 0); +#else + InitializeCriticalSection(&p->mutex); +#endif + } + break; + } + default: { +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2<0 || iType-2>=ArraySize(winMutex_staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &winMutex_staticMutexes[iType-2]; +#ifdef SQLITE_DEBUG +#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC + InterlockedCompareExchange(&p->trace, 1, 0); +#endif +#endif + break; + } + } + assert( p==0 || p->id==iType ); + return p; +} + + +/* +** This routine deallocates a previously +** allocated mutex. SQLite is careful to deallocate every +** mutex that it allocates. +*/ +static void winMutexFree(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 && p->owner==0 ); + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ){ + DeleteCriticalSection(&p->mutex); + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#endif + } +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +static void winMutexEnter(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif +#ifdef SQLITE_DEBUG + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) ); +#else + assert( p ); +#endif + assert( winMutex_isInit==1 ); + EnterCriticalSection(&p->mutex); +#ifdef SQLITE_DEBUG + assert( p->nRef>0 || p->owner==0 ); + p->owner = tid; + p->nRef++; + if( p->trace ){ + OSTRACE(("ENTER-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", + tid, p->id, p, p->trace, p->nRef)); + } +#endif +} + +static int winMutexTry(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif + int rc = SQLITE_BUSY; + assert( p ); + assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) ); + /* + ** The sqlite3_mutex_try() routine is very rarely used, and when it + ** is used it is merely an optimization. So it is OK for it to always + ** fail. + ** + ** The TryEnterCriticalSection() interface is only available on WinNT. + ** And some windows compilers complain if you try to use it without + ** first doing some #defines that prevent SQLite from building on Win98. + ** For that reason, we will omit this optimization for now. See + ** ticket #2685. + */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0400 + assert( winMutex_isInit==1 ); + assert( winMutex_isNt>=-1 && winMutex_isNt<=1 ); + if( winMutex_isNt<0 ){ + winMutex_isNt = sqlite3_win32_is_nt(); + } + assert( winMutex_isNt==0 || winMutex_isNt==1 ); + if( winMutex_isNt && TryEnterCriticalSection(&p->mutex) ){ +#ifdef SQLITE_DEBUG + p->owner = tid; + p->nRef++; +#endif + rc = SQLITE_OK; + } +#else + UNUSED_PARAMETER(p); +#endif +#ifdef SQLITE_DEBUG + if( p->trace ){ + OSTRACE(("TRY-MUTEX tid=%lu, mutex(%d)=%p (%d), owner=%lu, nRef=%d, rc=%s\n", + tid, p->id, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); + } +#endif + return rc; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +static void winMutexLeave(sqlite3_mutex *p){ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + DWORD tid = GetCurrentThreadId(); +#endif + assert( p ); +#ifdef SQLITE_DEBUG + assert( p->nRef>0 ); + assert( p->owner==tid ); + p->nRef--; + if( p->nRef==0 ) p->owner = 0; + assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); +#endif + assert( winMutex_isInit==1 ); + LeaveCriticalSection(&p->mutex); +#ifdef SQLITE_DEBUG + if( p->trace ){ + OSTRACE(("LEAVE-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", + tid, p->id, p, p->trace, p->nRef)); + } +#endif +} + +SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ + static const sqlite3_mutex_methods sMutex = { + winMutexInit, + winMutexEnd, + winMutexAlloc, + winMutexFree, + winMutexEnter, + winMutexTry, + winMutexLeave, +#ifdef SQLITE_DEBUG + winMutexHeld, + winMutexNotheld +#else + 0, + 0 +#endif + }; + return &sMutex; +} + +#endif /* SQLITE_MUTEX_W32 */ + +/************** End of mutex_w32.c *******************************************/ +/************** Begin file malloc.c ******************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** +** Memory allocation functions used throughout sqlite. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* +** Attempt to release up to n bytes of non-essential memory currently +** held by SQLite. An example of non-essential memory is memory used to +** cache database pages that are not currently in use. +*/ +SQLITE_API int sqlite3_release_memory(int n){ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + return sqlite3PcacheReleaseMemory(n); +#else + /* IMPLEMENTATION-OF: R-34391-24921 The sqlite3_release_memory() routine + ** is a no-op returning zero if SQLite is not compiled with + ** SQLITE_ENABLE_MEMORY_MANAGEMENT. */ + UNUSED_PARAMETER(n); + return 0; +#endif +} + +/* +** Default value of the hard heap limit. 0 means "no limit". +*/ +#ifndef SQLITE_MAX_MEMORY +# define SQLITE_MAX_MEMORY 0 +#endif + +/* +** State information local to the memory allocation subsystem. +*/ +static SQLITE_WSD struct Mem0Global { + sqlite3_mutex *mutex; /* Mutex to serialize access */ + sqlite3_int64 alarmThreshold; /* The soft heap limit */ + sqlite3_int64 hardLimit; /* The hard upper bound on memory */ + + /* + ** True if heap is nearly "full" where "full" is defined by the + ** sqlite3_soft_heap_limit() setting. + */ + int nearlyFull; +} mem0 = { 0, SQLITE_MAX_MEMORY, SQLITE_MAX_MEMORY, 0 }; + +#define mem0 GLOBAL(struct Mem0Global, mem0) + +/* +** Return the memory allocator mutex. sqlite3_status() needs it. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void){ + return mem0.mutex; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Deprecated external interface. It used to set an alarm callback +** that was invoked when memory usage grew too large. Now it is a +** no-op. +*/ +SQLITE_API int sqlite3_memory_alarm( + void(*xCallback)(void *pArg, sqlite3_int64 used,int N), + void *pArg, + sqlite3_int64 iThreshold +){ + (void)xCallback; + (void)pArg; + (void)iThreshold; + return SQLITE_OK; +} +#endif + +/* +** Set the soft heap-size limit for the library. An argument of +** zero disables the limit. A negative argument is a no-op used to +** obtain the return value. +** +** The return value is the value of the heap limit just before this +** interface was called. +** +** If the hard heap limit is enabled, then the soft heap limit cannot +** be disabled nor raised above the hard heap limit. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; + sqlite3_int64 excess; + sqlite3_int64 nUsed; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.alarmThreshold; + if( n<0 ){ + sqlite3_mutex_leave(mem0.mutex); + return priorLimit; + } + if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ + n = mem0.hardLimit; + } + mem0.alarmThreshold = n; + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + AtomicStore(&mem0.nearlyFull, n>0 && n<=nUsed); + sqlite3_mutex_leave(mem0.mutex); + excess = sqlite3_memory_used() - n; + if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff)); + return priorLimit; +} +SQLITE_API void sqlite3_soft_heap_limit(int n){ + if( n<0 ) n = 0; + sqlite3_soft_heap_limit64(n); +} + +/* +** Set the hard heap-size limit for the library. An argument of zero +** disables the hard heap limit. A negative argument is a no-op used +** to obtain the return value without affecting the hard heap limit. +** +** The return value is the value of the hard heap limit just prior to +** calling this interface. +** +** Setting the hard heap limit will also activate the soft heap limit +** and constrain the soft heap limit to be no more than the hard heap +** limit. +*/ +SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.hardLimit; + if( n>=0 ){ + mem0.hardLimit = n; + if( n0 ); + + /* In Firefox (circa 2017-02-08), xRoundup() is remapped to an internal + ** implementation of malloc_good_size(), which must be called in debug + ** mode and specifically when the DMD "Dark Matter Detector" is enabled + ** or else a crash results. Hence, do not attempt to optimize out the + ** following xRoundup() call. */ + nFull = sqlite3GlobalConfig.m.xRoundup(n); + + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); + if( mem0.alarmThreshold>0 ){ + sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.alarmThreshold - nFull ){ + AtomicStore(&mem0.nearlyFull, 1); + sqlite3MallocAlarm(nFull); + if( mem0.hardLimit ){ + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.hardLimit - nFull ){ + *pp = 0; + return; + } + } + }else{ + AtomicStore(&mem0.nearlyFull, 0); + } + } + p = sqlite3GlobalConfig.m.xMalloc(nFull); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( p==0 && mem0.alarmThreshold>0 ){ + sqlite3MallocAlarm(nFull); + p = sqlite3GlobalConfig.m.xMalloc(nFull); + } +#endif + if( p ){ + nFull = sqlite3MallocSize(p); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nFull); + sqlite3StatusUp(SQLITE_STATUS_MALLOC_COUNT, 1); + } + *pp = p; +} + +/* +** Allocate memory. This routine is like sqlite3_malloc() except that it +** assumes the memory subsystem has already been initialized. +*/ +SQLITE_PRIVATE void *sqlite3Malloc(u64 n){ + void *p; + if( n==0 || n>=0x7fffff00 ){ + /* A memory allocation of a number of bytes which is near the maximum + ** signed integer value might cause an integer overflow inside of the + ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving + ** 255 bytes of overhead. SQLite itself will never use anything near + ** this amount. The only way to reach the limit is with sqlite3_malloc() */ + p = 0; + }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + mallocWithAlarm((int)n, &p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + p = sqlite3GlobalConfig.m.xMalloc((int)n); + } + assert( EIGHT_BYTE_ALIGNMENT(p) ); /* IMP: R-11148-40995 */ + return p; +} + +/* +** This version of the memory allocation is for use by the application. +** First make sure the memory subsystem is initialized, then do the +** allocation. +*/ +SQLITE_API void *sqlite3_malloc(int n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return n<=0 ? 0 : sqlite3Malloc(n); +} +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return sqlite3Malloc(n); +} + +/* +** TRUE if p is a lookaside memory allocation from db +*/ +#ifndef SQLITE_OMIT_LOOKASIDE +static int isLookaside(sqlite3 *db, const void *p){ + return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd); +} +#else +#define isLookaside(A,B) 0 +#endif + +/* +** Return the size of a memory allocation previously obtained from +** sqlite3Malloc() or sqlite3_malloc(). +*/ +SQLITE_PRIVATE int sqlite3MallocSize(const void *p){ + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + return sqlite3GlobalConfig.m.xSize((void*)p); +} +static int lookasideMallocSize(sqlite3 *db, const void *p){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + return plookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; +#else + return db->lookaside.szTrue; +#endif +} +SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, const void *p){ + assert( p!=0 ); +#ifdef SQLITE_DEBUG + if( db==0 || !isLookaside(db,p) ){ + if( db==0 ){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + }else{ + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + } + } +#endif + if( db ){ + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return LOOKASIDE_SMALL; + } +#endif + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return db->lookaside.szTrue; + } + } + } + return sqlite3GlobalConfig.m.xSize((void*)p); +} +SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + return p ? sqlite3GlobalConfig.m.xSize(p) : 0; +} + +/* +** Free memory previously obtained from sqlite3Malloc(). +*/ +SQLITE_API void sqlite3_free(void *p){ + if( p==0 ) return; /* IMP: R-49053-54554 */ + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusDown(SQLITE_STATUS_MEMORY_USED, sqlite3MallocSize(p)); + sqlite3StatusDown(SQLITE_STATUS_MALLOC_COUNT, 1); + sqlite3GlobalConfig.m.xFree(p); + sqlite3_mutex_leave(mem0.mutex); + }else{ + sqlite3GlobalConfig.m.xFree(p); + } +} + +/* +** Add the size of memory allocation "p" to the count in +** *db->pnBytesFreed. +*/ +static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){ + *db->pnBytesFreed += sqlite3DbMallocSize(db,p); +} + +/* +** Free memory that might be associated with a particular database +** connection. Calling sqlite3DbFree(D,X) for X==0 is a harmless no-op. +** The sqlite3DbFreeNN(D,X) version requires that X be non-NULL. +*/ +SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){ + assert( db==0 || sqlite3_mutex_held(db->mutex) ); + assert( p!=0 ); + if( db ){ + if( db->pnBytesFreed ){ + measureAllocationSize(db, p); + return; + } + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#ifdef SQLITE_DEBUG + memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */ +#endif + pBuf->pNext = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = pBuf; + return; + } +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#ifdef SQLITE_DEBUG + memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */ +#endif + pBuf->pNext = db->lookaside.pFree; + db->lookaside.pFree = pBuf; + return; + } + } + } + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + sqlite3_free(p); +} +SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){ + assert( db==0 || sqlite3_mutex_held(db->mutex) ); + if( p ) sqlite3DbFreeNN(db, p); +} + +/* +** Change the size of an existing memory allocation +*/ +SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ + int nOld, nNew, nDiff; + void *pNew; + assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(pOld, (u8)~MEMTYPE_HEAP) ); + if( pOld==0 ){ + return sqlite3Malloc(nBytes); /* IMP: R-04300-56712 */ + } + if( nBytes==0 ){ + sqlite3_free(pOld); /* IMP: R-26507-47431 */ + return 0; + } + if( nBytes>=0x7fffff00 ){ + /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */ + return 0; + } + nOld = sqlite3MallocSize(pOld); + /* IMPLEMENTATION-OF: R-46199-30249 SQLite guarantees that the second + ** argument to xRealloc is always a value returned by a prior call to + ** xRoundup. */ + nNew = sqlite3GlobalConfig.m.xRoundup((int)nBytes); + if( nOld==nNew ){ + pNew = pOld; + }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_int64 nUsed; + sqlite3_mutex_enter(mem0.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); + nDiff = nNew - nOld; + if( nDiff>0 && (nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED)) >= + mem0.alarmThreshold-nDiff ){ + sqlite3MallocAlarm(nDiff); + if( mem0.hardLimit>0 && nUsed >= mem0.hardLimit - nDiff ){ + sqlite3_mutex_leave(mem0.mutex); + return 0; + } + } + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + if( pNew==0 && mem0.alarmThreshold>0 ){ + sqlite3MallocAlarm((int)nBytes); + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + } +#endif + if( pNew ){ + nNew = sqlite3MallocSize(pNew); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); + } + sqlite3_mutex_leave(mem0.mutex); + }else{ + pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); + } + assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-11148-40995 */ + return pNew; +} + +/* +** The public interface to sqlite3Realloc. Make sure that the memory +** subsystem is initialized prior to invoking sqliteRealloc. +*/ +SQLITE_API void *sqlite3_realloc(void *pOld, int n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + if( n<0 ) n = 0; /* IMP: R-26507-47431 */ + return sqlite3Realloc(pOld, n); +} +SQLITE_API void *sqlite3_realloc64(void *pOld, sqlite3_uint64 n){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return sqlite3Realloc(pOld, n); +} + + +/* +** Allocate and zero memory. +*/ +SQLITE_PRIVATE void *sqlite3MallocZero(u64 n){ + void *p = sqlite3Malloc(n); + if( p ){ + memset(p, 0, (size_t)n); + } + return p; +} + +/* +** Allocate and zero memory. If the allocation fails, make +** the mallocFailed flag in the connection pointer. +*/ +SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, u64 n){ + void *p; + testcase( db==0 ); + p = sqlite3DbMallocRaw(db, n); + if( p ) memset(p, 0, (size_t)n); + return p; +} + + +/* Finish the work of sqlite3DbMallocRawNN for the unusual and +** slower case when the allocation cannot be fulfilled using lookaside. +*/ +static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){ + void *p; + assert( db!=0 ); + p = sqlite3Malloc(n); + if( !p ) sqlite3OomFault(db); + sqlite3MemdebugSetType(p, + (db->lookaside.bDisable==0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); + return p; +} + +/* +** Allocate memory, either lookaside (if possible) or heap. +** If the allocation fails, set the mallocFailed flag in +** the connection pointer. +** +** If db!=0 and db->mallocFailed is true (indicating a prior malloc +** failure on the same database connection) then always return 0. +** Hence for a particular database connection, once malloc starts +** failing, it fails consistently until mallocFailed is reset. +** This is an important assumption. There are many places in the +** code that do things like this: +** +** int *a = (int*)sqlite3DbMallocRaw(db, 100); +** int *b = (int*)sqlite3DbMallocRaw(db, 200); +** if( b ) a[10] = 9; +** +** In other words, if a subsequent malloc (ex: "b") worked, it is assumed +** that all prior mallocs (ex: "a") worked too. +** +** The sqlite3MallocRawNN() variant guarantees that the "db" parameter is +** not a NULL pointer. +*/ +SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, u64 n){ + void *p; + if( db ) return sqlite3DbMallocRawNN(db, n); + p = sqlite3Malloc(n); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + return p; +} +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ +#ifndef SQLITE_OMIT_LOOKASIDE + LookasideSlot *pBuf; + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( n>db->lookaside.sz ){ + if( !db->lookaside.bDisable ){ + db->lookaside.anStat[1]++; + }else if( db->mallocFailed ){ + return 0; + } + return dbMallocRawFinish(db, n); + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( n<=LOOKASIDE_SMALL ){ + if( (pBuf = db->lookaside.pSmallFree)!=0 ){ + db->lookaside.pSmallFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pSmallInit)!=0 ){ + db->lookaside.pSmallInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + } + } +#endif + if( (pBuf = db->lookaside.pFree)!=0 ){ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pInit)!=0 ){ + db->lookaside.pInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else{ + db->lookaside.anStat[2]++; + } +#else + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( db->mallocFailed ){ + return 0; + } +#endif + return dbMallocRawFinish(db, n); +} + +/* Forward declaration */ +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n); + +/* +** Resize the block of memory pointed to by p to n bytes. If the +** resize fails, set the mallocFailed flag in the connection object. +*/ +SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ + assert( db!=0 ); + if( p==0 ) return sqlite3DbMallocRawNN(db, n); + assert( sqlite3_mutex_held(db->mutex) ); + if( ((uptr)p)<(uptr)db->lookaside.pEnd ){ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( ((uptr)p)>=(uptr)db->lookaside.pMiddle ){ + if( n<=LOOKASIDE_SMALL ) return p; + }else +#endif + if( ((uptr)p)>=(uptr)db->lookaside.pStart ){ + if( n<=db->lookaside.szTrue ) return p; + } + } + return dbReallocFinish(db, p, n); +} +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ + void *pNew = 0; + assert( db!=0 ); + assert( p!=0 ); + if( db->mallocFailed==0 ){ + if( isLookaside(db, p) ){ + pNew = sqlite3DbMallocRawNN(db, n); + if( pNew ){ + memcpy(pNew, p, lookasideMallocSize(db, p)); + sqlite3DbFree(db, p); + } + }else{ + assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + pNew = sqlite3Realloc(p, n); + if( !pNew ){ + sqlite3OomFault(db); + } + sqlite3MemdebugSetType(pNew, + (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); + } + } + return pNew; +} + +/* +** Attempt to reallocate p. If the reallocation fails, then free p +** and set the mallocFailed flag in the database connection. +*/ +SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, u64 n){ + void *pNew; + pNew = sqlite3DbRealloc(db, p, n); + if( !pNew ){ + sqlite3DbFree(db, p); + } + return pNew; +} + +/* +** Make a copy of a string in memory obtained from sqliteMalloc(). These +** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This +** is because when memory debugging is turned on, these two functions are +** called via macros that record the current file and line number in the +** ThreadData structure. +*/ +SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){ + char *zNew; + size_t n; + if( z==0 ){ + return 0; + } + n = strlen(z) + 1; + zNew = sqlite3DbMallocRaw(db, n); + if( zNew ){ + memcpy(zNew, z, n); + } + return zNew; +} +SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){ + char *zNew; + assert( db!=0 ); + assert( z!=0 || n==0 ); + assert( (n&0x7fffffff)==n ); + zNew = z ? sqlite3DbMallocRawNN(db, n+1) : 0; + if( zNew ){ + memcpy(zNew, z, (size_t)n); + zNew[n] = 0; + } + return zNew; +} + +/* +** The text between zStart and zEnd represents a phrase within a larger +** SQL statement. Make a copy of this phrase in space obtained form +** sqlite3DbMalloc(). Omit leading and trailing whitespace. +*/ +SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ + int n; + while( sqlite3Isspace(zStart[0]) ) zStart++; + n = (int)(zEnd - zStart); + while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--; + return sqlite3DbStrNDup(db, zStart, n); +} + +/* +** Free any prior content in *pz and replace it with a copy of zNew. +*/ +SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ + char *z = sqlite3DbStrDup(db, zNew); + sqlite3DbFree(db, *pz); + *pz = z; +} + +/* +** Call this routine to record the fact that an OOM (out-of-memory) error +** has happened. This routine will set db->mallocFailed, and also +** temporarily disable the lookaside memory allocator and interrupt +** any running VDBEs. +** +** Always return a NULL pointer so that this routine can be invoked using +** +** return sqlite3OomFault(db); +** +** and thereby avoid unnecessary stack frame allocations for the overwhelmingly +** common case where no OOM occurs. +*/ +SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){ + if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ + db->mallocFailed = 1; + if( db->nVdbeExec>0 ){ + AtomicStore(&db->u1.isInterrupted, 1); + } + DisableLookaside; + if( db->pParse ){ + sqlite3ErrorMsg(db->pParse, "out of memory"); + db->pParse->rc = SQLITE_NOMEM_BKPT; + } + } + return 0; +} + +/* +** This routine reactivates the memory allocator and clears the +** db->mallocFailed flag as necessary. +** +** The memory allocator is not restarted if there are running +** VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ + if( db->mallocFailed && db->nVdbeExec==0 ){ + db->mallocFailed = 0; + AtomicStore(&db->u1.isInterrupted, 0); + assert( db->lookaside.bDisable>0 ); + EnableLookaside; + } +} + +/* +** Take actions at the end of an API call to deal with error codes. +*/ +static SQLITE_NOINLINE int apiHandleError(sqlite3 *db, int rc){ + if( db->mallocFailed || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomClear(db); + sqlite3Error(db, SQLITE_NOMEM); + return SQLITE_NOMEM_BKPT; + } + return rc & db->errMask; +} + +/* +** This function must be called before exiting any API function (i.e. +** returning control to the user) that has called sqlite3_malloc or +** sqlite3_realloc. +** +** The returned value is normally a copy of the second argument to this +** function. However, if a malloc() failure has occurred since the previous +** invocation SQLITE_NOMEM is returned instead. +** +** If an OOM as occurred, then the connection error-code (the value +** returned by sqlite3_errcode()) is set to SQLITE_NOMEM. +*/ +SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ + /* If the db handle must hold the connection handle mutex here. + ** Otherwise the read (and possible write) of db->mallocFailed + ** is unsafe, as is the call to sqlite3Error(). + */ + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + if( db->mallocFailed || rc ){ + return apiHandleError(db, rc); + } + return rc & db->errMask; +} + +/************** End of malloc.c **********************************************/ +/************** Begin file printf.c ******************************************/ +/* +** The "printf" code that follows dates from the 1980's. It is in +** the public domain. +** +************************************************************************** +** +** This file contains code for a set of "printf"-like routines. These +** routines format strings much like the printf() from the standard C +** library, though the implementation here has enhancements to support +** SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Conversion types fall into various categories as defined by the +** following enumeration. +*/ +#define etRADIX 0 /* non-decimal integer types. %x %o */ +#define etFLOAT 1 /* Floating point. %f */ +#define etEXP 2 /* Exponentional notation. %e and %E */ +#define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */ +#define etSIZE 4 /* Return number of characters processed so far. %n */ +#define etSTRING 5 /* Strings. %s */ +#define etDYNSTRING 6 /* Dynamically allocated strings. %z */ +#define etPERCENT 7 /* Percent symbol. %% */ +#define etCHARX 8 /* Characters. %c */ +/* The rest are extensions, not normally found in printf() */ +#define etSQLESCAPE 9 /* Strings with '\'' doubled. %q */ +#define etSQLESCAPE2 10 /* Strings with '\'' doubled and enclosed in '', + NULL pointers replaced by SQL NULL. %Q */ +#define etTOKEN 11 /* a pointer to a Token structure */ +#define etSRCITEM 12 /* a pointer to a SrcItem */ +#define etPOINTER 13 /* The %p conversion */ +#define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */ +#define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ +#define etDECIMAL 16 /* %d or %u, but not %x, %o */ + +#define etINVALID 17 /* Any unrecognized conversion type */ + + +/* +** An "etByte" is an 8-bit unsigned value. +*/ +typedef unsigned char etByte; + +/* +** Each builtin conversion character (ex: the 'd' in "%d") is described +** by an instance of the following structure +*/ +typedef struct et_info { /* Information about each format field */ + char fmttype; /* The format field code letter */ + etByte base; /* The base for radix conversion */ + etByte flags; /* One or more of FLAG_ constants below */ + etByte type; /* Conversion paradigm */ + etByte charset; /* Offset into aDigits[] of the digits string */ + etByte prefix; /* Offset into aPrefix[] of the prefix string */ +} et_info; + +/* +** Allowed values for et_info.flags +*/ +#define FLAG_SIGNED 1 /* True if the value to convert is signed */ +#define FLAG_STRING 4 /* Allow infinite precision */ + + +/* +** The following table is searched linearly, so it is good to put the +** most frequently used conversion types first. +*/ +static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; +static const char aPrefix[] = "-x0\000X0"; +static const et_info fmtinfo[] = { + { 'd', 10, 1, etDECIMAL, 0, 0 }, + { 's', 0, 4, etSTRING, 0, 0 }, + { 'g', 0, 1, etGENERIC, 30, 0 }, + { 'z', 0, 4, etDYNSTRING, 0, 0 }, + { 'q', 0, 4, etSQLESCAPE, 0, 0 }, + { 'Q', 0, 4, etSQLESCAPE2, 0, 0 }, + { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, + { 'c', 0, 0, etCHARX, 0, 0 }, + { 'o', 8, 0, etRADIX, 0, 2 }, + { 'u', 10, 0, etDECIMAL, 0, 0 }, + { 'x', 16, 0, etRADIX, 16, 1 }, + { 'X', 16, 0, etRADIX, 0, 4 }, +#ifndef SQLITE_OMIT_FLOATING_POINT + { 'f', 0, 1, etFLOAT, 0, 0 }, + { 'e', 0, 1, etEXP, 30, 0 }, + { 'E', 0, 1, etEXP, 14, 0 }, + { 'G', 0, 1, etGENERIC, 14, 0 }, +#endif + { 'i', 10, 1, etDECIMAL, 0, 0 }, + { 'n', 0, 0, etSIZE, 0, 0 }, + { '%', 0, 0, etPERCENT, 0, 0 }, + { 'p', 16, 0, etPOINTER, 0, 1 }, + + /* All the rest are undocumented and are for internal use only */ + { 'T', 0, 0, etTOKEN, 0, 0 }, + { 'S', 0, 0, etSRCITEM, 0, 0 }, + { 'r', 10, 1, etORDINAL, 0, 0 }, +}; + +/* Notes: +** +** %S Takes a pointer to SrcItem. Shows name or database.name +** %!S Like %S but prefer the zName over the zAlias +*/ + +/* Floating point constants used for rounding */ +static const double arRound[] = { + 5.0e-01, 5.0e-02, 5.0e-03, 5.0e-04, 5.0e-05, + 5.0e-06, 5.0e-07, 5.0e-08, 5.0e-09, 5.0e-10, +}; + +/* +** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point +** conversions will work. +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** "*val" is a double such that 0.1 <= *val < 10.0 +** Return the ascii code for the leading digit of *val, then +** multiply "*val" by 10.0 to renormalize. +** +** Example: +** input: *val = 3.14159 +** output: *val = 1.4159 function return = '3' +** +** The counter *cnt is incremented each time. After counter exceeds +** 16 (the number of significant digits in a 64-bit float) '0' is +** always returned. +*/ +static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ + int digit; + LONGDOUBLE_TYPE d; + if( (*cnt)<=0 ) return '0'; + (*cnt)--; + digit = (int)*val; + d = digit; + digit += '0'; + *val = (*val - d)*10.0; + return (char)digit; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** Set the StrAccum object to an error mode. +*/ +SQLITE_PRIVATE void sqlite3StrAccumSetError(StrAccum *p, u8 eError){ + assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); + p->accError = eError; + if( p->mxAlloc ) sqlite3_str_reset(p); + if( eError==SQLITE_TOOBIG ) sqlite3ErrorToParser(p->db, eError); +} + +/* +** 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++]); +} + +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( pAccum->accError ) return 0; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + sqlite3StrAccumSetError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + sqlite3StrAccumSetError(pAccum, SQLITE_NOMEM); + } + return z; +} + +/* +** On machines with a small stack size, you can redefine the +** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. +*/ +#ifndef SQLITE_PRINT_BUF_SIZE +# define SQLITE_PRINT_BUF_SIZE 70 +#endif +#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ + +/* +** Hard limit on the precision of floating-point conversions. +*/ +#ifndef SQLITE_PRINTF_PRECISION_LIMIT +# define SQLITE_FP_PRECISION_LIMIT 100000000 +#endif + +/* +** Render a string given by "fmt" into the StrAccum object. +*/ +SQLITE_API void sqlite3_str_vappendf( + sqlite3_str *pAccum, /* Accumulate results here */ + const char *fmt, /* Format string */ + va_list ap /* arguments */ +){ + int c; /* Next character in the format string */ + char *bufpt; /* Pointer to the conversion buffer */ + int precision; /* Precision of the current field */ + int length; /* Length of the field */ + int idx; /* A general purpose loop counter */ + int width; /* Width of the current field */ + etByte flag_leftjustify; /* True if "-" flag is present */ + etByte flag_prefix; /* '+' or ' ' or 0 for prefix */ + etByte flag_alternateform; /* True if "#" flag is present */ + etByte flag_altform2; /* True if "!" flag is present */ + etByte flag_zeropad; /* True if field width constant starts with zero */ + etByte flag_long; /* 1 for the "l" flag, 2 for "ll", 0 by default */ + etByte done; /* Loop termination flag */ + etByte cThousand; /* Thousands separator for %d and %u */ + etByte xtype = etINVALID; /* Conversion paradigm */ + u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ + char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ + sqlite_uint64 longvalue; /* Value for integer types */ + LONGDOUBLE_TYPE realvalue; /* Value for real types */ + const et_info *infop; /* Pointer to the appropriate info structure */ + char *zOut; /* Rendering buffer */ + int nOut; /* Size of the rendering buffer */ + char *zExtra = 0; /* Malloced memory used by some conversion */ +#ifndef SQLITE_OMIT_FLOATING_POINT + int exp, e2; /* exponent of real numbers */ + int nsd; /* Number of significant digits returned */ + double rounder; /* Used for rounding floating point values */ + etByte flag_dp; /* True if decimal point should be shown */ + etByte flag_rtz; /* True if trailing zeros should be removed */ +#endif + PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ + char buf[etBUFSIZE]; /* Conversion buffer */ + + /* pAccum never starts out with an empty buffer that was obtained from + ** malloc(). This precondition is required by the mprintf("%z...") + ** optimization. */ + assert( pAccum->nChar>0 || (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); + + bufpt = 0; + if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){ + pArgList = va_arg(ap, PrintfArguments*); + bArgList = 1; + }else{ + bArgList = 0; + } + for(; (c=(*fmt))!=0; ++fmt){ + if( c!='%' ){ + bufpt = (char *)fmt; +#if HAVE_STRCHRNUL + fmt = strchrnul(fmt, '%'); +#else + do{ fmt++; }while( *fmt && *fmt != '%' ); +#endif + sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt)); + if( *fmt==0 ) break; + } + if( (c=(*++fmt))==0 ){ + sqlite3_str_append(pAccum, "%", 1); + break; + } + /* Find out what flags are present */ + flag_leftjustify = flag_prefix = cThousand = + flag_alternateform = flag_altform2 = flag_zeropad = 0; + done = 0; + width = 0; + flag_long = 0; + precision = -1; + do{ + switch( c ){ + case '-': flag_leftjustify = 1; break; + case '+': flag_prefix = '+'; break; + case ' ': flag_prefix = ' '; break; + case '#': flag_alternateform = 1; break; + case '!': flag_altform2 = 1; break; + case '0': flag_zeropad = 1; break; + case ',': cThousand = ','; break; + default: done = 1; break; + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; + } + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; + } + case '.': { + c = *++fmt; + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } + } + }while( !done && (c=(*++fmt))!=0 ); + + /* Fetch the info entry for the field */ + infop = &fmtinfo[0]; + xtype = etINVALID; + for(idx=0; idxtype; + break; + } + } + + /* + ** At this point, variables are initialized as follows: + ** + ** flag_alternateform TRUE if a '#' is present. + ** flag_altform2 TRUE if a '!' is present. + ** flag_prefix '+' or ' ' or zero + ** flag_leftjustify TRUE if a '-' is present or if the + ** field width was negative. + ** flag_zeropad TRUE if the width began with 0. + ** flag_long 1 for "l", 2 for "ll" + ** width The specified field width. This is + ** always non-negative. Zero is the default. + ** precision The specified precision. The default + ** is -1. + ** xtype The class of the conversion. + ** infop Pointer to the appropriate info struct. + */ + assert( width>=0 ); + assert( precision>=(-1) ); + switch( xtype ){ + case etPOINTER: + flag_long = sizeof(char*)==sizeof(i64) ? 2 : + sizeof(char*)==sizeof(long int) ? 1 : 0; + /* no break */ deliberate_fall_through + case etORDINAL: + case etRADIX: + cThousand = 0; + /* no break */ deliberate_fall_through + case etDECIMAL: + if( infop->flags & FLAG_SIGNED ){ + i64 v; + if( bArgList ){ + v = getIntArg(pArgList); + }else if( flag_long ){ + if( flag_long==2 ){ + v = va_arg(ap,i64) ; + }else{ + v = va_arg(ap,long int); + } + }else{ + v = va_arg(ap,int); + } + if( v<0 ){ + testcase( v==SMALLEST_INT64 ); + testcase( v==(-1) ); + longvalue = ~v; + longvalue++; + prefix = '-'; + }else{ + longvalue = v; + prefix = flag_prefix; + } + }else{ + if( bArgList ){ + longvalue = (u64)getIntArg(pArgList); + }else if( flag_long ){ + if( flag_long==2 ){ + longvalue = va_arg(ap,u64); + }else{ + longvalue = va_arg(ap,unsigned long int); + } + }else{ + longvalue = va_arg(ap,unsigned int); + } + prefix = 0; + } + if( longvalue==0 ) flag_alternateform = 0; + if( flag_zeropad && precision=4 || (longvalue/10)%10==1 ){ + x = 0; + } + *(--bufpt) = zOrd[x*2+1]; + *(--bufpt) = zOrd[x*2]; + } + { + const char *cset = &aDigits[infop->charset]; + u8 base = infop->base; + do{ /* Convert to ascii */ + *(--bufpt) = cset[longvalue%base]; + longvalue = longvalue/base; + }while( longvalue>0 ); + } + length = (int)(&zOut[nOut-1]-bufpt); + while( precision>length ){ + *(--bufpt) = '0'; /* Zero pad */ + length++; + } + if( cThousand ){ + int nn = (length - 1)/3; /* Number of "," to insert */ + int ix = (length - 1)%3 + 1; + bufpt -= nn; + for(idx=0; nn>0; idx++){ + bufpt[idx] = bufpt[idx+nn]; + ix--; + if( ix==0 ){ + bufpt[++idx] = cThousand; + nn--; + ix = 3; + } + } + } + if( prefix ) *(--bufpt) = prefix; /* Add sign */ + if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ + const char *pre; + char x; + pre = &aPrefix[infop->prefix]; + for(; (x=(*pre))!=0; pre++) *(--bufpt) = x; + } + length = (int)(&zOut[nOut-1]-bufpt); + break; + case etFLOAT: + case etEXP: + case etGENERIC: + if( bArgList ){ + realvalue = getDoubleArg(pArgList); + }else{ + realvalue = va_arg(ap,double); + } +#ifdef SQLITE_OMIT_FLOATING_POINT + length = 0; +#else + if( precision<0 ) precision = 6; /* Set default precision */ +#ifdef SQLITE_FP_PRECISION_LIMIT + if( precision>SQLITE_FP_PRECISION_LIMIT ){ + precision = SQLITE_FP_PRECISION_LIMIT; + } +#endif + if( realvalue<0.0 ){ + realvalue = -realvalue; + prefix = '-'; + }else{ + prefix = flag_prefix; + } + if( xtype==etGENERIC && precision>0 ) precision--; + testcase( precision>0xfff ); + idx = precision & 0xfff; + rounder = arRound[idx%10]; + while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; } + if( xtype==etFLOAT ){ + double rx = (double)realvalue; + sqlite3_uint64 u; + int ex; + memcpy(&u, &rx, sizeof(u)); + ex = -1023 + (int)((u>>52)&0x7ff); + if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16; + realvalue += rounder; + } + /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ + exp = 0; + if( sqlite3IsNaN((double)realvalue) ){ + bufpt = "NaN"; + length = 3; + break; + } + if( realvalue>0.0 ){ + LONGDOUBLE_TYPE scale = 1.0; + while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;} + while( realvalue>=1e10*scale && exp<=350 ){ scale *= 1e10; exp+=10; } + while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; } + realvalue /= scale; + while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; } + while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } + if( exp>350 ){ + bufpt = buf; + buf[0] = prefix; + memcpy(buf+(prefix!=0),"Inf",4); + length = 3+(prefix!=0); + break; + } + } + bufpt = buf; + /* + ** If the field type is etGENERIC, then convert to either etEXP + ** or etFLOAT, as appropriate. + */ + if( xtype!=etFLOAT ){ + realvalue += rounder; + if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } + } + if( xtype==etGENERIC ){ + flag_rtz = !flag_alternateform; + if( exp<-4 || exp>precision ){ + xtype = etEXP; + }else{ + precision = precision - exp; + xtype = etFLOAT; + } + }else{ + flag_rtz = flag_altform2; + } + if( xtype==etEXP ){ + e2 = 0; + }else{ + e2 = exp; + } + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; + } + } + zOut = bufpt; + nsd = 16 + flag_altform2*10; + flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2; + /* The sign in front of the number */ + if( prefix ){ + *(bufpt++) = prefix; + } + /* Digits prior to the decimal point */ + if( e2<0 ){ + *(bufpt++) = '0'; + }else{ + for(; e2>=0; e2--){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + } + /* The decimal point */ + if( flag_dp ){ + *(bufpt++) = '.'; + } + /* "0" digits after the decimal point but before the first + ** significant digit of the number */ + for(e2++; e2<0; precision--, e2++){ + assert( precision>0 ); + *(bufpt++) = '0'; + } + /* Significant digits after the decimal point */ + while( (precision--)>0 ){ + *(bufpt++) = et_getdigit(&realvalue,&nsd); + } + /* Remove trailing zeros and the "." if no digits follow the "." */ + if( flag_rtz && flag_dp ){ + while( bufpt[-1]=='0' ) *(--bufpt) = 0; + assert( bufpt>zOut ); + if( bufpt[-1]=='.' ){ + if( flag_altform2 ){ + *(bufpt++) = '0'; + }else{ + *(--bufpt) = 0; + } + } + } + /* Add the "eNNN" suffix */ + if( xtype==etEXP ){ + *(bufpt++) = aDigits[infop->charset]; + if( exp<0 ){ + *(bufpt++) = '-'; exp = -exp; + }else{ + *(bufpt++) = '+'; + } + if( exp>=100 ){ + *(bufpt++) = (char)((exp/100)+'0'); /* 100's digit */ + exp %= 100; + } + *(bufpt++) = (char)(exp/10+'0'); /* 10's digit */ + *(bufpt++) = (char)(exp%10+'0'); /* 1's digit */ + } + *bufpt = 0; + + /* The converted number is in buf[] and zero terminated. Output it. + ** Note that the number is in the usual order, not reversed as with + ** integer conversions. */ + length = (int)(bufpt-zOut); + bufpt = zOut; + + /* Special case: Add leading zeros if the flag_zeropad flag is + ** set and we are not left justified */ + if( flag_zeropad && !flag_leftjustify && length < width){ + int i; + int nPad = width - length; + for(i=width; i>=nPad; i--){ + bufpt[i] = bufpt[i-nPad]; + } + i = prefix!=0; + while( nPad-- ) bufpt[i++] = '0'; + length = width; + } +#endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ + break; + case etSIZE: + if( !bArgList ){ + *(va_arg(ap,int*)) = pAccum->nChar; + } + length = width = 0; + break; + case etPERCENT: + buf[0] = '%'; + bufpt = buf; + length = 1; + break; + case etCHARX: + if( bArgList ){ + bufpt = getTextArg(pArgList); + length = 1; + if( bufpt ){ + buf[0] = c = *(bufpt++); + if( (c&0xc0)==0xc0 ){ + while( length<4 && (bufpt[0]&0xc0)==0x80 ){ + buf[length++] = *(bufpt++); + } + } + }else{ + buf[0] = 0; + } + }else{ + unsigned int ch = va_arg(ap,unsigned int); + if( ch<0x00080 ){ + buf[0] = ch & 0xff; + length = 1; + }else if( ch<0x00800 ){ + buf[0] = 0xc0 + (u8)((ch>>6)&0x1f); + buf[1] = 0x80 + (u8)(ch & 0x3f); + length = 2; + }else if( ch<0x10000 ){ + buf[0] = 0xe0 + (u8)((ch>>12)&0x0f); + buf[1] = 0x80 + (u8)((ch>>6) & 0x3f); + buf[2] = 0x80 + (u8)(ch & 0x3f); + length = 3; + }else{ + buf[0] = 0xf0 + (u8)((ch>>18) & 0x07); + buf[1] = 0x80 + (u8)((ch>>12) & 0x3f); + buf[2] = 0x80 + (u8)((ch>>6) & 0x3f); + buf[3] = 0x80 + (u8)(ch & 0x3f); + length = 4; + } + } + if( precision>1 ){ + width -= precision-1; + if( width>1 && !flag_leftjustify ){ + sqlite3_str_appendchar(pAccum, width-1, ' '); + width = 0; + } + while( precision-- > 1 ){ + sqlite3_str_append(pAccum, buf, length); + } + } + bufpt = buf; + flag_altform2 = 1; + goto adjust_width_for_utf8; + case etSTRING: + case etDYNSTRING: + if( bArgList ){ + bufpt = getTextArg(pArgList); + xtype = etSTRING; + }else{ + bufpt = va_arg(ap,char*); + } + if( bufpt==0 ){ + bufpt = ""; + }else if( xtype==etDYNSTRING ){ + if( pAccum->nChar==0 + && pAccum->mxAlloc + && width==0 + && precision<0 + && pAccum->accError==0 + ){ + /* Special optimization for sqlite3_mprintf("%z..."): + ** Extend an existing memory allocation rather than creating + ** a new one. */ + assert( (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); + pAccum->zText = bufpt; + pAccum->nAlloc = sqlite3DbMallocSize(pAccum->db, bufpt); + pAccum->nChar = 0x7fffffff & (int)strlen(bufpt); + pAccum->printfFlags |= SQLITE_PRINTF_MALLOCED; + length = 0; + break; + } + zExtra = bufpt; + } + if( precision>=0 ){ + if( flag_altform2 ){ + /* Set length to the number of bytes needed in order to display + ** precision characters */ + unsigned char *z = (unsigned char*)bufpt; + while( precision-- > 0 && z[0] ){ + SQLITE_SKIP_UTF8(z); + } + length = (int)(z - (unsigned char*)bufpt); + }else{ + for(length=0; length0 ){ + /* Adjust width to account for extra bytes in UTF-8 characters */ + int ii = length - 1; + while( ii>=0 ) if( (bufpt[ii--] & 0xc0)==0x80 ) width++; + } + break; + case etSQLESCAPE: /* %q: Escape ' characters */ + case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */ + case etSQLESCAPE3: { /* %w: Escape " characters */ + i64 i, j, k, n; + int needQuote, isnull; + char ch; + char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ + char *escarg; + + if( bArgList ){ + escarg = getTextArg(pArgList); + }else{ + escarg = va_arg(ap,char*); + } + isnull = escarg==0; + if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); + /* For %q, %Q, and %w, the precision is the number of bytes (or + ** characters if the ! flags is present) to use from the input. + ** Because of the extra quoting characters inserted, the number + ** of output characters may be larger than the precision. + */ + k = precision; + for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){ + if( ch==q ) n++; + if( flag_altform2 && (ch&0xc0)==0xc0 ){ + while( (escarg[i+1]&0xc0)==0x80 ){ i++; } + } + } + needQuote = !isnull && xtype==etSQLESCAPE2; + n += i + 3; + if( n>etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; + }else{ + bufpt = buf; + } + j = 0; + if( needQuote ) bufpt[j++] = q; + k = i; + for(i=0; iprintfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + if( flag_alternateform ){ + /* %#T means an Expr pointer that uses Expr.u.zToken */ + Expr *pExpr = va_arg(ap,Expr*); + if( ALWAYS(pExpr) && ALWAYS(!ExprHasProperty(pExpr,EP_IntValue)) ){ + sqlite3_str_appendall(pAccum, (const char*)pExpr->u.zToken); + sqlite3RecordErrorOffsetOfExpr(pAccum->db, pExpr); + } + }else{ + /* %T means a Token pointer */ + Token *pToken = va_arg(ap, Token*); + assert( bArgList==0 ); + if( pToken && pToken->n ){ + sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); + sqlite3RecordErrorByteOffset(pAccum->db, pToken->z); + } + } + length = width = 0; + break; + } + case etSRCITEM: { + SrcItem *pItem; + if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + pItem = va_arg(ap, SrcItem*); + assert( bArgList==0 ); + if( pItem->zAlias && !flag_altform2 ){ + sqlite3_str_appendall(pAccum, pItem->zAlias); + }else if( pItem->zName ){ + if( pItem->zDatabase ){ + sqlite3_str_appendall(pAccum, pItem->zDatabase); + sqlite3_str_append(pAccum, ".", 1); + } + sqlite3_str_appendall(pAccum, pItem->zName); + }else if( pItem->zAlias ){ + sqlite3_str_appendall(pAccum, pItem->zAlias); + }else{ + Select *pSel = pItem->pSelect; + assert( pSel!=0 ); + if( pSel->selFlags & SF_NestedFrom ){ + sqlite3_str_appendf(pAccum, "(join-%u)", pSel->selId); + }else{ + sqlite3_str_appendf(pAccum, "(subquery-%u)", pSel->selId); + } + } + length = width = 0; + break; + } + default: { + assert( xtype==etINVALID ); + return; + } + }/* End switch over the format type */ + /* + ** The text of the conversion is pointed to by "bufpt" and is + ** "length" characters long. The field width is "width". Do + ** the output. Both length and width are in bytes, not characters, + ** at this point. If the "!" flag was present on string conversions + ** indicating that width and precision should be expressed in characters, + ** then the values have been translated prior to reaching this point. + */ + width -= length; + if( width>0 ){ + if( !flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + sqlite3_str_append(pAccum, bufpt, length); + if( flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + }else{ + sqlite3_str_append(pAccum, bufpt, length); + } + + if( zExtra ){ + sqlite3DbFree(pAccum->db, zExtra); + zExtra = 0; + } + }/* End for loop over the format string */ +} /* End of function */ + + +/* +** The z string points to the first character of a token that is +** associated with an error. If db does not already have an error +** byte offset recorded, try to compute the error byte offset for +** z and set the error byte offset in db. +*/ +SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ + const Parse *pParse; + const char *zText; + const char *zEnd; + assert( z!=0 ); + if( NEVER(db==0) ) return; + if( db->errByteOffset!=(-2) ) return; + pParse = db->pParse; + if( NEVER(pParse==0) ) return; + zText =pParse->zTail; + if( NEVER(zText==0) ) return; + zEnd = &zText[strlen(zText)]; + if( SQLITE_WITHIN(z,zText,zEnd) ){ + db->errByteOffset = (int)(z-zText); + } +} + +/* +** If pExpr has a byte offset for the start of a token, record that as +** as the error offset. +*/ +SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){ + while( pExpr + && (ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) || pExpr->w.iOfst<=0) + ){ + pExpr = pExpr->pLeft; + } + if( pExpr==0 ) return; + db->errByteOffset = pExpr->w.iOfst; +} + +/* +** Enlarge the memory allocation on a StrAccum object so that it is +** able to accept at least N more bytes of text. +** +** Return the number of bytes of text that StrAccum is able to accept +** after the attempted enlargement. The value returned might be zero. +*/ +SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum *p, int N){ + char *zNew; + assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */ + if( p->accError ){ + testcase(p->accError==SQLITE_TOOBIG); + testcase(p->accError==SQLITE_NOMEM); + return 0; + } + if( p->mxAlloc==0 ){ + sqlite3StrAccumSetError(p, SQLITE_TOOBIG); + return p->nAlloc - p->nChar - 1; + }else{ + char *zOld = isMalloced(p) ? p->zText : 0; + i64 szNew = p->nChar; + szNew += (sqlite3_int64)N + 1; + if( szNew+p->nChar<=p->mxAlloc ){ + /* Force exponential buffer size growth as long as it does not overflow, + ** to avoid having to call this routine too often */ + szNew += p->nChar; + } + if( szNew > p->mxAlloc ){ + sqlite3_str_reset(p); + sqlite3StrAccumSetError(p, SQLITE_TOOBIG); + return 0; + }else{ + p->nAlloc = (int)szNew; + } + if( p->db ){ + zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); + }else{ + zNew = sqlite3Realloc(zOld, p->nAlloc); + } + if( zNew ){ + assert( p->zText!=0 || p->nChar==0 ); + if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); + p->zText = zNew; + p->nAlloc = sqlite3DbMallocSize(p->db, zNew); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + sqlite3_str_reset(p); + sqlite3StrAccumSetError(p, SQLITE_NOMEM); + return 0; + } + } + return N; +} + +/* +** Append N copies of character c to the given string buffer. +*/ +SQLITE_API void sqlite3_str_appendchar(sqlite3_str *p, int N, char c){ + testcase( p->nChar + (i64)N > 0x7fffffff ); + if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){ + return; + } + while( (N--)>0 ) p->zText[p->nChar++] = c; +} + +/* +** The StrAccum "p" is not large enough to accept N new bytes of z[]. +** So enlarge if first, then do the append. +** +** This is a helper routine to sqlite3_str_append() that does special-case +** work (enlarging the buffer) using tail recursion, so that the +** sqlite3_str_append() routine can use fast calling semantics. +*/ +static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){ + N = sqlite3StrAccumEnlarge(p, N); + if( N>0 ){ + memcpy(&p->zText[p->nChar], z, N); + p->nChar += N; + } +} + +/* +** Append N bytes of text from z to the StrAccum object. Increase the +** size of the memory allocation for StrAccum if necessary. +*/ +SQLITE_API void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ + assert( z!=0 || N==0 ); + assert( p->zText!=0 || p->nChar==0 || p->accError ); + assert( N>=0 ); + assert( p->accError==0 || p->nAlloc==0 || p->mxAlloc==0 ); + if( p->nChar+N >= p->nAlloc ){ + enlargeAndAppend(p,z,N); + }else if( N ){ + assert( p->zText ); + p->nChar += N; + memcpy(&p->zText[p->nChar-N], z, N); + } +} + +/* +** Append the complete text of zero-terminated string z[] to the p string. +*/ +SQLITE_API void sqlite3_str_appendall(sqlite3_str *p, const char *z){ + sqlite3_str_append(p, z, sqlite3Strlen30(z)); +} + + +/* +** Finish off a string by making sure it is zero-terminated. +** Return a pointer to the resulting string. Return a NULL +** pointer if any kind of error was encountered. +*/ +static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){ + char *zText; + assert( p->mxAlloc>0 && !isMalloced(p) ); + zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); + if( zText ){ + memcpy(zText, p->zText, p->nChar+1); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + sqlite3StrAccumSetError(p, SQLITE_NOMEM); + } + p->zText = zText; + return zText; +} +SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){ + if( p->zText ){ + p->zText[p->nChar] = 0; + if( p->mxAlloc>0 && !isMalloced(p) ){ + return strAccumFinishRealloc(p); + } + } + return p->zText; +} + +/* +** Use the content of the StrAccum passed as the second argument +** as the result of an SQL function. +*/ +SQLITE_PRIVATE void sqlite3ResultStrAccum(sqlite3_context *pCtx, StrAccum *p){ + if( p->accError ){ + sqlite3_result_error_code(pCtx, p->accError); + sqlite3_str_reset(p); + }else if( isMalloced(p) ){ + sqlite3_result_text(pCtx, p->zText, p->nChar, SQLITE_DYNAMIC); + }else{ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + sqlite3_str_reset(p); + } +} + +/* +** This singleton is an sqlite3_str object that is returned if +** sqlite3_malloc() fails to provide space for a real one. This +** sqlite3_str object accepts no new text and always returns +** an SQLITE_NOMEM error. +*/ +static sqlite3_str sqlite3OomStr = { + 0, 0, 0, 0, 0, SQLITE_NOMEM, 0 +}; + +/* Finalize a string created using sqlite3_str_new(). +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str *p){ + char *z; + if( p!=0 && p!=&sqlite3OomStr ){ + z = sqlite3StrAccumFinish(p); + sqlite3_free(p); + }else{ + z = 0; + } + return z; +} + +/* Return any error code associated with p */ +SQLITE_API int sqlite3_str_errcode(sqlite3_str *p){ + return p ? p->accError : SQLITE_NOMEM; +} + +/* Return the current length of p in bytes */ +SQLITE_API int sqlite3_str_length(sqlite3_str *p){ + return p ? p->nChar : 0; +} + +/* Return the current value for p */ +SQLITE_API char *sqlite3_str_value(sqlite3_str *p){ + if( p==0 || p->nChar==0 ) return 0; + p->zText[p->nChar] = 0; + return p->zText; +} + +/* +** Reset an StrAccum string. Reclaim all malloced memory. +*/ +SQLITE_API void sqlite3_str_reset(StrAccum *p){ + if( isMalloced(p) ){ + sqlite3DbFree(p->db, p->zText); + p->printfFlags &= ~SQLITE_PRINTF_MALLOCED; + } + p->nAlloc = 0; + p->nChar = 0; + p->zText = 0; +} + +/* +** Initialize a string accumulator. +** +** p: The accumulator to be initialized. +** db: Pointer to a database connection. May be NULL. Lookaside +** memory is used if not NULL. db->mallocFailed is set appropriately +** when not NULL. +** zBase: An initial buffer. May be NULL in which case the initial buffer +** is malloced. +** n: Size of zBase in bytes. If total space requirements never exceed +** n then no memory allocations ever occur. +** mx: Maximum number of bytes to accumulate. If mx==0 then no memory +** allocations will ever occur. +*/ +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, int n, int mx){ + p->zText = zBase; + p->db = db; + p->nAlloc = n; + p->mxAlloc = mx; + p->nChar = 0; + p->accError = 0; + p->printfFlags = 0; +} + +/* Allocate and initialize a new dynamic string object */ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3 *db){ + sqlite3_str *p = sqlite3_malloc64(sizeof(*p)); + if( p ){ + sqlite3StrAccumInit(p, 0, 0, 0, + db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH); + }else{ + p = &sqlite3OomStr; + } + return p; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + StrAccum acc; + assert( db!=0 ); + sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase), + db->aLimit[SQLITE_LIMIT_LENGTH]); + acc.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3_str_vappendf(&acc, zFormat, ap); + z = sqlite3StrAccumFinish(&acc); + if( acc.accError==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + return z; +} + +/* +** Print into memory obtained from sqliteMalloc(). Use the internal +** %-conversion extensions. +*/ +SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc(). Omit the internal +** %-conversion extensions. +*/ +SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){ + char *z; + char zBase[SQLITE_PRINT_BUF_SIZE]; + StrAccum acc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( zFormat==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH); + sqlite3_str_vappendf(&acc, zFormat, ap); + z = sqlite3StrAccumFinish(&acc); + return z; +} + +/* +** Print into memory obtained from sqlite3_malloc()(). Omit the internal +** %-conversion extensions. +*/ +SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){ + va_list ap; + char *z; +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + return z; +} + +/* +** sqlite3_snprintf() works like snprintf() except that it ignores the +** current locale settings. This is important for SQLite because we +** are not able to use a "," as the decimal point in place of "." as +** specified by some locales. +** +** Oops: The first two arguments of sqlite3_snprintf() are backwards +** from the snprintf() standard. Unfortunately, it is too late to change +** this without breaking compatibility, so we just have to live with the +** mistake. +** +** sqlite3_vsnprintf() is the varargs version. +*/ +SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){ + StrAccum acc; + if( n<=0 ) return zBuf; +#ifdef SQLITE_ENABLE_API_ARMOR + if( zBuf==0 || zFormat==0 ) { + (void)SQLITE_MISUSE_BKPT; + if( zBuf ) zBuf[0] = 0; + return zBuf; + } +#endif + sqlite3StrAccumInit(&acc, 0, zBuf, n, 0); + sqlite3_str_vappendf(&acc, zFormat, ap); + zBuf[acc.nChar] = 0; + return zBuf; +} +SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ + char *z; + va_list ap; + va_start(ap,zFormat); + z = sqlite3_vsnprintf(n, zBuf, zFormat, ap); + va_end(ap); + return z; +} + +/* +** This is the routine that actually formats the sqlite3_log() message. +** We house it in a separate routine from sqlite3_log() to avoid using +** stack space on small-stack systems when logging is disabled. +** +** sqlite3_log() must render into a static buffer. It cannot dynamically +** allocate memory because it might be called while the memory allocator +** mutex is held. +** +** sqlite3_str_vappendf() might ask for *temporary* memory allocations for +** certain format characters (%q) or for very large precisions or widths. +** Care must be taken that any sqlite3_log() calls that occur while the +** memory mutex is held do not use these mechanisms. +*/ +static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){ + StrAccum acc; /* String accumulator */ + char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */ + + sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0); + sqlite3_str_vappendf(&acc, zFormat, ap); + sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode, + sqlite3StrAccumFinish(&acc)); +} + +/* +** Format and write a message to the log if logging is enabled. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...){ + va_list ap; /* Vararg list */ + if( sqlite3GlobalConfig.xLog ){ + va_start(ap, zFormat); + renderLogMsg(iErrCode, zFormat, ap); + va_end(ap); + } +} + +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) +/* +** A version of printf() that understands %lld. Used for debugging. +** The printf() built into some versions of windows does not understand %lld +** and segfaults if you give it a long long int. +*/ +SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){ + va_list ap; + StrAccum acc; + char zBuf[SQLITE_PRINT_BUF_SIZE*10]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + va_start(ap,zFormat); + sqlite3_str_vappendf(&acc, zFormat, ap); + va_end(ap); + sqlite3StrAccumFinish(&acc); +#ifdef SQLITE_OS_TRACE_PROC + { + extern void SQLITE_OS_TRACE_PROC(const char *zBuf, int nBuf); + SQLITE_OS_TRACE_PROC(zBuf, sizeof(zBuf)); + } +#else + fprintf(stdout,"%s", zBuf); + fflush(stdout); +#endif +} +#endif + + +/* +** variable-argument wrapper around sqlite3_str_vappendf(). The bFlags argument +** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats. +*/ +SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ + va_list ap; + va_start(ap,zFormat); + sqlite3_str_vappendf(p, zFormat, ap); + va_end(ap); +} + +/************** End of printf.c **********************************************/ +/************** Begin file treeview.c ****************************************/ +/* +** 2015-06-08 +** +** 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 contains C code to implement the TreeView debugging routines. +** These routines print a parse tree to standard output for debugging and +** analysis. +** +** The interfaces in this file is only available when compiling +** with SQLITE_DEBUG. +*/ +/* #include "sqliteInt.h" */ +#ifdef SQLITE_DEBUG + +/* +** Add a new subitem to the tree. The moreToFollow flag indicates that this +** is not the last item in the tree. +*/ +static void sqlite3TreeViewPush(TreeView **pp, u8 moreToFollow){ + TreeView *p = *pp; + if( p==0 ){ + *pp = p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return; + memset(p, 0, sizeof(*p)); + }else{ + p->iLevel++; + } + assert( moreToFollow==0 || moreToFollow==1 ); + if( p->iLevel<(int)sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow; +} + +/* +** Finished with one layer of the tree +*/ +static void sqlite3TreeViewPop(TreeView **pp){ + TreeView *p = *pp; + if( p==0 ) return; + p->iLevel--; + if( p->iLevel<0 ){ + sqlite3_free(p); + *pp = 0; + } +} + +/* +** Generate a single line of output for the tree, with a prefix that contains +** all the appropriate tree lines +*/ +SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ + va_list ap; + int i; + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + if( p ){ + for(i=0; iiLevel && i<(int)sizeof(p->bLine)-1; i++){ + sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4); + } + sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); + } + if( zFormat!=0 ){ + va_start(ap, zFormat); + sqlite3_str_vappendf(&acc, zFormat, ap); + va_end(ap); + assert( acc.nChar>0 || acc.accError ); + sqlite3_str_append(&acc, "\n", 1); + } + sqlite3StrAccumFinish(&acc); + fprintf(stdout,"%s", zBuf); + fflush(stdout); +} + +/* +** Shorthand for starting a new tree item that consists of a single label +*/ +static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ + sqlite3TreeViewPush(&p, moreFollows); + sqlite3TreeViewLine(p, "%s", zLabel); +} + +/* +** Show a list of Column objects in tree format. +*/ +SQLITE_PRIVATE void sqlite3TreeViewColumnList( + TreeView *pView, + const Column *aCol, + int nCol, + u8 moreToFollow +){ + int i; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, "COLUMNS"); + for(i=0; inCte==0 ) return; + if( pWith->pOuter ){ + sqlite3TreeViewLine(pView, "WITH (0x%p, pOuter=0x%p)",pWith,pWith->pOuter); + }else{ + sqlite3TreeViewLine(pView, "WITH (0x%p)", pWith); + } + if( pWith->nCte>0 ){ + sqlite3TreeViewPush(&pView, moreToFollow); + for(i=0; inCte; i++){ + StrAccum x; + char zLine[1000]; + const struct Cte *pCte = &pWith->a[i]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "%s", pCte->zName); + if( pCte->pCols && pCte->pCols->nExpr>0 ){ + char cSep = '('; + int j; + for(j=0; jpCols->nExpr; j++){ + sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zEName); + cSep = ','; + } + sqlite3_str_appendf(&x, ")"); + } + if( pCte->eM10d!=M10d_Any ){ + sqlite3_str_appendf(&x, " %sMATERIALIZED", + pCte->eM10d==M10d_No ? "NOT " : ""); + } + if( pCte->pUse ){ + sqlite3_str_appendf(&x, " (pUse=0x%p, nUse=%d)", pCte->pUse, + pCte->pUse->nUse); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inCte-1); + sqlite3TreeViewSelect(pView, pCte->pSelect, 0); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPop(&pView); + } +} + +/* +** Generate a human-readable description of a SrcList object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ + int i; + if( pSrc==0 ) return; + for(i=0; inSrc; i++){ + const SrcItem *pItem = &pSrc->a[i]; + StrAccum x; + int n = 0; + char zLine[1000]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + x.printfFlags |= SQLITE_PRINTF_INTERNAL; + sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem); + if( pItem->pTab ){ + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx", + pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed); + } + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==(JT_LEFT|JT_RIGHT) ){ + sqlite3_str_appendf(&x, " FULL-OUTER-JOIN"); + }else if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&x, " LEFT-JOIN"); + }else if( pItem->fg.jointype & JT_RIGHT ){ + sqlite3_str_appendf(&x, " RIGHT-JOIN"); + }else if( pItem->fg.jointype & JT_CROSS ){ + sqlite3_str_appendf(&x, " CROSS-JOIN"); + } + if( pItem->fg.jointype & JT_LTORJ ){ + sqlite3_str_appendf(&x, " LTORJ"); + } + if( pItem->fg.fromDDL ){ + sqlite3_str_appendf(&x, " DDL"); + } + if( pItem->fg.isCte ){ + sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse); + } + if( pItem->fg.isOn || (pItem->fg.isUsing==0 && pItem->u3.pOn!=0) ){ + sqlite3_str_appendf(&x, " ON"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inSrc-1); + n = 0; + if( pItem->pSelect ) n++; + if( pItem->fg.isTabFunc ) n++; + if( pItem->fg.isUsing ) n++; + if( pItem->fg.isUsing ){ + sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); + } + if( pItem->pSelect ){ + if( pItem->pTab ){ + Table *pTab = pItem->pTab; + sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); + } + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(&pView); + } +} + +/* +** Generate a human-readable description of a Select object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ + int n = 0; + int cnt = 0; + if( p==0 ){ + sqlite3TreeViewLine(pView, "nil-SELECT"); + return; + } + sqlite3TreeViewPush(&pView, moreToFollow); + if( p->pWith ){ + sqlite3TreeViewWith(pView, p->pWith, 1); + cnt = 1; + sqlite3TreeViewPush(&pView, 1); + } + do{ + if( p->selFlags & SF_WhereBegin ){ + sqlite3TreeViewLine(pView, "sqlite3WhereBegin()"); + }else{ + sqlite3TreeViewLine(pView, + "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), + p->selId, p, p->selFlags, + (int)p->nSelectRow + ); + } + if( cnt++ ) sqlite3TreeViewPop(&pView); + if( p->pPrior ){ + n = 1000; + }else{ + n = 0; + if( p->pSrc && p->pSrc->nSrc ) n++; + if( p->pWhere ) n++; + if( p->pGroupBy ) n++; + if( p->pHaving ) n++; + if( p->pOrderBy ) n++; + if( p->pLimit ) n++; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ) n++; + if( p->pWinDefn ) n++; +#endif + } + if( p->pEList ){ + sqlite3TreeViewExprList(pView, p->pEList, n>0, "result-set"); + } + n--; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ){ + Window *pX; + sqlite3TreeViewPush(&pView, (n--)>0); + sqlite3TreeViewLine(pView, "window-functions"); + for(pX=p->pWin; pX; pX=pX->pNextWin){ + sqlite3TreeViewWinFunc(pView, pX, pX->pNextWin!=0); + } + sqlite3TreeViewPop(&pView); + } +#endif + if( p->pSrc && p->pSrc->nSrc ){ + sqlite3TreeViewPush(&pView, (n--)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, p->pSrc); + sqlite3TreeViewPop(&pView); + } + if( p->pWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, p->pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( p->pGroupBy ){ + sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); + } + if( p->pHaving ){ + sqlite3TreeViewItem(pView, "HAVING", (n--)>0); + sqlite3TreeViewExpr(pView, p->pHaving, 0); + sqlite3TreeViewPop(&pView); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWinDefn ){ + Window *pX; + sqlite3TreeViewItem(pView, "WINDOW", (n--)>0); + for(pX=p->pWinDefn; pX; pX=pX->pNextWin){ + sqlite3TreeViewWindow(pView, pX, pX->pNextWin!=0); + } + sqlite3TreeViewPop(&pView); + } +#endif + if( p->pOrderBy ){ + sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); + } + if( p->pLimit ){ + sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit->pLeft, p->pLimit->pRight!=0); + if( p->pLimit->pRight ){ + sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPop(&pView); + } + if( p->pPrior ){ + const char *zOp = "UNION"; + switch( p->op ){ + case TK_ALL: zOp = "UNION ALL"; break; + case TK_INTERSECT: zOp = "INTERSECT"; break; + case TK_EXCEPT: zOp = "EXCEPT"; break; + } + sqlite3TreeViewItem(pView, zOp, 1); + } + p = p->pPrior; + }while( p!=0 ); + sqlite3TreeViewPop(&pView); +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Generate a description of starting or stopping bounds +*/ +SQLITE_PRIVATE void sqlite3TreeViewBound( + TreeView *pView, /* View context */ + u8 eBound, /* UNBOUNDED, CURRENT, PRECEDING, FOLLOWING */ + Expr *pExpr, /* Value for PRECEDING or FOLLOWING */ + u8 moreToFollow /* True if more to follow */ +){ + switch( eBound ){ + case TK_UNBOUNDED: { + sqlite3TreeViewItem(pView, "UNBOUNDED", moreToFollow); + sqlite3TreeViewPop(&pView); + break; + } + case TK_CURRENT: { + sqlite3TreeViewItem(pView, "CURRENT", moreToFollow); + sqlite3TreeViewPop(&pView); + break; + } + case TK_PRECEDING: { + sqlite3TreeViewItem(pView, "PRECEDING", moreToFollow); + sqlite3TreeViewExpr(pView, pExpr, 0); + sqlite3TreeViewPop(&pView); + break; + } + case TK_FOLLOWING: { + sqlite3TreeViewItem(pView, "FOLLOWING", moreToFollow); + sqlite3TreeViewExpr(pView, pExpr, 0); + sqlite3TreeViewPop(&pView); + break; + } + } +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Generate a human-readable explanation for a Window object +*/ +SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ + int nElement = 0; + if( pWin==0 ) return; + if( pWin->pFilter ){ + sqlite3TreeViewItem(pView, "FILTER", 1); + sqlite3TreeViewExpr(pView, pWin->pFilter, 0); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPush(&pView, more); + if( pWin->zName ){ + sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); + }else{ + sqlite3TreeViewLine(pView, "OVER (%p)", pWin); + } + if( pWin->zBase ) nElement++; + if( pWin->pOrderBy ) nElement++; + if( pWin->eFrmType ) nElement++; + if( pWin->eExclude ) nElement++; + if( pWin->zBase ){ + sqlite3TreeViewPush(&pView, (--nElement)>0); + sqlite3TreeViewLine(pView, "window: %s", pWin->zBase); + sqlite3TreeViewPop(&pView); + } + if( pWin->pPartition ){ + sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY"); + } + if( pWin->pOrderBy ){ + sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY"); + } + if( pWin->eFrmType ){ + char zBuf[30]; + const char *zFrmType = "ROWS"; + if( pWin->eFrmType==TK_RANGE ) zFrmType = "RANGE"; + if( pWin->eFrmType==TK_GROUPS ) zFrmType = "GROUPS"; + sqlite3_snprintf(sizeof(zBuf),zBuf,"%s%s",zFrmType, + pWin->bImplicitFrame ? " (implied)" : ""); + sqlite3TreeViewItem(pView, zBuf, (--nElement)>0); + sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1); + sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0); + sqlite3TreeViewPop(&pView); + } + if( pWin->eExclude ){ + char zBuf[30]; + const char *zExclude; + switch( pWin->eExclude ){ + case TK_NO: zExclude = "NO OTHERS"; break; + case TK_CURRENT: zExclude = "CURRENT ROW"; break; + case TK_GROUP: zExclude = "GROUP"; break; + case TK_TIES: zExclude = "TIES"; break; + default: + sqlite3_snprintf(sizeof(zBuf),zBuf,"invalid(%d)", pWin->eExclude); + zExclude = zBuf; + break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPop(&pView); +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Generate a human-readable explanation for a Window Function object +*/ +SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){ + if( pWin==0 ) return; + sqlite3TreeViewPush(&pView, more); + sqlite3TreeViewLine(pView, "WINFUNC %s(%d)", + pWin->pWFunc->zName, pWin->pWFunc->nArg); + sqlite3TreeViewWindow(pView, pWin, 0); + sqlite3TreeViewPop(&pView); +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** Generate a human-readable explanation of an expression tree. +*/ +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ + const char *zBinOp = 0; /* Binary operator */ + const char *zUniOp = 0; /* Unary operator */ + char zFlgs[200]; + sqlite3TreeViewPush(&pView, moreToFollow); + if( pExpr==0 ){ + sqlite3TreeViewLine(pView, "nil"); + sqlite3TreeViewPop(&pView); + return; + } + if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){ + StrAccum x; + sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); + sqlite3_str_appendf(&x, " fg.af=%x.%c", + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + sqlite3_str_appendf(&x, " outer.iJoin=%d", pExpr->w.iJoin); + } + if( ExprHasProperty(pExpr, EP_InnerON) ){ + sqlite3_str_appendf(&x, " inner.iJoin=%d", pExpr->w.iJoin); + } + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + sqlite3_str_appendf(&x, " DDL"); + } + if( ExprHasVVAProperty(pExpr, EP_Immutable) ){ + sqlite3_str_appendf(&x, " IMMUTABLE"); + } + sqlite3StrAccumFinish(&x); + }else{ + zFlgs[0] = 0; + } + switch( pExpr->op ){ + case TK_AGG_COLUMN: { + sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + break; + } + case TK_COLUMN: { + if( pExpr->iTable<0 ){ + /* This only happens when coding check constraints */ + char zOp2[16]; + if( pExpr->op2 ){ + sqlite3_snprintf(sizeof(zOp2),zOp2," op2=0x%02x",pExpr->op2); + }else{ + zOp2[0] = 0; + } + sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s", + pExpr->iColumn, zFlgs, zOp2); + }else{ + assert( ExprUseYTab(pExpr) ); + sqlite3TreeViewLine(pView, "{%d:%d} pTab=%p%s", + pExpr->iTable, pExpr->iColumn, + pExpr->y.pTab, zFlgs); + } + if( ExprHasProperty(pExpr, EP_FixedCol) ){ + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + break; + } + case TK_INTEGER: { + if( pExpr->flags & EP_IntValue ){ + sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); + }else{ + sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); + } + break; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_STRING: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); + break; + } + case TK_NULL: { + sqlite3TreeViewLine(pView,"NULL"); + break; + } + case TK_TRUEFALSE: { + sqlite3TreeViewLine(pView,"%s%s", + sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE", zFlgs); + break; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_VARIABLE: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", + pExpr->u.zToken, pExpr->iColumn); + break; + } + case TK_REGISTER: { + sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); + break; + } + case TK_ID: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); + break; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_LT: zBinOp = "LT"; break; + case TK_LE: zBinOp = "LE"; break; + case TK_GT: zBinOp = "GT"; break; + case TK_GE: zBinOp = "GE"; break; + case TK_NE: zBinOp = "NE"; break; + case TK_EQ: zBinOp = "EQ"; break; + case TK_IS: zBinOp = "IS"; break; + case TK_ISNOT: zBinOp = "ISNOT"; break; + case TK_AND: zBinOp = "AND"; break; + case TK_OR: zBinOp = "OR"; break; + case TK_PLUS: zBinOp = "ADD"; break; + case TK_STAR: zBinOp = "MUL"; break; + case TK_MINUS: zBinOp = "SUB"; break; + case TK_REM: zBinOp = "REM"; break; + case TK_BITAND: zBinOp = "BITAND"; break; + case TK_BITOR: zBinOp = "BITOR"; break; + case TK_SLASH: zBinOp = "DIV"; break; + case TK_LSHIFT: zBinOp = "LSHIFT"; break; + case TK_RSHIFT: zBinOp = "RSHIFT"; break; + case TK_CONCAT: zBinOp = "CONCAT"; break; + case TK_DOT: zBinOp = "DOT"; break; + case TK_LIMIT: zBinOp = "LIMIT"; break; + + case TK_UMINUS: zUniOp = "UMINUS"; break; + case TK_UPLUS: zUniOp = "UPLUS"; break; + case TK_BITNOT: zUniOp = "BITNOT"; break; + case TK_NOT: zUniOp = "NOT"; break; + case TK_ISNULL: zUniOp = "ISNULL"; break; + case TK_NOTNULL: zUniOp = "NOTNULL"; break; + + case TK_TRUTH: { + int x; + const char *azOp[] = { + "IS-FALSE", "IS-TRUE", "IS-NOT-FALSE", "IS-NOT-TRUE" + }; + assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT ); + assert( pExpr->pRight ); + assert( sqlite3ExprSkipCollate(pExpr->pRight)->op==TK_TRUEFALSE ); + x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight); + zUniOp = azOp[x]; + break; + } + + case TK_SPAN: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_COLLATE: { + /* COLLATE operators without the EP_Collate flag are intended to + ** emulate collation associated with a table column. These show + ** up in the treeview output as "SOFT-COLLATE". Explicit COLLATE + ** operators that appear in the original SQL always have the + ** EP_Collate bit set and appear in treeview output as just "COLLATE" */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView, "%sCOLLATE %Q%s", + !ExprHasProperty(pExpr, EP_Collate) ? "SOFT-" : "", + pExpr->u.zToken, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_AGG_FUNCTION: + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + Window *pWin; + if( ExprHasProperty(pExpr, EP_TokenOnly) ){ + pFarg = 0; + pWin = 0; + }else{ + assert( ExprUseXList(pExpr) ); + pFarg = pExpr->x.pList; +#ifndef SQLITE_OMIT_WINDOWFUNC + pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; +#else + pWin = 0; +#endif + } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + if( pExpr->op==TK_AGG_FUNCTION ){ + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s agg=%d[%d]/%p", + pExpr->op2, pExpr->u.zToken, zFlgs, + pExpr->pAggInfo ? pExpr->pAggInfo->selId : 0, + pExpr->iAgg, pExpr->pAggInfo); + }else if( pExpr->op2!=0 ){ + const char *zOp2; + char zBuf[8]; + sqlite3_snprintf(sizeof(zBuf),zBuf,"0x%02x",pExpr->op2); + zOp2 = zBuf; + if( pExpr->op2==NC_IsCheck ) zOp2 = "NC_IsCheck"; + if( pExpr->op2==NC_IdxExpr ) zOp2 = "NC_IdxExpr"; + if( pExpr->op2==NC_PartIdx ) zOp2 = "NC_PartIdx"; + if( pExpr->op2==NC_GenCol ) zOp2 = "NC_GenCol"; + sqlite3TreeViewLine(pView, "FUNCTION %Q%s op2=%s", + pExpr->u.zToken, zFlgs, zOp2); + }else{ + sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); + } + if( pFarg ){ + sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pWin ){ + sqlite3TreeViewWindow(pView, pWin, 0); + } +#endif + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: { + assert( ExprUseXSelect(pExpr) ); + sqlite3TreeViewLine(pView, "EXISTS-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_SELECT: { + assert( ExprUseXSelect(pExpr) ); + sqlite3TreeViewLine(pView, "subquery-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_IN: { + sqlite3_str *pStr = sqlite3_str_new(0); + char *z; + sqlite3_str_appendf(pStr, "IN flags=0x%x", pExpr->flags); + if( pExpr->iTable ) sqlite3_str_appendf(pStr, " iTable=%d",pExpr->iTable); + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3_str_appendf(pStr, " subrtn(%d,%d)", + pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + } + z = sqlite3_str_finish(pStr); + sqlite3TreeViewLine(pView, z); + sqlite3_free(z); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + if( ExprUseXSelect(pExpr) ){ + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + }else{ + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + } + break; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + const Expr *pX, *pY, *pZ; + pX = pExpr->pLeft; + assert( ExprUseXList(pExpr) ); + assert( pExpr->x.pList->nExpr==2 ); + pY = pExpr->x.pList->a[0].pExpr; + pZ = pExpr->x.pList->a[1].pExpr; + sqlite3TreeViewLine(pView, "BETWEEN"); + sqlite3TreeViewExpr(pView, pX, 1); + sqlite3TreeViewExpr(pView, pY, 1); + sqlite3TreeViewExpr(pView, pZ, 0); + break; + } + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + */ + sqlite3TreeViewLine(pView, "%s(%d)", + pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); + break; + } + case TK_CASE: { + sqlite3TreeViewLine(pView, "CASE"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + assert( ExprUseXList(pExpr) ); + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + const char *zType = "unk"; + switch( pExpr->affExpr ){ + case OE_Rollback: zType = "rollback"; break; + case OE_Abort: zType = "abort"; break; + case OE_Fail: zType = "fail"; break; + case OE_Ignore: zType = "ignore"; break; + } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); + break; + } +#endif + case TK_MATCH: { + sqlite3TreeViewLine(pView, "MATCH {%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + break; + } + case TK_VECTOR: { + char *z = sqlite3_mprintf("VECTOR%s",zFlgs); + assert( ExprUseXList(pExpr) ); + sqlite3TreeViewBareExprList(pView, pExpr->x.pList, z); + sqlite3_free(z); + break; + } + case TK_SELECT_COLUMN: { + sqlite3TreeViewLine(pView, "SELECT-COLUMN %d of [0..%d]%s", + pExpr->iColumn, pExpr->iTable-1, + pExpr->pRight==pExpr->pLeft ? " (SELECT-owner)" : ""); + assert( ExprUseXSelect(pExpr->pLeft) ); + sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); + break; + } + case TK_IF_NULL_ROW: { + sqlite3TreeViewLine(pView, "IF-NULL-ROW %d", pExpr->iTable); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + case TK_ERROR: { + Expr tmp; + sqlite3TreeViewLine(pView, "ERROR"); + tmp = *pExpr; + tmp.op = pExpr->op2; + sqlite3TreeViewExpr(pView, &tmp, 0); + break; + } + case TK_ROW: { + if( pExpr->iColumn<=0 ){ + sqlite3TreeViewLine(pView, "First FROM table rowid"); + }else{ + sqlite3TreeViewLine(pView, "First FROM table column %d", + pExpr->iColumn-1); + } + break; + } + default: { + sqlite3TreeViewLine(pView, "op=%d", pExpr->op); + break; + } + } + if( zBinOp ){ + sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + }else if( zUniOp ){ + sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + sqlite3TreeViewPop(&pView); +} + + +/* +** Generate a human-readable explanation of an expression list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareExprList( + TreeView *pView, + const ExprList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inExpr; i++){ + int j = pList->a[i].u.x.iOrderByCol; + char *zName = pList->a[i].zEName; + int moreToFollow = inExpr - 1; + if( j || zName ){ + sqlite3TreeViewPush(&pView, moreToFollow); + moreToFollow = 0; + sqlite3TreeViewLine(pView, 0); + if( zName ){ + switch( pList->a[i].fg.eEName ){ + default: + fprintf(stdout, "AS %s ", zName); + break; + case ENAME_TAB: + fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName); + if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) "); + if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) "); + if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) "); + break; + case ENAME_SPAN: + fprintf(stdout, "SPAN(\"%s\") ", zName); + break; + } + } + if( j ){ + fprintf(stdout, "iOrderByCol=%d", j); + } + fprintf(stdout, "\n"); + fflush(stdout); + } + sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); + if( j || zName ){ + sqlite3TreeViewPop(&pView); + } + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewExprList( + TreeView *pView, + const ExprList *pList, + u8 moreToFollow, + const char *zLabel +){ + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewBareExprList(pView, pList, zLabel); + sqlite3TreeViewPop(&pView); +} + +/* +** Generate a human-readable explanation of an id-list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareIdList( + TreeView *pView, + const IdList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inId; i++){ + char *zName = pList->a[i].zName; + int moreToFollow = inId - 1; + if( zName==0 ) zName = "(null)"; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, 0); + if( pList->eU4==EU4_NONE ){ + fprintf(stdout, "%s\n", zName); + }else if( pList->eU4==EU4_IDX ){ + fprintf(stdout, "%s (%d)\n", zName, pList->a[i].u4.idx); + }else{ + assert( pList->eU4==EU4_EXPR ); + if( pList->a[i].u4.pExpr==0 ){ + fprintf(stdout, "%s (pExpr=NULL)\n", zName); + }else{ + fprintf(stdout, "%s\n", zName); + sqlite3TreeViewPush(&pView, inId-1); + sqlite3TreeViewExpr(pView, pList->a[i].u4.pExpr, 0); + sqlite3TreeViewPop(&pView); + } + } + sqlite3TreeViewPop(&pView); + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewIdList( + TreeView *pView, + const IdList *pList, + u8 moreToFollow, + const char *zLabel +){ + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewBareIdList(pView, pList, zLabel); + sqlite3TreeViewPop(&pView); +} + +/* +** Generate a human-readable explanation of a list of Upsert objects +*/ +SQLITE_PRIVATE void sqlite3TreeViewUpsert( + TreeView *pView, + const Upsert *pUpsert, + u8 moreToFollow +){ + if( pUpsert==0 ) return; + sqlite3TreeViewPush(&pView, moreToFollow); + while( pUpsert ){ + int n; + sqlite3TreeViewPush(&pView, pUpsert->pNextUpsert!=0 || moreToFollow); + sqlite3TreeViewLine(pView, "ON CONFLICT DO %s", + pUpsert->isDoUpdate ? "UPDATE" : "NOTHING"); + n = (pUpsert->pUpsertSet!=0) + (pUpsert->pUpsertWhere!=0); + sqlite3TreeViewExprList(pView, pUpsert->pUpsertTarget, (n--)>0, "TARGET"); + sqlite3TreeViewExprList(pView, pUpsert->pUpsertSet, (n--)>0, "SET"); + if( pUpsert->pUpsertWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, pUpsert->pUpsertWhere, 0); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPop(&pView); + pUpsert = pUpsert->pNextUpsert; + } + sqlite3TreeViewPop(&pView); +} + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an DELETE statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewDelete( + const With *pWith, + const SrcList *pTabList, + const Expr *pWhere, + const ExprList *pOrderBy, + const Expr *pLimit, + const Trigger *pTrigger +){ + int n = 0; + TreeView *pView = 0; + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, "DELETE"); + if( pWith ) n++; + if( pTabList ) n++; + if( pWhere ) n++; + if( pOrderBy ) n++; + if( pLimit ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pWhere ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "WHERE"); + sqlite3TreeViewExpr(pView, pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( pOrderBy ){ + sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY"); + } + if( pLimit ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "LIMIT"); + sqlite3TreeViewExpr(pView, pLimit, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an INSERT statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewInsert( + const With *pWith, + const SrcList *pTabList, + const IdList *pColumnList, + const Select *pSelect, + const ExprList *pExprList, + int onError, + const Upsert *pUpsert, + const Trigger *pTrigger +){ + TreeView *pView = 0; + int n = 0; + const char *zLabel = "INSERT"; + switch( onError ){ + case OE_Replace: zLabel = "REPLACE"; break; + case OE_Ignore: zLabel = "INSERT OR IGNORE"; break; + case OE_Rollback: zLabel = "INSERT OR ROLLBACK"; break; + case OE_Abort: zLabel = "INSERT OR ABORT"; break; + case OE_Fail: zLabel = "INSERT OR FAIL"; break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, zLabel); + if( pWith ) n++; + if( pTabList ) n++; + if( pColumnList ) n++; + if( pSelect ) n++; + if( pExprList ) n++; + if( pUpsert ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "INTO"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pColumnList ){ + sqlite3TreeViewIdList(pView, pColumnList, (--n)>0, "COLUMNS"); + } + if( pSelect ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "DATA-SOURCE"); + sqlite3TreeViewSelect(pView, pSelect, 0); + sqlite3TreeViewPop(&pView); + } + if( pExprList ){ + sqlite3TreeViewExprList(pView, pExprList, (--n)>0, "VALUES"); + } + if( pUpsert ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "UPSERT"); + sqlite3TreeViewUpsert(pView, pUpsert, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an UPDATE statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewUpdate( + const With *pWith, + const SrcList *pTabList, + const ExprList *pChanges, + const Expr *pWhere, + int onError, + const ExprList *pOrderBy, + const Expr *pLimit, + const Upsert *pUpsert, + const Trigger *pTrigger +){ + int n = 0; + TreeView *pView = 0; + const char *zLabel = "UPDATE"; + switch( onError ){ + case OE_Replace: zLabel = "UPDATE OR REPLACE"; break; + case OE_Ignore: zLabel = "UPDATE OR IGNORE"; break; + case OE_Rollback: zLabel = "UPDATE OR ROLLBACK"; break; + case OE_Abort: zLabel = "UPDATE OR ABORT"; break; + case OE_Fail: zLabel = "UPDATE OR FAIL"; break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, zLabel); + if( pWith ) n++; + if( pTabList ) n++; + if( pChanges ) n++; + if( pWhere ) n++; + if( pOrderBy ) n++; + if( pLimit ) n++; + if( pUpsert ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pChanges ){ + sqlite3TreeViewExprList(pView, pChanges, (--n)>0, "SET"); + } + if( pWhere ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "WHERE"); + sqlite3TreeViewExpr(pView, pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( pOrderBy ){ + sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY"); + } + if( pLimit ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "LIMIT"); + sqlite3TreeViewExpr(pView, pLimit, 0); + sqlite3TreeViewPop(&pView); + } + if( pUpsert ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "UPSERT"); + sqlite3TreeViewUpsert(pView, pUpsert, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#ifndef SQLITE_OMIT_TRIGGER +/* +** Show a human-readable graph of a TriggerStep +*/ +SQLITE_PRIVATE void sqlite3TreeViewTriggerStep( + TreeView *pView, + const TriggerStep *pStep, + u8 moreToFollow, + u8 showFullList +){ + int cnt = 0; + if( pStep==0 ) return; + sqlite3TreeViewPush(&pView, + moreToFollow || (showFullList && pStep->pNext!=0)); + do{ + if( cnt++ && pStep->pNext==0 ){ + sqlite3TreeViewPop(&pView); + sqlite3TreeViewPush(&pView, 0); + } + sqlite3TreeViewLine(pView, "%s", pStep->zSpan ? pStep->zSpan : "RETURNING"); + }while( showFullList && (pStep = pStep->pNext)!=0 ); + sqlite3TreeViewPop(&pView); +} + +/* +** Show a human-readable graph of a Trigger +*/ +SQLITE_PRIVATE void sqlite3TreeViewTrigger( + TreeView *pView, + const Trigger *pTrigger, + u8 moreToFollow, + u8 showFullList +){ + int cnt = 0; + if( pTrigger==0 ) return; + sqlite3TreeViewPush(&pView, + moreToFollow || (showFullList && pTrigger->pNext!=0)); + do{ + if( cnt++ && pTrigger->pNext==0 ){ + sqlite3TreeViewPop(&pView); + sqlite3TreeViewPush(&pView, 0); + } + sqlite3TreeViewLine(pView, "TRIGGER %s", pTrigger->zName); + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewTriggerStep(pView, pTrigger->step_list, 0, 1); + sqlite3TreeViewPop(&pView); + }while( showFullList && (pTrigger = pTrigger->pNext)!=0 ); + sqlite3TreeViewPop(&pView); +} +#endif /* SQLITE_OMIT_TRIGGER */ + + +/* +** These simplified versions of the tree-view routines omit unnecessary +** parameters. These variants are intended to be used from a symbolic +** debugger, such as "gdb", during interactive debugging sessions. +** +** This routines are given external linkage so that they will always be +** accessible to the debugging, and to avoid warnings about unused +** functions. But these routines only exist in debugging builds, so they +** do not contaminate the interface. +*/ +SQLITE_PRIVATE void sqlite3ShowExpr(const Expr *p){ sqlite3TreeViewExpr(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList *p){ sqlite3TreeViewExprList(0,p,0,0);} +SQLITE_PRIVATE void sqlite3ShowIdList(const IdList *p){ sqlite3TreeViewIdList(0,p,0,0); } +SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList *p){ sqlite3TreeViewSrcList(0,p); } +SQLITE_PRIVATE void sqlite3ShowSelect(const Select *p){ sqlite3TreeViewSelect(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowWith(const With *p){ sqlite3TreeViewWith(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert *p){ sqlite3TreeViewUpsert(0,p,0); } +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep *p){ + sqlite3TreeViewTriggerStep(0,p,0,0); +} +SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep *p){ + sqlite3TreeViewTriggerStep(0,p,0,1); +} +SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,0); } +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,1);} +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3ShowWindow(const Window *p){ sqlite3TreeViewWindow(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window *p){ sqlite3TreeViewWinFunc(0,p,0); } +#endif + +#endif /* SQLITE_DEBUG */ + +/************** End of treeview.c ********************************************/ +/************** Begin file random.c ******************************************/ +/* +** 2001 September 15 +** +** 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 contains code to implement a pseudo-random number +** generator (PRNG) for SQLite. +** +** Random numbers are used by some of the database backends in order +** to generate random integer keys for tables or random filenames. +*/ +/* #include "sqliteInt.h" */ + + +/* All threads share a single random number generator. +** This structure is the current state of the generator. +*/ +static SQLITE_WSD struct sqlite3PrngType { + unsigned char isInit; /* True if initialized */ + unsigned char i, j; /* State variables */ + unsigned char s[256]; /* State variables */ +} sqlite3Prng; + +/* +** Return N random bytes. +*/ +SQLITE_API void sqlite3_randomness(int N, void *pBuf){ + unsigned char t; + unsigned char *zBuf = pBuf; + + /* The "wsdPrng" macro will resolve to the pseudo-random number generator + ** state vector. If writable static data is unsupported on the target, + ** we have to locate the state vector at run-time. In the more common + ** case where writable static data is supported, wsdPrng can refer directly + ** to the "sqlite3Prng" state vector declared above. + */ +#ifdef SQLITE_OMIT_WSD + struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng); +# define wsdPrng p[0] +#else +# define wsdPrng sqlite3Prng +#endif + +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex; +#endif + +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return; +#endif + +#if SQLITE_THREADSAFE + mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG); +#endif + + sqlite3_mutex_enter(mutex); + if( N<=0 || pBuf==0 ){ + wsdPrng.isInit = 0; + sqlite3_mutex_leave(mutex); + return; + } + + /* Initialize the state of the random number generator once, + ** the first time this routine is called. The seed value does + ** not need to contain a lot of randomness since we are not + ** trying to do secure encryption or anything like that... + ** + ** Nothing in this file or anywhere else in SQLite does any kind of + ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random + ** number generator) not as an encryption device. + */ + if( !wsdPrng.isInit ){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(0); + int i; + char k[256]; + wsdPrng.j = 0; + wsdPrng.i = 0; + if( NEVER(pVfs==0) ){ + memset(k, 0, sizeof(k)); + }else{ + sqlite3OsRandomness(pVfs, 256, k); + } + for(i=0; i<256; i++){ + wsdPrng.s[i] = (u8)i; + } + for(i=0; i<256; i++){ + wsdPrng.j += wsdPrng.s[i] + k[i]; + t = wsdPrng.s[wsdPrng.j]; + wsdPrng.s[wsdPrng.j] = wsdPrng.s[i]; + wsdPrng.s[i] = t; + } + wsdPrng.isInit = 1; + } + + assert( N>0 ); + do{ + wsdPrng.i++; + t = wsdPrng.s[wsdPrng.i]; + wsdPrng.j += t; + wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j]; + wsdPrng.s[wsdPrng.j] = t; + t += wsdPrng.s[wsdPrng.i]; + *(zBuf++) = wsdPrng.s[t]; + }while( --N ); + sqlite3_mutex_leave(mutex); +} + +#ifndef SQLITE_UNTESTABLE +/* +** For testing purposes, we sometimes want to preserve the state of +** PRNG and restore the PRNG to its saved state at a later time, or +** to reset the PRNG to its initial state. These routines accomplish +** those tasks. +** +** The sqlite3_test_control() interface calls these routines to +** control the PRNG. +*/ +static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng; +SQLITE_PRIVATE void sqlite3PrngSaveState(void){ + memcpy( + &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), + &GLOBAL(struct sqlite3PrngType, sqlite3Prng), + sizeof(sqlite3Prng) + ); +} +SQLITE_PRIVATE void sqlite3PrngRestoreState(void){ + memcpy( + &GLOBAL(struct sqlite3PrngType, sqlite3Prng), + &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), + sizeof(sqlite3Prng) + ); +} +#endif /* SQLITE_UNTESTABLE */ + +/************** End of random.c **********************************************/ +/************** Begin file threads.c *****************************************/ +/* +** 2012 July 21 +** +** 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 presents a simple cross-platform threading interface for +** use internally by SQLite. +** +** A "thread" can be created using sqlite3ThreadCreate(). This thread +** runs independently of its creator until it is joined using +** sqlite3ThreadJoin(), at which point it terminates. +** +** Threads do not have to be real. It could be that the work of the +** "thread" is done by the main thread at either the sqlite3ThreadCreate() +** or sqlite3ThreadJoin() call. This is, in fact, what happens in +** single threaded systems. Nothing in SQLite requires multiple threads. +** This interface exists so that applications that want to take advantage +** of multiple cores can do so, while also allowing applications to stay +** single-threaded if desired. +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_WIN +/* # include "os_win.h" */ +#endif + +#if SQLITE_MAX_WORKER_THREADS>0 + +/********************************* Unix Pthreads ****************************/ +#if SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) && SQLITE_THREADSAFE>0 + +#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +/* #include */ + +/* A running thread */ +struct SQLiteThread { + pthread_t tid; /* Thread ID */ + int done; /* Set to true when thread finishes */ + void *pOut; /* Result returned by the thread */ + void *(*xTask)(void*); /* The thread routine */ + void *pIn; /* Argument to the thread */ +}; + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + int rc; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + /* This routine is never used in single-threaded mode */ + assert( sqlite3GlobalConfig.bCoreMutex!=0 ); + + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + memset(p, 0, sizeof(*p)); + p->xTask = xTask; + p->pIn = pIn; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** for testing purposes. */ + if( sqlite3FaultSim(200) ){ + rc = 1; + }else{ + rc = pthread_create(&p->tid, 0, xTask, pIn); + } + if( rc ){ + p->done = 1; + p->pOut = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + int rc; + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->done ){ + *ppOut = p->pOut; + rc = SQLITE_OK; + }else{ + rc = pthread_join(p->tid, ppOut) ? SQLITE_ERROR : SQLITE_OK; + } + sqlite3_free(p); + return rc; +} + +#endif /* SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) */ +/******************************** End Unix Pthreads *************************/ + + +/********************************* Win32 Threads ****************************/ +#if SQLITE_OS_WIN_THREADS + +#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +#include + +/* A running thread */ +struct SQLiteThread { + void *tid; /* The thread handle */ + unsigned id; /* The thread identifier */ + void *(*xTask)(void*); /* The routine to run as a thread */ + void *pIn; /* Argument to xTask */ + void *pResult; /* Result of xTask */ +}; + +/* Thread procedure Win32 compatibility shim */ +static unsigned __stdcall sqlite3ThreadProc( + void *pArg /* IN: Pointer to the SQLiteThread structure */ +){ + SQLiteThread *p = (SQLiteThread *)pArg; + + assert( p!=0 ); +#if 0 + /* + ** This assert appears to trigger spuriously on certain + ** versions of Windows, possibly due to _beginthreadex() + ** and/or CreateThread() not fully setting their thread + ** ID parameter before starting the thread. + */ + assert( p->id==GetCurrentThreadId() ); +#endif + assert( p->xTask!=0 ); + p->pResult = p->xTask(p->pIn); + + _endthreadex(0); + return 0; /* NOT REACHED */ +} + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** (via the sqlite3FaultSim() term of the conditional) for testing + ** purposes. */ + if( sqlite3GlobalConfig.bCoreMutex==0 || sqlite3FaultSim(200) ){ + memset(p, 0, sizeof(*p)); + }else{ + p->xTask = xTask; + p->pIn = pIn; + p->tid = (void*)_beginthreadex(0, 0, sqlite3ThreadProc, p, 0, &p->id); + if( p->tid==0 ){ + memset(p, 0, sizeof(*p)); + } + } + if( p->xTask==0 ){ + p->id = GetCurrentThreadId(); + p->pResult = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject); /* os_win.c */ + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + DWORD rc; + BOOL bRc; + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->xTask==0 ){ + /* assert( p->id==GetCurrentThreadId() ); */ + rc = WAIT_OBJECT_0; + assert( p->tid==0 ); + }else{ + assert( p->id!=0 && p->id!=GetCurrentThreadId() ); + rc = sqlite3Win32Wait((HANDLE)p->tid); + assert( rc!=WAIT_IO_COMPLETION ); + bRc = CloseHandle((HANDLE)p->tid); + assert( bRc ); + } + if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult; + sqlite3_free(p); + return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR; +} + +#endif /* SQLITE_OS_WIN_THREADS */ +/******************************** End Win32 Threads *************************/ + + +/********************************* Single-Threaded **************************/ +#ifndef SQLITE_THREADS_IMPLEMENTED +/* +** This implementation does not actually create a new thread. It does the +** work of the thread in the main thread, when either the thread is created +** or when it is joined +*/ + +/* A running thread */ +struct SQLiteThread { + void *(*xTask)(void*); /* The routine to run as a thread */ + void *pIn; /* Argument to xTask */ + void *pResult; /* Result of xTask */ +}; + +/* Create a new thread */ +SQLITE_PRIVATE int sqlite3ThreadCreate( + SQLiteThread **ppThread, /* OUT: Write the thread object here */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + SQLiteThread *p; + + assert( ppThread!=0 ); + assert( xTask!=0 ); + *ppThread = 0; + p = sqlite3Malloc(sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + if( (SQLITE_PTR_TO_INT(p)/17)&1 ){ + p->xTask = xTask; + p->pIn = pIn; + }else{ + p->xTask = 0; + p->pResult = xTask(pIn); + } + *ppThread = p; + return SQLITE_OK; +} + +/* Get the results of the thread */ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ + + assert( ppOut!=0 ); + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; + if( p->xTask ){ + *ppOut = p->xTask(p->pIn); + }else{ + *ppOut = p->pResult; + } + sqlite3_free(p); + +#if defined(SQLITE_TEST) + { + void *pTstAlloc = sqlite3Malloc(10); + if (!pTstAlloc) return SQLITE_NOMEM_BKPT; + sqlite3_free(pTstAlloc); + } +#endif + + return SQLITE_OK; +} + +#endif /* !defined(SQLITE_THREADS_IMPLEMENTED) */ +/****************************** End Single-Threaded *************************/ +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + +/************** End of threads.c *********************************************/ +/************** Begin file utf.c *********************************************/ +/* +** 2004 April 13 +** +** 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 contains routines used to translate between UTF-8, +** UTF-16, UTF-16BE, and UTF-16LE. +** +** Notes on UTF-8: +** +** Byte-0 Byte-1 Byte-2 Byte-3 Value +** 0xxxxxxx 00000000 00000000 0xxxxxxx +** 110yyyyy 10xxxxxx 00000000 00000yyy yyxxxxxx +** 1110zzzz 10yyyyyy 10xxxxxx 00000000 zzzzyyyy yyxxxxxx +** 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx 000uuuuu zzzzyyyy yyxxxxxx +** +** +** Notes on UTF-16: (with wwww+1==uuuuu) +** +** Word-0 Word-1 Value +** 110110ww wwzzzzyy 110111yy yyxxxxxx 000uuuuu zzzzyyyy yyxxxxxx +** zzzzyyyy yyxxxxxx 00000000 zzzzyyyy yyxxxxxx +** +** +** BOM or Byte Order Mark: +** 0xff 0xfe little-endian utf-16 follows +** 0xfe 0xff big-endian utf-16 follows +** +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include "vdbeInt.h" */ + +#if !defined(SQLITE_AMALGAMATION) && SQLITE_BYTEORDER==0 +/* +** The following constant value is used by the SQLITE_BIGENDIAN and +** SQLITE_LITTLEENDIAN macros. +*/ +SQLITE_PRIVATE const int sqlite3one = 1; +#endif /* SQLITE_AMALGAMATION && SQLITE_BYTEORDER==0 */ + +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. +*/ +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (u8)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ +} + +#define WRITE_UTF16LE(zOut, c) { \ + if( c<=0xFFFF ){ \ + *zOut++ = (u8)(c&0x00FF); \ + *zOut++ = (u8)((c>>8)&0x00FF); \ + }else{ \ + *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ + *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ + *zOut++ = (u8)(c&0x00FF); \ + *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ + } \ +} + +#define WRITE_UTF16BE(zOut, c) { \ + if( c<=0xFFFF ){ \ + *zOut++ = (u8)((c>>8)&0x00FF); \ + *zOut++ = (u8)(c&0x00FF); \ + }else{ \ + *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \ + *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \ + *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \ + *zOut++ = (u8)(c&0x00FF); \ + } \ +} + +/* +** Translate a single UTF-8 character. Return the unicode value. +** +** During translation, assume that the byte that zTerm points +** is a 0x00. +** +** Write a pointer to the next unread byte back into *pzNext. +** +** Notes On Invalid UTF-8: +** +** * This routine never allows a 7-bit character (0x00 through 0x7f) to +** be encoded as a multi-byte character. Any multi-byte character that +** attempts to encode a value between 0x00 and 0x7f is rendered as 0xfffd. +** +** * This routine never allows a UTF16 surrogate value to be encoded. +** If a multi-byte character attempts to encode a value between +** 0xd800 and 0xe000 then it is rendered as 0xfffd. +** +** * Bytes in the range of 0x80 through 0xbf which occur as the first +** byte of a character are interpreted as single-byte characters +** and rendered as themselves even though they are technically +** invalid characters. +** +** * This routine accepts over-length UTF8 encodings +** for unicode values 0x80 and greater. It does not change over-length +** encodings to 0xfffd as some systems recommend. +*/ +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } +SQLITE_PRIVATE u32 sqlite3Utf8Read( + const unsigned char **pz /* Pointer to string from which to read char */ +){ + unsigned int c; + + /* Same as READ_UTF8() above but without the zTerm parameter. + ** For this routine, we assume the UTF8 string is always zero-terminated. + */ + c = *((*pz)++); + if( c>=0xc0 ){ + c = sqlite3Utf8Trans1[c-0xc0]; + while( (*(*pz) & 0xc0)==0x80 ){ + c = (c<<6) + (0x3f & *((*pz)++)); + } + if( c<0x80 + || (c&0xFFFFF800)==0xD800 + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } + } + return c; +} + + + + +/* +** If the TRANSLATE_TRACE macro is defined, the value of each Mem is +** printed on stderr on the way into and out of sqlite3VdbeMemTranslate(). +*/ +/* #define TRANSLATE_TRACE 1 */ + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine transforms the internal text encoding used by pMem to +** desiredEnc. It is an error if the string is already of the desired +** encoding, or if *pMem does not contain a string value. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ + sqlite3_int64 len; /* Maximum length of output string in bytes */ + unsigned char *zOut; /* Output buffer */ + unsigned char *zIn; /* Input iterator */ + unsigned char *zTerm; /* End of input */ + unsigned char *z; /* Output iterator */ + unsigned int c; + + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( pMem->flags&MEM_Str ); + assert( pMem->enc!=desiredEnc ); + assert( pMem->enc!=0 ); + assert( pMem->n>=0 ); + +#if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) + { + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(pMem, &acc); + fprintf(stderr, "INPUT: %s\n", sqlite3StrAccumFinish(&acc)); + } +#endif + + /* If the translation is between UTF-16 little and big endian, then + ** all that is required is to swap the byte order. This case is handled + ** differently from the others. + */ + if( pMem->enc!=SQLITE_UTF8 && desiredEnc!=SQLITE_UTF8 ){ + u8 temp; + int rc; + rc = sqlite3VdbeMemMakeWriteable(pMem); + if( rc!=SQLITE_OK ){ + assert( rc==SQLITE_NOMEM ); + return SQLITE_NOMEM_BKPT; + } + zIn = (u8*)pMem->z; + zTerm = &zIn[pMem->n&~1]; + while( zInenc = desiredEnc; + goto translate_out; + } + + /* Set len to the maximum number of bytes required in the output buffer. */ + if( desiredEnc==SQLITE_UTF8 ){ + /* When converting from UTF-16, the maximum growth results from + ** translating a 2-byte character to a 4-byte UTF-8 character. + ** A single byte is required for the output string + ** nul-terminator. + */ + pMem->n &= ~1; + len = 2 * (sqlite3_int64)pMem->n + 1; + }else{ + /* When converting from UTF-8 to UTF-16 the maximum growth is caused + ** when a 1-byte UTF-8 character is translated into a 2-byte UTF-16 + ** character. Two bytes are required in the output buffer for the + ** nul-terminator. + */ + len = 2 * (sqlite3_int64)pMem->n + 2; + } + + /* Set zIn to point at the start of the input buffer and zTerm to point 1 + ** byte past the end. + ** + ** Variable zOut is set to point at the output buffer, space obtained + ** from sqlite3_malloc(). + */ + zIn = (u8*)pMem->z; + zTerm = &zIn[pMem->n]; + zOut = sqlite3DbMallocRaw(pMem->db, len); + if( !zOut ){ + return SQLITE_NOMEM_BKPT; + } + z = zOut; + + if( pMem->enc==SQLITE_UTF8 ){ + if( desiredEnc==SQLITE_UTF16LE ){ + /* UTF-8 -> UTF-16 Little-endian */ + while( zIn UTF-16 Big-endian */ + while( zInn = (int)(z - zOut); + *z++ = 0; + }else{ + assert( desiredEnc==SQLITE_UTF8 ); + if( pMem->enc==SQLITE_UTF16LE ){ + /* UTF-16 Little-endian -> UTF-8 */ + while( zIn=0xd800 && c<0xe000 ){ +#ifdef SQLITE_REPLACE_INVALID_UTF + if( c>=0xdc00 || zIn>=zTerm ){ + c = 0xfffd; + }else{ + int c2 = *(zIn++); + c2 += (*(zIn++))<<8; + if( c2<0xdc00 || c2>=0xe000 ){ + zIn -= 2; + c = 0xfffd; + }else{ + c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; + } + } +#else + if( zIn UTF-8 */ + while( zIn=0xd800 && c<0xe000 ){ +#ifdef SQLITE_REPLACE_INVALID_UTF + if( c>=0xdc00 || zIn>=zTerm ){ + c = 0xfffd; + }else{ + int c2 = (*(zIn++))<<8; + c2 += *(zIn++); + if( c2<0xdc00 || c2>=0xe000 ){ + zIn -= 2; + c = 0xfffd; + }else{ + c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; + } + } +#else + if( zInn = (int)(z - zOut); + } + *z = 0; + assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len ); + + c = MEM_Str|MEM_Term|(pMem->flags&(MEM_AffMask|MEM_Subtype)); + sqlite3VdbeMemRelease(pMem); + pMem->flags = c; + pMem->enc = desiredEnc; + pMem->z = (char*)zOut; + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->z); + +translate_out: +#if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG) + { + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(pMem, &acc); + fprintf(stderr, "OUTPUT: %s\n", sqlite3StrAccumFinish(&acc)); + } +#endif + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine checks for a byte-order mark at the beginning of the +** UTF-16 string stored in *pMem. If one is present, it is removed and +** the encoding of the Mem adjusted. This routine does not do any +** byte-swapping, it just sets Mem.enc appropriately. +** +** The allocation (static, dynamic etc.) and encoding of the Mem may be +** changed by this function. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){ + int rc = SQLITE_OK; + u8 bom = 0; + + assert( pMem->n>=0 ); + if( pMem->n>1 ){ + u8 b1 = *(u8 *)pMem->z; + u8 b2 = *(((u8 *)pMem->z) + 1); + if( b1==0xFE && b2==0xFF ){ + bom = SQLITE_UTF16BE; + } + if( b1==0xFF && b2==0xFE ){ + bom = SQLITE_UTF16LE; + } + } + + if( bom ){ + rc = sqlite3VdbeMemMakeWriteable(pMem); + if( rc==SQLITE_OK ){ + pMem->n -= 2; + memmove(pMem->z, &pMem->z[2], pMem->n); + pMem->z[pMem->n] = '\0'; + pMem->z[pMem->n+1] = '\0'; + pMem->flags |= MEM_Term; + pMem->enc = bom; + } + } + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** pZ is a UTF-8 encoded unicode string. If nByte is less than zero, +** return the number of unicode characters in pZ up to (but not including) +** the first 0x00 byte. If nByte is not less than zero, return the +** number of unicode characters in the first nByte of pZ (or up to +** the first 0x00, whichever comes first). +*/ +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *zIn, int nByte){ + int r = 0; + const u8 *z = (const u8*)zIn; + const u8 *zTerm; + if( nByte>=0 ){ + zTerm = &z[nByte]; + }else{ + zTerm = (const u8*)(-1); + } + assert( z<=zTerm ); + while( *z!=0 && zmallocFailed ){ + sqlite3VdbeMemRelease(&m); + m.z = 0; + } + assert( (m.flags & MEM_Term)!=0 || db->mallocFailed ); + assert( (m.flags & MEM_Str)!=0 || db->mallocFailed ); + assert( m.z || db->mallocFailed ); + return m.z; +} + +/* +** zIn is a UTF-16 encoded unicode string at least nChar characters long. +** Return the number of bytes in the first nChar unicode characters +** in pZ. nChar must be non-negative. +*/ +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ + int c; + unsigned char const *z = zIn; + int n = 0; + + if( SQLITE_UTF16NATIVE==SQLITE_UTF16LE ) z++; + while( n=0xd8 && c<0xdc && z[0]>=0xdc && z[0]<0xe0 ) z += 2; + n++; + } + return (int)(z-(unsigned char const *)zIn) + - (SQLITE_UTF16NATIVE==SQLITE_UTF16LE); +} + +#if defined(SQLITE_TEST) +/* +** This routine is called from the TCL test function "translate_selftest". +** It checks that the primitives for serializing and deserializing +** characters in each encoding are inverses of each other. +*/ +SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ + unsigned int i, t; + unsigned char zBuf[20]; + unsigned char *z; + int n; + unsigned int c; + + for(i=0; i<0x00110000; i++){ + z = zBuf; + WRITE_UTF8(z, i); + n = (int)(z-zBuf); + assert( n>0 && n<=4 ); + z[0] = 0; + z = zBuf; + c = sqlite3Utf8Read((const u8**)&z); + t = i; + if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD; + if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD; + assert( c==t ); + assert( (z-zBuf)==n ); + } +} +#endif /* SQLITE_TEST */ +#endif /* SQLITE_OMIT_UTF16 */ + +/************** End of utf.c *************************************************/ +/************** Begin file util.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Utility functions used throughout sqlite. +** +** This file contains functions for allocating memory, comparing +** strings, and stuff like that. +** +*/ +/* #include "sqliteInt.h" */ +/* #include */ +#ifndef SQLITE_OMIT_FLOATING_POINT +#include +#endif + +/* +** Calls to sqlite3FaultSim() are used to simulate a failure during testing, +** or to bypass normal error detection during testing in order to let +** execute proceed futher downstream. +** +** In deployment, sqlite3FaultSim() *always* return SQLITE_OK (0). The +** sqlite3FaultSim() function only returns non-zero during testing. +** +** During testing, if the test harness has set a fault-sim callback using +** a call to sqlite3_test_control(SQLITE_TESTCTRL_FAULT_INSTALL), then +** each call to sqlite3FaultSim() is relayed to that application-supplied +** callback and the integer return value form the application-supplied +** callback is returned by sqlite3FaultSim(). +** +** The integer argument to sqlite3FaultSim() is a code to identify which +** sqlite3FaultSim() instance is being invoked. Each call to sqlite3FaultSim() +** should have a unique code. To prevent legacy testing applications from +** breaking, the codes should not be changed or reused. +*/ +#ifndef SQLITE_UNTESTABLE +SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ + int (*xCallback)(int) = sqlite3GlobalConfig.xTestCallback; + return xCallback ? xCallback(iTest) : SQLITE_OK; +} +#endif + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Return true if the floating point value is Not a Number (NaN). +** +** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. +** Otherwise, we have our own implementation that works on most systems. +*/ +SQLITE_PRIVATE int sqlite3IsNaN(double x){ + int rc; /* The value return */ +#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN + u64 y; + memcpy(&y,&x,sizeof(y)); + rc = IsNaN(y); +#else + rc = isnan(x); +#endif /* HAVE_ISNAN */ + testcase( rc ); + return rc; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + +/* +** Compute a string length that is limited to what can be stored in +** lower 30 bits of a 32-bit signed integer. +** +** The value returned will never be negative. Nor will it ever be greater +** than the actual length of the string. For very long strings (greater +** than 1GiB) the value returned might be less than the true string length. +*/ +SQLITE_PRIVATE int sqlite3Strlen30(const char *z){ + if( z==0 ) return 0; + return 0x3fffffff & (int)strlen(z); +} + +/* +** Return the declared type of a column. Or return zDflt if the column +** has no declared type. +** +** The column type is an extra string stored after the zero-terminator on +** the column name if and only if the COLFLAG_HASTYPE flag is set. +*/ +SQLITE_PRIVATE char *sqlite3ColumnType(Column *pCol, char *zDflt){ + if( pCol->colFlags & COLFLAG_HASTYPE ){ + return pCol->zCnName + strlen(pCol->zCnName) + 1; + }else if( pCol->eCType ){ + assert( pCol->eCType<=SQLITE_N_STDTYPE ); + return (char*)sqlite3StdType[pCol->eCType-1]; + }else{ + return zDflt; + } +} + +/* +** Helper function for sqlite3Error() - called rarely. Broken out into +** a separate routine to avoid unnecessary register saves on entry to +** sqlite3Error(). +*/ +static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){ + if( db->pErr ) sqlite3ValueSetNull(db->pErr); + sqlite3SystemError(db, err_code); +} + +/* +** Set the current error code to err_code and clear any prior error message. +** Also set iSysErrno (by calling sqlite3System) if the err_code indicates +** that would be appropriate. +*/ +SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ + assert( db!=0 ); + db->errCode = err_code; + if( err_code || db->pErr ){ + sqlite3ErrorFinish(db, err_code); + }else{ + db->errByteOffset = -1; + } +} + +/* +** The equivalent of sqlite3Error(db, SQLITE_OK). Clear the error state +** and error message. +*/ +SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3 *db){ + assert( db!=0 ); + db->errCode = SQLITE_OK; + db->errByteOffset = -1; + if( db->pErr ) sqlite3ValueSetNull(db->pErr); +} + +/* +** Load the sqlite3.iSysErrno field if that is an appropriate thing +** to do based on the SQLite error code in rc. +*/ +SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ + if( rc==SQLITE_IOERR_NOMEM ) return; + rc &= 0xff; + if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ + db->iSysErrno = sqlite3OsGetLastError(db->pVfs); + } +} + +/* +** Set the most recent error code and error string for the sqlite +** handle "db". The error code is set to "err_code". +** +** If it is not NULL, string zFormat specifies the format of the +** error string. zFormat and any string tokens that follow it are +** assumed to be encoded in UTF-8. +** +** To clear the most recent error for sqlite handle "db", sqlite3Error +** should be called with err_code set to SQLITE_OK and zFormat set +** to NULL. +*/ +SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *zFormat, ...){ + assert( db!=0 ); + db->errCode = err_code; + sqlite3SystemError(db, err_code); + if( zFormat==0 ){ + sqlite3Error(db, err_code); + }else if( db->pErr || (db->pErr = sqlite3ValueNew(db))!=0 ){ + char *z; + va_list ap; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); + } +} + +/* +** Add an error message to pParse->zErrMsg and increment pParse->nErr. +** +** This function should be used to report any error that occurs while +** compiling an SQL statement (i.e. within sqlite3_prepare()). The +** last thing the sqlite3_prepare() function does is copy the error +** stored by this function into the database handle using sqlite3Error(). +** Functions sqlite3Error() or sqlite3ErrorWithMsg() should be used +** during statement execution (sqlite3_step() etc.). +*/ +SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ + char *zMsg; + va_list ap; + sqlite3 *db = pParse->db; + assert( db!=0 ); + assert( db->pParse==pParse ); + db->errByteOffset = -2; + va_start(ap, zFormat); + zMsg = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + if( db->errByteOffset<-1 ) db->errByteOffset = -1; + if( db->suppressErr ){ + sqlite3DbFree(db, zMsg); + if( db->mallocFailed ){ + pParse->nErr++; + pParse->rc = SQLITE_NOMEM; + } + }else{ + pParse->nErr++; + sqlite3DbFree(db, pParse->zErrMsg); + pParse->zErrMsg = zMsg; + pParse->rc = SQLITE_ERROR; + pParse->pWith = 0; + } +} + +/* +** If database connection db is currently parsing SQL, then transfer +** error code errCode to that parser if the parser has not already +** encountered some other kind of error. +*/ +SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3 *db, int errCode){ + Parse *pParse; + if( db==0 || (pParse = db->pParse)==0 ) return errCode; + pParse->rc = errCode; + pParse->nErr++; + return errCode; +} + +/* +** Convert an SQL-style quoted string into a normal string by removing +** the quote characters. The conversion is done in-place. If the +** input does not begin with a quote character, then this routine +** is a no-op. +** +** The input string must be zero-terminated. A new zero-terminator +** is added to the dequoted string. +** +** The return value is -1 if no dequoting occurs or the length of the +** dequoted string, exclusive of the zero terminator, if dequoting does +** occur. +** +** 2002-02-14: This routine is extended to remove MS-Access style +** brackets from around identifiers. For example: "[a-b-c]" becomes +** "a-b-c". +*/ +SQLITE_PRIVATE void sqlite3Dequote(char *z){ + char quote; + int i, j; + if( z==0 ) return; + quote = z[0]; + if( !sqlite3Isquote(quote) ) return; + if( quote=='[' ) quote = ']'; + for(i=1, j=0;; i++){ + assert( z[i] ); + if( z[i]==quote ){ + if( z[i+1]==quote ){ + z[j++] = quote; + i++; + }else{ + break; + } + }else{ + z[j++] = z[i]; + } + } + z[j] = 0; +} +SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){ + assert( !ExprHasProperty(p, EP_IntValue) ); + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} + +/* +** If the input token p is quoted, try to adjust the token to remove +** the quotes. This is not always possible: +** +** "abc" -> abc +** "ab""cd" -> (not possible because of the interior "") +** +** Remove the quotes if possible. This is a optimization. The overall +** system should still return the correct answer even if this routine +** is always a no-op. +*/ +SQLITE_PRIVATE void sqlite3DequoteToken(Token *p){ + unsigned int i; + if( p->n<2 ) return; + if( !sqlite3Isquote(p->z[0]) ) return; + for(i=1; in-1; i++){ + if( sqlite3Isquote(p->z[i]) ) return; + } + p->n -= 2; + p->z++; +} + +/* +** Generate a Token object from a string +*/ +SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){ + p->z = z; + p->n = sqlite3Strlen30(z); +} + +/* Convenient short-hand */ +#define UpperToLower sqlite3UpperToLower + +/* +** Some systems have stricmp(). Others have strcasecmp(). Because +** there is no consistency, we will define our own. +** +** IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and +** sqlite3_strnicmp() APIs allow applications and extensions to compare +** the contents of two buffers containing UTF-8 strings in a +** case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *zLeft, const char *zRight){ + if( zLeft==0 ){ + return zRight ? -1 : 0; + }else if( zRight==0 ){ + return 1; + } + return sqlite3StrICmp(zLeft, zRight); +} +SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *zRight){ + unsigned char *a, *b; + int c, x; + a = (unsigned char *)zLeft; + b = (unsigned char *)zRight; + for(;;){ + c = *a; + x = *b; + if( c==x ){ + if( c==0 ) break; + }else{ + c = (int)UpperToLower[c] - (int)UpperToLower[x]; + if( c ) break; + } + a++; + b++; + } + return c; +} +SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ + register unsigned char *a, *b; + if( zLeft==0 ){ + return zRight ? -1 : 0; + }else if( zRight==0 ){ + return 1; + } + a = (unsigned char *)zLeft; + b = (unsigned char *)zRight; + while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } + return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; +} + +/* +** Compute an 8-bit hash on a string that is insensitive to case differences +*/ +SQLITE_PRIVATE u8 sqlite3StrIHash(const char *z){ + u8 h = 0; + if( z==0 ) return 0; + while( z[0] ){ + h += UpperToLower[(unsigned char)z[0]]; + z++; + } + return h; +} + +/* +** Compute 10 to the E-th power. Examples: E==1 results in 10. +** E==2 results in 100. E==50 results in 1.0e50. +** +** This routine only works for values of E between 1 and 341. +*/ +static LONGDOUBLE_TYPE sqlite3Pow10(int E){ +#if defined(_MSC_VER) + static const LONGDOUBLE_TYPE x[] = { + 1.0e+001L, + 1.0e+002L, + 1.0e+004L, + 1.0e+008L, + 1.0e+016L, + 1.0e+032L, + 1.0e+064L, + 1.0e+128L, + 1.0e+256L + }; + LONGDOUBLE_TYPE r = 1.0; + int i; + assert( E>=0 && E<=307 ); + for(i=0; E!=0; i++, E >>=1){ + if( E & 1 ) r *= x[i]; + } + return r; +#else + LONGDOUBLE_TYPE x = 10.0; + LONGDOUBLE_TYPE r = 1.0; + while(1){ + if( E & 1 ) r *= x; + E >>= 1; + if( E==0 ) break; + x *= x; + } + return r; +#endif +} + +/* +** The string z[] is an text representation of a real number. +** Convert this string to a double and write it into *pResult. +** +** The string z[] is length bytes in length (bytes, not characters) and +** uses the encoding enc. The string is not necessarily zero-terminated. +** +** Return TRUE if the result is a valid real number (or integer) and FALSE +** if the string is empty or contains extraneous text. More specifically +** return +** 1 => The input string is a pure integer +** 2 or more => The input has a decimal point or eNNN clause +** 0 or less => The input string is not a valid number +** -1 => Not a valid number, but has a valid prefix which +** includes a decimal point and/or an eNNN clause +** +** Valid numbers are in one of these formats: +** +** [+-]digits[E[+-]digits] +** [+-]digits.[digits][E[+-]digits] +** [+-].digits[E[+-]digits] +** +** Leading and trailing whitespace is ignored for the purpose of determining +** validity. +** +** If some prefix of the input string is a valid number, this routine +** returns FALSE but it still converts the prefix and writes the result +** into *pResult. +*/ +#if defined(_MSC_VER) +#pragma warning(disable : 4756) +#endif +SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ +#ifndef SQLITE_OMIT_FLOATING_POINT + int incr; + const char *zEnd; + /* sign * significand * (10 ^ (esign * exponent)) */ + int sign = 1; /* sign of significand */ + i64 s = 0; /* significand */ + int d = 0; /* adjust exponent for shifting decimal point */ + int esign = 1; /* sign of exponent */ + int e = 0; /* exponent */ + int eValid = 1; /* True exponent is either not used or is well-formed */ + double result; + int nDigit = 0; /* Number of digits processed */ + int eType = 1; /* 1: pure integer, 2+: fractional -1 or less: bad UTF16 */ + + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + *pResult = 0.0; /* Default return value, in case of an error */ + if( length==0 ) return 0; + + if( enc==SQLITE_UTF8 ){ + incr = 1; + zEnd = z + length; + }else{ + int i; + incr = 2; + length &= ~1; + assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + testcase( enc==SQLITE_UTF16LE ); + testcase( enc==SQLITE_UTF16BE ); + for(i=3-enc; i=zEnd ) return 0; + + /* get sign of significand */ + if( *z=='-' ){ + sign = -1; + z+=incr; + }else if( *z=='+' ){ + z+=incr; + } + + /* copy max significant digits to significand */ + while( z=((LARGEST_INT64-9)/10) ){ + /* skip non-significant significand digits + ** (increase exponent by d to shift decimal left) */ + while( z=zEnd ) goto do_atof_calc; + + /* if decimal point is present */ + if( *z=='.' ){ + z+=incr; + eType++; + /* copy digits from after decimal to significand + ** (decrease exponent by d to shift decimal right) */ + while( z=zEnd ) goto do_atof_calc; + + /* if exponent is present */ + if( *z=='e' || *z=='E' ){ + z+=incr; + eValid = 0; + eType++; + + /* This branch is needed to avoid a (harmless) buffer overread. The + ** special comment alerts the mutation tester that the correct answer + ** is obtained even if the branch is omitted */ + if( z>=zEnd ) goto do_atof_calc; /*PREVENTS-HARMLESS-OVERREAD*/ + + /* get sign of exponent */ + if( *z=='-' ){ + esign = -1; + z+=incr; + }else if( *z=='+' ){ + z+=incr; + } + /* copy digits to exponent */ + while( z0 ){ /*OPTIMIZATION-IF-TRUE*/ + if( esign>0 ){ + if( s>=(LARGEST_INT64/10) ) break; /*OPTIMIZATION-IF-FALSE*/ + s *= 10; + }else{ + if( s%10!=0 ) break; /*OPTIMIZATION-IF-FALSE*/ + s /= 10; + } + e--; + } + + /* adjust the sign of significand */ + s = sign<0 ? -s : s; + + if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/ + result = (double)s; + }else{ + /* attempt to handle extremely small/large numbers better */ + if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/ + if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/ + LONGDOUBLE_TYPE scale = sqlite3Pow10(e-308); + if( esign<0 ){ + result = s / scale; + result /= 1.0e+308; + }else{ + result = s * scale; + result *= 1.0e+308; + } + }else{ assert( e>=342 ); + if( esign<0 ){ + result = 0.0*s; + }else{ +#ifdef INFINITY + result = INFINITY*s; +#else + result = 1e308*1e308*s; /* Infinity */ +#endif + } + } + }else{ + LONGDOUBLE_TYPE scale = sqlite3Pow10(e); + if( esign<0 ){ + result = s / scale; + }else{ + result = s * scale; + } + } + } + } + + /* store the result */ + *pResult = result; + + /* return true if number and no extra non-whitespace chracters after */ + if( z==zEnd && nDigit>0 && eValid && eType>0 ){ + return eType; + }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){ + return -1; + }else{ + return 0; + } +#else + return !sqlite3Atoi64(z, pResult, length, enc); +#endif /* SQLITE_OMIT_FLOATING_POINT */ +} +#if defined(_MSC_VER) +#pragma warning(default : 4756) +#endif + +/* +** Render an signed 64-bit integer as text. Store the result in zOut[]. +** +** The caller must ensure that zOut[] is at least 21 bytes in size. +*/ +SQLITE_PRIVATE void sqlite3Int64ToText(i64 v, char *zOut){ + int i; + u64 x; + char zTemp[22]; + if( v<0 ){ + x = (v==SMALLEST_INT64) ? ((u64)1)<<63 : (u64)-v; + }else{ + x = v; + } + i = sizeof(zTemp)-2; + zTemp[sizeof(zTemp)-1] = 0; + do{ + zTemp[i--] = (x%10) + '0'; + x = x/10; + }while( x ); + if( v<0 ) zTemp[i--] = '-'; + memcpy(zOut, &zTemp[i+1], sizeof(zTemp)-1-i); +} + +/* +** Compare the 19-character string zNum against the text representation +** value 2^63: 9223372036854775808. Return negative, zero, or positive +** if zNum is less than, equal to, or greater than the string. +** Note that zNum must contain exactly 19 characters. +** +** Unlike memcmp() this routine is guaranteed to return the difference +** in the values of the last digit if the only difference is in the +** last digit. So, for example, +** +** compare2pow63("9223372036854775800", 1) +** +** will return -8. +*/ +static int compare2pow63(const char *zNum, int incr){ + int c = 0; + int i; + /* 012345678901234567 */ + const char *pow63 = "922337203685477580"; + for(i=0; c==0 && i<18; i++){ + c = (zNum[i*incr]-pow63[i])*10; + } + if( c==0 ){ + c = zNum[18*incr] - '8'; + testcase( c==(-1) ); + testcase( c==0 ); + testcase( c==(+1) ); + } + return c; +} + +/* +** Convert zNum to a 64-bit signed integer. zNum must be decimal. This +** routine does *not* accept hexadecimal notation. +** +** Returns: +** +** -1 Not even a prefix of the input text looks like an integer +** 0 Successful transformation. Fits in a 64-bit signed integer. +** 1 Excess non-space text after the integer value +** 2 Integer too large for a 64-bit signed integer or is malformed +** 3 Special case of 9223372036854775808 +** +** length is the number of bytes in the string (bytes, not characters). +** The string is not necessarily zero-terminated. The encoding is +** given by enc. +*/ +SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){ + int incr; + u64 u = 0; + int neg = 0; /* assume positive */ + int i; + int c = 0; + int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + int rc; /* Baseline return code */ + const char *zStart; + const char *zEnd = zNum + length; + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + if( enc==SQLITE_UTF8 ){ + incr = 1; + }else{ + incr = 2; + length &= ~1; + assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + for(i=3-enc; i='0' && c<='9'; i+=incr){ + u = u*10 + c - '0'; + } + testcase( i==18*incr ); + testcase( i==19*incr ); + testcase( i==20*incr ); + if( u>LARGEST_INT64 ){ + /* This test and assignment is needed only to suppress UB warnings + ** from clang and -fsanitize=undefined. This test and assignment make + ** the code a little larger and slower, and no harm comes from omitting + ** them, but we must appaise the undefined-behavior pharisees. */ + *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; + }else if( neg ){ + *pNum = -(i64)u; + }else{ + *pNum = (i64)u; + } + rc = 0; + if( i==0 && zStart==zNum ){ /* No digits */ + rc = -1; + }else if( nonNum ){ /* UTF16 with high-order bytes non-zero */ + rc = 1; + }else if( &zNum[i]19*incr ? 1 : compare2pow63(zNum, incr); + if( c<0 ){ + /* zNum is less than 9223372036854775808 so it fits */ + assert( u<=LARGEST_INT64 ); + return rc; + }else{ + *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; + if( c>0 ){ + /* zNum is greater than 9223372036854775808 so it overflows */ + return 2; + }else{ + /* zNum is exactly 9223372036854775808. Fits if negative. The + ** special case 2 overflow if positive */ + assert( u-1==LARGEST_INT64 ); + return neg ? rc : 3; + } + } + } +} + +/* +** Transform a UTF-8 integer literal, in either decimal or hexadecimal, +** into a 64-bit signed integer. This routine accepts hexadecimal literals, +** whereas sqlite3Atoi64() does not. +** +** Returns: +** +** 0 Successful transformation. Fits in a 64-bit signed integer. +** 1 Excess text after the integer value +** 2 Integer too large for a 64-bit signed integer or is malformed +** 3 Special case of 9223372036854775808 +*/ +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ +#ifndef SQLITE_OMIT_HEX_INTEGER + if( z[0]=='0' + && (z[1]=='x' || z[1]=='X') + ){ + u64 u = 0; + int i, k; + for(i=2; z[i]=='0'; i++){} + for(k=i; sqlite3Isxdigit(z[k]); k++){ + u = u*16 + sqlite3HexToInt(z[k]); + } + memcpy(pOut, &u, 8); + return (z[k]==0 && k-i<=16) ? 0 : 2; + }else +#endif /* SQLITE_OMIT_HEX_INTEGER */ + { + return sqlite3Atoi64(z, pOut, sqlite3Strlen30(z), SQLITE_UTF8); + } +} + +/* +** If zNum represents an integer that will fit in 32-bits, then set +** *pValue to that integer and return true. Otherwise return false. +** +** This routine accepts both decimal and hexadecimal notation for integers. +** +** Any non-numeric characters that following zNum are ignored. +** This is different from sqlite3Atoi64() which requires the +** input number to be zero-terminated. +*/ +SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ + sqlite_int64 v = 0; + int i, c; + int neg = 0; + if( zNum[0]=='-' ){ + neg = 1; + zNum++; + }else if( zNum[0]=='+' ){ + zNum++; + } +#ifndef SQLITE_OMIT_HEX_INTEGER + else if( zNum[0]=='0' + && (zNum[1]=='x' || zNum[1]=='X') + && sqlite3Isxdigit(zNum[2]) + ){ + u32 u = 0; + zNum += 2; + while( zNum[0]=='0' ) zNum++; + for(i=0; sqlite3Isxdigit(zNum[i]) && i<8; i++){ + u = u*16 + sqlite3HexToInt(zNum[i]); + } + if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){ + memcpy(pValue, &u, 4); + return 1; + }else{ + return 0; + } + } +#endif + if( !sqlite3Isdigit(zNum[0]) ) return 0; + while( zNum[0]=='0' ) zNum++; + for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){ + v = v*10 + c; + } + + /* The longest decimal representation of a 32 bit integer is 10 digits: + ** + ** 1234567890 + ** 2^31 -> 2147483648 + */ + testcase( i==10 ); + if( i>10 ){ + return 0; + } + testcase( v-neg==2147483647 ); + if( v-neg>2147483647 ){ + return 0; + } + if( neg ){ + v = -v; + } + *pValue = (int)v; + return 1; +} + +/* +** Return a 32-bit integer value extracted from a string. If the +** string is not an integer, just return 0. +*/ +SQLITE_PRIVATE int sqlite3Atoi(const char *z){ + int x = 0; + sqlite3GetInt32(z, &x); + return x; +} + +/* +** Try to convert z into an unsigned 32-bit integer. Return true on +** success and false if there is an error. +** +** Only decimal notation is accepted. +*/ +SQLITE_PRIVATE int sqlite3GetUInt32(const char *z, u32 *pI){ + u64 v = 0; + int i; + for(i=0; sqlite3Isdigit(z[i]); i++){ + v = v*10 + z[i] - '0'; + if( v>4294967296LL ){ *pI = 0; return 0; } + } + if( i==0 || z[i]!=0 ){ *pI = 0; return 0; } + *pI = (u32)v; + return 1; +} + +/* +** The variable-length integer encoding is as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** C = xxxxxxxx 8 bits of data +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** 28 bits - BBBA +** 35 bits - BBBBA +** 42 bits - BBBBBA +** 49 bits - BBBBBBA +** 56 bits - BBBBBBBA +** 64 bits - BBBBBBBBC +*/ + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data write will be between 1 and 9 bytes. The number +** of bytes written is returned. +** +** A variable-length integer consists of the lower 7 bits of each byte +** for all bytes that have the 8th bit set and one byte with the 8th +** bit clear. Except, if we get to the 9th byte, it stores the full +** 8 bits and is the last byte. +*/ +static int SQLITE_NOINLINE putVarint64(unsigned char *p, u64 v){ + int i, j, n; + u8 buf[10]; + if( v & (((u64)0xff000000)<<32) ){ + p[8] = (u8)v; + v >>= 8; + for(i=7; i>=0; i--){ + p[i] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + } + return 9; + } + n = 0; + do{ + buf[n++] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + }while( v!=0 ); + buf[0] &= 0x7f; + assert( n<=9 ); + for(i=0, j=n-1; j>=0; j--, i++){ + p[i] = buf[j]; + } + return n; +} +SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){ + if( v<=0x7f ){ + p[0] = v&0x7f; + return 1; + } + if( v<=0x3fff ){ + p[0] = ((v>>7)&0x7f)|0x80; + p[1] = v&0x7f; + return 2; + } + return putVarint64(p,v); +} + +/* +** Bitmasks used by sqlite3GetVarint(). These precomputed constants +** are defined here rather than simply putting the constant expressions +** inline in order to work around bugs in the RVT compiler. +** +** SLOT_2_0 A mask for (0x7f<<14) | 0x7f +** +** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 +*/ +#define SLOT_2_0 0x001fc07f +#define SLOT_4_2_0 0xf01fc07f + + +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +*/ +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ + u32 a,b,s; + + if( ((signed char*)p)[0]>=0 ){ + *v = *p; + return 1; + } + if( ((signed char*)p)[1]>=0 ){ + *v = ((u32)(p[0]&0x7f)<<7) | p[1]; + return 2; + } + + /* Verify that constants are precomputed correctly */ + assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); + assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) ); + + a = ((u32)p[0])<<14; + b = p[1]; + p += 2; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_2_0; + b &= 0x7f; + b = b<<7; + a |= b; + *v = a; + return 3; + } + + /* CSE1 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_2_0; + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + *v = a; + return 4; + } + + /* a: p0<<14 | p2 (masked) */ + /* b: p1<<14 | p3 (unmasked) */ + /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + b &= SLOT_2_0; + s = a; + /* s: p0<<14 | p2 (masked) */ + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* we can skip these cause they were (effectively) done above + ** while calculating s */ + /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + /* b &= (0x7f<<14)|(0x7f); */ + b = b<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 5; + } + + /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + s = s<<7; + s |= b; + /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + + p++; + b = b<<14; + b |= *p; + /* b: p1<<28 | p3<<14 | p5 (unmasked) */ + if (!(b&0x80)) + { + /* we can skip this cause it was (effectively) done above in calc'ing s */ + /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + a &= SLOT_2_0; + a = a<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 6; + } + + p++; + a = a<<14; + a |= *p; + /* a: p2<<28 | p4<<14 | p6 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_4_2_0; + b &= SLOT_2_0; + b = b<<7; + a |= b; + s = s>>11; + *v = ((u64)s)<<32 | a; + return 7; + } + + /* CSE2 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p3<<28 | p5<<14 | p7 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_4_2_0; + /* moved CSE2 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + s = s>>4; + *v = ((u64)s)<<32 | a; + return 8; + } + + p++; + a = a<<15; + a |= *p; + /* a: p4<<29 | p6<<15 | p8 (unmasked) */ + + /* moved CSE2 up */ + /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ + b &= SLOT_2_0; + b = b<<8; + a |= b; + + s = s<<4; + b = p[-4]; + b &= 0x7f; + b = b>>3; + s |= b; + + *v = ((u64)s)<<32 | a; + + return 9; +} + +/* +** Read a 32-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +** +** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned +** integer, then set *v to 0xffffffff. +** +** A MACRO version, getVarint32, is provided which inlines the +** single-byte case. All code should use the MACRO version as +** this function assumes the single-byte case has already been handled. +*/ +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ + u32 a,b; + + /* The 1-byte case. Overwhelmingly the most common. Handled inline + ** by the getVarin32() macro */ + a = *p; + /* a: p0 (unmasked) */ +#ifndef getVarint32 + if (!(a&0x80)) + { + /* Values between 0 and 127 */ + *v = a; + return 1; + } +#endif + + /* The 2-byte case */ + p++; + b = *p; + /* b: p1 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 128 and 16383 */ + a &= 0x7f; + a = a<<7; + *v = a | b; + return 2; + } + + /* The 3-byte case */ + p++; + a = a<<14; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 16384 and 2097151 */ + a &= (0x7f<<14)|(0x7f); + b &= 0x7f; + b = b<<7; + *v = a | b; + return 3; + } + + /* A 32-bit varint is used to store size information in btrees. + ** Objects are rarely larger than 2MiB limit of a 3-byte varint. + ** A 3-byte varint is sufficient, for example, to record the size + ** of a 1048569-byte BLOB or string. + ** + ** We only unroll the first 1-, 2-, and 3- byte cases. The very + ** rare larger cases can be handled by the slower 64-bit varint + ** routine. + */ +#if 1 + { + u64 v64; + u8 n; + + n = sqlite3GetVarint(p-2, &v64); + assert( n>3 && n<=9 ); + if( (v64 & SQLITE_MAX_U32)!=v64 ){ + *v = 0xffffffff; + }else{ + *v = (u32)v64; + } + return n; + } + +#else + /* For following code (kept for historical record only) shows an + ** unrolling for the 3- and 4-byte varint cases. This code is + ** slightly faster, but it is also larger and much harder to test. + */ + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 2097152 and 268435455 */ + b &= (0x7f<<14)|(0x7f); + a &= (0x7f<<14)|(0x7f); + a = a<<7; + *v = a | b; + return 4; + } + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 268435456 and 34359738367 */ + a &= SLOT_4_2_0; + b &= SLOT_4_2_0; + b = b<<7; + *v = a | b; + return 5; + } + + /* We can only reach this point when reading a corrupt database + ** file. In that case we are not in any hurry. Use the (relatively + ** slow) general-purpose sqlite3GetVarint() routine to extract the + ** value. */ + { + u64 v64; + u8 n; + + p -= 4; + n = sqlite3GetVarint(p, &v64); + assert( n>5 && n<=9 ); + *v = (u32)v64; + return n; + } +#endif +} + +/* +** Return the number of bytes that will be needed to store the given +** 64-bit integer. +*/ +SQLITE_PRIVATE int sqlite3VarintLen(u64 v){ + int i; + for(i=1; (v >>= 7)!=0; i++){ assert( i<10 ); } + return i; +} + + +/* +** Read or write a four-byte big-endian integer value. +*/ +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8 *p){ +#if SQLITE_BYTEORDER==4321 + u32 x; + memcpy(&x,p,4); + return x; +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u32 x; + memcpy(&x,p,4); + return __builtin_bswap32(x); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u32 x; + memcpy(&x,p,4); + return _byteswap_ulong(x); +#else + testcase( p[0]&0x80 ); + return ((unsigned)p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; +#endif +} +SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){ +#if SQLITE_BYTEORDER==4321 + memcpy(p,&v,4); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u32 x = __builtin_bswap32(v); + memcpy(p,&x,4); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u32 x = _byteswap_ulong(v); + memcpy(p,&x,4); +#else + p[0] = (u8)(v>>24); + p[1] = (u8)(v>>16); + p[2] = (u8)(v>>8); + p[3] = (u8)v; +#endif +} + + + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +SQLITE_PRIVATE u8 sqlite3HexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_ASCII + h += 9*(1&(h>>6)); +#endif +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#endif + return (u8)(h & 0xf); +} + +/* BEGIN SQLCIPHER */ +#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC) +/* +** Convert a BLOB literal of the form "x'hhhhhh'" into its binary +** value. Return a pointer to its binary value. Space to hold the +** binary value has been obtained from malloc and must be freed by +** the calling routine. +*/ +SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ + char *zBlob; + int i; + + zBlob = (char *)sqlite3DbMallocRawNN(db, n/2 + 1); + n--; + if( zBlob ){ + for(i=0; ieOpenState; + if( eOpenState!=SQLITE_STATE_OPEN ){ + if( sqlite3SafetyCheckSickOrOk(db) ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + logBadConnection("unopened"); + } + return 0; + }else{ + return 1; + } +} +SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ + u8 eOpenState; + eOpenState = db->eOpenState; + if( eOpenState!=SQLITE_STATE_SICK && + eOpenState!=SQLITE_STATE_OPEN && + eOpenState!=SQLITE_STATE_BUSY ){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + logBadConnection("invalid"); + return 0; + }else{ + return 1; + } +} + +/* +** Attempt to add, substract, or multiply the 64-bit signed value iB against +** the other 64-bit signed integer at *pA and store the result in *pA. +** Return 0 on success. Or if the operation would have resulted in an +** overflow, leave *pA unchanged and return 1. +*/ +SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_add_overflow(*pA, iB, pA); +#else + i64 iA = *pA; + testcase( iA==0 ); testcase( iA==1 ); + testcase( iB==-1 ); testcase( iB==0 ); + if( iB>=0 ){ + testcase( iA>0 && LARGEST_INT64 - iA == iB ); + testcase( iA>0 && LARGEST_INT64 - iA == iB - 1 ); + if( iA>0 && LARGEST_INT64 - iA < iB ) return 1; + }else{ + testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 1 ); + testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 2 ); + if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1; + } + *pA += iB; + return 0; +#endif +} +SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_sub_overflow(*pA, iB, pA); +#else + testcase( iB==SMALLEST_INT64+1 ); + if( iB==SMALLEST_INT64 ){ + testcase( (*pA)==(-1) ); testcase( (*pA)==0 ); + if( (*pA)>=0 ) return 1; + *pA -= iB; + return 0; + }else{ + return sqlite3AddInt64(pA, -iB); + } +#endif +} +SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_mul_overflow(*pA, iB, pA); +#else + i64 iA = *pA; + if( iB>0 ){ + if( iA>LARGEST_INT64/iB ) return 1; + if( iA0 ){ + if( iBLARGEST_INT64/-iB ) return 1; + } + } + *pA = iA*iB; + return 0; +#endif +} + +/* +** Compute the absolute value of a 32-bit signed integer, of possible. Or +** if the integer has a value of -2147483648, return +2147483647 +*/ +SQLITE_PRIVATE int sqlite3AbsInt32(int x){ + if( x>=0 ) return x; + if( x==(int)0x80000000 ) return 0x7fffffff; + return -x; +} + +#ifdef SQLITE_ENABLE_8_3_NAMES +/* +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBaseFilename, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = sqlite3Strlen30(z); + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && ALWAYS(sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4); + } +} +#endif + +/* +** Find (an approximate) sum of two LogEst values. This computation is +** not a simple "+" operator because LogEst is stored as a logarithmic +** value. +** +*/ +SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst a, LogEst b){ + static const unsigned char x[] = { + 10, 10, /* 0,1 */ + 9, 9, /* 2,3 */ + 8, 8, /* 4,5 */ + 7, 7, 7, /* 6,7,8 */ + 6, 6, 6, /* 9,10,11 */ + 5, 5, 5, /* 12-14 */ + 4, 4, 4, 4, /* 15-18 */ + 3, 3, 3, 3, 3, 3, /* 19-24 */ + 2, 2, 2, 2, 2, 2, 2, /* 25-31 */ + }; + if( a>=b ){ + if( a>b+49 ) return a; + if( a>b+31 ) return a+1; + return a+x[a-b]; + }else{ + if( b>a+49 ) return b; + if( b>a+31 ) return b+1; + return b+x[b-a]; + } +} + +/* +** Convert an integer into a LogEst. In other words, compute an +** approximation for 10*log2(x). +*/ +SQLITE_PRIVATE LogEst sqlite3LogEst(u64 x){ + static LogEst a[] = { 0, 2, 3, 5, 6, 7, 8, 9 }; + LogEst y = 40; + if( x<8 ){ + if( x<2 ) return 0; + while( x<8 ){ y -= 10; x <<= 1; } + }else{ +#if GCC_VERSION>=5004000 + int i = 60 - __builtin_clzll(x); + y += i*10; + x >>= i; +#else + while( x>255 ){ y += 40; x >>= 4; } /*OPTIMIZATION-IF-TRUE*/ + while( x>15 ){ y += 10; x >>= 1; } +#endif + } + return a[x&7] + y - 10; +} + +/* +** Convert a double into a LogEst +** In other words, compute an approximation for 10*log2(x). +*/ +SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){ + u64 a; + LogEst e; + assert( sizeof(x)==8 && sizeof(a)==8 ); + if( x<=1 ) return 0; + if( x<=2000000000 ) return sqlite3LogEst((u64)x); + memcpy(&a, &x, 8); + e = (a>>52) - 1022; + return e*10; +} + +/* +** Convert a LogEst into an integer. +*/ +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ + u64 n; + n = x%10; + x /= 10; + if( n>=5 ) n -= 2; + else if( n>=1 ) n -= 1; + if( x>60 ) return (u64)LARGEST_INT64; + return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); +} + +/* +** Add a new name/number pair to a VList. This might require that the +** VList object be reallocated, so return the new VList. If an OOM +** error occurs, the original VList returned and the +** db->mallocFailed flag is set. +** +** A VList is really just an array of integers. To destroy a VList, +** simply pass it to sqlite3DbFree(). +** +** The first integer is the number of integers allocated for the whole +** VList. The second integer is the number of integers actually used. +** Each name/number pair is encoded by subsequent groups of 3 or more +** integers. +** +** Each name/number pair starts with two integers which are the numeric +** value for the pair and the size of the name/number pair, respectively. +** The text name overlays one or more following integers. The text name +** is always zero-terminated. +** +** Conceptually: +** +** struct VList { +** int nAlloc; // Number of allocated slots +** int nUsed; // Number of used slots +** struct VListEntry { +** int iValue; // Value for this entry +** int nSlot; // Slots used by this entry +** // ... variable name goes here +** } a[0]; +** } +** +** During code generation, pointers to the variable names within the +** VList are taken. When that happens, nAlloc is set to zero as an +** indication that the VList may never again be enlarged, since the +** accompanying realloc() would invalidate the pointers. +*/ +SQLITE_PRIVATE VList *sqlite3VListAdd( + sqlite3 *db, /* The database connection used for malloc() */ + VList *pIn, /* The input VList. Might be NULL */ + const char *zName, /* Name of symbol to add */ + int nName, /* Bytes of text in zName */ + int iVal /* Value to associate with zName */ +){ + int nInt; /* number of sizeof(int) objects needed for zName */ + char *z; /* Pointer to where zName will be stored */ + int i; /* Index in pIn[] where zName is stored */ + + nInt = nName/4 + 3; + assert( pIn==0 || pIn[0]>=3 ); /* Verify ok to add new elements */ + if( pIn==0 || pIn[1]+nInt > pIn[0] ){ + /* Enlarge the allocation */ + sqlite3_int64 nAlloc = (pIn ? 2*(sqlite3_int64)pIn[0] : 10) + nInt; + VList *pOut = sqlite3DbRealloc(db, pIn, nAlloc*sizeof(int)); + if( pOut==0 ) return pIn; + if( pIn==0 ) pOut[1] = 2; + pIn = pOut; + pIn[0] = nAlloc; + } + i = pIn[1]; + pIn[i] = iVal; + pIn[i+1] = nInt; + z = (char*)&pIn[i+2]; + pIn[1] = i+nInt; + assert( pIn[1]<=pIn[0] ); + memcpy(z, zName, nName); + z[nName] = 0; + return pIn; +} + +/* +** Return a pointer to the name of a variable in the given VList that +** has the value iVal. Or return a NULL if there is no such variable in +** the list +*/ +SQLITE_PRIVATE const char *sqlite3VListNumToName(VList *pIn, int iVal){ + int i, mx; + if( pIn==0 ) return 0; + mx = pIn[1]; + i = 2; + do{ + if( pIn[i]==iVal ) return (char*)&pIn[i+2]; + i += pIn[i+1]; + }while( i */ + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew){ + assert( pNew!=0 ); + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +SQLITE_PRIVATE void sqlite3HashClear(Hash *pH){ + HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + sqlite3_free(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + HashElem *next_elem = elem->next; + sqlite3_free(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** The hashing function. +*/ +static unsigned int strHash(const char *z){ + unsigned int h = 0; + unsigned char c; + while( (c = (unsigned char)*z++)!=0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Knuth multiplicative hashing. (Sorting & Searching, p. 510). + ** 0x9e3779b1 is 2654435761 which is the closest prime number to + ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. */ + h += sqlite3UpperToLower[c]; + h *= 0x9e3779b1; + } + return h; +} + + +/* Link pNew element into the hash table pH. If pEntry!=0 then also +** insert pNew into the pEntry hash bucket. +*/ +static void insertElement( + Hash *pH, /* The complete hash table */ + struct _ht *pEntry, /* The entry into which pNew is inserted */ + HashElem *pNew /* The element to be inserted */ +){ + HashElem *pHead; /* First element already in pEntry */ + if( pEntry ){ + pHead = pEntry->count ? pEntry->chain : 0; + pEntry->count++; + pEntry->chain = pNew; + }else{ + pHead = 0; + } + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** +** The hash table might fail to resize if sqlite3_malloc() fails or +** if the new size is the same as the prior size. +** Return TRUE if the resize occurs and false if not. +*/ +static int rehash(Hash *pH, unsigned int new_size){ + struct _ht *new_ht; /* The new hash table */ + HashElem *elem, *next_elem; /* For looping over existing elements */ + +#if SQLITE_MALLOC_SOFT_LIMIT>0 + if( new_size*sizeof(struct _ht)>SQLITE_MALLOC_SOFT_LIMIT ){ + new_size = SQLITE_MALLOC_SOFT_LIMIT/sizeof(struct _ht); + } + if( new_size==pH->htsize ) return 0; +#endif + + /* The inability to allocates space for a larger hash table is + ** a performance hit but it is not a fatal error. So mark the + ** allocation as a benign. Use sqlite3Malloc()/memset(0) instead of + ** sqlite3MallocZero() to make the allocation, as sqlite3MallocZero() + ** only zeroes the requested number of bytes whereas this module will + ** use the actual amount of space allocated for the hash table (which + ** may be larger than the requested amount). + */ + sqlite3BeginBenignMalloc(); + new_ht = (struct _ht *)sqlite3Malloc( new_size*sizeof(struct _ht) ); + sqlite3EndBenignMalloc(); + + if( new_ht==0 ) return 0; + sqlite3_free(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size = sqlite3MallocSize(new_ht)/sizeof(struct _ht); + memset(new_ht, 0, new_size*sizeof(struct _ht)); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + unsigned int h = strHash(elem->pKey) % new_size; + next_elem = elem->next; + insertElement(pH, &new_ht[h], elem); + } + return 1; +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. If no element is found, +** a pointer to a static null element with HashElem.data==0 is returned. +** If pH is not NULL, then the hash for this key is written to *pH. +*/ +static HashElem *findElementWithHash( + const Hash *pH, /* The pH to be searched */ + const char *pKey, /* The key we are searching for */ + unsigned int *pHash /* Write the hash value here */ +){ + HashElem *elem; /* Used to loop thru the element list */ + unsigned int count; /* Number of elements left to test */ + unsigned int h; /* The computed hash */ + static HashElem nullElement = { 0, 0, 0, 0 }; + + if( pH->ht ){ /*OPTIMIZATION-IF-TRUE*/ + struct _ht *pEntry; + h = strHash(pKey) % pH->htsize; + pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + }else{ + h = 0; + elem = pH->first; + count = pH->count; + } + if( pHash ) *pHash = h; + while( count-- ){ + assert( elem!=0 ); + if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ + return elem; + } + elem = elem->next; + } + return &nullElement; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void removeElementGivenHash( + Hash *pH, /* The pH containing "elem" */ + HashElem* elem, /* The element to be removed from the pH */ + unsigned int h /* Hash value for the element */ +){ + struct _ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + if( pH->ht ){ + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + assert( pEntry->count>0 ); + pEntry->count--; + } + sqlite3_free( elem ); + pH->count--; + if( pH->count==0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + sqlite3HashClear(pH); + } +} + +/* Attempt to locate an element of the hash table pH with a key +** that matches pKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey){ + assert( pH!=0 ); + assert( pKey!=0 ); + return findElementWithHash(pH, pKey, 0)->data; +} + +/* Insert an element into the hash table pH. The key is pKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created and NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ + unsigned int h; /* the hash of the key modulo hash table size */ + HashElem *elem; /* Used to loop thru the element list */ + HashElem *new_elem; /* New element added to the pH */ + + assert( pH!=0 ); + assert( pKey!=0 ); + elem = findElementWithHash(pH,pKey,&h); + if( elem->data ){ + void *old_data = elem->data; + if( data==0 ){ + removeElementGivenHash(pH,elem,h); + }else{ + elem->data = data; + elem->pKey = pKey; + } + return old_data; + } + if( data==0 ) return 0; + new_elem = (HashElem*)sqlite3Malloc( sizeof(HashElem) ); + if( new_elem==0 ) return data; + new_elem->pKey = pKey; + new_elem->data = data; + pH->count++; + if( pH->count>=10 && pH->count > 2*pH->htsize ){ + if( rehash(pH, pH->count*2) ){ + assert( pH->htsize>0 ); + h = strHash(pKey) % pH->htsize; + } + } + insertElement(pH, pH->ht ? &pH->ht[h] : 0, new_elem); + return 0; +} + +/************** End of hash.c ************************************************/ +/************** Begin file opcodes.c *****************************************/ +/* Automatically generated. Do not edit */ +/* See the tool/mkopcodec.tcl script for details. */ +#if !defined(SQLITE_OMIT_EXPLAIN) \ + || defined(VDBE_PROFILE) \ + || defined(SQLITE_DEBUG) +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG) +# define OpHelp(X) "\0" X +#else +# define OpHelp(X) +#endif +SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ + static const char *const azName[] = { + /* 0 */ "Savepoint" OpHelp(""), + /* 1 */ "AutoCommit" OpHelp(""), + /* 2 */ "Transaction" OpHelp(""), + /* 3 */ "Checkpoint" OpHelp(""), + /* 4 */ "JournalMode" OpHelp(""), + /* 5 */ "Vacuum" OpHelp(""), + /* 6 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), + /* 7 */ "VUpdate" OpHelp("data=r[P3@P2]"), + /* 8 */ "Goto" OpHelp(""), + /* 9 */ "Gosub" OpHelp(""), + /* 10 */ "InitCoroutine" OpHelp(""), + /* 11 */ "Yield" OpHelp(""), + /* 12 */ "MustBeInt" OpHelp(""), + /* 13 */ "Jump" OpHelp(""), + /* 14 */ "Once" OpHelp(""), + /* 15 */ "If" OpHelp(""), + /* 16 */ "IfNot" OpHelp(""), + /* 17 */ "IsNullOrType" OpHelp("if typeof(r[P1]) IN (P3,5) goto P2"), + /* 18 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), + /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), + /* 20 */ "SeekLT" OpHelp("key=r[P3@P4]"), + /* 21 */ "SeekLE" OpHelp("key=r[P3@P4]"), + /* 22 */ "SeekGE" OpHelp("key=r[P3@P4]"), + /* 23 */ "SeekGT" OpHelp("key=r[P3@P4]"), + /* 24 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), + /* 25 */ "IfNoHope" OpHelp("key=r[P3@P4]"), + /* 26 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 27 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 28 */ "Found" OpHelp("key=r[P3@P4]"), + /* 29 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 30 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 31 */ "Last" OpHelp(""), + /* 32 */ "IfSmaller" OpHelp(""), + /* 33 */ "SorterSort" OpHelp(""), + /* 34 */ "Sort" OpHelp(""), + /* 35 */ "Rewind" OpHelp(""), + /* 36 */ "SorterNext" OpHelp(""), + /* 37 */ "Prev" OpHelp(""), + /* 38 */ "Next" OpHelp(""), + /* 39 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 40 */ "IdxGT" OpHelp("key=r[P3@P4]"), + /* 41 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 42 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), + /* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), + /* 45 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), + /* 46 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 47 */ "Program" OpHelp(""), + /* 48 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), + /* 49 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), + /* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), + /* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), + /* 53 */ "Eq" OpHelp("IF r[P3]==r[P1]"), + /* 54 */ "Gt" OpHelp("IF r[P3]>r[P1]"), + /* 55 */ "Le" OpHelp("IF r[P3]<=r[P1]"), + /* 56 */ "Lt" OpHelp("IF r[P3]=r[P1]"), + /* 58 */ "ElseEq" OpHelp(""), + /* 59 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), + /* 60 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 61 */ "IncrVacuum" OpHelp(""), + /* 62 */ "VNext" OpHelp(""), + /* 63 */ "Filter" OpHelp("if key(P3@P4) not in filter(P1) goto P2"), + /* 64 */ "Init" OpHelp("Start at P2"), + /* 65 */ "PureFunc" OpHelp("r[P3]=func(r[P2@NP])"), + /* 66 */ "Function" OpHelp("r[P3]=func(r[P2@NP])"), + /* 67 */ "Return" OpHelp(""), + /* 68 */ "EndCoroutine" OpHelp(""), + /* 69 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 70 */ "Halt" OpHelp(""), + /* 71 */ "Integer" OpHelp("r[P2]=P1"), + /* 72 */ "Int64" OpHelp("r[P2]=P4"), + /* 73 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 74 */ "BeginSubrtn" OpHelp("r[P2]=NULL"), + /* 75 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 76 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 77 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 79 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 80 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 81 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 82 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 83 */ "FkCheck" OpHelp(""), + /* 84 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 85 */ "CollSeq" OpHelp(""), + /* 86 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 87 */ "RealAffinity" OpHelp(""), + /* 88 */ "Cast" OpHelp("affinity(r[P1])"), + /* 89 */ "Permutation" OpHelp(""), + /* 90 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 91 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 92 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), + /* 93 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 94 */ "Column" OpHelp("r[P3]=PX cursor P1 column P2"), + /* 95 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), + /* 96 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 97 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 98 */ "Count" OpHelp("r[P2]=count()"), + /* 99 */ "ReadCookie" OpHelp(""), + /* 100 */ "SetCookie" OpHelp(""), + /* 101 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 102 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 103 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 104 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), + /* 106 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 107 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 108 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 109 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 110 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 111 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), + /* 112 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 113 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 114 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), + /* 115 */ "OpenDup" OpHelp(""), + /* 116 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 117 */ "String8" OpHelp("r[P2]='P4'"), + /* 118 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 119 */ "SorterOpen" OpHelp(""), + /* 120 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), + /* 121 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 122 */ "Close" OpHelp(""), + /* 123 */ "ColumnsUsed" OpHelp(""), + /* 124 */ "SeekScan" OpHelp("Scan-ahead up to P1 rows"), + /* 125 */ "SeekHit" OpHelp("set P2<=seekHit<=P3"), + /* 126 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), + /* 127 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 128 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), + /* 129 */ "RowCell" OpHelp(""), + /* 130 */ "Delete" OpHelp(""), + /* 131 */ "ResetCount" OpHelp(""), + /* 132 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 133 */ "SorterData" OpHelp("r[P2]=data"), + /* 134 */ "RowData" OpHelp("r[P2]=data"), + /* 135 */ "Rowid" OpHelp("r[P2]=PX rowid of P1"), + /* 136 */ "NullRow" OpHelp(""), + /* 137 */ "SeekEnd" OpHelp(""), + /* 138 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 139 */ "SorterInsert" OpHelp("key=r[P2]"), + /* 140 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 141 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), + /* 142 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 143 */ "FinishSeek" OpHelp(""), + /* 144 */ "Destroy" OpHelp(""), + /* 145 */ "Clear" OpHelp(""), + /* 146 */ "ResetSorter" OpHelp(""), + /* 147 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), + /* 148 */ "SqlExec" OpHelp(""), + /* 149 */ "ParseSchema" OpHelp(""), + /* 150 */ "LoadAnalysis" OpHelp(""), + /* 151 */ "DropTable" OpHelp(""), + /* 152 */ "DropIndex" OpHelp(""), + /* 153 */ "Real" OpHelp("r[P2]=P4"), + /* 154 */ "DropTrigger" OpHelp(""), + /* 155 */ "IntegrityCk" OpHelp(""), + /* 156 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 157 */ "Param" OpHelp(""), + /* 158 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 159 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 160 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 161 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 162 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 163 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 164 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 165 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 166 */ "Expire" OpHelp(""), + /* 167 */ "CursorLock" OpHelp(""), + /* 168 */ "CursorUnlock" OpHelp(""), + /* 169 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 170 */ "VBegin" OpHelp(""), + /* 171 */ "VCreate" OpHelp(""), + /* 172 */ "VDestroy" OpHelp(""), + /* 173 */ "VOpen" OpHelp(""), + /* 174 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), + /* 175 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 176 */ "VRename" OpHelp(""), + /* 177 */ "Pagecount" OpHelp(""), + /* 178 */ "MaxPgcnt" OpHelp(""), + /* 179 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), + /* 180 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), + /* 181 */ "Trace" OpHelp(""), + /* 182 */ "CursorHint" OpHelp(""), + /* 183 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 184 */ "Noop" OpHelp(""), + /* 185 */ "Explain" OpHelp(""), + /* 186 */ "Abortable" OpHelp(""), + }; + return azName[i]; +} +#endif + +/************** End of opcodes.c *********************************************/ +/************** Begin file os_unix.c *****************************************/ +/* +** 2004 May 22 +** +** 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 contains the VFS implementation for unix-like operating systems +** include Linux, MacOSX, *BSD, QNX, VxWorks, AIX, HPUX, and others. +** +** There are actually several different VFS implementations in this file. +** The differences are in the way that file locking is done. The default +** implementation uses Posix Advisory Locks. Alternative implementations +** use flock(), dot-files, various proprietary locking schemas, or simply +** skip locking all together. +** +** This source file is organized into divisions where the logic for various +** subfunctions is contained within the appropriate division. PLEASE +** KEEP THE STRUCTURE OF THIS FILE INTACT. New code should be placed +** in the correct division and should be clearly labeled. +** +** The layout of divisions is as follows: +** +** * General-purpose declarations and utility functions. +** * Unique file ID logic used by VxWorks. +** * Various locking primitive implementations (all except proxy locking): +** + for Posix Advisory Locks +** + for no-op locks +** + for dot-file locks +** + for flock() locking +** + for named semaphore locks (VxWorks only) +** + for AFP filesystem locks (MacOSX only) +** * sqlite3_file methods not associated with locking. +** * Definitions of sqlite3_io_methods objects for all locking +** methods plus "finder" functions for each locking method. +** * sqlite3_vfs method implementations. +** * Locking primitives for the proxy uber-locking-method. (MacOSX only) +** * Definitions of sqlite3_vfs objects for all locking methods +** plus implementations of sqlite3_os_init() and sqlite3_os_end(). +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_UNIX /* This file is used on unix only */ + +/* +** There are various methods for file locking used for concurrency +** control: +** +** 1. POSIX locking (the default), +** 2. No locking, +** 3. Dot-file locking, +** 4. flock() locking, +** 5. AFP locking (OSX only), +** 6. Named POSIX semaphores (VXWorks only), +** 7. proxy locking. (OSX only) +** +** Styles 4, 5, and 7 are only available of SQLITE_ENABLE_LOCKING_STYLE +** is defined to 1. The SQLITE_ENABLE_LOCKING_STYLE also enables automatic +** selection of the appropriate locking style based on the filesystem +** where the database is located. +*/ +#if !defined(SQLITE_ENABLE_LOCKING_STYLE) +# if defined(__APPLE__) +# define SQLITE_ENABLE_LOCKING_STYLE 1 +# else +# define SQLITE_ENABLE_LOCKING_STYLE 0 +# endif +#endif + +/* Use pread() and pwrite() if they are available */ +#if defined(__APPLE__) +# define HAVE_PREAD 1 +# define HAVE_PWRITE 1 +#endif +#if defined(HAVE_PREAD64) && defined(HAVE_PWRITE64) +# undef USE_PREAD +# define USE_PREAD64 1 +#elif defined(HAVE_PREAD) && defined(HAVE_PWRITE) +# undef USE_PREAD64 +# define USE_PREAD 1 +#endif + +/* +** standard include files. +*/ +#include +#include +#include +#include +#include +/* #include */ +#include +#include +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 +# include +#endif + +#if SQLITE_ENABLE_LOCKING_STYLE +/* # include */ +# include +# include +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + +/* +** Try to determine if gethostuuid() is available based on standard +** macros. This might sometimes compute the wrong value for some +** obscure platforms. For those cases, simply compile with one of +** the following: +** +** -DHAVE_GETHOSTUUID=0 +** -DHAVE_GETHOSTUUID=1 +** +** None if this matters except when building on Apple products with +** -DSQLITE_ENABLE_LOCKING_STYLE. +*/ +#ifndef HAVE_GETHOSTUUID +# define HAVE_GETHOSTUUID 0 +# if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ + (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) +# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ + && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0))\ + && (!defined(TARGET_OS_MACCATALYST) || (TARGET_OS_MACCATALYST==0)) +# undef HAVE_GETHOSTUUID +# define HAVE_GETHOSTUUID 1 +# else +# warning "gethostuuid() is disabled." +# endif +# endif +#endif + + +#if OS_VXWORKS +/* # include */ +# include +# include +#endif /* OS_VXWORKS */ + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE +# include +#endif + +#ifdef HAVE_UTIME +# include +#endif + +/* +** Allowed values of unixFile.fsFlags +*/ +#define SQLITE_FSFLAGS_IS_MSDOS 0x1 + +/* +** If we are to be thread-safe, include the pthreads header. +*/ +#if SQLITE_THREADSAFE +/* # include */ +#endif + +/* +** Default permissions when creating a new file +*/ +#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS +# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 +#endif + +/* +** Default permissions when creating auto proxy dir +*/ +#ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS +# define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 +#endif + +/* +** Maximum supported path-length. +*/ +#define MAX_PATHNAME 512 + +/* +** Maximum supported symbolic links +*/ +#define SQLITE_MAX_SYMLINKS 100 + +/* Always cast the getpid() return type for compatibility with +** kernel modules in VxWorks. */ +#define osGetpid(X) (pid_t)getpid() + +/* +** Only set the lastErrno if the error code is a real error and not +** a normal expected return code of SQLITE_BUSY or SQLITE_OK +*/ +#define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY)) + +/* Forward references */ +typedef struct unixShm unixShm; /* Connection shared memory */ +typedef struct unixShmNode unixShmNode; /* Shared memory instance */ +typedef struct unixInodeInfo unixInodeInfo; /* An i-node */ +typedef struct UnixUnusedFd UnixUnusedFd; /* An unused file descriptor */ + +/* +** Sometimes, after a file handle is closed by SQLite, the file descriptor +** cannot be closed immediately. In these cases, instances of the following +** structure are used to store the file descriptor while waiting for an +** opportunity to either close or reuse it. +*/ +struct UnixUnusedFd { + int fd; /* File descriptor to close */ + int flags; /* Flags this file descriptor was opened with */ + UnixUnusedFd *pNext; /* Next unused file descriptor on same file */ +}; + +/* +** The unixFile structure is subclass of sqlite3_file specific to the unix +** VFS implementations. +*/ +typedef struct unixFile unixFile; +struct unixFile { + sqlite3_io_methods const *pMethod; /* Always the first entry */ + sqlite3_vfs *pVfs; /* The VFS that created this unixFile */ + unixInodeInfo *pInode; /* Info about locks on this inode */ + int h; /* The file descriptor */ + unsigned char eFileLock; /* The type of lock held on this fd */ + unsigned short int ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ + int lastErrno; /* The unix errno from last I/O error */ + void *lockingContext; /* Locking style specific state */ + UnixUnusedFd *pPreallocatedUnused; /* Pre-allocated UnixUnusedFd */ + const char *zPath; /* Name of the file */ + unixShm *pShm; /* Shared memory segment information */ + int szChunk; /* Configured by FCNTL_CHUNK_SIZE */ +#if SQLITE_MAX_MMAP_SIZE>0 + int nFetchOut; /* Number of outstanding xFetch refs */ + sqlite3_int64 mmapSize; /* Usable size of mapping at pMapRegion */ + sqlite3_int64 mmapSizeActual; /* Actual size of mapping at pMapRegion */ + sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ + void *pMapRegion; /* Memory mapped region */ +#endif + int sectorSize; /* Device sector size */ + int deviceCharacteristics; /* Precomputed device characteristics */ +#if SQLITE_ENABLE_LOCKING_STYLE + int openFlags; /* The flags specified at open() */ +#endif +#if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) + unsigned fsFlags; /* cached details from statfs() */ +#endif +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + unsigned iBusyTimeout; /* Wait this many millisec on locks */ +#endif +#if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID */ +#endif +#ifdef SQLITE_DEBUG + /* The next group of variables are used to track whether or not the + ** transaction counter in bytes 24-27 of database files are updated + ** whenever any part of the database changes. An assertion fault will + ** occur if a file is updated without also updating the transaction + ** counter. This test is made to avoid new problems similar to the + ** one described by ticket #3584. + */ + unsigned char transCntrChng; /* True if the transaction counter changed */ + unsigned char dbUpdate; /* True if any part of database file changed */ + unsigned char inNormalWrite; /* True if in a normal write operation */ + +#endif + +#ifdef SQLITE_TEST + /* In test mode, increase the size of this structure a bit so that + ** it is larger than the struct CrashFile defined in test6.c. + */ + char aPadding[32]; +#endif +}; + +/* This variable holds the process id (pid) from when the xRandomness() +** method was called. If xOpen() is called from a different process id, +** indicating that a fork() has occurred, the PRNG will be reset. +*/ +static pid_t randomnessPid = 0; + +/* +** Allowed values for the unixFile.ctrlFlags bitmask: +*/ +#define UNIXFILE_EXCL 0x01 /* Connections from one process only */ +#define UNIXFILE_RDONLY 0x02 /* Connection is read only */ +#define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ +#ifndef SQLITE_DISABLE_DIRSYNC +# define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */ +#else +# define UNIXFILE_DIRSYNC 0x00 +#endif +#define UNIXFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +#define UNIXFILE_DELETE 0x20 /* Delete on close */ +#define UNIXFILE_URI 0x40 /* Filename might have query parameters */ +#define UNIXFILE_NOLOCK 0x80 /* Do no file locking */ + +/* +** Include code that is common to all os_*.c files +*/ +/* #include "os_common.h" */ + +/* +** Define various macros that are missing from some systems. +*/ +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifdef SQLITE_DISABLE_LFS +# undef O_LARGEFILE +# define O_LARGEFILE 0 +#endif +#ifndef O_NOFOLLOW +# define O_NOFOLLOW 0 +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* +** The threadid macro resolves to the thread-id or to 0. Used for +** testing and debugging only. +*/ +#if SQLITE_THREADSAFE +#define threadid pthread_self() +#else +#define threadid 0 +#endif + +/* +** HAVE_MREMAP defaults to true on Linux and false everywhere else. +*/ +#if !defined(HAVE_MREMAP) +# if defined(__linux__) && defined(_GNU_SOURCE) +# define HAVE_MREMAP 1 +# else +# define HAVE_MREMAP 0 +# endif +#endif + +/* +** Explicitly call the 64-bit version of lseek() on Android. Otherwise, lseek() +** is the 32-bit version, even if _FILE_OFFSET_BITS=64 is defined. +*/ +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +#ifdef __linux__ +/* +** Linux-specific IOCTL magic numbers used for controlling F2FS +*/ +#define F2FS_IOCTL_MAGIC 0xf5 +#define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1) +#define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2) +#define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3) +#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5) +#define F2FS_IOC_GET_FEATURES _IOR(F2FS_IOCTL_MAGIC, 12, u32) +#define F2FS_FEATURE_ATOMIC_WRITE 0x0004 +#endif /* __linux__ */ + + +/* +** Different Unix systems declare open() in different ways. Same use +** open(const char*,int,mode_t). Others use open(const char*,int,...). +** The difference is important when using a pointer to the function. +** +** The safest way to deal with the problem is to always use this wrapper +** which always has the same well-defined interface. +*/ +static int posixOpen(const char *zFile, int flags, int mode){ + return open(zFile, flags, mode); +} + +/* Forward reference */ +static int openDirectory(const char*, int*); +static int unixGetpagesize(void); + +/* +** Many system calls are accessed through pointer-to-functions so that +** they may be overridden at runtime to facilitate fault injection during +** testing and sandboxing. The following array holds the names and pointers +** to all overrideable system calls. +*/ +static struct unix_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ + sqlite3_syscall_ptr pDefault; /* Default value */ +} aSyscall[] = { + { "open", (sqlite3_syscall_ptr)posixOpen, 0 }, +#define osOpen ((int(*)(const char*,int,int))aSyscall[0].pCurrent) + + { "close", (sqlite3_syscall_ptr)close, 0 }, +#define osClose ((int(*)(int))aSyscall[1].pCurrent) + + { "access", (sqlite3_syscall_ptr)access, 0 }, +#define osAccess ((int(*)(const char*,int))aSyscall[2].pCurrent) + + { "getcwd", (sqlite3_syscall_ptr)getcwd, 0 }, +#define osGetcwd ((char*(*)(char*,size_t))aSyscall[3].pCurrent) + + { "stat", (sqlite3_syscall_ptr)stat, 0 }, +#define osStat ((int(*)(const char*,struct stat*))aSyscall[4].pCurrent) + +/* +** The DJGPP compiler environment looks mostly like Unix, but it +** lacks the fcntl() system call. So redefine fcntl() to be something +** that always succeeds. This means that locking does not occur under +** DJGPP. But it is DOS - what did you expect? +*/ +#ifdef __DJGPP__ + { "fstat", 0, 0 }, +#define osFstat(a,b,c) 0 +#else + { "fstat", (sqlite3_syscall_ptr)fstat, 0 }, +#define osFstat ((int(*)(int,struct stat*))aSyscall[5].pCurrent) +#endif + + { "ftruncate", (sqlite3_syscall_ptr)ftruncate, 0 }, +#define osFtruncate ((int(*)(int,off_t))aSyscall[6].pCurrent) + + { "fcntl", (sqlite3_syscall_ptr)fcntl, 0 }, +#define osFcntl ((int(*)(int,int,...))aSyscall[7].pCurrent) + + { "read", (sqlite3_syscall_ptr)read, 0 }, +#define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) + +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE + { "pread", (sqlite3_syscall_ptr)pread, 0 }, +#else + { "pread", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) + +#if defined(USE_PREAD64) + { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, +#else + { "pread64", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) + + { "write", (sqlite3_syscall_ptr)write, 0 }, +#define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) + +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE + { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, +#else + { "pwrite", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ + aSyscall[12].pCurrent) + +#if defined(USE_PREAD64) + { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, +#else + { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ + aSyscall[13].pCurrent) + + { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, +#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) + +#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE + { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 }, +#else + { "fallocate", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) + + { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, +#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) + + { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, +#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) + + { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, +#define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) + + { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, +#define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) + +#if defined(HAVE_FCHOWN) + { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, +#else + { "fchown", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) + +#if defined(HAVE_FCHOWN) + { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, +#else + { "geteuid", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, +#else + { "mmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, +#else + { "munmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMunmap ((int(*)(void*,size_t))aSyscall[23].pCurrent) + +#if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, +#else + { "mremap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, +#else + { "getpagesize", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) + +#if defined(HAVE_READLINK) + { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, +#else + { "readlink", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) + +#if defined(HAVE_LSTAT) + { "lstat", (sqlite3_syscall_ptr)lstat, 0 }, +#else + { "lstat", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) + +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +# ifdef __ANDROID__ + { "ioctl", (sqlite3_syscall_ptr)(int(*)(int, int, ...))ioctl, 0 }, +#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) +# else + { "ioctl", (sqlite3_syscall_ptr)ioctl, 0 }, +#define osIoctl ((int(*)(int,unsigned long,...))aSyscall[28].pCurrent) +# endif +#else + { "ioctl", (sqlite3_syscall_ptr)0, 0 }, +#endif + +}; /* End of the overrideable system calls */ + + +/* +** On some systems, calls to fchown() will trigger a message in a security +** log if they come from non-root processes. So avoid calling fchown() if +** we are not running as root. +*/ +static int robustFchown(int fd, uid_t uid, gid_t gid){ +#if defined(HAVE_FCHOWN) + return osGeteuid() ? 0 : osFchown(fd,uid,gid); +#else + return 0; +#endif +} + +/* +** This is the xSetSystemCall() method of sqlite3_vfs for all of the +** "unix" VFSes. Return SQLITE_OK opon successfully updating the +** system call pointer, or SQLITE_NOTFOUND if there is no configurable +** system call named zName. +*/ +static int unixSetSystemCall( + sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ + const char *zName, /* Name of system call to override */ + sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ +){ + unsigned int i; + int rc = SQLITE_NOTFOUND; + + UNUSED_PARAMETER(pNotUsed); + if( zName==0 ){ + /* If no zName is given, restore all system calls to their default + ** settings and return NULL + */ + rc = SQLITE_OK; + for(i=0; i=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break; + osClose(fd); + sqlite3_log(SQLITE_WARNING, + "attempt to open \"%s\" as file descriptor %d", z, fd); + fd = -1; + if( osOpen("/dev/null", O_RDONLY, m)<0 ) break; + } + if( fd>=0 ){ + if( m!=0 ){ + struct stat statbuf; + if( osFstat(fd, &statbuf)==0 + && statbuf.st_size==0 + && (statbuf.st_mode&0777)!=m + ){ + osFchmod(fd, m); + } + } +#if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0) + osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); +#endif + } + return fd; +} + +/* +** Helper functions to obtain and relinquish the global mutex. The +** global mutex is used to protect the unixInodeInfo and +** vxworksFileId objects used by this file, all of which may be +** shared by multiple threads. +** +** Function unixMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() +** statements. e.g. +** +** unixEnterMutex() +** assert( unixMutexHeld() ); +** unixEnterLeave() +** +** To prevent deadlock, the global unixBigLock must must be acquired +** before the unixInodeInfo.pLockMutex mutex, if both are held. It is +** OK to get the pLockMutex without holding unixBigLock first, but if +** that happens, the unixBigLock mutex must not be acquired until after +** pLockMutex is released. +** +** OK: enter(unixBigLock), enter(pLockInfo) +** OK: enter(unixBigLock) +** OK: enter(pLockInfo) +** ERROR: enter(pLockInfo), enter(unixBigLock) +*/ +static sqlite3_mutex *unixBigLock = 0; +static void unixEnterMutex(void){ + assert( sqlite3_mutex_notheld(unixBigLock) ); /* Not a recursive mutex */ + sqlite3_mutex_enter(unixBigLock); +} +static void unixLeaveMutex(void){ + assert( sqlite3_mutex_held(unixBigLock) ); + sqlite3_mutex_leave(unixBigLock); +} +#ifdef SQLITE_DEBUG +static int unixMutexHeld(void) { + return sqlite3_mutex_held(unixBigLock); +} +#endif + + +#ifdef SQLITE_HAVE_OS_TRACE +/* +** Helper function for printing out trace information from debugging +** binaries. This returns the string representation of the supplied +** integer lock-type. +*/ +static const char *azFileLock(int eFileLock){ + switch( eFileLock ){ + case NO_LOCK: return "NONE"; + case SHARED_LOCK: return "SHARED"; + case RESERVED_LOCK: return "RESERVED"; + case PENDING_LOCK: return "PENDING"; + case EXCLUSIVE_LOCK: return "EXCLUSIVE"; + } + return "ERROR"; +} +#endif + +#ifdef SQLITE_LOCK_TRACE +/* +** Print out information about all locking operations. +** +** This routine is used for troubleshooting locks on multithreaded +** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE +** command-line option on the compiler. This code is normally +** turned off. +*/ +static int lockTrace(int fd, int op, struct flock *p){ + char *zOpName, *zType; + int s; + int savedErrno; + if( op==F_GETLK ){ + zOpName = "GETLK"; + }else if( op==F_SETLK ){ + zOpName = "SETLK"; + }else{ + s = osFcntl(fd, op, p); + sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s); + return s; + } + if( p->l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( p->l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( p->l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + assert( p->l_whence==SEEK_SET ); + s = osFcntl(fd, op, p); + savedErrno = errno; + sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n", + threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len, + (int)p->l_pid, s); + if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){ + struct flock l2; + l2 = *p; + osFcntl(fd, F_GETLK, &l2); + if( l2.l_type==F_RDLCK ){ + zType = "RDLCK"; + }else if( l2.l_type==F_WRLCK ){ + zType = "WRLCK"; + }else if( l2.l_type==F_UNLCK ){ + zType = "UNLCK"; + }else{ + assert( 0 ); + } + sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n", + zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid); + } + errno = savedErrno; + return s; +} +#undef osFcntl +#define osFcntl lockTrace +#endif /* SQLITE_LOCK_TRACE */ + +/* +** Retry ftruncate() calls that fail due to EINTR +** +** All calls to ftruncate() within this file should be made through +** this wrapper. On the Android platform, bypassing the logic below +** could lead to a corrupt database. +*/ +static int robust_ftruncate(int h, sqlite3_int64 sz){ + int rc; +#ifdef __ANDROID__ + /* On Android, ftruncate() always uses 32-bit offsets, even if + ** _FILE_OFFSET_BITS=64 is defined. This means it is unsafe to attempt to + ** truncate a file to any size larger than 2GiB. Silently ignore any + ** such attempts. */ + if( sz>(sqlite3_int64)0x7FFFFFFF ){ + rc = SQLITE_OK; + }else +#endif + do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR ); + return rc; +} + +/* +** This routine translates a standard POSIX errno code into something +** useful to the clients of the sqlite3 functions. Specifically, it is +** intended to translate a variety of "try again" errors into SQLITE_BUSY +** and a variety of "please close the file descriptor NOW" errors into +** SQLITE_IOERR +** +** Errors during initialization of locks, or file system support for locks, +** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately. +*/ +static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { + assert( (sqliteIOErr == SQLITE_IOERR_LOCK) || + (sqliteIOErr == SQLITE_IOERR_UNLOCK) || + (sqliteIOErr == SQLITE_IOERR_RDLOCK) || + (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ); + switch (posixError) { + case EACCES: + case EAGAIN: + case ETIMEDOUT: + case EBUSY: + case EINTR: + case ENOLCK: + /* random NFS retry error, unless during file system support + * introspection, in which it actually means what it says */ + return SQLITE_BUSY; + + case EPERM: + return SQLITE_PERM; + + default: + return sqliteIOErr; + } +} + + +/****************************************************************************** +****************** Begin Unique File ID Utility Used By VxWorks *************** +** +** On most versions of unix, we can get a unique ID for a file by concatenating +** the device number and the inode number. But this does not work on VxWorks. +** On VxWorks, a unique file id must be based on the canonical filename. +** +** A pointer to an instance of the following structure can be used as a +** unique file ID in VxWorks. Each instance of this structure contains +** a copy of the canonical filename. There is also a reference count. +** The structure is reclaimed when the number of pointers to it drops to +** zero. +** +** There are never very many files open at one time and lookups are not +** a performance-critical path, so it is sufficient to put these +** structures on a linked list. +*/ +struct vxworksFileId { + struct vxworksFileId *pNext; /* Next in a list of them all */ + int nRef; /* Number of references to this one */ + int nName; /* Length of the zCanonicalName[] string */ + char *zCanonicalName; /* Canonical filename */ +}; + +#if OS_VXWORKS +/* +** All unique filenames are held on a linked list headed by this +** variable: +*/ +static struct vxworksFileId *vxworksFileList = 0; + +/* +** Simplify a filename into its canonical form +** by making the following changes: +** +** * removing any trailing and duplicate / +** * convert /./ into just / +** * convert /A/../ where A is any simple name into just / +** +** Changes are made in-place. Return the new name length. +** +** The original filename is in z[0..n-1]. Return the number of +** characters in the simplified name. +*/ +static int vxworksSimplifyName(char *z, int n){ + int i, j; + while( n>1 && z[n-1]=='/' ){ n--; } + for(i=j=0; i0 && z[j-1]!='/' ){ j--; } + if( j>0 ){ j--; } + i += 2; + continue; + } + } + z[j++] = z[i]; + } + z[j] = 0; + return j; +} + +/* +** Find a unique file ID for the given absolute pathname. Return +** a pointer to the vxworksFileId object. This pointer is the unique +** file ID. +** +** The nRef field of the vxworksFileId object is incremented before +** the object is returned. A new vxworksFileId object is created +** and added to the global list if necessary. +** +** If a memory allocation error occurs, return NULL. +*/ +static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ + struct vxworksFileId *pNew; /* search key and new file ID */ + struct vxworksFileId *pCandidate; /* For looping over existing file IDs */ + int n; /* Length of zAbsoluteName string */ + + assert( zAbsoluteName[0]=='/' ); + n = (int)strlen(zAbsoluteName); + pNew = sqlite3_malloc64( sizeof(*pNew) + (n+1) ); + if( pNew==0 ) return 0; + pNew->zCanonicalName = (char*)&pNew[1]; + memcpy(pNew->zCanonicalName, zAbsoluteName, n+1); + n = vxworksSimplifyName(pNew->zCanonicalName, n); + + /* Search for an existing entry that matching the canonical name. + ** If found, increment the reference count and return a pointer to + ** the existing file ID. + */ + unixEnterMutex(); + for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){ + if( pCandidate->nName==n + && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0 + ){ + sqlite3_free(pNew); + pCandidate->nRef++; + unixLeaveMutex(); + return pCandidate; + } + } + + /* No match was found. We will make a new file ID */ + pNew->nRef = 1; + pNew->nName = n; + pNew->pNext = vxworksFileList; + vxworksFileList = pNew; + unixLeaveMutex(); + return pNew; +} + +/* +** Decrement the reference count on a vxworksFileId object. Free +** the object when the reference count reaches zero. +*/ +static void vxworksReleaseFileId(struct vxworksFileId *pId){ + unixEnterMutex(); + assert( pId->nRef>0 ); + pId->nRef--; + if( pId->nRef==0 ){ + struct vxworksFileId **pp; + for(pp=&vxworksFileList; *pp && *pp!=pId; pp = &((*pp)->pNext)){} + assert( *pp==pId ); + *pp = pId->pNext; + sqlite3_free(pId); + } + unixLeaveMutex(); +} +#endif /* OS_VXWORKS */ +/*************** End of Unique File ID Utility Used By VxWorks **************** +******************************************************************************/ + + +/****************************************************************************** +*************************** Posix Advisory Locking **************************** +** +** POSIX advisory locks are broken by design. ANSI STD 1003.1 (1996) +** section 6.5.2.2 lines 483 through 490 specify that when a process +** sets or clears a lock, that operation overrides any prior locks set +** by the same process. It does not explicitly say so, but this implies +** that it overrides locks set by the same process using a different +** file descriptor. Consider this test case: +** +** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644); +** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644); +** +** Suppose ./file1 and ./file2 are really the same file (because +** one is a hard or symbolic link to the other) then if you set +** an exclusive lock on fd1, then try to get an exclusive lock +** on fd2, it works. I would have expected the second lock to +** fail since there was already a lock on the file due to fd1. +** But not so. Since both locks came from the same process, the +** second overrides the first, even though they were on different +** file descriptors opened on different file names. +** +** This means that we cannot use POSIX locks to synchronize file access +** among competing threads of the same process. POSIX locks will work fine +** to synchronize access for threads in separate processes, but not +** threads within the same process. +** +** To work around the problem, SQLite has to manage file locks internally +** on its own. Whenever a new database is opened, we have to find the +** specific inode of the database file (the inode is determined by the +** st_dev and st_ino fields of the stat structure that fstat() fills in) +** and check for locks already existing on that inode. When locks are +** created or removed, we have to look at our own internal record of the +** locks to see if another thread has previously set a lock on that same +** inode. +** +** (Aside: The use of inode numbers as unique IDs does not work on VxWorks. +** For VxWorks, we have to use the alternative unique ID system based on +** canonical filename and implemented in the previous division.) +** +** The sqlite3_file structure for POSIX is no longer just an integer file +** descriptor. It is now a structure that holds the integer file +** descriptor and a pointer to a structure that describes the internal +** locks on the corresponding inode. There is one locking structure +** per inode, so if the same inode is opened twice, both unixFile structures +** point to the same locking structure. The locking structure keeps +** a reference count (so we will know when to delete it) and a "cnt" +** field that tells us its internal lock status. cnt==0 means the +** file is unlocked. cnt==-1 means the file has an exclusive lock. +** cnt>0 means there are cnt shared locks on the file. +** +** Any attempt to lock or unlock a file first checks the locking +** structure. The fcntl() system call is only invoked to set a +** POSIX lock if the internal lock structure transitions between +** a locked and an unlocked state. +** +** But wait: there are yet more problems with POSIX advisory locks. +** +** If you close a file descriptor that points to a file that has locks, +** all locks on that file that are owned by the current process are +** released. To work around this problem, each unixInodeInfo object +** maintains a count of the number of pending locks on tha inode. +** When an attempt is made to close an unixFile, if there are +** other unixFile open on the same inode that are holding locks, the call +** to close() the file descriptor is deferred until all of the locks clear. +** The unixInodeInfo structure keeps a list of file descriptors that need to +** be closed and that list is walked (and cleared) when the last lock +** clears. +** +** Yet another problem: LinuxThreads do not play well with posix locks. +** +** Many older versions of linux use the LinuxThreads library which is +** not posix compliant. Under LinuxThreads, a lock created by thread +** A cannot be modified or overridden by a different thread B. +** Only thread A can modify the lock. Locking behavior is correct +** if the appliation uses the newer Native Posix Thread Library (NPTL) +** on linux - with NPTL a lock created by thread A can override locks +** in thread B. But there is no way to know at compile-time which +** threading library is being used. So there is no way to know at +** compile-time whether or not thread A can override locks on thread B. +** One has to do a run-time check to discover the behavior of the +** current process. +** +** SQLite used to support LinuxThreads. But support for LinuxThreads +** was dropped beginning with version 3.7.0. SQLite will still work with +** LinuxThreads provided that (1) there is no more than one connection +** per database file in the same process and (2) database connections +** do not move across threads. +*/ + +/* +** An instance of the following structure serves as the key used +** to locate a particular unixInodeInfo object. +*/ +struct unixFileId { + dev_t dev; /* Device number */ +#if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID for vxworks. */ +#else + /* We are told that some versions of Android contain a bug that + ** sizes ino_t at only 32-bits instead of 64-bits. (See + ** https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c) + ** To work around this, always allocate 64-bits for the inode number. + ** On small machines that only have 32-bit inodes, this wastes 4 bytes, + ** but that should not be a big deal. */ + /* WAS: ino_t ino; */ + u64 ino; /* Inode number */ +#endif +}; + +/* +** An instance of the following structure is allocated for each open +** inode. +** +** A single inode can have multiple file descriptors, so each unixFile +** structure contains a pointer to an instance of this object and this +** object keeps a count of the number of unixFile pointing to it. +** +** Mutex rules: +** +** (1) Only the pLockMutex mutex must be held in order to read or write +** any of the locking fields: +** nShared, nLock, eFileLock, bProcessLock, pUnused +** +** (2) When nRef>0, then the following fields are unchanging and can +** be read (but not written) without holding any mutex: +** fileId, pLockMutex +** +** (3) With the exceptions above, all the fields may only be read +** or written while holding the global unixBigLock mutex. +** +** Deadlock prevention: The global unixBigLock mutex may not +** be acquired while holding the pLockMutex mutex. If both unixBigLock +** and pLockMutex are needed, then unixBigLock must be acquired first. +*/ +struct unixInodeInfo { + struct unixFileId fileId; /* The lookup key */ + sqlite3_mutex *pLockMutex; /* Hold this mutex for... */ + int nShared; /* Number of SHARED locks held */ + int nLock; /* Number of outstanding file locks */ + unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ + unsigned char bProcessLock; /* An exclusive process lock is held */ + UnixUnusedFd *pUnused; /* Unused file descriptors to close */ + int nRef; /* Number of pointers to this structure */ + unixShmNode *pShmNode; /* Shared memory associated with this inode */ + unixInodeInfo *pNext; /* List of all unixInodeInfo objects */ + unixInodeInfo *pPrev; /* .... doubly linked */ +#if SQLITE_ENABLE_LOCKING_STYLE + unsigned long long sharedByte; /* for AFP simulated shared lock */ +#endif +#if OS_VXWORKS + sem_t *pSem; /* Named POSIX semaphore */ + char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */ +#endif +}; + +/* +** A lists of all unixInodeInfo objects. +** +** Must hold unixBigLock in order to read or write this variable. +*/ +static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ + +#ifdef SQLITE_DEBUG +/* +** True if the inode mutex (on the unixFile.pFileMutex field) is held, or not. +** This routine is used only within assert() to help verify correct mutex +** usage. +*/ +int unixFileMutexHeld(unixFile *pFile){ + assert( pFile->pInode ); + return sqlite3_mutex_held(pFile->pInode->pLockMutex); +} +int unixFileMutexNotheld(unixFile *pFile){ + assert( pFile->pInode ); + return sqlite3_mutex_notheld(pFile->pInode->pLockMutex); +} +#endif + +/* +** +** This function - unixLogErrorAtLine(), is only ever called via the macro +** unixLogError(). +** +** It is invoked after an error occurs in an OS function and errno has been +** set. It logs a message using sqlite3_log() containing the current value of +** errno and, if possible, the human-readable equivalent from strerror() or +** strerror_r(). +** +** The first argument passed to the macro should be the error code that +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** The two subsequent arguments should be the name of the OS function that +** failed (e.g. "unlink", "open") and the associated file-system path, +** if any. +*/ +#define unixLogError(a,b,c) unixLogErrorAtLine(a,b,c,__LINE__) +static int unixLogErrorAtLine( + int errcode, /* SQLite error code */ + const char *zFunc, /* Name of OS function that failed */ + const char *zPath, /* File path associated with error */ + int iLine /* Source line number where error occurred */ +){ + char *zErr; /* Message from strerror() or equivalent */ + int iErrno = errno; /* Saved syscall error number */ + + /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use + ** the strerror() function to obtain the human-readable error message + ** equivalent to errno. Otherwise, use strerror_r(). + */ +#if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R) + char aErr[80]; + memset(aErr, 0, sizeof(aErr)); + zErr = aErr; + + /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined, + ** assume that the system provides the GNU version of strerror_r() that + ** returns a pointer to a buffer containing the error message. That pointer + ** may point to aErr[], or it may point to some static storage somewhere. + ** Otherwise, assume that the system provides the POSIX version of + ** strerror_r(), which always writes an error message into aErr[]. + ** + ** If the code incorrectly assumes that it is the POSIX version that is + ** available, the error message will often be an empty string. Not a + ** huge problem. Incorrectly concluding that the GNU version is available + ** could lead to a segfault though. + */ +#if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) + zErr = +# endif + strerror_r(iErrno, aErr, sizeof(aErr)-1); + +#elif SQLITE_THREADSAFE + /* This is a threadsafe build, but strerror_r() is not available. */ + zErr = ""; +#else + /* Non-threadsafe build, use strerror(). */ + zErr = strerror(iErrno); +#endif + + if( zPath==0 ) zPath = ""; + sqlite3_log(errcode, + "os_unix.c:%d: (%d) %s(%s) - %s", + iLine, iErrno, zFunc, zPath, zErr + ); + + return errcode; +} + +/* +** Close a file descriptor. +** +** We assume that close() almost always works, since it is only in a +** very sick application or on a very sick platform that it might fail. +** If it does fail, simply leak the file descriptor, but do log the +** error. +** +** Note that it is not safe to retry close() after EINTR since the +** file descriptor might have already been reused by another thread. +** So we don't even try to recover from an EINTR. Just log the error +** and move on. +*/ +static void robust_close(unixFile *pFile, int h, int lineno){ + if( osClose(h) ){ + unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close", + pFile ? pFile->zPath : 0, lineno); + } +} + +/* +** Set the pFile->lastErrno. Do this in a subroutine as that provides +** a convenient place to set a breakpoint. +*/ +static void storeLastErrno(unixFile *pFile, int error){ + pFile->lastErrno = error; +} + +/* +** Close all file descriptors accumuated in the unixInodeInfo->pUnused list. +*/ +static void closePendingFds(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + UnixUnusedFd *p; + UnixUnusedFd *pNext; + assert( unixFileMutexHeld(pFile) ); + for(p=pInode->pUnused; p; p=pNext){ + pNext = p->pNext; + robust_close(pFile, p->fd, __LINE__); + sqlite3_free(p); + } + pInode->pUnused = 0; +} + +/* +** Release a unixInodeInfo structure previously allocated by findInodeInfo(). +** +** The global mutex must be held when this routine is called, but the mutex +** on the inode being deleted must NOT be held. +*/ +static void releaseInodeInfo(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + assert( unixMutexHeld() ); + assert( unixFileMutexNotheld(pFile) ); + if( ALWAYS(pInode) ){ + pInode->nRef--; + if( pInode->nRef==0 ){ + assert( pInode->pShmNode==0 ); + sqlite3_mutex_enter(pInode->pLockMutex); + closePendingFds(pFile); + sqlite3_mutex_leave(pInode->pLockMutex); + if( pInode->pPrev ){ + assert( pInode->pPrev->pNext==pInode ); + pInode->pPrev->pNext = pInode->pNext; + }else{ + assert( inodeList==pInode ); + inodeList = pInode->pNext; + } + if( pInode->pNext ){ + assert( pInode->pNext->pPrev==pInode ); + pInode->pNext->pPrev = pInode->pPrev; + } + sqlite3_mutex_free(pInode->pLockMutex); + sqlite3_free(pInode); + } + } +} + +/* +** Given a file descriptor, locate the unixInodeInfo object that +** describes that file descriptor. Create a new one if necessary. The +** return value might be uninitialized if an error occurs. +** +** The global mutex must held when calling this routine. +** +** Return an appropriate error code. +*/ +static int findInodeInfo( + unixFile *pFile, /* Unix file with file desc used in the key */ + unixInodeInfo **ppInode /* Return the unixInodeInfo object here */ +){ + int rc; /* System call return code */ + int fd; /* The file descriptor for pFile */ + struct unixFileId fileId; /* Lookup key for the unixInodeInfo */ + struct stat statbuf; /* Low-level file information */ + unixInodeInfo *pInode = 0; /* Candidate unixInodeInfo object */ + + assert( unixMutexHeld() ); + + /* Get low-level information about the file that we can used to + ** create a unique name for the file. + */ + fd = pFile->h; + rc = osFstat(fd, &statbuf); + if( rc!=0 ){ + storeLastErrno(pFile, errno); +#if defined(EOVERFLOW) && defined(SQLITE_DISABLE_LFS) + if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS; +#endif + return SQLITE_IOERR; + } + +#ifdef __APPLE__ + /* On OS X on an msdos filesystem, the inode number is reported + ** incorrectly for zero-size files. See ticket #3260. To work + ** around this problem (we consider it a bug in OS X, not SQLite) + ** we always increase the file size to 1 by writing a single byte + ** prior to accessing the inode number. The one byte written is + ** an ASCII 'S' character which also happens to be the first byte + ** in the header of every SQLite database. In this way, if there + ** is a race condition such that another thread has already populated + ** the first page of the database, no damage is done. + */ + if( statbuf.st_size==0 && (pFile->fsFlags & SQLITE_FSFLAGS_IS_MSDOS)!=0 ){ + do{ rc = osWrite(fd, "S", 1); }while( rc<0 && errno==EINTR ); + if( rc!=1 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR; + } + rc = osFstat(fd, &statbuf); + if( rc!=0 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR; + } + } +#endif + + memset(&fileId, 0, sizeof(fileId)); + fileId.dev = statbuf.st_dev; +#if OS_VXWORKS + fileId.pId = pFile->pId; +#else + fileId.ino = (u64)statbuf.st_ino; +#endif + assert( unixMutexHeld() ); + pInode = inodeList; + while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ + pInode = pInode->pNext; + } + if( pInode==0 ){ + pInode = sqlite3_malloc64( sizeof(*pInode) ); + if( pInode==0 ){ + return SQLITE_NOMEM_BKPT; + } + memset(pInode, 0, sizeof(*pInode)); + memcpy(&pInode->fileId, &fileId, sizeof(fileId)); + if( sqlite3GlobalConfig.bCoreMutex ){ + pInode->pLockMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pInode->pLockMutex==0 ){ + sqlite3_free(pInode); + return SQLITE_NOMEM_BKPT; + } + } + pInode->nRef = 1; + assert( unixMutexHeld() ); + pInode->pNext = inodeList; + pInode->pPrev = 0; + if( inodeList ) inodeList->pPrev = pInode; + inodeList = pInode; + }else{ + pInode->nRef++; + } + *ppInode = pInode; + return SQLITE_OK; +} + +/* +** Return TRUE if pFile has been renamed or unlinked since it was first opened. +*/ +static int fileHasMoved(unixFile *pFile){ +#if OS_VXWORKS + return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; +#else + struct stat buf; + return pFile->pInode!=0 && + (osStat(pFile->zPath, &buf)!=0 + || (u64)buf.st_ino!=pFile->pInode->fileId.ino); +#endif +} + + +/* +** Check a unixFile that is a database. Verify the following: +** +** (1) There is exactly one hard link on the file +** (2) The file is not a symbolic link +** (3) The file has not been renamed or unlinked +** +** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. +*/ +static void verifyDbFile(unixFile *pFile){ + struct stat buf; + int rc; + + /* These verifications occurs for the main database only */ + if( pFile->ctrlFlags & UNIXFILE_NOLOCK ) return; + + rc = osFstat(pFile->h, &buf); + if( rc!=0 ){ + sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); + return; + } + if( buf.st_nlink==0 ){ + sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); + return; + } + if( buf.st_nlink>1 ){ + sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); + return; + } + if( fileHasMoved(pFile) ){ + sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); + return; + } +} + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + assert( pFile->eFileLock<=SHARED_LOCK ); + sqlite3_mutex_enter(pFile->pInode->pLockMutex); + + /* Check if a thread in this process holds such a lock */ + if( pFile->pInode->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. + */ +#ifndef __DJGPP__ + if( !reserved && !pFile->pInode->bProcessLock ){ + struct flock lock; + lock.l_whence = SEEK_SET; + lock.l_start = RESERVED_BYTE; + lock.l_len = 1; + lock.l_type = F_WRLCK; + if( osFcntl(pFile->h, F_GETLK, &lock) ){ + rc = SQLITE_IOERR_CHECKRESERVEDLOCK; + storeLastErrno(pFile, errno); + } else if( lock.l_type!=F_UNLCK ){ + reserved = 1; + } + } +#endif + + sqlite3_mutex_leave(pFile->pInode->pLockMutex); + OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* Forward declaration*/ +static int unixSleep(sqlite3_vfs*,int); + +/* +** Set a posix-advisory-lock. +** +** There are two versions of this routine. If compiled with +** SQLITE_ENABLE_SETLK_TIMEOUT then the routine has an extra parameter +** which is a pointer to a unixFile. If the unixFile->iBusyTimeout +** value is set, then it is the number of milliseconds to wait before +** failing the lock. The iBusyTimeout value is always reset back to +** zero on each call. +** +** If SQLITE_ENABLE_SETLK_TIMEOUT is not defined, then do a non-blocking +** attempt to set the lock. +*/ +#ifndef SQLITE_ENABLE_SETLK_TIMEOUT +# define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x) +#else +static int osSetPosixAdvisoryLock( + int h, /* The file descriptor on which to take the lock */ + struct flock *pLock, /* The description of the lock */ + unixFile *pFile /* Structure holding timeout value */ +){ + int tm = pFile->iBusyTimeout; + int rc = osFcntl(h,F_SETLK,pLock); + while( rc<0 && tm>0 ){ + /* On systems that support some kind of blocking file lock with a timeout, + ** make appropriate changes here to invoke that blocking file lock. On + ** generic posix, however, there is no such API. So we simply try the + ** lock once every millisecond until either the timeout expires, or until + ** the lock is obtained. */ + unixSleep(0,1000); + rc = osFcntl(h,F_SETLK,pLock); + tm--; + } + return rc; +} +#endif /* SQLITE_ENABLE_SETLK_TIMEOUT */ + + +/* +** Attempt to set a system-lock on the file pFile. The lock is +** described by pLock. +** +** If the pFile was opened read/write from unix-excl, then the only lock +** ever obtained is an exclusive lock, and it is obtained exactly once +** the first time any lock is attempted. All subsequent system locking +** operations become no-ops. Locking operations still happen internally, +** in order to coordinate access between separate database connections +** within this process, but all of that is handled in memory and the +** operating system does not participate. +** +** This function is a pass-through to fcntl(F_SETLK) if pFile is using +** any VFS other than "unix-excl" or if pFile is opened on "unix-excl" +** and is read-only. +** +** Zero is returned if the call completes successfully, or -1 if a call +** to fcntl() fails. In this case, errno is set appropriately (by fcntl()). +*/ +static int unixFileLock(unixFile *pFile, struct flock *pLock){ + int rc; + unixInodeInfo *pInode = pFile->pInode; + assert( pInode!=0 ); + assert( sqlite3_mutex_held(pInode->pLockMutex) ); + if( (pFile->ctrlFlags & (UNIXFILE_EXCL|UNIXFILE_RDONLY))==UNIXFILE_EXCL ){ + if( pInode->bProcessLock==0 ){ + struct flock lock; + assert( pInode->nLock==0 ); + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + lock.l_type = F_WRLCK; + rc = osSetPosixAdvisoryLock(pFile->h, &lock, pFile); + if( rc<0 ) return rc; + pInode->bProcessLock = 1; + pInode->nLock++; + }else{ + rc = 0; + } + }else{ + rc = osSetPosixAdvisoryLock(pFile->h, pLock, pFile); + } + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int unixLock(sqlite3_file *id, int eFileLock){ + /* The following describes the implementation of the various locks and + ** lock transitions in terms of the POSIX advisory shared and exclusive + ** lock primitives (called read-locks and write-locks below, to avoid + ** confusion with SQLite lock names). The algorithms are complicated + ** slightly in order to be compatible with Windows95 systems simultaneously + ** accessing the same database file, in case that is ever required. + ** + ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved + ** byte', each single bytes at well known offsets, and the 'shared byte + ** range', a range of 510 bytes at a well known offset. + ** + ** To obtain a SHARED lock, a read-lock is obtained on the 'pending + ** byte'. If this is successful, 'shared byte range' is read-locked + ** and the lock on the 'pending byte' released. (Legacy note: When + ** SQLite was first developed, Windows95 systems were still very common, + ** and Widnows95 lacks a shared-lock capability. So on Windows95, a + ** single randomly selected by from the 'shared byte range' is locked. + ** Windows95 is now pretty much extinct, but this work-around for the + ** lack of shared-locks on Windows95 lives on, for backwards + ** compatibility.) + ** + ** A process may only obtain a RESERVED lock after it has a SHARED lock. + ** A RESERVED lock is implemented by grabbing a write-lock on the + ** 'reserved byte'. + ** + ** A process may only obtain a PENDING lock after it has obtained a + ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock + ** on the 'pending byte'. This ensures that no new SHARED locks can be + ** obtained, but existing SHARED locks are allowed to persist. A process + ** does not have to obtain a RESERVED lock on the way to a PENDING lock. + ** This property is used by the algorithm for rolling back a journal file + ** after a crash. + ** + ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is + ** implemented by obtaining a write-lock on the entire 'shared byte + ** range'. Since all other locks require a read-lock on one of the bytes + ** within this range, this ensures that no other locks are held on the + ** database. + */ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + struct flock lock; + int tErrno = 0; + + assert( pFile ); + OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, + azFileLock(eFileLock), azFileLock(pFile->eFileLock), + azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared, + osGetpid(0))); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the end_lock: exit path, as + ** unixEnterMutex() hasn't been called yet. + */ + if( pFile->eFileLock>=eFileLock ){ + OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h, + azFileLock(eFileLock))); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct. + ** (1) We never move from unlocked to anything higher than shared lock. + ** (2) SQLite never explicitly requests a pendig lock. + ** (3) A shared lock is always held when a reserve lock is requested. + */ + assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); + assert( eFileLock!=PENDING_LOCK ); + assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); + + /* This mutex is needed because pFile->pInode is shared across threads + */ + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->eFileLock!=pInode->eFileLock && + (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( eFileLock==SHARED_LOCK && + (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ + assert( eFileLock==SHARED_LOCK ); + assert( pFile->eFileLock==0 ); + assert( pInode->nShared>0 ); + pFile->eFileLock = SHARED_LOCK; + pInode->nShared++; + pInode->nLock++; + goto end_lock; + } + + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + lock.l_len = 1L; + lock.l_whence = SEEK_SET; + if( eFileLock==SHARED_LOCK + || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLocknShared==0 ); + assert( pInode->eFileLock==0 ); + assert( rc==SQLITE_OK ); + + /* Now get the read-lock */ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( unixFileLock(pFile, &lock) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + } + + /* Drop the temporary PENDING lock */ + lock.l_start = PENDING_BYTE; + lock.l_len = 1L; + lock.l_type = F_UNLCK; + if( unixFileLock(pFile, &lock) && rc==SQLITE_OK ){ + /* This could happen with a network mount */ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + } + + if( rc ){ + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + goto end_lock; + }else{ + pFile->eFileLock = SHARED_LOCK; + pInode->nLock++; + pInode->nShared = 1; + } + }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + assert( 0!=pFile->eFileLock ); + lock.l_type = F_WRLCK; + + assert( eFileLock==RESERVED_LOCK || eFileLock==EXCLUSIVE_LOCK ); + if( eFileLock==RESERVED_LOCK ){ + lock.l_start = RESERVED_BYTE; + lock.l_len = 1L; + }else{ + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + } + + if( unixFileLock(pFile, &lock) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + } + } + + +#ifdef SQLITE_DEBUG + /* Set up the transaction-counter change checking flags when + ** transitioning from a SHARED to a RESERVED lock. The change + ** from SHARED to RESERVED marks the beginning of a normal + ** write operation (not a hot journal rollback). + */ + if( rc==SQLITE_OK + && pFile->eFileLock<=SHARED_LOCK + && eFileLock==RESERVED_LOCK + ){ + pFile->transCntrChng = 0; + pFile->dbUpdate = 0; + pFile->inNormalWrite = 1; + } +#endif + + + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + pInode->eFileLock = eFileLock; + }else if( eFileLock==EXCLUSIVE_LOCK ){ + pFile->eFileLock = PENDING_LOCK; + pInode->eFileLock = PENDING_LOCK; + } + +end_lock: + sqlite3_mutex_leave(pInode->pLockMutex); + OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); + return rc; +} + +/* +** Add the file descriptor used by file handle pFile to the corresponding +** pUnused list. +*/ +static void setPendingFd(unixFile *pFile){ + unixInodeInfo *pInode = pFile->pInode; + UnixUnusedFd *p = pFile->pPreallocatedUnused; + assert( unixFileMutexHeld(pFile) ); + p->pNext = pInode->pUnused; + pInode->pUnused = p; + pFile->h = -1; + pFile->pPreallocatedUnused = 0; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** If handleNFSUnlock is true, then on downgrading an EXCLUSIVE_LOCK to SHARED +** the byte range is divided into 2 parts and the first part is unlocked then +** set to a read lock, then the other part is simply unlocked. This works +** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to +** remove the write lock on a region when a read lock is set. +*/ +static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + struct flock lock; + int rc = SQLITE_OK; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, + pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, + osGetpid(0))); + + assert( eFileLock<=SHARED_LOCK ); + if( pFile->eFileLock<=eFileLock ){ + return SQLITE_OK; + } + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + assert( pInode->nShared!=0 ); + if( pFile->eFileLock>SHARED_LOCK ){ + assert( pInode->eFileLock==pFile->eFileLock ); + +#ifdef SQLITE_DEBUG + /* When reducing a lock such that other processes can start + ** reading the database file again, make sure that the + ** transaction counter was updated if any part of the database + ** file changed. If the transaction counter is not updated, + ** other connections to the same file might not realize that + ** the file has changed and hence might not know to flush their + ** cache. The use of a stale cache can lead to database corruption. + */ + pFile->inNormalWrite = 0; +#endif + + /* downgrading to a shared lock on NFS involves clearing the write lock + ** before establishing the readlock - to avoid a race condition we downgrade + ** the lock in 2 blocks, so that part of the range will be covered by a + ** write lock until the rest is covered by a read lock: + ** 1: [WWWWW] + ** 2: [....W] + ** 3: [RRRRW] + ** 4: [RRRR.] + */ + if( eFileLock==SHARED_LOCK ){ +#if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE + (void)handleNFSUnlock; + assert( handleNFSUnlock==0 ); +#endif +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + if( handleNFSUnlock ){ + int tErrno; /* Error code from system call errors */ + off_t divSize = SHARED_SIZE - 1; + + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + goto end_unlock; + } + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + goto end_unlock; + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST+divSize; + lock.l_len = SHARED_SIZE-divSize; + if( unixFileLock(pFile, &lock)==(-1) ){ + tErrno = errno; + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + goto end_unlock; + } + }else +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + { + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = SHARED_FIRST; + lock.l_len = SHARED_SIZE; + if( unixFileLock(pFile, &lock) ){ + /* In theory, the call to unixFileLock() cannot fail because another + ** process is holding an incompatible lock. If it does, this + ** indicates that the other process is not following the locking + ** protocol. If this happens, return SQLITE_IOERR_RDLOCK. Returning + ** SQLITE_BUSY would confuse the upper layer (in practice it causes + ** an assert to fail). */ + rc = SQLITE_IOERR_RDLOCK; + storeLastErrno(pFile, errno); + goto end_unlock; + } + } + } + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = PENDING_BYTE; + lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE ); + if( unixFileLock(pFile, &lock)==0 ){ + pInode->eFileLock = SHARED_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, errno); + goto end_unlock; + } + } + if( eFileLock==NO_LOCK ){ + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + pInode->nShared--; + if( pInode->nShared==0 ){ + lock.l_type = F_UNLCK; + lock.l_whence = SEEK_SET; + lock.l_start = lock.l_len = 0L; + if( unixFileLock(pFile, &lock)==0 ){ + pInode->eFileLock = NO_LOCK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, errno); + pInode->eFileLock = NO_LOCK; + pFile->eFileLock = NO_LOCK; + } + } + + /* Decrement the count of locks against this same file. When the + ** count reaches zero, close any other file descriptors whose close + ** was deferred because of outstanding locks. + */ + pInode->nLock--; + assert( pInode->nLock>=0 ); + if( pInode->nLock==0 ) closePendingFds(pFile); + } + +end_unlock: + sqlite3_mutex_leave(pInode->pLockMutex); + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + } + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int unixUnlock(sqlite3_file *id, int eFileLock){ +#if SQLITE_MAX_MMAP_SIZE>0 + assert( eFileLock==SHARED_LOCK || ((unixFile *)id)->nFetchOut==0 ); +#endif + return posixUnlock(id, eFileLock, 0); +} + +#if SQLITE_MAX_MMAP_SIZE>0 +static int unixMapfile(unixFile *pFd, i64 nByte); +static void unixUnmapfile(unixFile *pFd); +#endif + +/* +** This function performs the parts of the "close file" operation +** common to all locking schemes. It closes the directory and file +** handles, if they are valid, and sets all fields of the unixFile +** structure to 0. +** +** It is *not* necessary to hold the mutex when this routine is called, +** even on VxWorks. A mutex will be acquired on VxWorks by the +** vxworksReleaseFileId() routine. +*/ +static int closeUnixFile(sqlite3_file *id){ + unixFile *pFile = (unixFile*)id; +#if SQLITE_MAX_MMAP_SIZE>0 + unixUnmapfile(pFile); +#endif + if( pFile->h>=0 ){ + robust_close(pFile, pFile->h, __LINE__); + pFile->h = -1; + } +#if OS_VXWORKS + if( pFile->pId ){ + if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(pFile->pId->zCanonicalName); + } + vxworksReleaseFileId(pFile->pId); + pFile->pId = 0; + } +#endif +#ifdef SQLITE_UNLINK_AFTER_CLOSE + if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + osUnlink(pFile->zPath); + sqlite3_free(*(char**)&pFile->zPath); + pFile->zPath = 0; + } +#endif + OSTRACE(("CLOSE %-3d\n", pFile->h)); + OpenCounter(-1); + sqlite3_free(pFile->pPreallocatedUnused); + memset(pFile, 0, sizeof(unixFile)); + return SQLITE_OK; +} + +/* +** Close a file. +*/ +static int unixClose(sqlite3_file *id){ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile *)id; + unixInodeInfo *pInode = pFile->pInode; + + assert( pInode!=0 ); + verifyDbFile(pFile); + unixUnlock(id, NO_LOCK); + assert( unixFileMutexNotheld(pFile) ); + unixEnterMutex(); + + /* unixFile.pInode is always valid here. Otherwise, a different close + ** routine (e.g. nolockClose()) would be called instead. + */ + assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 ); + sqlite3_mutex_enter(pInode->pLockMutex); + if( pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->pUnused list. It will be automatically closed + ** when the last lock is cleared. + */ + setPendingFd(pFile); + } + sqlite3_mutex_leave(pInode->pLockMutex); + releaseInodeInfo(pFile); + assert( pFile->pShm==0 ); + rc = closeUnixFile(id); + unixLeaveMutex(); + return rc; +} + +/************** End of the posix advisory lock implementation ***************** +******************************************************************************/ + +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int nolockCheckReservedLock(sqlite3_file *NotUsed, int *pResOut){ + UNUSED_PARAMETER(NotUsed); + *pResOut = 0; + return SQLITE_OK; +} +static int nolockLock(sqlite3_file *NotUsed, int NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return SQLITE_OK; +} +static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return SQLITE_OK; +} + +/* +** Close the file. +*/ +static int nolockClose(sqlite3_file *id) { + return closeUnixFile(id); +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + +/****************************************************************************** +************************* Begin dot-file Locking ****************************** +** +** The dotfile locking implementation uses the existence of separate lock +** files (really a directory) to control access to the database. This works +** on just about every filesystem imaginable. But there are serious downsides: +** +** (1) There is zero concurrency. A single reader blocks all other +** connections from reading or writing the database. +** +** (2) An application crash or power loss can leave stale lock files +** sitting around that need to be cleared manually. +** +** Nevertheless, a dotlock is an appropriate locking mode for use if no +** other locking strategy is available. +** +** Dotfile locking works by creating a subdirectory in the same directory as +** the database and with the same name but with a ".lock" extension added. +** The existence of a lock directory implies an EXCLUSIVE lock. All other +** lock types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. +*/ + +/* +** The file suffix added to the data base filename in order to create the +** lock directory. +*/ +#define DOTLOCK_SUFFIX ".lock" + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +** +** In dotfile locking, either a lock exists or it does not. So in this +** variation of CheckReservedLock(), *pResOut is set to true if any lock +** is held on the file and false if the file is unlocked. +*/ +static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + reserved = osAccess((const char*)pFile->lockingContext, 0)==0; + OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved)); + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +** +** With dotfile locking, we really only support state (4): EXCLUSIVE. +** But we track the other locking levels internally. +*/ +static int dotlockLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + char *zLockFile = (char *)pFile->lockingContext; + int rc = SQLITE_OK; + + + /* If we have any lock, then the lock file already exists. All we have + ** to do is adjust our internal record of the lock level. + */ + if( pFile->eFileLock > NO_LOCK ){ + pFile->eFileLock = eFileLock; + /* Always update the timestamp on the old file */ +#ifdef HAVE_UTIME + utime(zLockFile, NULL); +#else + utimes(zLockFile, NULL); +#endif + return SQLITE_OK; + } + + /* grab an exclusive lock */ + rc = osMkdir(zLockFile, 0777); + if( rc<0 ){ + /* failed to open/create the lock directory */ + int tErrno = errno; + if( EEXIST == tErrno ){ + rc = SQLITE_BUSY; + } else { + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); + } + } + return rc; + } + + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** When the locking level reaches NO_LOCK, delete the lock file. +*/ +static int dotlockUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + char *zLockFile = (char *)pFile->lockingContext; + int rc; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* To downgrade to shared, simply update our internal notion of the + ** lock state. No need to mess with the file on disk. + */ + if( eFileLock==SHARED_LOCK ){ + pFile->eFileLock = SHARED_LOCK; + return SQLITE_OK; + } + + /* To fully unlock the database, delete the lock file */ + assert( eFileLock==NO_LOCK ); + rc = osRmdir(zLockFile); + if( rc<0 ){ + int tErrno = errno; + if( tErrno==ENOENT ){ + rc = SQLITE_OK; + }else{ + rc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + } + return rc; + } + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; +} + +/* +** Close a file. Make sure the lock has been released before closing. +*/ +static int dotlockClose(sqlite3_file *id) { + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + dotlockUnlock(id, NO_LOCK); + sqlite3_free(pFile->lockingContext); + return closeUnixFile(id); +} +/****************** End of the dot-file lock implementation ******************* +******************************************************************************/ + +/****************************************************************************** +************************** Begin flock Locking ******************************** +** +** Use the flock() system call to do file locking. +** +** flock() locking is like dot-file locking in that the various +** fine-grain locking levels supported by SQLite are collapsed into +** a single exclusive lock. In other words, SHARED, RESERVED, and +** PENDING locks are the same thing as an EXCLUSIVE lock. SQLite +** still works when you do this, but concurrency is reduced since +** only a single process can be reading the database at a time. +** +** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off +*/ +#if SQLITE_ENABLE_LOCKING_STYLE + +/* +** Retry flock() calls that fail with EINTR +*/ +#ifdef EINTR +static int robust_flock(int fd, int op){ + int rc; + do{ rc = flock(fd,op); }while( rc<0 && errno==EINTR ); + return rc; +} +#else +# define robust_flock(a,b) flock(a,b) +#endif + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + + /* Check if a thread in this process holds such a lock */ + if( pFile->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. */ + if( !reserved ){ + /* attempt to get the lock */ + int lrc = robust_flock(pFile->h, LOCK_EX | LOCK_NB); + if( !lrc ){ + /* got the lock, unlock it */ + lrc = robust_flock(pFile->h, LOCK_UN); + if ( lrc ) { + int tErrno = errno; + /* unlock failed with an error */ + lrc = SQLITE_IOERR_UNLOCK; + storeLastErrno(pFile, tErrno); + rc = lrc; + } + } else { + int tErrno = errno; + reserved = 1; + /* someone else might have it reserved */ + lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( IS_LOCK_ERROR(lrc) ){ + storeLastErrno(pFile, tErrno); + rc = lrc; + } + } + } + OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved)); + +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + if( (rc & 0xff) == SQLITE_IOERR ){ + rc = SQLITE_OK; + reserved=1; + } +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** flock() only really support EXCLUSIVE locks. We track intermediate +** lock states in the sqlite3_file structure, but all locks SHARED or +** above are really EXCLUSIVE locks and exclude all other processes from +** access the file. +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int flockLock(sqlite3_file *id, int eFileLock) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->eFileLock > NO_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* grab an exclusive lock */ + + if (robust_flock(pFile->h, LOCK_EX | LOCK_NB)) { + int tErrno = errno; + /* didn't get, must be busy */ + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + } else { + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + } + OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + if( (rc & 0xff) == SQLITE_IOERR ){ + rc = SQLITE_BUSY; + } +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + return rc; +} + + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int flockUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (eFileLock==SHARED_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* no, really, unlock. */ + if( robust_flock(pFile->h, LOCK_UN) ){ +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS + return SQLITE_OK; +#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ + return SQLITE_IOERR_UNLOCK; + }else{ + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; + } +} + +/* +** Close a file. +*/ +static int flockClose(sqlite3_file *id) { + assert( id!=0 ); + flockUnlock(id, NO_LOCK); + return closeUnixFile(id); +} + +#endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */ + +/******************* End of the flock lock implementation ********************* +******************************************************************************/ + +/****************************************************************************** +************************ Begin Named Semaphore Locking ************************ +** +** Named semaphore locking is only supported on VxWorks. +** +** Semaphore locking is like dot-lock and flock in that it really only +** supports EXCLUSIVE locking. Only a single process can read or write +** the database file at a time. This reduces potential concurrency, but +** makes the lock implementation much easier. +*/ +#if OS_VXWORKS + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) { + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + + /* Check if a thread in this process holds such a lock */ + if( pFile->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. */ + if( !reserved ){ + sem_t *pSem = pFile->pInode->pSem; + + if( sem_trywait(pSem)==-1 ){ + int tErrno = errno; + if( EAGAIN != tErrno ){ + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK); + storeLastErrno(pFile, tErrno); + } else { + /* someone else has the lock when we are in NO_LOCK */ + reserved = (pFile->eFileLock < SHARED_LOCK); + } + }else{ + /* we could have it if we want it */ + sem_post(pSem); + } + } + OSTRACE(("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** Semaphore locks only really support EXCLUSIVE locks. We track intermediate +** lock states in the sqlite3_file structure, but all locks SHARED or +** above are really EXCLUSIVE locks and exclude all other processes from +** access the file. +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int semXLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + sem_t *pSem = pFile->pInode->pSem; + int rc = SQLITE_OK; + + /* if we already have a lock, it is exclusive. + ** Just adjust level and punt on outta here. */ + if (pFile->eFileLock > NO_LOCK) { + pFile->eFileLock = eFileLock; + rc = SQLITE_OK; + goto sem_end_lock; + } + + /* lock semaphore now but bail out when already locked. */ + if( sem_trywait(pSem)==-1 ){ + rc = SQLITE_BUSY; + goto sem_end_lock; + } + + /* got it, set the type and return ok */ + pFile->eFileLock = eFileLock; + + sem_end_lock: + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int semXUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + sem_t *pSem = pFile->pInode->pSem; + + assert( pFile ); + assert( pSem ); + OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, + pFile->eFileLock, osGetpid(0))); + assert( eFileLock<=SHARED_LOCK ); + + /* no-op if possible */ + if( pFile->eFileLock==eFileLock ){ + return SQLITE_OK; + } + + /* shared can just be set because we always have an exclusive */ + if (eFileLock==SHARED_LOCK) { + pFile->eFileLock = eFileLock; + return SQLITE_OK; + } + + /* no, really unlock. */ + if ( sem_post(pSem)==-1 ) { + int rc, tErrno = errno; + rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + return rc; + } + pFile->eFileLock = NO_LOCK; + return SQLITE_OK; +} + +/* + ** Close a file. + */ +static int semXClose(sqlite3_file *id) { + if( id ){ + unixFile *pFile = (unixFile*)id; + semXUnlock(id, NO_LOCK); + assert( pFile ); + assert( unixFileMutexNotheld(pFile) ); + unixEnterMutex(); + releaseInodeInfo(pFile); + unixLeaveMutex(); + closeUnixFile(id); + } + return SQLITE_OK; +} + +#endif /* OS_VXWORKS */ +/* +** Named semaphore locking is only available on VxWorks. +** +*************** End of the named semaphore lock implementation **************** +******************************************************************************/ + + +/****************************************************************************** +*************************** Begin AFP Locking ********************************* +** +** AFP is the Apple Filing Protocol. AFP is a network filesystem found +** on Apple Macintosh computers - both OS9 and OSX. +** +** Third-party implementations of AFP are available. But this code here +** only works on OSX. +*/ + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* +** The afpLockingContext structure contains all afp lock specific state +*/ +typedef struct afpLockingContext afpLockingContext; +struct afpLockingContext { + int reserved; + const char *dbPath; /* Name of the open file */ +}; + +struct ByteRangeLockPB2 +{ + unsigned long long offset; /* offset to first byte to lock */ + unsigned long long length; /* nbr of bytes to lock */ + unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */ + unsigned char unLockFlag; /* 1 = unlock, 0 = lock */ + unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */ + int fd; /* file desc to assoc this lock with */ +}; + +#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) + +/* +** This is a utility for setting or clearing a bit-range lock on an +** AFP filesystem. +** +** Return SQLITE_OK on success, SQLITE_BUSY on failure. +*/ +static int afpSetLock( + const char *path, /* Name of the file to be locked or unlocked */ + unixFile *pFile, /* Open file descriptor on path */ + unsigned long long offset, /* First byte to be locked */ + unsigned long long length, /* Number of bytes to lock */ + int setLockFlag /* True to set lock. False to clear lock */ +){ + struct ByteRangeLockPB2 pb; + int err; + + pb.unLockFlag = setLockFlag ? 0 : 1; + pb.startEndFlag = 0; + pb.offset = offset; + pb.length = length; + pb.fd = pFile->h; + + OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n", + (setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""), + offset, length)); + err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0); + if ( err==-1 ) { + int rc; + int tErrno = errno; + OSTRACE(("AFPSETLOCK failed to fsctl() '%s' %d %s\n", + path, tErrno, strerror(tErrno))); +#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS + rc = SQLITE_BUSY; +#else + rc = sqliteErrorFromPosixError(tErrno, + setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK); +#endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */ + if( IS_LOCK_ERROR(rc) ){ + storeLastErrno(pFile, tErrno); + } + return rc; + } else { + return SQLITE_OK; + } +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ + int rc = SQLITE_OK; + int reserved = 0; + unixFile *pFile = (unixFile*)id; + afpLockingContext *context; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + + assert( pFile ); + context = (afpLockingContext *) pFile->lockingContext; + if( context->reserved ){ + *pResOut = 1; + return SQLITE_OK; + } + sqlite3_mutex_enter(pFile->pInode->pLockMutex); + /* Check if a thread in this process holds such a lock */ + if( pFile->pInode->eFileLock>SHARED_LOCK ){ + reserved = 1; + } + + /* Otherwise see if some other process holds it. + */ + if( !reserved ){ + /* lock the RESERVED byte */ + int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + if( SQLITE_OK==lrc ){ + /* if we succeeded in taking the reserved lock, unlock it to restore + ** the original state */ + lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); + } else { + /* if we failed to get the lock then someone else must have it */ + reserved = 1; + } + if( IS_LOCK_ERROR(lrc) ){ + rc=lrc; + } + } + + sqlite3_mutex_leave(pFile->pInode->pLockMutex); + OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved)); + + *pResOut = reserved; + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int afpLock(sqlite3_file *id, int eFileLock){ + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode = pFile->pInode; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + + assert( pFile ); + OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h, + azFileLock(eFileLock), azFileLock(pFile->eFileLock), + azFileLock(pInode->eFileLock), pInode->nShared , osGetpid(0))); + + /* If there is already a lock of this type or more restrictive on the + ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as + ** unixEnterMutex() hasn't been called yet. + */ + if( pFile->eFileLock>=eFileLock ){ + OSTRACE(("LOCK %d %s ok (already held) (afp)\n", pFile->h, + azFileLock(eFileLock))); + return SQLITE_OK; + } + + /* Make sure the locking sequence is correct + ** (1) We never move from unlocked to anything higher than shared lock. + ** (2) SQLite never explicitly requests a pendig lock. + ** (3) A shared lock is always held when a reserve lock is requested. + */ + assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); + assert( eFileLock!=PENDING_LOCK ); + assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK ); + + /* This mutex is needed because pFile->pInode is shared across threads + */ + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + + /* If some thread using this PID has a lock via a different unixFile* + ** handle that precludes the requested lock, return BUSY. + */ + if( (pFile->eFileLock!=pInode->eFileLock && + (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK)) + ){ + rc = SQLITE_BUSY; + goto afp_end_lock; + } + + /* If a SHARED lock is requested, and some thread using this PID already + ** has a SHARED or RESERVED lock, then increment reference counts and + ** return SQLITE_OK. + */ + if( eFileLock==SHARED_LOCK && + (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){ + assert( eFileLock==SHARED_LOCK ); + assert( pFile->eFileLock==0 ); + assert( pInode->nShared>0 ); + pFile->eFileLock = SHARED_LOCK; + pInode->nShared++; + pInode->nLock++; + goto afp_end_lock; + } + + /* A PENDING lock is needed before acquiring a SHARED lock and before + ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will + ** be released. + */ + if( eFileLock==SHARED_LOCK + || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLockdbPath, pFile, PENDING_BYTE, 1, 1); + if (failed) { + rc = failed; + goto afp_end_lock; + } + } + + /* If control gets to this point, then actually go ahead and make + ** operating system calls for the specified lock. + */ + if( eFileLock==SHARED_LOCK ){ + int lrc1, lrc2, lrc1Errno = 0; + long lk, mask; + + assert( pInode->nShared==0 ); + assert( pInode->eFileLock==0 ); + + mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; + /* Now get the read-lock SHARED_LOCK */ + /* note that the quality of the randomness doesn't matter that much */ + lk = random(); + pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1); + lrc1 = afpSetLock(context->dbPath, pFile, + SHARED_FIRST+pInode->sharedByte, 1, 1); + if( IS_LOCK_ERROR(lrc1) ){ + lrc1Errno = pFile->lastErrno; + } + /* Drop the temporary PENDING lock */ + lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); + + if( IS_LOCK_ERROR(lrc1) ) { + storeLastErrno(pFile, lrc1Errno); + rc = lrc1; + goto afp_end_lock; + } else if( IS_LOCK_ERROR(lrc2) ){ + rc = lrc2; + goto afp_end_lock; + } else if( lrc1 != SQLITE_OK ) { + rc = lrc1; + } else { + pFile->eFileLock = SHARED_LOCK; + pInode->nLock++; + pInode->nShared = 1; + } + }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + }else{ + /* The request was for a RESERVED or EXCLUSIVE lock. It is + ** assumed that there is a SHARED or greater lock on the file + ** already. + */ + int failed = 0; + assert( 0!=pFile->eFileLock ); + if (eFileLock >= RESERVED_LOCK && pFile->eFileLock < RESERVED_LOCK) { + /* Acquire a RESERVED lock */ + failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); + if( !failed ){ + context->reserved = 1; + } + } + if (!failed && eFileLock == EXCLUSIVE_LOCK) { + /* Acquire an EXCLUSIVE lock */ + + /* Remove the shared lock before trying the range. we'll need to + ** reestablish the shared lock if we can't get the afpUnlock + */ + if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST + + pInode->sharedByte, 1, 0)) ){ + int failed2 = SQLITE_OK; + /* now attemmpt to get the exclusive lock range */ + failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST, + SHARED_SIZE, 1); + if( failed && (failed2 = afpSetLock(context->dbPath, pFile, + SHARED_FIRST + pInode->sharedByte, 1, 1)) ){ + /* Can't reestablish the shared lock. Sqlite can't deal, this is + ** a critical I/O error + */ + rc = ((failed & 0xff) == SQLITE_IOERR) ? failed2 : + SQLITE_IOERR_LOCK; + goto afp_end_lock; + } + }else{ + rc = failed; + } + } + if( failed ){ + rc = failed; + } + } + + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + pInode->eFileLock = eFileLock; + }else if( eFileLock==EXCLUSIVE_LOCK ){ + pFile->eFileLock = PENDING_LOCK; + pInode->eFileLock = PENDING_LOCK; + } + +afp_end_lock: + sqlite3_mutex_leave(pInode->pLockMutex); + OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock), + rc==SQLITE_OK ? "ok" : "failed")); + return rc; +} + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int afpUnlock(sqlite3_file *id, int eFileLock) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + unixInodeInfo *pInode; + afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + int skipShared = 0; +#ifdef SQLITE_TEST + int h = pFile->h; +#endif + + assert( pFile ); + OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock, + pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, + osGetpid(0))); + + assert( eFileLock<=SHARED_LOCK ); + if( pFile->eFileLock<=eFileLock ){ + return SQLITE_OK; + } + pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + assert( pInode->nShared!=0 ); + if( pFile->eFileLock>SHARED_LOCK ){ + assert( pInode->eFileLock==pFile->eFileLock ); + SimulateIOErrorBenign(1); + SimulateIOError( h=(-1) ) + SimulateIOErrorBenign(0); + +#ifdef SQLITE_DEBUG + /* When reducing a lock such that other processes can start + ** reading the database file again, make sure that the + ** transaction counter was updated if any part of the database + ** file changed. If the transaction counter is not updated, + ** other connections to the same file might not realize that + ** the file has changed and hence might not know to flush their + ** cache. The use of a stale cache can lead to database corruption. + */ + assert( pFile->inNormalWrite==0 + || pFile->dbUpdate==0 + || pFile->transCntrChng==1 ); + pFile->inNormalWrite = 0; +#endif + + if( pFile->eFileLock==EXCLUSIVE_LOCK ){ + rc = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0); + if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1) ){ + /* only re-establish the shared lock if necessary */ + int sharedLockByte = SHARED_FIRST+pInode->sharedByte; + rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 1); + } else { + skipShared = 1; + } + } + if( rc==SQLITE_OK && pFile->eFileLock>=PENDING_LOCK ){ + rc = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); + } + if( rc==SQLITE_OK && pFile->eFileLock>=RESERVED_LOCK && context->reserved ){ + rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); + if( !rc ){ + context->reserved = 0; + } + } + if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){ + pInode->eFileLock = SHARED_LOCK; + } + } + if( rc==SQLITE_OK && eFileLock==NO_LOCK ){ + + /* Decrement the shared lock counter. Release the lock using an + ** OS call only when all threads in this same process have released + ** the lock. + */ + unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte; + pInode->nShared--; + if( pInode->nShared==0 ){ + SimulateIOErrorBenign(1); + SimulateIOError( h=(-1) ) + SimulateIOErrorBenign(0); + if( !skipShared ){ + rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0); + } + if( !rc ){ + pInode->eFileLock = NO_LOCK; + pFile->eFileLock = NO_LOCK; + } + } + if( rc==SQLITE_OK ){ + pInode->nLock--; + assert( pInode->nLock>=0 ); + if( pInode->nLock==0 ) closePendingFds(pFile); + } + } + + sqlite3_mutex_leave(pInode->pLockMutex); + if( rc==SQLITE_OK ){ + pFile->eFileLock = eFileLock; + } + return rc; +} + +/* +** Close a file & cleanup AFP specific locking context +*/ +static int afpClose(sqlite3_file *id) { + int rc = SQLITE_OK; + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + afpUnlock(id, NO_LOCK); + assert( unixFileMutexNotheld(pFile) ); + unixEnterMutex(); + if( pFile->pInode ){ + unixInodeInfo *pInode = pFile->pInode; + sqlite3_mutex_enter(pInode->pLockMutex); + if( pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->aPending. It will be automatically closed when + ** the last lock is cleared. + */ + setPendingFd(pFile); + } + sqlite3_mutex_leave(pInode->pLockMutex); + } + releaseInodeInfo(pFile); + sqlite3_free(pFile->lockingContext); + rc = closeUnixFile(id); + unixLeaveMutex(); + return rc; +} + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The code above is the AFP lock implementation. The code is specific +** to MacOSX and does not work on other unix platforms. No alternative +** is available. If you don't compile for a mac, then the "unix-afp" +** VFS is not available. +** +********************* End of the AFP lock implementation ********************** +******************************************************************************/ + +/****************************************************************************** +*************************** Begin NFS Locking ********************************/ + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* + ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock + ** must be either NO_LOCK or SHARED_LOCK. + ** + ** If the locking level of the file descriptor is already at or below + ** the requested locking level, this routine is a no-op. + */ +static int nfsUnlock(sqlite3_file *id, int eFileLock){ + return posixUnlock(id, eFileLock, 1); +} + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The code above is the NFS lock implementation. The code is specific +** to MacOSX and does not work on other unix platforms. No alternative +** is available. +** +********************* End of the NFS lock implementation ********************** +******************************************************************************/ + +/****************************************************************************** +**************** Non-locking sqlite3_file methods ***************************** +** +** The next division contains implementations for all methods of the +** sqlite3_file object other than the locking methods. The locking +** methods were defined in divisions above (one locking method per +** division). Those methods that are common to all locking modes +** are gather together into this division. +*/ + +/* +** Seek to the offset passed as the second argument, then read cnt +** bytes into pBuf. Return the number of bytes actually read. +** +** NB: If you define USE_PREAD or USE_PREAD64, then it might also +** be necessary to define _XOPEN_SOURCE to be 500. This varies from +** one system to another. Since SQLite does not define USE_PREAD +** in any form by default, we will not attempt to define _XOPEN_SOURCE. +** See tickets #2741 and #2681. +** +** To avoid stomping the errno value on a failed read the lastErrno value +** is set before returning. +*/ +static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ + int got; + int prior = 0; +#if (!defined(USE_PREAD) && !defined(USE_PREAD64)) + i64 newOffset; +#endif + TIMER_START; + assert( cnt==(cnt&0x1ffff) ); + assert( id->h>2 ); + do{ +#if defined(USE_PREAD) + got = osPread(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#elif defined(USE_PREAD64) + got = osPread64(id->h, pBuf, cnt, offset); + SimulateIOError( got = -1 ); +#else + newOffset = lseek(id->h, offset, SEEK_SET); + SimulateIOError( newOffset = -1 ); + if( newOffset<0 ){ + storeLastErrno((unixFile*)id, errno); + return -1; + } + got = osRead(id->h, pBuf, cnt); +#endif + if( got==cnt ) break; + if( got<0 ){ + if( errno==EINTR ){ got = 1; continue; } + prior = 0; + storeLastErrno((unixFile*)id, errno); + break; + }else if( got>0 ){ + cnt -= got; + offset += got; + prior += got; + pBuf = (void*)(got + (char*)pBuf); + } + }while( got>0 ); + TIMER_END; + OSTRACE(("READ %-3d %5d %7lld %llu\n", + id->h, got+prior, offset-prior, TIMER_ELAPSED)); + return got+prior; +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int unixRead( + sqlite3_file *id, + void *pBuf, + int amt, + sqlite3_int64 offset +){ + unixFile *pFile = (unixFile *)id; + int got; + assert( id ); + assert( offset>=0 ); + assert( amt>0 ); + + /* If this is a database file (not a journal, super-journal or temp + ** file), the bytes in the locking range should never be read or written. */ +#if 0 + assert( pFile->pPreallocatedUnused==0 + || offset>=PENDING_BYTE+512 + || offset+amt<=PENDING_BYTE + ); +#endif + +#if SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this read request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); + return SQLITE_OK; + }else{ + int nCopy = pFile->mmapSize - offset; + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + + got = seekAndRead(pFile, offset, pBuf, amt); + if( got==amt ){ + return SQLITE_OK; + }else if( got<0 ){ + /* pFile->lastErrno has been set by seekAndRead(). + ** Usually we return SQLITE_IOERR_READ here, though for some + ** kinds of errors we return SQLITE_IOERR_CORRUPTFS. The + ** SQLITE_IOERR_CORRUPTFS will be converted into SQLITE_CORRUPT + ** prior to returning to the application by the sqlite3ApiExit() + ** routine. + */ + switch( pFile->lastErrno ){ + case ERANGE: + case EIO: +#ifdef ENXIO + case ENXIO: +#endif +#ifdef EDEVERR + case EDEVERR: +#endif + return SQLITE_IOERR_CORRUPTFS; + } + return SQLITE_IOERR_READ; + }else{ + storeLastErrno(pFile, 0); /* not a system error */ + /* Unread parts of the buffer must be zero-filled */ + memset(&((char*)pBuf)[got], 0, amt-got); + return SQLITE_IOERR_SHORT_READ; + } +} + +/* +** Attempt to seek the file-descriptor passed as the first argument to +** absolute offset iOff, then attempt to write nBuf bytes of data from +** pBuf to it. If an error occurs, return -1 and set *piErrno. Otherwise, +** return the actual number of bytes written (which may be less than +** nBuf). +*/ +static int seekAndWriteFd( + int fd, /* File descriptor to write to */ + i64 iOff, /* File offset to begin writing at */ + const void *pBuf, /* Copy data from this buffer to the file */ + int nBuf, /* Size of buffer pBuf in bytes */ + int *piErrno /* OUT: Error number if error occurs */ +){ + int rc = 0; /* Value returned by system call */ + + assert( nBuf==(nBuf&0x1ffff) ); + assert( fd>2 ); + assert( piErrno!=0 ); + nBuf &= 0x1ffff; + TIMER_START; + +#if defined(USE_PREAD) + do{ rc = (int)osPwrite(fd, pBuf, nBuf, iOff); }while( rc<0 && errno==EINTR ); +#elif defined(USE_PREAD64) + do{ rc = (int)osPwrite64(fd, pBuf, nBuf, iOff);}while( rc<0 && errno==EINTR); +#else + do{ + i64 iSeek = lseek(fd, iOff, SEEK_SET); + SimulateIOError( iSeek = -1 ); + if( iSeek<0 ){ + rc = -1; + break; + } + rc = osWrite(fd, pBuf, nBuf); + }while( rc<0 && errno==EINTR ); +#endif + + TIMER_END; + OSTRACE(("WRITE %-3d %5d %7lld %llu\n", fd, rc, iOff, TIMER_ELAPSED)); + + if( rc<0 ) *piErrno = errno; + return rc; +} + + +/* +** Seek to the offset in id->offset then read cnt bytes into pBuf. +** Return the number of bytes actually read. Update the offset. +** +** To avoid stomping the errno value on a failed write the lastErrno value +** is set before returning. +*/ +static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ + return seekAndWriteFd(id->h, offset, pBuf, cnt, &id->lastErrno); +} + + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int unixWrite( + sqlite3_file *id, + const void *pBuf, + int amt, + sqlite3_int64 offset +){ + unixFile *pFile = (unixFile*)id; + int wrote = 0; + assert( id ); + assert( amt>0 ); + + /* If this is a database file (not a journal, super-journal or temp + ** file), the bytes in the locking range should never be read or written. */ +#if 0 + assert( pFile->pPreallocatedUnused==0 + || offset>=PENDING_BYTE+512 + || offset+amt<=PENDING_BYTE + ); +#endif + +#ifdef SQLITE_DEBUG + /* If we are doing a normal write to a database file (as opposed to + ** doing a hot-journal rollback or a write to some file other than a + ** normal database file) then record the fact that the database + ** has changed. If the transaction counter is modified, record that + ** fact too. + */ + if( pFile->inNormalWrite ){ + pFile->dbUpdate = 1; /* The database has been modified */ + if( offset<=24 && offset+amt>=27 ){ + int rc; + char oldCntr[4]; + SimulateIOErrorBenign(1); + rc = seekAndRead(pFile, 24, oldCntr, 4); + SimulateIOErrorBenign(0); + if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){ + pFile->transCntrChng = 1; /* The transaction counter has changed */ + } + } + } +#endif + +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this write request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); + return SQLITE_OK; + }else{ + int nCopy = pFile->mmapSize - offset; + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + + while( (wrote = seekAndWrite(pFile, offset, pBuf, amt))0 ){ + amt -= wrote; + offset += wrote; + pBuf = &((char*)pBuf)[wrote]; + } + SimulateIOError(( wrote=(-1), amt=1 )); + SimulateDiskfullError(( wrote=0, amt=1 )); + + if( amt>wrote ){ + if( wrote<0 && pFile->lastErrno!=ENOSPC ){ + /* lastErrno set by seekAndWrite */ + return SQLITE_IOERR_WRITE; + }else{ + storeLastErrno(pFile, 0); /* not a system error */ + return SQLITE_FULL; + } + } + + return SQLITE_OK; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occurring at the right times. +*/ +SQLITE_API int sqlite3_sync_count = 0; +SQLITE_API int sqlite3_fullsync_count = 0; +#endif + +/* +** We do not trust systems to provide a working fdatasync(). Some do. +** Others do no. To be safe, we will stick with the (slightly slower) +** fsync(). If you know that your system does support fdatasync() correctly, +** then simply compile with -Dfdatasync=fdatasync or -DHAVE_FDATASYNC +*/ +#if !defined(fdatasync) && !HAVE_FDATASYNC +# define fdatasync fsync +#endif + +/* +** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not +** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently +** only available on Mac OS X. But that could change. +*/ +#ifdef F_FULLFSYNC +# define HAVE_FULLFSYNC 1 +#else +# define HAVE_FULLFSYNC 0 +#endif + + +/* +** The fsync() system call does not work as advertised on many +** unix systems. The following procedure is an attempt to make +** it work better. +** +** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful +** for testing when we want to run through the test suite quickly. +** You are strongly advised *not* to deploy with SQLITE_NO_SYNC +** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash +** or power failure will likely corrupt the database file. +** +** SQLite sets the dataOnly flag if the size of the file is unchanged. +** The idea behind dataOnly is that it should only write the file content +** to disk, not the inode. We only set dataOnly if the file size is +** unchanged since the file size is part of the inode. However, +** Ted Ts'o tells us that fdatasync() will also write the inode if the +** file size has changed. The only real difference between fdatasync() +** and fsync(), Ted tells us, is that fdatasync() will not flush the +** inode if the mtime or owner or other inode attributes have changed. +** We only care about the file size, not the other file attributes, so +** as far as SQLite is concerned, an fdatasync() is always adequate. +** So, we always use fdatasync() if it is available, regardless of +** the value of the dataOnly flag. +*/ +static int full_fsync(int fd, int fullSync, int dataOnly){ + int rc; + + /* The following "ifdef/elif/else/" block has the same structure as + ** the one below. It is replicated here solely to avoid cluttering + ** up the real code with the UNUSED_PARAMETER() macros. + */ +#ifdef SQLITE_NO_SYNC + UNUSED_PARAMETER(fd); + UNUSED_PARAMETER(fullSync); + UNUSED_PARAMETER(dataOnly); +#elif HAVE_FULLFSYNC + UNUSED_PARAMETER(dataOnly); +#else + UNUSED_PARAMETER(fullSync); + UNUSED_PARAMETER(dataOnly); +#endif + + /* Record the number of times that we do a normal fsync() and + ** FULLSYNC. This is used during testing to verify that this procedure + ** gets called with the correct arguments. + */ +#ifdef SQLITE_TEST + if( fullSync ) sqlite3_fullsync_count++; + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op. But go ahead and call fstat() to validate the file + ** descriptor as we need a method to provoke a failure during + ** coverate testing. + */ +#ifdef SQLITE_NO_SYNC + { + struct stat buf; + rc = osFstat(fd, &buf); + } +#elif HAVE_FULLFSYNC + if( fullSync ){ + rc = osFcntl(fd, F_FULLFSYNC, 0); + }else{ + rc = 1; + } + /* If the FULLFSYNC failed, fall back to attempting an fsync(). + ** It shouldn't be possible for fullfsync to fail on the local + ** file system (on OSX), so failure indicates that FULLFSYNC + ** isn't supported for this file system. So, attempt an fsync + ** and (for now) ignore the overhead of a superfluous fcntl call. + ** It'd be better to detect fullfsync support once and avoid + ** the fcntl call every time sync is called. + */ + if( rc ) rc = fsync(fd); + +#elif defined(__APPLE__) + /* fdatasync() on HFS+ doesn't yet flush the file size if it changed correctly + ** so currently we default to the macro that redefines fdatasync to fsync + */ + rc = fsync(fd); +#else + rc = fdatasync(fd); +#if OS_VXWORKS + if( rc==-1 && errno==ENOTSUP ){ + rc = fsync(fd); + } +#endif /* OS_VXWORKS */ +#endif /* ifdef SQLITE_NO_SYNC elif HAVE_FULLFSYNC */ + + if( OS_VXWORKS && rc!= -1 ){ + rc = 0; + } + return rc; +} + +/* +** Open a file descriptor to the directory containing file zFilename. +** If successful, *pFd is set to the opened file descriptor and +** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM +** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined +** value. +** +** The directory file descriptor is used for only one thing - to +** fsync() a directory to make sure file creation and deletion events +** are flushed to disk. Such fsyncs are not needed on newer +** journaling filesystems, but are required on older filesystems. +** +** This routine can be overridden using the xSetSysCall interface. +** The ability to override this routine was added in support of the +** chromium sandbox. Opening a directory is a security risk (we are +** told) so making it overrideable allows the chromium sandbox to +** replace this routine with a harmless no-op. To make this routine +** a no-op, replace it with a stub that returns SQLITE_OK but leaves +** *pFd set to a negative number. +** +** If SQLITE_OK is returned, the caller is responsible for closing +** the file descriptor *pFd using close(). +*/ +static int openDirectory(const char *zFilename, int *pFd){ + int ii; + int fd = -1; + char zDirname[MAX_PATHNAME+1]; + + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); + for(ii=(int)strlen(zDirname); ii>0 && zDirname[ii]!='/'; ii--); + if( ii>0 ){ + zDirname[ii] = '\0'; + }else{ + if( zDirname[0]!='/' ) zDirname[0] = '.'; + zDirname[1] = 0; + } + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); + if( fd>=0 ){ + OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); + } + *pFd = fd; + if( fd>=0 ) return SQLITE_OK; + return unixLogError(SQLITE_CANTOPEN_BKPT, "openDirectory", zDirname); +} + +/* +** Make sure all writes to a particular file are committed to disk. +** +** If dataOnly==0 then both the file itself and its metadata (file +** size, access time, etc) are synced. If dataOnly!=0 then only the +** file data is synced. +** +** Under Unix, also make sure that the directory entry for the file +** has been created by fsync-ing the directory that contains the file. +** If we do not do this and we encounter a power failure, the directory +** entry for the journal might not exist after we reboot. The next +** SQLite to access the file will not know that the journal exists (because +** the directory entry for the journal was never created) and the transaction +** will not roll back - possibly leading to database corruption. +*/ +static int unixSync(sqlite3_file *id, int flags){ + int rc; + unixFile *pFile = (unixFile*)id; + + int isDataOnly = (flags&SQLITE_SYNC_DATAONLY); + int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL; + + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + /* Unix cannot, but some systems may return SQLITE_FULL from here. This + ** line is to test that doing so does not cause any problems. + */ + SimulateDiskfullError( return SQLITE_FULL ); + + assert( pFile ); + OSTRACE(("SYNC %-3d\n", pFile->h)); + rc = full_fsync(pFile->h, isFullsync, isDataOnly); + SimulateIOError( rc=1 ); + if( rc ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); + } + + /* Also fsync the directory containing the file if the DIRSYNC flag + ** is set. This is a one-time occurrence. Many systems (examples: AIX) + ** are unable to fsync a directory, so ignore errors on the fsync. + */ + if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ + int dirfd; + OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, + HAVE_FULLFSYNC, isFullsync)); + rc = osOpenDirectory(pFile->zPath, &dirfd); + if( rc==SQLITE_OK ){ + full_fsync(dirfd, 0, 0); + robust_close(pFile, dirfd, __LINE__); + }else{ + assert( rc==SQLITE_CANTOPEN ); + rc = SQLITE_OK; + } + pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; + } + return rc; +} + +/* +** Truncate an open file to a specified size +*/ +static int unixTruncate(sqlite3_file *id, i64 nByte){ + unixFile *pFile = (unixFile *)id; + int rc; + assert( pFile ); + SimulateIOError( return SQLITE_IOERR_TRUNCATE ); + + /* If the user has configured a chunk-size for this file, truncate the + ** file so that it consists of an integer number of chunks (i.e. the + ** actual file size after the operation may be larger than the requested + ** size). + */ + if( pFile->szChunk>0 ){ + nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; + } + + rc = robust_ftruncate(pFile->h, nByte); + if( rc ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); + }else{ +#ifdef SQLITE_DEBUG + /* If we are doing a normal write to a database file (as opposed to + ** doing a hot-journal rollback or a write to some file other than a + ** normal database file) and we truncate the file to zero length, + ** that effectively updates the change counter. This might happen + ** when restoring a database using the backup API from a zero-length + ** source. + */ + if( pFile->inNormalWrite && nByte==0 ){ + pFile->transCntrChng = 1; + } +#endif + +#if SQLITE_MAX_MMAP_SIZE>0 + /* If the file was just truncated to a size smaller than the currently + ** mapped region, reduce the effective mapping size as well. SQLite will + ** use read() and write() to access data beyond this point from now on. + */ + if( nBytemmapSize ){ + pFile->mmapSize = nByte; + } +#endif + + return SQLITE_OK; + } +} + +/* +** Determine the current size of a file in bytes +*/ +static int unixFileSize(sqlite3_file *id, i64 *pSize){ + int rc; + struct stat buf; + assert( id ); + rc = osFstat(((unixFile*)id)->h, &buf); + SimulateIOError( rc=1 ); + if( rc!=0 ){ + storeLastErrno((unixFile*)id, errno); + return SQLITE_IOERR_FSTAT; + } + *pSize = buf.st_size; + + /* When opening a zero-size database, the findInodeInfo() procedure + ** writes a single byte into that file in order to work around a bug + ** in the OS-X msdos filesystem. In order to avoid problems with upper + ** layers, we need to report this file size as zero even though it is + ** really 1. Ticket #3260. + */ + if( *pSize==1 ) *pSize = 0; + + + return SQLITE_OK; +} + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +/* +** Handler for proxy-locking file-control verbs. Defined below in the +** proxying locking division. +*/ +static int proxyFileControl(sqlite3_file*,int,void*); +#endif + +/* +** This function is called to handle the SQLITE_FCNTL_SIZE_HINT +** file-control operation. Enlarge the database to nBytes in size +** (rounded up to the next chunk-size). If the database is already +** nBytes or larger, this routine is a no-op. +*/ +static int fcntlSizeHint(unixFile *pFile, i64 nByte){ + if( pFile->szChunk>0 ){ + i64 nSize; /* Required file size */ + struct stat buf; /* Used to hold return values of fstat() */ + + if( osFstat(pFile->h, &buf) ){ + return SQLITE_IOERR_FSTAT; + } + + nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; + if( nSize>(i64)buf.st_size ){ + +#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE + /* The code below is handling the return value of osFallocate() + ** correctly. posix_fallocate() is defined to "returns zero on success, + ** or an error number on failure". See the manpage for details. */ + int err; + do{ + err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size); + }while( err==EINTR ); + if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE; +#else + /* If the OS does not have posix_fallocate(), fake it. Write a + ** single byte to the last byte in each block that falls entirely + ** within the extended region. Then, if required, a single byte + ** at offset (nSize-1), to set the size of the file correctly. + ** This is a similar technique to that used by glibc on systems + ** that do not have a real fallocate() call. + */ + int nBlk = buf.st_blksize; /* File-system block size */ + int nWrite = 0; /* Number of bytes written by seekAndWrite */ + i64 iWrite; /* Next offset to write to */ + + iWrite = (buf.st_size/nBlk)*nBlk + nBlk - 1; + assert( iWrite>=buf.st_size ); + assert( ((iWrite+1)%nBlk)==0 ); + for(/*no-op*/; iWrite=nSize ) iWrite = nSize - 1; + nWrite = seekAndWrite(pFile, iWrite, "", 1); + if( nWrite!=1 ) return SQLITE_IOERR_WRITE; + } +#endif + } + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->mmapSizeMax>0 && nByte>pFile->mmapSize ){ + int rc; + if( pFile->szChunk<=0 ){ + if( robust_ftruncate(pFile->h, nByte) ){ + storeLastErrno(pFile, errno); + return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); + } + } + + rc = unixMapfile(pFile, nByte); + return rc; + } +#endif + + return SQLITE_OK; +} + +/* +** If *pArg is initially negative then this is a query. Set *pArg to +** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. +** +** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. +*/ +static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ + if( *pArg<0 ){ + *pArg = (pFile->ctrlFlags & mask)!=0; + }else if( (*pArg)==0 ){ + pFile->ctrlFlags &= ~mask; + }else{ + pFile->ctrlFlags |= mask; + } +} + +/* Forward declaration */ +static int unixGetTempname(int nBuf, char *zBuf); +#ifndef SQLITE_OMIT_WAL + static int unixFcntlExternalReader(unixFile*, int*); +#endif + +/* +** Information and control of an open file handle. +*/ +static int unixFileControl(sqlite3_file *id, int op, void *pArg){ + unixFile *pFile = (unixFile*)id; + switch( op ){ +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + case SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_START_ATOMIC_WRITE); + return rc ? SQLITE_IOERR_BEGIN_ATOMIC : SQLITE_OK; + } + case SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_COMMIT_ATOMIC_WRITE); + return rc ? SQLITE_IOERR_COMMIT_ATOMIC : SQLITE_OK; + } + case SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_ABORT_VOLATILE_WRITE); + return rc ? SQLITE_IOERR_ROLLBACK_ATOMIC : SQLITE_OK; + } +#endif /* __linux__ && SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = pFile->eFileLock; + return SQLITE_OK; + } + case SQLITE_FCNTL_LAST_ERRNO: { + *(int*)pArg = pFile->lastErrno; + return SQLITE_OK; + } + case SQLITE_FCNTL_CHUNK_SIZE: { + pFile->szChunk = *(int *)pArg; + return SQLITE_OK; + } + case SQLITE_FCNTL_SIZE_HINT: { + int rc; + SimulateIOErrorBenign(1); + rc = fcntlSizeHint(pFile, *(i64 *)pArg); + SimulateIOErrorBenign(0); + return rc; + } + case SQLITE_FCNTL_PERSIST_WAL: { + unixModeBit(pFile, UNIXFILE_PERSIST_WAL, (int*)pArg); + return SQLITE_OK; + } + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + unixModeBit(pFile, UNIXFILE_PSOW, (int*)pArg); + return SQLITE_OK; + } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + return SQLITE_OK; + } + case SQLITE_FCNTL_TEMPFILENAME: { + char *zTFile = sqlite3_malloc64( pFile->pVfs->mxPathname ); + if( zTFile ){ + unixGetTempname(pFile->pVfs->mxPathname, zTFile); + *(char**)pArg = zTFile; + } + return SQLITE_OK; + } + case SQLITE_FCNTL_HAS_MOVED: { + *(int*)pArg = fileHasMoved(pFile); + return SQLITE_OK; + } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + case SQLITE_FCNTL_LOCK_TIMEOUT: { + int iOld = pFile->iBusyTimeout; + pFile->iBusyTimeout = *(int*)pArg; + *(int*)pArg = iOld; + return SQLITE_OK; + } +#endif +#if SQLITE_MAX_MMAP_SIZE>0 + case SQLITE_FCNTL_MMAP_SIZE: { + i64 newLimit = *(i64*)pArg; + int rc = SQLITE_OK; + if( newLimit>sqlite3GlobalConfig.mxMmap ){ + newLimit = sqlite3GlobalConfig.mxMmap; + } + + /* The value of newLimit may be eventually cast to (size_t) and passed + ** to mmap(). Restrict its value to 2GB if (size_t) is not at least a + ** 64-bit type. */ + if( newLimit>0 && sizeof(size_t)<8 ){ + newLimit = (newLimit & 0x7FFFFFFF); + } + + *(i64*)pArg = pFile->mmapSizeMax; + if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + pFile->mmapSizeMax = newLimit; + if( pFile->mmapSize>0 ){ + unixUnmapfile(pFile); + rc = unixMapfile(pFile, -1); + } + } + return rc; + } +#endif +#ifdef SQLITE_DEBUG + /* The pager calls this method to signal that it has done + ** a rollback and that the database is therefore unchanged and + ** it hence it is OK for the transaction change counter to be + ** unchanged. + */ + case SQLITE_FCNTL_DB_UNCHANGED: { + ((unixFile*)id)->dbUpdate = 0; + return SQLITE_OK; + } +#endif +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + case SQLITE_FCNTL_SET_LOCKPROXYFILE: + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { + return proxyFileControl(id,op,pArg); + } +#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ + + case SQLITE_FCNTL_EXTERNAL_READER: { +#ifndef SQLITE_OMIT_WAL + return unixFcntlExternalReader((unixFile*)id, (int*)pArg); +#else + *(int*)pArg = 0; + return SQLITE_OK; +#endif + } + } + return SQLITE_NOTFOUND; +} + +/* +** If pFd->sectorSize is non-zero when this function is called, it is a +** no-op. Otherwise, the values of pFd->sectorSize and +** pFd->deviceCharacteristics are set according to the file-system +** characteristics. +** +** There are two versions of this function. One for QNX and one for all +** other systems. +*/ +#ifndef __QNXNTO__ +static void setDeviceCharacteristics(unixFile *pFd){ + assert( pFd->deviceCharacteristics==0 || pFd->sectorSize!=0 ); + if( pFd->sectorSize==0 ){ +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int res; + u32 f = 0; + + /* Check for support for F2FS atomic batch writes. */ + res = osIoctl(pFd->h, F2FS_IOC_GET_FEATURES, &f); + if( res==0 && (f & F2FS_FEATURE_ATOMIC_WRITE) ){ + pFd->deviceCharacteristics = SQLITE_IOCAP_BATCH_ATOMIC; + } +#endif /* __linux__ && SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + /* Set the POWERSAFE_OVERWRITE flag if requested. */ + if( pFd->ctrlFlags & UNIXFILE_PSOW ){ + pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; + } + + pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + } +} +#else +#include +#include +static void setDeviceCharacteristics(unixFile *pFile){ + if( pFile->sectorSize == 0 ){ + struct statvfs fsInfo; + + /* Set defaults for non-supported filesystems */ + pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + pFile->deviceCharacteristics = 0; + if( fstatvfs(pFile->h, &fsInfo) == -1 ) { + return; + } + + if( !strcmp(fsInfo.f_basetype, "tmp") ) { + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC4K | /* All ram filesystem writes are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( strstr(fsInfo.f_basetype, "etfs") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* etfs cluster size writes are atomic */ + (pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) | + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( !strcmp(fsInfo.f_basetype, "qnx6") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC | /* All filesystem writes are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( !strcmp(fsInfo.f_basetype, "qnx4") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* full bitset of atomics from max sector size and smaller */ + ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else if( strstr(fsInfo.f_basetype, "dos") ){ + pFile->sectorSize = fsInfo.f_bsize; + pFile->deviceCharacteristics = + /* full bitset of atomics from max sector size and smaller */ + ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind + ** so it is ordered */ + 0; + }else{ + pFile->deviceCharacteristics = + SQLITE_IOCAP_ATOMIC512 | /* blocks are atomic */ + SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until + ** the write succeeds */ + 0; + } + } + /* Last chance verification. If the sector size isn't a multiple of 512 + ** then it isn't valid.*/ + if( pFile->sectorSize % 512 != 0 ){ + pFile->deviceCharacteristics = 0; + pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + } +} +#endif + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +static int unixSectorSize(sqlite3_file *id){ + unixFile *pFd = (unixFile*)id; + setDeviceCharacteristics(pFd); + return pFd->sectorSize; +} + +/* +** Return the device characteristics for the file. +** +** This VFS is set up to return SQLITE_IOCAP_POWERSAFE_OVERWRITE by default. +** However, that choice is controversial since technically the underlying +** file system does not always provide powersafe overwrites. (In other +** words, after a power-loss event, parts of the file that were never +** written might end up being altered.) However, non-PSOW behavior is very, +** very rare. And asserting PSOW makes a large reduction in the amount +** of required I/O for journaling, since a lot of padding is eliminated. +** Hence, while POWERSAFE_OVERWRITE is on by default, there is a file-control +** available to turn it off and URI query parameter available to turn it off. +*/ +static int unixDeviceCharacteristics(sqlite3_file *id){ + unixFile *pFd = (unixFile*)id; + setDeviceCharacteristics(pFd); + return pFd->deviceCharacteristics; +} + +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + +/* +** Return the system page size. +** +** This function should not be called directly by other code in this file. +** Instead, it should be called via macro osGetpagesize(). +*/ +static int unixGetpagesize(void){ +#if OS_VXWORKS + return 1024; +#elif defined(_BSD_SOURCE) + return getpagesize(); +#else + return (int)sysconf(_SC_PAGESIZE); +#endif +} + +#endif /* !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 */ + +#ifndef SQLITE_OMIT_WAL + +/* +** Object used to represent an shared memory buffer. +** +** When multiple threads all reference the same wal-index, each thread +** has its own unixShm object, but they all point to a single instance +** of this unixShmNode object. In other words, each wal-index is opened +** only once per process. +** +** Each unixShmNode object is connected to a single unixInodeInfo object. +** We could coalesce this object into unixInodeInfo, but that would mean +** every open file that does not use shared memory (in other words, most +** open files) would have to carry around this extra information. So +** the unixInodeInfo object contains a pointer to this unixShmNode object +** and the unixShmNode object is created only when needed. +** +** unixMutexHeld() must be true when creating or destroying +** this object or while reading or writing the following fields: +** +** nRef +** +** The following fields are read-only after the object is created: +** +** hShm +** zFilename +** +** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and +** unixMutexHeld() is true when reading or writing any other field +** in this structure. +*/ +struct unixShmNode { + unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ + sqlite3_mutex *pShmMutex; /* Mutex to access this object */ + char *zFilename; /* Name of the mmapped file */ + int hShm; /* Open file descriptor */ + int szRegion; /* Size of shared-memory regions */ + u16 nRegion; /* Size of array apRegion */ + u8 isReadonly; /* True if read-only */ + u8 isUnlocked; /* True if no DMS lock held */ + char **apRegion; /* Array of mapped shared-memory regions */ + int nRef; /* Number of unixShm objects pointing to this */ + unixShm *pFirst; /* All unixShm objects pointing to this */ + int aLock[SQLITE_SHM_NLOCK]; /* # shared locks on slot, -1==excl lock */ +#ifdef SQLITE_DEBUG + u8 exclMask; /* Mask of exclusive locks held */ + u8 sharedMask; /* Mask of shared locks held */ + u8 nextShmId; /* Next available unixShm.id value */ +#endif +}; + +/* +** Structure used internally by this VFS to record the state of an +** open shared memory connection. +** +** The following fields are initialized when this object is created and +** are read-only thereafter: +** +** unixShm.pShmNode +** unixShm.id +** +** All other fields are read/write. The unixShm.pShmNode->pShmMutex must +** be held while accessing any read/write fields. +*/ +struct unixShm { + unixShmNode *pShmNode; /* The underlying unixShmNode object */ + unixShm *pNext; /* Next unixShm with the same unixShmNode */ + u8 hasMutex; /* True if holding the unixShmNode->pShmMutex */ + u8 id; /* Id of this connection within its unixShmNode */ + u16 sharedMask; /* Mask of shared locks held */ + u16 exclMask; /* Mask of exclusive locks held */ +}; + +/* +** Constants used for locking +*/ +#define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ +#define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ + +/* +** Use F_GETLK to check whether or not there are any readers with open +** wal-mode transactions in other processes on database file pFile. If +** no error occurs, return SQLITE_OK and set (*piOut) to 1 if there are +** such transactions, or 0 otherwise. If an error occurs, return an +** SQLite error code. The final value of *piOut is undefined in this +** case. +*/ +static int unixFcntlExternalReader(unixFile *pFile, int *piOut){ + int rc = SQLITE_OK; + *piOut = 0; + if( pFile->pShm){ + unixShmNode *pShmNode = pFile->pShm->pShmNode; + struct flock f; + + memset(&f, 0, sizeof(f)); + f.l_type = F_WRLCK; + f.l_whence = SEEK_SET; + f.l_start = UNIX_SHM_BASE + 3; + f.l_len = SQLITE_SHM_NLOCK - 3; + + sqlite3_mutex_enter(pShmNode->pShmMutex); + if( osFcntl(pShmNode->hShm, F_GETLK, &f)<0 ){ + rc = SQLITE_IOERR_LOCK; + }else{ + *piOut = (f.l_type!=F_UNLCK); + } + sqlite3_mutex_leave(pShmNode->pShmMutex); + } + + return rc; +} + + +/* +** Apply posix advisory locks for all bytes from ofst through ofst+n-1. +** +** Locks block if the mask is exactly UNIX_SHM_C and are non-blocking +** otherwise. +*/ +static int unixShmSystemLock( + unixFile *pFile, /* Open connection to the WAL file */ + int lockType, /* F_UNLCK, F_RDLCK, or F_WRLCK */ + int ofst, /* First byte of the locking range */ + int n /* Number of bytes to lock */ +){ + unixShmNode *pShmNode; /* Apply locks to this open shared-memory segment */ + struct flock f; /* The posix advisory locking structure */ + int rc = SQLITE_OK; /* Result code form fcntl() */ + + /* Access to the unixShmNode object is serialized by the caller */ + pShmNode = pFile->pInode->pShmNode; + assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) ); + assert( pShmNode->nRef>0 || unixMutexHeld() ); + + /* Shared locks never span more than one byte */ + assert( n==1 || lockType!=F_RDLCK ); + + /* Locks are within range */ + assert( n>=1 && n<=SQLITE_SHM_NLOCK ); + + if( pShmNode->hShm>=0 ){ + int res; + /* Initialize the locking parameters */ + f.l_type = lockType; + f.l_whence = SEEK_SET; + f.l_start = ofst; + f.l_len = n; + res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); + if( res==-1 ){ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); +#else + rc = SQLITE_BUSY; +#endif + } + } + + /* Update the global lock state and do debug tracing */ +#ifdef SQLITE_DEBUG + { u16 mask; + OSTRACE(("SHM-LOCK ")); + mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<exclMask &= ~mask; + pShmNode->sharedMask &= ~mask; + }else if( lockType==F_RDLCK ){ + OSTRACE(("read-lock %d ok", ofst)); + pShmNode->exclMask &= ~mask; + pShmNode->sharedMask |= mask; + }else{ + assert( lockType==F_WRLCK ); + OSTRACE(("write-lock %d ok", ofst)); + pShmNode->exclMask |= mask; + pShmNode->sharedMask &= ~mask; + } + }else{ + if( lockType==F_UNLCK ){ + OSTRACE(("unlock %d failed", ofst)); + }else if( lockType==F_RDLCK ){ + OSTRACE(("read-lock failed")); + }else{ + assert( lockType==F_WRLCK ); + OSTRACE(("write-lock %d failed", ofst)); + } + } + OSTRACE((" - afterwards %03x,%03x\n", + pShmNode->sharedMask, pShmNode->exclMask)); + } +#endif + + return rc; +} + +/* +** Return the minimum number of 32KB shm regions that should be mapped at +** a time, assuming that each mapping must be an integer multiple of the +** current system page-size. +** +** Usually, this is 1. The exception seems to be systems that are configured +** to use 64KB pages - in this case each mapping must cover at least two +** shm regions. +*/ +static int unixShmRegionPerMap(void){ + int shmsz = 32*1024; /* SHM region size */ + int pgsz = osGetpagesize(); /* System page size */ + assert( ((pgsz-1)&pgsz)==0 ); /* Page size must be a power of 2 */ + if( pgszpInode->pShmNode; + assert( unixMutexHeld() ); + if( p && ALWAYS(p->nRef==0) ){ + int nShmPerMap = unixShmRegionPerMap(); + int i; + assert( p->pInode==pFd->pInode ); + sqlite3_mutex_free(p->pShmMutex); + for(i=0; inRegion; i+=nShmPerMap){ + if( p->hShm>=0 ){ + osMunmap(p->apRegion[i], p->szRegion); + }else{ + sqlite3_free(p->apRegion[i]); + } + } + sqlite3_free(p->apRegion); + if( p->hShm>=0 ){ + robust_close(pFd, p->hShm, __LINE__); + p->hShm = -1; + } + p->pInode->pShmNode = 0; + sqlite3_free(p); + } +} + +/* +** The DMS lock has not yet been taken on shm file pShmNode. Attempt to +** take it now. Return SQLITE_OK if successful, or an SQLite error +** code otherwise. +** +** If the DMS cannot be locked because this is a readonly_shm=1 +** connection and no other process already holds a lock, return +** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. +*/ +static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ + struct flock lock; + int rc = SQLITE_OK; + + /* Use F_GETLK to determine the locks other processes are holding + ** on the DMS byte. If it indicates that another process is holding + ** a SHARED lock, then this process may also take a SHARED lock + ** and proceed with opening the *-shm file. + ** + ** Or, if no other process is holding any lock, then this process + ** is the first to open it. In this case take an EXCLUSIVE lock on the + ** DMS byte and truncate the *-shm file to zero bytes in size. Then + ** downgrade to a SHARED lock on the DMS byte. + ** + ** If another process is holding an EXCLUSIVE lock on the DMS byte, + ** return SQLITE_BUSY to the caller (it will try again). An earlier + ** version of this code attempted the SHARED lock at this point. But + ** this introduced a subtle race condition: if the process holding + ** EXCLUSIVE failed just before truncating the *-shm file, then this + ** process might open and use the *-shm file without truncating it. + ** And if the *-shm file has been corrupted by a power failure or + ** system crash, the database itself may also become corrupt. */ + lock.l_whence = SEEK_SET; + lock.l_start = UNIX_SHM_DMS; + lock.l_len = 1; + lock.l_type = F_WRLCK; + if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) { + rc = SQLITE_IOERR_LOCK; + }else if( lock.l_type==F_UNLCK ){ + if( pShmNode->isReadonly ){ + pShmNode->isUnlocked = 1; + rc = SQLITE_READONLY_CANTINIT; + }else{ + rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1); + /* The first connection to attach must truncate the -shm file. We + ** truncate to 3 bytes (an arbitrary small number, less than the + ** -shm header size) rather than 0 as a system debugging aid, to + ** help detect if a -shm file truncation is legitimate or is the work + ** or a rogue process. */ + if( rc==SQLITE_OK && robust_ftruncate(pShmNode->hShm, 3) ){ + rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename); + } + } + }else if( lock.l_type==F_WRLCK ){ + rc = SQLITE_BUSY; + } + + if( rc==SQLITE_OK ){ + assert( lock.l_type==F_UNLCK || lock.l_type==F_RDLCK ); + rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1); + } + return rc; +} + +/* +** Open a shared-memory area associated with open database file pDbFd. +** This particular implementation uses mmapped files. +** +** The file used to implement shared-memory is in the same directory +** as the open database file and has the same name as the open database +** file with the "-shm" suffix added. For example, if the database file +** is "/home/user1/config.db" then the file that is created and mmapped +** for shared memory will be called "/home/user1/config.db-shm". +** +** Another approach to is to use files in /dev/shm or /dev/tmp or an +** some other tmpfs mount. But if a file in a different directory +** from the database file is used, then differing access permissions +** or a chroot() might cause two different processes on the same +** database to end up using different files for shared memory - +** meaning that their memory would not really be shared - resulting +** in database corruption. Nevertheless, this tmpfs file usage +** can be enabled at compile-time using -DSQLITE_SHM_DIRECTORY="/dev/shm" +** or the equivalent. The use of the SQLITE_SHM_DIRECTORY compile-time +** option results in an incompatible build of SQLite; builds of SQLite +** that with differing SQLITE_SHM_DIRECTORY settings attempt to use the +** same database file at the same time, database corruption will likely +** result. The SQLITE_SHM_DIRECTORY compile-time option is considered +** "unsupported" and may go away in a future SQLite release. +** +** When opening a new shared-memory file, if no other instances of that +** file are currently open, in this process or in other processes, then +** the file must be truncated to zero length or have its header cleared. +** +** If the original database file (pDbFd) is using the "unix-excl" VFS +** that means that an exclusive lock is held on the database file and +** that no other processes are able to read or write the database. In +** that case, we do not really need shared memory. No shared memory +** file is created. The shared memory will be simulated with heap memory. +*/ +static int unixOpenSharedMemory(unixFile *pDbFd){ + struct unixShm *p = 0; /* The connection to be opened */ + struct unixShmNode *pShmNode; /* The underlying mmapped file */ + int rc = SQLITE_OK; /* Result code */ + unixInodeInfo *pInode; /* The inode of fd */ + char *zShm; /* Name of the file used for SHM */ + int nShmFilename; /* Size of the SHM filename in bytes */ + + /* Allocate space for the new unixShm object. */ + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return SQLITE_NOMEM_BKPT; + memset(p, 0, sizeof(*p)); + assert( pDbFd->pShm==0 ); + + /* Check to see if a unixShmNode object already exists. Reuse an existing + ** one if present. Create a new one if necessary. + */ + assert( unixFileMutexNotheld(pDbFd) ); + unixEnterMutex(); + pInode = pDbFd->pInode; + pShmNode = pInode->pShmNode; + if( pShmNode==0 ){ + struct stat sStat; /* fstat() info for database file */ +#ifndef SQLITE_SHM_DIRECTORY + const char *zBasePath = pDbFd->zPath; +#endif + + /* Call fstat() to figure out the permissions on the database file. If + ** a new *-shm file is created, an attempt will be made to create it + ** with the same permissions. + */ + if( osFstat(pDbFd->h, &sStat) ){ + rc = SQLITE_IOERR_FSTAT; + goto shm_open_err; + } + +#ifdef SQLITE_SHM_DIRECTORY + nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; +#else + nShmFilename = 6 + (int)strlen(zBasePath); +#endif + pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); + if( pShmNode==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); + zShm = pShmNode->zFilename = (char*)&pShmNode[1]; +#ifdef SQLITE_SHM_DIRECTORY + sqlite3_snprintf(nShmFilename, zShm, + SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", + (u32)sStat.st_ino, (u32)sStat.st_dev); +#else + sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath); + sqlite3FileSuffix3(pDbFd->zPath, zShm); +#endif + pShmNode->hShm = -1; + pDbFd->pInode->pShmNode = pShmNode; + pShmNode->pInode = pDbFd->pInode; + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->pShmMutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + } + + if( pInode->bProcessLock==0 ){ + if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + pShmNode->hShm = robust_open(zShm, O_RDWR|O_CREAT|O_NOFOLLOW, + (sStat.st_mode&0777)); + } + if( pShmNode->hShm<0 ){ + pShmNode->hShm = robust_open(zShm, O_RDONLY|O_NOFOLLOW, + (sStat.st_mode&0777)); + if( pShmNode->hShm<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm); + goto shm_open_err; + } + pShmNode->isReadonly = 1; + } + + /* If this process is running as root, make sure that the SHM file + ** is owned by the same user that owns the original database. Otherwise, + ** the original owner will not be able to connect. + */ + robustFchown(pShmNode->hShm, sStat.st_uid, sStat.st_gid); + + rc = unixLockSharedMemory(pDbFd, pShmNode); + if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; + } + } + + /* Make the new connection a child of the unixShmNode */ + p->pShmNode = pShmNode; +#ifdef SQLITE_DEBUG + p->id = pShmNode->nextShmId++; +#endif + pShmNode->nRef++; + pDbFd->pShm = p; + unixLeaveMutex(); + + /* The reference count on pShmNode has already been incremented under + ** the cover of the unixEnterMutex() mutex and the pointer from the + ** new (struct unixShm) object to the pShmNode has been set. All that is + ** left to do is to link the new object into the linked list starting + ** at pShmNode->pFirst. This must be done while holding the + ** pShmNode->pShmMutex. + */ + sqlite3_mutex_enter(pShmNode->pShmMutex); + p->pNext = pShmNode->pFirst; + pShmNode->pFirst = p; + sqlite3_mutex_leave(pShmNode->pShmMutex); + return rc; + + /* Jump here on any error */ +shm_open_err: + unixShmPurge(pDbFd); /* This call frees pShmNode if required */ + sqlite3_free(p); + unixLeaveMutex(); + return rc; +} + +/* +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion +** bytes in size. +** +** If an error occurs, an error code is returned and *pp is set to NULL. +** +** Otherwise, if the bExtend parameter is 0 and the requested shared-memory +** region has not been allocated (by any client, including one running in a +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** bExtend is non-zero and the requested shared-memory region has not yet +** been allocated, it is allocated by this function. +** +** If the shared-memory region has already been allocated or is allocated by +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped +** memory and SQLITE_OK returned. +*/ +static int unixShmMap( + sqlite3_file *fd, /* Handle open on database file */ + int iRegion, /* Region to retrieve */ + int szRegion, /* Size of regions */ + int bExtend, /* True to extend file if necessary */ + void volatile **pp /* OUT: Mapped memory */ +){ + unixFile *pDbFd = (unixFile*)fd; + unixShm *p; + unixShmNode *pShmNode; + int rc = SQLITE_OK; + int nShmPerMap = unixShmRegionPerMap(); + int nReqRegion; + + /* If the shared-memory file has not yet been opened, open it now. */ + if( pDbFd->pShm==0 ){ + rc = unixOpenSharedMemory(pDbFd); + if( rc!=SQLITE_OK ) return rc; + } + + p = pDbFd->pShm; + pShmNode = p->pShmNode; + sqlite3_mutex_enter(pShmNode->pShmMutex); + if( pShmNode->isUnlocked ){ + rc = unixLockSharedMemory(pDbFd, pShmNode); + if( rc!=SQLITE_OK ) goto shmpage_out; + pShmNode->isUnlocked = 0; + } + assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); + assert( pShmNode->pInode==pDbFd->pInode ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); + + /* Minimum number of regions required to be mapped. */ + nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; + + if( pShmNode->nRegionszRegion = szRegion; + + if( pShmNode->hShm>=0 ){ + /* The requested region is not mapped into this processes address space. + ** Check to see if it has been allocated (i.e. if the wal-index file is + ** large enough to contain the requested region). + */ + if( osFstat(pShmNode->hShm, &sStat) ){ + rc = SQLITE_IOERR_SHMSIZE; + goto shmpage_out; + } + + if( sStat.st_sizehShm, iPg*pgsz + pgsz-1,"",1,&x)!=1 ){ + const char *zFile = pShmNode->zFilename; + rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); + goto shmpage_out; + } + } + } + } + } + + /* Map the requested memory region into this processes address space. */ + apNew = (char **)sqlite3_realloc( + pShmNode->apRegion, nReqRegion*sizeof(char *) + ); + if( !apNew ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shmpage_out; + } + pShmNode->apRegion = apNew; + while( pShmNode->nRegionhShm>=0 ){ + pMem = osMmap(0, nMap, + pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, + MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion + ); + if( pMem==MAP_FAILED ){ + rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); + goto shmpage_out; + } + }else{ + pMem = sqlite3_malloc64(nMap); + if( pMem==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shmpage_out; + } + memset(pMem, 0, nMap); + } + + for(i=0; iapRegion[pShmNode->nRegion+i] = &((char*)pMem)[szRegion*i]; + } + pShmNode->nRegion += nShmPerMap; + } + } + +shmpage_out: + if( pShmNode->nRegion>iRegion ){ + *pp = pShmNode->apRegion[iRegion]; + }else{ + *pp = 0; + } + if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_mutex_leave(pShmNode->pShmMutex); + return rc; +} + +/* +** Check that the pShmNode->aLock[] array comports with the locking bitmasks +** held by each client. Return true if it does, or false otherwise. This +** is to be used in an assert(). e.g. +** +** assert( assertLockingArrayOk(pShmNode) ); +*/ +#ifdef SQLITE_DEBUG +static int assertLockingArrayOk(unixShmNode *pShmNode){ + unixShm *pX; + int aLock[SQLITE_SHM_NLOCK]; + assert( sqlite3_mutex_held(pShmNode->pShmMutex) ); + + memset(aLock, 0, sizeof(aLock)); + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + int i; + for(i=0; iexclMask & (1<sharedMask & (1<=0 ); + aLock[i]++; + } + } + } + + assert( 0==memcmp(pShmNode->aLock, aLock, sizeof(aLock)) ); + return (memcmp(pShmNode->aLock, aLock, sizeof(aLock))==0); +} +#endif + +/* +** Change the lock state for a shared-memory segment. +** +** Note that the relationship between SHAREd and EXCLUSIVE locks is a little +** different here than in posix. In xShmLock(), one can go from unlocked +** to shared and back or from unlocked to exclusive and back. But one may +** not go from shared to exclusive or from exclusive to shared. +*/ +static int unixShmLock( + sqlite3_file *fd, /* Database file holding the shared memory */ + int ofst, /* First lock to acquire or release */ + int n, /* Number of locks to acquire or release */ + int flags /* What to do with the lock */ +){ + unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */ + unixShm *p; /* The shared memory being locked */ + unixShmNode *pShmNode; /* The underlying file iNode */ + int rc = SQLITE_OK; /* Result code */ + u16 mask; /* Mask of locks to take or release */ + int *aLock; + + p = pDbFd->pShm; + if( p==0 ) return SQLITE_IOERR_SHMLOCK; + pShmNode = p->pShmNode; + if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK; + aLock = pShmNode->aLock; + + assert( pShmNode==pDbFd->pInode->pShmNode ); + assert( pShmNode->pInode==pDbFd->pInode ); + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); + assert( n>=1 ); + assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); + assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); + + /* Check that, if this to be a blocking lock, no locks that occur later + ** in the following list than the lock being obtained are already held: + ** + ** 1. Checkpointer lock (ofst==1). + ** 2. Write lock (ofst==0). + ** 3. Read locks (ofst>=3 && ofstiBusyTimeout==0 || ( + (ofst!=2) /* not RECOVER */ + && (ofst!=1 || (p->exclMask|p->sharedMask)==0) + && (ofst!=0 || (p->exclMask|p->sharedMask)<3) + && (ofst<3 || (p->exclMask|p->sharedMask)<(1<1 || mask==(1<pShmMutex); + assert( assertLockingArrayOk(pShmNode) ); + if( flags & SQLITE_SHM_UNLOCK ){ + if( (p->exclMask|p->sharedMask) & mask ){ + int ii; + int bUnlock = 1; + + for(ii=ofst; ii((p->sharedMask & (1<sharedMask & (1<1 ); + aLock[ofst]--; + } + + /* Undo the local locks */ + if( rc==SQLITE_OK ){ + p->exclMask &= ~mask; + p->sharedMask &= ~mask; + } + } + }else if( flags & SQLITE_SHM_SHARED ){ + assert( n==1 ); + assert( (p->exclMask & (1<sharedMask & mask)==0 ){ + if( aLock[ofst]<0 ){ + rc = SQLITE_BUSY; + }else if( aLock[ofst]==0 ){ + rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n); + } + + /* Get the local shared locks */ + if( rc==SQLITE_OK ){ + p->sharedMask |= mask; + aLock[ofst]++; + } + } + }else{ + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. */ + int ii; + for(ii=ofst; iisharedMask & mask)==0 ); + if( ALWAYS((p->exclMask & (1<sharedMask & mask)==0 ); + p->exclMask |= mask; + for(ii=ofst; iipShmMutex); + OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", + p->id, osGetpid(0), p->sharedMask, p->exclMask)); + return rc; +} + +/* +** Implement a memory barrier or memory fence on shared memory. +** +** All loads and stores begun before the barrier must complete before +** any load or store begun after the barrier. +*/ +static void unixShmBarrier( + sqlite3_file *fd /* Database file holding the shared memory */ +){ + UNUSED_PARAMETER(fd); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + assert( fd->pMethods->xLock==nolockLock + || unixFileMutexNotheld((unixFile*)fd) + ); + unixEnterMutex(); /* Also mutex, for redundancy */ + unixLeaveMutex(); +} + +/* +** Close a connection to shared-memory. Delete the underlying +** storage if deleteFlag is true. +** +** If there is no shared memory associated with the connection then this +** routine is a harmless no-op. +*/ +static int unixShmUnmap( + sqlite3_file *fd, /* The underlying database file */ + int deleteFlag /* Delete shared-memory if true */ +){ + unixShm *p; /* The connection to be closed */ + unixShmNode *pShmNode; /* The underlying shared-memory file */ + unixShm **pp; /* For looping over sibling connections */ + unixFile *pDbFd; /* The underlying database file */ + + pDbFd = (unixFile*)fd; + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + pShmNode = p->pShmNode; + + assert( pShmNode==pDbFd->pInode->pShmNode ); + assert( pShmNode->pInode==pDbFd->pInode ); + + /* Remove connection p from the set of connections associated + ** with pShmNode */ + sqlite3_mutex_enter(pShmNode->pShmMutex); + for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} + *pp = p->pNext; + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + sqlite3_mutex_leave(pShmNode->pShmMutex); + + /* If pShmNode->nRef has reached 0, then close the underlying + ** shared-memory file, too */ + assert( unixFileMutexNotheld(pDbFd) ); + unixEnterMutex(); + assert( pShmNode->nRef>0 ); + pShmNode->nRef--; + if( pShmNode->nRef==0 ){ + if( deleteFlag && pShmNode->hShm>=0 ){ + osUnlink(pShmNode->zFilename); + } + unixShmPurge(pDbFd); + } + unixLeaveMutex(); + + return SQLITE_OK; +} + + +#else +# define unixShmMap 0 +# define unixShmLock 0 +# define unixShmBarrier 0 +# define unixShmUnmap 0 +#endif /* #ifndef SQLITE_OMIT_WAL */ + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** If it is currently memory mapped, unmap file pFd. +*/ +static void unixUnmapfile(unixFile *pFd){ + assert( pFd->nFetchOut==0 ); + if( pFd->pMapRegion ){ + osMunmap(pFd->pMapRegion, pFd->mmapSizeActual); + pFd->pMapRegion = 0; + pFd->mmapSize = 0; + pFd->mmapSizeActual = 0; + } +} + +/* +** Attempt to set the size of the memory mapping maintained by file +** descriptor pFd to nNew bytes. Any existing mapping is discarded. +** +** If successful, this function sets the following variables: +** +** unixFile.pMapRegion +** unixFile.mmapSize +** unixFile.mmapSizeActual +** +** If unsuccessful, an error message is logged via sqlite3_log() and +** the three variables above are zeroed. In this case SQLite should +** continue accessing the database using the xRead() and xWrite() +** methods. +*/ +static void unixRemapfile( + unixFile *pFd, /* File descriptor object */ + i64 nNew /* Required mapping size */ +){ + const char *zErr = "mmap"; + int h = pFd->h; /* File descriptor open on db file */ + u8 *pOrig = (u8 *)pFd->pMapRegion; /* Pointer to current file mapping */ + i64 nOrig = pFd->mmapSizeActual; /* Size of pOrig region in bytes */ + u8 *pNew = 0; /* Location of new mapping */ + int flags = PROT_READ; /* Flags to pass to mmap() */ + + assert( pFd->nFetchOut==0 ); + assert( nNew>pFd->mmapSize ); + assert( nNew<=pFd->mmapSizeMax ); + assert( nNew>0 ); + assert( pFd->mmapSizeActual>=pFd->mmapSize ); + assert( MAP_FAILED!=0 ); + +#ifdef SQLITE_MMAP_READWRITE + if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; +#endif + + if( pOrig ){ +#if HAVE_MREMAP + i64 nReuse = pFd->mmapSize; +#else + const int szSyspage = osGetpagesize(); + i64 nReuse = (pFd->mmapSize & ~(szSyspage-1)); +#endif + u8 *pReq = &pOrig[nReuse]; + + /* Unmap any pages of the existing mapping that cannot be reused. */ + if( nReuse!=nOrig ){ + osMunmap(pReq, nOrig-nReuse); + } + +#if HAVE_MREMAP + pNew = osMremap(pOrig, nReuse, nNew, MREMAP_MAYMOVE); + zErr = "mremap"; +#else + pNew = osMmap(pReq, nNew-nReuse, flags, MAP_SHARED, h, nReuse); + if( pNew!=MAP_FAILED ){ + if( pNew!=pReq ){ + osMunmap(pNew, nNew - nReuse); + pNew = 0; + }else{ + pNew = pOrig; + } + } +#endif + + /* The attempt to extend the existing mapping failed. Free it. */ + if( pNew==MAP_FAILED || pNew==0 ){ + osMunmap(pOrig, nReuse); + } + } + + /* If pNew is still NULL, try to create an entirely new mapping. */ + if( pNew==0 ){ + pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); + } + + if( pNew==MAP_FAILED ){ + pNew = 0; + nNew = 0; + unixLogError(SQLITE_OK, zErr, pFd->zPath); + + /* If the mmap() above failed, assume that all subsequent mmap() calls + ** will probably fail too. Fall back to using xRead/xWrite exclusively + ** in this case. */ + pFd->mmapSizeMax = 0; + } + pFd->pMapRegion = (void *)pNew; + pFd->mmapSize = pFd->mmapSizeActual = nNew; +} + +/* +** Memory map or remap the file opened by file-descriptor pFd (if the file +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still +** outstanding xFetch() references to it, this function is a no-op. +** +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the +** requested size is the size of the file on disk. The actual size of the +** created mapping is either the requested size or the value configured +** using SQLITE_FCNTL_MMAP_LIMIT, whichever is smaller. +** +** SQLITE_OK is returned if no error occurs (even if the mapping is not +** recreated as a result of outstanding references) or an SQLite error +** code otherwise. +*/ +static int unixMapfile(unixFile *pFd, i64 nMap){ + assert( nMap>=0 || pFd->nFetchOut==0 ); + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); + if( pFd->nFetchOut>0 ) return SQLITE_OK; + + if( nMap<0 ){ + struct stat statbuf; /* Low-level file information */ + if( osFstat(pFd->h, &statbuf) ){ + return SQLITE_IOERR_FSTAT; + } + nMap = statbuf.st_size; + } + if( nMap>pFd->mmapSizeMax ){ + nMap = pFd->mmapSizeMax; + } + + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); + if( nMap!=pFd->mmapSize ){ + unixRemapfile(pFd, nMap); + } + + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** If possible, return a pointer to a mapping of file fd starting at offset +** iOff. The mapping must be valid for at least nAmt bytes. +** +** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. +** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. +** Finally, if an error does occur, return an SQLite error code. The final +** value of *pp is undefined in this case. +** +** If this function does return a pointer, the caller must eventually +** release the reference by calling unixUnfetch(). +*/ +static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ +#if SQLITE_MAX_MMAP_SIZE>0 + unixFile *pFd = (unixFile *)fd; /* The underlying database file */ +#endif + *pp = 0; + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFd->mmapSizeMax>0 ){ + if( pFd->pMapRegion==0 ){ + int rc = unixMapfile(pFd, -1); + if( rc!=SQLITE_OK ) return rc; + } + if( pFd->mmapSize >= iOff+nAmt ){ + *pp = &((u8 *)pFd->pMapRegion)[iOff]; + pFd->nFetchOut++; + } + } +#endif + return SQLITE_OK; +} + +/* +** If the third argument is non-NULL, then this function releases a +** reference obtained by an earlier call to unixFetch(). The second +** argument passed to this function must be the same as the corresponding +** argument that was passed to the unixFetch() invocation. +** +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping +** may now be invalid and should be unmapped. +*/ +static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ +#if SQLITE_MAX_MMAP_SIZE>0 + unixFile *pFd = (unixFile *)fd; /* The underlying database file */ + UNUSED_PARAMETER(iOff); + + /* If p==0 (unmap the entire file) then there must be no outstanding + ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), + ** then there must be at least one outstanding. */ + assert( (p==0)==(pFd->nFetchOut==0) ); + + /* If p!=0, it must match the iOff value. */ + assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + + if( p ){ + pFd->nFetchOut--; + }else{ + unixUnmapfile(pFd); + } + + assert( pFd->nFetchOut>=0 ); +#else + UNUSED_PARAMETER(fd); + UNUSED_PARAMETER(p); + UNUSED_PARAMETER(iOff); +#endif + return SQLITE_OK; +} + +/* +** Here ends the implementation of all sqlite3_file methods. +** +********************** End sqlite3_file Methods ******************************* +******************************************************************************/ + +/* +** This division contains definitions of sqlite3_io_methods objects that +** implement various file locking strategies. It also contains definitions +** of "finder" functions. A finder-function is used to locate the appropriate +** sqlite3_io_methods object for a particular database file. The pAppData +** field of the sqlite3_vfs VFS objects are initialized to be pointers to +** the correct finder-function for that VFS. +** +** Most finder functions return a pointer to a fixed sqlite3_io_methods +** object. The only interesting finder-function is autolockIoFinder, which +** looks at the filesystem type and tries to guess the best locking +** strategy from that. +** +** For finder-function F, two objects are created: +** +** (1) The real finder-function named "FImpt()". +** +** (2) A constant pointer to this function named just "F". +** +** +** A pointer to the F pointer is used as the pAppData value for VFS +** objects. We have to do this instead of letting pAppData point +** directly at the finder-function since C90 rules prevent a void* +** from be cast into a function pointer. +** +** +** Each instance of this macro generates two objects: +** +** * A constant sqlite3_io_methods object call METHOD that has locking +** methods CLOSE, LOCK, UNLOCK, CKRESLOCK. +** +** * An I/O method finder function called FINDER that returns a pointer +** to the METHOD object in the previous bullet. +*/ +#define IOMETHODS(FINDER,METHOD,VERSION,CLOSE,LOCK,UNLOCK,CKLOCK,SHMMAP) \ +static const sqlite3_io_methods METHOD = { \ + VERSION, /* iVersion */ \ + CLOSE, /* xClose */ \ + unixRead, /* xRead */ \ + unixWrite, /* xWrite */ \ + unixTruncate, /* xTruncate */ \ + unixSync, /* xSync */ \ + unixFileSize, /* xFileSize */ \ + LOCK, /* xLock */ \ + UNLOCK, /* xUnlock */ \ + CKLOCK, /* xCheckReservedLock */ \ + unixFileControl, /* xFileControl */ \ + unixSectorSize, /* xSectorSize */ \ + unixDeviceCharacteristics, /* xDeviceCapabilities */ \ + SHMMAP, /* xShmMap */ \ + unixShmLock, /* xShmLock */ \ + unixShmBarrier, /* xShmBarrier */ \ + unixShmUnmap, /* xShmUnmap */ \ + unixFetch, /* xFetch */ \ + unixUnfetch, /* xUnfetch */ \ +}; \ +static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \ + UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \ + return &METHOD; \ +} \ +static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \ + = FINDER##Impl; + +/* +** Here are all of the sqlite3_io_methods objects for each of the +** locking strategies. Functions that return pointers to these methods +** are also created. +*/ +IOMETHODS( + posixIoFinder, /* Finder function name */ + posixIoMethods, /* sqlite3_io_methods object name */ + 3, /* shared memory and mmap are enabled */ + unixClose, /* xClose method */ + unixLock, /* xLock method */ + unixUnlock, /* xUnlock method */ + unixCheckReservedLock, /* xCheckReservedLock method */ + unixShmMap /* xShmMap method */ +) +IOMETHODS( + nolockIoFinder, /* Finder function name */ + nolockIoMethods, /* sqlite3_io_methods object name */ + 3, /* shared memory and mmap are enabled */ + nolockClose, /* xClose method */ + nolockLock, /* xLock method */ + nolockUnlock, /* xUnlock method */ + nolockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +IOMETHODS( + dotlockIoFinder, /* Finder function name */ + dotlockIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + dotlockClose, /* xClose method */ + dotlockLock, /* xLock method */ + dotlockUnlock, /* xUnlock method */ + dotlockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) + +#if SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + flockIoFinder, /* Finder function name */ + flockIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + flockClose, /* xClose method */ + flockLock, /* xLock method */ + flockUnlock, /* xUnlock method */ + flockCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if OS_VXWORKS +IOMETHODS( + semIoFinder, /* Finder function name */ + semIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + semXClose, /* xClose method */ + semXLock, /* xLock method */ + semXUnlock, /* xUnlock method */ + semXCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + afpIoFinder, /* Finder function name */ + afpIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + afpClose, /* xClose method */ + afpLock, /* xLock method */ + afpUnlock, /* xUnlock method */ + afpCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +/* +** The proxy locking method is a "super-method" in the sense that it +** opens secondary file descriptors for the conch and lock files and +** it uses proxy, dot-file, AFP, and flock() locking methods on those +** secondary files. For this reason, the division that implements +** proxy locking is located much further down in the file. But we need +** to go ahead and define the sqlite3_io_methods and finder function +** for proxy locking here. So we forward declare the I/O methods. +*/ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +static int proxyClose(sqlite3_file*); +static int proxyLock(sqlite3_file*, int); +static int proxyUnlock(sqlite3_file*, int); +static int proxyCheckReservedLock(sqlite3_file*, int*); +IOMETHODS( + proxyIoFinder, /* Finder function name */ + proxyIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + proxyClose, /* xClose method */ + proxyLock, /* xLock method */ + proxyUnlock, /* xUnlock method */ + proxyCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +/* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +IOMETHODS( + nfsIoFinder, /* Finder function name */ + nfsIoMethods, /* sqlite3_io_methods object name */ + 1, /* shared memory is disabled */ + unixClose, /* xClose method */ + unixLock, /* xLock method */ + nfsUnlock, /* xUnlock method */ + unixCheckReservedLock, /* xCheckReservedLock method */ + 0 /* xShmMap method */ +) +#endif + +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE +/* +** This "finder" function attempts to determine the best locking strategy +** for the database file "filePath". It then returns the sqlite3_io_methods +** object that implements that strategy. +** +** This is for MacOSX only. +*/ +static const sqlite3_io_methods *autolockIoFinderImpl( + const char *filePath, /* name of the database file */ + unixFile *pNew /* open file object for the database file */ +){ + static const struct Mapping { + const char *zFilesystem; /* Filesystem type name */ + const sqlite3_io_methods *pMethods; /* Appropriate locking method */ + } aMap[] = { + { "hfs", &posixIoMethods }, + { "ufs", &posixIoMethods }, + { "afpfs", &afpIoMethods }, + { "smbfs", &afpIoMethods }, + { "webdav", &nolockIoMethods }, + { 0, 0 } + }; + int i; + struct statfs fsInfo; + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + if( statfs(filePath, &fsInfo) != -1 ){ + if( fsInfo.f_flags & MNT_RDONLY ){ + return &nolockIoMethods; + } + for(i=0; aMap[i].zFilesystem; i++){ + if( strcmp(fsInfo.f_fstypename, aMap[i].zFilesystem)==0 ){ + return aMap[i].pMethods; + } + } + } + + /* Default case. Handles, amongst others, "nfs". + ** Test byte-range lock using fcntl(). If the call succeeds, + ** assume that the file-system supports POSIX style locks. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + if( strcmp(fsInfo.f_fstypename, "nfs")==0 ){ + return &nfsIoMethods; + } else { + return &posixIoMethods; + } + }else{ + return &dotlockIoMethods; + } +} +static const sqlite3_io_methods + *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ + +#if OS_VXWORKS +/* +** This "finder" function for VxWorks checks to see if posix advisory +** locking works. If it does, then that is what is used. If it does not +** work, then fallback to named semaphore locking. +*/ +static const sqlite3_io_methods *vxworksIoFinderImpl( + const char *filePath, /* name of the database file */ + unixFile *pNew /* the open file object */ +){ + struct flock lockInfo; + + if( !filePath ){ + /* If filePath==NULL that means we are dealing with a transient file + ** that does not need to be locked. */ + return &nolockIoMethods; + } + + /* Test if fcntl() is supported and use POSIX style locks. + ** Otherwise fall back to the named semaphore method. + */ + lockInfo.l_len = 1; + lockInfo.l_start = 0; + lockInfo.l_whence = SEEK_SET; + lockInfo.l_type = F_RDLCK; + if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + return &posixIoMethods; + }else{ + return &semIoMethods; + } +} +static const sqlite3_io_methods + *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl; + +#endif /* OS_VXWORKS */ + +/* +** An abstract type for a pointer to an IO method finder function: +*/ +typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); + + +/**************************************************************************** +**************************** sqlite3_vfs methods **************************** +** +** This division contains the implementation of methods on the +** sqlite3_vfs object. +*/ + +/* +** Initialize the contents of the unixFile structure pointed to by pId. +*/ +static int fillInUnixFile( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + int h, /* Open file descriptor of file being opened */ + sqlite3_file *pId, /* Write to the unixFile structure here */ + const char *zFilename, /* Name of the file being opened */ + int ctrlFlags /* Zero or more UNIXFILE_* values */ +){ + const sqlite3_io_methods *pLockingStyle; + unixFile *pNew = (unixFile *)pId; + int rc = SQLITE_OK; + + assert( pNew->pInode==NULL ); + + /* No locking occurs in temporary files */ + assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); + + OSTRACE(("OPEN %-3d %s\n", h, zFilename)); + pNew->h = h; + pNew->pVfs = pVfs; + pNew->zPath = zFilename; + pNew->ctrlFlags = (u8)ctrlFlags; +#if SQLITE_MAX_MMAP_SIZE>0 + pNew->mmapSizeMax = sqlite3GlobalConfig.szMmap; +#endif + if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), + "psow", SQLITE_POWERSAFE_OVERWRITE) ){ + pNew->ctrlFlags |= UNIXFILE_PSOW; + } + if( strcmp(pVfs->zName,"unix-excl")==0 ){ + pNew->ctrlFlags |= UNIXFILE_EXCL; + } + +#if OS_VXWORKS + pNew->pId = vxworksFindFileId(zFilename); + if( pNew->pId==0 ){ + ctrlFlags |= UNIXFILE_NOLOCK; + rc = SQLITE_NOMEM_BKPT; + } +#endif + + if( ctrlFlags & UNIXFILE_NOLOCK ){ + pLockingStyle = &nolockIoMethods; + }else{ + pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); +#if SQLITE_ENABLE_LOCKING_STYLE + /* Cache zFilename in the locking context (AFP and dotlock override) for + ** proxyLock activation is possible (remote proxy is based on db name) + ** zFilename remains valid until file is closed, to support */ + pNew->lockingContext = (void*)zFilename; +#endif + } + + if( pLockingStyle == &posixIoMethods +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + || pLockingStyle == &nfsIoMethods +#endif + ){ + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( rc!=SQLITE_OK ){ + /* If an error occurred in findInodeInfo(), close the file descriptor + ** immediately, before releasing the mutex. findInodeInfo() may fail + ** in two scenarios: + ** + ** (a) A call to fstat() failed. + ** (b) A malloc failed. + ** + ** Scenario (b) may only occur if the process is holding no other + ** file descriptors open on the same file. If there were other file + ** descriptors on this file, then no malloc would be required by + ** findInodeInfo(). If this is the case, it is quite safe to close + ** handle h - as it is guaranteed that no posix locks will be released + ** by doing so. + ** + ** If scenario (a) caused the error then things are not so safe. The + ** implicit assumption here is that if fstat() fails, things are in + ** such bad shape that dropping a lock or two doesn't matter much. + */ + robust_close(pNew, h, __LINE__); + h = -1; + } + unixLeaveMutex(); + } + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + else if( pLockingStyle == &afpIoMethods ){ + /* AFP locking uses the file path so it needs to be included in + ** the afpLockingContext. + */ + afpLockingContext *pCtx; + pNew->lockingContext = pCtx = sqlite3_malloc64( sizeof(*pCtx) ); + if( pCtx==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + /* NB: zFilename exists and remains valid until the file is closed + ** according to requirement F11141. So we do not need to make a + ** copy of the filename. */ + pCtx->dbPath = zFilename; + pCtx->reserved = 0; + srandomdev(); + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( rc!=SQLITE_OK ){ + sqlite3_free(pNew->lockingContext); + robust_close(pNew, h, __LINE__); + h = -1; + } + unixLeaveMutex(); + } + } +#endif + + else if( pLockingStyle == &dotlockIoMethods ){ + /* Dotfile locking uses the file path so it needs to be included in + ** the dotlockLockingContext + */ + char *zLockFile; + int nFilename; + assert( zFilename!=0 ); + nFilename = (int)strlen(zFilename) + 6; + zLockFile = (char *)sqlite3_malloc64(nFilename); + if( zLockFile==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); + } + pNew->lockingContext = zLockFile; + } + +#if OS_VXWORKS + else if( pLockingStyle == &semIoMethods ){ + /* Named semaphore locking uses the file path so it needs to be + ** included in the semLockingContext + */ + unixEnterMutex(); + rc = findInodeInfo(pNew, &pNew->pInode); + if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){ + char *zSemName = pNew->pInode->aSemName; + int n; + sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem", + pNew->pId->zCanonicalName); + for( n=1; zSemName[n]; n++ ) + if( zSemName[n]=='/' ) zSemName[n] = '_'; + pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); + if( pNew->pInode->pSem == SEM_FAILED ){ + rc = SQLITE_NOMEM_BKPT; + pNew->pInode->aSemName[0] = '\0'; + } + } + unixLeaveMutex(); + } +#endif + + storeLastErrno(pNew, 0); +#if OS_VXWORKS + if( rc!=SQLITE_OK ){ + if( h>=0 ) robust_close(pNew, h, __LINE__); + h = -1; + osUnlink(zFilename); + pNew->ctrlFlags |= UNIXFILE_DELETE; + } +#endif + if( rc!=SQLITE_OK ){ + if( h>=0 ) robust_close(pNew, h, __LINE__); + }else{ + pId->pMethods = pLockingStyle; + OpenCounter(+1); + verifyDbFile(pNew); + } + return rc; +} + +/* +** Directories to consider for temp files. +*/ +static const char *azTempDirs[] = { + 0, + 0, + "/var/tmp", + "/usr/tmp", + "/tmp", + "." +}; + +/* +** Initialize first two members of azTempDirs[] array. +*/ +static void unixTempFileInit(void){ + azTempDirs[0] = getenv("SQLITE_TMPDIR"); + azTempDirs[1] = getenv("TMPDIR"); +} + +/* +** Return the name of a directory in which to put temporary files. +** If no suitable temporary file directory can be found, return NULL. +*/ +static const char *unixTempFileDir(void){ + unsigned int i = 0; + struct stat buf; + const char *zDir = sqlite3_temp_directory; + + while(1){ + if( zDir!=0 + && osStat(zDir, &buf)==0 + && S_ISDIR(buf.st_mode) + && osAccess(zDir, 03)==0 + ){ + return zDir; + } + if( i>=sizeof(azTempDirs)/sizeof(azTempDirs[0]) ) break; + zDir = azTempDirs[i++]; + } + return 0; +} + +/* +** Create a temporary file name in zBuf. zBuf must be allocated +** by the calling process and must be big enough to hold at least +** pVfs->mxPathname bytes. +*/ +static int unixGetTempname(int nBuf, char *zBuf){ + const char *zDir; + int iLimit = 0; + + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. + */ + zBuf[0] = 0; + SimulateIOError( return SQLITE_IOERR ); + + zDir = unixTempFileDir(); + if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; + do{ + u64 r; + sqlite3_randomness(sizeof(r), &r); + assert( nBuf>2 ); + zBuf[nBuf-2] = 0; + sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", + zDir, r, 0); + if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; + }while( osAccess(zBuf,0)==0 ); + return SQLITE_OK; +} + +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) +/* +** Routine to transform a unixFile into a proxy-locking unixFile. +** Implementation in the proxy-lock division, but used by unixOpen() +** if SQLITE_PREFER_PROXY_LOCKING is defined. +*/ +static int proxyTransformUnixFile(unixFile*, const char*); +#endif + +/* +** Search for an unused file descriptor that was opened on the database +** file (not a journal or super-journal file) identified by pathname +** zPath with SQLITE_OPEN_XXX flags matching those passed as the second +** argument to this function. +** +** Such a file descriptor may exist if a database connection was closed +** but the associated file descriptor could not be closed because some +** other file descriptor open on the same file is holding a file-lock. +** Refer to comments in the unixClose() function and the lengthy comment +** describing "Posix Advisory Locking" at the start of this file for +** further details. Also, ticket #4018. +** +** If a suitable file descriptor is found, then it is returned. If no +** such file descriptor is located, -1 is returned. +*/ +static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ + UnixUnusedFd *pUnused = 0; + + /* Do not search for an unused file descriptor on vxworks. Not because + ** vxworks would not benefit from the change (it might, we're not sure), + ** but because no way to test it is currently available. It is better + ** not to risk breaking vxworks support for the sake of such an obscure + ** feature. */ +#if !OS_VXWORKS + struct stat sStat; /* Results of stat() call */ + + unixEnterMutex(); + + /* A stat() call may fail for various reasons. If this happens, it is + ** almost certain that an open() call on the same path will also fail. + ** For this reason, if an error occurs in the stat() call here, it is + ** ignored and -1 is returned. The caller will try to open a new file + ** descriptor on the same path, fail, and return an error to SQLite. + ** + ** Even if a subsequent open() call does succeed, the consequences of + ** not searching for a reusable file descriptor are not dire. */ + if( inodeList!=0 && 0==osStat(zPath, &sStat) ){ + unixInodeInfo *pInode; + + pInode = inodeList; + while( pInode && (pInode->fileId.dev!=sStat.st_dev + || pInode->fileId.ino!=(u64)sStat.st_ino) ){ + pInode = pInode->pNext; + } + if( pInode ){ + UnixUnusedFd **pp; + assert( sqlite3_mutex_notheld(pInode->pLockMutex) ); + sqlite3_mutex_enter(pInode->pLockMutex); + flags &= (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); + for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); + pUnused = *pp; + if( pUnused ){ + *pp = pUnused->pNext; + } + sqlite3_mutex_leave(pInode->pLockMutex); + } + } + unixLeaveMutex(); +#endif /* if !OS_VXWORKS */ + return pUnused; +} + +/* +** Find the mode, uid and gid of file zFile. +*/ +static int getFileMode( + const char *zFile, /* File name */ + mode_t *pMode, /* OUT: Permissions of zFile */ + uid_t *pUid, /* OUT: uid of zFile. */ + gid_t *pGid /* OUT: gid of zFile. */ +){ + struct stat sStat; /* Output of stat() on database file */ + int rc = SQLITE_OK; + if( 0==osStat(zFile, &sStat) ){ + *pMode = sStat.st_mode & 0777; + *pUid = sStat.st_uid; + *pGid = sStat.st_gid; + }else{ + rc = SQLITE_IOERR_FSTAT; + } + return rc; +} + +/* +** This function is called by unixOpen() to determine the unix permissions +** to create new files with. If no error occurs, then SQLITE_OK is returned +** and a value suitable for passing as the third argument to open(2) is +** written to *pMode. If an IO error occurs, an SQLite error code is +** returned and the value of *pMode is not modified. +** +** In most cases, this routine sets *pMode to 0, which will become +** an indication to robust_open() to create the file using +** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask. +** But if the file being opened is a WAL or regular journal file, then +** this function queries the file-system for the permissions on the +** corresponding database file and sets *pMode to this value. Whenever +** possible, WAL and journal files are created using the same permissions +** as the associated database file. +** +** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the +** original filename is unavailable. But 8_3_NAMES is only used for +** FAT filesystems and permissions do not matter there, so just use +** the default permissions. In 8_3_NAMES mode, leave *pMode set to zero. +*/ +static int findCreateFileMode( + const char *zPath, /* Path of file (possibly) being created */ + int flags, /* Flags passed as 4th argument to xOpen() */ + mode_t *pMode, /* OUT: Permissions to open file with */ + uid_t *pUid, /* OUT: uid to set on the file */ + gid_t *pGid /* OUT: gid to set on the file */ +){ + int rc = SQLITE_OK; /* Return Code */ + *pMode = 0; + *pUid = 0; + *pGid = 0; + if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ + char zDb[MAX_PATHNAME+1]; /* Database file path */ + int nDb; /* Number of valid bytes in zDb */ + + /* zPath is a path to a WAL or journal file. The following block derives + ** the path to the associated database file from zPath. This block handles + ** the following naming conventions: + ** + ** "-journal" + ** "-wal" + ** "-journalNN" + ** "-walNN" + ** + ** where NN is a decimal number. The NN naming schemes are + ** used by the test_multiplex.c module. + ** + ** In normal operation, the journal file name will always contain + ** a '-' character. However in 8+3 filename mode, or if a corrupt + ** rollback journal specifies a super-journal with a goofy name, then + ** the '-' might be missing or the '-' might be the first character in + ** the filename. In that case, just return SQLITE_OK with *pMode==0. + */ + nDb = sqlite3Strlen30(zPath) - 1; + while( nDb>0 && zPath[nDb]!='.' ){ + if( zPath[nDb]=='-' ){ + memcpy(zDb, zPath, nDb); + zDb[nDb] = '\0'; + rc = getFileMode(zDb, pMode, pUid, pGid); + break; + } + nDb--; + } + }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ + *pMode = 0600; + }else if( flags & SQLITE_OPEN_URI ){ + /* If this is a main database file and the file was opened using a URI + ** filename, check for the "modeof" parameter. If present, interpret + ** its value as a filename and try to copy the mode, uid and gid from + ** that file. */ + const char *z = sqlite3_uri_parameter(zPath, "modeof"); + if( z ){ + rc = getFileMode(z, pMode, pUid, pGid); + } + } + return rc; +} + +/* +** Open the file zPath. +** +** Previously, the SQLite OS layer used three functions in place of this +** one: +** +** sqlite3OsOpenReadWrite(); +** sqlite3OsOpenReadOnly(); +** sqlite3OsOpenExclusive(); +** +** These calls correspond to the following combinations of flags: +** +** ReadWrite() -> (READWRITE | CREATE) +** ReadOnly() -> (READONLY) +** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE) +** +** The old OpenExclusive() accepted a boolean argument - "delFlag". If +** true, the file was configured to be automatically deleted when the +** file handle closed. To achieve the same effect using this new +** interface, add the DELETEONCLOSE flag to those specified above for +** OpenExclusive(). +*/ +static int unixOpen( + sqlite3_vfs *pVfs, /* The VFS for which this is the xOpen method */ + const char *zPath, /* Pathname of file to be opened */ + sqlite3_file *pFile, /* The file descriptor to be filled in */ + int flags, /* Input flags to control the opening */ + int *pOutFlags /* Output flags returned to SQLite core */ +){ + unixFile *p = (unixFile *)pFile; + int fd = -1; /* File descriptor returned by open() */ + int openFlags = 0; /* Flags to pass to open() */ + int eType = flags&0x0FFF00; /* Type of file to open */ + int noLock; /* True to omit locking primitives */ + int rc = SQLITE_OK; /* Function Return Code */ + int ctrlFlags = 0; /* UNIXFILE_* flags */ + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); +#if SQLITE_ENABLE_LOCKING_STYLE + int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY); +#endif +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE + struct statfs fsInfo; +#endif + + /* If creating a super- or main-file journal, this function will open + ** a file-descriptor on the directory too. The first time unixSync() + ** is called the directory file descriptor will be fsync()ed and close()d. + */ + int isNewJrnl = (isCreate && ( + eType==SQLITE_OPEN_SUPER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_WAL + )); + + /* If argument zPath is a NULL pointer, this function is required to open + ** a temporary file. Use this buffer to store the file name in. + */ + char zTmpname[MAX_PATHNAME+2]; + const char *zName = zPath; + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + /* The main DB, main journal, WAL file and super-journal are never + ** automatically deleted. Nor are they ever temporary files. */ + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_SUPER_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_SUPER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL + ); + + /* Detect a pid change and reset the PRNG. There is a race condition + ** here such that two or more threads all trying to open databases at + ** the same instant might all reset the PRNG. But multiple resets + ** are harmless. + */ + if( randomnessPid!=osGetpid(0) ){ + randomnessPid = osGetpid(0); + sqlite3_randomness(0,0); + } + memset(p, 0, sizeof(unixFile)); + +#ifdef SQLITE_ASSERT_NO_FILES + /* Applications that never read or write a persistent disk files */ + assert( zName==0 ); +#endif + + if( eType==SQLITE_OPEN_MAIN_DB ){ + UnixUnusedFd *pUnused; + pUnused = findReusableFd(zName, flags); + if( pUnused ){ + fd = pUnused->fd; + }else{ + pUnused = sqlite3_malloc64(sizeof(*pUnused)); + if( !pUnused ){ + return SQLITE_NOMEM_BKPT; + } + } + p->pPreallocatedUnused = pUnused; + + /* Database filenames are double-zero terminated if they are not + ** URIs with parameters. Hence, they can always be passed into + ** sqlite3_uri_parameter(). */ + assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); + + }else if( !zName ){ + /* If zName is NULL, the upper layer is requesting a temp file. */ + assert(isDelete && !isNewJrnl); + rc = unixGetTempname(pVfs->mxPathname, zTmpname); + if( rc!=SQLITE_OK ){ + return rc; + } + zName = zTmpname; + + /* Generated temporary filenames are always double-zero terminated + ** for use by sqlite3_uri_parameter(). */ + assert( zName[strlen(zName)+1]==0 ); + } + + /* Determine the value of the flags parameter passed to POSIX function + ** open(). These must be calculated even if open() is not called, as + ** they may be stored as part of the file handle and used by the + ** 'conch file' locking functions later on. */ + if( isReadonly ) openFlags |= O_RDONLY; + if( isReadWrite ) openFlags |= O_RDWR; + if( isCreate ) openFlags |= O_CREAT; + if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW); + openFlags |= (O_LARGEFILE|O_BINARY|O_NOFOLLOW); + + if( fd<0 ){ + mode_t openMode; /* Permissions to create file with */ + uid_t uid; /* Userid for the file */ + gid_t gid; /* Groupid for the file */ + rc = findCreateFileMode(zName, flags, &openMode, &uid, &gid); + if( rc!=SQLITE_OK ){ + assert( !p->pPreallocatedUnused ); + assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); + return rc; + } + fd = robust_open(zName, openFlags, openMode); + OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags)); + assert( !isExclusive || (openFlags & O_CREAT)!=0 ); + if( fd<0 ){ + if( isNewJrnl && errno==EACCES && osAccess(zName, F_OK) ){ + /* If unable to create a journal because the directory is not + ** writable, change the error code to indicate that. */ + rc = SQLITE_READONLY_DIRECTORY; + }else if( errno!=EISDIR && isReadWrite ){ + /* Failed to open the file for read/write access. Try read-only. */ + flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); + openFlags &= ~(O_RDWR|O_CREAT); + flags |= SQLITE_OPEN_READONLY; + openFlags |= O_RDONLY; + isReadonly = 1; + fd = robust_open(zName, openFlags, openMode); + } + } + if( fd<0 ){ + int rc2 = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); + if( rc==SQLITE_OK ) rc = rc2; + goto open_finished; + } + + /* The owner of the rollback journal or WAL file should always be the + ** same as the owner of the database file. Try to ensure that this is + ** the case. The chown() system call will be a no-op if the current + ** process lacks root privileges, be we should at least try. Without + ** this step, if a root process opens a database file, it can leave + ** behinds a journal/WAL that is owned by root and hence make the + ** database inaccessible to unprivileged processes. + ** + ** If openMode==0, then that means uid and gid are not set correctly + ** (probably because SQLite is configured to use 8+3 filename mode) and + ** in that case we do not want to attempt the chown(). + */ + if( openMode && (flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL))!=0 ){ + robustFchown(fd, uid, gid); + } + } + assert( fd>=0 ); + if( pOutFlags ){ + *pOutFlags = flags; + } + + if( p->pPreallocatedUnused ){ + p->pPreallocatedUnused->fd = fd; + p->pPreallocatedUnused->flags = + flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); + } + + if( isDelete ){ +#if OS_VXWORKS + zPath = zName; +#elif defined(SQLITE_UNLINK_AFTER_CLOSE) + zPath = sqlite3_mprintf("%s", zName); + if( zPath==0 ){ + robust_close(p, fd, __LINE__); + return SQLITE_NOMEM_BKPT; + } +#else + osUnlink(zName); +#endif + } +#if SQLITE_ENABLE_LOCKING_STYLE + else{ + p->openFlags = openFlags; + } +#endif + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE + if( fstatfs(fd, &fsInfo) == -1 ){ + storeLastErrno(p, errno); + robust_close(p, fd, __LINE__); + return SQLITE_IOERR_ACCESS; + } + if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } + if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } +#endif + + /* Set up appropriate ctrlFlags */ + if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; + if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; + noLock = eType!=SQLITE_OPEN_MAIN_DB; + if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; + if( isNewJrnl ) ctrlFlags |= UNIXFILE_DIRSYNC; + if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; + +#if SQLITE_ENABLE_LOCKING_STYLE +#if SQLITE_PREFER_PROXY_LOCKING + isAutoProxy = 1; +#endif + if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){ + char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING"); + int useProxy = 0; + + /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means + ** never use proxy, NULL means use proxy for non-local files only. */ + if( envforce!=NULL ){ + useProxy = atoi(envforce)>0; + }else{ + useProxy = !(fsInfo.f_flags&MNT_LOCAL); + } + if( useProxy ){ + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); + if( rc==SQLITE_OK ){ + rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); + if( rc!=SQLITE_OK ){ + /* Use unixClose to clean up the resources added in fillInUnixFile + ** and clear all the structure's references. Specifically, + ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op + */ + unixClose(pFile); + return rc; + } + } + goto open_finished; + } + } +#endif + + assert( zPath==0 || zPath[0]=='/' + || eType==SQLITE_OPEN_SUPER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL + ); + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); + +open_finished: + if( rc!=SQLITE_OK ){ + sqlite3_free(p->pPreallocatedUnused); + } + return rc; +} + + +/* +** Delete the file at zPath. If the dirSync argument is true, fsync() +** the directory after deleting the file. +*/ +static int unixDelete( + sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */ + const char *zPath, /* Name of file to be deleted */ + int dirSync /* If true, fsync() directory after deleting file */ +){ + int rc = SQLITE_OK; + UNUSED_PARAMETER(NotUsed); + SimulateIOError(return SQLITE_IOERR_DELETE); + if( osUnlink(zPath)==(-1) ){ + if( errno==ENOENT +#if OS_VXWORKS + || osAccess(zPath,0)!=0 +#endif + ){ + rc = SQLITE_IOERR_DELETE_NOENT; + }else{ + rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); + } + return rc; + } +#ifndef SQLITE_DISABLE_DIRSYNC + if( (dirSync & 1)!=0 ){ + int fd; + rc = osOpenDirectory(zPath, &fd); + if( rc==SQLITE_OK ){ + if( full_fsync(fd,0,0) ){ + rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); + } + robust_close(0, fd, __LINE__); + }else{ + assert( rc==SQLITE_CANTOPEN ); + rc = SQLITE_OK; + } + } +#endif + return rc; +} + +/* +** Test the existence of or access permissions of file zPath. The +** test performed depends on the value of flags: +** +** SQLITE_ACCESS_EXISTS: Return 1 if the file exists +** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. +** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. +** +** Otherwise return 0. +*/ +static int unixAccess( + sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */ + const char *zPath, /* Path of the file to examine */ + int flags, /* What do we want to learn about the zPath file? */ + int *pResOut /* Write result boolean here */ +){ + UNUSED_PARAMETER(NotUsed); + SimulateIOError( return SQLITE_IOERR_ACCESS; ); + assert( pResOut!=0 ); + + /* The spec says there are three possible values for flags. But only + ** two of them are actually used */ + assert( flags==SQLITE_ACCESS_EXISTS || flags==SQLITE_ACCESS_READWRITE ); + + if( flags==SQLITE_ACCESS_EXISTS ){ + struct stat buf; + *pResOut = 0==osStat(zPath, &buf) && + (!S_ISREG(buf.st_mode) || buf.st_size>0); + }else{ + *pResOut = osAccess(zPath, W_OK|R_OK)==0; + } + return SQLITE_OK; +} + +/* +** A pathname under construction +*/ +typedef struct DbPath DbPath; +struct DbPath { + int rc; /* Non-zero following any error */ + int nSymlink; /* Number of symlinks resolved */ + char *zOut; /* Write the pathname here */ + int nOut; /* Bytes of space available to zOut[] */ + int nUsed; /* Bytes of zOut[] currently being used */ +}; + +/* Forward reference */ +static void appendAllPathElements(DbPath*,const char*); + +/* +** Append a single path element to the DbPath under construction +*/ +static void appendOnePathElement( + DbPath *pPath, /* Path under construction, to which to append zName */ + const char *zName, /* Name to append to pPath. Not zero-terminated */ + int nName /* Number of significant bytes in zName */ +){ + assert( nName>0 ); + assert( zName!=0 ); + if( zName[0]=='.' ){ + if( nName==1 ) return; + if( zName[1]=='.' && nName==2 ){ + if( pPath->nUsed<=1 ){ + pPath->rc = SQLITE_ERROR; + return; + } + assert( pPath->zOut[0]=='/' ); + while( pPath->zOut[--pPath->nUsed]!='/' ){} + return; + } + } + if( pPath->nUsed + nName + 2 >= pPath->nOut ){ + pPath->rc = SQLITE_ERROR; + return; + } + pPath->zOut[pPath->nUsed++] = '/'; + memcpy(&pPath->zOut[pPath->nUsed], zName, nName); + pPath->nUsed += nName; +#if defined(HAVE_READLINK) && defined(HAVE_LSTAT) + if( pPath->rc==SQLITE_OK ){ + const char *zIn; + struct stat buf; + pPath->zOut[pPath->nUsed] = 0; + zIn = pPath->zOut; + if( osLstat(zIn, &buf)!=0 ){ + if( errno!=ENOENT ){ + pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); + } + }else if( S_ISLNK(buf.st_mode) ){ + ssize_t got; + char zLnk[SQLITE_MAX_PATHLEN+2]; + if( pPath->nSymlink++ > SQLITE_MAX_SYMLINK ){ + pPath->rc = SQLITE_CANTOPEN_BKPT; + return; + } + got = osReadlink(zIn, zLnk, sizeof(zLnk)-2); + if( got<=0 || got>=(ssize_t)sizeof(zLnk)-2 ){ + pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); + return; + } + zLnk[got] = 0; + if( zLnk[0]=='/' ){ + pPath->nUsed = 0; + }else{ + pPath->nUsed -= nName + 1; + } + appendAllPathElements(pPath, zLnk); + } + } +#endif +} + +/* +** Append all path elements in zPath to the DbPath under construction. +*/ +static void appendAllPathElements( + DbPath *pPath, /* Path under construction, to which to append zName */ + const char *zPath /* Path to append to pPath. Is zero-terminated */ +){ + int i = 0; + int j = 0; + do{ + while( zPath[i] && zPath[i]!='/' ){ i++; } + if( i>j ){ + appendOnePathElement(pPath, &zPath[j], i-j); + } + j = i+1; + }while( zPath[i++] ); +} + +/* +** Turn a relative pathname into a full pathname. The relative path +** is stored as a nul-terminated string in the buffer pointed to by +** zPath. +** +** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes +** (in this case, MAX_PATHNAME bytes). The full-path is written to +** this buffer before returning. +*/ +static int unixFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zPath, /* Possibly relative input path */ + int nOut, /* Size of output buffer in bytes */ + char *zOut /* Output buffer */ +){ + DbPath path; + UNUSED_PARAMETER(pVfs); + path.rc = 0; + path.nUsed = 0; + path.nSymlink = 0; + path.nOut = nOut; + path.zOut = zOut; + if( zPath[0]!='/' ){ + char zPwd[SQLITE_MAX_PATHLEN+2]; + if( osGetcwd(zPwd, sizeof(zPwd)-2)==0 ){ + return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + } + appendAllPathElements(&path, zPwd); + } + appendAllPathElements(&path, zPath); + zOut[path.nUsed] = 0; + if( path.rc || path.nUsed<2 ) return SQLITE_CANTOPEN_BKPT; + if( path.nSymlink ) return SQLITE_OK_SYMLINK; + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +#include +static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ + UNUSED_PARAMETER(NotUsed); + return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); +} + +/* +** SQLite calls this function immediately after a call to unixDlSym() or +** unixDlOpen() fails (returns a null pointer). If a more detailed error +** message is available, it is written to zBufOut. If no error message +** is available, zBufOut is left unmodified and SQLite uses a default +** error message. +*/ +static void unixDlError(sqlite3_vfs *NotUsed, int nBuf, char *zBufOut){ + const char *zErr; + UNUSED_PARAMETER(NotUsed); + unixEnterMutex(); + zErr = dlerror(); + if( zErr ){ + sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); + } + unixLeaveMutex(); +} +static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ + /* + ** GCC with -pedantic-errors says that C90 does not allow a void* to be + ** cast into a pointer to a function. And yet the library dlsym() routine + ** returns a void* which is really a pointer to a function. So how do we + ** use dlsym() with -pedantic-errors? + ** + ** Variable x below is defined to be a pointer to a function taking + ** parameters void* and const char* and returning a pointer to a function. + ** We initialize x by assigning it a pointer to the dlsym() function. + ** (That assignment requires a cast.) Then we call the function that + ** x points to. + ** + ** This work-around is unlikely to work correctly on any system where + ** you really cannot cast a function pointer into void*. But then, on the + ** other hand, dlsym() will not work on such a system either, so we have + ** not really lost anything. + */ + void (*(*x)(void*,const char*))(void); + UNUSED_PARAMETER(NotUsed); + x = (void(*(*)(void*,const char*))(void))dlsym; + return (*x)(p, zSym); +} +static void unixDlClose(sqlite3_vfs *NotUsed, void *pHandle){ + UNUSED_PARAMETER(NotUsed); + dlclose(pHandle); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define unixDlOpen 0 + #define unixDlError 0 + #define unixDlSym 0 + #define unixDlClose 0 +#endif + +/* +** Write nBuf bytes of random data to the supplied buffer zBuf. +*/ +static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ + UNUSED_PARAMETER(NotUsed); + assert((size_t)nBuf>=(sizeof(time_t)+sizeof(int))); + + /* We have to initialize zBuf to prevent valgrind from reporting + ** errors. The reports issued by valgrind are incorrect - we would + ** prefer that the randomness be increased by making use of the + ** uninitialized space in zBuf - but valgrind errors tend to worry + ** some users. Rather than argue, it seems easier just to initialize + ** the whole array and silence valgrind, even if that means less randomness + ** in the random seed. + ** + ** When testing, initializing zBuf[] to zero is all we do. That means + ** that we always use the same random number sequence. This makes the + ** tests repeatable. + */ + memset(zBuf, 0, nBuf); + randomnessPid = osGetpid(0); +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) + { + int fd, got; + fd = robust_open("/dev/urandom", O_RDONLY, 0); + if( fd<0 ){ + time_t t; + time(&t); + memcpy(zBuf, &t, sizeof(t)); + memcpy(&zBuf[sizeof(t)], &randomnessPid, sizeof(randomnessPid)); + assert( sizeof(t)+sizeof(randomnessPid)<=(size_t)nBuf ); + nBuf = sizeof(t) + sizeof(randomnessPid); + }else{ + do{ got = osRead(fd, zBuf, nBuf); }while( got<0 && errno==EINTR ); + robust_close(0, fd, __LINE__); + } + } +#endif + return nBuf; +} + + +/* +** Sleep for a little while. Return the amount of time slept. +** The argument is the number of microseconds we want to sleep. +** The return value is the number of microseconds of sleep actually +** requested from the underlying operating system, a number which +** might be greater than or equal to the argument, but not less +** than the argument. +*/ +static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ +#if OS_VXWORKS + struct timespec sp; + + sp.tv_sec = microseconds / 1000000; + sp.tv_nsec = (microseconds % 1000000) * 1000; + nanosleep(&sp, NULL); + UNUSED_PARAMETER(NotUsed); + return microseconds; +#elif defined(HAVE_USLEEP) && HAVE_USLEEP + if( microseconds>=1000000 ) sleep(microseconds/1000000); + if( microseconds%1000000 ) usleep(microseconds%1000000); + UNUSED_PARAMETER(NotUsed); + return microseconds; +#else + int seconds = (microseconds+999999)/1000000; + sleep(seconds); + UNUSED_PARAMETER(NotUsed); + return seconds*1000000; +#endif +} + +/* +** The following variable, if set to a non-zero value, is interpreted as +** the number of seconds since 1970 and is used to set the result of +** sqlite3OsCurrentTime() during testing. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write into *piNow +** the current time and date as a Julian Day number times 86_400_000. In +** other words, write into *piNow the number of milliseconds since the Julian +** epoch of noon in Greenwich on November 24, 4714 B.C according to the +** proleptic Gregorian calendar. +** +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** cannot be found. +*/ +static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ + static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; + int rc = SQLITE_OK; +#if defined(NO_GETTOD) + time_t t; + time(&t); + *piNow = ((sqlite3_int64)t)*1000 + unixEpoch; +#elif OS_VXWORKS + struct timespec sNow; + clock_gettime(CLOCK_REALTIME, &sNow); + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000; +#else + struct timeval sNow; + (void)gettimeofday(&sNow, 0); /* Cannot fail given valid arguments */ + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; +#endif + +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; + } +#endif + UNUSED_PARAMETER(NotUsed); + return rc; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ + sqlite3_int64 i = 0; + int rc; + UNUSED_PARAMETER(NotUsed); + rc = unixCurrentTimeInt64(0, &i); + *prNow = i/86400000.0; + return rc; +} +#else +# define unixCurrentTime 0 +#endif + +/* +** The xGetLastError() method is designed to return a better +** low-level error message when operating-system problems come up +** during SQLite operation. Only the integer return code is currently +** used. +*/ +static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ + UNUSED_PARAMETER(NotUsed); + UNUSED_PARAMETER(NotUsed2); + UNUSED_PARAMETER(NotUsed3); + return errno; +} + + +/* +************************ End of sqlite3_vfs methods *************************** +******************************************************************************/ + +/****************************************************************************** +************************** Begin Proxy Locking ******************************** +** +** Proxy locking is a "uber-locking-method" in this sense: It uses the +** other locking methods on secondary lock files. Proxy locking is a +** meta-layer over top of the primitive locking implemented above. For +** this reason, the division that implements of proxy locking is deferred +** until late in the file (here) after all of the other I/O methods have +** been defined - so that the primitive locking methods are available +** as services to help with the implementation of proxy locking. +** +**** +** +** The default locking schemes in SQLite use byte-range locks on the +** database file to coordinate safe, concurrent access by multiple readers +** and writers [http://sqlite.org/lockingv3.html]. The five file locking +** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented +** as POSIX read & write locks over fixed set of locations (via fsctl), +** on AFP and SMB only exclusive byte-range locks are available via fsctl +** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states. +** To simulate a F_RDLCK on the shared range, on AFP a randomly selected +** address in the shared range is taken for a SHARED lock, the entire +** shared range is taken for an EXCLUSIVE lock): +** +** PENDING_BYTE 0x40000000 +** RESERVED_BYTE 0x40000001 +** SHARED_RANGE 0x40000002 -> 0x40000200 +** +** This works well on the local file system, but shows a nearly 100x +** slowdown in read performance on AFP because the AFP client disables +** the read cache when byte-range locks are present. Enabling the read +** cache exposes a cache coherency problem that is present on all OS X +** supported network file systems. NFS and AFP both observe the +** close-to-open semantics for ensuring cache coherency +** [http://nfs.sourceforge.net/#faq_a8], which does not effectively +** address the requirements for concurrent database access by multiple +** readers and writers +** [http://www.nabble.com/SQLite-on-NFS-cache-coherency-td15655701.html]. +** +** To address the performance and cache coherency issues, proxy file locking +** changes the way database access is controlled by limiting access to a +** single host at a time and moving file locks off of the database file +** and onto a proxy file on the local file system. +** +** +** Using proxy locks +** ----------------- +** +** C APIs +** +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_SET_LOCKPROXYFILE, +** | ":auto:"); +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_GET_LOCKPROXYFILE, +** &); +** +** +** SQL pragmas +** +** PRAGMA [database.]lock_proxy_file= | :auto: +** PRAGMA [database.]lock_proxy_file +** +** Specifying ":auto:" means that if there is a conch file with a matching +** host ID in it, the proxy path in the conch file will be used, otherwise +** a proxy path based on the user's temp dir +** (via confstr(_CS_DARWIN_USER_TEMP_DIR,...)) will be used and the +** actual proxy file name is generated from the name and path of the +** database file. For example: +** +** For database path "/Users/me/foo.db" +** The lock path will be "/sqliteplocks/_Users_me_foo.db:auto:") +** +** Once a lock proxy is configured for a database connection, it can not +** be removed, however it may be switched to a different proxy path via +** the above APIs (assuming the conch file is not being held by another +** connection or process). +** +** +** How proxy locking works +** ----------------------- +** +** Proxy file locking relies primarily on two new supporting files: +** +** * conch file to limit access to the database file to a single host +** at a time +** +** * proxy file to act as a proxy for the advisory locks normally +** taken on the database +** +** The conch file - to use a proxy file, sqlite must first "hold the conch" +** by taking an sqlite-style shared lock on the conch file, reading the +** contents and comparing the host's unique host ID (see below) and lock +** proxy path against the values stored in the conch. The conch file is +** stored in the same directory as the database file and the file name +** is patterned after the database file name as ".-conch". +** If the conch file does not exist, or its contents do not match the +** host ID and/or proxy path, then the lock is escalated to an exclusive +** lock and the conch file contents is updated with the host ID and proxy +** path and the lock is downgraded to a shared lock again. If the conch +** is held by another process (with a shared lock), the exclusive lock +** will fail and SQLITE_BUSY is returned. +** +** The proxy file - a single-byte file used for all advisory file locks +** normally taken on the database file. This allows for safe sharing +** of the database file for multiple readers and writers on the same +** host (the conch ensures that they all use the same local lock file). +** +** Requesting the lock proxy does not immediately take the conch, it is +** only taken when the first request to lock database file is made. +** This matches the semantics of the traditional locking behavior, where +** opening a connection to a database file does not take a lock on it. +** The shared lock and an open file descriptor are maintained until +** the connection to the database is closed. +** +** The proxy file and the lock file are never deleted so they only need +** to be created the first time they are used. +** +** Configuration options +** --------------------- +** +** SQLITE_PREFER_PROXY_LOCKING +** +** Database files accessed on non-local file systems are +** automatically configured for proxy locking, lock files are +** named automatically using the same logic as +** PRAGMA lock_proxy_file=":auto:" +** +** SQLITE_PROXY_DEBUG +** +** Enables the logging of error messages during host id file +** retrieval and creation +** +** LOCKPROXYDIR +** +** Overrides the default directory used for lock proxy files that +** are named automatically via the ":auto:" setting +** +** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS +** +** Permissions to use when creating a directory for storing the +** lock proxy files, only used when LOCKPROXYDIR is not set. +** +** +** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING, +** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will +** force proxy locking to be used for every database file opened, and 0 +** will force automatic proxy locking to be disabled for all database +** files (explicitly calling the SQLITE_FCNTL_SET_LOCKPROXYFILE pragma or +** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING). +*/ + +/* +** Proxy locking is only available on MacOSX +*/ +#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE + +/* +** The proxyLockingContext has the path and file structures for the remote +** and local proxy files in it +*/ +typedef struct proxyLockingContext proxyLockingContext; +struct proxyLockingContext { + unixFile *conchFile; /* Open conch file */ + char *conchFilePath; /* Name of the conch file */ + unixFile *lockProxy; /* Open proxy lock file */ + char *lockProxyPath; /* Name of the proxy lock file */ + char *dbPath; /* Name of the open file */ + int conchHeld; /* 1 if the conch is held, -1 if lockless */ + int nFails; /* Number of conch taking failures */ + void *oldLockingContext; /* Original lockingcontext to restore on close */ + sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */ +}; + +/* +** The proxy lock file path for the database at dbPath is written into lPath, +** which must point to valid, writable memory large enough for a maxLen length +** file path. +*/ +static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ + int len; + int dbLen; + int i; + +#ifdef LOCKPROXYDIR + len = strlcpy(lPath, LOCKPROXYDIR, maxLen); +#else +# ifdef _CS_DARWIN_USER_TEMP_DIR + { + if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){ + OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n", + lPath, errno, osGetpid(0))); + return SQLITE_IOERR_LOCK; + } + len = strlcat(lPath, "sqliteplocks", maxLen); + } +# else + len = strlcpy(lPath, "/tmp/", maxLen); +# endif +#endif + + if( lPath[len-1]!='/' ){ + len = strlcat(lPath, "/", maxLen); + } + + /* transform the db path to a unique cache name */ + dbLen = (int)strlen(dbPath); + for( i=0; i 0) ){ + /* only mkdir if leaf dir != "." or "/" or ".." */ + if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') + || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ + buf[i]='\0'; + if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ + int err=errno; + if( err!=EEXIST ) { + OSTRACE(("CREATELOCKPATH FAILED creating %s, " + "'%s' proxy lock path=%s pid=%d\n", + buf, strerror(err), lockPath, osGetpid(0))); + return err; + } + } + } + start=i+1; + } + buf[i] = lockPath[i]; + } + OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n",lockPath,osGetpid(0))); + return 0; +} + +/* +** Create a new VFS file descriptor (stored in memory obtained from +** sqlite3_malloc) and open the file named "path" in the file descriptor. +** +** The caller is responsible not only for closing the file descriptor +** but also for freeing the memory associated with the file descriptor. +*/ +static int proxyCreateUnixFile( + const char *path, /* path for the new unixFile */ + unixFile **ppFile, /* unixFile created and returned by ref */ + int islockfile /* if non zero missing dirs will be created */ +) { + int fd = -1; + unixFile *pNew; + int rc = SQLITE_OK; + int openFlags = O_RDWR | O_CREAT | O_NOFOLLOW; + sqlite3_vfs dummyVfs; + int terrno = 0; + UnixUnusedFd *pUnused = NULL; + + /* 1. first try to open/create the file + ** 2. if that fails, and this is a lock file (not-conch), try creating + ** the parent directories and then try again. + ** 3. if that fails, try to open the file read-only + ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file + */ + pUnused = findReusableFd(path, openFlags); + if( pUnused ){ + fd = pUnused->fd; + }else{ + pUnused = sqlite3_malloc64(sizeof(*pUnused)); + if( !pUnused ){ + return SQLITE_NOMEM_BKPT; + } + } + if( fd<0 ){ + fd = robust_open(path, openFlags, 0); + terrno = errno; + if( fd<0 && errno==ENOENT && islockfile ){ + if( proxyCreateLockPath(path) == SQLITE_OK ){ + fd = robust_open(path, openFlags, 0); + } + } + } + if( fd<0 ){ + openFlags = O_RDONLY | O_NOFOLLOW; + fd = robust_open(path, openFlags, 0); + terrno = errno; + } + if( fd<0 ){ + if( islockfile ){ + return SQLITE_BUSY; + } + switch (terrno) { + case EACCES: + return SQLITE_PERM; + case EIO: + return SQLITE_IOERR_LOCK; /* even though it is the conch */ + default: + return SQLITE_CANTOPEN_BKPT; + } + } + + pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); + if( pNew==NULL ){ + rc = SQLITE_NOMEM_BKPT; + goto end_create_proxy; + } + memset(pNew, 0, sizeof(unixFile)); + pNew->openFlags = openFlags; + memset(&dummyVfs, 0, sizeof(dummyVfs)); + dummyVfs.pAppData = (void*)&autolockIoFinder; + dummyVfs.zName = "dummy"; + pUnused->fd = fd; + pUnused->flags = openFlags; + pNew->pPreallocatedUnused = pUnused; + + rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); + if( rc==SQLITE_OK ){ + *ppFile = pNew; + return SQLITE_OK; + } +end_create_proxy: + robust_close(pNew, fd, __LINE__); + sqlite3_free(pNew); + sqlite3_free(pUnused); + return rc; +} + +#ifdef SQLITE_TEST +/* simulate multiple hosts by creating unique hostid file paths */ +SQLITE_API int sqlite3_hostid_num = 0; +#endif + +#define PROXY_HOSTIDLEN 16 /* conch file host id length */ + +#if HAVE_GETHOSTUUID +/* Not always defined in the headers as it ought to be */ +extern int gethostuuid(uuid_t id, const struct timespec *wait); +#endif + +/* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN +** bytes of writable memory. +*/ +static int proxyGetHostID(unsigned char *pHostID, int *pError){ + assert(PROXY_HOSTIDLEN == sizeof(uuid_t)); + memset(pHostID, 0, PROXY_HOSTIDLEN); +#if HAVE_GETHOSTUUID + { + struct timespec timeout = {1, 0}; /* 1 sec timeout */ + if( gethostuuid(pHostID, &timeout) ){ + int err = errno; + if( pError ){ + *pError = err; + } + return SQLITE_IOERR; + } + } +#else + UNUSED_PARAMETER(pError); +#endif +#ifdef SQLITE_TEST + /* simulate multiple hosts by creating unique hostid file paths */ + if( sqlite3_hostid_num != 0){ + pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); + } +#endif + + return SQLITE_OK; +} + +/* The conch file contains the header, host id and lock file path + */ +#define PROXY_CONCHVERSION 2 /* 1-byte header, 16-byte host id, path */ +#define PROXY_HEADERLEN 1 /* conch file header length */ +#define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN) +#define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN) + +/* +** Takes an open conch file, copies the contents to a new path and then moves +** it back. The newly created file's file descriptor is assigned to the +** conch file structure and finally the original conch file descriptor is +** closed. Returns zero if successful. +*/ +static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; + char tPath[MAXPATHLEN]; + char buf[PROXY_MAXCONCHLEN]; + char *cPath = pCtx->conchFilePath; + size_t readLen = 0; + size_t pathLen = 0; + char errmsg[64] = ""; + int fd = -1; + int rc = -1; + UNUSED_PARAMETER(myHostID); + + /* create a new path by replace the trailing '-conch' with '-break' */ + pathLen = strlcpy(tPath, cPath, MAXPATHLEN); + if( pathLen>MAXPATHLEN || pathLen<6 || + (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){ + sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen); + goto end_breaklock; + } + /* read the conch content */ + readLen = osPread(conchFile->h, buf, PROXY_MAXCONCHLEN, 0); + if( readLenh, __LINE__); + conchFile->h = fd; + conchFile->openFlags = O_RDWR | O_CREAT; + +end_breaklock: + if( rc ){ + if( fd>=0 ){ + osUnlink(tPath); + robust_close(pFile, fd, __LINE__); + } + fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg); + } + return rc; +} + +/* Take the requested lock on the conch file and break a stale lock if the +** host id matches. +*/ +static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *conchFile = pCtx->conchFile; + int rc = SQLITE_OK; + int nTries = 0; + struct timespec conchModTime; + + memset(&conchModTime, 0, sizeof(conchModTime)); + do { + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); + nTries ++; + if( rc==SQLITE_BUSY ){ + /* If the lock failed (busy): + * 1st try: get the mod time of the conch, wait 0.5s and try again. + * 2nd try: fail if the mod time changed or host id is different, wait + * 10 sec and try again + * 3rd try: break the lock unless the mod time has changed. + */ + struct stat buf; + if( osFstat(conchFile->h, &buf) ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_LOCK; + } + + if( nTries==1 ){ + conchModTime = buf.st_mtimespec; + unixSleep(0,500000); /* wait 0.5 sec and try the lock again*/ + continue; + } + + assert( nTries>1 ); + if( conchModTime.tv_sec != buf.st_mtimespec.tv_sec || + conchModTime.tv_nsec != buf.st_mtimespec.tv_nsec ){ + return SQLITE_BUSY; + } + + if( nTries==2 ){ + char tBuf[PROXY_MAXCONCHLEN]; + int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0); + if( len<0 ){ + storeLastErrno(pFile, errno); + return SQLITE_IOERR_LOCK; + } + if( len>PROXY_PATHINDEX && tBuf[0]==(char)PROXY_CONCHVERSION){ + /* don't break the lock if the host id doesn't match */ + if( 0!=memcmp(&tBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN) ){ + return SQLITE_BUSY; + } + }else{ + /* don't break the lock on short read or a version mismatch */ + return SQLITE_BUSY; + } + unixSleep(0,10000000); /* wait 10 sec and try the lock again */ + continue; + } + + assert( nTries==3 ); + if( 0==proxyBreakConchLock(pFile, myHostID) ){ + rc = SQLITE_OK; + if( lockType==EXCLUSIVE_LOCK ){ + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK); + } + if( !rc ){ + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); + } + } + } + } while( rc==SQLITE_BUSY && nTries<3 ); + + return rc; +} + +/* Takes the conch by taking a shared lock and read the contents conch, if +** lockPath is non-NULL, the host ID and lock file path must match. A NULL +** lockPath means that the lockPath in the conch file will be used if the +** host IDs match, or a new lock path will be generated automatically +** and written to the conch file. +*/ +static int proxyTakeConch(unixFile *pFile){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + + if( pCtx->conchHeld!=0 ){ + return SQLITE_OK; + }else{ + unixFile *conchFile = pCtx->conchFile; + uuid_t myHostID; + int pError = 0; + char readBuf[PROXY_MAXCONCHLEN]; + char lockPath[MAXPATHLEN]; + char *tempLockPath = NULL; + int rc = SQLITE_OK; + int createConch = 0; + int hostIdMatch = 0; + int readLen = 0; + int tryOldLockPath = 0; + int forceNewLockPath = 0; + + OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); + + rc = proxyGetHostID(myHostID, &pError); + if( (rc&0xff)==SQLITE_IOERR ){ + storeLastErrno(pFile, pError); + goto end_takeconch; + } + rc = proxyConchLock(pFile, myHostID, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + goto end_takeconch; + } + /* read the existing conch file */ + readLen = seekAndRead((unixFile*)conchFile, 0, readBuf, PROXY_MAXCONCHLEN); + if( readLen<0 ){ + /* I/O error: lastErrno set by seekAndRead */ + storeLastErrno(pFile, conchFile->lastErrno); + rc = SQLITE_IOERR_READ; + goto end_takeconch; + }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) || + readBuf[0]!=(char)PROXY_CONCHVERSION ){ + /* a short read or version format mismatch means we need to create a new + ** conch file. + */ + createConch = 1; + } + /* if the host id matches and the lock path already exists in the conch + ** we'll try to use the path there, if we can't open that path, we'll + ** retry with a new auto-generated path + */ + do { /* in case we need to try again for an :auto: named lock file */ + + if( !createConch && !forceNewLockPath ){ + hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID, + PROXY_HOSTIDLEN); + /* if the conch has data compare the contents */ + if( !pCtx->lockProxyPath ){ + /* for auto-named local lock file, just check the host ID and we'll + ** use the local lock file path that's already in there + */ + if( hostIdMatch ){ + size_t pathLen = (readLen - PROXY_PATHINDEX); + + if( pathLen>=MAXPATHLEN ){ + pathLen=MAXPATHLEN-1; + } + memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen); + lockPath[pathLen] = 0; + tempLockPath = lockPath; + tryOldLockPath = 1; + /* create a copy of the lock path if the conch is taken */ + goto end_takeconch; + } + }else if( hostIdMatch + && !strncmp(pCtx->lockProxyPath, &readBuf[PROXY_PATHINDEX], + readLen-PROXY_PATHINDEX) + ){ + /* conch host and lock path match */ + goto end_takeconch; + } + } + + /* if the conch isn't writable and doesn't match, we can't take it */ + if( (conchFile->openFlags&O_RDWR) == 0 ){ + rc = SQLITE_BUSY; + goto end_takeconch; + } + + /* either the conch didn't match or we need to create a new one */ + if( !pCtx->lockProxyPath ){ + proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); + tempLockPath = lockPath; + /* create a copy of the lock path _only_ if the conch is taken */ + } + + /* update conch with host and path (this will fail if other process + ** has a shared lock already), if the host id matches, use the big + ** stick. + */ + futimes(conchFile->h, NULL); + if( hostIdMatch && !createConch ){ + if( conchFile->pInode && conchFile->pInode->nShared>1 ){ + /* We are trying for an exclusive lock but another thread in this + ** same process is still holding a shared lock. */ + rc = SQLITE_BUSY; + } else { + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); + } + }else{ + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); + } + if( rc==SQLITE_OK ){ + char writeBuffer[PROXY_MAXCONCHLEN]; + int writeSize = 0; + + writeBuffer[0] = (char)PROXY_CONCHVERSION; + memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); + if( pCtx->lockProxyPath!=NULL ){ + strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, + MAXPATHLEN); + }else{ + strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); + } + writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); + robust_ftruncate(conchFile->h, writeSize); + rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); + full_fsync(conchFile->h,0,0); + /* If we created a new conch file (not just updated the contents of a + ** valid conch file), try to match the permissions of the database + */ + if( rc==SQLITE_OK && createConch ){ + struct stat buf; + int err = osFstat(pFile->h, &buf); + if( err==0 ){ + mode_t cmode = buf.st_mode&(S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP | + S_IROTH|S_IWOTH); + /* try to match the database file R/W permissions, ignore failure */ +#ifndef SQLITE_PROXY_DEBUG + osFchmod(conchFile->h, cmode); +#else + do{ + rc = osFchmod(conchFile->h, cmode); + }while( rc==(-1) && errno==EINTR ); + if( rc!=0 ){ + int code = errno; + fprintf(stderr, "fchmod %o FAILED with %d %s\n", + cmode, code, strerror(code)); + } else { + fprintf(stderr, "fchmod %o SUCCEDED\n",cmode); + } + }else{ + int code = errno; + fprintf(stderr, "STAT FAILED[%d] with %d %s\n", + err, code, strerror(code)); +#endif + } + } + } + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK); + + end_takeconch: + OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); + if( rc==SQLITE_OK && pFile->openFlags ){ + int fd; + if( pFile->h>=0 ){ + robust_close(pFile, pFile->h, __LINE__); + } + pFile->h = -1; + fd = robust_open(pCtx->dbPath, pFile->openFlags, 0); + OSTRACE(("TRANSPROXY: OPEN %d\n", fd)); + if( fd>=0 ){ + pFile->h = fd; + }else{ + rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called + during locking */ + } + } + if( rc==SQLITE_OK && !pCtx->lockProxy ){ + char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath; + rc = proxyCreateUnixFile(path, &pCtx->lockProxy, 1); + if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && tryOldLockPath ){ + /* we couldn't create the proxy lock file with the old lock file path + ** so try again via auto-naming + */ + forceNewLockPath = 1; + tryOldLockPath = 0; + continue; /* go back to the do {} while start point, try again */ + } + } + if( rc==SQLITE_OK ){ + /* Need to make a copy of path if we extracted the value + ** from the conch file or the path was allocated on the stack + */ + if( tempLockPath ){ + pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); + if( !pCtx->lockProxyPath ){ + rc = SQLITE_NOMEM_BKPT; + } + } + } + if( rc==SQLITE_OK ){ + pCtx->conchHeld = 1; + + if( pCtx->lockProxy->pMethod == &afpIoMethods ){ + afpLockingContext *afpCtx; + afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; + afpCtx->dbPath = pCtx->lockProxyPath; + } + } else { + conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } + OSTRACE(("TAKECONCH %d %s\n", conchFile->h, + rc==SQLITE_OK?"ok":"failed")); + return rc; + } while (1); /* in case we need to retry the :auto: lock file - + ** we should never get here except via the 'continue' call. */ + } +} + +/* +** If pFile holds a lock on a conch file, then release that lock. +*/ +static int proxyReleaseConch(unixFile *pFile){ + int rc = SQLITE_OK; /* Subroutine return code */ + proxyLockingContext *pCtx; /* The locking context for the proxy lock */ + unixFile *conchFile; /* Name of the conch file */ + + pCtx = (proxyLockingContext *)pFile->lockingContext; + conchFile = pCtx->conchFile; + OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h, + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); + if( pCtx->conchHeld>0 ){ + rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); + } + pCtx->conchHeld = 0; + OSTRACE(("RELEASECONCH %d %s\n", conchFile->h, + (rc==SQLITE_OK ? "ok" : "failed"))); + return rc; +} + +/* +** Given the name of a database file, compute the name of its conch file. +** Store the conch filename in memory obtained from sqlite3_malloc64(). +** Make *pConchPath point to the new name. Return SQLITE_OK on success +** or SQLITE_NOMEM if unable to obtain memory. +** +** The caller is responsible for ensuring that the allocated memory +** space is eventually freed. +** +** *pConchPath is set to NULL if a memory allocation error occurs. +*/ +static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ + int i; /* Loop counter */ + int len = (int)strlen(dbPath); /* Length of database filename - dbPath */ + char *conchPath; /* buffer in which to construct conch name */ + + /* Allocate space for the conch filename and initialize the name to + ** the name of the original database file. */ + *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); + if( conchPath==0 ){ + return SQLITE_NOMEM_BKPT; + } + memcpy(conchPath, dbPath, len+1); + + /* now insert a "." before the last / character */ + for( i=(len-1); i>=0; i-- ){ + if( conchPath[i]=='/' ){ + i++; + break; + } + } + conchPath[i]='.'; + while ( ilockingContext; + char *oldPath = pCtx->lockProxyPath; + int rc = SQLITE_OK; + + if( pFile->eFileLock!=NO_LOCK ){ + return SQLITE_BUSY; + } + + /* nothing to do if the path is NULL, :auto: or matches the existing path */ + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") || + (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){ + return SQLITE_OK; + }else{ + unixFile *lockProxy = pCtx->lockProxy; + pCtx->lockProxy=NULL; + pCtx->conchHeld = 0; + if( lockProxy!=NULL ){ + rc=lockProxy->pMethod->xClose((sqlite3_file *)lockProxy); + if( rc ) return rc; + sqlite3_free(lockProxy); + } + sqlite3_free(oldPath); + pCtx->lockProxyPath = sqlite3DbStrDup(0, path); + } + + return rc; +} + +/* +** pFile is a file that has been opened by a prior xOpen call. dbPath +** is a string buffer at least MAXPATHLEN+1 characters in size. +** +** This routine find the filename associated with pFile and writes it +** int dbPath. +*/ +static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ +#if defined(__APPLE__) + if( pFile->pMethod == &afpIoMethods ){ + /* afp style keeps a reference to the db path in the filePath field + ** of the struct */ + assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); + strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, + MAXPATHLEN); + } else +#endif + if( pFile->pMethod == &dotlockIoMethods ){ + /* dot lock style uses the locking context to store the dot lock + ** file path */ + int len = strlen((char *)pFile->lockingContext) - strlen(DOTLOCK_SUFFIX); + memcpy(dbPath, (char *)pFile->lockingContext, len + 1); + }else{ + /* all other styles use the locking context to store the db file path */ + assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); + strlcpy(dbPath, (char *)pFile->lockingContext, MAXPATHLEN); + } + return SQLITE_OK; +} + +/* +** Takes an already filled in unix file and alters it so all file locking +** will be performed on the local proxy lock file. The following fields +** are preserved in the locking context so that they can be restored and +** the unix structure properly cleaned up at close time: +** ->lockingContext +** ->pMethod +*/ +static int proxyTransformUnixFile(unixFile *pFile, const char *path) { + proxyLockingContext *pCtx; + char dbPath[MAXPATHLEN+1]; /* Name of the database file */ + char *lockPath=NULL; + int rc = SQLITE_OK; + + if( pFile->eFileLock!=NO_LOCK ){ + return SQLITE_BUSY; + } + proxyGetDbPathForUnixFile(pFile, dbPath); + if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ){ + lockPath=NULL; + }else{ + lockPath=(char *)path; + } + + OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, + (lockPath ? lockPath : ":auto:"), osGetpid(0))); + + pCtx = sqlite3_malloc64( sizeof(*pCtx) ); + if( pCtx==0 ){ + return SQLITE_NOMEM_BKPT; + } + memset(pCtx, 0, sizeof(*pCtx)); + + rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath); + if( rc==SQLITE_OK ){ + rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0); + if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 0) ){ + /* if (a) the open flags are not O_RDWR, (b) the conch isn't there, and + ** (c) the file system is read-only, then enable no-locking access. + ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts + ** that openFlags will have only one of O_RDONLY or O_RDWR. + */ + struct statfs fsInfo; + struct stat conchInfo; + int goLockless = 0; + + if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) { + int err = errno; + if( (err==ENOENT) && (statfs(dbPath, &fsInfo) != -1) ){ + goLockless = (fsInfo.f_flags&MNT_RDONLY) == MNT_RDONLY; + } + } + if( goLockless ){ + pCtx->conchHeld = -1; /* read only FS/ lockless */ + rc = SQLITE_OK; + } + } + } + if( rc==SQLITE_OK && lockPath ){ + pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); + } + + if( rc==SQLITE_OK ){ + pCtx->dbPath = sqlite3DbStrDup(0, dbPath); + if( pCtx->dbPath==NULL ){ + rc = SQLITE_NOMEM_BKPT; + } + } + if( rc==SQLITE_OK ){ + /* all memory is allocated, proxys are created and assigned, + ** switch the locking context and pMethod then return. + */ + pCtx->oldLockingContext = pFile->lockingContext; + pFile->lockingContext = pCtx; + pCtx->pOldMethod = pFile->pMethod; + pFile->pMethod = &proxyIoMethods; + }else{ + if( pCtx->conchFile ){ + pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile); + sqlite3_free(pCtx->conchFile); + } + sqlite3DbFree(0, pCtx->lockProxyPath); + sqlite3_free(pCtx->conchFilePath); + sqlite3_free(pCtx); + } + OSTRACE(("TRANSPROXY %d %s\n", pFile->h, + (rc==SQLITE_OK ? "ok" : "failed"))); + return rc; +} + + +/* +** This routine handles sqlite3_file_control() calls that are specific +** to proxy locking. +*/ +static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ + switch( op ){ + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { + unixFile *pFile = (unixFile*)id; + if( pFile->pMethod == &proxyIoMethods ){ + proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext; + proxyTakeConch(pFile); + if( pCtx->lockProxyPath ){ + *(const char **)pArg = pCtx->lockProxyPath; + }else{ + *(const char **)pArg = ":auto: (not held)"; + } + } else { + *(const char **)pArg = NULL; + } + return SQLITE_OK; + } + case SQLITE_FCNTL_SET_LOCKPROXYFILE: { + unixFile *pFile = (unixFile*)id; + int rc = SQLITE_OK; + int isProxyStyle = (pFile->pMethod == &proxyIoMethods); + if( pArg==NULL || (const char *)pArg==0 ){ + if( isProxyStyle ){ + /* turn off proxy locking - not supported. If support is added for + ** switching proxy locking mode off then it will need to fail if + ** the journal mode is WAL mode. + */ + rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/; + }else{ + /* turn off proxy locking - already off - NOOP */ + rc = SQLITE_OK; + } + }else{ + const char *proxyPath = (const char *)pArg; + if( isProxyStyle ){ + proxyLockingContext *pCtx = + (proxyLockingContext*)pFile->lockingContext; + if( !strcmp(pArg, ":auto:") + || (pCtx->lockProxyPath && + !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN)) + ){ + rc = SQLITE_OK; + }else{ + rc = switchLockProxyPath(pFile, proxyPath); + } + }else{ + /* turn on proxy file locking */ + rc = proxyTransformUnixFile(pFile, proxyPath); + } + } + return rc; + } + default: { + assert( 0 ); /* The call assures that only valid opcodes are sent */ + } + } + /*NOTREACHED*/ assert(0); + return SQLITE_ERROR; +} + +/* +** Within this division (the proxying locking implementation) the procedures +** above this point are all utilities. The lock-related methods of the +** proxy-locking sqlite3_io_method object follow. +*/ + + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, set *pResOut +** to a non-zero value otherwise *pResOut is set to zero. The return value +** is set to SQLITE_OK unless an I/O error occurs during lock checking. +*/ +static int proxyCheckReservedLock(sqlite3_file *id, int *pResOut) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + return proxy->pMethod->xCheckReservedLock((sqlite3_file*)proxy, pResOut); + }else{ /* conchHeld < 0 is lockless */ + pResOut=0; + } + } + return rc; +} + +/* +** Lock the file with the lock specified by parameter eFileLock - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. Use the sqlite3OsUnlock() +** routine to lower a locking level. +*/ +static int proxyLock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + rc = proxy->pMethod->xLock((sqlite3_file*)proxy, eFileLock); + pFile->eFileLock = proxy->eFileLock; + }else{ + /* conchHeld < 0 is lockless */ + } + } + return rc; +} + + +/* +** Lower the locking level on file descriptor pFile to eFileLock. eFileLock +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +*/ +static int proxyUnlock(sqlite3_file *id, int eFileLock) { + unixFile *pFile = (unixFile*)id; + int rc = proxyTakeConch(pFile); + if( rc==SQLITE_OK ){ + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + if( pCtx->conchHeld>0 ){ + unixFile *proxy = pCtx->lockProxy; + rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, eFileLock); + pFile->eFileLock = proxy->eFileLock; + }else{ + /* conchHeld < 0 is lockless */ + } + } + return rc; +} + +/* +** Close a file that uses proxy locks. +*/ +static int proxyClose(sqlite3_file *id) { + if( ALWAYS(id) ){ + unixFile *pFile = (unixFile*)id; + proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; + unixFile *lockProxy = pCtx->lockProxy; + unixFile *conchFile = pCtx->conchFile; + int rc = SQLITE_OK; + + if( lockProxy ){ + rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK); + if( rc ) return rc; + rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy); + if( rc ) return rc; + sqlite3_free(lockProxy); + pCtx->lockProxy = 0; + } + if( conchFile ){ + if( pCtx->conchHeld ){ + rc = proxyReleaseConch(pFile); + if( rc ) return rc; + } + rc = conchFile->pMethod->xClose((sqlite3_file*)conchFile); + if( rc ) return rc; + sqlite3_free(conchFile); + } + sqlite3DbFree(0, pCtx->lockProxyPath); + sqlite3_free(pCtx->conchFilePath); + sqlite3DbFree(0, pCtx->dbPath); + /* restore the original locking context and pMethod then close it */ + pFile->lockingContext = pCtx->oldLockingContext; + pFile->pMethod = pCtx->pOldMethod; + sqlite3_free(pCtx); + return pFile->pMethod->xClose(id); + } + return SQLITE_OK; +} + + + +#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ +/* +** The proxy locking style is intended for use with AFP filesystems. +** And since AFP is only supported on MacOSX, the proxy locking is also +** restricted to MacOSX. +** +** +******************* End of the proxy lock implementation ********************** +******************************************************************************/ + +/* +** Initialize the operating system interface. +** +** This routine registers all VFS implementations for unix-like operating +** systems. This routine, and the sqlite3_os_end() routine that follows, +** should be the only routines in this file that are visible from other +** files. +** +** This routine is called once during SQLite initialization and by a +** single thread. The memory allocation and mutex subsystems have not +** necessarily been initialized when this routine is called, and so they +** should not be used. +*/ +SQLITE_API int sqlite3_os_init(void){ + /* + ** The following macro defines an initializer for an sqlite3_vfs object. + ** The name of the VFS is NAME. The pAppData is a pointer to a pointer + ** to the "finder" function. (pAppData is a pointer to a pointer because + ** silly C90 rules prohibit a void* from being cast to a function pointer + ** and so we have to go through the intermediate pointer to avoid problems + ** when compiling with -pedantic-errors on GCC.) + ** + ** The FINDER parameter to this macro is the name of the pointer to the + ** finder-function. The finder-function returns a pointer to the + ** sqlite_io_methods object that implements the desired locking + ** behaviors. See the division above that contains the IOMETHODS + ** macro for addition information on finder-functions. + ** + ** Most finders simply return a pointer to a fixed sqlite3_io_methods + ** object. But the "autolockIoFinder" available on MacOSX does a little + ** more than that; it looks at the filesystem type that hosts the + ** database file and tries to choose an locking method appropriate for + ** that filesystem time. + */ + #define UNIXVFS(VFSNAME, FINDER) { \ + 3, /* iVersion */ \ + sizeof(unixFile), /* szOsFile */ \ + MAX_PATHNAME, /* mxPathname */ \ + 0, /* pNext */ \ + VFSNAME, /* zName */ \ + (void*)&FINDER, /* pAppData */ \ + unixOpen, /* xOpen */ \ + unixDelete, /* xDelete */ \ + unixAccess, /* xAccess */ \ + unixFullPathname, /* xFullPathname */ \ + unixDlOpen, /* xDlOpen */ \ + unixDlError, /* xDlError */ \ + unixDlSym, /* xDlSym */ \ + unixDlClose, /* xDlClose */ \ + unixRandomness, /* xRandomness */ \ + unixSleep, /* xSleep */ \ + unixCurrentTime, /* xCurrentTime */ \ + unixGetLastError, /* xGetLastError */ \ + unixCurrentTimeInt64, /* xCurrentTimeInt64 */ \ + unixSetSystemCall, /* xSetSystemCall */ \ + unixGetSystemCall, /* xGetSystemCall */ \ + unixNextSystemCall, /* xNextSystemCall */ \ + } + + /* + ** All default VFSes for unix are contained in the following array. + ** + ** Note that the sqlite3_vfs.pNext field of the VFS object is modified + ** by the SQLite core when the VFS is registered. So the following + ** array cannot be const. + */ + static sqlite3_vfs aVfs[] = { +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + UNIXVFS("unix", autolockIoFinder ), +#elif OS_VXWORKS + UNIXVFS("unix", vxworksIoFinder ), +#else + UNIXVFS("unix", posixIoFinder ), +#endif + UNIXVFS("unix-none", nolockIoFinder ), + UNIXVFS("unix-dotfile", dotlockIoFinder ), + UNIXVFS("unix-excl", posixIoFinder ), +#if OS_VXWORKS + UNIXVFS("unix-namedsem", semIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS + UNIXVFS("unix-posix", posixIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE + UNIXVFS("unix-flock", flockIoFinder ), +#endif +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) + UNIXVFS("unix-afp", afpIoFinder ), + UNIXVFS("unix-nfs", nfsIoFinder ), + UNIXVFS("unix-proxy", proxyIoFinder ), +#endif + }; + unsigned int i; /* Loop counter */ + + /* Double-check that the aSyscall[] array has been constructed + ** correctly. See ticket [bb3a86e890c8e96ab] */ + assert( ArraySize(aSyscall)==29 ); + + /* Register all VFSes defined in the aVfs[] array */ + for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ + sqlite3_vfs_register(&aVfs[i], i==0); + } + unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); + +#ifndef SQLITE_OMIT_WAL + /* Validate lock assumptions */ + assert( SQLITE_SHM_NLOCK==8 ); /* Number of available locks */ + assert( UNIX_SHM_BASE==120 ); /* Start of locking area */ + /* Locks: + ** WRITE UNIX_SHM_BASE 120 + ** CKPT UNIX_SHM_BASE+1 121 + ** RECOVER UNIX_SHM_BASE+2 122 + ** READ-0 UNIX_SHM_BASE+3 123 + ** READ-1 UNIX_SHM_BASE+4 124 + ** READ-2 UNIX_SHM_BASE+5 125 + ** READ-3 UNIX_SHM_BASE+6 126 + ** READ-4 UNIX_SHM_BASE+7 127 + ** DMS UNIX_SHM_BASE+8 128 + */ + assert( UNIX_SHM_DMS==128 ); /* Byte offset of the deadman-switch */ +#endif + + /* Initialize temp file dir array. */ + unixTempFileInit(); + + return SQLITE_OK; +} + +/* +** Shutdown the operating system interface. +** +** Some operating systems might need to do some cleanup in this routine, +** to release dynamically allocated objects. But not on unix. +** This routine is a no-op for unix. +*/ +SQLITE_API int sqlite3_os_end(void){ + unixBigLock = 0; + return SQLITE_OK; +} + +#endif /* SQLITE_OS_UNIX */ + +/************** End of os_unix.c *********************************************/ +/************** Begin file os_win.c ******************************************/ +/* +** 2004 May 22 +** +** 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 contains code that is specific to Windows. +*/ +/* #include "sqliteInt.h" */ +#if SQLITE_OS_WIN /* This file is used for Windows only */ + +/* +** Include code that is common to all os_*.c files +*/ +/* #include "os_common.h" */ + +/* +** Include the header file for the Windows VFS. +*/ +/* #include "os_win.h" */ + +/* +** Compiling and using WAL mode requires several APIs that are only +** available in Windows platforms based on the NT kernel. +*/ +#if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL) +# error "WAL mode requires support from the Windows NT kernel, compile\ + with SQLITE_OMIT_WAL." +#endif + +#if !SQLITE_OS_WINNT && SQLITE_MAX_MMAP_SIZE>0 +# error "Memory mapped files require support from the Windows NT kernel,\ + compile with SQLITE_MAX_MMAP_SIZE=0." +#endif + +/* +** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions +** based on the sub-platform)? +*/ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) +# define SQLITE_WIN32_HAS_ANSI +#endif + +/* +** Are most of the Win32 Unicode APIs available (i.e. with certain exceptions +** based on the sub-platform)? +*/ +#if (SQLITE_OS_WINCE || SQLITE_OS_WINNT || SQLITE_OS_WINRT) && \ + !defined(SQLITE_WIN32_NO_WIDE) +# define SQLITE_WIN32_HAS_WIDE +#endif + +/* +** Make sure at least one set of Win32 APIs is available. +*/ +#if !defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_WIN32_HAS_WIDE) +# error "At least one of SQLITE_WIN32_HAS_ANSI and SQLITE_WIN32_HAS_WIDE\ + must be defined." +#endif + +/* +** Define the required Windows SDK version constants if they are not +** already available. +*/ +#ifndef NTDDI_WIN8 +# define NTDDI_WIN8 0x06020000 +#endif + +#ifndef NTDDI_WINBLUE +# define NTDDI_WINBLUE 0x06030000 +#endif + +#ifndef NTDDI_WINTHRESHOLD +# define NTDDI_WINTHRESHOLD 0x06040000 +#endif + +/* +** Check to see if the GetVersionEx[AW] functions are deprecated on the +** target system. GetVersionEx was first deprecated in Win8.1. +*/ +#ifndef SQLITE_WIN32_GETVERSIONEX +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINBLUE +# define SQLITE_WIN32_GETVERSIONEX 0 /* GetVersionEx() is deprecated */ +# else +# define SQLITE_WIN32_GETVERSIONEX 1 /* GetVersionEx() is current */ +# endif +#endif + +/* +** Check to see if the CreateFileMappingA function is supported on the +** target system. It is unavailable when using "mincore.lib" on Win10. +** When compiling for Windows 10, always assume "mincore.lib" is in use. +*/ +#ifndef SQLITE_WIN32_CREATEFILEMAPPINGA +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINTHRESHOLD +# define SQLITE_WIN32_CREATEFILEMAPPINGA 0 +# else +# define SQLITE_WIN32_CREATEFILEMAPPINGA 1 +# endif +#endif + +/* +** This constant should already be defined (in the "WinDef.h" SDK file). +*/ +#ifndef MAX_PATH +# define MAX_PATH (260) +#endif + +/* +** Maximum pathname length (in chars) for Win32. This should normally be +** MAX_PATH. +*/ +#ifndef SQLITE_WIN32_MAX_PATH_CHARS +# define SQLITE_WIN32_MAX_PATH_CHARS (MAX_PATH) +#endif + +/* +** This constant should already be defined (in the "WinNT.h" SDK file). +*/ +#ifndef UNICODE_STRING_MAX_CHARS +# define UNICODE_STRING_MAX_CHARS (32767) +#endif + +/* +** Maximum pathname length (in chars) for WinNT. This should normally be +** UNICODE_STRING_MAX_CHARS. +*/ +#ifndef SQLITE_WINNT_MAX_PATH_CHARS +# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) +#endif + +/* +** Maximum pathname length (in bytes) for Win32. The MAX_PATH macro is in +** characters, so we allocate 4 bytes per character assuming worst-case of +** 4-bytes-per-character for UTF8. +*/ +#ifndef SQLITE_WIN32_MAX_PATH_BYTES +# define SQLITE_WIN32_MAX_PATH_BYTES (SQLITE_WIN32_MAX_PATH_CHARS*4) +#endif + +/* +** Maximum pathname length (in bytes) for WinNT. This should normally be +** UNICODE_STRING_MAX_CHARS * sizeof(WCHAR). +*/ +#ifndef SQLITE_WINNT_MAX_PATH_BYTES +# define SQLITE_WINNT_MAX_PATH_BYTES \ + (sizeof(WCHAR) * SQLITE_WINNT_MAX_PATH_CHARS) +#endif + +/* +** Maximum error message length (in chars) for WinRT. +*/ +#ifndef SQLITE_WIN32_MAX_ERRMSG_CHARS +# define SQLITE_WIN32_MAX_ERRMSG_CHARS (1024) +#endif + +/* +** Returns non-zero if the character should be treated as a directory +** separator. +*/ +#ifndef winIsDirSep +# define winIsDirSep(a) (((a) == '/') || ((a) == '\\')) +#endif + +/* +** This macro is used when a local variable is set to a value that is +** [sometimes] not used by the code (e.g. via conditional compilation). +*/ +#ifndef UNUSED_VARIABLE_VALUE +# define UNUSED_VARIABLE_VALUE(x) (void)(x) +#endif + +/* +** Returns the character that should be used as the directory separator. +*/ +#ifndef winGetDirSep +# define winGetDirSep() '\\' +#endif + +/* +** Do we need to manually define the Win32 file mapping APIs for use with WAL +** mode or memory mapped files (e.g. these APIs are available in the Windows +** CE SDK; however, they are not present in the header file)? +*/ +#if SQLITE_WIN32_FILEMAPPING_API && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) +/* +** Two of the file mapping APIs are different under WinRT. Figure out which +** set we need. +*/ +#if SQLITE_OS_WINRT +WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE, \ + LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR); + +WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE, ULONG, ULONG64, SIZE_T); +#else +#if defined(SQLITE_WIN32_HAS_ANSI) +WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, \ + DWORD, DWORD, DWORD, LPCSTR); +#endif /* defined(SQLITE_WIN32_HAS_ANSI) */ + +#if defined(SQLITE_WIN32_HAS_WIDE) +WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, \ + DWORD, DWORD, DWORD, LPCWSTR); +#endif /* defined(SQLITE_WIN32_HAS_WIDE) */ + +WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T); +#endif /* SQLITE_OS_WINRT */ + +/* +** These file mapping APIs are common to both Win32 and WinRT. +*/ + +WINBASEAPI BOOL WINAPI FlushViewOfFile(LPCVOID, SIZE_T); +WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID); +#endif /* SQLITE_WIN32_FILEMAPPING_API */ + +/* +** Some Microsoft compilers lack this definition. +*/ +#ifndef INVALID_FILE_ATTRIBUTES +# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif + +#ifndef FILE_FLAG_MASK +# define FILE_FLAG_MASK (0xFF3C0000) +#endif + +#ifndef FILE_ATTRIBUTE_MASK +# define FILE_ATTRIBUTE_MASK (0x0003FFF7) +#endif + +#ifndef SQLITE_OMIT_WAL +/* Forward references to structures used for WAL */ +typedef struct winShm winShm; /* A connection to shared-memory */ +typedef struct winShmNode winShmNode; /* A region of shared-memory */ +#endif + +/* +** WinCE lacks native support for file locking so we have to fake it +** with some code of our own. +*/ +#if SQLITE_OS_WINCE +typedef struct winceLock { + int nReaders; /* Number of reader locks obtained */ + BOOL bPending; /* Indicates a pending lock has been obtained */ + BOOL bReserved; /* Indicates a reserved lock has been obtained */ + BOOL bExclusive; /* Indicates an exclusive lock has been obtained */ +} winceLock; +#endif + +/* +** The winFile structure is a subclass of sqlite3_file* specific to the win32 +** portability layer. +*/ +typedef struct winFile winFile; +struct winFile { + const sqlite3_io_methods *pMethod; /*** Must be first ***/ + sqlite3_vfs *pVfs; /* The VFS used to open this file */ + HANDLE h; /* Handle for accessing the file */ + u8 locktype; /* Type of lock currently held on this file */ + short sharedLockByte; /* Randomly chosen byte used as a shared lock */ + u8 ctrlFlags; /* Flags. See WINFILE_* below */ + DWORD lastErrno; /* The Windows errno from the last I/O error */ +#ifndef SQLITE_OMIT_WAL + winShm *pShm; /* Instance of shared memory on this file */ +#endif + const char *zPath; /* Full pathname of this file */ + int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */ +#if SQLITE_OS_WINCE + LPWSTR zDeleteOnClose; /* Name of file to delete when closing */ + HANDLE hMutex; /* Mutex used to control access to shared lock */ + HANDLE hShared; /* Shared memory segment used for locking */ + winceLock local; /* Locks obtained by this instance of winFile */ + winceLock *shared; /* Global shared lock memory for the file */ +#endif +#if SQLITE_MAX_MMAP_SIZE>0 + int nFetchOut; /* Number of outstanding xFetch references */ + HANDLE hMap; /* Handle for accessing memory mapping */ + void *pMapRegion; /* Area memory mapped */ + sqlite3_int64 mmapSize; /* Size of mapped region */ + sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ +#endif +}; + +/* +** The winVfsAppData structure is used for the pAppData member for all of the +** Win32 VFS variants. +*/ +typedef struct winVfsAppData winVfsAppData; +struct winVfsAppData { + const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */ + void *pAppData; /* The extra pAppData, if any. */ + BOOL bNoLock; /* Non-zero if locking is disabled. */ +}; + +/* +** Allowed values for winFile.ctrlFlags +*/ +#define WINFILE_RDONLY 0x02 /* Connection is read only */ +#define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ +#define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ + +/* + * The size of the buffer used by sqlite3_win32_write_debug(). + */ +#ifndef SQLITE_WIN32_DBG_BUF_SIZE +# define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096-sizeof(DWORD))) +#endif + +/* + * If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the + * various Win32 API heap functions instead of our own. + */ +#ifdef SQLITE_WIN32_MALLOC + +/* + * If this is non-zero, an isolated heap will be created by the native Win32 + * allocator subsystem; otherwise, the default process heap will be used. This + * setting has no effect when compiling for WinRT. By default, this is enabled + * and an isolated heap will be created to store all allocated data. + * + ****************************************************************************** + * WARNING: It is important to note that when this setting is non-zero and the + * winMemShutdown function is called (e.g. by the sqlite3_shutdown + * function), all data that was allocated using the isolated heap will + * be freed immediately and any attempt to access any of that freed + * data will almost certainly result in an immediate access violation. + ****************************************************************************** + */ +#ifndef SQLITE_WIN32_HEAP_CREATE +# define SQLITE_WIN32_HEAP_CREATE (TRUE) +#endif + +/* + * This is the maximum possible initial size of the Win32-specific heap, in + * bytes. + */ +#ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE +# define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U) +#endif + +/* + * This is the extra space for the initial size of the Win32-specific heap, + * in bytes. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_INIT_EXTRA +# define SQLITE_WIN32_HEAP_INIT_EXTRA (4194304) +#endif + +/* + * Calculate the maximum legal cache size, in pages, based on the maximum + * possible initial heap size and the default page size, setting aside the + * needed extra space. + */ +#ifndef SQLITE_WIN32_MAX_CACHE_SIZE +# define SQLITE_WIN32_MAX_CACHE_SIZE (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - \ + (SQLITE_WIN32_HEAP_INIT_EXTRA)) / \ + (SQLITE_DEFAULT_PAGE_SIZE)) +#endif + +/* + * This is cache size used in the calculation of the initial size of the + * Win32-specific heap. It cannot be negative. + */ +#ifndef SQLITE_WIN32_CACHE_SIZE +# if SQLITE_DEFAULT_CACHE_SIZE>=0 +# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE) +# else +# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE)) +# endif +#endif + +/* + * Make sure that the calculated cache size, in pages, cannot cause the + * initial size of the Win32-specific heap to exceed the maximum amount + * of memory that can be specified in the call to HeapCreate. + */ +#if SQLITE_WIN32_CACHE_SIZE>SQLITE_WIN32_MAX_CACHE_SIZE +# undef SQLITE_WIN32_CACHE_SIZE +# define SQLITE_WIN32_CACHE_SIZE (2000) +#endif + +/* + * The initial size of the Win32-specific heap. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_INIT_SIZE +# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \ + (SQLITE_DEFAULT_PAGE_SIZE) + \ + (SQLITE_WIN32_HEAP_INIT_EXTRA)) +#endif + +/* + * The maximum size of the Win32-specific heap. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_MAX_SIZE +# define SQLITE_WIN32_HEAP_MAX_SIZE (0) +#endif + +/* + * The extra flags to use in calls to the Win32 heap APIs. This value may be + * zero for the default behavior. + */ +#ifndef SQLITE_WIN32_HEAP_FLAGS +# define SQLITE_WIN32_HEAP_FLAGS (0) +#endif + + +/* +** The winMemData structure stores information required by the Win32-specific +** sqlite3_mem_methods implementation. +*/ +typedef struct winMemData winMemData; +struct winMemData { +#ifndef NDEBUG + u32 magic1; /* Magic number to detect structure corruption. */ +#endif + HANDLE hHeap; /* The handle to our heap. */ + BOOL bOwned; /* Do we own the heap (i.e. destroy it on shutdown)? */ +#ifndef NDEBUG + u32 magic2; /* Magic number to detect structure corruption. */ +#endif +}; + +#ifndef NDEBUG +#define WINMEM_MAGIC1 0x42b2830b +#define WINMEM_MAGIC2 0xbd4d7cf4 +#endif + +static struct winMemData win_mem_data = { +#ifndef NDEBUG + WINMEM_MAGIC1, +#endif + NULL, FALSE +#ifndef NDEBUG + ,WINMEM_MAGIC2 +#endif +}; + +#ifndef NDEBUG +#define winMemAssertMagic1() assert( win_mem_data.magic1==WINMEM_MAGIC1 ) +#define winMemAssertMagic2() assert( win_mem_data.magic2==WINMEM_MAGIC2 ) +#define winMemAssertMagic() winMemAssertMagic1(); winMemAssertMagic2(); +#else +#define winMemAssertMagic() +#endif + +#define winMemGetDataPtr() &win_mem_data +#define winMemGetHeap() win_mem_data.hHeap +#define winMemGetOwned() win_mem_data.bOwned + +static void *winMemMalloc(int nBytes); +static void winMemFree(void *pPrior); +static void *winMemRealloc(void *pPrior, int nBytes); +static int winMemSize(void *p); +static int winMemRoundup(int n); +static int winMemInit(void *pAppData); +static void winMemShutdown(void *pAppData); + +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void); +#endif /* SQLITE_WIN32_MALLOC */ + +/* +** The following variable is (normally) set once and never changes +** thereafter. It records whether the operating system is Win9x +** or WinNT. +** +** 0: Operating system unknown. +** 1: Operating system is Win9x. +** 2: Operating system is WinNT. +** +** In order to facilitate testing on a WinNT system, the test fixture +** can manually set this value to 1 to emulate Win98 behavior. +*/ +#ifdef SQLITE_TEST +SQLITE_API LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; +#else +static LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; +#endif + +#ifndef SYSCALL +# define SYSCALL sqlite3_syscall_ptr +#endif + +/* +** This function is not available on Windows CE or WinRT. + */ + +#if SQLITE_OS_WINCE || SQLITE_OS_WINRT +# define osAreFileApisANSI() 1 +#endif + +/* +** Many system calls are accessed through pointer-to-functions so that +** they may be overridden at runtime to facilitate fault injection during +** testing and sandboxing. The following array holds the names and pointers +** to all overrideable system calls. +*/ +static struct win_syscall { + const char *zName; /* Name of the system call */ + sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ + sqlite3_syscall_ptr pDefault; /* Default value */ +} aSyscall[] = { +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "AreFileApisANSI", (SYSCALL)AreFileApisANSI, 0 }, +#else + { "AreFileApisANSI", (SYSCALL)0, 0 }, +#endif + +#ifndef osAreFileApisANSI +#define osAreFileApisANSI ((BOOL(WINAPI*)(VOID))aSyscall[0].pCurrent) +#endif + +#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) + { "CharLowerW", (SYSCALL)CharLowerW, 0 }, +#else + { "CharLowerW", (SYSCALL)0, 0 }, +#endif + +#define osCharLowerW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[1].pCurrent) + +#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) + { "CharUpperW", (SYSCALL)CharUpperW, 0 }, +#else + { "CharUpperW", (SYSCALL)0, 0 }, +#endif + +#define osCharUpperW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[2].pCurrent) + + { "CloseHandle", (SYSCALL)CloseHandle, 0 }, + +#define osCloseHandle ((BOOL(WINAPI*)(HANDLE))aSyscall[3].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "CreateFileA", (SYSCALL)CreateFileA, 0 }, +#else + { "CreateFileA", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileA ((HANDLE(WINAPI*)(LPCSTR,DWORD,DWORD, \ + LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[4].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "CreateFileW", (SYSCALL)CreateFileW, 0 }, +#else + { "CreateFileW", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ + LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) && \ + SQLITE_WIN32_CREATEFILEMAPPINGA + { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 }, +#else + { "CreateFileMappingA", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ + DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent) + +#if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) + { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 }, +#else + { "CreateFileMappingW", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ + DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "CreateMutexW", (SYSCALL)CreateMutexW, 0 }, +#else + { "CreateMutexW", (SYSCALL)0, 0 }, +#endif + +#define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,BOOL, \ + LPCWSTR))aSyscall[8].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "DeleteFileA", (SYSCALL)DeleteFileA, 0 }, +#else + { "DeleteFileA", (SYSCALL)0, 0 }, +#endif + +#define osDeleteFileA ((BOOL(WINAPI*)(LPCSTR))aSyscall[9].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "DeleteFileW", (SYSCALL)DeleteFileW, 0 }, +#else + { "DeleteFileW", (SYSCALL)0, 0 }, +#endif + +#define osDeleteFileW ((BOOL(WINAPI*)(LPCWSTR))aSyscall[10].pCurrent) + +#if SQLITE_OS_WINCE + { "FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0 }, +#else + { "FileTimeToLocalFileTime", (SYSCALL)0, 0 }, +#endif + +#define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, \ + LPFILETIME))aSyscall[11].pCurrent) + +#if SQLITE_OS_WINCE + { "FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0 }, +#else + { "FileTimeToSystemTime", (SYSCALL)0, 0 }, +#endif + +#define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, \ + LPSYSTEMTIME))aSyscall[12].pCurrent) + + { "FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0 }, + +#define osFlushFileBuffers ((BOOL(WINAPI*)(HANDLE))aSyscall[13].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "FormatMessageA", (SYSCALL)FormatMessageA, 0 }, +#else + { "FormatMessageA", (SYSCALL)0, 0 }, +#endif + +#define osFormatMessageA ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPSTR, \ + DWORD,va_list*))aSyscall[14].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "FormatMessageW", (SYSCALL)FormatMessageW, 0 }, +#else + { "FormatMessageW", (SYSCALL)0, 0 }, +#endif + +#define osFormatMessageW ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPWSTR, \ + DWORD,va_list*))aSyscall[15].pCurrent) + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "FreeLibrary", (SYSCALL)FreeLibrary, 0 }, +#else + { "FreeLibrary", (SYSCALL)0, 0 }, +#endif + +#define osFreeLibrary ((BOOL(WINAPI*)(HMODULE))aSyscall[16].pCurrent) + + { "GetCurrentProcessId", (SYSCALL)GetCurrentProcessId, 0 }, + +#define osGetCurrentProcessId ((DWORD(WINAPI*)(VOID))aSyscall[17].pCurrent) + +#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) + { "GetDiskFreeSpaceA", (SYSCALL)GetDiskFreeSpaceA, 0 }, +#else + { "GetDiskFreeSpaceA", (SYSCALL)0, 0 }, +#endif + +#define osGetDiskFreeSpaceA ((BOOL(WINAPI*)(LPCSTR,LPDWORD,LPDWORD,LPDWORD, \ + LPDWORD))aSyscall[18].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetDiskFreeSpaceW", (SYSCALL)GetDiskFreeSpaceW, 0 }, +#else + { "GetDiskFreeSpaceW", (SYSCALL)0, 0 }, +#endif + +#define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, \ + LPDWORD))aSyscall[19].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0 }, +#else + { "GetFileAttributesA", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesA ((DWORD(WINAPI*)(LPCSTR))aSyscall[20].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetFileAttributesW", (SYSCALL)GetFileAttributesW, 0 }, +#else + { "GetFileAttributesW", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesW ((DWORD(WINAPI*)(LPCWSTR))aSyscall[21].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0 }, +#else + { "GetFileAttributesExW", (SYSCALL)0, 0 }, +#endif + +#define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR,GET_FILEEX_INFO_LEVELS, \ + LPVOID))aSyscall[22].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetFileSize", (SYSCALL)GetFileSize, 0 }, +#else + { "GetFileSize", (SYSCALL)0, 0 }, +#endif + +#define osGetFileSize ((DWORD(WINAPI*)(HANDLE,LPDWORD))aSyscall[23].pCurrent) + +#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) + { "GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0 }, +#else + { "GetFullPathNameA", (SYSCALL)0, 0 }, +#endif + +#define osGetFullPathNameA ((DWORD(WINAPI*)(LPCSTR,DWORD,LPSTR, \ + LPSTR*))aSyscall[24].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetFullPathNameW", (SYSCALL)GetFullPathNameW, 0 }, +#else + { "GetFullPathNameW", (SYSCALL)0, 0 }, +#endif + +#define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR,DWORD,LPWSTR, \ + LPWSTR*))aSyscall[25].pCurrent) + + { "GetLastError", (SYSCALL)GetLastError, 0 }, + +#define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent) + +#if !defined(SQLITE_OMIT_LOAD_EXTENSION) +#if SQLITE_OS_WINCE + /* The GetProcAddressA() routine is only available on Windows CE. */ + { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 }, +#else + /* All other Windows platforms expect GetProcAddress() to take + ** an ANSI string regardless of the _UNICODE setting */ + { "GetProcAddressA", (SYSCALL)GetProcAddress, 0 }, +#endif +#else + { "GetProcAddressA", (SYSCALL)0, 0 }, +#endif + +#define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, \ + LPCSTR))aSyscall[27].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetSystemInfo", (SYSCALL)GetSystemInfo, 0 }, +#else + { "GetSystemInfo", (SYSCALL)0, 0 }, +#endif + +#define osGetSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[28].pCurrent) + + { "GetSystemTime", (SYSCALL)GetSystemTime, 0 }, + +#define osGetSystemTime ((VOID(WINAPI*)(LPSYSTEMTIME))aSyscall[29].pCurrent) + +#if !SQLITE_OS_WINCE + { "GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0 }, +#else + { "GetSystemTimeAsFileTime", (SYSCALL)0, 0 }, +#endif + +#define osGetSystemTimeAsFileTime ((VOID(WINAPI*)( \ + LPFILETIME))aSyscall[30].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "GetTempPathA", (SYSCALL)GetTempPathA, 0 }, +#else + { "GetTempPathA", (SYSCALL)0, 0 }, +#endif + +#define osGetTempPathA ((DWORD(WINAPI*)(DWORD,LPSTR))aSyscall[31].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) + { "GetTempPathW", (SYSCALL)GetTempPathW, 0 }, +#else + { "GetTempPathW", (SYSCALL)0, 0 }, +#endif + +#define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent) + +#if !SQLITE_OS_WINRT + { "GetTickCount", (SYSCALL)GetTickCount, 0 }, +#else + { "GetTickCount", (SYSCALL)0, 0 }, +#endif + +#define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_GETVERSIONEX + { "GetVersionExA", (SYSCALL)GetVersionExA, 0 }, +#else + { "GetVersionExA", (SYSCALL)0, 0 }, +#endif + +#define osGetVersionExA ((BOOL(WINAPI*)( \ + LPOSVERSIONINFOA))aSyscall[34].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + SQLITE_WIN32_GETVERSIONEX + { "GetVersionExW", (SYSCALL)GetVersionExW, 0 }, +#else + { "GetVersionExW", (SYSCALL)0, 0 }, +#endif + +#define osGetVersionExW ((BOOL(WINAPI*)( \ + LPOSVERSIONINFOW))aSyscall[35].pCurrent) + + { "HeapAlloc", (SYSCALL)HeapAlloc, 0 }, + +#define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD, \ + SIZE_T))aSyscall[36].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapCreate", (SYSCALL)HeapCreate, 0 }, +#else + { "HeapCreate", (SYSCALL)0, 0 }, +#endif + +#define osHeapCreate ((HANDLE(WINAPI*)(DWORD,SIZE_T, \ + SIZE_T))aSyscall[37].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapDestroy", (SYSCALL)HeapDestroy, 0 }, +#else + { "HeapDestroy", (SYSCALL)0, 0 }, +#endif + +#define osHeapDestroy ((BOOL(WINAPI*)(HANDLE))aSyscall[38].pCurrent) + + { "HeapFree", (SYSCALL)HeapFree, 0 }, + +#define osHeapFree ((BOOL(WINAPI*)(HANDLE,DWORD,LPVOID))aSyscall[39].pCurrent) + + { "HeapReAlloc", (SYSCALL)HeapReAlloc, 0 }, + +#define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD,LPVOID, \ + SIZE_T))aSyscall[40].pCurrent) + + { "HeapSize", (SYSCALL)HeapSize, 0 }, + +#define osHeapSize ((SIZE_T(WINAPI*)(HANDLE,DWORD, \ + LPCVOID))aSyscall[41].pCurrent) + +#if !SQLITE_OS_WINRT + { "HeapValidate", (SYSCALL)HeapValidate, 0 }, +#else + { "HeapValidate", (SYSCALL)0, 0 }, +#endif + +#define osHeapValidate ((BOOL(WINAPI*)(HANDLE,DWORD, \ + LPCVOID))aSyscall[42].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "HeapCompact", (SYSCALL)HeapCompact, 0 }, +#else + { "HeapCompact", (SYSCALL)0, 0 }, +#endif + +#define osHeapCompact ((UINT(WINAPI*)(HANDLE,DWORD))aSyscall[43].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadLibraryA", (SYSCALL)LoadLibraryA, 0 }, +#else + { "LoadLibraryA", (SYSCALL)0, 0 }, +#endif + +#define osLoadLibraryA ((HMODULE(WINAPI*)(LPCSTR))aSyscall[44].pCurrent) + +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ + !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadLibraryW", (SYSCALL)LoadLibraryW, 0 }, +#else + { "LoadLibraryW", (SYSCALL)0, 0 }, +#endif + +#define osLoadLibraryW ((HMODULE(WINAPI*)(LPCWSTR))aSyscall[45].pCurrent) + +#if !SQLITE_OS_WINRT + { "LocalFree", (SYSCALL)LocalFree, 0 }, +#else + { "LocalFree", (SYSCALL)0, 0 }, +#endif + +#define osLocalFree ((HLOCAL(WINAPI*)(HLOCAL))aSyscall[46].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "LockFile", (SYSCALL)LockFile, 0 }, +#else + { "LockFile", (SYSCALL)0, 0 }, +#endif + +#ifndef osLockFile +#define osLockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + DWORD))aSyscall[47].pCurrent) +#endif + +#if !SQLITE_OS_WINCE + { "LockFileEx", (SYSCALL)LockFileEx, 0 }, +#else + { "LockFileEx", (SYSCALL)0, 0 }, +#endif + +#ifndef osLockFileEx +#define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \ + LPOVERLAPPED))aSyscall[48].pCurrent) +#endif + +#if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) + { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 }, +#else + { "MapViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + SIZE_T))aSyscall[49].pCurrent) + + { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 }, + +#define osMultiByteToWideChar ((int(WINAPI*)(UINT,DWORD,LPCSTR,int,LPWSTR, \ + int))aSyscall[50].pCurrent) + + { "QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0 }, + +#define osQueryPerformanceCounter ((BOOL(WINAPI*)( \ + LARGE_INTEGER*))aSyscall[51].pCurrent) + + { "ReadFile", (SYSCALL)ReadFile, 0 }, + +#define osReadFile ((BOOL(WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD, \ + LPOVERLAPPED))aSyscall[52].pCurrent) + + { "SetEndOfFile", (SYSCALL)SetEndOfFile, 0 }, + +#define osSetEndOfFile ((BOOL(WINAPI*)(HANDLE))aSyscall[53].pCurrent) + +#if !SQLITE_OS_WINRT + { "SetFilePointer", (SYSCALL)SetFilePointer, 0 }, +#else + { "SetFilePointer", (SYSCALL)0, 0 }, +#endif + +#define osSetFilePointer ((DWORD(WINAPI*)(HANDLE,LONG,PLONG, \ + DWORD))aSyscall[54].pCurrent) + +#if !SQLITE_OS_WINRT + { "Sleep", (SYSCALL)Sleep, 0 }, +#else + { "Sleep", (SYSCALL)0, 0 }, +#endif + +#define osSleep ((VOID(WINAPI*)(DWORD))aSyscall[55].pCurrent) + + { "SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0 }, + +#define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, \ + LPFILETIME))aSyscall[56].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT + { "UnlockFile", (SYSCALL)UnlockFile, 0 }, +#else + { "UnlockFile", (SYSCALL)0, 0 }, +#endif + +#ifndef osUnlockFile +#define osUnlockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + DWORD))aSyscall[57].pCurrent) +#endif + +#if !SQLITE_OS_WINCE + { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 }, +#else + { "UnlockFileEx", (SYSCALL)0, 0 }, +#endif + +#define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ + LPOVERLAPPED))aSyscall[58].pCurrent) + +#if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 }, +#else + { "UnmapViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[59].pCurrent) + + { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 }, + +#define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \ + LPCSTR,LPBOOL))aSyscall[60].pCurrent) + + { "WriteFile", (SYSCALL)WriteFile, 0 }, + +#define osWriteFile ((BOOL(WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD, \ + LPOVERLAPPED))aSyscall[61].pCurrent) + +#if SQLITE_OS_WINRT + { "CreateEventExW", (SYSCALL)CreateEventExW, 0 }, +#else + { "CreateEventExW", (SYSCALL)0, 0 }, +#endif + +#define osCreateEventExW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,LPCWSTR, \ + DWORD,DWORD))aSyscall[62].pCurrent) + +#if !SQLITE_OS_WINRT + { "WaitForSingleObject", (SYSCALL)WaitForSingleObject, 0 }, +#else + { "WaitForSingleObject", (SYSCALL)0, 0 }, +#endif + +#define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \ + DWORD))aSyscall[63].pCurrent) + +#if !SQLITE_OS_WINCE + { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 }, +#else + { "WaitForSingleObjectEx", (SYSCALL)0, 0 }, +#endif + +#define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \ + BOOL))aSyscall[64].pCurrent) + +#if SQLITE_OS_WINRT + { "SetFilePointerEx", (SYSCALL)SetFilePointerEx, 0 }, +#else + { "SetFilePointerEx", (SYSCALL)0, 0 }, +#endif + +#define osSetFilePointerEx ((BOOL(WINAPI*)(HANDLE,LARGE_INTEGER, \ + PLARGE_INTEGER,DWORD))aSyscall[65].pCurrent) + +#if SQLITE_OS_WINRT + { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 }, +#else + { "GetFileInformationByHandleEx", (SYSCALL)0, 0 }, +#endif + +#define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \ + FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[66].pCurrent) + +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0 }, +#else + { "MapViewOfFileFromApp", (SYSCALL)0, 0 }, +#endif + +#define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \ + SIZE_T))aSyscall[67].pCurrent) + +#if SQLITE_OS_WINRT + { "CreateFile2", (SYSCALL)CreateFile2, 0 }, +#else + { "CreateFile2", (SYSCALL)0, 0 }, +#endif + +#define osCreateFile2 ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD,DWORD, \ + LPCREATEFILE2_EXTENDED_PARAMETERS))aSyscall[68].pCurrent) + +#if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_LOAD_EXTENSION) + { "LoadPackagedLibrary", (SYSCALL)LoadPackagedLibrary, 0 }, +#else + { "LoadPackagedLibrary", (SYSCALL)0, 0 }, +#endif + +#define osLoadPackagedLibrary ((HMODULE(WINAPI*)(LPCWSTR, \ + DWORD))aSyscall[69].pCurrent) + +#if SQLITE_OS_WINRT + { "GetTickCount64", (SYSCALL)GetTickCount64, 0 }, +#else + { "GetTickCount64", (SYSCALL)0, 0 }, +#endif + +#define osGetTickCount64 ((ULONGLONG(WINAPI*)(VOID))aSyscall[70].pCurrent) + +#if SQLITE_OS_WINRT + { "GetNativeSystemInfo", (SYSCALL)GetNativeSystemInfo, 0 }, +#else + { "GetNativeSystemInfo", (SYSCALL)0, 0 }, +#endif + +#define osGetNativeSystemInfo ((VOID(WINAPI*)( \ + LPSYSTEM_INFO))aSyscall[71].pCurrent) + +#if defined(SQLITE_WIN32_HAS_ANSI) + { "OutputDebugStringA", (SYSCALL)OutputDebugStringA, 0 }, +#else + { "OutputDebugStringA", (SYSCALL)0, 0 }, +#endif + +#define osOutputDebugStringA ((VOID(WINAPI*)(LPCSTR))aSyscall[72].pCurrent) + +#if defined(SQLITE_WIN32_HAS_WIDE) + { "OutputDebugStringW", (SYSCALL)OutputDebugStringW, 0 }, +#else + { "OutputDebugStringW", (SYSCALL)0, 0 }, +#endif + +#define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[73].pCurrent) + + { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 }, + +#define osGetProcessHeap ((HANDLE(WINAPI*)(VOID))aSyscall[74].pCurrent) + +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) + { "CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0 }, +#else + { "CreateFileMappingFromApp", (SYSCALL)0, 0 }, +#endif + +#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ + LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) + +/* +** NOTE: On some sub-platforms, the InterlockedCompareExchange "function" +** is really just a macro that uses a compiler intrinsic (e.g. x64). +** So do not try to make this is into a redefinable interface. +*/ +#if defined(InterlockedCompareExchange) + { "InterlockedCompareExchange", (SYSCALL)0, 0 }, + +#define osInterlockedCompareExchange InterlockedCompareExchange +#else + { "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 }, + +#define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG \ + SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent) +#endif /* defined(InterlockedCompareExchange) */ + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreate", (SYSCALL)UuidCreate, 0 }, +#else + { "UuidCreate", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreate ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[77].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreateSequential", (SYSCALL)UuidCreateSequential, 0 }, +#else + { "UuidCreateSequential", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreateSequential \ + ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent) + +#if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE>0 + { "FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0 }, +#else + { "FlushViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osFlushViewOfFile \ + ((BOOL(WINAPI*)(LPCVOID,SIZE_T))aSyscall[79].pCurrent) + +}; /* End of the overrideable system calls */ + +/* +** This is the xSetSystemCall() method of sqlite3_vfs for all of the +** "win32" VFSes. Return SQLITE_OK opon successfully updating the +** system call pointer, or SQLITE_NOTFOUND if there is no configurable +** system call named zName. +*/ +static int winSetSystemCall( + sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ + const char *zName, /* Name of system call to override */ + sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ +){ + unsigned int i; + int rc = SQLITE_NOTFOUND; + + UNUSED_PARAMETER(pNotUsed); + if( zName==0 ){ + /* If no zName is given, restore all system calls to their default + ** settings and return NULL + */ + rc = SQLITE_OK; + for(i=0; i0 ){ + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + memcpy(zDbgBuf, zBuf, nMin); + osOutputDebugStringA(zDbgBuf); + }else{ + osOutputDebugStringA(zBuf); + } +#elif defined(SQLITE_WIN32_HAS_WIDE) + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + if ( osMultiByteToWideChar( + osAreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, zBuf, + nMin, (LPWSTR)zDbgBuf, SQLITE_WIN32_DBG_BUF_SIZE/sizeof(WCHAR))<=0 ){ + return; + } + osOutputDebugStringW((LPCWSTR)zDbgBuf); +#else + if( nMin>0 ){ + memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); + memcpy(zDbgBuf, zBuf, nMin); + fprintf(stderr, "%s", zDbgBuf); + }else{ + fprintf(stderr, "%s", zBuf); + } +#endif +} + +/* +** The following routine suspends the current thread for at least ms +** milliseconds. This is equivalent to the Win32 Sleep() interface. +*/ +#if SQLITE_OS_WINRT +static HANDLE sleepObj = NULL; +#endif + +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){ +#if SQLITE_OS_WINRT + if ( sleepObj==NULL ){ + sleepObj = osCreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET, + SYNCHRONIZE); + } + assert( sleepObj!=NULL ); + osWaitForSingleObjectEx(sleepObj, milliseconds, FALSE); +#else + osSleep(milliseconds); +#endif +} + +#if SQLITE_MAX_WORKER_THREADS>0 && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 +SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){ + DWORD rc; + while( (rc = osWaitForSingleObjectEx(hObject, INFINITE, + TRUE))==WAIT_IO_COMPLETION ){} + return rc; +} +#endif + +/* +** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, +** or WinCE. Return false (zero) for Win95, Win98, or WinME. +** +** Here is an interesting observation: Win95, Win98, and WinME lack +** the LockFileEx() API. But we can still statically link against that +** API as long as we don't call it when running Win95/98/ME. A call to +** this routine is used to determine if the host is Win95/98/ME or +** WinNT/2K/XP so that we will know whether or not we can safely call +** the LockFileEx() API. +*/ + +#if !SQLITE_WIN32_GETVERSIONEX +# define osIsNT() (1) +#elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI) +# define osIsNT() (1) +#elif !defined(SQLITE_WIN32_HAS_WIDE) +# define osIsNT() (0) +#else +# define osIsNT() ((sqlite3_os_type==2) || sqlite3_win32_is_nt()) +#endif + +/* +** This function determines if the machine is running a version of Windows +** based on the NT kernel. +*/ +SQLITE_API int sqlite3_win32_is_nt(void){ +#if SQLITE_OS_WINRT + /* + ** NOTE: The WinRT sub-platform is always assumed to be based on the NT + ** kernel. + */ + return 1; +#elif SQLITE_WIN32_GETVERSIONEX + if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){ +#if defined(SQLITE_WIN32_HAS_ANSI) + OSVERSIONINFOA sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + osGetVersionExA(&sInfo); + osInterlockedCompareExchange(&sqlite3_os_type, + (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); +#elif defined(SQLITE_WIN32_HAS_WIDE) + OSVERSIONINFOW sInfo; + sInfo.dwOSVersionInfoSize = sizeof(sInfo); + osGetVersionExW(&sInfo); + osInterlockedCompareExchange(&sqlite3_os_type, + (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); +#endif + } + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; +#elif SQLITE_TEST + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; +#else + /* + ** NOTE: All sub-platforms where the GetVersionEx[AW] functions are + ** deprecated are always assumed to be based on the NT kernel. + */ + return 1; +#endif +} + +#ifdef SQLITE_WIN32_MALLOC +/* +** Allocate nBytes of memory. +*/ +static void *winMemMalloc(int nBytes){ + HANDLE hHeap; + void *p; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + assert( nBytes>=0 ); + p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); + if( !p ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%lu), heap=%p", + nBytes, osGetLastError(), (void*)hHeap); + } + return p; +} + +/* +** Free memory. +*/ +static void winMemFree(void *pPrior){ + HANDLE hHeap; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); +#endif + if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */ + if( !osHeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%lu), heap=%p", + pPrior, osGetLastError(), (void*)hHeap); + } +} + +/* +** Change the size of an existing memory allocation +*/ +static void *winMemRealloc(void *pPrior, int nBytes){ + HANDLE hHeap; + void *p; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); +#endif + assert( nBytes>=0 ); + if( !pPrior ){ + p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); + }else{ + p = osHeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes); + } + if( !p ){ + sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%lu), heap=%p", + pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, osGetLastError(), + (void*)hHeap); + } + return p; +} + +/* +** Return the size of an outstanding allocation, in bytes. +*/ +static int winMemSize(void *p){ + HANDLE hHeap; + SIZE_T n; + + winMemAssertMagic(); + hHeap = winMemGetHeap(); + assert( hHeap!=0 ); + assert( hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, p) ); +#endif + if( !p ) return 0; + n = osHeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p); + if( n==(SIZE_T)-1 ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%lu), heap=%p", + p, osGetLastError(), (void*)hHeap); + return 0; + } + return (int)n; +} + +/* +** Round up a request size to the next valid allocation size. +*/ +static int winMemRoundup(int n){ + return n; +} + +/* +** Initialize this module. +*/ +static int winMemInit(void *pAppData){ + winMemData *pWinMemData = (winMemData *)pAppData; + + if( !pWinMemData ) return SQLITE_ERROR; + assert( pWinMemData->magic1==WINMEM_MAGIC1 ); + assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + +#if !SQLITE_OS_WINRT && SQLITE_WIN32_HEAP_CREATE + if( !pWinMemData->hHeap ){ + DWORD dwInitialSize = SQLITE_WIN32_HEAP_INIT_SIZE; + DWORD dwMaximumSize = (DWORD)sqlite3GlobalConfig.nHeap; + if( dwMaximumSize==0 ){ + dwMaximumSize = SQLITE_WIN32_HEAP_MAX_SIZE; + }else if( dwInitialSize>dwMaximumSize ){ + dwInitialSize = dwMaximumSize; + } + pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS, + dwInitialSize, dwMaximumSize); + if( !pWinMemData->hHeap ){ + sqlite3_log(SQLITE_NOMEM, + "failed to HeapCreate (%lu), flags=%u, initSize=%lu, maxSize=%lu", + osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, dwInitialSize, + dwMaximumSize); + return SQLITE_NOMEM_BKPT; + } + pWinMemData->bOwned = TRUE; + assert( pWinMemData->bOwned ); + } +#else + pWinMemData->hHeap = osGetProcessHeap(); + if( !pWinMemData->hHeap ){ + sqlite3_log(SQLITE_NOMEM, + "failed to GetProcessHeap (%lu)", osGetLastError()); + return SQLITE_NOMEM_BKPT; + } + pWinMemData->bOwned = FALSE; + assert( !pWinMemData->bOwned ); +#endif + assert( pWinMemData->hHeap!=0 ); + assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + return SQLITE_OK; +} + +/* +** Deinitialize this module. +*/ +static void winMemShutdown(void *pAppData){ + winMemData *pWinMemData = (winMemData *)pAppData; + + if( !pWinMemData ) return; + assert( pWinMemData->magic1==WINMEM_MAGIC1 ); + assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + + if( pWinMemData->hHeap ){ + assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) + assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); +#endif + if( pWinMemData->bOwned ){ + if( !osHeapDestroy(pWinMemData->hHeap) ){ + sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%lu), heap=%p", + osGetLastError(), (void*)pWinMemData->hHeap); + } + pWinMemData->bOwned = FALSE; + } + pWinMemData->hHeap = NULL; + } +} + +/* +** Populate the low-level memory allocation function pointers in +** sqlite3GlobalConfig.m with pointers to the routines in this file. The +** arguments specify the block of memory to manage. +** +** This routine is only called by sqlite3_config(), and therefore +** is not required to be threadsafe (it is not). +*/ +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void){ + static const sqlite3_mem_methods winMemMethods = { + winMemMalloc, + winMemFree, + winMemRealloc, + winMemSize, + winMemRoundup, + winMemInit, + winMemShutdown, + &win_mem_data + }; + return &winMemMethods; +} + +SQLITE_PRIVATE void sqlite3MemSetDefault(void){ + sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); +} +#endif /* SQLITE_WIN32_MALLOC */ + +/* +** Convert a UTF-8 string to Microsoft Unicode. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static LPWSTR winUtf8ToUnicode(const char *zText){ + int nChar; + LPWSTR zWideText; + + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, NULL, 0); + if( nChar==0 ){ + return 0; + } + zWideText = sqlite3MallocZero( nChar*sizeof(WCHAR) ); + if( zWideText==0 ){ + return 0; + } + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText, + nChar); + if( nChar==0 ){ + sqlite3_free(zWideText); + zWideText = 0; + } + return zWideText; +} + +/* +** Convert a Microsoft Unicode string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUnicodeToUtf8(LPCWSTR zWideText){ + int nByte; + char *zText; + + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, 0, 0, 0, 0); + if( nByte == 0 ){ + return 0; + } + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ + return 0; + } + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte, + 0, 0); + if( nByte == 0 ){ + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* +** Convert an ANSI string to Microsoft Unicode, using the ANSI or OEM +** code page. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){ + int nByte; + LPWSTR zMbcsText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; + + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, NULL, + 0)*sizeof(WCHAR); + if( nByte==0 ){ + return 0; + } + zMbcsText = sqlite3MallocZero( nByte*sizeof(WCHAR) ); + if( zMbcsText==0 ){ + return 0; + } + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText, + nByte); + if( nByte==0 ){ + sqlite3_free(zMbcsText); + zMbcsText = 0; + } + return zMbcsText; +} + +/* +** Convert a Microsoft Unicode string to a multi-byte character string, +** using the ANSI or OEM code page. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){ + int nByte; + char *zText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; + + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, 0, 0, 0, 0); + if( nByte == 0 ){ + return 0; + } + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ + return 0; + } + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText, + nByte, 0, 0); + if( nByte == 0 ){ + sqlite3_free(zText); + zText = 0; + } + return zText; +} + +/* +** Convert a multi-byte character string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winMbcsToUtf8(const char *zText, int useAnsi){ + char *zTextUtf8; + LPWSTR zTmpWide; + + zTmpWide = winMbcsToUnicode(zText, useAnsi); + if( zTmpWide==0 ){ + return 0; + } + zTextUtf8 = winUnicodeToUtf8(zTmpWide); + sqlite3_free(zTmpWide); + return zTextUtf8; +} + +/* +** Convert a UTF-8 string to a multi-byte character string. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). +*/ +static char *winUtf8ToMbcs(const char *zText, int useAnsi){ + char *zTextMbcs; + LPWSTR zTmpWide; + + zTmpWide = winUtf8ToUnicode(zText); + if( zTmpWide==0 ){ + return 0; + } + zTextMbcs = winUnicodeToMbcs(zTmpWide, useAnsi); + sqlite3_free(zTmpWide); + return zTextMbcs; +} + +/* +** This is a public wrapper for the winUtf8ToUnicode() function. +*/ +SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToUnicode(zText); +} + +/* +** This is a public wrapper for the winUnicodeToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zWideText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUnicodeToUtf8(zWideText); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, useAnsi); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, useAnsi); +} + +/* +** This function is the same as sqlite3_win32_set_directory (below); however, +** it accepts a UTF-8 string. +*/ +SQLITE_API int sqlite3_win32_set_directory8( + unsigned long type, /* Identifier for directory being set or reset */ + const char *zValue /* New value for directory being set or reset */ +){ + char **ppDirectory = 0; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ + ppDirectory = &sqlite3_data_directory; + }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ + ppDirectory = &sqlite3_temp_directory; + } + assert( !ppDirectory || type==SQLITE_WIN32_DATA_DIRECTORY_TYPE + || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE + ); + assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); + if( ppDirectory ){ + char *zCopy = 0; + if( zValue && zValue[0] ){ + zCopy = sqlite3_mprintf("%s", zValue); + if ( zCopy==0 ){ + return SQLITE_NOMEM_BKPT; + } + } + sqlite3_free(*ppDirectory); + *ppDirectory = zCopy; + return SQLITE_OK; + } + return SQLITE_ERROR; +} + +/* +** This function is the same as sqlite3_win32_set_directory (below); however, +** it accepts a UTF-16 string. +*/ +SQLITE_API int sqlite3_win32_set_directory16( + unsigned long type, /* Identifier for directory being set or reset */ + const void *zValue /* New value for directory being set or reset */ +){ + int rc; + char *zUtf8 = 0; + if( zValue ){ + zUtf8 = sqlite3_win32_unicode_to_utf8(zValue); + if( zUtf8==0 ) return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_win32_set_directory8(type, zUtf8); + if( zUtf8 ) sqlite3_free(zUtf8); + return rc; +} + +/* +** This function sets the data directory or the temporary directory based on +** the provided arguments. The type argument must be 1 in order to set the +** data directory or 2 in order to set the temporary directory. The zValue +** argument is the name of the directory to use. The return value will be +** SQLITE_OK if successful. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +){ + return sqlite3_win32_set_directory16(type, zValue); +} + +/* +** The return value of winGetLastErrorMsg +** is zero if the error message fits in the buffer, or non-zero +** otherwise (if the message was truncated). +*/ +static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ + /* FormatMessage returns 0 on failure. Otherwise it + ** returns the number of TCHARs written to the output + ** buffer, excluding the terminating null char. + */ + DWORD dwLen = 0; + char *zOut = 0; + + if( osIsNT() ){ +#if SQLITE_OS_WINRT + WCHAR zTempWide[SQLITE_WIN32_MAX_ERRMSG_CHARS+1]; + dwLen = osFormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + zTempWide, + SQLITE_WIN32_MAX_ERRMSG_CHARS, + 0); +#else + LPWSTR zTempWide = NULL; + dwLen = osFormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + (LPWSTR) &zTempWide, + 0, + 0); +#endif + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + sqlite3BeginBenignMalloc(); + zOut = winUnicodeToUtf8(zTempWide); + sqlite3EndBenignMalloc(); +#if !SQLITE_OS_WINRT + /* free the system buffer allocated by FormatMessage */ + osLocalFree(zTempWide); +#endif + } + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + char *zTemp = NULL; + dwLen = osFormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + lastErrno, + 0, + (LPSTR) &zTemp, + 0, + 0); + if( dwLen > 0 ){ + /* allocate a buffer and convert to UTF8 */ + sqlite3BeginBenignMalloc(); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); + sqlite3EndBenignMalloc(); + /* free the system buffer allocated by FormatMessage */ + osLocalFree(zTemp); + } + } +#endif + if( 0 == dwLen ){ + sqlite3_snprintf(nBuf, zBuf, "OsError 0x%lx (%lu)", lastErrno, lastErrno); + }else{ + /* copy a maximum of nBuf chars to output buffer */ + sqlite3_snprintf(nBuf, zBuf, "%s", zOut); + /* free the UTF8 buffer */ + sqlite3_free(zOut); + } + return 0; +} + +/* +** +** This function - winLogErrorAtLine() - is only ever called via the macro +** winLogError(). +** +** This routine is invoked after an error occurs in an OS function. +** It logs a message using sqlite3_log() containing the current value of +** error code and, if possible, the human-readable equivalent from +** FormatMessage. +** +** The first argument passed to the macro should be the error code that +** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN). +** The two subsequent arguments should be the name of the OS function that +** failed and the associated file-system path, if any. +*/ +#define winLogError(a,b,c,d) winLogErrorAtLine(a,b,c,d,__LINE__) +static int winLogErrorAtLine( + int errcode, /* SQLite error code */ + DWORD lastErrno, /* Win32 last error */ + const char *zFunc, /* Name of OS function that failed */ + const char *zPath, /* File path associated with error */ + int iLine /* Source line number where error occurred */ +){ + char zMsg[500]; /* Human readable error text */ + int i; /* Loop counter */ + + zMsg[0] = 0; + winGetLastErrorMsg(lastErrno, sizeof(zMsg), zMsg); + assert( errcode!=SQLITE_OK ); + if( zPath==0 ) zPath = ""; + for(i=0; zMsg[i] && zMsg[i]!='\r' && zMsg[i]!='\n'; i++){} + zMsg[i] = 0; + sqlite3_log(errcode, + "os_win.c:%d: (%lu) %s(%s) - %s", + iLine, lastErrno, zFunc, zPath, zMsg + ); + + return errcode; +} + +/* +** The number of times that a ReadFile(), WriteFile(), and DeleteFile() +** will be retried following a locking error - probably caused by +** antivirus software. Also the initial delay before the first retry. +** The delay increases linearly with each retry. +*/ +#ifndef SQLITE_WIN32_IOERR_RETRY +# define SQLITE_WIN32_IOERR_RETRY 10 +#endif +#ifndef SQLITE_WIN32_IOERR_RETRY_DELAY +# define SQLITE_WIN32_IOERR_RETRY_DELAY 25 +#endif +static int winIoerrRetry = SQLITE_WIN32_IOERR_RETRY; +static int winIoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY; + +/* +** The "winIoerrCanRetry1" macro is used to determine if a particular I/O +** error code obtained via GetLastError() is eligible to be retried. It +** must accept the error code DWORD as its only argument and should return +** non-zero if the error code is transient in nature and the operation +** responsible for generating the original error might succeed upon being +** retried. The argument to this macro should be a variable. +** +** Additionally, a macro named "winIoerrCanRetry2" may be defined. If it +** is defined, it will be consulted only when the macro "winIoerrCanRetry1" +** returns zero. The "winIoerrCanRetry2" macro is completely optional and +** may be used to include additional error codes in the set that should +** result in the failing I/O operation being retried by the caller. If +** defined, the "winIoerrCanRetry2" macro must exhibit external semantics +** identical to those of the "winIoerrCanRetry1" macro. +*/ +#if !defined(winIoerrCanRetry1) +#define winIoerrCanRetry1(a) (((a)==ERROR_ACCESS_DENIED) || \ + ((a)==ERROR_SHARING_VIOLATION) || \ + ((a)==ERROR_LOCK_VIOLATION) || \ + ((a)==ERROR_DEV_NOT_EXIST) || \ + ((a)==ERROR_NETNAME_DELETED) || \ + ((a)==ERROR_SEM_TIMEOUT) || \ + ((a)==ERROR_NETWORK_UNREACHABLE)) +#endif + +/* +** If a ReadFile() or WriteFile() error occurs, invoke this routine +** to see if it should be retried. Return TRUE to retry. Return FALSE +** to give up with an error. +*/ +static int winRetryIoerr(int *pnRetry, DWORD *pError){ + DWORD e = osGetLastError(); + if( *pnRetry>=winIoerrRetry ){ + if( pError ){ + *pError = e; + } + return 0; + } + if( winIoerrCanRetry1(e) ){ + sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + ++*pnRetry; + return 1; + } +#if defined(winIoerrCanRetry2) + else if( winIoerrCanRetry2(e) ){ + sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + ++*pnRetry; + return 1; + } +#endif + if( pError ){ + *pError = e; + } + return 0; +} + +/* +** Log a I/O error retry episode. +*/ +static void winLogIoerr(int nRetry, int lineno){ + if( nRetry ){ + sqlite3_log(SQLITE_NOTICE, + "delayed %dms for lock/sharing conflict at line %d", + winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno + ); + } +} + +/* +** This #if does not rely on the SQLITE_OS_WINCE define because the +** corresponding section in "date.c" cannot use it. +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So define a substitute. +*/ +/* # include */ +struct tm *__cdecl localtime(const time_t *t) +{ + static struct tm y; + FILETIME uTm, lTm; + SYSTEMTIME pTm; + sqlite3_int64 t64; + t64 = *t; + t64 = (t64 + 11644473600)*10000000; + uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); + uTm.dwHighDateTime= (DWORD)(t64 >> 32); + osFileTimeToLocalFileTime(&uTm,&lTm); + osFileTimeToSystemTime(&lTm,&pTm); + y.tm_year = pTm.wYear - 1900; + y.tm_mon = pTm.wMonth - 1; + y.tm_wday = pTm.wDayOfWeek; + y.tm_mday = pTm.wDay; + y.tm_hour = pTm.wHour; + y.tm_min = pTm.wMinute; + y.tm_sec = pTm.wSecond; + return &y; +} +#endif + +#if SQLITE_OS_WINCE +/************************************************************************* +** This section contains code for WinCE only. +*/ +#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] + +/* +** Acquire a lock on the handle h +*/ +static void winceMutexAcquire(HANDLE h){ + DWORD dwErr; + do { + dwErr = osWaitForSingleObject(h, INFINITE); + } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); +} +/* +** Release a lock acquired by winceMutexAcquire() +*/ +#define winceMutexRelease(h) ReleaseMutex(h) + +/* +** Create the mutex and shared memory used for locking in the file +** descriptor pFile +*/ +static int winceCreateLock(const char *zFilename, winFile *pFile){ + LPWSTR zTok; + LPWSTR zName; + DWORD lastErrno; + BOOL bLogged = FALSE; + BOOL bInit = TRUE; + + zName = winUtf8ToUnicode(zFilename); + if( zName==0 ){ + /* out of memory */ + return SQLITE_IOERR_NOMEM_BKPT; + } + + /* Initialize the local lockdata */ + memset(&pFile->local, 0, sizeof(pFile->local)); + + /* Replace the backslashes from the filename and lowercase it + ** to derive a mutex name. */ + zTok = osCharLowerW(zName); + for (;*zTok;zTok++){ + if (*zTok == '\\') *zTok = '_'; + } + + /* Create/open the named mutex */ + pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); + if (!pFile->hMutex){ + pFile->lastErrno = osGetLastError(); + sqlite3_free(zName); + return winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock1", zFilename); + } + + /* Acquire the mutex before continuing */ + winceMutexAcquire(pFile->hMutex); + + /* Since the names of named mutexes, semaphores, file mappings etc are + ** case-sensitive, take advantage of that by uppercasing the mutex name + ** and using that as the shared filemapping name. + */ + osCharUpperW(zName); + pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, sizeof(winceLock), + zName); + + /* Set a flag that indicates we're the first to create the memory so it + ** must be zero-initialized */ + lastErrno = osGetLastError(); + if (lastErrno == ERROR_ALREADY_EXISTS){ + bInit = FALSE; + } + + sqlite3_free(zName); + + /* If we succeeded in making the shared memory handle, map it. */ + if( pFile->hShared ){ + pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared, + FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); + /* If mapping failed, close the shared memory handle and erase it */ + if( !pFile->shared ){ + pFile->lastErrno = osGetLastError(); + winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock2", zFilename); + bLogged = TRUE; + osCloseHandle(pFile->hShared); + pFile->hShared = NULL; + } + } + + /* If shared memory could not be created, then close the mutex and fail */ + if( pFile->hShared==NULL ){ + if( !bLogged ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR, pFile->lastErrno, + "winceCreateLock3", zFilename); + bLogged = TRUE; + } + winceMutexRelease(pFile->hMutex); + osCloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + return SQLITE_IOERR; + } + + /* Initialize the shared memory if we're supposed to */ + if( bInit ){ + memset(pFile->shared, 0, sizeof(winceLock)); + } + + winceMutexRelease(pFile->hMutex); + return SQLITE_OK; +} + +/* +** Destroy the part of winFile that deals with wince locks +*/ +static void winceDestroyLock(winFile *pFile){ + if (pFile->hMutex){ + /* Acquire the mutex */ + winceMutexAcquire(pFile->hMutex); + + /* The following blocks should probably assert in debug mode, but they + are to cleanup in case any locks remained open */ + if (pFile->local.nReaders){ + pFile->shared->nReaders --; + } + if (pFile->local.bReserved){ + pFile->shared->bReserved = FALSE; + } + if (pFile->local.bPending){ + pFile->shared->bPending = FALSE; + } + if (pFile->local.bExclusive){ + pFile->shared->bExclusive = FALSE; + } + + /* De-reference and close our copy of the shared memory handle */ + osUnmapViewOfFile(pFile->shared); + osCloseHandle(pFile->hShared); + + /* Done with the mutex */ + winceMutexRelease(pFile->hMutex); + osCloseHandle(pFile->hMutex); + pFile->hMutex = NULL; + } +} + +/* +** An implementation of the LockFile() API of Windows for CE +*/ +static BOOL winceLockFile( + LPHANDLE phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToLockLow, + DWORD nNumberOfBytesToLockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + UNUSED_PARAMETER(dwFileOffsetHigh); + UNUSED_PARAMETER(nNumberOfBytesToLockHigh); + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Wanting an exclusive lock? */ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST + && nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){ + if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){ + pFile->shared->bExclusive = TRUE; + pFile->local.bExclusive = TRUE; + bReturn = TRUE; + } + } + + /* Want a read-only lock? */ + else if (dwFileOffsetLow == (DWORD)SHARED_FIRST && + nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bExclusive == 0){ + pFile->local.nReaders ++; + if (pFile->local.nReaders == 1){ + pFile->shared->nReaders ++; + } + bReturn = TRUE; + } + } + + /* Want a pending lock? */ + else if (dwFileOffsetLow == (DWORD)PENDING_BYTE + && nNumberOfBytesToLockLow == 1){ + /* If no pending lock has been acquired, then acquire it */ + if (pFile->shared->bPending == 0) { + pFile->shared->bPending = TRUE; + pFile->local.bPending = TRUE; + bReturn = TRUE; + } + } + + /* Want a reserved lock? */ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE + && nNumberOfBytesToLockLow == 1){ + if (pFile->shared->bReserved == 0) { + pFile->shared->bReserved = TRUE; + pFile->local.bReserved = TRUE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} + +/* +** An implementation of the UnlockFile API of Windows for CE +*/ +static BOOL winceUnlockFile( + LPHANDLE phFile, + DWORD dwFileOffsetLow, + DWORD dwFileOffsetHigh, + DWORD nNumberOfBytesToUnlockLow, + DWORD nNumberOfBytesToUnlockHigh +){ + winFile *pFile = HANDLE_TO_WINFILE(phFile); + BOOL bReturn = FALSE; + + UNUSED_PARAMETER(dwFileOffsetHigh); + UNUSED_PARAMETER(nNumberOfBytesToUnlockHigh); + + if (!pFile->hMutex) return TRUE; + winceMutexAcquire(pFile->hMutex); + + /* Releasing a reader lock or an exclusive lock */ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST){ + /* Did we have an exclusive lock? */ + if (pFile->local.bExclusive){ + assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE); + pFile->local.bExclusive = FALSE; + pFile->shared->bExclusive = FALSE; + bReturn = TRUE; + } + + /* Did we just have a reader lock? */ + else if (pFile->local.nReaders){ + assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE + || nNumberOfBytesToUnlockLow == 1); + pFile->local.nReaders --; + if (pFile->local.nReaders == 0) + { + pFile->shared->nReaders --; + } + bReturn = TRUE; + } + } + + /* Releasing a pending lock */ + else if (dwFileOffsetLow == (DWORD)PENDING_BYTE + && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bPending){ + pFile->local.bPending = FALSE; + pFile->shared->bPending = FALSE; + bReturn = TRUE; + } + } + /* Releasing a reserved lock */ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE + && nNumberOfBytesToUnlockLow == 1){ + if (pFile->local.bReserved) { + pFile->local.bReserved = FALSE; + pFile->shared->bReserved = FALSE; + bReturn = TRUE; + } + } + + winceMutexRelease(pFile->hMutex); + return bReturn; +} +/* +** End of the special code for wince +*****************************************************************************/ +#endif /* SQLITE_OS_WINCE */ + +/* +** Lock a file region. +*/ +static BOOL winLockFile( + LPHANDLE phFile, + DWORD flags, + DWORD offsetLow, + DWORD offsetHigh, + DWORD numBytesLow, + DWORD numBytesHigh +){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API LockFile. + */ + return winceLockFile(phFile, offsetLow, offsetHigh, + numBytesLow, numBytesHigh); +#else + if( osIsNT() ){ + OVERLAPPED ovlp; + memset(&ovlp, 0, sizeof(OVERLAPPED)); + ovlp.Offset = offsetLow; + ovlp.OffsetHigh = offsetHigh; + return osLockFileEx(*phFile, flags, 0, numBytesLow, numBytesHigh, &ovlp); + }else{ + return osLockFile(*phFile, offsetLow, offsetHigh, numBytesLow, + numBytesHigh); + } +#endif +} + +/* +** Unlock a file region. + */ +static BOOL winUnlockFile( + LPHANDLE phFile, + DWORD offsetLow, + DWORD offsetHigh, + DWORD numBytesLow, + DWORD numBytesHigh +){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API UnlockFile. + */ + return winceUnlockFile(phFile, offsetLow, offsetHigh, + numBytesLow, numBytesHigh); +#else + if( osIsNT() ){ + OVERLAPPED ovlp; + memset(&ovlp, 0, sizeof(OVERLAPPED)); + ovlp.Offset = offsetLow; + ovlp.OffsetHigh = offsetHigh; + return osUnlockFileEx(*phFile, 0, numBytesLow, numBytesHigh, &ovlp); + }else{ + return osUnlockFile(*phFile, offsetLow, offsetHigh, numBytesLow, + numBytesHigh); + } +#endif +} + +/***************************************************************************** +** The next group of routines implement the I/O methods specified +** by the sqlite3_io_methods object. +******************************************************************************/ + +/* +** Some Microsoft compilers lack this definition. +*/ +#ifndef INVALID_SET_FILE_POINTER +# define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + +/* +** Move the current position of the file handle passed as the first +** argument to offset iOffset within the file. If successful, return 0. +** Otherwise, set pFile->lastErrno and return non-zero. +*/ +static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){ +#if !SQLITE_OS_WINRT + LONG upperBits; /* Most sig. 32 bits of new offset */ + LONG lowerBits; /* Least sig. 32 bits of new offset */ + DWORD dwRet; /* Value returned by SetFilePointer() */ + DWORD lastErrno; /* Value returned by GetLastError() */ + + OSTRACE(("SEEK file=%p, offset=%lld\n", pFile->h, iOffset)); + + upperBits = (LONG)((iOffset>>32) & 0x7fffffff); + lowerBits = (LONG)(iOffset & 0xffffffff); + + /* API oddity: If successful, SetFilePointer() returns a dword + ** containing the lower 32-bits of the new file-offset. Or, if it fails, + ** it returns INVALID_SET_FILE_POINTER. However according to MSDN, + ** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine + ** whether an error has actually occurred, it is also necessary to call + ** GetLastError(). + */ + dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); + + if( (dwRet==INVALID_SET_FILE_POINTER + && ((lastErrno = osGetLastError())!=NO_ERROR)) ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, + "winSeekFile", pFile->zPath); + OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); + return 1; + } + + OSTRACE(("SEEK file=%p, rc=SQLITE_OK\n", pFile->h)); + return 0; +#else + /* + ** Same as above, except that this implementation works for WinRT. + */ + + LARGE_INTEGER x; /* The new offset */ + BOOL bRet; /* Value returned by SetFilePointerEx() */ + + x.QuadPart = iOffset; + bRet = osSetFilePointerEx(pFile->h, x, 0, FILE_BEGIN); + + if(!bRet){ + pFile->lastErrno = osGetLastError(); + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, + "winSeekFile", pFile->zPath); + OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); + return 1; + } + + OSTRACE(("SEEK file=%p, rc=SQLITE_OK\n", pFile->h)); + return 0; +#endif +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* Forward references to VFS helper methods used for memory mapped files */ +static int winMapfile(winFile*, sqlite3_int64); +static int winUnmapfile(winFile*); +#endif + +/* +** Close a file. +** +** It is reported that an attempt to close a handle might sometimes +** fail. This is a very unreasonable result, but Windows is notorious +** for being unreasonable so I do not doubt that it might happen. If +** the close fails, we pause for 100 milliseconds and try again. As +** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before +** giving up and returning an error. +*/ +#define MX_CLOSE_ATTEMPT 3 +static int winClose(sqlite3_file *id){ + int rc, cnt = 0; + winFile *pFile = (winFile*)id; + + assert( id!=0 ); +#ifndef SQLITE_OMIT_WAL + assert( pFile->pShm==0 ); +#endif + assert( pFile->h!=NULL && pFile->h!=INVALID_HANDLE_VALUE ); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p\n", + osGetCurrentProcessId(), pFile, pFile->h)); + +#if SQLITE_MAX_MMAP_SIZE>0 + winUnmapfile(pFile); +#endif + + do{ + rc = osCloseHandle(pFile->h); + /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ + }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); +#if SQLITE_OS_WINCE +#define WINCE_DELETION_ATTEMPTS 3 + { + winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData; + if( pAppData==NULL || !pAppData->bNoLock ){ + winceDestroyLock(pFile); + } + } + if( pFile->zDeleteOnClose ){ + int cnt = 0; + while( + osDeleteFileW(pFile->zDeleteOnClose)==0 + && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff + && cnt++ < WINCE_DELETION_ATTEMPTS + ){ + sqlite3_win32_sleep(100); /* Wait a little before trying again */ + } + sqlite3_free(pFile->zDeleteOnClose); + } +#endif + if( rc ){ + pFile->h = NULL; + } + OpenCounter(-1); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, rc ? "ok" : "failed")); + return rc ? SQLITE_OK + : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(), + "winClose", pFile->zPath); +} + +/* +** Read data from a file into a buffer. Return SQLITE_OK if all +** bytes were read successfully and SQLITE_IOERR if anything goes +** wrong. +*/ +static int winRead( + sqlite3_file *id, /* File to read from */ + void *pBuf, /* Write content into this buffer */ + int amt, /* Number of bytes to read */ + sqlite3_int64 offset /* Begin reading at this offset */ +){ +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + OVERLAPPED overlapped; /* The offset for ReadFile. */ +#endif + winFile *pFile = (winFile*)id; /* file handle */ + DWORD nRead; /* Number of bytes actually read from file */ + int nRetry = 0; /* Number of retrys */ + + assert( id!=0 ); + assert( amt>0 ); + assert( offset>=0 ); + SimulateIOError(return SQLITE_IOERR_READ); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, + pFile->h, pBuf, amt, offset, pFile->locktype)); + +#if SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this read request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); + OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + int nCopy = (int)(pFile->mmapSize - offset); + memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + if( winSeekFile(pFile, offset) ){ + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_FULL; + } + while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ +#else + memset(&overlapped, 0, sizeof(OVERLAPPED)); + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); + while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) && + osGetLastError()!=ERROR_HANDLE_EOF ){ +#endif + DWORD lastErrno; + if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + pFile->lastErrno = lastErrno; + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_READ, pFile->lastErrno, + "winRead", pFile->zPath); + } + winLogIoerr(nRetry, __LINE__); + if( nRead<(DWORD)amt ){ + /* Unread parts of the buffer must be zero-filled */ + memset(&((char*)pBuf)[nRead], 0, amt-nRead); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_SHORT_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_IOERR_SHORT_READ; + } + + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +} + +/* +** Write data from a buffer into a file. Return SQLITE_OK on success +** or some other error code on failure. +*/ +static int winWrite( + sqlite3_file *id, /* File to write into */ + const void *pBuf, /* The bytes to be written */ + int amt, /* Number of bytes to write */ + sqlite3_int64 offset /* Offset into the file to begin writing at */ +){ + int rc = 0; /* True if error has occurred, else false */ + winFile *pFile = (winFile*)id; /* File handle */ + int nRetry = 0; /* Number of retries */ + + assert( amt>0 ); + assert( pFile ); + SimulateIOError(return SQLITE_IOERR_WRITE); + SimulateDiskfullError(return SQLITE_FULL); + + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, + pFile->h, pBuf, amt, offset, pFile->locktype)); + +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 + /* Deal with as much of this write request as possible by transfering + ** data from the memory mapping using memcpy(). */ + if( offsetmmapSize ){ + if( offset+amt <= pFile->mmapSize ){ + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); + OSTRACE(("WRITE-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + int nCopy = (int)(pFile->mmapSize - offset); + memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8 *)pBuf)[nCopy]; + amt -= nCopy; + offset += nCopy; + } + } +#endif + +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + rc = winSeekFile(pFile, offset); + if( rc==0 ){ +#else + { +#endif +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + OVERLAPPED overlapped; /* The offset for WriteFile. */ +#endif + u8 *aRem = (u8 *)pBuf; /* Data yet to be written */ + int nRem = amt; /* Number of bytes yet to be written */ + DWORD nWrite; /* Bytes written by each WriteFile() call */ + DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */ + +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + memset(&overlapped, 0, sizeof(OVERLAPPED)); + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); +#endif + + while( nRem>0 ){ +#if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) + if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ +#else + if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){ +#endif + if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + break; + } + assert( nWrite==0 || nWrite<=(DWORD)nRem ); + if( nWrite==0 || nWrite>(DWORD)nRem ){ + lastErrno = osGetLastError(); + break; + } +#if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) + offset += nWrite; + overlapped.Offset = (LONG)(offset & 0xffffffff); + overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff); +#endif + aRem += nWrite; + nRem -= nWrite; + } + if( nRem>0 ){ + pFile->lastErrno = lastErrno; + rc = 1; + } + } + + if( rc ){ + if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ) + || ( pFile->lastErrno==ERROR_DISK_FULL )){ + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_FULL, pFile->lastErrno, + "winWrite1", pFile->zPath); + } + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_WRITE\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno, + "winWrite2", pFile->zPath); + }else{ + winLogIoerr(nRetry, __LINE__); + } + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +} + +/* +** Truncate an open file to a specified size +*/ +static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ + winFile *pFile = (winFile*)id; /* File handle object */ + int rc = SQLITE_OK; /* Return code for this function */ + DWORD lastErrno; +#if SQLITE_MAX_MMAP_SIZE>0 + sqlite3_int64 oldMmapSize; + if( pFile->nFetchOut>0 ){ + /* File truncation is a no-op if there are outstanding memory mapped + ** pages. This is because truncating the file means temporarily unmapping + ** the file, and that might delete memory out from under existing cursors. + ** + ** This can result in incremental vacuum not truncating the file, + ** if there is an active read cursor when the incremental vacuum occurs. + ** No real harm comes of this - the database file is not corrupted, + ** though some folks might complain that the file is bigger than it + ** needs to be. + ** + ** The only feasible work-around is to defer the truncation until after + ** all references to memory-mapped content are closed. That is doable, + ** but involves adding a few branches in the common write code path which + ** could slow down normal operations slightly. Hence, we have decided for + ** now to simply make trancations a no-op if there are pending reads. We + ** can maybe revisit this decision in the future. + */ + return SQLITE_OK; + } +#endif + + assert( pFile ); + SimulateIOError(return SQLITE_IOERR_TRUNCATE); + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, size=%lld, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, nByte, pFile->locktype)); + + /* If the user has configured a chunk-size for this file, truncate the + ** file so that it consists of an integer number of chunks (i.e. the + ** actual file size after the operation may be larger than the requested + ** size). + */ + if( pFile->szChunk>0 ){ + nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->pMapRegion ){ + oldMmapSize = pFile->mmapSize; + }else{ + oldMmapSize = 0; + } + winUnmapfile(pFile); +#endif + + /* SetEndOfFile() returns non-zero when successful, or zero when it fails. */ + if( winSeekFile(pFile, nByte) ){ + rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, + "winTruncate1", pFile->zPath); + }else if( 0==osSetEndOfFile(pFile->h) && + ((lastErrno = osGetLastError())!=ERROR_USER_MAPPED_FILE) ){ + pFile->lastErrno = lastErrno; + rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, + "winTruncate2", pFile->zPath); + } + +#if SQLITE_MAX_MMAP_SIZE>0 + if( rc==SQLITE_OK && oldMmapSize>0 ){ + if( oldMmapSize>nByte ){ + winMapfile(pFile, -1); + }else{ + winMapfile(pFile, oldMmapSize); + } + } +#endif + + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc))); + return rc; +} + +#ifdef SQLITE_TEST +/* +** Count the number of fullsyncs and normal syncs. This is used to test +** that syncs and fullsyncs are occuring at the right times. +*/ +SQLITE_API int sqlite3_sync_count = 0; +SQLITE_API int sqlite3_fullsync_count = 0; +#endif + +/* +** Make sure all writes to a particular file are committed to disk. +*/ +static int winSync(sqlite3_file *id, int flags){ +#ifndef SQLITE_NO_SYNC + /* + ** Used only when SQLITE_NO_SYNC is not defined. + */ + BOOL rc; +#endif +#if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \ + defined(SQLITE_HAVE_OS_TRACE) + /* + ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or + ** OSTRACE() macros. + */ + winFile *pFile = (winFile*)id; +#else + UNUSED_PARAMETER(id); +#endif + + assert( pFile ); + /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ + assert((flags&0x0F)==SQLITE_SYNC_NORMAL + || (flags&0x0F)==SQLITE_SYNC_FULL + ); + + /* Unix cannot, but some systems may return SQLITE_FULL from here. This + ** line is to test that doing so does not cause any problems. + */ + SimulateDiskfullError( return SQLITE_FULL ); + + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, flags=%x, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, flags, + pFile->locktype)); + +#ifndef SQLITE_TEST + UNUSED_PARAMETER(flags); +#else + if( (flags&0x0F)==SQLITE_SYNC_FULL ){ + sqlite3_fullsync_count++; + } + sqlite3_sync_count++; +#endif + + /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a + ** no-op + */ +#ifdef SQLITE_NO_SYNC + OSTRACE(("SYNC-NOP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; +#else +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->pMapRegion ){ + if( osFlushViewOfFile(pFile->pMapRegion, 0) ){ + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_OK\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winSync1", pFile->zPath); + } + } +#endif + rc = osFlushFileBuffers(pFile->h); + SimulateIOError( rc=FALSE ); + if( rc ){ + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return SQLITE_OK; + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_FSYNC\n", + osGetCurrentProcessId(), pFile, pFile->h)); + return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno, + "winSync2", pFile->zPath); + } +#endif +} + +/* +** Determine the current size of a file in bytes +*/ +static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + + assert( id!=0 ); + assert( pSize!=0 ); + SimulateIOError(return SQLITE_IOERR_FSTAT); + OSTRACE(("SIZE file=%p, pSize=%p\n", pFile->h, pSize)); + +#if SQLITE_OS_WINRT + { + FILE_STANDARD_INFO info; + if( osGetFileInformationByHandleEx(pFile->h, FileStandardInfo, + &info, sizeof(info)) ){ + *pSize = info.EndOfFile.QuadPart; + }else{ + pFile->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, + "winFileSize", pFile->zPath); + } + } +#else + { + DWORD upperBits; + DWORD lowerBits; + DWORD lastErrno; + + lowerBits = osGetFileSize(pFile->h, &upperBits); + *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; + if( (lowerBits == INVALID_FILE_SIZE) + && ((lastErrno = osGetLastError())!=NO_ERROR) ){ + pFile->lastErrno = lastErrno; + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, + "winFileSize", pFile->zPath); + } + } +#endif + OSTRACE(("SIZE file=%p, pSize=%p, *pSize=%lld, rc=%s\n", + pFile->h, pSize, *pSize, sqlite3ErrName(rc))); + return rc; +} + +/* +** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. +*/ +#ifndef LOCKFILE_FAIL_IMMEDIATELY +# define LOCKFILE_FAIL_IMMEDIATELY 1 +#endif + +#ifndef LOCKFILE_EXCLUSIVE_LOCK +# define LOCKFILE_EXCLUSIVE_LOCK 2 +#endif + +/* +** Historically, SQLite has used both the LockFile and LockFileEx functions. +** When the LockFile function was used, it was always expected to fail +** immediately if the lock could not be obtained. Also, it always expected to +** obtain an exclusive lock. These flags are used with the LockFileEx function +** and reflect those expectations; therefore, they should not be changed. +*/ +#ifndef SQLITE_LOCKFILE_FLAGS +# define SQLITE_LOCKFILE_FLAGS (LOCKFILE_FAIL_IMMEDIATELY | \ + LOCKFILE_EXCLUSIVE_LOCK) +#endif + +/* +** Currently, SQLite never calls the LockFileEx function without wanting the +** call to fail immediately if the lock cannot be obtained. +*/ +#ifndef SQLITE_LOCKFILEEX_FLAGS +# define SQLITE_LOCKFILEEX_FLAGS (LOCKFILE_FAIL_IMMEDIATELY) +#endif + +/* +** Acquire a reader lock. +** Different API routines are called depending on whether or not this +** is Win9x or WinNT. +*/ +static int winGetReadLock(winFile *pFile){ + int res; + OSTRACE(("READ-LOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); + if( osIsNT() ){ +#if SQLITE_OS_WINCE + /* + ** NOTE: Windows CE is handled differently here due its lack of the Win32 + ** API LockFileEx. + */ + res = winceLockFile(&pFile->h, SHARED_FIRST, 0, 1, 0); +#else + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS, SHARED_FIRST, 0, + SHARED_SIZE, 0); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + int lk; + sqlite3_randomness(sizeof(lk), &lk); + pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1)); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, + SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } +#endif + if( res == 0 ){ + pFile->lastErrno = osGetLastError(); + /* No need to log a failure to lock */ + } + OSTRACE(("READ-LOCK file=%p, result=%d\n", pFile->h, res)); + return res; +} + +/* +** Undo a readlock +*/ +static int winUnlockReadLock(winFile *pFile){ + int res; + DWORD lastErrno; + OSTRACE(("READ-UNLOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); + if( osIsNT() ){ + res = winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + res = winUnlockFile(&pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); + } +#endif + if( res==0 && ((lastErrno = osGetLastError())!=ERROR_NOT_LOCKED) ){ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno, + "winUnlockReadLock", pFile->zPath); + } + OSTRACE(("READ-UNLOCK file=%p, result=%d\n", pFile->h, res)); + return res; +} + +/* +** Lock the file with the lock specified by parameter locktype - one +** of the following: +** +** (1) SHARED_LOCK +** (2) RESERVED_LOCK +** (3) PENDING_LOCK +** (4) EXCLUSIVE_LOCK +** +** Sometimes when requesting one lock state, additional lock states +** are inserted in between. The locking might fail on one of the later +** transitions leaving the lock state different from what it started but +** still short of its goal. The following chart shows the allowed +** transitions and the inserted intermediate states: +** +** UNLOCKED -> SHARED +** SHARED -> RESERVED +** SHARED -> (PENDING) -> EXCLUSIVE +** RESERVED -> (PENDING) -> EXCLUSIVE +** PENDING -> EXCLUSIVE +** +** This routine will only increase a lock. The winUnlock() routine +** erases all locks at once and returns us immediately to locking level 0. +** It is not possible to lower the locking level one step at a time. You +** must go straight to locking level 0. +*/ +static int winLock(sqlite3_file *id, int locktype){ + int rc = SQLITE_OK; /* Return code from subroutines */ + int res = 1; /* Result of a Windows lock call */ + int newLocktype; /* Set pFile->locktype to this value before exiting */ + int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ + winFile *pFile = (winFile*)id; + DWORD lastErrno = NO_ERROR; + + assert( id!=0 ); + OSTRACE(("LOCK file=%p, oldLock=%d(%d), newLock=%d\n", + pFile->h, pFile->locktype, pFile->sharedLockByte, locktype)); + + /* If there is already a lock of this type or more restrictive on the + ** OsFile, do nothing. Don't use the end_lock: exit path, as + ** sqlite3OsEnterMutex() hasn't been called yet. + */ + if( pFile->locktype>=locktype ){ + OSTRACE(("LOCK-HELD file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + + /* Do not allow any kind of write-lock on a read-only database + */ + if( (pFile->ctrlFlags & WINFILE_RDONLY)!=0 && locktype>=RESERVED_LOCK ){ + return SQLITE_IOERR_LOCK; + } + + /* Make sure the locking sequence is correct + */ + assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); + assert( locktype!=PENDING_LOCK ); + assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); + + /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or + ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of + ** the PENDING_LOCK byte is temporary. + */ + newLocktype = pFile->locktype; + if( pFile->locktype==NO_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktype<=RESERVED_LOCK) + ){ + int cnt = 3; + while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, + PENDING_BYTE, 0, 1, 0))==0 ){ + /* Try 3 times to get the pending lock. This is needed to work + ** around problems caused by indexing and/or anti-virus software on + ** Windows systems. + ** If you are using this code as a model for alternative VFSes, do not + ** copy this retry logic. It is a hack intended for Windows only. + */ + lastErrno = osGetLastError(); + OSTRACE(("LOCK-PENDING-FAIL file=%p, count=%d, result=%d\n", + pFile->h, cnt, res)); + if( lastErrno==ERROR_INVALID_HANDLE ){ + pFile->lastErrno = lastErrno; + rc = SQLITE_IOERR_LOCK; + OSTRACE(("LOCK-FAIL file=%p, count=%d, rc=%s\n", + pFile->h, cnt, sqlite3ErrName(rc))); + return rc; + } + if( cnt ) sqlite3_win32_sleep(1); + } + gotPendingLock = res; + if( !res ){ + lastErrno = osGetLastError(); + } + } + + /* Acquire a shared lock + */ + if( locktype==SHARED_LOCK && res ){ + assert( pFile->locktype==NO_LOCK ); + res = winGetReadLock(pFile); + if( res ){ + newLocktype = SHARED_LOCK; + }else{ + lastErrno = osGetLastError(); + } + } + + /* Acquire a RESERVED lock + */ + if( locktype==RESERVED_LOCK && res ){ + assert( pFile->locktype==SHARED_LOCK ); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, RESERVED_BYTE, 0, 1, 0); + if( res ){ + newLocktype = RESERVED_LOCK; + }else{ + lastErrno = osGetLastError(); + } + } + + /* Acquire a PENDING lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + newLocktype = PENDING_LOCK; + gotPendingLock = 0; + } + + /* Acquire an EXCLUSIVE lock + */ + if( locktype==EXCLUSIVE_LOCK && res ){ + assert( pFile->locktype>=SHARED_LOCK ); + res = winUnlockReadLock(pFile); + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, SHARED_FIRST, 0, + SHARED_SIZE, 0); + if( res ){ + newLocktype = EXCLUSIVE_LOCK; + }else{ + lastErrno = osGetLastError(); + winGetReadLock(pFile); + } + } + + /* If we are holding a PENDING lock that ought to be released, then + ** release it now. + */ + if( gotPendingLock && locktype==SHARED_LOCK ){ + winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); + } + + /* Update the state of the lock has held in the file descriptor then + ** return the appropriate result code. + */ + if( res ){ + rc = SQLITE_OK; + }else{ + pFile->lastErrno = lastErrno; + rc = SQLITE_BUSY; + OSTRACE(("LOCK-FAIL file=%p, wanted=%d, got=%d\n", + pFile->h, locktype, newLocktype)); + } + pFile->locktype = (u8)newLocktype; + OSTRACE(("LOCK file=%p, lock=%d, rc=%s\n", + pFile->h, pFile->locktype, sqlite3ErrName(rc))); + return rc; +} + +/* +** This routine checks if there is a RESERVED lock held on the specified +** file by this or any other process. If such a lock is held, return +** non-zero, otherwise zero. +*/ +static int winCheckReservedLock(sqlite3_file *id, int *pResOut){ + int res; + winFile *pFile = (winFile*)id; + + SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p\n", pFile->h, pResOut)); + + assert( id!=0 ); + if( pFile->locktype>=RESERVED_LOCK ){ + res = 1; + OSTRACE(("TEST-WR-LOCK file=%p, result=%d (local)\n", pFile->h, res)); + }else{ + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE,0,1,0); + if( res ){ + winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); + } + res = !res; + OSTRACE(("TEST-WR-LOCK file=%p, result=%d (remote)\n", pFile->h, res)); + } + *pResOut = res; + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + pFile->h, pResOut, *pResOut)); + return SQLITE_OK; +} + +/* +** Lower the locking level on file descriptor id to locktype. locktype +** must be either NO_LOCK or SHARED_LOCK. +** +** If the locking level of the file descriptor is already at or below +** the requested locking level, this routine is a no-op. +** +** It is not possible for this routine to fail if the second argument +** is NO_LOCK. If the second argument is SHARED_LOCK then this routine +** might return SQLITE_IOERR; +*/ +static int winUnlock(sqlite3_file *id, int locktype){ + int type; + winFile *pFile = (winFile*)id; + int rc = SQLITE_OK; + assert( pFile!=0 ); + assert( locktype<=SHARED_LOCK ); + OSTRACE(("UNLOCK file=%p, oldLock=%d(%d), newLock=%d\n", + pFile->h, pFile->locktype, pFile->sharedLockByte, locktype)); + type = pFile->locktype; + if( type>=EXCLUSIVE_LOCK ){ + winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); + if( locktype==SHARED_LOCK && !winGetReadLock(pFile) ){ + /* This should never happen. We should always be able to + ** reacquire the read lock */ + rc = winLogError(SQLITE_IOERR_UNLOCK, osGetLastError(), + "winUnlock", pFile->zPath); + } + } + if( type>=RESERVED_LOCK ){ + winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); + } + if( locktype==NO_LOCK && type>=SHARED_LOCK ){ + winUnlockReadLock(pFile); + } + if( type>=PENDING_LOCK ){ + winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); + } + pFile->locktype = (u8)locktype; + OSTRACE(("UNLOCK file=%p, lock=%d, rc=%s\n", + pFile->h, pFile->locktype, sqlite3ErrName(rc))); + return rc; +} + +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int winNolockLock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(pResOut); + return SQLITE_OK; +} + +static int winNolockUnlock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + +/* +** If *pArg is initially negative then this is a query. Set *pArg to +** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. +** +** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. +*/ +static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){ + if( *pArg<0 ){ + *pArg = (pFile->ctrlFlags & mask)!=0; + }else if( (*pArg)==0 ){ + pFile->ctrlFlags &= ~mask; + }else{ + pFile->ctrlFlags |= mask; + } +} + +/* Forward references to VFS helper methods used for temporary files */ +static int winGetTempname(sqlite3_vfs *, char **); +static int winIsDir(const void *); +static BOOL winIsLongPathPrefix(const char *); +static BOOL winIsDriveLetterAndColon(const char *); + +/* +** Control and query of the open file handle. +*/ +static int winFileControl(sqlite3_file *id, int op, void *pArg){ + winFile *pFile = (winFile*)id; + OSTRACE(("FCNTL file=%p, op=%d, pArg=%p\n", pFile->h, op, pArg)); + switch( op ){ + case SQLITE_FCNTL_LOCKSTATE: { + *(int*)pArg = pFile->locktype; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_LAST_ERRNO: { + *(int*)pArg = (int)pFile->lastErrno; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_CHUNK_SIZE: { + pFile->szChunk = *(int *)pArg; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_SIZE_HINT: { + if( pFile->szChunk>0 ){ + sqlite3_int64 oldSz; + int rc = winFileSize(id, &oldSz); + if( rc==SQLITE_OK ){ + sqlite3_int64 newSz = *(sqlite3_int64*)pArg; + if( newSz>oldSz ){ + SimulateIOErrorBenign(1); + rc = winTruncate(id, newSz); + SimulateIOErrorBenign(0); + } + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_PERSIST_WAL: { + winModeBit(pFile, WINFILE_PERSIST_WAL, (int*)pArg); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + winModeBit(pFile, WINFILE_PSOW, (int*)pArg); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_VFSNAME: { + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_WIN32_AV_RETRY: { + int *a = (int*)pArg; + if( a[0]>0 ){ + winIoerrRetry = a[0]; + }else{ + a[0] = winIoerrRetry; + } + if( a[1]>0 ){ + winIoerrRetryDelay = a[1]; + }else{ + a[1] = winIoerrRetryDelay; + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } + case SQLITE_FCNTL_WIN32_GET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + *phFile = pFile->h; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } +#ifdef SQLITE_TEST + case SQLITE_FCNTL_WIN32_SET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + HANDLE hOldFile = pFile->h; + pFile->h = *phFile; + *phFile = hOldFile; + OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n", + hOldFile, pFile->h)); + return SQLITE_OK; + } +#endif + case SQLITE_FCNTL_TEMPFILENAME: { + char *zTFile = 0; + int rc = winGetTempname(pFile->pVfs, &zTFile); + if( rc==SQLITE_OK ){ + *(char**)pArg = zTFile; + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } +#if SQLITE_MAX_MMAP_SIZE>0 + case SQLITE_FCNTL_MMAP_SIZE: { + i64 newLimit = *(i64*)pArg; + int rc = SQLITE_OK; + if( newLimit>sqlite3GlobalConfig.mxMmap ){ + newLimit = sqlite3GlobalConfig.mxMmap; + } + + /* The value of newLimit may be eventually cast to (SIZE_T) and passed + ** to MapViewOfFile(). Restrict its value to 2GB if (SIZE_T) is not at + ** least a 64-bit type. */ + if( newLimit>0 && sizeof(SIZE_T)<8 ){ + newLimit = (newLimit & 0x7FFFFFFF); + } + + *(i64*)pArg = pFile->mmapSizeMax; + if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + pFile->mmapSizeMax = newLimit; + if( pFile->mmapSize>0 ){ + winUnmapfile(pFile); + rc = winMapfile(pFile, -1); + } + } + OSTRACE(("FCNTL file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + return rc; + } +#endif + } + OSTRACE(("FCNTL file=%p, rc=SQLITE_NOTFOUND\n", pFile->h)); + return SQLITE_NOTFOUND; +} + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +static int winSectorSize(sqlite3_file *id){ + (void)id; + return SQLITE_DEFAULT_SECTOR_SIZE; +} + +/* +** Return a vector of device characteristics. +*/ +static int winDeviceCharacteristics(sqlite3_file *id){ + winFile *p = (winFile*)id; + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); +} + +/* +** Windows will only let you create file view mappings +** on allocation size granularity boundaries. +** During sqlite3_os_init() we do a GetSystemInfo() +** to get the granularity size. +*/ +static SYSTEM_INFO winSysInfo; + +#ifndef SQLITE_OMIT_WAL + +/* +** Helper functions to obtain and relinquish the global mutex. The +** global mutex is used to protect the winLockInfo objects used by +** this file, all of which may be shared by multiple threads. +** +** Function winShmMutexHeld() is used to assert() that the global mutex +** is held when required. This function is only used as part of assert() +** statements. e.g. +** +** winShmEnterMutex() +** assert( winShmMutexHeld() ); +** winShmLeaveMutex() +*/ +static sqlite3_mutex *winBigLock = 0; +static void winShmEnterMutex(void){ + sqlite3_mutex_enter(winBigLock); +} +static void winShmLeaveMutex(void){ + sqlite3_mutex_leave(winBigLock); +} +#ifndef NDEBUG +static int winShmMutexHeld(void) { + return sqlite3_mutex_held(winBigLock); +} +#endif + +/* +** Object used to represent a single file opened and mmapped to provide +** shared memory. When multiple threads all reference the same +** log-summary, each thread has its own winFile object, but they all +** point to a single instance of this object. In other words, each +** log-summary is opened only once per process. +** +** winShmMutexHeld() must be true when creating or destroying +** this object or while reading or writing the following fields: +** +** nRef +** pNext +** +** The following fields are read-only after the object is created: +** +** fid +** zFilename +** +** Either winShmNode.mutex must be held or winShmNode.nRef==0 and +** winShmMutexHeld() is true when reading or writing any other field +** in this structure. +** +*/ +struct winShmNode { + sqlite3_mutex *mutex; /* Mutex to access this object */ + char *zFilename; /* Name of the file */ + winFile hFile; /* File handle from winOpen */ + + int szRegion; /* Size of shared-memory regions */ + int nRegion; /* Size of array apRegion */ + u8 isReadonly; /* True if read-only */ + u8 isUnlocked; /* True if no DMS lock held */ + + struct ShmRegion { + HANDLE hMap; /* File handle from CreateFileMapping */ + void *pMap; + } *aRegion; + DWORD lastErrno; /* The Windows errno from the last I/O error */ + + int nRef; /* Number of winShm objects pointing to this */ + winShm *pFirst; /* All winShm objects pointing to this */ + winShmNode *pNext; /* Next in list of all winShmNode objects */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + u8 nextShmId; /* Next available winShm.id value */ +#endif +}; + +/* +** A global array of all winShmNode objects. +** +** The winShmMutexHeld() must be true while reading or writing this list. +*/ +static winShmNode *winShmNodeList = 0; + +/* +** Structure used internally by this VFS to record the state of an +** open shared memory connection. +** +** The following fields are initialized when this object is created and +** are read-only thereafter: +** +** winShm.pShmNode +** winShm.id +** +** All other fields are read/write. The winShm.pShmNode->mutex must be held +** while accessing any read/write fields. +*/ +struct winShm { + winShmNode *pShmNode; /* The underlying winShmNode object */ + winShm *pNext; /* Next winShm with the same winShmNode */ + u8 hasMutex; /* True if holding the winShmNode mutex */ + u16 sharedMask; /* Mask of shared locks held */ + u16 exclMask; /* Mask of exclusive locks held */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + u8 id; /* Id of this connection with its winShmNode */ +#endif +}; + +/* +** Constants used for locking +*/ +#define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ +#define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ + +/* +** Apply advisory locks for all n bytes beginning at ofst. +*/ +#define WINSHM_UNLCK 1 +#define WINSHM_RDLCK 2 +#define WINSHM_WRLCK 3 +static int winShmSystemLock( + winShmNode *pFile, /* Apply locks to this open shared-memory segment */ + int lockType, /* WINSHM_UNLCK, WINSHM_RDLCK, or WINSHM_WRLCK */ + int ofst, /* Offset to first byte to be locked/unlocked */ + int nByte /* Number of bytes to lock or unlock */ +){ + int rc = 0; /* Result code form Lock/UnlockFileEx() */ + + /* Access to the winShmNode object is serialized by the caller */ + assert( pFile->nRef==0 || sqlite3_mutex_held(pFile->mutex) ); + + OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n", + pFile->hFile.h, lockType, ofst, nByte)); + + /* Release/Acquire the system-level lock */ + if( lockType==WINSHM_UNLCK ){ + rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0); + }else{ + /* Initialize the locking parameters */ + DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY; + if( lockType == WINSHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; + rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0); + } + + if( rc!= 0 ){ + rc = SQLITE_OK; + }else{ + pFile->lastErrno = osGetLastError(); + rc = SQLITE_BUSY; + } + + OSTRACE(("SHM-LOCK file=%p, func=%s, errno=%lu, rc=%s\n", + pFile->hFile.h, (lockType == WINSHM_UNLCK) ? "winUnlockFile" : + "winLockFile", pFile->lastErrno, sqlite3ErrName(rc))); + + return rc; +} + +/* Forward references to VFS methods */ +static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*); +static int winDelete(sqlite3_vfs *,const char*,int); + +/* +** Purge the winShmNodeList list of all entries with winShmNode.nRef==0. +** +** This is not a VFS shared-memory method; it is a utility function called +** by VFS shared-memory methods. +*/ +static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ + winShmNode **pp; + winShmNode *p; + assert( winShmMutexHeld() ); + OSTRACE(("SHM-PURGE pid=%lu, deleteFlag=%d\n", + osGetCurrentProcessId(), deleteFlag)); + pp = &winShmNodeList; + while( (p = *pp)!=0 ){ + if( p->nRef==0 ){ + int i; + if( p->mutex ){ sqlite3_mutex_free(p->mutex); } + for(i=0; inRegion; i++){ + BOOL bRc = osUnmapViewOfFile(p->aRegion[i].pMap); + OSTRACE(("SHM-PURGE-UNMAP pid=%lu, region=%d, rc=%s\n", + osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + UNUSED_VARIABLE_VALUE(bRc); + bRc = osCloseHandle(p->aRegion[i].hMap); + OSTRACE(("SHM-PURGE-CLOSE pid=%lu, region=%d, rc=%s\n", + osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + UNUSED_VARIABLE_VALUE(bRc); + } + if( p->hFile.h!=NULL && p->hFile.h!=INVALID_HANDLE_VALUE ){ + SimulateIOErrorBenign(1); + winClose((sqlite3_file *)&p->hFile); + SimulateIOErrorBenign(0); + } + if( deleteFlag ){ + SimulateIOErrorBenign(1); + sqlite3BeginBenignMalloc(); + winDelete(pVfs, p->zFilename, 0); + sqlite3EndBenignMalloc(); + SimulateIOErrorBenign(0); + } + *pp = p->pNext; + sqlite3_free(p->aRegion); + sqlite3_free(p); + }else{ + pp = &p->pNext; + } + } +} + +/* +** The DMS lock has not yet been taken on shm file pShmNode. Attempt to +** take it now. Return SQLITE_OK if successful, or an SQLite error +** code otherwise. +** +** If the DMS cannot be locked because this is a readonly_shm=1 +** connection and no other process already holds a lock, return +** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. +*/ +static int winLockSharedMemory(winShmNode *pShmNode){ + int rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1); + + if( rc==SQLITE_OK ){ + if( pShmNode->isReadonly ){ + pShmNode->isUnlocked = 1; + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + return SQLITE_READONLY_CANTINIT; + }else if( winTruncate((sqlite3_file*)&pShmNode->hFile, 0) ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + return winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), + "winLockSharedMemory", pShmNode->zFilename); + } + } + + if( rc==SQLITE_OK ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + } + + return winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1); +} + +/* +** Open the shared-memory area associated with database file pDbFd. +** +** When opening a new shared-memory file, if no other instances of that +** file are currently open, in this process or in other processes, then +** the file must be truncated to zero length or have its header cleared. +*/ +static int winOpenSharedMemory(winFile *pDbFd){ + struct winShm *p; /* The connection to be opened */ + winShmNode *pShmNode = 0; /* The underlying mmapped file */ + int rc = SQLITE_OK; /* Result code */ + winShmNode *pNew; /* Newly allocated winShmNode */ + int nName; /* Size of zName in bytes */ + + assert( pDbFd->pShm==0 ); /* Not previously opened */ + + /* Allocate space for the new sqlite3_shm object. Also speculatively + ** allocate space for a new winShmNode and filename. + */ + p = sqlite3MallocZero( sizeof(*p) ); + if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT; + nName = sqlite3Strlen30(pDbFd->zPath); + pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 ); + if( pNew==0 ){ + sqlite3_free(p); + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->zFilename = (char*)&pNew[1]; + sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); + sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); + + /* Look to see if there is an existing winShmNode that can be used. + ** If no matching winShmNode currently exists, create a new one. + */ + winShmEnterMutex(); + for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){ + /* TBD need to come up with better match here. Perhaps + ** use FILE_ID_BOTH_DIR_INFO Structure. + */ + if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break; + } + if( pShmNode ){ + sqlite3_free(pNew); + }else{ + int inFlags = SQLITE_OPEN_WAL; + int outFlags = 0; + + pShmNode = pNew; + pNew = 0; + ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE; + pShmNode->pNext = winShmNodeList; + winShmNodeList = pShmNode; + + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->mutex==0 ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shm_open_err; + } + } + + if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; + }else{ + inFlags |= SQLITE_OPEN_READONLY; + } + rc = winOpen(pDbFd->pVfs, pShmNode->zFilename, + (sqlite3_file*)&pShmNode->hFile, + inFlags, &outFlags); + if( rc!=SQLITE_OK ){ + rc = winLogError(rc, osGetLastError(), "winOpenShm", + pShmNode->zFilename); + goto shm_open_err; + } + if( outFlags==SQLITE_OPEN_READONLY ) pShmNode->isReadonly = 1; + + rc = winLockSharedMemory(pShmNode); + if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; + } + + /* Make the new connection a child of the winShmNode */ + p->pShmNode = pShmNode; +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) + p->id = pShmNode->nextShmId++; +#endif + pShmNode->nRef++; + pDbFd->pShm = p; + winShmLeaveMutex(); + + /* The reference count on pShmNode has already been incremented under + ** the cover of the winShmEnterMutex() mutex and the pointer from the + ** new (struct winShm) object to the pShmNode has been set. All that is + ** left to do is to link the new object into the linked list starting + ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex + ** mutex. + */ + sqlite3_mutex_enter(pShmNode->mutex); + p->pNext = pShmNode->pFirst; + pShmNode->pFirst = p; + sqlite3_mutex_leave(pShmNode->mutex); + return rc; + + /* Jump here on any error */ +shm_open_err: + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ + sqlite3_free(p); + sqlite3_free(pNew); + winShmLeaveMutex(); + return rc; +} + +/* +** Close a connection to shared-memory. Delete the underlying +** storage if deleteFlag is true. +*/ +static int winShmUnmap( + sqlite3_file *fd, /* Database holding shared memory */ + int deleteFlag /* Delete after closing if true */ +){ + winFile *pDbFd; /* Database holding shared-memory */ + winShm *p; /* The connection to be closed */ + winShmNode *pShmNode; /* The underlying shared-memory file */ + winShm **pp; /* For looping over sibling connections */ + + pDbFd = (winFile*)fd; + p = pDbFd->pShm; + if( p==0 ) return SQLITE_OK; + pShmNode = p->pShmNode; + + /* Remove connection p from the set of connections associated + ** with pShmNode */ + sqlite3_mutex_enter(pShmNode->mutex); + for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} + *pp = p->pNext; + + /* Free the connection p */ + sqlite3_free(p); + pDbFd->pShm = 0; + sqlite3_mutex_leave(pShmNode->mutex); + + /* If pShmNode->nRef has reached 0, then close the underlying + ** shared-memory file, too */ + winShmEnterMutex(); + assert( pShmNode->nRef>0 ); + pShmNode->nRef--; + if( pShmNode->nRef==0 ){ + winShmPurge(pDbFd->pVfs, deleteFlag); + } + winShmLeaveMutex(); + + return SQLITE_OK; +} + +/* +** Change the lock state for a shared-memory segment. +*/ +static int winShmLock( + sqlite3_file *fd, /* Database file holding the shared memory */ + int ofst, /* First lock to acquire or release */ + int n, /* Number of locks to acquire or release */ + int flags /* What to do with the lock */ +){ + winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */ + winShm *p = pDbFd->pShm; /* The shared memory being locked */ + winShm *pX; /* For looping over all siblings */ + winShmNode *pShmNode; + int rc = SQLITE_OK; /* Result code */ + u16 mask; /* Mask of locks to take or release */ + + if( p==0 ) return SQLITE_IOERR_SHMLOCK; + pShmNode = p->pShmNode; + if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK; + + assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); + assert( n>=1 ); + assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) + || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); + assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); + + mask = (u16)((1U<<(ofst+n)) - (1U<1 || mask==(1<mutex); + if( flags & SQLITE_SHM_UNLOCK ){ + u16 allMask = 0; /* Mask of locks held by siblings */ + + /* See if any siblings hold this same lock */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( pX==p ) continue; + assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); + allMask |= pX->sharedMask; + } + + /* Unlock the system-level locks */ + if( (mask & allMask)==0 ){ + rc = winShmSystemLock(pShmNode, WINSHM_UNLCK, ofst+WIN_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + + /* Undo the local locks */ + if( rc==SQLITE_OK ){ + p->exclMask &= ~mask; + p->sharedMask &= ~mask; + } + }else if( flags & SQLITE_SHM_SHARED ){ + u16 allShared = 0; /* Union of locks held by connections other than "p" */ + + /* Find out which shared locks are already held by sibling connections. + ** If any sibling already holds an exclusive lock, go ahead and return + ** SQLITE_BUSY. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + allShared |= pX->sharedMask; + } + + /* Get shared locks at the system level, if necessary */ + if( rc==SQLITE_OK ){ + if( (allShared & mask)==0 ){ + rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, ofst+WIN_SHM_BASE, n); + }else{ + rc = SQLITE_OK; + } + } + + /* Get the local shared locks */ + if( rc==SQLITE_OK ){ + p->sharedMask |= mask; + } + }else{ + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. + */ + for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ + rc = SQLITE_BUSY; + break; + } + } + + /* Get the exclusive locks at the system level. Then if successful + ** also mark the local connection as being locked. + */ + if( rc==SQLITE_OK ){ + rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, ofst+WIN_SHM_BASE, n); + if( rc==SQLITE_OK ){ + assert( (p->sharedMask & mask)==0 ); + p->exclMask |= mask; + } + } + } + sqlite3_mutex_leave(pShmNode->mutex); + OSTRACE(("SHM-LOCK pid=%lu, id=%d, sharedMask=%03x, exclMask=%03x, rc=%s\n", + osGetCurrentProcessId(), p->id, p->sharedMask, p->exclMask, + sqlite3ErrName(rc))); + return rc; +} + +/* +** Implement a memory barrier or memory fence on shared memory. +** +** All loads and stores begun before the barrier must complete before +** any load or store begun after the barrier. +*/ +static void winShmBarrier( + sqlite3_file *fd /* Database holding the shared memory */ +){ + UNUSED_PARAMETER(fd); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + winShmEnterMutex(); /* Also mutex, for redundancy */ + winShmLeaveMutex(); +} + +/* +** This function is called to obtain a pointer to region iRegion of the +** shared-memory associated with the database file fd. Shared-memory regions +** are numbered starting from zero. Each shared-memory region is szRegion +** bytes in size. +** +** If an error occurs, an error code is returned and *pp is set to NULL. +** +** Otherwise, if the isWrite parameter is 0 and the requested shared-memory +** region has not been allocated (by any client, including one running in a +** separate process), then *pp is set to NULL and SQLITE_OK returned. If +** isWrite is non-zero and the requested shared-memory region has not yet +** been allocated, it is allocated by this function. +** +** If the shared-memory region has already been allocated or is allocated by +** this call as described above, then it is mapped into this processes +** address space (if it is not already), *pp is set to point to the mapped +** memory and SQLITE_OK returned. +*/ +static int winShmMap( + sqlite3_file *fd, /* Handle open on database file */ + int iRegion, /* Region to retrieve */ + int szRegion, /* Size of regions */ + int isWrite, /* True to extend file if necessary */ + void volatile **pp /* OUT: Mapped memory */ +){ + winFile *pDbFd = (winFile*)fd; + winShm *pShm = pDbFd->pShm; + winShmNode *pShmNode; + DWORD protect = PAGE_READWRITE; + DWORD flags = FILE_MAP_WRITE | FILE_MAP_READ; + int rc = SQLITE_OK; + + if( !pShm ){ + rc = winOpenSharedMemory(pDbFd); + if( rc!=SQLITE_OK ) return rc; + pShm = pDbFd->pShm; + assert( pShm!=0 ); + } + pShmNode = pShm->pShmNode; + + sqlite3_mutex_enter(pShmNode->mutex); + if( pShmNode->isUnlocked ){ + rc = winLockSharedMemory(pShmNode); + if( rc!=SQLITE_OK ) goto shmpage_out; + pShmNode->isUnlocked = 0; + } + assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); + + if( pShmNode->nRegion<=iRegion ){ + struct ShmRegion *apNew; /* New aRegion[] array */ + int nByte = (iRegion+1)*szRegion; /* Minimum required file size */ + sqlite3_int64 sz; /* Current size of wal-index file */ + + pShmNode->szRegion = szRegion; + + /* The requested region is not mapped into this processes address space. + ** Check to see if it has been allocated (i.e. if the wal-index file is + ** large enough to contain the requested region). + */ + rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), + "winShmMap1", pDbFd->zPath); + goto shmpage_out; + } + + if( szhFile, nByte); + if( rc!=SQLITE_OK ){ + rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), + "winShmMap2", pDbFd->zPath); + goto shmpage_out; + } + } + + /* Map the requested memory region into this processes address space. */ + apNew = (struct ShmRegion *)sqlite3_realloc64( + pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) + ); + if( !apNew ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shmpage_out; + } + pShmNode->aRegion = apNew; + + if( pShmNode->isReadonly ){ + protect = PAGE_READONLY; + flags = FILE_MAP_READ; + } + + while( pShmNode->nRegion<=iRegion ){ + HANDLE hMap = NULL; /* file-mapping handle */ + void *pMap = 0; /* Mapped memory region */ + +#if SQLITE_OS_WINRT + hMap = osCreateFileMappingFromApp(pShmNode->hFile.h, + NULL, protect, nByte, NULL + ); +#elif defined(SQLITE_WIN32_HAS_WIDE) + hMap = osCreateFileMappingW(pShmNode->hFile.h, + NULL, protect, 0, nByte, NULL + ); +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA + hMap = osCreateFileMappingA(pShmNode->hFile.h, + NULL, protect, 0, nByte, NULL + ); +#endif + OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n", + osGetCurrentProcessId(), pShmNode->nRegion, nByte, + hMap ? "ok" : "failed")); + if( hMap ){ + int iOffset = pShmNode->nRegion*szRegion; + int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; +#if SQLITE_OS_WINRT + pMap = osMapViewOfFileFromApp(hMap, flags, + iOffset - iOffsetShift, szRegion + iOffsetShift + ); +#else + pMap = osMapViewOfFile(hMap, flags, + 0, iOffset - iOffsetShift, szRegion + iOffsetShift + ); +#endif + OSTRACE(("SHM-MAP-MAP pid=%lu, region=%d, offset=%d, size=%d, rc=%s\n", + osGetCurrentProcessId(), pShmNode->nRegion, iOffset, + szRegion, pMap ? "ok" : "failed")); + } + if( !pMap ){ + pShmNode->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno, + "winShmMap3", pDbFd->zPath); + if( hMap ) osCloseHandle(hMap); + goto shmpage_out; + } + + pShmNode->aRegion[pShmNode->nRegion].pMap = pMap; + pShmNode->aRegion[pShmNode->nRegion].hMap = hMap; + pShmNode->nRegion++; + } + } + +shmpage_out: + if( pShmNode->nRegion>iRegion ){ + int iOffset = iRegion*szRegion; + int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; + char *p = (char *)pShmNode->aRegion[iRegion].pMap; + *pp = (void *)&p[iOffsetShift]; + }else{ + *pp = 0; + } + if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + sqlite3_mutex_leave(pShmNode->mutex); + return rc; +} + +#else +# define winShmMap 0 +# define winShmLock 0 +# define winShmBarrier 0 +# define winShmUnmap 0 +#endif /* #ifndef SQLITE_OMIT_WAL */ + +/* +** Cleans up the mapped region of the specified file, if any. +*/ +#if SQLITE_MAX_MMAP_SIZE>0 +static int winUnmapfile(winFile *pFile){ + assert( pFile!=0 ); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, pMapRegion=%p, " + "mmapSize=%lld, mmapSizeMax=%lld\n", + osGetCurrentProcessId(), pFile, pFile->hMap, pFile->pMapRegion, + pFile->mmapSize, pFile->mmapSizeMax)); + if( pFile->pMapRegion ){ + if( !osUnmapViewOfFile(pFile->pMapRegion) ){ + pFile->lastErrno = osGetLastError(); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), pFile, + pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winUnmapfile1", pFile->zPath); + } + pFile->pMapRegion = 0; + pFile->mmapSize = 0; + } + if( pFile->hMap!=NULL ){ + if( !osCloseHandle(pFile->hMap) ){ + pFile->lastErrno = osGetLastError(); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, rc=SQLITE_IOERR_MMAP\n", + osGetCurrentProcessId(), pFile, pFile->hMap)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winUnmapfile2", pFile->zPath); + } + pFile->hMap = NULL; + } + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile)); + return SQLITE_OK; +} + +/* +** Memory map or remap the file opened by file-descriptor pFd (if the file +** is already mapped, the existing mapping is replaced by the new). Or, if +** there already exists a mapping for this file, and there are still +** outstanding xFetch() references to it, this function is a no-op. +** +** If parameter nByte is non-negative, then it is the requested size of +** the mapping to create. Otherwise, if nByte is less than zero, then the +** requested size is the size of the file on disk. The actual size of the +** created mapping is either the requested size or the value configured +** using SQLITE_FCNTL_MMAP_SIZE, whichever is smaller. +** +** SQLITE_OK is returned if no error occurs (even if the mapping is not +** recreated as a result of outstanding references) or an SQLite error +** code otherwise. +*/ +static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ + sqlite3_int64 nMap = nByte; + int rc; + + assert( nMap>=0 || pFd->nFetchOut==0 ); + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, size=%lld\n", + osGetCurrentProcessId(), pFd, nByte)); + + if( pFd->nFetchOut>0 ) return SQLITE_OK; + + if( nMap<0 ){ + rc = winFileSize((sqlite3_file*)pFd, &nMap); + if( rc ){ + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_IOERR_FSTAT\n", + osGetCurrentProcessId(), pFd)); + return SQLITE_IOERR_FSTAT; + } + } + if( nMap>pFd->mmapSizeMax ){ + nMap = pFd->mmapSizeMax; + } + nMap &= ~(sqlite3_int64)(winSysInfo.dwPageSize - 1); + + if( nMap==0 && pFd->mmapSize>0 ){ + winUnmapfile(pFd); + } + if( nMap!=pFd->mmapSize ){ + void *pNew = 0; + DWORD protect = PAGE_READONLY; + DWORD flags = FILE_MAP_READ; + + winUnmapfile(pFd); +#ifdef SQLITE_MMAP_READWRITE + if( (pFd->ctrlFlags & WINFILE_RDONLY)==0 ){ + protect = PAGE_READWRITE; + flags |= FILE_MAP_WRITE; + } +#endif +#if SQLITE_OS_WINRT + pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL); +#elif defined(SQLITE_WIN32_HAS_WIDE) + pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect, + (DWORD)((nMap>>32) & 0xffffffff), + (DWORD)(nMap & 0xffffffff), NULL); +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA + pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect, + (DWORD)((nMap>>32) & 0xffffffff), + (DWORD)(nMap & 0xffffffff), NULL); +#endif + if( pFd->hMap==NULL ){ + pFd->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, + "winMapfile1", pFd->zPath); + /* Log the error, but continue normal operation using xRead/xWrite */ + OSTRACE(("MAP-FILE-CREATE pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return SQLITE_OK; + } + assert( (nMap % winSysInfo.dwPageSize)==0 ); + assert( sizeof(SIZE_T)==sizeof(sqlite3_int64) || nMap<=0xffffffff ); +#if SQLITE_OS_WINRT + pNew = osMapViewOfFileFromApp(pFd->hMap, flags, 0, (SIZE_T)nMap); +#else + pNew = osMapViewOfFile(pFd->hMap, flags, 0, 0, (SIZE_T)nMap); +#endif + if( pNew==NULL ){ + osCloseHandle(pFd->hMap); + pFd->hMap = NULL; + pFd->lastErrno = osGetLastError(); + rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, + "winMapfile2", pFd->zPath); + /* Log the error, but continue normal operation using xRead/xWrite */ + OSTRACE(("MAP-FILE-MAP pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return SQLITE_OK; + } + pFd->pMapRegion = pNew; + pFd->mmapSize = nMap; + } + + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFd)); + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** If possible, return a pointer to a mapping of file fd starting at offset +** iOff. The mapping must be valid for at least nAmt bytes. +** +** If such a pointer can be obtained, store it in *pp and return SQLITE_OK. +** Or, if one cannot but no error occurs, set *pp to 0 and return SQLITE_OK. +** Finally, if an error does occur, return an SQLite error code. The final +** value of *pp is undefined in this case. +** +** If this function does return a pointer, the caller must eventually +** release the reference by calling winUnfetch(). +*/ +static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ +#if SQLITE_MAX_MMAP_SIZE>0 + winFile *pFd = (winFile*)fd; /* The underlying database file */ +#endif + *pp = 0; + + OSTRACE(("FETCH pid=%lu, pFile=%p, offset=%lld, amount=%d, pp=%p\n", + osGetCurrentProcessId(), fd, iOff, nAmt, pp)); + +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFd->mmapSizeMax>0 ){ + if( pFd->pMapRegion==0 ){ + int rc = winMapfile(pFd, -1); + if( rc!=SQLITE_OK ){ + OSTRACE(("FETCH pid=%lu, pFile=%p, rc=%s\n", + osGetCurrentProcessId(), pFd, sqlite3ErrName(rc))); + return rc; + } + } + if( pFd->mmapSize >= iOff+nAmt ){ + assert( pFd->pMapRegion!=0 ); + *pp = &((u8 *)pFd->pMapRegion)[iOff]; + pFd->nFetchOut++; + } + } +#endif + + OSTRACE(("FETCH pid=%lu, pFile=%p, pp=%p, *pp=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), fd, pp, *pp)); + return SQLITE_OK; +} + +/* +** If the third argument is non-NULL, then this function releases a +** reference obtained by an earlier call to winFetch(). The second +** argument passed to this function must be the same as the corresponding +** argument that was passed to the winFetch() invocation. +** +** Or, if the third argument is NULL, then this function is being called +** to inform the VFS layer that, according to POSIX, any existing mapping +** may now be invalid and should be unmapped. +*/ +static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){ +#if SQLITE_MAX_MMAP_SIZE>0 + winFile *pFd = (winFile*)fd; /* The underlying database file */ + + /* If p==0 (unmap the entire file) then there must be no outstanding + ** xFetch references. Or, if p!=0 (meaning it is an xFetch reference), + ** then there must be at least one outstanding. */ + assert( (p==0)==(pFd->nFetchOut==0) ); + + /* If p!=0, it must match the iOff value. */ + assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + + OSTRACE(("UNFETCH pid=%lu, pFile=%p, offset=%lld, p=%p\n", + osGetCurrentProcessId(), pFd, iOff, p)); + + if( p ){ + pFd->nFetchOut--; + }else{ + /* FIXME: If Windows truly always prevents truncating or deleting a + ** file while a mapping is held, then the following winUnmapfile() call + ** is unnecessary can be omitted - potentially improving + ** performance. */ + winUnmapfile(pFd); + } + + assert( pFd->nFetchOut>=0 ); +#endif + + OSTRACE(("UNFETCH pid=%lu, pFile=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), fd)); + return SQLITE_OK; +} + +/* +** Here ends the implementation of all sqlite3_file methods. +** +********************** End sqlite3_file Methods ******************************* +******************************************************************************/ + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32. +*/ +static const sqlite3_io_methods winIoMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winLock, /* xLock */ + winUnlock, /* xUnlock */ + winCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32 without performing any locking. +*/ +static const sqlite3_io_methods winIoNolockMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winNolockLock, /* xLock */ + winNolockUnlock, /* xUnlock */ + winNolockCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +static winVfsAppData winAppData = { + &winIoMethod, /* pMethod */ + 0, /* pAppData */ + 0 /* bNoLock */ +}; + +static winVfsAppData winNolockAppData = { + &winIoNolockMethod, /* pMethod */ + 0, /* pAppData */ + 1 /* bNoLock */ +}; + +/**************************************************************************** +**************************** sqlite3_vfs methods **************************** +** +** This division contains the implementation of methods on the +** sqlite3_vfs object. +*/ + +#if defined(__CYGWIN__) +/* +** Convert a filename from whatever the underlying operating system +** supports for filenames into UTF-8. Space to hold the result is +** obtained from malloc and must be freed by the calling function. +*/ +static char *winConvertToUtf8Filename(const void *zFilename){ + char *zConverted = 0; + if( osIsNT() ){ + zConverted = winUnicodeToUtf8(zFilename); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + zConverted = winMbcsToUtf8(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} +#endif + +/* +** Convert a UTF-8 filename into whatever form the underlying +** operating system wants filenames in. Space to hold the result +** is obtained from malloc and must be freed by the calling +** function. +*/ +static void *winConvertFromUtf8Filename(const char *zFilename){ + void *zConverted = 0; + if( osIsNT() ){ + zConverted = winUtf8ToUnicode(zFilename); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); + } +#endif + /* caller will handle out of memory */ + return zConverted; +} + +/* +** This function returns non-zero if the specified UTF-8 string buffer +** ends with a directory separator character or one was successfully +** added to it. +*/ +static int winMakeEndInDirSep(int nBuf, char *zBuf){ + if( zBuf ){ + int nLen = sqlite3Strlen30(zBuf); + if( nLen>0 ){ + if( winIsDirSep(zBuf[nLen-1]) ){ + return 1; + }else if( nLen+1mxPathname; nBuf = nMax + 2; + zBuf = sqlite3MallocZero( nBuf ); + if( !zBuf ){ + OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); + return SQLITE_IOERR_NOMEM_BKPT; + } + + /* Figure out the effective temporary directory. First, check if one + ** has been explicitly set by the application; otherwise, use the one + ** configured by the operating system. + */ + nDir = nMax - (nPre + 15); + assert( nDir>0 ); + if( sqlite3_temp_directory ){ + int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); + if( nDirLen>0 ){ + if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){ + nDirLen++; + } + if( nDirLen>nDir ){ + sqlite3_free(zBuf); + OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); + return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0); + } + sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory); + } + } +#if defined(__CYGWIN__) + else{ + static const char *azDirs[] = { + 0, /* getenv("SQLITE_TMPDIR") */ + 0, /* getenv("TMPDIR") */ + 0, /* getenv("TMP") */ + 0, /* getenv("TEMP") */ + 0, /* getenv("USERPROFILE") */ + "/var/tmp", + "/usr/tmp", + "/tmp", + ".", + 0 /* List terminator */ + }; + unsigned int i; + const char *zDir = 0; + + if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); + if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); + if( !azDirs[2] ) azDirs[2] = getenv("TMP"); + if( !azDirs[3] ) azDirs[3] = getenv("TEMP"); + if( !azDirs[4] ) azDirs[4] = getenv("USERPROFILE"); + for(i=0; i/etilqs_XXXXXXXXXXXXXXX\0\0" + ** + ** If not, return SQLITE_ERROR. The number 17 is used here in order to + ** account for the space used by the 15 character random suffix and the + ** two trailing NUL characters. The final directory separator character + ** has already added if it was not already present. + */ + nLen = sqlite3Strlen30(zBuf); + if( (nLen + nPre + 17) > nBuf ){ + sqlite3_free(zBuf); + OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); + return winLogError(SQLITE_ERROR, 0, "winGetTempname5", 0); + } + + sqlite3_snprintf(nBuf-16-nLen, zBuf+nLen, SQLITE_TEMP_FILE_PREFIX); + + j = sqlite3Strlen30(zBuf); + sqlite3_randomness(15, &zBuf[j]); + for(i=0; i<15; i++, j++){ + zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; + } + zBuf[j] = 0; + zBuf[j+1] = 0; + *pzBuf = zBuf; + + OSTRACE(("TEMP-FILENAME name=%s, rc=SQLITE_OK\n", zBuf)); + return SQLITE_OK; +} + +/* +** Return TRUE if the named file is really a directory. Return false if +** it is something other than a directory, or if there is any kind of memory +** allocation failure. +*/ +static int winIsDir(const void *zConverted){ + DWORD attr; + int rc = 0; + DWORD lastErrno; + + if( osIsNT() ){ + int cnt = 0; + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, + GetFileExInfoStandard, + &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} + if( !rc ){ + return 0; /* Invalid name? */ + } + attr = sAttrData.dwFileAttributes; +#if SQLITE_OS_WINCE==0 + }else{ + attr = osGetFileAttributesA((char*)zConverted); +#endif + } + return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY); +} + +/* forward reference */ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags, /* Type of test to make on this file */ + int *pResOut /* OUT: Result */ +); + +/* +** Open a file. +*/ +static int winOpen( + sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */ + const char *zName, /* Name of the file (UTF-8) */ + sqlite3_file *id, /* Write the SQLite file handle here */ + int flags, /* Open mode flags */ + int *pOutFlags /* Status return flags */ +){ + HANDLE h; + DWORD lastErrno = 0; + DWORD dwDesiredAccess; + DWORD dwShareMode; + DWORD dwCreationDisposition; + DWORD dwFlagsAndAttributes = 0; +#if SQLITE_OS_WINCE + int isTemp = 0; +#endif + winVfsAppData *pAppData; + winFile *pFile = (winFile*)id; + void *zConverted; /* Filename in OS encoding */ + const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */ + int cnt = 0; + + /* If argument zPath is a NULL pointer, this function is required to open + ** a temporary file. Use this buffer to store the file name in. + */ + char *zTmpname = 0; /* For temporary filename, if necessary. */ + + int rc = SQLITE_OK; /* Function Return Code */ +#if !defined(NDEBUG) || SQLITE_OS_WINCE + int eType = flags&0xFFFFFF00; /* Type of file to open */ +#endif + + int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); + int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); + int isCreate = (flags & SQLITE_OPEN_CREATE); + int isReadonly = (flags & SQLITE_OPEN_READONLY); + int isReadWrite = (flags & SQLITE_OPEN_READWRITE); + +#ifndef NDEBUG + int isOpenJournal = (isCreate && ( + eType==SQLITE_OPEN_SUPER_JOURNAL + || eType==SQLITE_OPEN_MAIN_JOURNAL + || eType==SQLITE_OPEN_WAL + )); +#endif + + OSTRACE(("OPEN name=%s, pFile=%p, flags=%x, pOutFlags=%p\n", + zUtf8Name, id, flags, pOutFlags)); + + /* Check the following statements are true: + ** + ** (a) Exactly one of the READWRITE and READONLY flags must be set, and + ** (b) if CREATE is set, then READWRITE must also be set, and + ** (c) if EXCLUSIVE is set, then CREATE must also be set. + ** (d) if DELETEONCLOSE is set, then CREATE must also be set. + */ + assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); + assert(isCreate==0 || isReadWrite); + assert(isExclusive==0 || isCreate); + assert(isDelete==0 || isCreate); + + /* The main DB, main journal, WAL file and super-journal are never + ** automatically deleted. Nor are they ever temporary files. */ + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_SUPER_JOURNAL ); + assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); + + /* Assert that the upper layer has set one of the "file-type" flags. */ + assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB + || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL + || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_SUPER_JOURNAL + || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL + ); + + assert( pFile!=0 ); + memset(pFile, 0, sizeof(winFile)); + pFile->h = INVALID_HANDLE_VALUE; + +#if SQLITE_OS_WINRT + if( !zUtf8Name && !sqlite3_temp_directory ){ + sqlite3_log(SQLITE_ERROR, + "sqlite3_temp_directory variable should be set for WinRT"); + } +#endif + + /* If the second argument to this function is NULL, generate a + ** temporary file name to use + */ + if( !zUtf8Name ){ + assert( isDelete && !isOpenJournal ); + rc = winGetTempname(pVfs, &zTmpname); + if( rc!=SQLITE_OK ){ + OSTRACE(("OPEN name=%s, rc=%s", zUtf8Name, sqlite3ErrName(rc))); + return rc; + } + zUtf8Name = zTmpname; + } + + /* Database filenames are double-zero terminated if they are not + ** URIs with parameters. Hence, they can always be passed into + ** sqlite3_uri_parameter(). + */ + assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) || + zUtf8Name[sqlite3Strlen30(zUtf8Name)+1]==0 ); + + /* Convert the filename to the system encoding. */ + zConverted = winConvertFromUtf8Filename(zUtf8Name); + if( zConverted==0 ){ + sqlite3_free(zTmpname); + OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name)); + return SQLITE_IOERR_NOMEM_BKPT; + } + + if( winIsDir(zConverted) ){ + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN name=%s, rc=SQLITE_CANTOPEN_ISDIR", zUtf8Name)); + return SQLITE_CANTOPEN_ISDIR; + } + + if( isReadWrite ){ + dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; + }else{ + dwDesiredAccess = GENERIC_READ; + } + + /* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is + ** created. SQLite doesn't use it to indicate "exclusive access" + ** as it is usually understood. + */ + if( isExclusive ){ + /* Creates a new file, only if it does not already exist. */ + /* If the file exists, it fails. */ + dwCreationDisposition = CREATE_NEW; + }else if( isCreate ){ + /* Open existing file, or create if it doesn't exist */ + dwCreationDisposition = OPEN_ALWAYS; + }else{ + /* Opens a file, only if it exists. */ + dwCreationDisposition = OPEN_EXISTING; + } + + if( 0==sqlite3_uri_boolean(zName, "exclusive", 0) ){ + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + }else{ + dwShareMode = 0; + } + + if( isDelete ){ +#if SQLITE_OS_WINCE + dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN; + isTemp = 1; +#else + dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY + | FILE_ATTRIBUTE_HIDDEN + | FILE_FLAG_DELETE_ON_CLOSE; +#endif + }else{ + dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; + } + /* Reports from the internet are that performance is always + ** better if FILE_FLAG_RANDOM_ACCESS is used. Ticket #2699. */ +#if SQLITE_OS_WINCE + dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; +#endif + + if( osIsNT() ){ +#if SQLITE_OS_WINRT + CREATEFILE2_EXTENDED_PARAMETERS extendedParameters; + extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); + extendedParameters.dwFileAttributes = + dwFlagsAndAttributes & FILE_ATTRIBUTE_MASK; + extendedParameters.dwFileFlags = dwFlagsAndAttributes & FILE_FLAG_MASK; + extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS; + extendedParameters.lpSecurityAttributes = NULL; + extendedParameters.hTemplateFile = NULL; + do{ + h = osCreateFile2((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, + dwCreationDisposition, + &extendedParameters); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); +#else + do{ + h = osCreateFileW((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + do{ + h = osCreateFileA((LPCSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); + } +#endif + winLogIoerr(cnt, __LINE__); + + OSTRACE(("OPEN file=%p, name=%s, access=%lx, rc=%s\n", h, zUtf8Name, + dwDesiredAccess, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + + if( h==INVALID_HANDLE_VALUE ){ + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + if( isReadWrite && !isExclusive ){ + return winOpen(pVfs, zName, id, + ((flags|SQLITE_OPEN_READONLY) & + ~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), + pOutFlags); + }else{ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); + return SQLITE_CANTOPEN_BKPT; + } + } + + if( pOutFlags ){ + if( isReadWrite ){ + *pOutFlags = SQLITE_OPEN_READWRITE; + }else{ + *pOutFlags = SQLITE_OPEN_READONLY; + } + } + + OSTRACE(("OPEN file=%p, name=%s, access=%lx, pOutFlags=%p, *pOutFlags=%d, " + "rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ? + *pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + + pAppData = (winVfsAppData*)pVfs->pAppData; + +#if SQLITE_OS_WINCE + { + if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB + && ((pAppData==NULL) || !pAppData->bNoLock) + && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK + ){ + osCloseHandle(h); + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc))); + return rc; + } + } + if( isTemp ){ + pFile->zDeleteOnClose = zConverted; + }else +#endif + { + sqlite3_free(zConverted); + } + + sqlite3_free(zTmpname); + id->pMethods = pAppData ? pAppData->pMethod : &winIoMethod; + pFile->pVfs = pVfs; + pFile->h = h; + if( isReadonly ){ + pFile->ctrlFlags |= WINFILE_RDONLY; + } + if( (flags & SQLITE_OPEN_MAIN_DB) + && sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) + ){ + pFile->ctrlFlags |= WINFILE_PSOW; + } + pFile->lastErrno = NO_ERROR; + pFile->zPath = zName; +#if SQLITE_MAX_MMAP_SIZE>0 + pFile->hMap = NULL; + pFile->pMapRegion = 0; + pFile->mmapSize = 0; + pFile->mmapSizeMax = sqlite3GlobalConfig.szMmap; +#endif + + OpenCounter(+1); + return rc; +} + +/* +** Delete the named file. +** +** Note that Windows does not allow a file to be deleted if some other +** process has it open. Sometimes a virus scanner or indexing program +** will open a journal file shortly after it is created in order to do +** whatever it does. While this other process is holding the +** file open, we will be unable to delete it. To work around this +** problem, we delay 100 milliseconds and try to delete again. Up +** to MX_DELETION_ATTEMPTs deletion attempts are run before giving +** up and returning an error. +*/ +static int winDelete( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to delete */ + int syncDir /* Not used on win32 */ +){ + int cnt = 0; + int rc; + DWORD attr; + DWORD lastErrno = 0; + void *zConverted; + UNUSED_PARAMETER(pVfs); + UNUSED_PARAMETER(syncDir); + + SimulateIOError(return SQLITE_IOERR_DELETE); + OSTRACE(("DELETE name=%s, syncDir=%d\n", zFilename, syncDir)); + + zConverted = winConvertFromUtf8Filename(zFilename); + if( zConverted==0 ){ + OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + do { +#if SQLITE_OS_WINRT + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard, + &sAttrData) ){ + attr = sAttrData.dwFileAttributes; + }else{ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } +#else + attr = osGetFileAttributesW(zConverted); +#endif + if ( attr==INVALID_FILE_ATTRIBUTES ){ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } + if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + rc = SQLITE_ERROR; /* Files only. */ + break; + } + if ( osDeleteFileW(zConverted) ){ + rc = SQLITE_OK; /* Deleted OK. */ + break; + } + if ( !winRetryIoerr(&cnt, &lastErrno) ){ + rc = SQLITE_ERROR; /* No more retries. */ + break; + } + } while(1); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + do { + attr = osGetFileAttributesA(zConverted); + if ( attr==INVALID_FILE_ATTRIBUTES ){ + lastErrno = osGetLastError(); + if( lastErrno==ERROR_FILE_NOT_FOUND + || lastErrno==ERROR_PATH_NOT_FOUND ){ + rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ + }else{ + rc = SQLITE_ERROR; + } + break; + } + if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + rc = SQLITE_ERROR; /* Files only. */ + break; + } + if ( osDeleteFileA(zConverted) ){ + rc = SQLITE_OK; /* Deleted OK. */ + break; + } + if ( !winRetryIoerr(&cnt, &lastErrno) ){ + rc = SQLITE_ERROR; /* No more retries. */ + break; + } + } while(1); + } +#endif + if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){ + rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename); + }else{ + winLogIoerr(cnt, __LINE__); + } + sqlite3_free(zConverted); + OSTRACE(("DELETE name=%s, rc=%s\n", zFilename, sqlite3ErrName(rc))); + return rc; +} + +/* +** Check the existence and status of a file. +*/ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags, /* Type of test to make on this file */ + int *pResOut /* OUT: Result */ +){ + DWORD attr; + int rc = 0; + DWORD lastErrno = 0; + void *zConverted; + UNUSED_PARAMETER(pVfs); + + SimulateIOError( return SQLITE_IOERR_ACCESS; ); + OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", + zFilename, flags, pResOut)); + + zConverted = winConvertFromUtf8Filename(zFilename); + if( zConverted==0 ){ + OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + int cnt = 0; + WIN32_FILE_ATTRIBUTE_DATA sAttrData; + memset(&sAttrData, 0, sizeof(sAttrData)); + while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, + GetFileExInfoStandard, + &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} + if( rc ){ + /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file + ** as if it does not exist. + */ + if( flags==SQLITE_ACCESS_EXISTS + && sAttrData.nFileSizeHigh==0 + && sAttrData.nFileSizeLow==0 ){ + attr = INVALID_FILE_ATTRIBUTES; + }else{ + attr = sAttrData.dwFileAttributes; + } + }else{ + winLogIoerr(cnt, __LINE__); + if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", + zFilename); + }else{ + attr = INVALID_FILE_ATTRIBUTES; + } + } + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + attr = osGetFileAttributesA((char*)zConverted); + } +#endif + sqlite3_free(zConverted); + switch( flags ){ + case SQLITE_ACCESS_READ: + case SQLITE_ACCESS_EXISTS: + rc = attr!=INVALID_FILE_ATTRIBUTES; + break; + case SQLITE_ACCESS_READWRITE: + rc = attr!=INVALID_FILE_ATTRIBUTES && + (attr & FILE_ATTRIBUTE_READONLY)==0; + break; + default: + assert(!"Invalid flags argument"); + } + *pResOut = rc; + OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + zFilename, pResOut, *pResOut)); + return SQLITE_OK; +} + +/* +** Returns non-zero if the specified path name starts with the "long path" +** prefix. +*/ +static BOOL winIsLongPathPrefix( + const char *zPathname +){ + return ( zPathname[0]=='\\' && zPathname[1]=='\\' + && zPathname[2]=='?' && zPathname[3]=='\\' ); +} + +/* +** Returns non-zero if the specified path name starts with a drive letter +** followed by a colon character. +*/ +static BOOL winIsDriveLetterAndColon( + const char *zPathname +){ + return ( sqlite3Isalpha(zPathname[0]) && zPathname[1]==':' ); +} + +/* +** Returns non-zero if the specified path name should be used verbatim. If +** non-zero is returned from this function, the calling function must simply +** use the provided path name verbatim -OR- resolve it into a full path name +** using the GetFullPathName Win32 API function (if available). +*/ +static BOOL winIsVerbatimPathname( + const char *zPathname +){ + /* + ** If the path name starts with a forward slash or a backslash, it is either + ** a legal UNC name, a volume relative path, or an absolute path name in the + ** "Unix" format on Windows. There is no easy way to differentiate between + ** the final two cases; therefore, we return the safer return value of TRUE + ** so that callers of this function will simply use it verbatim. + */ + if ( winIsDirSep(zPathname[0]) ){ + return TRUE; + } + + /* + ** If the path name starts with a letter and a colon it is either a volume + ** relative path or an absolute path. Callers of this function must not + ** attempt to treat it as a relative path name (i.e. they should simply use + ** it verbatim). + */ + if ( winIsDriveLetterAndColon(zPathname) ){ + return TRUE; + } + + /* + ** If we get to this point, the path name should almost certainly be a purely + ** relative one (i.e. not a UNC name, not absolute, and not volume relative). + */ + return FALSE; +} + +/* +** Turn a relative pathname into a full pathname. Write the full +** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname +** bytes in size. +*/ +static int winFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zRelative, /* Possibly relative input path */ + int nFull, /* Size of output buffer in bytes */ + char *zFull /* Output buffer */ +){ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + DWORD nByte; + void *zConverted; + char *zOut; +#endif + + /* If this path name begins with "/X:" or "\\?\", where "X" is any + ** alphabetic character, discard the initial "/" from the pathname. + */ + if( zRelative[0]=='/' && (winIsDriveLetterAndColon(zRelative+1) + || winIsLongPathPrefix(zRelative+1)) ){ + zRelative++; + } + +#if defined(__CYGWIN__) + SimulateIOError( return SQLITE_ERROR ); + UNUSED_PARAMETER(nFull); + assert( nFull>=pVfs->mxPathname ); + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a slash. + */ + char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); + if( !zOut ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( cygwin_conv_path( + (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) | + CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){ + sqlite3_free(zOut); + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, + "winFullPathname1", zRelative); + }else{ + char *zUtf8 = winConvertToUtf8Filename(zOut); + if( !zUtf8 ){ + sqlite3_free(zOut); + return SQLITE_IOERR_NOMEM_BKPT; + } + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zUtf8); + sqlite3_free(zUtf8); + sqlite3_free(zOut); + } + }else{ + char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); + if( !zOut ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( cygwin_conv_path( + (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A), + zRelative, zOut, pVfs->mxPathname+1)<0 ){ + sqlite3_free(zOut); + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, + "winFullPathname2", zRelative); + }else{ + char *zUtf8 = winConvertToUtf8Filename(zOut); + if( !zUtf8 ){ + sqlite3_free(zOut); + return SQLITE_IOERR_NOMEM_BKPT; + } + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8); + sqlite3_free(zUtf8); + sqlite3_free(zOut); + } + } + return SQLITE_OK; +#endif + +#if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__) + SimulateIOError( return SQLITE_ERROR ); + /* WinCE has no concept of a relative pathname, or so I am told. */ + /* WinRT has no way to convert a relative path to an absolute one. */ + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a backslash. + */ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zRelative); + }else{ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative); + } + return SQLITE_OK; +#endif + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + /* It's odd to simulate an io-error here, but really this is just + ** using the io-error infrastructure to test that SQLite handles this + ** function failing. This function could fail if, for example, the + ** current working directory has been unlinked. + */ + SimulateIOError( return SQLITE_ERROR ); + if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + /* + ** NOTE: We are dealing with a relative path name and the data + ** directory has been set. Therefore, use it as the basis + ** for converting the relative path name to an absolute + ** one by prepending the data directory and a backslash. + */ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", + sqlite3_data_directory, winGetDirSep(), zRelative); + return SQLITE_OK; + } + zConverted = winConvertFromUtf8Filename(zRelative); + if( zConverted==0 ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + if( osIsNT() ){ + LPWSTR zTemp; + nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname1", zRelative); + } + nByte += 3; + zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + sqlite3_free(zConverted); + return SQLITE_IOERR_NOMEM_BKPT; + } + nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + sqlite3_free(zTemp); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname2", zRelative); + } + sqlite3_free(zConverted); + zOut = winUnicodeToUtf8(zTemp); + sqlite3_free(zTemp); + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + char *zTemp; + nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname3", zRelative); + } + nByte += 3; + zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); + if( zTemp==0 ){ + sqlite3_free(zConverted); + return SQLITE_IOERR_NOMEM_BKPT; + } + nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); + if( nByte==0 ){ + sqlite3_free(zConverted); + sqlite3_free(zTemp); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), + "winFullPathname4", zRelative); + } + sqlite3_free(zConverted); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); + sqlite3_free(zTemp); + } +#endif + if( zOut ){ + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut); + sqlite3_free(zOut); + return SQLITE_OK; + }else{ + return SQLITE_IOERR_NOMEM_BKPT; + } +#endif +} + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Interfaces for opening a shared library, finding entry points +** within the shared library, and closing the shared library. +*/ +static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ + HANDLE h; +#if defined(__CYGWIN__) + int nFull = pVfs->mxPathname+1; + char *zFull = sqlite3MallocZero( nFull ); + void *zConverted = 0; + if( zFull==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( winFullPathname(pVfs, zFilename, nFull, zFull)!=SQLITE_OK ){ + sqlite3_free(zFull); + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + zConverted = winConvertFromUtf8Filename(zFull); + sqlite3_free(zFull); +#else + void *zConverted = winConvertFromUtf8Filename(zFilename); + UNUSED_PARAMETER(pVfs); +#endif + if( zConverted==0 ){ + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); + return 0; + } + if( osIsNT() ){ +#if SQLITE_OS_WINRT + h = osLoadPackagedLibrary((LPCWSTR)zConverted, 0); +#else + h = osLoadLibraryW((LPCWSTR)zConverted); +#endif + } +#ifdef SQLITE_WIN32_HAS_ANSI + else{ + h = osLoadLibraryA((char*)zConverted); + } +#endif + OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)h)); + sqlite3_free(zConverted); + return (void*)h; +} +static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ + UNUSED_PARAMETER(pVfs); + winGetLastErrorMsg(osGetLastError(), nBuf, zBufOut); +} +static void (*winDlSym(sqlite3_vfs *pVfs,void *pH,const char *zSym))(void){ + FARPROC proc; + UNUSED_PARAMETER(pVfs); + proc = osGetProcAddressA((HANDLE)pH, zSym); + OSTRACE(("DLSYM handle=%p, symbol=%s, address=%p\n", + (void*)pH, zSym, (void*)proc)); + return (void(*)(void))proc; +} +static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ + UNUSED_PARAMETER(pVfs); + osFreeLibrary((HANDLE)pHandle); + OSTRACE(("DLCLOSE handle=%p\n", (void*)pHandle)); +} +#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ + #define winDlOpen 0 + #define winDlError 0 + #define winDlSym 0 + #define winDlClose 0 +#endif + +/* State information for the randomness gatherer. */ +typedef struct EntropyGatherer EntropyGatherer; +struct EntropyGatherer { + unsigned char *a; /* Gather entropy into this buffer */ + int na; /* Size of a[] in bytes */ + int i; /* XOR next input into a[i] */ + int nXor; /* Number of XOR operations done */ +}; + +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) +/* Mix sz bytes of entropy into p. */ +static void xorMemory(EntropyGatherer *p, unsigned char *x, int sz){ + int j, k; + for(j=0, k=p->i; ja[k++] ^= x[j]; + if( k>=p->na ) k = 0; + } + p->i = k; + p->nXor += sz; +} +#endif /* !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) */ + +/* +** Write up to nBuf bytes of randomness into zBuf. +*/ +static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ +#if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); + return nBuf; +#else + EntropyGatherer e; + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); + e.a = (unsigned char*)zBuf; + e.na = nBuf; + e.nXor = 0; + e.i = 0; + { + SYSTEMTIME x; + osGetSystemTime(&x); + xorMemory(&e, (unsigned char*)&x, sizeof(SYSTEMTIME)); + } + { + DWORD pid = osGetCurrentProcessId(); + xorMemory(&e, (unsigned char*)&pid, sizeof(DWORD)); + } +#if SQLITE_OS_WINRT + { + ULONGLONG cnt = osGetTickCount64(); + xorMemory(&e, (unsigned char*)&cnt, sizeof(ULONGLONG)); + } +#else + { + DWORD cnt = osGetTickCount(); + xorMemory(&e, (unsigned char*)&cnt, sizeof(DWORD)); + } +#endif /* SQLITE_OS_WINRT */ + { + LARGE_INTEGER i; + osQueryPerformanceCounter(&i); + xorMemory(&e, (unsigned char*)&i, sizeof(LARGE_INTEGER)); + } +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { + UUID id; + memset(&id, 0, sizeof(UUID)); + osUuidCreate(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + memset(&id, 0, sizeof(UUID)); + osUuidCreateSequential(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + } +#endif /* !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID */ + return e.nXor>nBuf ? nBuf : e.nXor; +#endif /* defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) */ +} + + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +static int winSleep(sqlite3_vfs *pVfs, int microsec){ + sqlite3_win32_sleep((microsec+999)/1000); + UNUSED_PARAMETER(pVfs); + return ((microsec+999)/1000)*1000; +} + +/* +** The following variable, if set to a non-zero value, is interpreted as +** the number of seconds since 1970 and is used to set the result of +** sqlite3OsCurrentTime() during testing. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +#endif + +/* +** Find the current time (in Universal Coordinated Time). Write into *piNow +** the current time and date as a Julian Day number times 86_400_000. In +** other words, write into *piNow the number of milliseconds since the Julian +** epoch of noon in Greenwich on November 24, 4714 B.C according to the +** proleptic Gregorian calendar. +** +** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date +** cannot be found. +*/ +static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){ + /* FILETIME structure is a 64-bit value representing the number of + 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5). + */ + FILETIME ft; + static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000; +#ifdef SQLITE_TEST + static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; +#endif + /* 2^32 - to avoid use of LL and warnings in gcc */ + static const sqlite3_int64 max32BitValue = + (sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + + (sqlite3_int64)294967296; + +#if SQLITE_OS_WINCE + SYSTEMTIME time; + osGetSystemTime(&time); + /* if SystemTimeToFileTime() fails, it returns zero. */ + if (!osSystemTimeToFileTime(&time,&ft)){ + return SQLITE_ERROR; + } +#else + osGetSystemTimeAsFileTime( &ft ); +#endif + + *piNow = winFiletimeEpoch + + ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + + (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000; + +#ifdef SQLITE_TEST + if( sqlite3_current_time ){ + *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; + } +#endif + UNUSED_PARAMETER(pVfs); + return SQLITE_OK; +} + +/* +** Find the current time (in Universal Coordinated Time). Write the +** current time and date as a Julian Day number into *prNow and +** return 0. Return 1 if the time and date cannot be found. +*/ +static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ + int rc; + sqlite3_int64 i; + rc = winCurrentTimeInt64(pVfs, &i); + if( !rc ){ + *prNow = i/86400000.0; + } + return rc; +} + +/* +** The idea is that this function works like a combination of +** GetLastError() and FormatMessage() on Windows (or errno and +** strerror_r() on Unix). After an error is returned by an OS +** function, SQLite calls this function with zBuf pointing to +** a buffer of nBuf bytes. The OS layer should populate the +** buffer with a nul-terminated UTF-8 encoded error message +** describing the last IO error to have occurred within the calling +** thread. +** +** If the error message is too large for the supplied buffer, +** it should be truncated. The return value of xGetLastError +** is zero if the error message fits in the buffer, or non-zero +** otherwise (if the message was truncated). If non-zero is returned, +** then it is not necessary to include the nul-terminator character +** in the output buffer. +** +** Not supplying an error message will have no adverse effect +** on SQLite. It is fine to have an implementation that never +** returns an error message: +** +** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ +** assert(zBuf[0]=='\0'); +** return 0; +** } +** +** However if an error message is supplied, it will be incorporated +** by sqlite into the error message available to the user using +** sqlite3_errmsg(), possibly making IO errors easier to debug. +*/ +static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + DWORD e = osGetLastError(); + UNUSED_PARAMETER(pVfs); + if( nBuf>0 ) winGetLastErrorMsg(e, nBuf, zBuf); + return e; +} + +/* +** Initialize and deinitialize the operating system interface. +*/ +SQLITE_API int sqlite3_os_init(void){ + static sqlite3_vfs winVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + static sqlite3_vfs winNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + + /* Double-check that the aSyscall[] array has been constructed + ** correctly. See ticket [bb3a86e890c8e96ab] */ + assert( ArraySize(aSyscall)==80 ); + + /* get memory map allocation granularity */ + memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); +#if SQLITE_OS_WINRT + osGetNativeSystemInfo(&winSysInfo); +#else + osGetSystemInfo(&winSysInfo); +#endif + assert( winSysInfo.dwAllocationGranularity>0 ); + assert( winSysInfo.dwPageSize>0 ); + + sqlite3_vfs_register(&winVfs, 1); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathVfs, 0); +#endif + + sqlite3_vfs_register(&winNolockVfs, 0); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathNolockVfs, 0); +#endif + +#ifndef SQLITE_OMIT_WAL + winBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); +#endif + + return SQLITE_OK; +} + +SQLITE_API int sqlite3_os_end(void){ +#if SQLITE_OS_WINRT + if( sleepObj!=NULL ){ + osCloseHandle(sleepObj); + sleepObj = NULL; + } +#endif + +#ifndef SQLITE_OMIT_WAL + winBigLock = 0; +#endif + + return SQLITE_OK; +} + +#endif /* SQLITE_OS_WIN */ + +/************** End of os_win.c **********************************************/ +/************** Begin file memdb.c *******************************************/ +/* +** 2016-09-07 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file implements an in-memory VFS. A database is held as a contiguous +** block of memory. +** +** This file also implements interface sqlite3_serialize() and +** sqlite3_deserialize(). +*/ +/* #include "sqliteInt.h" */ +#ifndef SQLITE_OMIT_DESERIALIZE + +/* +** Forward declaration of objects used by this utility +*/ +typedef struct sqlite3_vfs MemVfs; +typedef struct MemFile MemFile; +typedef struct MemStore MemStore; + +/* Access to a lower-level VFS that (might) implement dynamic loading, +** access to randomness, etc. +*/ +#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) + +/* Storage for a memdb file. +** +** An memdb object can be shared or separate. Shared memdb objects can be +** used by more than one database connection. Mutexes are used by shared +** memdb objects to coordinate access. Separate memdb objects are only +** connected to a single database connection and do not require additional +** mutexes. +** +** Shared memdb objects have .zFName!=0 and .pMutex!=0. They are created +** using "file:/name?vfs=memdb". The first character of the name must be +** "/" or else the object will be a separate memdb object. All shared +** memdb objects are stored in memdb_g.apMemStore[] in an arbitrary order. +** +** Separate memdb objects are created using a name that does not begin +** with "/" or using sqlite3_deserialize(). +** +** Access rules for shared MemStore objects: +** +** * .zFName is initialized when the object is created and afterwards +** is unchanged until the object is destroyed. So it can be accessed +** at any time as long as we know the object is not being destroyed, +** which means while either the SQLITE_MUTEX_STATIC_VFS1 or +** .pMutex is held or the object is not part of memdb_g.apMemStore[]. +** +** * Can .pMutex can only be changed while holding the +** SQLITE_MUTEX_STATIC_VFS1 mutex or while the object is not part +** of memdb_g.apMemStore[]. +** +** * Other fields can only be changed while holding the .pMutex mutex +** or when the .nRef is less than zero and the object is not part of +** memdb_g.apMemStore[]. +** +** * The .aData pointer has the added requirement that it can can only +** be changed (for resizing) when nMmap is zero. +** +*/ +struct MemStore { + sqlite3_int64 sz; /* Size of the file */ + sqlite3_int64 szAlloc; /* Space allocated to aData */ + sqlite3_int64 szMax; /* Maximum allowed size of the file */ + unsigned char *aData; /* content of the file */ + sqlite3_mutex *pMutex; /* Used by shared stores only */ + int nMmap; /* Number of memory mapped pages */ + unsigned mFlags; /* Flags */ + int nRdLock; /* Number of readers */ + int nWrLock; /* Number of writers. (Always 0 or 1) */ + int nRef; /* Number of users of this MemStore */ + char *zFName; /* The filename for shared stores */ +}; + +/* An open file */ +struct MemFile { + sqlite3_file base; /* IO methods */ + MemStore *pStore; /* The storage */ + int eLock; /* Most recent lock against this file */ +}; + +/* +** File-scope variables for holding the memdb files that are accessible +** to multiple database connections in separate threads. +** +** Must hold SQLITE_MUTEX_STATIC_VFS1 to access any part of this object. +*/ +static struct MemFS { + int nMemStore; /* Number of shared MemStore objects */ + MemStore **apMemStore; /* Array of all shared MemStore objects */ +} memdb_g; + +/* +** Methods for MemFile +*/ +static int memdbClose(sqlite3_file*); +static int memdbRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); +static int memdbWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); +static int memdbTruncate(sqlite3_file*, sqlite3_int64 size); +static int memdbSync(sqlite3_file*, int flags); +static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize); +static int memdbLock(sqlite3_file*, int); +/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */ +static int memdbFileControl(sqlite3_file*, int op, void *pArg); +/* static int memdbSectorSize(sqlite3_file*); // not used */ +static int memdbDeviceCharacteristics(sqlite3_file*); +static int memdbFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); +static int memdbUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); + +/* +** Methods for MemVfs +*/ +static int memdbOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); +/* static int memdbDelete(sqlite3_vfs*, const char *zName, int syncDir); */ +static int memdbAccess(sqlite3_vfs*, const char *zName, int flags, int *); +static int memdbFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); +static void *memdbDlOpen(sqlite3_vfs*, const char *zFilename); +static void memdbDlError(sqlite3_vfs*, int nByte, char *zErrMsg); +static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); +static void memdbDlClose(sqlite3_vfs*, void*); +static int memdbRandomness(sqlite3_vfs*, int nByte, char *zOut); +static int memdbSleep(sqlite3_vfs*, int microseconds); +/* static int memdbCurrentTime(sqlite3_vfs*, double*); */ +static int memdbGetLastError(sqlite3_vfs*, int, char *); +static int memdbCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); + +static sqlite3_vfs memdb_vfs = { + 2, /* iVersion */ + 0, /* szOsFile (set when registered) */ + 1024, /* mxPathname */ + 0, /* pNext */ + "memdb", /* zName */ + 0, /* pAppData (set when registered) */ + memdbOpen, /* xOpen */ + 0, /* memdbDelete, */ /* xDelete */ + memdbAccess, /* xAccess */ + memdbFullPathname, /* xFullPathname */ + memdbDlOpen, /* xDlOpen */ + memdbDlError, /* xDlError */ + memdbDlSym, /* xDlSym */ + memdbDlClose, /* xDlClose */ + memdbRandomness, /* xRandomness */ + memdbSleep, /* xSleep */ + 0, /* memdbCurrentTime, */ /* xCurrentTime */ + memdbGetLastError, /* xGetLastError */ + memdbCurrentTimeInt64, /* xCurrentTimeInt64 */ + 0, /* xSetSystemCall */ + 0, /* xGetSystemCall */ + 0, /* xNextSystemCall */ +}; + +static const sqlite3_io_methods memdb_io_methods = { + 3, /* iVersion */ + memdbClose, /* xClose */ + memdbRead, /* xRead */ + memdbWrite, /* xWrite */ + memdbTruncate, /* xTruncate */ + memdbSync, /* xSync */ + memdbFileSize, /* xFileSize */ + memdbLock, /* xLock */ + memdbLock, /* xUnlock - same as xLock in this case */ + 0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */ + memdbFileControl, /* xFileControl */ + 0, /* memdbSectorSize,*/ /* xSectorSize */ + memdbDeviceCharacteristics, /* xDeviceCharacteristics */ + 0, /* xShmMap */ + 0, /* xShmLock */ + 0, /* xShmBarrier */ + 0, /* xShmUnmap */ + memdbFetch, /* xFetch */ + memdbUnfetch /* xUnfetch */ +}; + +/* +** Enter/leave the mutex on a MemStore +*/ +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0 +static void memdbEnter(MemStore *p){ + UNUSED_PARAMETER(p); +} +static void memdbLeave(MemStore *p){ + UNUSED_PARAMETER(p); +} +#else +static void memdbEnter(MemStore *p){ + sqlite3_mutex_enter(p->pMutex); +} +static void memdbLeave(MemStore *p){ + sqlite3_mutex_leave(p->pMutex); +} +#endif + + + +/* +** Close an memdb-file. +** Free the underlying MemStore object when its refcount drops to zero +** or less. +*/ +static int memdbClose(sqlite3_file *pFile){ + MemStore *p = ((MemFile*)pFile)->pStore; + if( p->zFName ){ + int i; +#ifndef SQLITE_MUTEX_OMIT + sqlite3_mutex *pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); +#endif + sqlite3_mutex_enter(pVfsMutex); + for(i=0; ALWAYS(inRef==1 ){ + memdb_g.apMemStore[i] = memdb_g.apMemStore[--memdb_g.nMemStore]; + if( memdb_g.nMemStore==0 ){ + sqlite3_free(memdb_g.apMemStore); + memdb_g.apMemStore = 0; + } + } + break; + } + } + sqlite3_mutex_leave(pVfsMutex); + }else{ + memdbEnter(p); + } + p->nRef--; + if( p->nRef<=0 ){ + if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ){ + sqlite3_free(p->aData); + } + memdbLeave(p); + sqlite3_mutex_free(p->pMutex); + sqlite3_free(p); + }else{ + memdbLeave(p); + } + return SQLITE_OK; +} + +/* +** Read data from an memdb-file. +*/ +static int memdbRead( + sqlite3_file *pFile, + void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + MemStore *p = ((MemFile*)pFile)->pStore; + memdbEnter(p); + if( iOfst+iAmt>p->sz ){ + memset(zBuf, 0, iAmt); + if( iOfstsz ) memcpy(zBuf, p->aData+iOfst, p->sz - iOfst); + memdbLeave(p); + return SQLITE_IOERR_SHORT_READ; + } + memcpy(zBuf, p->aData+iOfst, iAmt); + memdbLeave(p); + return SQLITE_OK; +} + +/* +** Try to enlarge the memory allocation to hold at least sz bytes +*/ +static int memdbEnlarge(MemStore *p, sqlite3_int64 newSz){ + unsigned char *pNew; + if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || NEVER(p->nMmap>0) ){ + return SQLITE_FULL; + } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; + pNew = sqlite3Realloc(p->aData, newSz); + if( pNew==0 ) return SQLITE_IOERR_NOMEM; + p->aData = pNew; + p->szAlloc = newSz; + return SQLITE_OK; +} + +/* +** Write data to an memdb-file. +*/ +static int memdbWrite( + sqlite3_file *pFile, + const void *z, + int iAmt, + sqlite_int64 iOfst +){ + MemStore *p = ((MemFile*)pFile)->pStore; + memdbEnter(p); + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ){ + /* Can't happen: memdbLock() will return SQLITE_READONLY before + ** reaching this point */ + memdbLeave(p); + return SQLITE_IOERR_WRITE; + } + if( iOfst+iAmt>p->sz ){ + int rc; + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK + ){ + memdbLeave(p); + return rc; + } + if( iOfst>p->sz ) memset(p->aData+p->sz, 0, iOfst-p->sz); + p->sz = iOfst+iAmt; + } + memcpy(p->aData+iOfst, z, iAmt); + memdbLeave(p); + return SQLITE_OK; +} + +/* +** Truncate an memdb-file. +** +** In rollback mode (which is always the case for memdb, as it does not +** support WAL mode) the truncate() method is only used to reduce +** the size of a file, never to increase the size. +*/ +static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){ + MemStore *p = ((MemFile*)pFile)->pStore; + int rc = SQLITE_OK; + memdbEnter(p); + if( size>p->sz ){ + /* This can only happen with a corrupt wal mode db */ + rc = SQLITE_CORRUPT; + }else{ + p->sz = size; + } + memdbLeave(p); + return rc; +} + +/* +** Sync an memdb-file. +*/ +static int memdbSync(sqlite3_file *pFile, int flags){ + UNUSED_PARAMETER(pFile); + UNUSED_PARAMETER(flags); + return SQLITE_OK; +} + +/* +** Return the current file-size of an memdb-file. +*/ +static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ + MemStore *p = ((MemFile*)pFile)->pStore; + memdbEnter(p); + *pSize = p->sz; + memdbLeave(p); + return SQLITE_OK; +} + +/* +** Lock an memdb-file. +*/ +static int memdbLock(sqlite3_file *pFile, int eLock){ + MemFile *pThis = (MemFile*)pFile; + MemStore *p = pThis->pStore; + int rc = SQLITE_OK; + if( eLock==pThis->eLock ) return SQLITE_OK; + memdbEnter(p); + if( eLock>SQLITE_LOCK_SHARED ){ + if( p->mFlags & SQLITE_DESERIALIZE_READONLY ){ + rc = SQLITE_READONLY; + }else if( pThis->eLock<=SQLITE_LOCK_SHARED ){ + if( p->nWrLock ){ + rc = SQLITE_BUSY; + }else{ + p->nWrLock = 1; + } + } + }else if( eLock==SQLITE_LOCK_SHARED ){ + if( pThis->eLock > SQLITE_LOCK_SHARED ){ + assert( p->nWrLock==1 ); + p->nWrLock = 0; + }else if( p->nWrLock ){ + rc = SQLITE_BUSY; + }else{ + p->nRdLock++; + } + }else{ + assert( eLock==SQLITE_LOCK_NONE ); + if( pThis->eLock>SQLITE_LOCK_SHARED ){ + assert( p->nWrLock==1 ); + p->nWrLock = 0; + } + assert( p->nRdLock>0 ); + p->nRdLock--; + } + if( rc==SQLITE_OK ) pThis->eLock = eLock; + memdbLeave(p); + return rc; +} + +#if 0 +/* +** This interface is only used for crash recovery, which does not +** occur on an in-memory database. +*/ +static int memdbCheckReservedLock(sqlite3_file *pFile, int *pResOut){ + *pResOut = 0; + return SQLITE_OK; +} +#endif + + +/* +** File control method. For custom operations on an memdb-file. +*/ +static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ + MemStore *p = ((MemFile*)pFile)->pStore; + int rc = SQLITE_NOTFOUND; + memdbEnter(p); + if( op==SQLITE_FCNTL_VFSNAME ){ + *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); + rc = SQLITE_OK; + } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } + memdbLeave(p); + return rc; +} + +#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +/* +** Return the sector-size in bytes for an memdb-file. +*/ +static int memdbSectorSize(sqlite3_file *pFile){ + return 1024; +} +#endif + +/* +** Return the device characteristic flags supported by an memdb-file. +*/ +static int memdbDeviceCharacteristics(sqlite3_file *pFile){ + UNUSED_PARAMETER(pFile); + return SQLITE_IOCAP_ATOMIC | + SQLITE_IOCAP_POWERSAFE_OVERWRITE | + SQLITE_IOCAP_SAFE_APPEND | + SQLITE_IOCAP_SEQUENTIAL; +} + +/* Fetch a page of a memory-mapped file */ +static int memdbFetch( + sqlite3_file *pFile, + sqlite3_int64 iOfst, + int iAmt, + void **pp +){ + MemStore *p = ((MemFile*)pFile)->pStore; + memdbEnter(p); + if( iOfst+iAmt>p->sz || (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)!=0 ){ + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } + memdbLeave(p); + return SQLITE_OK; +} + +/* Release a memory-mapped page */ +static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ + MemStore *p = ((MemFile*)pFile)->pStore; + UNUSED_PARAMETER(iOfst); + UNUSED_PARAMETER(pPage); + memdbEnter(p); + p->nMmap--; + memdbLeave(p); + return SQLITE_OK; +} + +/* +** Open an mem file handle. +*/ +static int memdbOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFd, + int flags, + int *pOutFlags +){ + MemFile *pFile = (MemFile*)pFd; + MemStore *p = 0; + int szName; + UNUSED_PARAMETER(pVfs); + + memset(pFile, 0, sizeof(*pFile)); + szName = sqlite3Strlen30(zName); + if( szName>1 && zName[0]=='/' ){ + int i; +#ifndef SQLITE_MUTEX_OMIT + sqlite3_mutex *pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); +#endif + sqlite3_mutex_enter(pVfsMutex); + for(i=0; izFName,zName)==0 ){ + p = memdb_g.apMemStore[i]; + break; + } + } + if( p==0 ){ + MemStore **apNew; + p = sqlite3Malloc( sizeof(*p) + szName + 3 ); + if( p==0 ){ + sqlite3_mutex_leave(pVfsMutex); + return SQLITE_NOMEM; + } + apNew = sqlite3Realloc(memdb_g.apMemStore, + sizeof(apNew[0])*(memdb_g.nMemStore+1) ); + if( apNew==0 ){ + sqlite3_free(p); + sqlite3_mutex_leave(pVfsMutex); + return SQLITE_NOMEM; + } + apNew[memdb_g.nMemStore++] = p; + memdb_g.apMemStore = apNew; + memset(p, 0, sizeof(*p)); + p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE|SQLITE_DESERIALIZE_FREEONCLOSE; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; + p->zFName = (char*)&p[1]; + memcpy(p->zFName, zName, szName+1); + p->pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( p->pMutex==0 ){ + memdb_g.nMemStore--; + sqlite3_free(p); + sqlite3_mutex_leave(pVfsMutex); + return SQLITE_NOMEM; + } + p->nRef = 1; + memdbEnter(p); + }else{ + memdbEnter(p); + p->nRef++; + } + sqlite3_mutex_leave(pVfsMutex); + }else{ + p = sqlite3Malloc( sizeof(*p) ); + if( p==0 ){ + return SQLITE_NOMEM; + } + memset(p, 0, sizeof(*p)); + p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; + } + pFile->pStore = p; + if( pOutFlags!=0 ){ + *pOutFlags = flags | SQLITE_OPEN_MEMORY; + } + pFd->pMethods = &memdb_io_methods; + memdbLeave(p); + return SQLITE_OK; +} + +#if 0 /* Only used to delete rollback journals, super-journals, and WAL + ** files, none of which exist in memdb. So this routine is never used */ +/* +** Delete the file located at zPath. If the dirSync argument is true, +** ensure the file-system modifications are synced to disk before +** returning. +*/ +static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + return SQLITE_IOERR_DELETE; +} +#endif + +/* +** Test for access permissions. Return true if the requested permission +** is available, or false otherwise. +** +** With memdb, no files ever exist on disk. So always return false. +*/ +static int memdbAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + UNUSED_PARAMETER(pVfs); + UNUSED_PARAMETER(zPath); + UNUSED_PARAMETER(flags); + *pResOut = 0; + return SQLITE_OK; +} + +/* +** Populate buffer zOut with the full canonical pathname corresponding +** to the pathname in zPath. zOut is guaranteed to point to a buffer +** of at least (INST_MAX_PATHNAME+1) bytes. +*/ +static int memdbFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, + char *zOut +){ + UNUSED_PARAMETER(pVfs); + sqlite3_snprintf(nOut, zOut, "%s", zPath); + return SQLITE_OK; +} + +/* +** Open the dynamic library located at zPath and return a handle. +*/ +static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); +} + +/* +** Populate the buffer zErrMsg (size nByte bytes) with a human readable +** utf-8 string describing the most recent error encountered associated +** with dynamic libraries. +*/ +static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ + ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); +} + +/* +** Return a pointer to the symbol zSymbol in the dynamic library pHandle. +*/ +static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ + return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); +} + +/* +** Close the dynamic library handle pHandle. +*/ +static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){ + ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); +} + +/* +** Populate the buffer pointed to by zBufOut with nByte bytes of +** random data. +*/ +static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); +} + +/* +** Sleep for nMicro microseconds. Return the number of microseconds +** actually slept. +*/ +static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){ + return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); +} + +#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */ +/* +** Return the current time as a Julian Day number in *pTimeOut. +*/ +static int memdbCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); +} +#endif + +static int memdbGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); +} +static int memdbCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ + return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); +} + +/* +** Translate a database connection pointer and schema name into a +** MemFile pointer. +*/ +static MemFile *memdbFromDbSchema(sqlite3 *db, const char *zSchema){ + MemFile *p = 0; + MemStore *pStore; + int rc = sqlite3_file_control(db, zSchema, SQLITE_FCNTL_FILE_POINTER, &p); + if( rc ) return 0; + if( p->base.pMethods!=&memdb_io_methods ) return 0; + pStore = p->pStore; + memdbEnter(pStore); + if( pStore->zFName!=0 ) p = 0; + memdbLeave(pStore); + return p; +} + +/* +** Return the serialization of a database +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which database within the connection */ + sqlite3_int64 *piSize, /* Write size here, if not NULL */ + unsigned int mFlags /* Maybe SQLITE_SERIALIZE_NOCOPY */ +){ + MemFile *p; + int iDb; + Btree *pBt; + sqlite3_int64 sz; + int szPage = 0; + sqlite3_stmt *pStmt = 0; + unsigned char *pOut; + char *zSql; + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + p = memdbFromDbSchema(db, zSchema); + iDb = sqlite3FindDbName(db, zSchema); + if( piSize ) *piSize = -1; + if( iDb<0 ) return 0; + if( p ){ + MemStore *pStore = p->pStore; + assert( pStore->pMutex==0 ); + if( piSize ) *piSize = pStore->sz; + if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + pOut = pStore->aData; + }else{ + pOut = sqlite3_malloc64( pStore->sz ); + if( pOut ) memcpy(pOut, pStore->aData, pStore->sz); + } + return pOut; + } + pBt = db->aDb[iDb].pBt; + if( pBt==0 ) return 0; + szPage = sqlite3BtreeGetPageSize(pBt); + zSql = sqlite3_mprintf("PRAGMA \"%w\".page_count", zSchema); + rc = zSql ? sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) : SQLITE_NOMEM; + sqlite3_free(zSql); + if( rc ) return 0; + rc = sqlite3_step(pStmt); + if( rc!=SQLITE_ROW ){ + pOut = 0; + }else{ + sz = sqlite3_column_int64(pStmt, 0)*szPage; + if( piSize ) *piSize = sz; + if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + pOut = 0; + }else{ + pOut = sqlite3_malloc64( sz ); + if( pOut ){ + int nPage = sqlite3_column_int(pStmt, 0); + Pager *pPager = sqlite3BtreePager(pBt); + int pgno; + for(pgno=1; pgno<=nPage; pgno++){ + DbPage *pPage = 0; + unsigned char *pTo = pOut + szPage*(sqlite3_int64)(pgno-1); + rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pPage, 0); + if( rc==SQLITE_OK ){ + memcpy(pTo, sqlite3PagerGetData(pPage), szPage); + }else{ + memset(pTo, 0, szPage); + } + sqlite3PagerUnref(pPage); + } + } + } + } + sqlite3_finalize(pStmt); + return pOut; +} + +/* Convert zSchema to a MemDB and initialize its content. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +){ + MemFile *p; + char *zSql; + sqlite3_stmt *pStmt = 0; + int rc; + int iDb; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( szDb<0 ) return SQLITE_MISUSE_BKPT; + if( szBuf<0 ) return SQLITE_MISUSE_BKPT; +#endif + + sqlite3_mutex_enter(db->mutex); + if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + iDb = sqlite3FindDbName(db, zSchema); + testcase( iDb==1 ); + if( iDb<2 && iDb!=0 ){ + rc = SQLITE_ERROR; + goto end_deserialize; + } + zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + if( rc ) goto end_deserialize; + db->init.iDb = (u8)iDb; + db->init.reopenMemdb = 1; + rc = sqlite3_step(pStmt); + db->init.reopenMemdb = 0; + if( rc!=SQLITE_DONE ){ + rc = SQLITE_ERROR; + goto end_deserialize; + } + p = memdbFromDbSchema(db, zSchema); + if( p==0 ){ + rc = SQLITE_ERROR; + }else{ + MemStore *pStore = p->pStore; + pStore->aData = pData; + pData = 0; + pStore->sz = szDb; + pStore->szAlloc = szBuf; + pStore->szMax = szBuf; + if( pStore->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; + } + pStore->mFlags = mFlags; + rc = SQLITE_OK; + } + +end_deserialize: + sqlite3_finalize(pStmt); + if( pData && (mFlags & SQLITE_DESERIALIZE_FREEONCLOSE)!=0 ){ + sqlite3_free(pData); + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This routine is called when the extension is loaded. +** Register the new VFS. +*/ +SQLITE_PRIVATE int sqlite3MemdbInit(void){ + sqlite3_vfs *pLower = sqlite3_vfs_find(0); + unsigned int sz; + if( NEVER(pLower==0) ) return SQLITE_ERROR; + sz = pLower->szOsFile; + memdb_vfs.pAppData = pLower; + /* The following conditional can only be true when compiled for + ** Windows x86 and SQLITE_MAX_MMAP_SIZE=0. We always leave + ** it in, to be safe, but it is marked as NO_TEST since there + ** is no way to reach it under most builds. */ + if( szBITVEC_NBIT and iDivisor==0 then Bitvec.u.aHash[] is +** a hash table that will hold up to BITVEC_MXHASH distinct values. +** +** Otherwise, the value i is redirected into one of BITVEC_NPTR +** sub-bitmaps pointed to by Bitvec.u.apSub[]. Each subbitmap +** handles up to iDivisor separate values of i. apSub[0] holds +** values between 1 and iDivisor. apSub[1] holds values between +** iDivisor+1 and 2*iDivisor. apSub[N] holds values between +** N*iDivisor+1 and (N+1)*iDivisor. Each subbitmap is normalized +** to hold deal with values between 1 and iDivisor. +*/ +struct Bitvec { + u32 iSize; /* Maximum bit index. Max iSize is 4,294,967,296. */ + u32 nSet; /* Number of bits that are set - only valid for aHash + ** element. Max is BITVEC_NINT. For BITVEC_SZ of 512, + ** this would be 125. */ + u32 iDivisor; /* Number of bits handled by each apSub[] entry. */ + /* Should >=0 for apSub element. */ + /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */ + /* For a BITVEC_SZ of 512, this would be 34,359,739. */ + union { + BITVEC_TELEM aBitmap[BITVEC_NELEM]; /* Bitmap representation */ + u32 aHash[BITVEC_NINT]; /* Hash table representation */ + Bitvec *apSub[BITVEC_NPTR]; /* Recursive representation */ + } u; +}; + +/* +** Create a new bitmap object able to handle bits between 0 and iSize, +** inclusive. Return a pointer to the new object. Return NULL if +** malloc fails. +*/ +SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){ + Bitvec *p; + assert( sizeof(*p)==BITVEC_SZ ); + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->iSize = iSize; + } + return p; +} + +/* +** Check to see if the i-th bit is set. Return true or false. +** If p is NULL (if the bitmap has not been created) or if +** i is out of range, then return false. +*/ +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec *p, u32 i){ + assert( p!=0 ); + i--; + if( i>=p->iSize ) return 0; + while( p->iDivisor ){ + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + p = p->u.apSub[bin]; + if (!p) { + return 0; + } + } + if( p->iSize<=BITVEC_NBIT ){ + return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0; + } else{ + u32 h = BITVEC_HASH(i++); + while( p->u.aHash[h] ){ + if( p->u.aHash[h]==i ) return 1; + h = (h+1) % BITVEC_NINT; + } + return 0; + } +} +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ + return p!=0 && sqlite3BitvecTestNotNull(p,i); +} + +/* +** Set the i-th bit. Return 0 on success and an error code if +** anything goes wrong. +** +** This routine might cause sub-bitmaps to be allocated. Failing +** to get the memory needed to hold the sub-bitmap is the only +** that can go wrong with an insert, assuming p and i are valid. +** +** The calling function must ensure that p is a valid Bitvec object +** and that the value for "i" is within range of the Bitvec object. +** Otherwise the behavior is undefined. +*/ +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){ + u32 h; + if( p==0 ) return SQLITE_OK; + assert( i>0 ); + assert( i<=p->iSize ); + i--; + while((p->iSize > BITVEC_NBIT) && p->iDivisor) { + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + if( p->u.apSub[bin]==0 ){ + p->u.apSub[bin] = sqlite3BitvecCreate( p->iDivisor ); + if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM_BKPT; + } + p = p->u.apSub[bin]; + } + if( p->iSize<=BITVEC_NBIT ){ + p->u.aBitmap[i/BITVEC_SZELEM] |= 1 << (i&(BITVEC_SZELEM-1)); + return SQLITE_OK; + } + h = BITVEC_HASH(i++); + /* if there wasn't a hash collision, and this doesn't */ + /* completely fill the hash, then just add it without */ + /* worring about sub-dividing and re-hashing. */ + if( !p->u.aHash[h] ){ + if (p->nSet<(BITVEC_NINT-1)) { + goto bitvec_set_end; + } else { + goto bitvec_set_rehash; + } + } + /* there was a collision, check to see if it's already */ + /* in hash, if not, try to find a spot for it */ + do { + if( p->u.aHash[h]==i ) return SQLITE_OK; + h++; + if( h>=BITVEC_NINT ) h = 0; + } while( p->u.aHash[h] ); + /* we didn't find it in the hash. h points to the first */ + /* available free spot. check to see if this is going to */ + /* make our hash too "full". */ +bitvec_set_rehash: + if( p->nSet>=BITVEC_MXHASH ){ + unsigned int j; + int rc; + u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash)); + if( aiValues==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); + memset(p->u.apSub, 0, sizeof(p->u.apSub)); + p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR; + rc = sqlite3BitvecSet(p, i); + for(j=0; jnSet++; + p->u.aHash[h] = i; + return SQLITE_OK; +} + +/* +** Clear the i-th bit. +** +** pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage +** that BitvecClear can use to rebuilt its hash table. +*/ +SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){ + if( p==0 ) return; + assert( i>0 ); + i--; + while( p->iDivisor ){ + u32 bin = i/p->iDivisor; + i = i%p->iDivisor; + p = p->u.apSub[bin]; + if (!p) { + return; + } + } + if( p->iSize<=BITVEC_NBIT ){ + p->u.aBitmap[i/BITVEC_SZELEM] &= ~(1 << (i&(BITVEC_SZELEM-1))); + }else{ + unsigned int j; + u32 *aiValues = pBuf; + memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); + memset(p->u.aHash, 0, sizeof(p->u.aHash)); + p->nSet = 0; + for(j=0; jnSet++; + while( p->u.aHash[h] ){ + h++; + if( h>=BITVEC_NINT ) h = 0; + } + p->u.aHash[h] = aiValues[j]; + } + } + } +} + +/* +** Destroy a bitmap object. Reclaim all memory used. +*/ +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){ + if( p==0 ) return; + if( p->iDivisor ){ + unsigned int i; + for(i=0; iu.apSub[i]); + } + } + sqlite3_free(p); +} + +/* +** Return the value of the iSize parameter specified when Bitvec *p +** was created. +*/ +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ + return p->iSize; +} + +#ifndef SQLITE_UNTESTABLE +/* +** Let V[] be an array of unsigned characters sufficient to hold +** up to N bits. Let I be an integer between 0 and N. 0<=I>3] |= (1<<(I&7)) +#define CLEARBIT(V,I) V[I>>3] &= ~(1<<(I&7)) +#define TESTBIT(V,I) (V[I>>3]&(1<<(I&7)))!=0 + +/* +** This routine runs an extensive test of the Bitvec code. +** +** The input is an array of integers that acts as a program +** to test the Bitvec. The integers are opcodes followed +** by 0, 1, or 3 operands, depending on the opcode. Another +** opcode follows immediately after the last operand. +** +** There are 6 opcodes numbered from 0 through 5. 0 is the +** "halt" opcode and causes the test to end. +** +** 0 Halt and return the number of errors +** 1 N S X Set N bits beginning with S and incrementing by X +** 2 N S X Clear N bits beginning with S and incrementing by X +** 3 N Set N randomly chosen bits +** 4 N Clear N randomly chosen bits +** 5 N S X Set N bits from S increment X in array only, not in bitvec +** +** The opcodes 1 through 4 perform set and clear operations are performed +** on both a Bitvec object and on a linear array of bits obtained from malloc. +** Opcode 5 works on the linear array only, not on the Bitvec. +** Opcode 5 is used to deliberately induce a fault in order to +** confirm that error detection works. +** +** At the conclusion of the test the linear array is compared +** against the Bitvec object. If there are any differences, +** an error is returned. If they are the same, zero is returned. +** +** If a memory allocation error occurs, return -1. +*/ +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ + Bitvec *pBitvec = 0; + unsigned char *pV = 0; + int rc = -1; + int i, nx, pc, op; + void *pTmpSpace; + + /* Allocate the Bitvec to be tested and a linear array of + ** bits to act as the reference */ + pBitvec = sqlite3BitvecCreate( sz ); + pV = sqlite3MallocZero( (sz+7)/8 + 1 ); + pTmpSpace = sqlite3_malloc64(BITVEC_SZ); + if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; + + /* NULL pBitvec tests */ + sqlite3BitvecSet(0, 1); + sqlite3BitvecClear(0, 1, pTmpSpace); + + /* Run the program */ + pc = i = 0; + while( (op = aOp[pc])!=0 ){ + switch( op ){ + case 1: + case 2: + case 5: { + nx = 4; + i = aOp[pc+2] - 1; + aOp[pc+2] += aOp[pc+3]; + break; + } + case 3: + case 4: + default: { + nx = 2; + sqlite3_randomness(sizeof(i), &i); + break; + } + } + if( (--aOp[pc+1]) > 0 ) nx = 0; + pc += nx; + i = (i & 0x7fffffff)%sz; + if( (op & 1)!=0 ){ + SETBIT(pV, (i+1)); + if( op!=5 ){ + if( sqlite3BitvecSet(pBitvec, i+1) ) goto bitvec_end; + } + }else{ + CLEARBIT(pV, (i+1)); + sqlite3BitvecClear(pBitvec, i+1, pTmpSpace); + } + } + + /* Test to make sure the linear array exactly matches the + ** Bitvec object. Start with the assumption that they do + ** match (rc==0). Change rc to non-zero if a discrepancy + ** is found. + */ + rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1) + + sqlite3BitvecTest(pBitvec, 0) + + (sqlite3BitvecSize(pBitvec) - sz); + for(i=1; i<=sz; i++){ + if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){ + rc = i; + break; + } + } + + /* Free allocated structure */ +bitvec_end: + sqlite3_free(pTmpSpace); + sqlite3_free(pV); + sqlite3BitvecDestroy(pBitvec); + return rc; +} +#endif /* SQLITE_UNTESTABLE */ + +/************** End of bitvec.c **********************************************/ +/************** Begin file pcache.c ******************************************/ +/* +** 2008 August 05 +** +** 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 that page cache. +*/ +/* #include "sqliteInt.h" */ + +/* +** A complete page cache is an instance of this structure. Every +** entry in the cache holds a single page of the database file. The +** btree layer only operates on the cached copy of the database pages. +** +** A page cache entry is "clean" if it exactly matches what is currently +** on disk. A page is "dirty" if it has been modified and needs to be +** persisted to disk. +** +** pDirty, pDirtyTail, pSynced: +** All dirty pages are linked into the doubly linked list using +** PgHdr.pDirtyNext and pDirtyPrev. The list is maintained in LRU order +** such that p was added to the list more recently than p->pDirtyNext. +** PCache.pDirty points to the first (newest) element in the list and +** pDirtyTail to the last (oldest). +** +** The PCache.pSynced variable is used to optimize searching for a dirty +** page to eject from the cache mid-transaction. It is better to eject +** a page that does not require a journal sync than one that does. +** Therefore, pSynced is maintained so that it *almost* always points +** to either the oldest page in the pDirty/pDirtyTail list that has a +** clear PGHDR_NEED_SYNC flag or to a page that is older than this one +** (so that the right page to eject can be found by following pDirtyPrev +** pointers). +*/ +struct PCache { + PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */ + PgHdr *pSynced; /* Last synced page in dirty page list */ + int nRefSum; /* Sum of ref counts over all pages */ + int szCache; /* Configured cache size */ + int szSpill; /* Size before spilling occurs */ + int szPage; /* Size of every page in this cache */ + int szExtra; /* Size of extra space for each page */ + u8 bPurgeable; /* True if pages are on backing store */ + u8 eCreate; /* eCreate value for for xFetch() */ + int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */ + void *pStress; /* Argument to xStress */ + sqlite3_pcache *pCache; /* Pluggable cache module */ +}; + +/********************************** Test and Debug Logic **********************/ +/* +** Debug tracing macros. Enable by by changing the "0" to "1" and +** recompiling. +** +** When sqlite3PcacheTrace is 1, single line trace messages are issued. +** When sqlite3PcacheTrace is 2, a dump of the pcache showing all cache entries +** is displayed for many operations, resulting in a lot of output. +*/ +#if defined(SQLITE_DEBUG) && 0 + int sqlite3PcacheTrace = 2; /* 0: off 1: simple 2: cache dumps */ + int sqlite3PcacheMxDump = 9999; /* Max cache entries for pcacheDump() */ +# define pcacheTrace(X) if(sqlite3PcacheTrace){sqlite3DebugPrintf X;} + void pcacheDump(PCache *pCache){ + int N; + int i, j; + sqlite3_pcache_page *pLower; + PgHdr *pPg; + unsigned char *a; + + if( sqlite3PcacheTrace<2 ) return; + if( pCache->pCache==0 ) return; + N = sqlite3PcachePagecount(pCache); + if( N>sqlite3PcacheMxDump ) N = sqlite3PcacheMxDump; + for(i=1; i<=N; i++){ + pLower = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, i, 0); + if( pLower==0 ) continue; + pPg = (PgHdr*)pLower->pExtra; + printf("%3d: nRef %2d flgs %02x data ", i, pPg->nRef, pPg->flags); + a = (unsigned char *)pLower->pBuf; + for(j=0; j<12; j++) printf("%02x", a[j]); + printf("\n"); + if( pPg->pPage==0 ){ + sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, pLower, 0); + } + } + } + #else +# define pcacheTrace(X) +# define pcacheDump(X) +#endif + +/* +** Check invariants on a PgHdr entry. Return true if everything is OK. +** Return false if any invariant is violated. +** +** This routine is for use inside of assert() statements only. For +** example: +** +** assert( sqlite3PcachePageSanity(pPg) ); +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ + PCache *pCache; + assert( pPg!=0 ); + assert( pPg->pgno>0 || pPg->pPager==0 ); /* Page number is 1 or more */ + pCache = pPg->pCache; + assert( pCache!=0 ); /* Every page has an associated PCache */ + if( pPg->flags & PGHDR_CLEAN ){ + assert( (pPg->flags & PGHDR_DIRTY)==0 );/* Cannot be both CLEAN and DIRTY */ + assert( pCache->pDirty!=pPg ); /* CLEAN pages not on dirty list */ + assert( pCache->pDirtyTail!=pPg ); + } + /* WRITEABLE pages must also be DIRTY */ + if( pPg->flags & PGHDR_WRITEABLE ){ + assert( pPg->flags & PGHDR_DIRTY ); /* WRITEABLE implies DIRTY */ + } + /* NEED_SYNC can be set independently of WRITEABLE. This can happen, + ** for example, when using the sqlite3PagerDontWrite() optimization: + ** (1) Page X is journalled, and gets WRITEABLE and NEED_SEEK. + ** (2) Page X moved to freelist, WRITEABLE is cleared + ** (3) Page X reused, WRITEABLE is set again + ** If NEED_SYNC had been cleared in step 2, then it would not be reset + ** in step 3, and page might be written into the database without first + ** syncing the rollback journal, which might cause corruption on a power + ** loss. + ** + ** Another example is when the database page size is smaller than the + ** disk sector size. When any page of a sector is journalled, all pages + ** in that sector are marked NEED_SYNC even if they are still CLEAN, just + ** in case they are later modified, since all pages in the same sector + ** must be journalled and synced before any of those pages can be safely + ** written. + */ + return 1; +} +#endif /* SQLITE_DEBUG */ + + +/********************************** Linked List Management ********************/ + +/* Allowed values for second argument to pcacheManageDirtyList() */ +#define PCACHE_DIRTYLIST_REMOVE 1 /* Remove pPage from dirty list */ +#define PCACHE_DIRTYLIST_ADD 2 /* Add pPage to the dirty list */ +#define PCACHE_DIRTYLIST_FRONT 3 /* Move pPage to the front of the list */ + +/* +** Manage pPage's participation on the dirty list. Bits of the addRemove +** argument determines what operation to do. The 0x01 bit means first +** remove pPage from the dirty list. The 0x02 means add pPage back to +** the dirty list. Doing both moves pPage to the front of the dirty list. +*/ +static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ + PCache *p = pPage->pCache; + + pcacheTrace(("%p.DIRTYLIST.%s %d\n", p, + addRemove==1 ? "REMOVE" : addRemove==2 ? "ADD" : "FRONT", + pPage->pgno)); + if( addRemove & PCACHE_DIRTYLIST_REMOVE ){ + assert( pPage->pDirtyNext || pPage==p->pDirtyTail ); + assert( pPage->pDirtyPrev || pPage==p->pDirty ); + + /* Update the PCache1.pSynced variable if necessary. */ + if( p->pSynced==pPage ){ + p->pSynced = pPage->pDirtyPrev; + } + + if( pPage->pDirtyNext ){ + pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev; + }else{ + assert( pPage==p->pDirtyTail ); + p->pDirtyTail = pPage->pDirtyPrev; + } + if( pPage->pDirtyPrev ){ + pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext; + }else{ + /* If there are now no dirty pages in the cache, set eCreate to 2. + ** This is an optimization that allows sqlite3PcacheFetch() to skip + ** searching for a dirty page to eject from the cache when it might + ** otherwise have to. */ + assert( pPage==p->pDirty ); + p->pDirty = pPage->pDirtyNext; + assert( p->bPurgeable || p->eCreate==2 ); + if( p->pDirty==0 ){ /*OPTIMIZATION-IF-TRUE*/ + assert( p->bPurgeable==0 || p->eCreate==1 ); + p->eCreate = 2; + } + } + } + if( addRemove & PCACHE_DIRTYLIST_ADD ){ + pPage->pDirtyPrev = 0; + pPage->pDirtyNext = p->pDirty; + if( pPage->pDirtyNext ){ + assert( pPage->pDirtyNext->pDirtyPrev==0 ); + pPage->pDirtyNext->pDirtyPrev = pPage; + }else{ + p->pDirtyTail = pPage; + if( p->bPurgeable ){ + assert( p->eCreate==2 ); + p->eCreate = 1; + } + } + p->pDirty = pPage; + + /* If pSynced is NULL and this page has a clear NEED_SYNC flag, set + ** pSynced to point to it. Checking the NEED_SYNC flag is an + ** optimization, as if pSynced points to a page with the NEED_SYNC + ** flag set sqlite3PcacheFetchStress() searches through all newer + ** entries of the dirty-list for a page with NEED_SYNC clear anyway. */ + if( !p->pSynced + && 0==(pPage->flags&PGHDR_NEED_SYNC) /*OPTIMIZATION-IF-FALSE*/ + ){ + p->pSynced = pPage; + } + } + pcacheDump(p); +} + +/* +** Wrapper around the pluggable caches xUnpin method. If the cache is +** being used for an in-memory database, this function is a no-op. +*/ +static void pcacheUnpin(PgHdr *p){ + if( p->pCache->bPurgeable ){ + pcacheTrace(("%p.UNPIN %d\n", p->pCache, p->pgno)); + sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 0); + pcacheDump(p->pCache); + } +} + +/* +** Compute the number of pages of cache requested. p->szCache is the +** cache size requested by the "PRAGMA cache_size" statement. +*/ +static int numberOfCachePages(PCache *p){ + if( p->szCache>=0 ){ + /* IMPLEMENTATION-OF: R-42059-47211 If the argument N is positive then the + ** suggested cache size is set to N. */ + return p->szCache; + }else{ + i64 n; + /* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the + ** number of cache pages is adjusted to be a number of pages that would + ** use approximately abs(N*1024) bytes of memory based on the current + ** page size. */ + n = ((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); + if( n>1000000000 ) n = 1000000000; + return (int)n; + } +} + +/*************************************************** General Interfaces ****** +** +** Initialize and shutdown the page cache subsystem. Neither of these +** functions are threadsafe. +*/ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ + if( sqlite3GlobalConfig.pcache2.xInit==0 ){ + /* IMPLEMENTATION-OF: R-26801-64137 If the xInit() method is NULL, then the + ** built-in default page cache is used instead of the application defined + ** page cache. */ + sqlite3PCacheSetDefault(); + assert( sqlite3GlobalConfig.pcache2.xInit!=0 ); + } + return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); +} +SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ + if( sqlite3GlobalConfig.pcache2.xShutdown ){ + /* IMPLEMENTATION-OF: R-26000-56589 The xShutdown() method may be NULL. */ + sqlite3GlobalConfig.pcache2.xShutdown(sqlite3GlobalConfig.pcache2.pArg); + } +} + +/* +** Return the size in bytes of a PCache object. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } + +/* +** Create a new PCache object. Storage space to hold the object +** has already been allocated and is passed in as the p pointer. +** The caller discovers how much space needs to be allocated by +** calling sqlite3PcacheSize(). +** +** szExtra is some extra space allocated for each page. The first +** 8 bytes of the extra space will be zeroed as the page is allocated, +** but remaining content will be uninitialized. Though it is opaque +** to this module, the extra space really ends up being the MemPage +** structure in the pager. +*/ +SQLITE_PRIVATE int sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*,PgHdr*),/* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *p /* Preallocated space for the PCache */ +){ + memset(p, 0, sizeof(PCache)); + p->szPage = 1; + p->szExtra = szExtra; + assert( szExtra>=8 ); /* First 8 bytes will be zeroed */ + p->bPurgeable = bPurgeable; + p->eCreate = 2; + p->xStress = xStress; + p->pStress = pStress; + p->szCache = 100; + p->szSpill = 1; + pcacheTrace(("%p.OPEN szPage %d bPurgeable %d\n",p,szPage,bPurgeable)); + return sqlite3PcacheSetPageSize(p, szPage); +} + +/* +** Change the page size for PCache object. The caller must ensure that there +** are no outstanding page references when this function is called. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){ + assert( pCache->nRefSum==0 && pCache->pDirty==0 ); + if( pCache->szPage ){ + sqlite3_pcache *pNew; + pNew = sqlite3GlobalConfig.pcache2.xCreate( + szPage, pCache->szExtra + ROUND8(sizeof(PgHdr)), + pCache->bPurgeable + ); + if( pNew==0 ) return SQLITE_NOMEM_BKPT; + sqlite3GlobalConfig.pcache2.xCachesize(pNew, numberOfCachePages(pCache)); + if( pCache->pCache ){ + sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); + } + pCache->pCache = pNew; + pCache->szPage = szPage; + pcacheTrace(("%p.PAGESIZE %d\n",pCache,szPage)); + } + return SQLITE_OK; +} + +/* +** Try to obtain a page from the cache. +** +** This routine returns a pointer to an sqlite3_pcache_page object if +** such an object is already in cache, or if a new one is created. +** This routine returns a NULL pointer if the object was not in cache +** and could not be created. +** +** The createFlags should be 0 to check for existing pages and should +** be 3 (not 1, but 3) to try to create a new page. +** +** If the createFlag is 0, then NULL is always returned if the page +** is not already in the cache. If createFlag is 1, then a new page +** is created only if that can be done without spilling dirty pages +** and without exceeding the cache size limit. +** +** The caller needs to invoke sqlite3PcacheFetchFinish() to properly +** initialize the sqlite3_pcache_page object and convert it into a +** PgHdr object. The sqlite3PcacheFetch() and sqlite3PcacheFetchFinish() +** routines are split this way for performance reasons. When separated +** they can both (usually) operate without having to push values to +** the stack on entry and pop them back off on exit, which saves a +** lot of pushing and popping. +*/ +SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number to obtain */ + int createFlag /* If true, create page if it does not exist already */ +){ + int eCreate; + sqlite3_pcache_page *pRes; + + assert( pCache!=0 ); + assert( pCache->pCache!=0 ); + assert( createFlag==3 || createFlag==0 ); + assert( pCache->eCreate==((pCache->bPurgeable && pCache->pDirty) ? 1 : 2) ); + + /* eCreate defines what to do if the page does not exist. + ** 0 Do not allocate a new page. (createFlag==0) + ** 1 Allocate a new page if doing so is inexpensive. + ** (createFlag==1 AND bPurgeable AND pDirty) + ** 2 Allocate a new page even it doing so is difficult. + ** (createFlag==1 AND !(bPurgeable AND pDirty) + */ + eCreate = createFlag & pCache->eCreate; + assert( eCreate==0 || eCreate==1 || eCreate==2 ); + assert( createFlag==0 || pCache->eCreate==eCreate ); + assert( createFlag==0 || eCreate==1+(!pCache->bPurgeable||!pCache->pDirty) ); + pRes = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); + pcacheTrace(("%p.FETCH %d%s (result: %p)\n",pCache,pgno, + createFlag?" create":"",pRes)); + return pRes; +} + +/* +** If the sqlite3PcacheFetch() routine is unable to allocate a new +** page because no clean pages are available for reuse and the cache +** size limit has been reached, then this routine can be invoked to +** try harder to allocate a page. This routine might invoke the stress +** callback to spill dirty pages to the journal. It will then try to +** allocate the new page and will only fail to allocate a new page on +** an OOM error. +** +** This routine should be invoked only after sqlite3PcacheFetch() fails. +*/ +SQLITE_PRIVATE int sqlite3PcacheFetchStress( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number to obtain */ + sqlite3_pcache_page **ppPage /* Write result here */ +){ + PgHdr *pPg; + if( pCache->eCreate==2 ) return 0; + + if( sqlite3PcachePagecount(pCache)>pCache->szSpill ){ + /* Find a dirty page to write-out and recycle. First try to find a + ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC + ** cleared), but if that is not possible settle for any other + ** unreferenced dirty page. + ** + ** If the LRU page in the dirty list that has a clear PGHDR_NEED_SYNC + ** flag is currently referenced, then the following may leave pSynced + ** set incorrectly (pointing to other than the LRU page with NEED_SYNC + ** cleared). This is Ok, as pSynced is just an optimization. */ + for(pPg=pCache->pSynced; + pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); + pPg=pPg->pDirtyPrev + ); + pCache->pSynced = pPg; + if( !pPg ){ + for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev); + } + if( pPg ){ + int rc; +#ifdef SQLITE_LOG_CACHE_SPILL + sqlite3_log(SQLITE_FULL, + "spill page %d making room for %d - cache used: %d/%d", + pPg->pgno, pgno, + sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache), + numberOfCachePages(pCache)); +#endif + pcacheTrace(("%p.SPILL %d\n",pCache,pPg->pgno)); + rc = pCache->xStress(pCache->pStress, pPg); + pcacheDump(pCache); + if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ + return rc; + } + } + } + *ppPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2); + return *ppPage==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; +} + +/* +** This is a helper routine for sqlite3PcacheFetchFinish() +** +** In the uncommon case where the page being fetched has not been +** initialized, this routine is invoked to do the initialization. +** This routine is broken out into a separate function since it +** requires extra stack manipulation that can be avoided in the common +** case. +*/ +static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number obtained */ + sqlite3_pcache_page *pPage /* Page obtained by prior PcacheFetch() call */ +){ + PgHdr *pPgHdr; + assert( pPage!=0 ); + pPgHdr = (PgHdr*)pPage->pExtra; + assert( pPgHdr->pPage==0 ); + memset(&pPgHdr->pDirty, 0, sizeof(PgHdr) - offsetof(PgHdr,pDirty)); + pPgHdr->pPage = pPage; + pPgHdr->pData = pPage->pBuf; + pPgHdr->pExtra = (void *)&pPgHdr[1]; + memset(pPgHdr->pExtra, 0, 8); + pPgHdr->pCache = pCache; + pPgHdr->pgno = pgno; + pPgHdr->flags = PGHDR_CLEAN; + return sqlite3PcacheFetchFinish(pCache,pgno,pPage); +} + +/* +** This routine converts the sqlite3_pcache_page object returned by +** sqlite3PcacheFetch() into an initialized PgHdr object. This routine +** must be called after sqlite3PcacheFetch() in order to get a usable +** result. +*/ +SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish( + PCache *pCache, /* Obtain the page from this cache */ + Pgno pgno, /* Page number obtained */ + sqlite3_pcache_page *pPage /* Page obtained by prior PcacheFetch() call */ +){ + PgHdr *pPgHdr; + + assert( pPage!=0 ); + pPgHdr = (PgHdr *)pPage->pExtra; + + if( !pPgHdr->pPage ){ + return pcacheFetchFinishWithInit(pCache, pgno, pPage); + } + pCache->nRefSum++; + pPgHdr->nRef++; + assert( sqlite3PcachePageSanity(pPgHdr) ); + return pPgHdr; +} + +/* +** Decrement the reference count on a page. If the page is clean and the +** reference count drops to 0, then it is made eligible for recycling. +*/ +SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){ + assert( p->nRef>0 ); + p->pCache->nRefSum--; + if( (--p->nRef)==0 ){ + if( p->flags&PGHDR_CLEAN ){ + pcacheUnpin(p); + }else{ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + } + } +} + +/* +** Increase the reference count of a supplied page by 1. +*/ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ + assert(p->nRef>0); + assert( sqlite3PcachePageSanity(p) ); + p->nRef++; + p->pCache->nRefSum++; +} + +/* +** Drop a page from the cache. There must be exactly one reference to the +** page. This function deletes that reference, so after it returns the +** page pointed to by p is invalid. +*/ +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ + assert( p->nRef==1 ); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags&PGHDR_DIRTY ){ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + } + p->pCache->nRefSum--; + sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 1); +} + +/* +** Make sure the page is marked as dirty. If it isn't dirty already, +** make it so. +*/ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ + assert( p->nRef>0 ); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ + p->flags &= ~PGHDR_DONT_WRITE; + if( p->flags & PGHDR_CLEAN ){ + p->flags ^= (PGHDR_DIRTY|PGHDR_CLEAN); + pcacheTrace(("%p.DIRTY %d\n",p->pCache,p->pgno)); + assert( (p->flags & (PGHDR_DIRTY|PGHDR_CLEAN))==PGHDR_DIRTY ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_ADD); + } + assert( sqlite3PcachePageSanity(p) ); + } +} + +/* +** Make sure the page is marked as clean. If it isn't clean already, +** make it so. +*/ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){ + assert( sqlite3PcachePageSanity(p) ); + assert( (p->flags & PGHDR_DIRTY)!=0 ); + assert( (p->flags & PGHDR_CLEAN)==0 ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + p->flags |= PGHDR_CLEAN; + pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno)); + assert( sqlite3PcachePageSanity(p) ); + if( p->nRef==0 ){ + pcacheUnpin(p); + } +} + +/* +** Make every page in the cache clean. +*/ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAN-ALL\n",pCache)); + while( (p = pCache->pDirty)!=0 ){ + sqlite3PcacheMakeClean(p); + } +} + +/* +** Clear the PGHDR_NEED_SYNC and PGHDR_WRITEABLE flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAR-WRITEABLE\n",pCache)); + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~(PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + } + pCache->pSynced = pCache->pDirtyTail; +} + +/* +** Clear the PGHDR_NEED_SYNC flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ + PgHdr *p; + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~PGHDR_NEED_SYNC; + } + pCache->pSynced = pCache->pDirtyTail; +} + +/* +** Change the page number of page p to newPgno. +*/ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ + PCache *pCache = p->pCache; + assert( p->nRef>0 ); + assert( newPgno>0 ); + assert( sqlite3PcachePageSanity(p) ); + pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); + sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); + p->pgno = newPgno; + if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + } +} + +/* +** Drop every cache entry whose page number is greater than "pgno". The +** caller must ensure that there are no outstanding references to any pages +** other than page 1 with a page number greater than pgno. +** +** If there is a reference to page 1 and the pgno parameter passed to this +** function is 0, then the data area associated with page 1 is zeroed, but +** the page object is not dropped. +*/ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){ + if( pCache->pCache ){ + PgHdr *p; + PgHdr *pNext; + pcacheTrace(("%p.TRUNCATE %d\n",pCache,pgno)); + for(p=pCache->pDirty; p; p=pNext){ + pNext = p->pDirtyNext; + /* This routine never gets call with a positive pgno except right + ** after sqlite3PcacheCleanAll(). So if there are dirty pages, + ** it must be that pgno==0. + */ + assert( p->pgno>0 ); + if( p->pgno>pgno ){ + assert( p->flags&PGHDR_DIRTY ); + sqlite3PcacheMakeClean(p); + } + } + if( pgno==0 && pCache->nRefSum ){ + sqlite3_pcache_page *pPage1; + pPage1 = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache,1,0); + if( ALWAYS(pPage1) ){ /* Page 1 is always available in cache, because + ** pCache->nRefSum>0 */ + memset(pPage1->pBuf, 0, pCache->szPage); + pgno = 1; + } + } + sqlite3GlobalConfig.pcache2.xTruncate(pCache->pCache, pgno+1); + } +} + +/* +** Close a cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){ + assert( pCache->pCache!=0 ); + pcacheTrace(("%p.CLOSE\n",pCache)); + sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); +} + +/* +** Discard the contents of the cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){ + sqlite3PcacheTruncate(pCache, 0); +} + +/* +** Merge two lists of pages connected by pDirty and in pgno order. +** Do not bother fixing the pDirtyPrev pointers. +*/ +static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){ + PgHdr result, *pTail; + pTail = &result; + assert( pA!=0 && pB!=0 ); + for(;;){ + if( pA->pgnopgno ){ + pTail->pDirty = pA; + pTail = pA; + pA = pA->pDirty; + if( pA==0 ){ + pTail->pDirty = pB; + break; + } + }else{ + pTail->pDirty = pB; + pTail = pB; + pB = pB->pDirty; + if( pB==0 ){ + pTail->pDirty = pA; + break; + } + } + } + return result.pDirty; +} + +/* +** Sort the list of pages in accending order by pgno. Pages are +** connected by pDirty pointers. The pDirtyPrev pointers are +** corrupted by this sort. +** +** Since there cannot be more than 2^31 distinct pages in a database, +** there cannot be more than 31 buckets required by the merge sorter. +** One extra bucket is added to catch overflow in case something +** ever changes to make the previous sentence incorrect. +*/ +#define N_SORT_BUCKET 32 +static PgHdr *pcacheSortDirtyList(PgHdr *pIn){ + PgHdr *a[N_SORT_BUCKET], *p; + int i; + memset(a, 0, sizeof(a)); + while( pIn ){ + p = pIn; + pIn = p->pDirty; + p->pDirty = 0; + for(i=0; ALWAYS(ipDirty; p; p=p->pDirtyNext){ + p->pDirty = p->pDirtyNext; + } + return pcacheSortDirtyList(pCache->pDirty); +} + +/* +** Return the total number of references to all pages held by the cache. +** +** This is not the total number of pages referenced, but the sum of the +** reference count for all pages. +*/ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){ + return pCache->nRefSum; +} + +/* +** Return the number of references to the page supplied as an argument. +*/ +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){ + return p->nRef; +} + +/* +** Return the total number of pages in the cache. +*/ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){ + assert( pCache->pCache!=0 ); + return sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache); +} + +#ifdef SQLITE_TEST +/* +** Get the suggested cache-size value. +*/ +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){ + return numberOfCachePages(pCache); +} +#endif + +/* +** Set the suggested cache-size value. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ + assert( pCache->pCache!=0 ); + pCache->szCache = mxPage; + sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache, + numberOfCachePages(pCache)); +} + +/* +** Set the suggested cache-spill value. Make no changes if if the +** argument is zero. Return the effective cache-spill size, which will +** be the larger of the szSpill and szCache. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *p, int mxPage){ + int res; + assert( p->pCache!=0 ); + if( mxPage ){ + if( mxPage<0 ){ + mxPage = (int)((-1024*(i64)mxPage)/(p->szPage+p->szExtra)); + } + p->szSpill = mxPage; + } + res = numberOfCachePages(p); + if( resszSpill ) res = p->szSpill; + return res; +} + +/* +** Free up as much memory as possible from the page cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache *pCache){ + assert( pCache->pCache!=0 ); + sqlite3GlobalConfig.pcache2.xShrink(pCache->pCache); +} + +/* +** Return the size of the header added by this middleware layer +** in the page-cache hierarchy. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizePcache(void){ return ROUND8(sizeof(PgHdr)); } + +/* +** Return the number of dirty pages currently in the cache, as a percentage +** of the configured cache size. +*/ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ + PgHdr *pDirty; + int nDirty = 0; + int nCache = numberOfCachePages(pCache); + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext) nDirty++; + return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; +} + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +/* +** Return true if there are one or more dirty pages in the cache. Else false. +*/ +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache){ + return (pCache->pDirty!=0); +} +#endif + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* +** For all dirty pages currently in the cache, invoke the specified +** callback. This is only used if the SQLITE_CHECK_PAGES macro is +** defined. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)){ + PgHdr *pDirty; + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext){ + xIter(pDirty); + } +} +#endif + +/************** End of pcache.c **********************************************/ +/************** Begin file pcache1.c *****************************************/ +/* +** 2008 November 05 +** +** 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 the default page cache implementation (the +** sqlite3_pcache interface). It also contains part of the implementation +** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features. +** If the default page cache implementation is overridden, then neither of +** these two features are available. +** +** A Page cache line looks like this: +** +** ------------------------------------------------------------- +** | database page content | PgHdr1 | MemPage | PgHdr | +** ------------------------------------------------------------- +** +** The database page content is up front (so that buffer overreads tend to +** flow harmlessly into the PgHdr1, MemPage, and PgHdr extensions). MemPage +** is the extension added by the btree.c module containing information such +** as the database page number and how that database page is used. PgHdr +** is added by the pcache.c layer and contains information used to keep track +** of which pages are "dirty". PgHdr1 is an extension added by this +** module (pcache1.c). The PgHdr1 header is a subclass of sqlite3_pcache_page. +** PgHdr1 contains information needed to look up a page by its page number. +** The superclass sqlite3_pcache_page.pBuf points to the start of the +** database page content and sqlite3_pcache_page.pExtra points to PgHdr. +** +** The size of the extension (MemPage+PgHdr+PgHdr1) can be determined at +** runtime using sqlite3_config(SQLITE_CONFIG_PCACHE_HDRSZ, &size). The +** sizes of the extensions sum to 272 bytes on x64 for 3.8.10, but this +** size can vary according to architecture, compile-time options, and +** SQLite library version number. +** +** If SQLITE_PCACHE_SEPARATE_HEADER is defined, then the extension is obtained +** using a separate memory allocation from the database page content. This +** seeks to overcome the "clownshoe" problem (also called "internal +** fragmentation" in academic literature) of allocating a few bytes more +** than a power of two with the memory allocator rounding up to the next +** power of two, and leaving the rounded-up space unused. +** +** This module tracks pointers to PgHdr1 objects. Only pcache.c communicates +** with this module. Information is passed back and forth as PgHdr1 pointers. +** +** The pcache.c and pager.c modules deal pointers to PgHdr objects. +** The btree.c module deals with pointers to MemPage objects. +** +** SOURCE OF PAGE CACHE MEMORY: +** +** Memory for a page might come from any of three sources: +** +** (1) The general-purpose memory allocator - sqlite3Malloc() +** (2) Global page-cache memory provided using sqlite3_config() with +** SQLITE_CONFIG_PAGECACHE. +** (3) PCache-local bulk allocation. +** +** The third case is a chunk of heap memory (defaulting to 100 pages worth) +** that is allocated when the page cache is created. The size of the local +** bulk allocation can be adjusted using +** +** sqlite3_config(SQLITE_CONFIG_PAGECACHE, (void*)0, 0, N). +** +** If N is positive, then N pages worth of memory are allocated using a single +** sqlite3Malloc() call and that memory is used for the first N pages allocated. +** Or if N is negative, then -1024*N bytes of memory are allocated and used +** for as many pages as can be accomodated. +** +** Only one of (2) or (3) can be used. Once the memory available to (2) or +** (3) is exhausted, subsequent allocations fail over to the general-purpose +** memory allocator (1). +** +** Earlier versions of SQLite used only methods (1) and (2). But experiments +** show that method (3) with N==100 provides about a 5% performance boost for +** common workloads. +*/ +/* #include "sqliteInt.h" */ + +typedef struct PCache1 PCache1; +typedef struct PgHdr1 PgHdr1; +typedef struct PgFreeslot PgFreeslot; +typedef struct PGroup PGroup; + +/* +** Each cache entry is represented by an instance of the following +** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of +** PgHdr1.pCache->szPage bytes is allocated directly before this structure +** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. +*/ +struct PgHdr1 { + sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ + unsigned int iKey; /* Key value (page number) */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ + PgHdr1 *pNext; /* Next in hash table chain */ + PCache1 *pCache; /* Cache that currently owns this page */ + PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ + PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ + /* NB: pLruPrev is only valid if pLruNext!=0 */ +}; + +/* +** A page is pinned if it is not on the LRU list. To be "pinned" means +** that the page is in active use and must not be deallocated. +*/ +#define PAGE_IS_PINNED(p) ((p)->pLruNext==0) +#define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0) + +/* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set +** of one or more PCaches that are able to recycle each other's unpinned +** pages when they are under memory pressure. A PGroup is an instance of +** the following object. +** +** This page cache implementation works in one of two modes: +** +** (1) Every PCache is the sole member of its own PGroup. There is +** one PGroup per PCache. +** +** (2) There is a single global PGroup that all PCaches are a member +** of. +** +** Mode 1 uses more memory (since PCache instances are not able to rob +** unused pages from other PCaches) but it also operates without a mutex, +** and is therefore often faster. Mode 2 requires a mutex in order to be +** threadsafe, but recycles pages more efficiently. +** +** For mode (1), PGroup.mutex is NULL. For mode (2) there is only a single +** PGroup which is the pcache1.grp global variable and its mutex is +** SQLITE_MUTEX_STATIC_LRU. +*/ +struct PGroup { + sqlite3_mutex *mutex; /* MUTEX_STATIC_LRU or NULL */ + unsigned int nMaxPage; /* Sum of nMax for purgeable caches */ + unsigned int nMinPage; /* Sum of nMin for purgeable caches */ + unsigned int mxPinned; /* nMaxpage + 10 - nMinPage */ + unsigned int nPurgeable; /* Number of purgeable pages allocated */ + PgHdr1 lru; /* The beginning and end of the LRU list */ +}; + +/* Each page cache is an instance of the following object. Every +** open database file (including each in-memory database and each +** temporary or transient database) has a single page cache which +** is an instance of this object. +** +** Pointers to structures of this type are cast and returned as +** opaque sqlite3_pcache* handles. +*/ +struct PCache1 { + /* Cache configuration parameters. Page size (szPage) and the purgeable + ** flag (bPurgeable) and the pnPurgeable pointer are all set when the + ** cache is created and are never changed thereafter. nMax may be + ** modified at any time by a call to the pcache1Cachesize() method. + ** The PGroup mutex must be held when accessing nMax. + */ + PGroup *pGroup; /* PGroup this cache belongs to */ + unsigned int *pnPurgeable; /* Pointer to pGroup->nPurgeable */ + int szPage; /* Size of database content section */ + int szExtra; /* sizeof(MemPage)+sizeof(PgHdr) */ + int szAlloc; /* Total size of one pcache line */ + int bPurgeable; /* True if cache is purgeable */ + unsigned int nMin; /* Minimum number of pages reserved */ + unsigned int nMax; /* Configured "cache_size" value */ + unsigned int n90pct; /* nMax*9/10 */ + unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ + + /* Hash table of all pages. The following variables may only be accessed + ** when the accessor is holding the PGroup mutex. + */ + unsigned int nRecyclable; /* Number of pages in the LRU list */ + unsigned int nPage; /* Total number of pages in apHash */ + unsigned int nHash; /* Number of slots in apHash[] */ + PgHdr1 **apHash; /* Hash table for fast lookup by key */ + PgHdr1 *pFree; /* List of unused pcache-local pages */ + void *pBulk; /* Bulk memory used by pcache-local */ +}; + +/* +** Free slots in the allocator used to divide up the global page cache +** buffer provided using the SQLITE_CONFIG_PAGECACHE mechanism. +*/ +struct PgFreeslot { + PgFreeslot *pNext; /* Next free slot */ +}; + +/* +** Global data used by this cache. +*/ +static SQLITE_WSD struct PCacheGlobal { + PGroup grp; /* The global PGroup for mode (2) */ + + /* Variables related to SQLITE_CONFIG_PAGECACHE settings. The + ** szSlot, nSlot, pStart, pEnd, nReserve, and isInit values are all + ** fixed at sqlite3_initialize() time and do not require mutex protection. + ** The nFreeSlot and pFree values do require mutex protection. + */ + int isInit; /* True if initialized */ + int separateCache; /* Use a new PGroup for each PCache */ + int nInitPage; /* Initial bulk allocation size */ + int szSlot; /* Size of each free slot */ + int nSlot; /* The number of pcache slots */ + int nReserve; /* Try to keep nFreeSlot above this */ + void *pStart, *pEnd; /* Bounds of global page cache memory */ + /* Above requires no mutex. Use mutex below for variable that follow. */ + sqlite3_mutex *mutex; /* Mutex for accessing the following: */ + PgFreeslot *pFree; /* Free page blocks */ + int nFreeSlot; /* Number of unused pcache slots */ + /* The following value requires a mutex to change. We skip the mutex on + ** reading because (1) most platforms read a 32-bit integer atomically and + ** (2) even if an incorrect value is read, no great harm is done since this + ** is really just an optimization. */ + int bUnderPressure; /* True if low on PAGECACHE memory */ +} pcache1_g; + +/* +** All code in this file should access the global structure above via the +** alias "pcache1". This ensures that the WSD emulation is used when +** compiling for systems that do not support real WSD. +*/ +#define pcache1 (GLOBAL(struct PCacheGlobal, pcache1_g)) + +/* +** Macros to enter and leave the PCache LRU mutex. +*/ +#if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0 +# define pcache1EnterMutex(X) assert((X)->mutex==0) +# define pcache1LeaveMutex(X) assert((X)->mutex==0) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 0 +#else +# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) +# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 1 +#endif + +/******************************************************************************/ +/******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/ + + +/* +** This function is called during initialization if a static buffer is +** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE +** verb to sqlite3_config(). Parameter pBuf points to an allocation large +** enough to contain 'n' buffers of 'sz' bytes each. +** +** This routine is called from sqlite3_initialize() and so it is guaranteed +** to be serialized already. There is no need for further mutexing. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ + if( pcache1.isInit ){ + PgFreeslot *p; + if( pBuf==0 ) sz = n = 0; + if( n==0 ) sz = 0; + sz = ROUNDDOWN8(sz); + pcache1.szSlot = sz; + pcache1.nSlot = pcache1.nFreeSlot = n; + pcache1.nReserve = n>90 ? 10 : (n/10 + 1); + pcache1.pStart = pBuf; + pcache1.pFree = 0; + pcache1.bUnderPressure = 0; + while( n-- ){ + p = (PgFreeslot*)pBuf; + p->pNext = pcache1.pFree; + pcache1.pFree = p; + pBuf = (void*)&((char*)pBuf)[sz]; + } + pcache1.pEnd = pBuf; + } +} + +/* +** Try to initialize the pCache->pFree and pCache->pBulk fields. Return +** true if pCache->pFree ends up containing one or more free pages. +*/ +static int pcache1InitBulk(PCache1 *pCache){ + i64 szBulk; + char *zBulk; + if( pcache1.nInitPage==0 ) return 0; + /* Do not bother with a bulk allocation if the cache size very small */ + if( pCache->nMax<3 ) return 0; + sqlite3BeginBenignMalloc(); + if( pcache1.nInitPage>0 ){ + szBulk = pCache->szAlloc * (i64)pcache1.nInitPage; + }else{ + szBulk = -1024 * (i64)pcache1.nInitPage; + } + if( szBulk > pCache->szAlloc*(i64)pCache->nMax ){ + szBulk = pCache->szAlloc*(i64)pCache->nMax; + } + zBulk = pCache->pBulk = sqlite3Malloc( szBulk ); + sqlite3EndBenignMalloc(); + if( zBulk ){ + int nBulk = sqlite3MallocSize(zBulk)/pCache->szAlloc; + do{ + PgHdr1 *pX = (PgHdr1*)&zBulk[pCache->szPage]; + pX->page.pBuf = zBulk; + pX->page.pExtra = &pX[1]; + pX->isBulkLocal = 1; + pX->isAnchor = 0; + pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ + pCache->pFree = pX; + zBulk += pCache->szAlloc; + }while( --nBulk ); + } + return pCache->pFree!=0; +} + +/* +** Malloc function used within this file to allocate space from the buffer +** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no +** such buffer exists or there is no space left in it, this function falls +** back to sqlite3Malloc(). +** +** Multiple threads can run this routine at the same time. Global variables +** in pcache1 need to be protected via mutex. +*/ +static void *pcache1Alloc(int nByte){ + void *p = 0; + assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); + if( nByte<=pcache1.szSlot ){ + sqlite3_mutex_enter(pcache1.mutex); + p = (PgHdr1 *)pcache1.pFree; + if( p ){ + pcache1.pFree = pcache1.pFree->pNext; + pcache1.nFreeSlot--; + pcache1.bUnderPressure = pcache1.nFreeSlot=0 ); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1); + } + sqlite3_mutex_leave(pcache1.mutex); + } + if( p==0 ){ + /* Memory is not available in the SQLITE_CONFIG_PAGECACHE pool. Get + ** it from sqlite3Malloc instead. + */ + p = sqlite3Malloc(nByte); +#ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS + if( p ){ + int sz = sqlite3MallocSize(p); + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz); + sqlite3_mutex_leave(pcache1.mutex); + } +#endif + sqlite3MemdebugSetType(p, MEMTYPE_PCACHE); + } + return p; +} + +/* +** Free an allocated buffer obtained from pcache1Alloc(). +*/ +static void pcache1Free(void *p){ + if( p==0 ) return; + if( SQLITE_WITHIN(p, pcache1.pStart, pcache1.pEnd) ){ + PgFreeslot *pSlot; + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusDown(SQLITE_STATUS_PAGECACHE_USED, 1); + pSlot = (PgFreeslot*)p; + pSlot->pNext = pcache1.pFree; + pcache1.pFree = pSlot; + pcache1.nFreeSlot++; + pcache1.bUnderPressure = pcache1.nFreeSlot=pcache1.pStart && ppGroup->mutex) ); + if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ + assert( pCache->pFree!=0 ); + p = pCache->pFree; + pCache->pFree = p->pNext; + p->pNext = 0; + }else{ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + /* The group mutex must be released before pcache1Alloc() is called. This + ** is because it might call sqlite3_release_memory(), which assumes that + ** this mutex is not held. */ + assert( pcache1.separateCache==0 ); + assert( pCache->pGroup==&pcache1.grp ); + pcache1LeaveMutex(pCache->pGroup); +#endif + if( benignMalloc ){ sqlite3BeginBenignMalloc(); } +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + pPg = pcache1Alloc(pCache->szPage); + p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); + if( !pPg || !p ){ + pcache1Free(pPg); + sqlite3_free(p); + pPg = 0; + } +#else + pPg = pcache1Alloc(pCache->szAlloc); +#endif + if( benignMalloc ){ sqlite3EndBenignMalloc(); } +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + pcache1EnterMutex(pCache->pGroup); +#endif + if( pPg==0 ) return 0; +#ifndef SQLITE_PCACHE_SEPARATE_HEADER + p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; +#endif + p->page.pBuf = pPg; + p->page.pExtra = &p[1]; + p->isBulkLocal = 0; + p->isAnchor = 0; + p->pLruPrev = 0; /* Initializing this saves a valgrind error */ + } + (*pCache->pnPurgeable)++; + return p; +} + +/* +** Free a page object allocated by pcache1AllocPage(). +*/ +static void pcache1FreePage(PgHdr1 *p){ + PCache1 *pCache; + assert( p!=0 ); + pCache = p->pCache; + assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); + if( p->isBulkLocal ){ + p->pNext = pCache->pFree; + pCache->pFree = p; + }else{ + pcache1Free(p->page.pBuf); +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + sqlite3_free(p); +#endif + } + (*pCache->pnPurgeable)--; +} + +/* +** Malloc function used by SQLite to obtain space from the buffer configured +** using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no such buffer +** exists, this function falls back to sqlite3Malloc(). +*/ +SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){ + assert( sz<=65536+8 ); /* These allocations are never very large */ + return pcache1Alloc(sz); +} + +/* +** Free an allocated buffer obtained from sqlite3PageMalloc(). +*/ +SQLITE_PRIVATE void sqlite3PageFree(void *p){ + pcache1Free(p); +} + + +/* +** Return true if it desirable to avoid allocating a new page cache +** entry. +** +** If memory was allocated specifically to the page cache using +** SQLITE_CONFIG_PAGECACHE but that memory has all been used, then +** it is desirable to avoid allocating a new page cache entry because +** presumably SQLITE_CONFIG_PAGECACHE was suppose to be sufficient +** for all page cache needs and we should not need to spill the +** allocation onto the heap. +** +** Or, the heap is used for all page cache memory but the heap is +** under memory pressure, then again it is desirable to avoid +** allocating a new page cache entry in order to avoid stressing +** the heap even further. +*/ +static int pcache1UnderMemoryPressure(PCache1 *pCache){ + if( pcache1.nSlot && (pCache->szPage+pCache->szExtra)<=pcache1.szSlot ){ + return pcache1.bUnderPressure; + }else{ + return sqlite3HeapNearlyFull(); + } +} + +/******************************************************************************/ +/******** General Implementation Functions ************************************/ + +/* +** This function is used to resize the hash table used by the cache passed +** as the first argument. +** +** The PCache mutex must be held when this function is called. +*/ +static void pcache1ResizeHash(PCache1 *p){ + PgHdr1 **apNew; + unsigned int nNew; + unsigned int i; + + assert( sqlite3_mutex_held(p->pGroup->mutex) ); + + nNew = p->nHash*2; + if( nNew<256 ){ + nNew = 256; + } + + pcache1LeaveMutex(p->pGroup); + if( p->nHash ){ sqlite3BeginBenignMalloc(); } + apNew = (PgHdr1 **)sqlite3MallocZero(sizeof(PgHdr1 *)*nNew); + if( p->nHash ){ sqlite3EndBenignMalloc(); } + pcache1EnterMutex(p->pGroup); + if( apNew ){ + for(i=0; inHash; i++){ + PgHdr1 *pPage; + PgHdr1 *pNext = p->apHash[i]; + while( (pPage = pNext)!=0 ){ + unsigned int h = pPage->iKey % nNew; + pNext = pPage->pNext; + pPage->pNext = apNew[h]; + apNew[h] = pPage; + } + } + sqlite3_free(p->apHash); + p->apHash = apNew; + p->nHash = nNew; + } +} + +/* +** This function is used internally to remove the page pPage from the +** PGroup LRU list, if is part of it. If pPage is not part of the PGroup +** LRU list, then this function is a no-op. +** +** The PGroup mutex must be held when this function is called. +*/ +static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ + assert( pPage!=0 ); + assert( PAGE_IS_UNPINNED(pPage) ); + assert( pPage->pLruNext ); + assert( pPage->pLruPrev ); + assert( sqlite3_mutex_held(pPage->pCache->pGroup->mutex) ); + pPage->pLruPrev->pLruNext = pPage->pLruNext; + pPage->pLruNext->pLruPrev = pPage->pLruPrev; + pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev as it is never accessed if pLruNext is 0 */ + assert( pPage->isAnchor==0 ); + assert( pPage->pCache->pGroup->lru.isAnchor==1 ); + pPage->pCache->nRecyclable--; + return pPage; +} + + +/* +** Remove the page supplied as an argument from the hash table +** (PCache1.apHash structure) that it is currently stored in. +** Also free the page if freePage is true. +** +** The PGroup mutex must be held when this function is called. +*/ +static void pcache1RemoveFromHash(PgHdr1 *pPage, int freeFlag){ + unsigned int h; + PCache1 *pCache = pPage->pCache; + PgHdr1 **pp; + + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + h = pPage->iKey % pCache->nHash; + for(pp=&pCache->apHash[h]; (*pp)!=pPage; pp=&(*pp)->pNext); + *pp = (*pp)->pNext; + + pCache->nPage--; + if( freeFlag ) pcache1FreePage(pPage); +} + +/* +** If there are currently more than nMaxPage pages allocated, try +** to recycle pages to reduce the number allocated to nMaxPage. +*/ +static void pcache1EnforceMaxPage(PCache1 *pCache){ + PGroup *pGroup = pCache->pGroup; + PgHdr1 *p; + assert( sqlite3_mutex_held(pGroup->mutex) ); + while( pGroup->nPurgeable>pGroup->nMaxPage + && (p=pGroup->lru.pLruPrev)->isAnchor==0 + ){ + assert( p->pCache->pGroup==pGroup ); + assert( PAGE_IS_UNPINNED(p) ); + pcache1PinPage(p); + pcache1RemoveFromHash(p, 1); + } + if( pCache->nPage==0 && pCache->pBulk ){ + sqlite3_free(pCache->pBulk); + pCache->pBulk = pCache->pFree = 0; + } +} + +/* +** Discard all pages from cache pCache with a page number (key value) +** greater than or equal to iLimit. Any pinned pages that meet this +** criteria are unpinned before they are discarded. +** +** The PCache mutex must be held when this function is called. +*/ +static void pcache1TruncateUnsafe( + PCache1 *pCache, /* The cache to truncate */ + unsigned int iLimit /* Drop pages with this pgno or larger */ +){ + TESTONLY( int nPage = 0; ) /* To assert pCache->nPage is correct */ + unsigned int h, iStop; + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + assert( pCache->iMaxKey >= iLimit ); + assert( pCache->nHash > 0 ); + if( pCache->iMaxKey - iLimit < pCache->nHash ){ + /* If we are just shaving the last few pages off the end of the + ** cache, then there is no point in scanning the entire hash table. + ** Only scan those hash slots that might contain pages that need to + ** be removed. */ + h = iLimit % pCache->nHash; + iStop = pCache->iMaxKey % pCache->nHash; + TESTONLY( nPage = -10; ) /* Disable the pCache->nPage validity check */ + }else{ + /* This is the general case where many pages are being removed. + ** It is necessary to scan the entire hash table */ + h = pCache->nHash/2; + iStop = h - 1; + } + for(;;){ + PgHdr1 **pp; + PgHdr1 *pPage; + assert( hnHash ); + pp = &pCache->apHash[h]; + while( (pPage = *pp)!=0 ){ + if( pPage->iKey>=iLimit ){ + pCache->nPage--; + *pp = pPage->pNext; + if( PAGE_IS_UNPINNED(pPage) ) pcache1PinPage(pPage); + pcache1FreePage(pPage); + }else{ + pp = &pPage->pNext; + TESTONLY( if( nPage>=0 ) nPage++; ) + } + } + if( h==iStop ) break; + h = (h+1) % pCache->nHash; + } + assert( nPage<0 || pCache->nPage==(unsigned)nPage ); +} + +/******************************************************************************/ +/******** sqlite3_pcache Methods **********************************************/ + +/* +** Implementation of the sqlite3_pcache.xInit method. +*/ +static int pcache1Init(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( pcache1.isInit==0 ); + memset(&pcache1, 0, sizeof(pcache1)); + + + /* + ** The pcache1.separateCache variable is true if each PCache has its own + ** private PGroup (mode-1). pcache1.separateCache is false if the single + ** PGroup in pcache1.grp is used for all page caches (mode-2). + ** + ** * Always use a unified cache (mode-2) if ENABLE_MEMORY_MANAGEMENT + ** + ** * Use a unified cache in single-threaded applications that have + ** configured a start-time buffer for use as page-cache memory using + ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N) with non-NULL + ** pBuf argument. + ** + ** * Otherwise use separate caches (mode-1) + */ +#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) + pcache1.separateCache = 0; +#elif SQLITE_THREADSAFE + pcache1.separateCache = sqlite3GlobalConfig.pPage==0 + || sqlite3GlobalConfig.bCoreMutex>0; +#else + pcache1.separateCache = sqlite3GlobalConfig.pPage==0; +#endif + +#if SQLITE_THREADSAFE + if( sqlite3GlobalConfig.bCoreMutex ){ + pcache1.grp.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_LRU); + pcache1.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PMEM); + } +#endif + if( pcache1.separateCache + && sqlite3GlobalConfig.nPage!=0 + && sqlite3GlobalConfig.pPage==0 + ){ + pcache1.nInitPage = sqlite3GlobalConfig.nPage; + }else{ + pcache1.nInitPage = 0; + } + pcache1.grp.mxPinned = 10; + pcache1.isInit = 1; + return SQLITE_OK; +} + +/* +** Implementation of the sqlite3_pcache.xShutdown method. +** Note that the static mutex allocated in xInit does +** not need to be freed. +*/ +static void pcache1Shutdown(void *NotUsed){ + UNUSED_PARAMETER(NotUsed); + assert( pcache1.isInit!=0 ); + memset(&pcache1, 0, sizeof(pcache1)); +} + +/* forward declaration */ +static void pcache1Destroy(sqlite3_pcache *p); + +/* +** Implementation of the sqlite3_pcache.xCreate method. +** +** Allocate a new cache. +*/ +static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ + PCache1 *pCache; /* The newly created page cache */ + PGroup *pGroup; /* The group the new page cache will belong to */ + int sz; /* Bytes of memory required to allocate the new cache */ + + assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 ); + assert( szExtra < 300 ); + + sz = sizeof(PCache1) + sizeof(PGroup)*pcache1.separateCache; + pCache = (PCache1 *)sqlite3MallocZero(sz); + if( pCache ){ + if( pcache1.separateCache ){ + pGroup = (PGroup*)&pCache[1]; + pGroup->mxPinned = 10; + }else{ + pGroup = &pcache1.grp; + } + pcache1EnterMutex(pGroup); + if( pGroup->lru.isAnchor==0 ){ + pGroup->lru.isAnchor = 1; + pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; + } + pCache->pGroup = pGroup; + pCache->szPage = szPage; + pCache->szExtra = szExtra; + pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); + pCache->bPurgeable = (bPurgeable ? 1 : 0); + pcache1ResizeHash(pCache); + if( bPurgeable ){ + pCache->nMin = 10; + pGroup->nMinPage += pCache->nMin; + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pCache->pnPurgeable = &pGroup->nPurgeable; + }else{ + pCache->pnPurgeable = &pCache->nPurgeableDummy; + } + pcache1LeaveMutex(pGroup); + if( pCache->nHash==0 ){ + pcache1Destroy((sqlite3_pcache*)pCache); + pCache = 0; + } + } + return (sqlite3_pcache *)pCache; +} + +/* +** Implementation of the sqlite3_pcache.xCachesize method. +** +** Configure the cache_size limit for a cache. +*/ +static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ + PCache1 *pCache = (PCache1 *)p; + u32 n; + assert( nMax>=0 ); + if( pCache->bPurgeable ){ + PGroup *pGroup = pCache->pGroup; + pcache1EnterMutex(pGroup); + n = (u32)nMax; + if( n > 0x7fff0000 - pGroup->nMaxPage + pCache->nMax ){ + n = 0x7fff0000 - pGroup->nMaxPage + pCache->nMax; + } + pGroup->nMaxPage += (n - pCache->nMax); + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pCache->nMax = n; + pCache->n90pct = pCache->nMax*9/10; + pcache1EnforceMaxPage(pCache); + pcache1LeaveMutex(pGroup); + } +} + +/* +** Implementation of the sqlite3_pcache.xShrink method. +** +** Free up as much memory as possible. +*/ +static void pcache1Shrink(sqlite3_pcache *p){ + PCache1 *pCache = (PCache1*)p; + if( pCache->bPurgeable ){ + PGroup *pGroup = pCache->pGroup; + unsigned int savedMaxPage; + pcache1EnterMutex(pGroup); + savedMaxPage = pGroup->nMaxPage; + pGroup->nMaxPage = 0; + pcache1EnforceMaxPage(pCache); + pGroup->nMaxPage = savedMaxPage; + pcache1LeaveMutex(pGroup); + } +} + +/* +** Implementation of the sqlite3_pcache.xPagecount method. +*/ +static int pcache1Pagecount(sqlite3_pcache *p){ + int n; + PCache1 *pCache = (PCache1*)p; + pcache1EnterMutex(pCache->pGroup); + n = pCache->nPage; + pcache1LeaveMutex(pCache->pGroup); + return n; +} + + +/* +** Implement steps 3, 4, and 5 of the pcache1Fetch() algorithm described +** in the header of the pcache1Fetch() procedure. +** +** This steps are broken out into a separate procedure because they are +** usually not needed, and by avoiding the stack initialization required +** for these steps, the main pcache1Fetch() procedure can run faster. +*/ +static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( + PCache1 *pCache, + unsigned int iKey, + int createFlag +){ + unsigned int nPinned; + PGroup *pGroup = pCache->pGroup; + PgHdr1 *pPage = 0; + + /* Step 3: Abort if createFlag is 1 but the cache is nearly full */ + assert( pCache->nPage >= pCache->nRecyclable ); + nPinned = pCache->nPage - pCache->nRecyclable; + assert( pGroup->mxPinned == pGroup->nMaxPage + 10 - pGroup->nMinPage ); + assert( pCache->n90pct == pCache->nMax*9/10 ); + if( createFlag==1 && ( + nPinned>=pGroup->mxPinned + || nPinned>=pCache->n90pct + || (pcache1UnderMemoryPressure(pCache) && pCache->nRecyclablenPage>=pCache->nHash ) pcache1ResizeHash(pCache); + assert( pCache->nHash>0 && pCache->apHash ); + + /* Step 4. Try to recycle a page. */ + if( pCache->bPurgeable + && !pGroup->lru.pLruPrev->isAnchor + && ((pCache->nPage+1>=pCache->nMax) || pcache1UnderMemoryPressure(pCache)) + ){ + PCache1 *pOther; + pPage = pGroup->lru.pLruPrev; + assert( PAGE_IS_UNPINNED(pPage) ); + pcache1RemoveFromHash(pPage, 0); + pcache1PinPage(pPage); + pOther = pPage->pCache; + if( pOther->szAlloc != pCache->szAlloc ){ + pcache1FreePage(pPage); + pPage = 0; + }else{ + pGroup->nPurgeable -= (pOther->bPurgeable - pCache->bPurgeable); + } + } + + /* Step 5. If a usable page buffer has still not been found, + ** attempt to allocate a new one. + */ + if( !pPage ){ + pPage = pcache1AllocPage(pCache, createFlag==1); + } + + if( pPage ){ + unsigned int h = iKey % pCache->nHash; + pCache->nPage++; + pPage->iKey = iKey; + pPage->pNext = pCache->apHash[h]; + pPage->pCache = pCache; + pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ + *(void **)pPage->page.pExtra = 0; + pCache->apHash[h] = pPage; + if( iKey>pCache->iMaxKey ){ + pCache->iMaxKey = iKey; + } + } + return pPage; +} + +/* +** Implementation of the sqlite3_pcache.xFetch method. +** +** Fetch a page by key value. +** +** Whether or not a new page may be allocated by this function depends on +** the value of the createFlag argument. 0 means do not allocate a new +** page. 1 means allocate a new page if space is easily available. 2 +** means to try really hard to allocate a new page. +** +** For a non-purgeable cache (a cache used as the storage for an in-memory +** database) there is really no difference between createFlag 1 and 2. So +** the calling function (pcache.c) will never have a createFlag of 1 on +** a non-purgeable cache. +** +** There are three different approaches to obtaining space for a page, +** depending on the value of parameter createFlag (which may be 0, 1 or 2). +** +** 1. Regardless of the value of createFlag, the cache is searched for a +** copy of the requested page. If one is found, it is returned. +** +** 2. If createFlag==0 and the page is not already in the cache, NULL is +** returned. +** +** 3. If createFlag is 1, and the page is not already in the cache, then +** return NULL (do not allocate a new page) if any of the following +** conditions are true: +** +** (a) the number of pages pinned by the cache is greater than +** PCache1.nMax, or +** +** (b) the number of pages pinned by the cache is greater than +** the sum of nMax for all purgeable caches, less the sum of +** nMin for all other purgeable caches, or +** +** 4. If none of the first three conditions apply and the cache is marked +** as purgeable, and if one of the following is true: +** +** (a) The number of pages allocated for the cache is already +** PCache1.nMax, or +** +** (b) The number of pages allocated for all purgeable caches is +** already equal to or greater than the sum of nMax for all +** purgeable caches, +** +** (c) The system is under memory pressure and wants to avoid +** unnecessary pages cache entry allocations +** +** then attempt to recycle a page from the LRU list. If it is the right +** size, return the recycled buffer. Otherwise, free the buffer and +** proceed to step 5. +** +** 5. Otherwise, allocate and return a new page buffer. +** +** There are two versions of this routine. pcache1FetchWithMutex() is +** the general case. pcache1FetchNoMutex() is a faster implementation for +** the common case where pGroup->mutex is NULL. The pcache1Fetch() wrapper +** invokes the appropriate routine. +*/ +static PgHdr1 *pcache1FetchNoMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = 0; + + /* Step 1: Search the hash table for an existing entry. */ + pPage = pCache->apHash[iKey % pCache->nHash]; + while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; } + + /* Step 2: If the page was found in the hash table, then return it. + ** If the page was not in the hash table and createFlag is 0, abort. + ** Otherwise (page not in hash and createFlag!=0) continue with + ** subsequent steps to try to create the page. */ + if( pPage ){ + if( PAGE_IS_UNPINNED(pPage) ){ + return pcache1PinPage(pPage); + }else{ + return pPage; + } + }else if( createFlag ){ + /* Steps 3, 4, and 5 implemented by this subroutine */ + return pcache1FetchStage2(pCache, iKey, createFlag); + }else{ + return 0; + } +} +#if PCACHE1_MIGHT_USE_GROUP_MUTEX +static PgHdr1 *pcache1FetchWithMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage; + + pcache1EnterMutex(pCache->pGroup); + pPage = pcache1FetchNoMutex(p, iKey, createFlag); + assert( pPage==0 || pCache->iMaxKey>=iKey ); + pcache1LeaveMutex(pCache->pGroup); + return pPage; +} +#endif +static sqlite3_pcache_page *pcache1Fetch( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ +#if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG) + PCache1 *pCache = (PCache1 *)p; +#endif + + assert( offsetof(PgHdr1,page)==0 ); + assert( pCache->bPurgeable || createFlag!=1 ); + assert( pCache->bPurgeable || pCache->nMin==0 ); + assert( pCache->bPurgeable==0 || pCache->nMin==10 ); + assert( pCache->nMin==0 || pCache->bPurgeable ); + assert( pCache->nHash>0 ); +#if PCACHE1_MIGHT_USE_GROUP_MUTEX + if( pCache->pGroup->mutex ){ + return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); + }else +#endif + { + return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag); + } +} + + +/* +** Implementation of the sqlite3_pcache.xUnpin method. +** +** Mark a page as unpinned (eligible for asynchronous recycling). +*/ +static void pcache1Unpin( + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, + int reuseUnlikely +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = (PgHdr1 *)pPg; + PGroup *pGroup = pCache->pGroup; + + assert( pPage->pCache==pCache ); + pcache1EnterMutex(pGroup); + + /* It is an error to call this function if the page is already + ** part of the PGroup LRU list. + */ + assert( pPage->pLruNext==0 ); + assert( PAGE_IS_PINNED(pPage) ); + + if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ + pcache1RemoveFromHash(pPage, 1); + }else{ + /* Add the page to the PGroup LRU list. */ + PgHdr1 **ppFirst = &pGroup->lru.pLruNext; + pPage->pLruPrev = &pGroup->lru; + (pPage->pLruNext = *ppFirst)->pLruPrev = pPage; + *ppFirst = pPage; + pCache->nRecyclable++; + } + + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xRekey method. +*/ +static void pcache1Rekey( + sqlite3_pcache *p, + sqlite3_pcache_page *pPg, + unsigned int iOld, + unsigned int iNew +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage = (PgHdr1 *)pPg; + PgHdr1 **pp; + unsigned int h; + assert( pPage->iKey==iOld ); + assert( pPage->pCache==pCache ); + + pcache1EnterMutex(pCache->pGroup); + + h = iOld%pCache->nHash; + pp = &pCache->apHash[h]; + while( (*pp)!=pPage ){ + pp = &(*pp)->pNext; + } + *pp = pPage->pNext; + + h = iNew%pCache->nHash; + pPage->iKey = iNew; + pPage->pNext = pCache->apHash[h]; + pCache->apHash[h] = pPage; + if( iNew>pCache->iMaxKey ){ + pCache->iMaxKey = iNew; + } + + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xTruncate method. +** +** Discard all unpinned pages in the cache with a page number equal to +** or greater than parameter iLimit. Any pinned pages with a page number +** equal to or greater than iLimit are implicitly unpinned. +*/ +static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){ + PCache1 *pCache = (PCache1 *)p; + pcache1EnterMutex(pCache->pGroup); + if( iLimit<=pCache->iMaxKey ){ + pcache1TruncateUnsafe(pCache, iLimit); + pCache->iMaxKey = iLimit-1; + } + pcache1LeaveMutex(pCache->pGroup); +} + +/* +** Implementation of the sqlite3_pcache.xDestroy method. +** +** Destroy a cache allocated using pcache1Create(). +*/ +static void pcache1Destroy(sqlite3_pcache *p){ + PCache1 *pCache = (PCache1 *)p; + PGroup *pGroup = pCache->pGroup; + assert( pCache->bPurgeable || (pCache->nMax==0 && pCache->nMin==0) ); + pcache1EnterMutex(pGroup); + if( pCache->nPage ) pcache1TruncateUnsafe(pCache, 0); + assert( pGroup->nMaxPage >= pCache->nMax ); + pGroup->nMaxPage -= pCache->nMax; + assert( pGroup->nMinPage >= pCache->nMin ); + pGroup->nMinPage -= pCache->nMin; + pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pcache1EnforceMaxPage(pCache); + pcache1LeaveMutex(pGroup); + sqlite3_free(pCache->pBulk); + sqlite3_free(pCache->apHash); + sqlite3_free(pCache); +} + +/* +** This function is called during initialization (sqlite3_initialize()) to +** install the default pluggable cache module, assuming the user has not +** already provided an alternative. +*/ +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ + static const sqlite3_pcache_methods2 defaultMethods = { + 1, /* iVersion */ + 0, /* pArg */ + pcache1Init, /* xInit */ + pcache1Shutdown, /* xShutdown */ + pcache1Create, /* xCreate */ + pcache1Cachesize, /* xCachesize */ + pcache1Pagecount, /* xPagecount */ + pcache1Fetch, /* xFetch */ + pcache1Unpin, /* xUnpin */ + pcache1Rekey, /* xRekey */ + pcache1Truncate, /* xTruncate */ + pcache1Destroy, /* xDestroy */ + pcache1Shrink /* xShrink */ + }; + sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultMethods); +} + +/* +** Return the size of the header on each page of this PCACHE implementation. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void){ return ROUND8(sizeof(PgHdr1)); } + +/* +** Return the global mutex used by this PCACHE implementation. The +** sqlite3_status() routine needs access to this mutex. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void){ + return pcache1.mutex; +} + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* +** This function is called to free superfluous dynamically allocated memory +** held by the pager system. Memory in use by any SQLite pager allocated +** by the current thread may be sqlite3_free()ed. +** +** nReq is the number of bytes of memory required. Once this much has +** been released, the function returns. The return value is the total number +** of bytes of memory released. +*/ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ + int nFree = 0; + assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); + assert( sqlite3_mutex_notheld(pcache1.mutex) ); + if( sqlite3GlobalConfig.pPage==0 ){ + PgHdr1 *p; + pcache1EnterMutex(&pcache1.grp); + while( (nReq<0 || nFreeisAnchor==0 + ){ + nFree += pcache1MemSize(p->page.pBuf); +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + nFree += sqlite3MemSize(p); +#endif + assert( PAGE_IS_UNPINNED(p) ); + pcache1PinPage(p); + pcache1RemoveFromHash(p, 1); + } + pcache1LeaveMutex(&pcache1.grp); + } + return nFree; +} +#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */ + +#ifdef SQLITE_TEST +/* +** This function is used by test procedures to inspect the internal state +** of the global cache. +*/ +SQLITE_PRIVATE void sqlite3PcacheStats( + int *pnCurrent, /* OUT: Total number of pages cached */ + int *pnMax, /* OUT: Global maximum cache size */ + int *pnMin, /* OUT: Sum of PCache1.nMin for purgeable caches */ + int *pnRecyclable /* OUT: Total number of pages available for recycling */ +){ + PgHdr1 *p; + int nRecyclable = 0; + for(p=pcache1.grp.lru.pLruNext; p && !p->isAnchor; p=p->pLruNext){ + assert( PAGE_IS_UNPINNED(p) ); + nRecyclable++; + } + *pnCurrent = pcache1.grp.nPurgeable; + *pnMax = (int)pcache1.grp.nMaxPage; + *pnMin = (int)pcache1.grp.nMinPage; + *pnRecyclable = nRecyclable; +} +#endif + +/************** End of pcache1.c *********************************************/ +/************** Begin file rowset.c ******************************************/ +/* +** 2008 December 3 +** +** 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 module implements an object we call a "RowSet". +** +** The RowSet object is a collection of rowids. Rowids +** are inserted into the RowSet in an arbitrary order. Inserts +** can be intermixed with tests to see if a given rowid has been +** previously inserted into the RowSet. +** +** After all inserts are finished, it is possible to extract the +** elements of the RowSet in sorted order. Once this extraction +** process has started, no new elements may be inserted. +** +** Hence, the primitive operations for a RowSet are: +** +** CREATE +** INSERT +** TEST +** SMALLEST +** DESTROY +** +** The CREATE and DESTROY primitives are the constructor and destructor, +** obviously. The INSERT primitive adds a new element to the RowSet. +** TEST checks to see if an element is already in the RowSet. SMALLEST +** extracts the least value from the RowSet. +** +** The INSERT primitive might allocate additional memory. Memory is +** allocated in chunks so most INSERTs do no allocation. There is an +** upper bound on the size of allocated memory. No memory is freed +** until DESTROY. +** +** The TEST primitive includes a "batch" number. The TEST primitive +** will only see elements that were inserted before the last change +** in the batch number. In other words, if an INSERT occurs between +** two TESTs where the TESTs have the same batch nubmer, then the +** value added by the INSERT will not be visible to the second TEST. +** The initial batch number is zero, so if the very first TEST contains +** a non-zero batch number, it will see all prior INSERTs. +** +** No INSERTs may occurs after a SMALLEST. An assertion will fail if +** that is attempted. +** +** The cost of an INSERT is roughly constant. (Sometimes new memory +** has to be allocated on an INSERT.) The cost of a TEST with a new +** batch number is O(NlogN) where N is the number of elements in the RowSet. +** The cost of a TEST using the same batch number is O(logN). The cost +** of the first SMALLEST is O(NlogN). Second and subsequent SMALLEST +** primitives are constant time. The cost of DESTROY is O(N). +** +** TEST and SMALLEST may not be used by the same RowSet. This used to +** be possible, but the feature was not used, so it was removed in order +** to simplify the code. +*/ +/* #include "sqliteInt.h" */ + + +/* +** Target size for allocation chunks. +*/ +#define ROWSET_ALLOCATION_SIZE 1024 + +/* +** The number of rowset entries per allocation chunk. +*/ +#define ROWSET_ENTRY_PER_CHUNK \ + ((ROWSET_ALLOCATION_SIZE-8)/sizeof(struct RowSetEntry)) + +/* +** Each entry in a RowSet is an instance of the following object. +** +** This same object is reused to store a linked list of trees of RowSetEntry +** objects. In that alternative use, pRight points to the next entry +** in the list, pLeft points to the tree, and v is unused. The +** RowSet.pForest value points to the head of this forest list. +*/ +struct RowSetEntry { + i64 v; /* ROWID value for this entry */ + struct RowSetEntry *pRight; /* Right subtree (larger entries) or list */ + struct RowSetEntry *pLeft; /* Left subtree (smaller entries) */ +}; + +/* +** RowSetEntry objects are allocated in large chunks (instances of the +** following structure) to reduce memory allocation overhead. The +** chunks are kept on a linked list so that they can be deallocated +** when the RowSet is destroyed. +*/ +struct RowSetChunk { + struct RowSetChunk *pNextChunk; /* Next chunk on list of them all */ + struct RowSetEntry aEntry[ROWSET_ENTRY_PER_CHUNK]; /* Allocated entries */ +}; + +/* +** A RowSet in an instance of the following structure. +** +** A typedef of this structure if found in sqliteInt.h. +*/ +struct RowSet { + struct RowSetChunk *pChunk; /* List of all chunk allocations */ + sqlite3 *db; /* The database connection */ + struct RowSetEntry *pEntry; /* List of entries using pRight */ + struct RowSetEntry *pLast; /* Last entry on the pEntry list */ + struct RowSetEntry *pFresh; /* Source of new entry objects */ + struct RowSetEntry *pForest; /* List of binary trees of entries */ + u16 nFresh; /* Number of objects on pFresh */ + u16 rsFlags; /* Various flags */ + int iBatch; /* Current insert batch */ +}; + +/* +** Allowed values for RowSet.rsFlags +*/ +#define ROWSET_SORTED 0x01 /* True if RowSet.pEntry is sorted */ +#define ROWSET_NEXT 0x02 /* True if sqlite3RowSetNext() has been called */ + +/* +** Allocate a RowSet object. Return NULL if a memory allocation +** error occurs. +*/ +SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db){ + RowSet *p = sqlite3DbMallocRawNN(db, sizeof(*p)); + if( p ){ + int N = sqlite3DbMallocSize(db, p); + p->pChunk = 0; + p->db = db; + p->pEntry = 0; + p->pLast = 0; + p->pForest = 0; + p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p); + p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry)); + p->rsFlags = ROWSET_SORTED; + p->iBatch = 0; + } + return p; +} + +/* +** Deallocate all chunks from a RowSet. This frees all memory that +** the RowSet has allocated over its lifetime. This routine is +** the destructor for the RowSet. +*/ +SQLITE_PRIVATE void sqlite3RowSetClear(void *pArg){ + RowSet *p = (RowSet*)pArg; + struct RowSetChunk *pChunk, *pNextChunk; + for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){ + pNextChunk = pChunk->pNextChunk; + sqlite3DbFree(p->db, pChunk); + } + p->pChunk = 0; + p->nFresh = 0; + p->pEntry = 0; + p->pLast = 0; + p->pForest = 0; + p->rsFlags = ROWSET_SORTED; +} + +/* +** Deallocate all chunks from a RowSet. This frees all memory that +** the RowSet has allocated over its lifetime. This routine is +** the destructor for the RowSet. +*/ +SQLITE_PRIVATE void sqlite3RowSetDelete(void *pArg){ + sqlite3RowSetClear(pArg); + sqlite3DbFree(((RowSet*)pArg)->db, pArg); +} + +/* +** Allocate a new RowSetEntry object that is associated with the +** given RowSet. Return a pointer to the new and completely uninitialized +** object. +** +** In an OOM situation, the RowSet.db->mallocFailed flag is set and this +** routine returns NULL. +*/ +static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){ + assert( p!=0 ); + if( p->nFresh==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* We could allocate a fresh RowSetEntry each time one is needed, but it + ** is more efficient to pull a preallocated entry from the pool */ + struct RowSetChunk *pNew; + pNew = sqlite3DbMallocRawNN(p->db, sizeof(*pNew)); + if( pNew==0 ){ + return 0; + } + pNew->pNextChunk = p->pChunk; + p->pChunk = pNew; + p->pFresh = pNew->aEntry; + p->nFresh = ROWSET_ENTRY_PER_CHUNK; + } + p->nFresh--; + return p->pFresh++; +} + +/* +** Insert a new value into a RowSet. +** +** The mallocFailed flag of the database connection is set if a +** memory allocation fails. +*/ +SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ + struct RowSetEntry *pEntry; /* The new entry */ + struct RowSetEntry *pLast; /* The last prior entry */ + + /* This routine is never called after sqlite3RowSetNext() */ + assert( p!=0 && (p->rsFlags & ROWSET_NEXT)==0 ); + + pEntry = rowSetEntryAlloc(p); + if( pEntry==0 ) return; + pEntry->v = rowid; + pEntry->pRight = 0; + pLast = p->pLast; + if( pLast ){ + if( rowid<=pLast->v ){ /*OPTIMIZATION-IF-FALSE*/ + /* Avoid unnecessary sorts by preserving the ROWSET_SORTED flags + ** where possible */ + p->rsFlags &= ~ROWSET_SORTED; + } + pLast->pRight = pEntry; + }else{ + p->pEntry = pEntry; + } + p->pLast = pEntry; +} + +/* +** Merge two lists of RowSetEntry objects. Remove duplicates. +** +** The input lists are connected via pRight pointers and are +** assumed to each already be in sorted order. +*/ +static struct RowSetEntry *rowSetEntryMerge( + struct RowSetEntry *pA, /* First sorted list to be merged */ + struct RowSetEntry *pB /* Second sorted list to be merged */ +){ + struct RowSetEntry head; + struct RowSetEntry *pTail; + + pTail = &head; + assert( pA!=0 && pB!=0 ); + for(;;){ + assert( pA->pRight==0 || pA->v<=pA->pRight->v ); + assert( pB->pRight==0 || pB->v<=pB->pRight->v ); + if( pA->v<=pB->v ){ + if( pA->vv ) pTail = pTail->pRight = pA; + pA = pA->pRight; + if( pA==0 ){ + pTail->pRight = pB; + break; + } + }else{ + pTail = pTail->pRight = pB; + pB = pB->pRight; + if( pB==0 ){ + pTail->pRight = pA; + break; + } + } + } + return head.pRight; +} + +/* +** Sort all elements on the list of RowSetEntry objects into order of +** increasing v. +*/ +static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ + unsigned int i; + struct RowSetEntry *pNext, *aBucket[40]; + + memset(aBucket, 0, sizeof(aBucket)); + while( pIn ){ + pNext = pIn->pRight; + pIn->pRight = 0; + for(i=0; aBucket[i]; i++){ + pIn = rowSetEntryMerge(aBucket[i], pIn); + aBucket[i] = 0; + } + aBucket[i] = pIn; + pIn = pNext; + } + pIn = aBucket[0]; + for(i=1; ipLeft ){ + struct RowSetEntry *p; + rowSetTreeToList(pIn->pLeft, ppFirst, &p); + p->pRight = pIn; + }else{ + *ppFirst = pIn; + } + if( pIn->pRight ){ + rowSetTreeToList(pIn->pRight, &pIn->pRight, ppLast); + }else{ + *ppLast = pIn; + } + assert( (*ppLast)->pRight==0 ); +} + + +/* +** Convert a sorted list of elements (connected by pRight) into a binary +** tree with depth of iDepth. A depth of 1 means the tree contains a single +** node taken from the head of *ppList. A depth of 2 means a tree with +** three nodes. And so forth. +** +** Use as many entries from the input list as required and update the +** *ppList to point to the unused elements of the list. If the input +** list contains too few elements, then construct an incomplete tree +** and leave *ppList set to NULL. +** +** Return a pointer to the root of the constructed binary tree. +*/ +static struct RowSetEntry *rowSetNDeepTree( + struct RowSetEntry **ppList, + int iDepth +){ + struct RowSetEntry *p; /* Root of the new tree */ + struct RowSetEntry *pLeft; /* Left subtree */ + if( *ppList==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Prevent unnecessary deep recursion when we run out of entries */ + return 0; + } + if( iDepth>1 ){ /*OPTIMIZATION-IF-TRUE*/ + /* This branch causes a *balanced* tree to be generated. A valid tree + ** is still generated without this branch, but the tree is wildly + ** unbalanced and inefficient. */ + pLeft = rowSetNDeepTree(ppList, iDepth-1); + p = *ppList; + if( p==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* It is safe to always return here, but the resulting tree + ** would be unbalanced */ + return pLeft; + } + p->pLeft = pLeft; + *ppList = p->pRight; + p->pRight = rowSetNDeepTree(ppList, iDepth-1); + }else{ + p = *ppList; + *ppList = p->pRight; + p->pLeft = p->pRight = 0; + } + return p; +} + +/* +** Convert a sorted list of elements into a binary tree. Make the tree +** as deep as it needs to be in order to contain the entire list. +*/ +static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){ + int iDepth; /* Depth of the tree so far */ + struct RowSetEntry *p; /* Current tree root */ + struct RowSetEntry *pLeft; /* Left subtree */ + + assert( pList!=0 ); + p = pList; + pList = p->pRight; + p->pLeft = p->pRight = 0; + for(iDepth=1; pList; iDepth++){ + pLeft = p; + p = pList; + pList = p->pRight; + p->pLeft = pLeft; + p->pRight = rowSetNDeepTree(&pList, iDepth); + } + return p; +} + +/* +** Extract the smallest element from the RowSet. +** Write the element into *pRowid. Return 1 on success. Return +** 0 if the RowSet is already empty. +** +** After this routine has been called, the sqlite3RowSetInsert() +** routine may not be called again. +** +** This routine may not be called after sqlite3RowSetTest() has +** been used. Older versions of RowSet allowed that, but as the +** capability was not used by the code generator, it was removed +** for code economy. +*/ +SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){ + assert( p!=0 ); + assert( p->pForest==0 ); /* Cannot be used with sqlite3RowSetText() */ + + /* Merge the forest into a single sorted list on first call */ + if( (p->rsFlags & ROWSET_NEXT)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (p->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + p->pEntry = rowSetEntrySort(p->pEntry); + } + p->rsFlags |= ROWSET_SORTED|ROWSET_NEXT; + } + + /* Return the next entry on the list */ + if( p->pEntry ){ + *pRowid = p->pEntry->v; + p->pEntry = p->pEntry->pRight; + if( p->pEntry==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Free memory immediately, rather than waiting on sqlite3_finalize() */ + sqlite3RowSetClear(p); + } + return 1; + }else{ + return 0; + } +} + +/* +** Check to see if element iRowid was inserted into the rowset as +** part of any insert batch prior to iBatch. Return 1 or 0. +** +** If this is the first test of a new batch and if there exist entries +** on pRowSet->pEntry, then sort those entries into the forest at +** pRowSet->pForest so that they can be tested. +*/ +SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 iRowid){ + struct RowSetEntry *p, *pTree; + + /* This routine is never called after sqlite3RowSetNext() */ + assert( pRowSet!=0 && (pRowSet->rsFlags & ROWSET_NEXT)==0 ); + + /* Sort entries into the forest on the first test of a new batch. + ** To save unnecessary work, only do this when the batch number changes. + */ + if( iBatch!=pRowSet->iBatch ){ /*OPTIMIZATION-IF-FALSE*/ + p = pRowSet->pEntry; + if( p ){ + struct RowSetEntry **ppPrevTree = &pRowSet->pForest; + if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* Only sort the current set of entries if they need it */ + p = rowSetEntrySort(p); + } + for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ + ppPrevTree = &pTree->pRight; + if( pTree->pLeft==0 ){ + pTree->pLeft = rowSetListToTree(p); + break; + }else{ + struct RowSetEntry *pAux, *pTail; + rowSetTreeToList(pTree->pLeft, &pAux, &pTail); + pTree->pLeft = 0; + p = rowSetEntryMerge(pAux, p); + } + } + if( pTree==0 ){ + *ppPrevTree = pTree = rowSetEntryAlloc(pRowSet); + if( pTree ){ + pTree->v = 0; + pTree->pRight = 0; + pTree->pLeft = rowSetListToTree(p); + } + } + pRowSet->pEntry = 0; + pRowSet->pLast = 0; + pRowSet->rsFlags |= ROWSET_SORTED; + } + pRowSet->iBatch = iBatch; + } + + /* Test to see if the iRowid value appears anywhere in the forest. + ** Return 1 if it does and 0 if not. + */ + for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ + p = pTree->pLeft; + while( p ){ + if( p->vpRight; + }else if( p->v>iRowid ){ + p = p->pLeft; + }else{ + return 1; + } + } + } + return 0; +} + +/************** End of rowset.c **********************************************/ +/************** Begin file pager.c *******************************************/ +/* +** 2001 September 15 +** +** 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 is the implementation of the page cache subsystem or "pager". +** +** The pager is used to access a database disk file. It implements +** atomic commit and rollback through the use of a journal file that +** is separate from the database file. The pager also implements file +** locking to prevent two processes from writing the same database +** file simultaneously, or one process from reading the database while +** another is writing. +*/ +#ifndef SQLITE_OMIT_DISKIO +/* #include "sqliteInt.h" */ +/************** Include wal.h in the middle of pager.c ***********************/ +/************** Begin file wal.h *********************************************/ +/* +** 2010 February 1 +** +** 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 header file defines the interface to the write-ahead logging +** system. Refer to the comments below and the header comment attached to +** the implementation of each function in log.c for further details. +*/ + +#ifndef SQLITE_WAL_H +#define SQLITE_WAL_H + +/* #include "sqliteInt.h" */ + +/* Macros for extracting appropriate sync flags for either transaction +** commits (WAL_SYNC_FLAGS(X)) or for checkpoint ops (CKPT_SYNC_FLAGS(X)): +*/ +#define WAL_SYNC_FLAGS(X) ((X)&0x03) +#define CKPT_SYNC_FLAGS(X) (((X)>>2)&0x03) + +#ifdef SQLITE_OMIT_WAL +# define sqlite3WalOpen(x,y,z) 0 +# define sqlite3WalLimit(x,y) +# define sqlite3WalClose(v,w,x,y,z) 0 +# define sqlite3WalBeginReadTransaction(y,z) 0 +# define sqlite3WalEndReadTransaction(z) +# define sqlite3WalDbsize(y) 0 +# define sqlite3WalBeginWriteTransaction(y) 0 +# define sqlite3WalEndWriteTransaction(x) 0 +# define sqlite3WalUndo(x,y,z) 0 +# define sqlite3WalSavepoint(y,z) +# define sqlite3WalSavepointUndo(y,z) 0 +# define sqlite3WalFrames(u,v,w,x,y,z) 0 +# define sqlite3WalCheckpoint(q,r,s,t,u,v,w,x,y,z) 0 +# define sqlite3WalCallback(z) 0 +# define sqlite3WalExclusiveMode(y,z) 0 +# define sqlite3WalHeapMemory(z) 0 +# define sqlite3WalFramesize(z) 0 +# define sqlite3WalFindFrame(x,y,z) 0 +# define sqlite3WalFile(x) 0 +#else + +#define WAL_SAVEPOINT_NDATA 4 + +/* Connection to a write-ahead log (WAL) file. +** There is one object of this type for each pager. +*/ +typedef struct Wal Wal; + +/* Open and close a connection to a write-ahead log. */ +SQLITE_PRIVATE int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**); +SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, sqlite3*, int sync_flags, int, u8 *); + +/* Set the limiting size of a WAL file. */ +SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64); + +/* Used by readers to open (lock) and close (unlock) a snapshot. A +** snapshot is like a read-transaction. It is the state of the database +** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and +** preserves the current state even if the other threads or processes +** write to or checkpoint the WAL. sqlite3WalCloseSnapshot() closes the +** transaction and releases the lock. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *); +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal); + +/* Read a page from the write-ahead log, if it is present. */ +SQLITE_PRIVATE int sqlite3WalFindFrame(Wal *, Pgno, u32 *); +SQLITE_PRIVATE int sqlite3WalReadFrame(Wal *, u32, int, u8 *); + +/* If the WAL is not empty, return the size of the database. */ +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal); + +/* Obtain or release the WRITER lock. */ +SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal); +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal); + +/* Undo any frames written (but not committed) to the log */ +SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx); + +/* Return an integer that records the current (uncommitted) write +** position in the WAL */ +SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData); + +/* Move the write position of the WAL back to iFrame. Called in +** response to a ROLLBACK TO command. */ +SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData); + +/* Write a frame or frames to the log. */ +SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int); + +/* Copy pages from the log to the database file */ +SQLITE_PRIVATE int sqlite3WalCheckpoint( + Wal *pWal, /* Write-ahead log connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ + int eMode, /* One of PASSIVE, FULL and RESTART */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags to sync db file with (or 0) */ + int nBuf, /* Size of buffer nBuf */ + u8 *zBuf, /* Temporary buffer to use */ + int *pnLog, /* OUT: Number of frames in WAL */ + int *pnCkpt /* OUT: Number of backfilled frames in WAL */ +); + +/* Return the value to pass to a sqlite3_wal_hook callback, the +** number of frames in the WAL at the point of the last commit since +** sqlite3WalCallback() was called. If no commits have occurred since +** the last call, then return 0. +*/ +SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal); + +/* Tell the wal layer that an EXCLUSIVE lock has been obtained (or released) +** by the pager layer on the database file. +*/ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op); + +/* Return true if the argument is non-NULL and the WAL module is using +** heap-memory for the wal-index. Otherwise, if the argument is NULL or the +** WAL module is using shared-memory, return false. +*/ +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal); + +#ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal); +SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal); +#endif + +#ifdef SQLITE_ENABLE_ZIPVFS +/* If the WAL file is not empty, return the number of bytes of content +** stored in each frame (i.e. the db page-size when the WAL was created). +*/ +SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal); +#endif + +/* Return the sqlite3_file object for the WAL file */ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock); +SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db); +#endif + +#endif /* ifndef SQLITE_OMIT_WAL */ +#endif /* SQLITE_WAL_H */ + +/************** End of wal.h *************************************************/ +/************** Continuing where we left off in pager.c **********************/ + + +/******************* NOTES ON THE DESIGN OF THE PAGER ************************ +** +** This comment block describes invariants that hold when using a rollback +** journal. These invariants do not apply for journal_mode=WAL, +** journal_mode=MEMORY, or journal_mode=OFF. +** +** Within this comment block, a page is deemed to have been synced +** automatically as soon as it is written when PRAGMA synchronous=OFF. +** Otherwise, the page is not synced until the xSync method of the VFS +** is called successfully on the file containing the page. +** +** Definition: A page of the database file is said to be "overwriteable" if +** one or more of the following are true about the page: +** +** (a) The original content of the page as it was at the beginning of +** the transaction has been written into the rollback journal and +** synced. +** +** (b) The page was a freelist leaf page at the start of the transaction. +** +** (c) The page number is greater than the largest page that existed in +** the database file at the start of the transaction. +** +** (1) A page of the database file is never overwritten unless one of the +** following are true: +** +** (a) The page and all other pages on the same sector are overwriteable. +** +** (b) The atomic page write optimization is enabled, and the entire +** transaction other than the update of the transaction sequence +** number consists of a single page change. +** +** (2) The content of a page written into the rollback journal exactly matches +** both the content in the database when the rollback journal was written +** and the content in the database at the beginning of the current +** transaction. +** +** (3) Writes to the database file are an integer multiple of the page size +** in length and are aligned on a page boundary. +** +** (4) Reads from the database file are either aligned on a page boundary and +** an integer multiple of the page size in length or are taken from the +** first 100 bytes of the database file. +** +** (5) All writes to the database file are synced prior to the rollback journal +** being deleted, truncated, or zeroed. +** +** (6) If a super-journal file is used, then all writes to the database file +** are synced prior to the super-journal being deleted. +** +** Definition: Two databases (or the same database at two points it time) +** are said to be "logically equivalent" if they give the same answer to +** all queries. Note in particular the content of freelist leaf +** pages can be changed arbitrarily without affecting the logical equivalence +** of the database. +** +** (7) At any time, if any subset, including the empty set and the total set, +** of the unsynced changes to a rollback journal are removed and the +** journal is rolled back, the resulting database file will be logically +** equivalent to the database file at the beginning of the transaction. +** +** (8) When a transaction is rolled back, the xTruncate method of the VFS +** is called to restore the database file to the same size it was at +** the beginning of the transaction. (In some VFSes, the xTruncate +** method is a no-op, but that does not change the fact the SQLite will +** invoke it.) +** +** (9) Whenever the database file is modified, at least one bit in the range +** of bytes from 24 through 39 inclusive will be changed prior to releasing +** the EXCLUSIVE lock, thus signaling other connections on the same +** database to flush their caches. +** +** (10) The pattern of bits in bytes 24 through 39 shall not repeat in less +** than one billion transactions. +** +** (11) A database file is well-formed at the beginning and at the conclusion +** of every transaction. +** +** (12) An EXCLUSIVE lock is held on the database file when writing to +** the database file. +** +** (13) A SHARED lock is held on the database file while reading any +** content out of the database file. +** +******************************************************************************/ + +/* +** Macros for troubleshooting. Normally turned off +*/ +#if 0 +int sqlite3PagerTrace=1; /* True to enable tracing */ +#define sqlite3DebugPrintf printf +#define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; } +#else +#define PAGERTRACE(X) +#endif + +/* +** The following two macros are used within the PAGERTRACE() macros above +** to print out file-descriptors. +** +** PAGERID() takes a pointer to a Pager struct as its argument. The +** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file +** struct as its argument. +*/ +#define PAGERID(p) (SQLITE_PTR_TO_INT(p->fd)) +#define FILEHANDLEID(fd) (SQLITE_PTR_TO_INT(fd)) + +/* +** The Pager.eState variable stores the current 'state' of a pager. A +** pager may be in any one of the seven states shown in the following +** state diagram. +** +** OPEN <------+------+ +** | | | +** V | | +** +---------> READER-------+ | +** | | | +** | V | +** |<-------WRITER_LOCKED------> ERROR +** | | ^ +** | V | +** |<------WRITER_CACHEMOD-------->| +** | | | +** | V | +** |<-------WRITER_DBMOD---------->| +** | | | +** | V | +** +<------WRITER_FINISHED-------->+ +** +** +** List of state transitions and the C [function] that performs each: +** +** OPEN -> READER [sqlite3PagerSharedLock] +** READER -> OPEN [pager_unlock] +** +** READER -> WRITER_LOCKED [sqlite3PagerBegin] +** WRITER_LOCKED -> WRITER_CACHEMOD [pager_open_journal] +** WRITER_CACHEMOD -> WRITER_DBMOD [syncJournal] +** WRITER_DBMOD -> WRITER_FINISHED [sqlite3PagerCommitPhaseOne] +** WRITER_*** -> READER [pager_end_transaction] +** +** WRITER_*** -> ERROR [pager_error] +** ERROR -> OPEN [pager_unlock] +** +** +** OPEN: +** +** The pager starts up in this state. Nothing is guaranteed in this +** state - the file may or may not be locked and the database size is +** unknown. The database may not be read or written. +** +** * No read or write transaction is active. +** * Any lock, or no lock at all, may be held on the database file. +** * The dbSize, dbOrigSize and dbFileSize variables may not be trusted. +** +** READER: +** +** In this state all the requirements for reading the database in +** rollback (non-WAL) mode are met. Unless the pager is (or recently +** was) in exclusive-locking mode, a user-level read transaction is +** open. The database size is known in this state. +** +** A connection running with locking_mode=normal enters this state when +** it opens a read-transaction on the database and returns to state +** OPEN after the read-transaction is completed. However a connection +** running in locking_mode=exclusive (including temp databases) remains in +** this state even after the read-transaction is closed. The only way +** a locking_mode=exclusive connection can transition from READER to OPEN +** is via the ERROR state (see below). +** +** * A read transaction may be active (but a write-transaction cannot). +** * A SHARED or greater lock is held on the database file. +** * The dbSize variable may be trusted (even if a user-level read +** transaction is not active). The dbOrigSize and dbFileSize variables +** may not be trusted at this point. +** * If the database is a WAL database, then the WAL connection is open. +** * Even if a read-transaction is not open, it is guaranteed that +** there is no hot-journal in the file-system. +** +** WRITER_LOCKED: +** +** The pager moves to this state from READER when a write-transaction +** is first opened on the database. In WRITER_LOCKED state, all locks +** required to start a write-transaction are held, but no actual +** modifications to the cache or database have taken place. +** +** In rollback mode, a RESERVED or (if the transaction was opened with +** BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when +** moving to this state, but the journal file is not written to or opened +** to in this state. If the transaction is committed or rolled back while +** in WRITER_LOCKED state, all that is required is to unlock the database +** file. +** +** IN WAL mode, WalBeginWriteTransaction() is called to lock the log file. +** If the connection is running with locking_mode=exclusive, an attempt +** is made to obtain an EXCLUSIVE lock on the database file. +** +** * A write transaction is active. +** * If the connection is open in rollback-mode, a RESERVED or greater +** lock is held on the database file. +** * If the connection is open in WAL-mode, a WAL write transaction +** is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully +** called). +** * The dbSize, dbOrigSize and dbFileSize variables are all valid. +** * The contents of the pager cache have not been modified. +** * The journal file may or may not be open. +** * Nothing (not even the first header) has been written to the journal. +** +** WRITER_CACHEMOD: +** +** A pager moves from WRITER_LOCKED state to this state when a page is +** first modified by the upper layer. In rollback mode the journal file +** is opened (if it is not already open) and a header written to the +** start of it. The database file on disk has not been modified. +** +** * A write transaction is active. +** * A RESERVED or greater lock is held on the database file. +** * The journal file is open and the first header has been written +** to it, but the header has not been synced to disk. +** * The contents of the page cache have been modified. +** +** WRITER_DBMOD: +** +** The pager transitions from WRITER_CACHEMOD into WRITER_DBMOD state +** when it modifies the contents of the database file. WAL connections +** never enter this state (since they do not modify the database file, +** just the log file). +** +** * A write transaction is active. +** * An EXCLUSIVE or greater lock is held on the database file. +** * The journal file is open and the first header has been written +** and synced to disk. +** * The contents of the page cache have been modified (and possibly +** written to disk). +** +** WRITER_FINISHED: +** +** It is not possible for a WAL connection to enter this state. +** +** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD +** state after the entire transaction has been successfully written into the +** database file. In this state the transaction may be committed simply +** by finalizing the journal file. Once in WRITER_FINISHED state, it is +** not possible to modify the database further. At this point, the upper +** layer must either commit or rollback the transaction. +** +** * A write transaction is active. +** * An EXCLUSIVE or greater lock is held on the database file. +** * All writing and syncing of journal and database data has finished. +** If no error occurred, all that remains is to finalize the journal to +** commit the transaction. If an error did occur, the caller will need +** to rollback the transaction. +** +** ERROR: +** +** The ERROR state is entered when an IO or disk-full error (including +** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it +** difficult to be sure that the in-memory pager state (cache contents, +** db size etc.) are consistent with the contents of the file-system. +** +** Temporary pager files may enter the ERROR state, but in-memory pagers +** cannot. +** +** For example, if an IO error occurs while performing a rollback, +** the contents of the page-cache may be left in an inconsistent state. +** At this point it would be dangerous to change back to READER state +** (as usually happens after a rollback). Any subsequent readers might +** report database corruption (due to the inconsistent cache), and if +** they upgrade to writers, they may inadvertently corrupt the database +** file. To avoid this hazard, the pager switches into the ERROR state +** instead of READER following such an error. +** +** Once it has entered the ERROR state, any attempt to use the pager +** to read or write data returns an error. Eventually, once all +** outstanding transactions have been abandoned, the pager is able to +** transition back to OPEN state, discarding the contents of the +** page-cache and any other in-memory state at the same time. Everything +** is reloaded from disk (and, if necessary, hot-journal rollback peformed) +** when a read-transaction is next opened on the pager (transitioning +** the pager into READER state). At that point the system has recovered +** from the error. +** +** Specifically, the pager jumps into the ERROR state if: +** +** 1. An error occurs while attempting a rollback. This happens in +** function sqlite3PagerRollback(). +** +** 2. An error occurs while attempting to finalize a journal file +** following a commit in function sqlite3PagerCommitPhaseTwo(). +** +** 3. An error occurs while attempting to write to the journal or +** database file in function pagerStress() in order to free up +** memory. +** +** In other cases, the error is returned to the b-tree layer. The b-tree +** layer then attempts a rollback operation. If the error condition +** persists, the pager enters the ERROR state via condition (1) above. +** +** Condition (3) is necessary because it can be triggered by a read-only +** statement executed within a transaction. In this case, if the error +** code were simply returned to the user, the b-tree layer would not +** automatically attempt a rollback, as it assumes that an error in a +** read-only statement cannot leave the pager in an internally inconsistent +** state. +** +** * The Pager.errCode variable is set to something other than SQLITE_OK. +** * There are one or more outstanding references to pages (after the +** last reference is dropped the pager should move back to OPEN state). +** * The pager is not an in-memory pager. +** +** +** Notes: +** +** * A pager is never in WRITER_DBMOD or WRITER_FINISHED state if the +** connection is open in WAL mode. A WAL connection is always in one +** of the first four states. +** +** * Normally, a connection open in exclusive mode is never in PAGER_OPEN +** state. There are two exceptions: immediately after exclusive-mode has +** been turned on (and before any read or write transactions are +** executed), and when the pager is leaving the "error state". +** +** * See also: assert_pager_state(). +*/ +#define PAGER_OPEN 0 +#define PAGER_READER 1 +#define PAGER_WRITER_LOCKED 2 +#define PAGER_WRITER_CACHEMOD 3 +#define PAGER_WRITER_DBMOD 4 +#define PAGER_WRITER_FINISHED 5 +#define PAGER_ERROR 6 + +/* +** The Pager.eLock variable is almost always set to one of the +** following locking-states, according to the lock currently held on +** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. +** This variable is kept up to date as locks are taken and released by +** the pagerLockDb() and pagerUnlockDb() wrappers. +** +** If the VFS xLock() or xUnlock() returns an error other than SQLITE_BUSY +** (i.e. one of the SQLITE_IOERR subtypes), it is not clear whether or not +** the operation was successful. In these circumstances pagerLockDb() and +** pagerUnlockDb() take a conservative approach - eLock is always updated +** when unlocking the file, and only updated when locking the file if the +** VFS call is successful. This way, the Pager.eLock variable may be set +** to a less exclusive (lower) value than the lock that is actually held +** at the system level, but it is never set to a more exclusive value. +** +** This is usually safe. If an xUnlock fails or appears to fail, there may +** be a few redundant xLock() calls or a lock may be held for longer than +** required, but nothing really goes wrong. +** +** The exception is when the database file is unlocked as the pager moves +** from ERROR to OPEN state. At this point there may be a hot-journal file +** in the file-system that needs to be rolled back (as part of an OPEN->SHARED +** transition, by the same pager or any other). If the call to xUnlock() +** fails at this point and the pager is left holding an EXCLUSIVE lock, this +** can confuse the call to xCheckReservedLock() call made later as part +** of hot-journal detection. +** +** xCheckReservedLock() is defined as returning true "if there is a RESERVED +** lock held by this process or any others". So xCheckReservedLock may +** return true because the caller itself is holding an EXCLUSIVE lock (but +** doesn't know it because of a previous error in xUnlock). If this happens +** a hot-journal may be mistaken for a journal being created by an active +** transaction in another process, causing SQLite to read from the database +** without rolling it back. +** +** To work around this, if a call to xUnlock() fails when unlocking the +** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It +** is only changed back to a real locking state after a successful call +** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition +** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK +** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE +** lock on the database file before attempting to roll it back. See function +** PagerSharedLock() for more detail. +** +** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in +** PAGER_OPEN state. +*/ +#define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) + +/* +** A macro used for invoking the codec if there is one +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +# define CODEC1(P,D,N,X,E) \ + if( P->xCodec && P->xCodec(P->pCodec,D,N,X)==0 ){ E; } +# define CODEC2(P,D,N,X,E,O) \ + if( P->xCodec==0 ){ O=(char*)D; }else \ + if( (O=(char*)(P->xCodec(P->pCodec,D,N,X)))==0 ){ E; } +#else +# define CODEC1(P,D,N,X,E) /* NO-OP */ +# define CODEC2(P,D,N,X,E,O) O=(char*)D +#endif +/* END SQLCIPHER */ + +/* +** The maximum allowed sector size. 64KiB. If the xSectorsize() method +** returns a value larger than this, then MAX_SECTOR_SIZE is used instead. +** This could conceivably cause corruption following a power failure on +** such a system. This is currently an undocumented limit. +*/ +#define MAX_SECTOR_SIZE 0x10000 + + +/* +** An instance of the following structure is allocated for each active +** savepoint and statement transaction in the system. All such structures +** are stored in the Pager.aSavepoint[] array, which is allocated and +** resized using sqlite3Realloc(). +** +** When a savepoint is created, the PagerSavepoint.iHdrOffset field is +** set to 0. If a journal-header is written into the main journal while +** the savepoint is active, then iHdrOffset is set to the byte offset +** immediately following the last journal record written into the main +** journal before the journal-header. This is required during savepoint +** rollback (see pagerPlaybackSavepoint()). +*/ +typedef struct PagerSavepoint PagerSavepoint; +struct PagerSavepoint { + i64 iOffset; /* Starting offset in main journal */ + i64 iHdrOffset; /* See above */ + Bitvec *pInSavepoint; /* Set of pages in this savepoint */ + Pgno nOrig; /* Original number of pages in file */ + Pgno iSubRec; /* Index of first record in sub-journal */ + int bTruncateOnRelease; /* If stmt journal may be truncated on RELEASE */ +#ifndef SQLITE_OMIT_WAL + u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */ +#endif +}; + +/* +** Bits of the Pager.doNotSpill flag. See further description below. +*/ +#define SPILLFLAG_OFF 0x01 /* Never spill cache. Set via pragma */ +#define SPILLFLAG_ROLLBACK 0x02 /* Current rolling back, so do not spill */ +#define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ + +/* +** An open page cache is an instance of struct Pager. A description of +** some of the more important member variables follows: +** +** eState +** +** The current 'state' of the pager object. See the comment and state +** diagram above for a description of the pager state. +** +** eLock +** +** For a real on-disk database, the current lock held on the database file - +** NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK. +** +** For a temporary or in-memory database (neither of which require any +** locks), this variable is always set to EXCLUSIVE_LOCK. Since such +** databases always have Pager.exclusiveMode==1, this tricks the pager +** logic into thinking that it already has all the locks it will ever +** need (and no reason to release them). +** +** In some (obscure) circumstances, this variable may also be set to +** UNKNOWN_LOCK. See the comment above the #define of UNKNOWN_LOCK for +** details. +** +** changeCountDone +** +** This boolean variable is used to make sure that the change-counter +** (the 4-byte header field at byte offset 24 of the database file) is +** not updated more often than necessary. +** +** It is set to true when the change-counter field is updated, which +** can only happen if an exclusive lock is held on the database file. +** It is cleared (set to false) whenever an exclusive lock is +** relinquished on the database file. Each time a transaction is committed, +** The changeCountDone flag is inspected. If it is true, the work of +** updating the change-counter is omitted for the current transaction. +** +** This mechanism means that when running in exclusive mode, a connection +** need only update the change-counter once, for the first transaction +** committed. +** +** setSuper +** +** When PagerCommitPhaseOne() is called to commit a transaction, it may +** (or may not) specify a super-journal name to be written into the +** journal file before it is synced to disk. +** +** Whether or not a journal file contains a super-journal pointer affects +** the way in which the journal file is finalized after the transaction is +** committed or rolled back when running in "journal_mode=PERSIST" mode. +** If a journal file does not contain a super-journal pointer, it is +** finalized by overwriting the first journal header with zeroes. If +** it does contain a super-journal pointer the journal file is finalized +** by truncating it to zero bytes, just as if the connection were +** running in "journal_mode=truncate" mode. +** +** Journal files that contain super-journal pointers cannot be finalized +** simply by overwriting the first journal-header with zeroes, as the +** super-journal pointer could interfere with hot-journal rollback of any +** subsequently interrupted transaction that reuses the journal file. +** +** The flag is cleared as soon as the journal file is finalized (either +** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the +** journal file from being successfully finalized, the setSuper flag +** is cleared anyway (and the pager will move to ERROR state). +** +** doNotSpill +** +** This variables control the behavior of cache-spills (calls made by +** the pcache module to the pagerStress() routine to write cached data +** to the file-system in order to free up memory). +** +** When bits SPILLFLAG_OFF or SPILLFLAG_ROLLBACK of doNotSpill are set, +** writing to the database from pagerStress() is disabled altogether. +** The SPILLFLAG_ROLLBACK case is done in a very obscure case that +** comes up during savepoint rollback that requires the pcache module +** to allocate a new page to prevent the journal file from being written +** while it is being traversed by code in pager_playback(). The SPILLFLAG_OFF +** case is a user preference. +** +** If the SPILLFLAG_NOSYNC bit is set, writing to the database from +** pagerStress() is permitted, but syncing the journal file is not. +** This flag is set by sqlite3PagerWrite() when the file-system sector-size +** is larger than the database page-size in order to prevent a journal sync +** from happening in between the journalling of two pages on the same sector. +** +** subjInMemory +** +** This is a boolean variable. If true, then any required sub-journal +** is opened as an in-memory journal file. If false, then in-memory +** sub-journals are only used for in-memory pager files. +** +** This variable is updated by the upper layer each time a new +** write-transaction is opened. +** +** dbSize, dbOrigSize, dbFileSize +** +** Variable dbSize is set to the number of pages in the database file. +** It is valid in PAGER_READER and higher states (all states except for +** OPEN and ERROR). +** +** dbSize is set based on the size of the database file, which may be +** larger than the size of the database (the value stored at offset +** 28 of the database header by the btree). If the size of the file +** is not an integer multiple of the page-size, the value stored in +** dbSize is rounded down (i.e. a 5KB file with 2K page-size has dbSize==2). +** Except, any file that is greater than 0 bytes in size is considered +** to have at least one page. (i.e. a 1KB file with 2K page-size leads +** to dbSize==1). +** +** During a write-transaction, if pages with page-numbers greater than +** dbSize are modified in the cache, dbSize is updated accordingly. +** Similarly, if the database is truncated using PagerTruncateImage(), +** dbSize is updated. +** +** Variables dbOrigSize and dbFileSize are valid in states +** PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize +** variable at the start of the transaction. It is used during rollback, +** and to determine whether or not pages need to be journalled before +** being modified. +** +** Throughout a write-transaction, dbFileSize contains the size of +** the file on disk in pages. It is set to a copy of dbSize when the +** write-transaction is first opened, and updated when VFS calls are made +** to write or truncate the database file on disk. +** +** The only reason the dbFileSize variable is required is to suppress +** unnecessary calls to xTruncate() after committing a transaction. If, +** when a transaction is committed, the dbFileSize variable indicates +** that the database file is larger than the database image (Pager.dbSize), +** pager_truncate() is called. The pager_truncate() call uses xFilesize() +** to measure the database file on disk, and then truncates it if required. +** dbFileSize is not used when rolling back a transaction. In this case +** pager_truncate() is called unconditionally (which means there may be +** a call to xFilesize() that is not strictly required). In either case, +** pager_truncate() may cause the file to become smaller or larger. +** +** dbHintSize +** +** The dbHintSize variable is used to limit the number of calls made to +** the VFS xFileControl(FCNTL_SIZE_HINT) method. +** +** dbHintSize is set to a copy of the dbSize variable when a +** write-transaction is opened (at the same time as dbFileSize and +** dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called, +** dbHintSize is increased to the number of pages that correspond to the +** size-hint passed to the method call. See pager_write_pagelist() for +** details. +** +** errCode +** +** The Pager.errCode variable is only ever used in PAGER_ERROR state. It +** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode +** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX +** sub-codes. +** +** syncFlags, walSyncFlags +** +** syncFlags is either SQLITE_SYNC_NORMAL (0x02) or SQLITE_SYNC_FULL (0x03). +** syncFlags is used for rollback mode. walSyncFlags is used for WAL mode +** and contains the flags used to sync the checkpoint operations in the +** lower two bits, and sync flags used for transaction commits in the WAL +** file in bits 0x04 and 0x08. In other words, to get the correct sync flags +** for checkpoint operations, use (walSyncFlags&0x03) and to get the correct +** sync flags for transaction commit, use ((walSyncFlags>>2)&0x03). Note +** that with synchronous=NORMAL in WAL mode, transaction commit is not synced +** meaning that the 0x04 and 0x08 bits are both zero. +*/ +struct Pager { + sqlite3_vfs *pVfs; /* OS functions to use for IO */ + u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ + u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */ + u8 useJournal; /* Use a rollback journal on this file */ + u8 noSync; /* Do not sync the journal if true */ + u8 fullSync; /* Do extra syncs of the journal for robustness */ + u8 extraSync; /* sync directory after journal delete */ + u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ + u8 walSyncFlags; /* See description above */ + u8 tempFile; /* zFilename is a temporary or immutable file */ + u8 noLock; /* Do not lock (except in WAL mode) */ + u8 readOnly; /* True for a read-only database */ + u8 memDb; /* True to inhibit all file I/O */ + u8 memVfs; /* VFS-implemented memory database */ + + /************************************************************************** + ** The following block contains those class members that change during + ** routine operation. Class members not in this block are either fixed + ** when the pager is first created or else only change when there is a + ** significant mode change (such as changing the page_size, locking_mode, + ** or the journal_mode). From another view, these class members describe + ** the "state" of the pager, while other class members describe the + ** "configuration" of the pager. + */ + u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */ + u8 eLock; /* Current lock held on database file */ + u8 changeCountDone; /* Set after incrementing the change-counter */ + u8 setSuper; /* Super-jrnl name is written into jrnl */ + u8 doNotSpill; /* Do not spill the cache when non-zero */ + u8 subjInMemory; /* True to use in-memory sub-journals */ + u8 bUseFetch; /* True to use xFetch() */ + u8 hasHeldSharedLock; /* True if a shared lock has ever been held */ + Pgno dbSize; /* Number of pages in the database */ + Pgno dbOrigSize; /* dbSize before the current transaction */ + Pgno dbFileSize; /* Number of pages in the database file */ + Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */ + int errCode; /* One of several kinds of errors */ + int nRec; /* Pages journalled since last j-header written */ + u32 cksumInit; /* Quasi-random value added to every checksum */ + u32 nSubRec; /* Number of records written to sub-journal */ + Bitvec *pInJournal; /* One bit for each page in the database file */ + sqlite3_file *fd; /* File descriptor for database */ + sqlite3_file *jfd; /* File descriptor for main journal */ + sqlite3_file *sjfd; /* File descriptor for sub-journal */ + i64 journalOff; /* Current write offset in the journal file */ + i64 journalHdr; /* Byte offset to previous journal header */ + sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */ + PagerSavepoint *aSavepoint; /* Array of active savepoints */ + int nSavepoint; /* Number of elements in aSavepoint[] */ + u32 iDataVersion; /* Changes whenever database content changes */ + char dbFileVers[16]; /* Changes whenever database file changes */ + + int nMmapOut; /* Number of mmap pages currently outstanding */ + sqlite3_int64 szMmap; /* Desired maximum mmap size */ + PgHdr *pMmapFreelist; /* List of free mmap page headers (pDirty) */ + /* + ** End of the routinely-changing class members + ***************************************************************************/ + + u16 nExtra; /* Add this many bytes to each in-memory page */ + i16 nReserve; /* Number of unused bytes at end of each page */ + u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ + u32 sectorSize; /* Assumed sector size during rollback */ + Pgno mxPgno; /* Maximum allowed size of the database */ + Pgno lckPgno; /* Page number for the locking page */ + i64 pageSize; /* Number of bytes in a page */ + i64 journalSizeLimit; /* Size limit for persistent journal files */ + char *zFilename; /* Name of the database file */ + char *zJournal; /* Name of the journal file */ + int (*xBusyHandler)(void*); /* Function to call when busy */ + void *pBusyHandlerArg; /* Context argument for xBusyHandler */ + int aStat[4]; /* Total cache hits, misses, writes, spills */ +#ifdef SQLITE_TEST + int nRead; /* Database pages read */ +#endif + void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ + int (*xGet)(Pager*,Pgno,DbPage**,int); /* Routine to fetch a patch */ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ + void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */ + void (*xCodecFree)(void*); /* Destructor for the codec */ + void *pCodec; /* First argument to xCodec... methods */ +#endif +/* END SQLCIPHER */ + char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ + PCache *pPCache; /* Pointer to page cache object */ +#ifndef SQLITE_OMIT_WAL + Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */ + char *zWal; /* File name for write-ahead log */ +#endif +}; + +/* +** Indexes for use with Pager.aStat[]. The Pager.aStat[] array contains +** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS +** or CACHE_WRITE to sqlite3_db_status(). +*/ +#define PAGER_STAT_HIT 0 +#define PAGER_STAT_MISS 1 +#define PAGER_STAT_WRITE 2 +#define PAGER_STAT_SPILL 3 + +/* +** The following global variables hold counters used for +** testing purposes only. These variables do not exist in +** a non-testing build. These variables are not thread-safe. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ +SQLITE_API int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ +SQLITE_API int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ +# define PAGER_INCR(v) v++ +#else +# define PAGER_INCR(v) +#endif + + + +/* +** Journal files begin with the following magic string. The data +** was obtained from /dev/random. It is used only as a sanity check. +** +** Since version 2.8.0, the journal format contains additional sanity +** checking information. If the power fails while the journal is being +** written, semi-random garbage data might appear in the journal +** file after power is restored. If an attempt is then made +** to roll the journal back, the database could be corrupted. The additional +** sanity checking data is an attempt to discover the garbage in the +** journal and ignore it. +** +** The sanity checking information for the new journal format consists +** of a 32-bit checksum on each page of data. The checksum covers both +** the page number and the pPager->pageSize bytes of data for the page. +** This cksum is initialized to a 32-bit random value that appears in the +** journal file right after the header. The random initializer is important, +** because garbage data that appears at the end of a journal is likely +** data that was once in other files that have now been deleted. If the +** garbage data came from an obsolete journal file, the checksums might +** be correct. But by initializing the checksum to random value which +** is different for every journal, we minimize that risk. +*/ +static const unsigned char aJournalMagic[] = { + 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7, +}; + +/* +** The size of the of each page record in the journal is given by +** the following macro. +*/ +#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) + +/* +** The journal header size for this pager. This is usually the same +** size as a single disk sector. See also setSectorSize(). +*/ +#define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) + +/* +** The macro MEMDB is true if we are dealing with an in-memory database. +** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set, +** the value of MEMDB will be a constant and the compiler will optimize +** out code that would never execute. +*/ +#ifdef SQLITE_OMIT_MEMORYDB +# define MEMDB 0 +#else +# define MEMDB pPager->memDb +#endif + +/* +** The macro USEFETCH is true if we are allowed to use the xFetch and xUnfetch +** interfaces to access the database using memory-mapped I/O. +*/ +#if SQLITE_MAX_MMAP_SIZE>0 +# define USEFETCH(x) ((x)->bUseFetch) +#else +# define USEFETCH(x) 0 +#endif + +/* +** The argument to this macro is a file descriptor (type sqlite3_file*). +** Return 0 if it is not open, or non-zero (but not 1) if it is. +** +** This is so that expressions can be written as: +** +** if( isOpen(pPager->jfd) ){ ... +** +** instead of +** +** if( pPager->jfd->pMethods ){ ... +*/ +#define isOpen(pFd) ((pFd)->pMethods!=0) + +#ifdef SQLITE_DIRECT_OVERFLOW_READ +/* +** Return true if page pgno can be read directly from the database file +** by the b-tree layer. This is the case if: +** +** * the database file is open, +** * there are no dirty pages in the cache, and +** * the desired page is not currently in the wal file. +*/ +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ + if( pPager->fd->pMethods==0 ) return 0; + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodec!=0 ) return 0; +#endif +/* END SQLCIPHER */ +#ifndef SQLITE_OMIT_WAL + if( pPager->pWal ){ + u32 iRead = 0; + int rc; + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); + return (rc==SQLITE_OK && iRead==0); + } +#endif + return 1; +} +#endif + +#ifndef SQLITE_OMIT_WAL +# define pagerUseWal(x) ((x)->pWal!=0) +#else +# define pagerUseWal(x) 0 +# define pagerRollbackWal(x) 0 +# define pagerWalFrames(v,w,x,y) 0 +# define pagerOpenWalIfPresent(z) SQLITE_OK +# define pagerBeginReadTransaction(z) SQLITE_OK +#endif + +#ifndef NDEBUG +/* +** Usage: +** +** assert( assert_pager_state(pPager) ); +** +** This function runs many asserts to try to find inconsistencies in +** the internal state of the Pager object. +*/ +static int assert_pager_state(Pager *p){ + Pager *pPager = p; + + /* State must be valid. */ + assert( p->eState==PAGER_OPEN + || p->eState==PAGER_READER + || p->eState==PAGER_WRITER_LOCKED + || p->eState==PAGER_WRITER_CACHEMOD + || p->eState==PAGER_WRITER_DBMOD + || p->eState==PAGER_WRITER_FINISHED + || p->eState==PAGER_ERROR + ); + + /* Regardless of the current state, a temp-file connection always behaves + ** as if it has an exclusive lock on the database file. It never updates + ** the change-counter field, so the changeCountDone flag is always set. + */ + assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK ); + assert( p->tempFile==0 || pPager->changeCountDone ); + + /* If the useJournal flag is clear, the journal-mode must be "OFF". + ** And if the journal-mode is "OFF", the journal file must not be open. + */ + assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal ); + assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) ); + + /* Check that MEMDB implies noSync. And an in-memory journal. Since + ** this means an in-memory pager performs no IO at all, it cannot encounter + ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing + ** a journal file. (although the in-memory journal implementation may + ** return SQLITE_IOERR_NOMEM while the journal file is being written). It + ** is therefore not possible for an in-memory pager to enter the ERROR + ** state. + */ + if( MEMDB ){ + assert( !isOpen(p->fd) ); + assert( p->noSync ); + assert( p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_MEMORY + ); + assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN ); + assert( pagerUseWal(p)==0 ); + } + + /* If changeCountDone is set, a RESERVED lock or greater must be held + ** on the file. + */ + assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK ); + assert( p->eLock!=PENDING_LOCK ); + + switch( p->eState ){ + case PAGER_OPEN: + assert( !MEMDB ); + assert( pPager->errCode==SQLITE_OK ); + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); + break; + + case PAGER_READER: + assert( pPager->errCode==SQLITE_OK ); + assert( p->eLock!=UNKNOWN_LOCK ); + assert( p->eLock>=SHARED_LOCK ); + break; + + case PAGER_WRITER_LOCKED: + assert( p->eLock!=UNKNOWN_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + if( !pagerUseWal(pPager) ){ + assert( p->eLock>=RESERVED_LOCK ); + } + assert( pPager->dbSize==pPager->dbOrigSize ); + assert( pPager->dbOrigSize==pPager->dbFileSize ); + assert( pPager->dbOrigSize==pPager->dbHintSize ); + assert( pPager->setSuper==0 ); + break; + + case PAGER_WRITER_CACHEMOD: + assert( p->eLock!=UNKNOWN_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + if( !pagerUseWal(pPager) ){ + /* It is possible that if journal_mode=wal here that neither the + ** journal file nor the WAL file are open. This happens during + ** a rollback transaction that switches from journal_mode=off + ** to journal_mode=wal. + */ + assert( p->eLock>=RESERVED_LOCK ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + ); + } + assert( pPager->dbOrigSize==pPager->dbFileSize ); + assert( pPager->dbOrigSize==pPager->dbHintSize ); + break; + + case PAGER_WRITER_DBMOD: + assert( p->eLock==EXCLUSIVE_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + assert( !pagerUseWal(pPager) ); + assert( p->eLock>=EXCLUSIVE_LOCK ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); + assert( pPager->dbOrigSize<=pPager->dbHintSize ); + break; + + case PAGER_WRITER_FINISHED: + assert( p->eLock==EXCLUSIVE_LOCK ); + assert( pPager->errCode==SQLITE_OK ); + assert( !pagerUseWal(pPager) ); + assert( isOpen(p->jfd) + || p->journalMode==PAGER_JOURNALMODE_OFF + || p->journalMode==PAGER_JOURNALMODE_WAL + || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); + break; + + case PAGER_ERROR: + /* There must be at least one outstanding reference to the pager if + ** in ERROR state. Otherwise the pager should have already dropped + ** back to OPEN state. + */ + assert( pPager->errCode!=SQLITE_OK ); + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 || pPager->tempFile ); + break; + } + + return 1; +} +#endif /* ifndef NDEBUG */ + +#ifdef SQLITE_DEBUG +/* +** Return a pointer to a human readable string in a static buffer +** containing the state of the Pager object passed as an argument. This +** is intended to be used within debuggers. For example, as an alternative +** to "print *pPager" in gdb: +** +** (gdb) printf "%s", print_pager_state(pPager) +** +** This routine has external linkage in order to suppress compiler warnings +** about an unused function. It is enclosed within SQLITE_DEBUG and so does +** not appear in normal builds. +*/ +char *print_pager_state(Pager *p){ + static char zRet[1024]; + + sqlite3_snprintf(1024, zRet, + "Filename: %s\n" + "State: %s errCode=%d\n" + "Lock: %s\n" + "Locking mode: locking_mode=%s\n" + "Journal mode: journal_mode=%s\n" + "Backing store: tempFile=%d memDb=%d useJournal=%d\n" + "Journal: journalOff=%lld journalHdr=%lld\n" + "Size: dbsize=%d dbOrigSize=%d dbFileSize=%d\n" + , p->zFilename + , p->eState==PAGER_OPEN ? "OPEN" : + p->eState==PAGER_READER ? "READER" : + p->eState==PAGER_WRITER_LOCKED ? "WRITER_LOCKED" : + p->eState==PAGER_WRITER_CACHEMOD ? "WRITER_CACHEMOD" : + p->eState==PAGER_WRITER_DBMOD ? "WRITER_DBMOD" : + p->eState==PAGER_WRITER_FINISHED ? "WRITER_FINISHED" : + p->eState==PAGER_ERROR ? "ERROR" : "?error?" + , (int)p->errCode + , p->eLock==NO_LOCK ? "NO_LOCK" : + p->eLock==RESERVED_LOCK ? "RESERVED" : + p->eLock==EXCLUSIVE_LOCK ? "EXCLUSIVE" : + p->eLock==SHARED_LOCK ? "SHARED" : + p->eLock==UNKNOWN_LOCK ? "UNKNOWN" : "?error?" + , p->exclusiveMode ? "exclusive" : "normal" + , p->journalMode==PAGER_JOURNALMODE_MEMORY ? "memory" : + p->journalMode==PAGER_JOURNALMODE_OFF ? "off" : + p->journalMode==PAGER_JOURNALMODE_DELETE ? "delete" : + p->journalMode==PAGER_JOURNALMODE_PERSIST ? "persist" : + p->journalMode==PAGER_JOURNALMODE_TRUNCATE ? "truncate" : + p->journalMode==PAGER_JOURNALMODE_WAL ? "wal" : "?error?" + , (int)p->tempFile, (int)p->memDb, (int)p->useJournal + , p->journalOff, p->journalHdr + , (int)p->dbSize, (int)p->dbOrigSize, (int)p->dbFileSize + ); + + return zRet; +} +#endif + +/* Forward references to the various page getters */ +static int getPageNormal(Pager*,Pgno,DbPage**,int); +static int getPageError(Pager*,Pgno,DbPage**,int); +#if SQLITE_MAX_MMAP_SIZE>0 +static int getPageMMap(Pager*,Pgno,DbPage**,int); +#endif + +/* +** Set the Pager.xGet method for the appropriate routine used to fetch +** content from the pager. +*/ +static void setGetterMethod(Pager *pPager){ + if( pPager->errCode ){ + pPager->xGet = getPageError; +#if SQLITE_MAX_MMAP_SIZE>0 + }else if( USEFETCH(pPager) +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + && pPager->xCodec==0 +#endif +/* END SQLCIPHER */ + ){ + pPager->xGet = getPageMMap; +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + }else{ + pPager->xGet = getPageNormal; + } +} + +/* +** Return true if it is necessary to write page *pPg into the sub-journal. +** A page needs to be written into the sub-journal if there exists one +** or more open savepoints for which: +** +** * The page-number is less than or equal to PagerSavepoint.nOrig, and +** * The bit corresponding to the page-number is not set in +** PagerSavepoint.pInSavepoint. +*/ +static int subjRequiresPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + PagerSavepoint *p; + Pgno pgno = pPg->pgno; + int i; + for(i=0; inSavepoint; i++){ + p = &pPager->aSavepoint[i]; + if( p->nOrig>=pgno && 0==sqlite3BitvecTestNotNull(p->pInSavepoint, pgno) ){ + for(i=i+1; inSavepoint; i++){ + pPager->aSavepoint[i].bTruncateOnRelease = 0; + } + return 1; + } + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** Return true if the page is already in the journal file. +*/ +static int pageInJournal(Pager *pPager, PgHdr *pPg){ + return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); +} +#endif + +/* +** Read a 32-bit integer from the given file descriptor. Store the integer +** that is read in *pRes. Return SQLITE_OK if everything worked, or an +** error code is something goes wrong. +** +** All values are stored on disk as big-endian. +*/ +static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ + unsigned char ac[4]; + int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset); + if( rc==SQLITE_OK ){ + *pRes = sqlite3Get4byte(ac); + } + return rc; +} + +/* +** Write a 32-bit integer into a string buffer in big-endian byte order. +*/ +#define put32bits(A,B) sqlite3Put4byte((u8*)A,B) + + +/* +** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK +** on success or an error code is something goes wrong. +*/ +static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ + char ac[4]; + put32bits(ac, val); + return sqlite3OsWrite(fd, ac, 4, offset); +} + +/* +** Unlock the database file to level eLock, which must be either NO_LOCK +** or SHARED_LOCK. Regardless of whether or not the call to xUnlock() +** succeeds, set the Pager.eLock variable to match the (attempted) new lock. +** +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it. See the comment above the #define of +** UNKNOWN_LOCK for an explanation of this. +*/ +static int pagerUnlockDb(Pager *pPager, int eLock){ + int rc = SQLITE_OK; + + assert( !pPager->exclusiveMode || pPager->eLock==eLock ); + assert( eLock==NO_LOCK || eLock==SHARED_LOCK ); + assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 ); + if( isOpen(pPager->fd) ){ + assert( pPager->eLock>=eLock ); + rc = pPager->noLock ? SQLITE_OK : sqlite3OsUnlock(pPager->fd, eLock); + if( pPager->eLock!=UNKNOWN_LOCK ){ + pPager->eLock = (u8)eLock; + } + IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) + } + pPager->changeCountDone = pPager->tempFile; /* ticket fb3b3024ea238d5c */ + return rc; +} + +/* +** Lock the database file to level eLock, which must be either SHARED_LOCK, +** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the +** Pager.eLock variable to the new locking state. +** +** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is +** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. +** See the comment above the #define of UNKNOWN_LOCK for an explanation +** of this. +*/ +static int pagerLockDb(Pager *pPager, int eLock){ + int rc = SQLITE_OK; + + assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK ); + if( pPager->eLockeLock==UNKNOWN_LOCK ){ + rc = pPager->noLock ? SQLITE_OK : sqlite3OsLock(pPager->fd, eLock); + if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ + pPager->eLock = (u8)eLock; + IOTRACE(("LOCK %p %d\n", pPager, eLock)) + } + } + return rc; +} + +/* +** This function determines whether or not the atomic-write or +** atomic-batch-write optimizations can be used with this pager. The +** atomic-write optimization can be used if: +** +** (a) the value returned by OsDeviceCharacteristics() indicates that +** a database page may be written atomically, and +** (b) the value returned by OsSectorSize() is less than or equal +** to the page size. +** +** If it can be used, then the value returned is the size of the journal +** file when it contains rollback data for exactly one page. +** +** The atomic-batch-write optimization can be used if OsDeviceCharacteristics() +** returns a value with the SQLITE_IOCAP_BATCH_ATOMIC bit set. -1 is +** returned in this case. +** +** If neither optimization can be used, 0 is returned. +*/ +static int jrnlBufferSize(Pager *pPager){ + assert( !MEMDB ); + +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int dc; /* Device characteristics */ + + assert( isOpen(pPager->fd) ); + dc = sqlite3OsDeviceCharacteristics(pPager->fd); +#else + UNUSED_PARAMETER(pPager); +#endif + +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( pPager->dbSize>0 && (dc&SQLITE_IOCAP_BATCH_ATOMIC) ){ + return -1; + } +#endif + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + { + int nSector = pPager->sectorSize; + int szPage = pPager->pageSize; + + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + if( 0==(dc&(SQLITE_IOCAP_ATOMIC|(szPage>>8)) || nSector>szPage) ){ + return 0; + } + } + + return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); +#endif + + return 0; +} + +/* +** If SQLITE_CHECK_PAGES is defined then we do some sanity checking +** on the cache using a hash function. This is used for testing +** and debugging only. +*/ +#ifdef SQLITE_CHECK_PAGES +/* +** Return a 32-bit hash of the page data for pPage. +*/ +static u32 pager_datahash(int nByte, unsigned char *pData){ + u32 hash = 0; + int i; + for(i=0; ipPager->pageSize, (unsigned char *)pPage->pData); +} +static void pager_set_pagehash(PgHdr *pPage){ + pPage->pageHash = pager_pagehash(pPage); +} + +/* +** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES +** is defined, and NDEBUG is not defined, an assert() statement checks +** that the page is either dirty or still matches the calculated page-hash. +*/ +#define CHECK_PAGE(x) checkPage(x) +static void checkPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( pPager->eState!=PAGER_ERROR ); + assert( (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) ); +} + +#else +#define pager_datahash(X,Y) 0 +#define pager_pagehash(X) 0 +#define pager_set_pagehash(X) +#define CHECK_PAGE(x) +#endif /* SQLITE_CHECK_PAGES */ + +/* +** When this is called the journal file for pager pPager must be open. +** This function attempts to read a super-journal file name from the +** end of the file and, if successful, copies it into memory supplied +** by the caller. See comments above writeSuperJournal() for the format +** used to store a super-journal file name at the end of a journal file. +** +** zSuper must point to a buffer of at least nSuper bytes allocated by +** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is +** enough space to write the super-journal name). If the super-journal +** name in the journal is longer than nSuper bytes (including a +** nul-terminator), then this is handled as if no super-journal name +** were present in the journal. +** +** If a super-journal file name is present at the end of the journal +** file, then it is copied into the buffer pointed to by zSuper. A +** nul-terminator byte is appended to the buffer following the +** super-journal file name. +** +** If it is determined that no super-journal file name is present +** zSuper[0] is set to 0 and SQLITE_OK returned. +** +** If an error occurs while reading from the journal file, an SQLite +** error code is returned. +*/ +static int readSuperJournal(sqlite3_file *pJrnl, char *zSuper, u32 nSuper){ + int rc; /* Return code */ + u32 len; /* Length in bytes of super-journal name */ + i64 szJ; /* Total size in bytes of journal file pJrnl */ + u32 cksum; /* MJ checksum value read from journal */ + u32 u; /* Unsigned loop counter */ + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + zSuper[0] = '\0'; + + if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ)) + || szJ<16 + || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) + || len>=nSuper + || len>szJ-16 + || len==0 + || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) + || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) + || memcmp(aMagic, aJournalMagic, 8) + || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zSuper, len, szJ-16-len)) + ){ + return rc; + } + + /* See if the checksum matches the super-journal name */ + for(u=0; ujournalOff, assuming a sector +** size of pPager->sectorSize bytes. +** +** i.e for a sector size of 512: +** +** Pager.journalOff Return value +** --------------------------------------- +** 0 0 +** 512 512 +** 100 512 +** 2000 2048 +** +*/ +static i64 journalHdrOffset(Pager *pPager){ + i64 offset = 0; + i64 c = pPager->journalOff; + if( c ){ + offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); + } + assert( offset%JOURNAL_HDR_SZ(pPager)==0 ); + assert( offset>=c ); + assert( (offset-c)jfd) ); + assert( !sqlite3JournalIsInMemory(pPager->jfd) ); + if( pPager->journalOff ){ + const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */ + + IOTRACE(("JZEROHDR %p\n", pPager)) + if( doTruncate || iLimit==0 ){ + rc = sqlite3OsTruncate(pPager->jfd, 0); + }else{ + static const char zeroHdr[28] = {0}; + rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0); + } + if( rc==SQLITE_OK && !pPager->noSync ){ + rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags); + } + + /* At this point the transaction is committed but the write lock + ** is still held on the file. If there is a size limit configured for + ** the persistent journal and the journal file currently consumes more + ** space than that limit allows for, truncate it now. There is no need + ** to sync the file following this operation. + */ + if( rc==SQLITE_OK && iLimit>0 ){ + i64 sz; + rc = sqlite3OsFileSize(pPager->jfd, &sz); + if( rc==SQLITE_OK && sz>iLimit ){ + rc = sqlite3OsTruncate(pPager->jfd, iLimit); + } + } + } + return rc; +} + +/* +** The journal file must be open when this routine is called. A journal +** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the +** current location. +** +** The format for the journal header is as follows: +** - 8 bytes: Magic identifying journal format. +** - 4 bytes: Number of records in journal, or -1 no-sync mode is on. +** - 4 bytes: Random number used for page hash. +** - 4 bytes: Initial database page count. +** - 4 bytes: Sector size used by the process that wrote this journal. +** - 4 bytes: Database page size. +** +** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space. +*/ +static int writeJournalHdr(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */ + u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */ + u32 nWrite; /* Bytes of header sector written */ + int ii; /* Loop counter */ + + assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ + + if( nHeader>JOURNAL_HDR_SZ(pPager) ){ + nHeader = JOURNAL_HDR_SZ(pPager); + } + + /* If there are active savepoints and any of them were created + ** since the most recent journal header was written, update the + ** PagerSavepoint.iHdrOffset fields now. + */ + for(ii=0; iinSavepoint; ii++){ + if( pPager->aSavepoint[ii].iHdrOffset==0 ){ + pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff; + } + } + + pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager); + + /* + ** Write the nRec Field - the number of page records that follow this + ** journal header. Normally, zero is written to this value at this time. + ** After the records are added to the journal (and the journal synced, + ** if in full-sync mode), the zero is overwritten with the true number + ** of records (see syncJournal()). + ** + ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When + ** reading the journal this value tells SQLite to assume that the + ** rest of the journal file contains valid page records. This assumption + ** is dangerous, as if a failure occurred whilst writing to the journal + ** file it may contain some garbage data. There are two scenarios + ** where this risk can be ignored: + ** + ** * When the pager is in no-sync mode. Corruption can follow a + ** power failure in this case anyway. + ** + ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees + ** that garbage data is never appended to the journal file. + */ + assert( isOpen(pPager->fd) || pPager->noSync ); + if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) + ){ + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); + }else{ + memset(zHeader, 0, sizeof(aJournalMagic)+4); + } + + /* The random check-hash initializer */ + sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); + put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); + /* The initial database size */ + put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); + /* The assumed sector size for this process */ + put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); + + /* The page size */ + put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); + + /* Initializing the tail of the buffer is not necessary. Everything + ** works find if the following memset() is omitted. But initializing + ** the memory prevents valgrind from complaining, so we are willing to + ** take the performance hit. + */ + memset(&zHeader[sizeof(aJournalMagic)+20], 0, + nHeader-(sizeof(aJournalMagic)+20)); + + /* In theory, it is only necessary to write the 28 bytes that the + ** journal header consumes to the journal file here. Then increment the + ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next + ** record is written to the following sector (leaving a gap in the file + ** that will be implicitly filled in by the OS). + ** + ** However it has been discovered that on some systems this pattern can + ** be significantly slower than contiguously writing data to the file, + ** even if that means explicitly writing data to the block of + ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what + ** is done. + ** + ** The loop is required here in case the sector-size is larger than the + ** database page size. Since the zHeader buffer is only Pager.pageSize + ** bytes in size, more than one call to sqlite3OsWrite() may be required + ** to populate the entire journal header sector. + */ + for(nWrite=0; rc==SQLITE_OK&&nWritejournalHdr, nHeader)) + rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff); + assert( pPager->journalHdr <= pPager->journalOff ); + pPager->journalOff += nHeader; + } + + return rc; +} + +/* +** The journal file must be open when this is called. A journal header file +** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal +** file. The current location in the journal file is given by +** pPager->journalOff. See comments above function writeJournalHdr() for +** a description of the journal header format. +** +** If the header is read successfully, *pNRec is set to the number of +** page records following this header and *pDbSize is set to the size of the +** database before the transaction began, in pages. Also, pPager->cksumInit +** is set to the value read from the journal header. SQLITE_OK is returned +** in this case. +** +** If the journal header file appears to be corrupted, SQLITE_DONE is +** returned and *pNRec and *PDbSize are undefined. If JOURNAL_HDR_SZ bytes +** cannot be read from the journal file an error code is returned. +*/ +static int readJournalHdr( + Pager *pPager, /* Pager object */ + int isHot, + i64 journalSize, /* Size of the open journal file in bytes */ + u32 *pNRec, /* OUT: Value read from the nRec field */ + u32 *pDbSize /* OUT: Value of original database size field */ +){ + int rc; /* Return code */ + unsigned char aMagic[8]; /* A buffer to hold the magic header */ + i64 iHdrOff; /* Offset of journal header being read */ + + assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ + + /* Advance Pager.journalOff to the start of the next sector. If the + ** journal file is too small for there to be a header stored at this + ** point, return SQLITE_DONE. + */ + pPager->journalOff = journalHdrOffset(pPager); + if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ + return SQLITE_DONE; + } + iHdrOff = pPager->journalOff; + + /* Read in the first 8 bytes of the journal header. If they do not match + ** the magic string found at the start of each journal header, return + ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise, + ** proceed. + */ + if( isHot || iHdrOff!=pPager->journalHdr ){ + rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff); + if( rc ){ + return rc; + } + if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){ + return SQLITE_DONE; + } + } + + /* Read the first three 32-bit fields of the journal header: The nRec + ** field, the checksum-initializer and the database size at the start + ** of the transaction. Return an error code if anything goes wrong. + */ + if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize)) + ){ + return rc; + } + + if( pPager->journalOff==0 ){ + u32 iPageSize; /* Page-size field of journal header */ + u32 iSectorSize; /* Sector-size field of journal header */ + + /* Read the page-size and sector-size journal header fields. */ + if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize)) + || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize)) + ){ + return rc; + } + + /* Versions of SQLite prior to 3.5.8 set the page-size field of the + ** journal header to zero. In this case, assume that the Pager.pageSize + ** variable is already set to the correct page size. + */ + if( iPageSize==0 ){ + iPageSize = pPager->pageSize; + } + + /* Check that the values read from the page-size and sector-size fields + ** are within range. To be 'in range', both values need to be a power + ** of two greater than or equal to 512 or 32, and not greater than their + ** respective compile time maximum limits. + */ + if( iPageSize<512 || iSectorSize<32 + || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE + || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0 + ){ + /* If the either the page-size or sector-size in the journal-header is + ** invalid, then the process that wrote the journal-header must have + ** crashed before the header was synced. In this case stop reading + ** the journal file here. + */ + return SQLITE_DONE; + } + + /* Update the page-size to match the value read from the journal. + ** Use a testcase() macro to make sure that malloc failure within + ** PagerSetPagesize() is tested. + */ + rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1); + testcase( rc!=SQLITE_OK ); + + /* Update the assumed sector-size to match the value used by + ** the process that created this journal. If this journal was + ** created by a process other than this one, then this routine + ** is being called from within pager_playback(). The local value + ** of Pager.sectorSize is restored at the end of that routine. + */ + pPager->sectorSize = iSectorSize; + } + + pPager->journalOff += JOURNAL_HDR_SZ(pPager); + return rc; +} + + +/* +** Write the supplied super-journal name into the journal file for pager +** pPager at the current location. The super-journal name must be the last +** thing written to a journal file. If the pager is in full-sync mode, the +** journal file descriptor is advanced to the next sector boundary before +** anything is written. The format is: +** +** + 4 bytes: PAGER_SJ_PGNO. +** + N bytes: super-journal filename in utf-8. +** + 4 bytes: N (length of super-journal name in bytes, no nul-terminator). +** + 4 bytes: super-journal name checksum. +** + 8 bytes: aJournalMagic[]. +** +** The super-journal page checksum is the sum of the bytes in thesuper-journal +** name, where each byte is interpreted as a signed 8-bit integer. +** +** If zSuper is a NULL pointer (occurs for a single database transaction), +** this call is a no-op. +*/ +static int writeSuperJournal(Pager *pPager, const char *zSuper){ + int rc; /* Return code */ + int nSuper; /* Length of string zSuper */ + i64 iHdrOff; /* Offset of header in journal file */ + i64 jrnlSize; /* Size of journal file on disk */ + u32 cksum = 0; /* Checksum of string zSuper */ + + assert( pPager->setSuper==0 ); + assert( !pagerUseWal(pPager) ); + + if( !zSuper + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || !isOpen(pPager->jfd) + ){ + return SQLITE_OK; + } + pPager->setSuper = 1; + assert( pPager->journalHdr <= pPager->journalOff ); + + /* Calculate the length in bytes and the checksum of zSuper */ + for(nSuper=0; zSuper[nSuper]; nSuper++){ + cksum += zSuper[nSuper]; + } + + /* If in full-sync mode, advance to the next disk sector before writing + ** the super-journal name. This is in case the previous page written to + ** the journal has already been synced. + */ + if( pPager->fullSync ){ + pPager->journalOff = journalHdrOffset(pPager); + } + iHdrOff = pPager->journalOff; + + /* Write the super-journal data to the end of the journal file. If + ** an error occurs, return the error code to the caller. + */ + if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_SJ_PGNO(pPager)))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, zSuper, nSuper, iHdrOff+4))) + || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper, nSuper))) + || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper+4, cksum))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, + iHdrOff+4+nSuper+8))) + ){ + return rc; + } + pPager->journalOff += (nSuper+20); + + /* If the pager is in peristent-journal mode, then the physical + ** journal-file may extend past the end of the super-journal name + ** and 8 bytes of magic data just written to the file. This is + ** dangerous because the code to rollback a hot-journal file + ** will not be able to find the super-journal name to determine + ** whether or not the journal is hot. + ** + ** Easiest thing to do in this scenario is to truncate the journal + ** file to the required size. + */ + if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) + && jrnlSize>pPager->journalOff + ){ + rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); + } + return rc; +} + +/* +** Discard the entire contents of the in-memory page-cache. +*/ +static void pager_reset(Pager *pPager){ + pPager->iDataVersion++; + sqlite3BackupRestart(pPager->pBackup); + sqlite3PcacheClear(pPager->pPCache); +} + +/* +** Return the pPager->iDataVersion value +*/ +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager *pPager){ + return pPager->iDataVersion; +} + +/* +** Free all structures in the Pager.aSavepoint[] array and set both +** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal +** if it is open and the pager is not in exclusive mode. +*/ +static void releaseAllSavepoints(Pager *pPager){ + int ii; /* Iterator for looping through Pager.aSavepoint */ + for(ii=0; iinSavepoint; ii++){ + sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); + } + if( !pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd) ){ + sqlite3OsClose(pPager->sjfd); + } + sqlite3_free(pPager->aSavepoint); + pPager->aSavepoint = 0; + pPager->nSavepoint = 0; + pPager->nSubRec = 0; +} + +/* +** Set the bit number pgno in the PagerSavepoint.pInSavepoint +** bitvecs of all open savepoints. Return SQLITE_OK if successful +** or SQLITE_NOMEM if a malloc failure occurs. +*/ +static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ + int ii; /* Loop counter */ + int rc = SQLITE_OK; /* Result code */ + + for(ii=0; iinSavepoint; ii++){ + PagerSavepoint *p = &pPager->aSavepoint[ii]; + if( pgno<=p->nOrig ){ + rc |= sqlite3BitvecSet(p->pInSavepoint, pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + } + } + return rc; +} + +/* +** This function is a no-op if the pager is in exclusive mode and not +** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN +** state. +** +** If the pager is not in exclusive-access mode, the database file is +** completely unlocked. If the file is unlocked and the file-system does +** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is +** closed (if it is open). +** +** If the pager is in ERROR state when this function is called, the +** contents of the pager cache are discarded before switching back to +** the OPEN state. Regardless of whether the pager is in exclusive-mode +** or not, any journal file left in the file-system will be treated +** as a hot-journal and rolled back the next time a read-transaction +** is opened (by this or by any other connection). +*/ +static void pager_unlock(Pager *pPager){ + + assert( pPager->eState==PAGER_READER + || pPager->eState==PAGER_OPEN + || pPager->eState==PAGER_ERROR + ); + + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + releaseAllSavepoints(pPager); + + if( pagerUseWal(pPager) ){ + assert( !isOpen(pPager->jfd) ); + sqlite3WalEndReadTransaction(pPager->pWal); + pPager->eState = PAGER_OPEN; + }else if( !pPager->exclusiveMode ){ + int rc; /* Error code returned by pagerUnlockDb() */ + int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0; + + /* If the operating system support deletion of open files, then + ** close the journal file when dropping the database lock. Otherwise + ** another connection with journal_mode=delete might delete the file + ** out from under us. + */ + assert( (PAGER_JOURNALMODE_MEMORY & 5)!=1 ); + assert( (PAGER_JOURNALMODE_OFF & 5)!=1 ); + assert( (PAGER_JOURNALMODE_WAL & 5)!=1 ); + assert( (PAGER_JOURNALMODE_DELETE & 5)!=1 ); + assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 ); + assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 ); + if( 0==(iDc & SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN) + || 1!=(pPager->journalMode & 5) + ){ + sqlite3OsClose(pPager->jfd); + } + + /* If the pager is in the ERROR state and the call to unlock the database + ** file fails, set the current lock to UNKNOWN_LOCK. See the comment + ** above the #define for UNKNOWN_LOCK for an explanation of why this + ** is necessary. + */ + rc = pagerUnlockDb(pPager, NO_LOCK); + if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){ + pPager->eLock = UNKNOWN_LOCK; + } + + /* The pager state may be changed from PAGER_ERROR to PAGER_OPEN here + ** without clearing the error code. This is intentional - the error + ** code is cleared and the cache reset in the block below. + */ + assert( pPager->errCode || pPager->eState!=PAGER_ERROR ); + pPager->eState = PAGER_OPEN; + } + + /* If Pager.errCode is set, the contents of the pager cache cannot be + ** trusted. Now that there are no outstanding references to the pager, + ** it can safely move back to PAGER_OPEN state. This happens in both + ** normal and exclusive-locking mode. + */ + assert( pPager->errCode==SQLITE_OK || !MEMDB ); + if( pPager->errCode ){ + if( pPager->tempFile==0 ){ + pager_reset(pPager); + pPager->changeCountDone = 0; + pPager->eState = PAGER_OPEN; + }else{ + pPager->eState = (isOpen(pPager->jfd) ? PAGER_OPEN : PAGER_READER); + } + if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + pPager->errCode = SQLITE_OK; + setGetterMethod(pPager); + } + + pPager->journalOff = 0; + pPager->journalHdr = 0; + pPager->setSuper = 0; +} + +/* +** This function is called whenever an IOERR or FULL error that requires +** the pager to transition into the ERROR state may ahve occurred. +** The first argument is a pointer to the pager structure, the second +** the error-code about to be returned by a pager API function. The +** value returned is a copy of the second argument to this function. +** +** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the +** IOERR sub-codes, the pager enters the ERROR state and the error code +** is stored in Pager.errCode. While the pager remains in the ERROR state, +** all major API calls on the Pager will immediately return Pager.errCode. +** +** The ERROR state indicates that the contents of the pager-cache +** cannot be trusted. This state can be cleared by completely discarding +** the contents of the pager-cache. If a transaction was active when +** the persistent error occurred, then the rollback journal may need +** to be replayed to restore the contents of the database file (as if +** it were a hot-journal). +*/ +static int pager_error(Pager *pPager, int rc){ + int rc2 = rc & 0xff; + assert( rc==SQLITE_OK || !MEMDB ); + assert( + pPager->errCode==SQLITE_FULL || + pPager->errCode==SQLITE_OK || + (pPager->errCode & 0xff)==SQLITE_IOERR + ); + if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ + pPager->errCode = rc; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + } + return rc; +} + +static int pager_truncate(Pager *pPager, Pgno nPage); + +/* +** The write transaction open on pPager is being committed (bCommit==1) +** or rolled back (bCommit==0). +** +** Return TRUE if and only if all dirty pages should be flushed to disk. +** +** Rules: +** +** * For non-TEMP databases, always sync to disk. This is necessary +** for transactions to be durable. +** +** * Sync TEMP database only on a COMMIT (not a ROLLBACK) when the backing +** file has been created already (via a spill on pagerStress()) and +** when the number of dirty pages in memory exceeds 25% of the total +** cache size. +*/ +static int pagerFlushOnCommit(Pager *pPager, int bCommit){ + if( pPager->tempFile==0 ) return 1; + if( !bCommit ) return 0; + if( !isOpen(pPager->fd) ) return 0; + return (sqlite3PCachePercentDirty(pPager->pPCache)>=25); +} + +/* +** This routine ends a transaction. A transaction is usually ended by +** either a COMMIT or a ROLLBACK operation. This routine may be called +** after rollback of a hot-journal, or if an error occurs while opening +** the journal file or writing the very first journal-header of a +** database transaction. +** +** This routine is never called in PAGER_ERROR state. If it is called +** in PAGER_NONE or PAGER_SHARED state and the lock held is less +** exclusive than a RESERVED lock, it is a no-op. +** +** Otherwise, any active savepoints are released. +** +** If the journal file is open, then it is "finalized". Once a journal +** file has been finalized it is not possible to use it to roll back a +** transaction. Nor will it be considered to be a hot-journal by this +** or any other database connection. Exactly how a journal is finalized +** depends on whether or not the pager is running in exclusive mode and +** the current journal-mode (Pager.journalMode value), as follows: +** +** journalMode==MEMORY +** Journal file descriptor is simply closed. This destroys an +** in-memory journal. +** +** journalMode==TRUNCATE +** Journal file is truncated to zero bytes in size. +** +** journalMode==PERSIST +** The first 28 bytes of the journal file are zeroed. This invalidates +** the first journal header in the file, and hence the entire journal +** file. An invalid journal file cannot be rolled back. +** +** journalMode==DELETE +** The journal file is closed and deleted using sqlite3OsDelete(). +** +** If the pager is running in exclusive mode, this method of finalizing +** the journal file is never used. Instead, if the journalMode is +** DELETE and the pager is in exclusive mode, the method described under +** journalMode==PERSIST is used instead. +** +** After the journal is finalized, the pager moves to PAGER_READER state. +** If running in non-exclusive rollback mode, the lock on the file is +** downgraded to a SHARED_LOCK. +** +** SQLITE_OK is returned if no error occurs. If an error occurs during +** any of the IO operations to finalize the journal file or unlock the +** database then the IO error code is returned to the user. If the +** operation to finalize the journal file fails, then the code still +** tries to unlock the database file if not in exclusive mode. If the +** unlock operation fails as well, then the first error code related +** to the first error encountered (the journal finalization one) is +** returned. +*/ +static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ + int rc = SQLITE_OK; /* Error code from journal finalization operation */ + int rc2 = SQLITE_OK; /* Error code from db file unlock operation */ + + /* Do nothing if the pager does not have an open write transaction + ** or at least a RESERVED lock. This function may be called when there + ** is no write-transaction active but a RESERVED or greater lock is + ** held under two circumstances: + ** + ** 1. After a successful hot-journal rollback, it is called with + ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK. + ** + ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE + ** lock switches back to locking_mode=normal and then executes a + ** read-transaction, this function is called with eState==PAGER_READER + ** and eLock==EXCLUSIVE_LOCK when the read-transaction is closed. + */ + assert( assert_pager_state(pPager) ); + assert( pPager->eState!=PAGER_ERROR ); + if( pPager->eStateeLockjfd) || pPager->pInJournal==0 + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); + if( isOpen(pPager->jfd) ){ + assert( !pagerUseWal(pPager) ); + + /* Finalize the journal file. */ + if( sqlite3JournalIsInMemory(pPager->jfd) ){ + /* assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); */ + sqlite3OsClose(pPager->jfd); + }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ + if( pPager->journalOff==0 ){ + rc = SQLITE_OK; + }else{ + rc = sqlite3OsTruncate(pPager->jfd, 0); + if( rc==SQLITE_OK && pPager->fullSync ){ + /* Make sure the new file size is written into the inode right away. + ** Otherwise the journal might resurrect following a power loss and + ** cause the last transaction to roll back. See + ** https://bugzilla.mozilla.org/show_bug.cgi?id=1072773 + */ + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + } + } + pPager->journalOff = 0; + }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST + || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) + ){ + rc = zeroJournalHdr(pPager, hasSuper||pPager->tempFile); + pPager->journalOff = 0; + }else{ + /* This branch may be executed with Pager.journalMode==MEMORY if + ** a hot-journal was just rolled back. In this case the journal + ** file should be closed and deleted. If this connection writes to + ** the database file, it will do so using an in-memory journal. + */ + int bDelete = !pPager->tempFile; + assert( sqlite3JournalIsInMemory(pPager->jfd)==0 ); + assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE + || pPager->journalMode==PAGER_JOURNALMODE_MEMORY + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + sqlite3OsClose(pPager->jfd); + if( bDelete ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, pPager->extraSync); + } + } + } + +#ifdef SQLITE_CHECK_PAGES + sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash); + if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){ + PgHdr *p = sqlite3PagerLookup(pPager, 1); + if( p ){ + p->pageHash = 0; + sqlite3PagerUnrefNotNull(p); + } + } +#endif + + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + pPager->nRec = 0; + if( rc==SQLITE_OK ){ + if( MEMDB || pagerFlushOnCommit(pPager, bCommit) ){ + sqlite3PcacheCleanAll(pPager->pPCache); + }else{ + sqlite3PcacheClearWritable(pPager->pPCache); + } + sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); + } + + if( pagerUseWal(pPager) ){ + /* Drop the WAL write-lock, if any. Also, if the connection was in + ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE + ** lock held on the database file. + */ + rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); + assert( rc2==SQLITE_OK ); + }else if( rc==SQLITE_OK && bCommit && pPager->dbFileSize>pPager->dbSize ){ + /* This branch is taken when committing a transaction in rollback-journal + ** mode if the database file on disk is larger than the database image. + ** At this point the journal has been finalized and the transaction + ** successfully committed, but the EXCLUSIVE lock is still held on the + ** file. So it is safe to truncate the database file to its minimum + ** required size. */ + assert( pPager->eLock==EXCLUSIVE_LOCK ); + rc = pager_truncate(pPager, pPager->dbSize); + } + + if( rc==SQLITE_OK && bCommit ){ + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } + + if( !pPager->exclusiveMode + && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) + ){ + rc2 = pagerUnlockDb(pPager, SHARED_LOCK); + } + pPager->eState = PAGER_READER; + pPager->setSuper = 0; + + return (rc==SQLITE_OK?rc2:rc); +} + +/* +** Execute a rollback if a transaction is active and unlock the +** database file. +** +** If the pager has already entered the ERROR state, do not attempt +** the rollback at this time. Instead, pager_unlock() is called. The +** call to pager_unlock() will discard all in-memory pages, unlock +** the database file and move the pager back to OPEN state. If this +** means that there is a hot-journal left in the file-system, the next +** connection to obtain a shared lock on the pager (which may be this one) +** will roll it back. +** +** If the pager has not already entered the ERROR state, but an IO or +** malloc error occurs during a rollback, then this will itself cause +** the pager to enter the ERROR state. Which will be cleared by the +** call to pager_unlock(), as described above. +*/ +static void pagerUnlockAndRollback(Pager *pPager){ + if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){ + assert( assert_pager_state(pPager) ); + if( pPager->eState>=PAGER_WRITER_LOCKED ){ + sqlite3BeginBenignMalloc(); + sqlite3PagerRollback(pPager); + sqlite3EndBenignMalloc(); + }else if( !pPager->exclusiveMode ){ + assert( pPager->eState==PAGER_READER ); + pager_end_transaction(pPager, 0, 0); + } + } + pager_unlock(pPager); +} + +/* +** Parameter aData must point to a buffer of pPager->pageSize bytes +** of data. Compute and return a checksum based ont the contents of the +** page of data and the current value of pPager->cksumInit. +** +** This is not a real checksum. It is really just the sum of the +** random initial value (pPager->cksumInit) and every 200th byte +** of the page data, starting with byte offset (pPager->pageSize%200). +** Each byte is interpreted as an 8-bit unsigned integer. +** +** Changing the formula used to compute this checksum results in an +** incompatible journal file format. +** +** If journal corruption occurs due to a power failure, the most likely +** scenario is that one end or the other of the record will be changed. +** It is much less likely that the two ends of the journal record will be +** correct and the middle be corrupt. Thus, this "checksum" scheme, +** though fast and simple, catches the mostly likely kind of corruption. +*/ +static u32 pager_cksum(Pager *pPager, const u8 *aData){ + u32 cksum = pPager->cksumInit; /* Checksum value to return */ + int i = pPager->pageSize-200; /* Loop counter */ + while( i>0 ){ + cksum += aData[i]; + i -= 200; + } + return cksum; +} + +/* +** Report the current page size and number of reserved bytes back +** to the codec. +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +static void pagerReportSize(Pager *pPager){ + if( pPager->xCodecSizeChng ){ + pPager->xCodecSizeChng(pPager->pCodec, pPager->pageSize, + (int)pPager->nReserve); + } +} +#else +# define pagerReportSize(X) /* No-op if we do not support a codec */ +#endif +/* END SQLCIPHER */ + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +/* +** Make sure the number of reserved bits is the same in the destination +** pager as it is in the source. This comes up when a VACUUM changes the +** number of reserved bits to the "optimal" amount. +*/ +SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager *pDest, Pager *pSrc){ + if( pDest->nReserve!=pSrc->nReserve ){ + pDest->nReserve = pSrc->nReserve; + pagerReportSize(pDest); + } +} +#endif +/* END SQLCIPHER */ + +/* +** Read a single page from either the journal file (if isMainJrnl==1) or +** from the sub-journal (if isMainJrnl==0) and playback that page. +** The page begins at offset *pOffset into the file. The *pOffset +** value is increased to the start of the next page in the journal. +** +** The main rollback journal uses checksums - the statement journal does +** not. +** +** If the page number of the page record read from the (sub-)journal file +** is greater than the current value of Pager.dbSize, then playback is +** skipped and SQLITE_OK is returned. +** +** If pDone is not NULL, then it is a record of pages that have already +** been played back. If the page at *pOffset has already been played back +** (if the corresponding pDone bit is set) then skip the playback. +** Make sure the pDone bit corresponding to the *pOffset page is set +** prior to returning. +** +** If the page record is successfully read from the (sub-)journal file +** and played back, then SQLITE_OK is returned. If an IO error occurs +** while reading the record from the (sub-)journal file or while writing +** to the database file, then the IO error code is returned. If data +** is successfully read from the (sub-)journal file but appears to be +** corrupted, SQLITE_DONE is returned. Data is considered corrupted in +** two circumstances: +** +** * If the record page-number is illegal (0 or PAGER_SJ_PGNO), or +** * If the record is being rolled back from the main journal file +** and the checksum field does not match the record content. +** +** Neither of these two scenarios are possible during a savepoint rollback. +** +** If this is a savepoint rollback, then memory may have to be dynamically +** allocated by this function. If this is the case and an allocation fails, +** SQLITE_NOMEM is returned. +*/ +static int pager_playback_one_page( + Pager *pPager, /* The pager being played back */ + i64 *pOffset, /* Offset of record to playback */ + Bitvec *pDone, /* Bitvec of pages already played back */ + int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */ + int isSavepnt /* True for a savepoint rollback */ +){ + int rc; + PgHdr *pPg; /* An existing page in the cache */ + Pgno pgno; /* The page number of a page in journal */ + u32 cksum; /* Checksum used for sanity checking */ + char *aData; /* Temporary storage for the page */ + sqlite3_file *jfd; /* The file descriptor for the journal file */ + int isSynced; /* True if journal page is synced */ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + /* The jrnlEnc flag is true if Journal pages should be passed through + ** the codec. It is false for pure in-memory journals. */ + const int jrnlEnc = (isMainJrnl || pPager->subjInMemory==0); +#endif +/* END SQLCIPHER */ + + assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */ + assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */ + assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */ + assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */ + + aData = pPager->pTmpSpace; + assert( aData ); /* Temp storage must have already been allocated */ + assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) ); + + /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction + ** or savepoint rollback done at the request of the caller) or this is + ** a hot-journal rollback. If it is a hot-journal rollback, the pager + ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback + ** only reads from the main journal, not the sub-journal. + */ + assert( pPager->eState>=PAGER_WRITER_CACHEMOD + || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK) + ); + assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl ); + + /* Read the page number and page data from the journal or sub-journal + ** file. Return an error code to the caller if an IO error occurs. + */ + jfd = isMainJrnl ? pPager->jfd : pPager->sjfd; + rc = read32bits(jfd, *pOffset, &pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4); + if( rc!=SQLITE_OK ) return rc; + *pOffset += pPager->pageSize + 4 + isMainJrnl*4; + + /* Sanity checking on the page. This is more important that I originally + ** thought. If a power failure occurs while the journal is being written, + ** it could cause invalid data to be written into the journal. We need to + ** detect this invalid data (with high probability) and ignore it. + */ + if( pgno==0 || pgno==PAGER_SJ_PGNO(pPager) ){ + assert( !isSavepnt ); + return SQLITE_DONE; + } + if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){ + return SQLITE_OK; + } + if( isMainJrnl ){ + rc = read32bits(jfd, (*pOffset)-4, &cksum); + if( rc ) return rc; + if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){ + return SQLITE_DONE; + } + } + + /* If this page has already been played back before during the current + ** rollback, then don't bother to play it back again. + */ + if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){ + return rc; + } + + /* When playing back page 1, restore the nReserve setting + */ + if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){ + pPager->nReserve = ((u8*)aData)[20]; + pagerReportSize(pPager); + } + + /* If the pager is in CACHEMOD state, then there must be a copy of this + ** page in the pager cache. In this case just update the pager cache, + ** not the database file. The page is left marked dirty in this case. + ** + ** An exception to the above rule: If the database is in no-sync mode + ** and a page is moved during an incremental vacuum then the page may + ** not be in the pager cache. Later: if a malloc() or IO error occurs + ** during a Movepage() call, then the page may not be in the cache + ** either. So the condition described in the above paragraph is not + ** assert()able. + ** + ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the + ** pager cache if it exists and the main file. The page is then marked + ** not dirty. Since this code is only executed in PAGER_OPEN state for + ** a hot-journal rollback, it is guaranteed that the page-cache is empty + ** if the pager is in OPEN state. + ** + ** Ticket #1171: The statement journal might contain page content that is + ** different from the page content at the start of the transaction. + ** This occurs when a page is changed prior to the start of a statement + ** then changed again within the statement. When rolling back such a + ** statement we must not write to the original database unless we know + ** for certain that original page contents are synced into the main rollback + ** journal. Otherwise, a power loss might leave modified data in the + ** database file without an entry in the rollback journal that can + ** restore the database to its original form. Two conditions must be + ** met before writing to the database files. (1) the database must be + ** locked. (2) we know that the original page content is fully synced + ** in the main journal either because the page is not in cache or else + ** the page is marked as needSync==0. + ** + ** 2008-04-14: When attempting to vacuum a corrupt database file, it + ** is possible to fail a statement on a database that does not yet exist. + ** Do not attempt to write if database file has never been opened. + */ + if( pagerUseWal(pPager) ){ + pPg = 0; + }else{ + pPg = sqlite3PagerLookup(pPager, pgno); + } + assert( pPg || !MEMDB ); + assert( pPager->eState!=PAGER_OPEN || pPg==0 || pPager->tempFile ); + PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", + PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), + (isMainJrnl?"main-journal":"sub-journal") + )); + if( isMainJrnl ){ + isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr); + }else{ + isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC)); + } + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + && isSynced + ){ + i64 ofst = (pgno-1)*(i64)pPager->pageSize; + testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 ); + assert( !pagerUseWal(pPager) ); + + /* Write the data read from the journal back into the database file. + ** This is usually safe even for an encrypted database - as the data + ** was encrypted before it was written to the journal file. The exception + ** is if the data was just read from an in-memory sub-journal. In that + ** case it must be encrypted here before it is copied into the database + ** file. */ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if( !jrnlEnc ){ + CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM_BKPT, aData); + rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); + CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM_BKPT); + }else +#endif +/* END SQLCIPHER */ + rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); + + if( pgno>pPager->dbFileSize ){ + pPager->dbFileSize = pgno; + } + if( pPager->pBackup ){ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if( jrnlEnc ){ + CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM_BKPT); + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); + CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM_BKPT,aData); + }else +#endif +/* END SQLCIPHER */ + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); + } + }else if( !isMainJrnl && pPg==0 ){ + /* If this is a rollback of a savepoint and data was not written to + ** the database and the page is not in-memory, there is a potential + ** problem. When the page is next fetched by the b-tree layer, it + ** will be read from the database file, which may or may not be + ** current. + ** + ** There are a couple of different ways this can happen. All are quite + ** obscure. When running in synchronous mode, this can only happen + ** if the page is on the free-list at the start of the transaction, then + ** populated, then moved using sqlite3PagerMovepage(). + ** + ** The solution is to add an in-memory page to the cache containing + ** the data just read from the sub-journal. Mark the page as dirty + ** and if the pager requires a journal-sync, then mark the page as + ** requiring a journal-sync before it is written. + */ + assert( isSavepnt ); + assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)==0 ); + pPager->doNotSpill |= SPILLFLAG_ROLLBACK; + rc = sqlite3PagerGet(pPager, pgno, &pPg, 1); + assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); + pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; + if( rc!=SQLITE_OK ) return rc; + sqlite3PcacheMakeDirty(pPg); + } + if( pPg ){ + /* No page should ever be explicitly rolled back that is in use, except + ** for page 1 which is held in use in order to keep the lock on the + ** database active. However such a page may be rolled back as a result + ** of an internal error resulting in an automatic call to + ** sqlite3PagerRollback(). + */ + void *pData; + pData = pPg->pData; + memcpy(pData, (u8*)aData, pPager->pageSize); + pPager->xReiniter(pPg); + /* It used to be that sqlite3PcacheMakeClean(pPg) was called here. But + ** that call was dangerous and had no detectable benefit since the cache + ** is normally cleaned by sqlite3PcacheCleanAll() after rollback and so + ** has been removed. */ + pager_set_pagehash(pPg); + + /* If this was page 1, then restore the value of Pager.dbFileVers. + ** Do this before any decoding. */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); + } + + /* Decode the page just read from disk */ +/* BEGIN SQLCIPHER */ +#if SQLITE_HAS_CODEC + if( jrnlEnc ){ CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM_BKPT); } +#endif +/* END SQLCIPHER */ + sqlite3PcacheRelease(pPg); + } + return rc; +} + +/* +** Parameter zSuper is the name of a super-journal file. A single journal +** file that referred to the super-journal file has just been rolled back. +** This routine checks if it is possible to delete the super-journal file, +** and does so if it is. +** +** Argument zSuper may point to Pager.pTmpSpace. So that buffer is not +** available for use within this function. +** +** When a super-journal file is created, it is populated with the names +** of all of its child journals, one after another, formatted as utf-8 +** encoded text. The end of each child journal file is marked with a +** nul-terminator byte (0x00). i.e. the entire contents of a super-journal +** file for a transaction involving two databases might be: +** +** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00" +** +** A super-journal file may only be deleted once all of its child +** journals have been rolled back. +** +** This function reads the contents of the super-journal file into +** memory and loops through each of the child journal names. For +** each child journal, it checks if: +** +** * if the child journal exists, and if so +** * if the child journal contains a reference to super-journal +** file zSuper +** +** If a child journal can be found that matches both of the criteria +** above, this function returns without doing anything. Otherwise, if +** no such child journal can be found, file zSuper is deleted from +** the file-system using sqlite3OsDelete(). +** +** If an IO error within this function, an error code is returned. This +** function allocates memory by calling sqlite3Malloc(). If an allocation +** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors +** occur, SQLITE_OK is returned. +** +** TODO: This function allocates a single block of memory to load +** the entire contents of the super-journal file. This could be +** a couple of kilobytes or so - potentially larger than the page +** size. +*/ +static int pager_delsuper(Pager *pPager, const char *zSuper){ + sqlite3_vfs *pVfs = pPager->pVfs; + int rc; /* Return code */ + sqlite3_file *pSuper; /* Malloc'd super-journal file descriptor */ + sqlite3_file *pJournal; /* Malloc'd child-journal file descriptor */ + char *zSuperJournal = 0; /* Contents of super-journal file */ + i64 nSuperJournal; /* Size of super-journal file */ + char *zJournal; /* Pointer to one journal within MJ file */ + char *zSuperPtr; /* Space to hold super-journal filename */ + char *zFree = 0; /* Free this buffer */ + int nSuperPtr; /* Amount of space allocated to zSuperPtr[] */ + + /* Allocate space for both the pJournal and pSuper file descriptors. + ** If successful, open the super-journal file for reading. + */ + pSuper = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2); + if( !pSuper ){ + rc = SQLITE_NOMEM_BKPT; + pJournal = 0; + }else{ + const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_SUPER_JOURNAL); + rc = sqlite3OsOpen(pVfs, zSuper, pSuper, flags, 0); + pJournal = (sqlite3_file *)(((u8 *)pSuper) + pVfs->szOsFile); + } + if( rc!=SQLITE_OK ) goto delsuper_out; + + /* Load the entire super-journal file into space obtained from + ** sqlite3_malloc() and pointed to by zSuperJournal. Also obtain + ** sufficient space (in zSuperPtr) to hold the names of super-journal + ** files extracted from regular rollback-journals. + */ + rc = sqlite3OsFileSize(pSuper, &nSuperJournal); + if( rc!=SQLITE_OK ) goto delsuper_out; + nSuperPtr = pVfs->mxPathname+1; + zFree = sqlite3Malloc(4 + nSuperJournal + nSuperPtr + 2); + if( !zFree ){ + rc = SQLITE_NOMEM_BKPT; + goto delsuper_out; + } + zFree[0] = zFree[1] = zFree[2] = zFree[3] = 0; + zSuperJournal = &zFree[4]; + zSuperPtr = &zSuperJournal[nSuperJournal+2]; + rc = sqlite3OsRead(pSuper, zSuperJournal, (int)nSuperJournal, 0); + if( rc!=SQLITE_OK ) goto delsuper_out; + zSuperJournal[nSuperJournal] = 0; + zSuperJournal[nSuperJournal+1] = 0; + + zJournal = zSuperJournal; + while( (zJournal-zSuperJournal)pageSize bytes). +** If the file on disk is currently larger than nPage pages, then use the VFS +** xTruncate() method to truncate it. +** +** Or, it might be the case that the file on disk is smaller than +** nPage pages. Some operating system implementations can get confused if +** you try to truncate a file to some size that is larger than it +** currently is, so detect this case and write a single zero byte to +** the end of the new file instead. +** +** If successful, return SQLITE_OK. If an IO error occurs while modifying +** the database file, return the error code to the caller. +*/ +static int pager_truncate(Pager *pPager, Pgno nPage){ + int rc = SQLITE_OK; + assert( pPager->eState!=PAGER_ERROR ); + assert( pPager->eState!=PAGER_READER ); + + if( isOpen(pPager->fd) + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + ){ + i64 currentSize, newSize; + int szPage = pPager->pageSize; + assert( pPager->eLock==EXCLUSIVE_LOCK ); + /* TODO: Is it safe to use Pager.dbFileSize here? */ + rc = sqlite3OsFileSize(pPager->fd, ¤tSize); + newSize = szPage*(i64)nPage; + if( rc==SQLITE_OK && currentSize!=newSize ){ + if( currentSize>newSize ){ + rc = sqlite3OsTruncate(pPager->fd, newSize); + }else if( (currentSize+szPage)<=newSize ){ + char *pTmp = pPager->pTmpSpace; + memset(pTmp, 0, szPage); + testcase( (newSize-szPage) == currentSize ); + testcase( (newSize-szPage) > currentSize ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &newSize); + rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); + } + if( rc==SQLITE_OK ){ + pPager->dbFileSize = nPage; + } + } + } + return rc; +} + +/* +** Return a sanitized version of the sector-size of OS file pFile. The +** return value is guaranteed to lie between 32 and MAX_SECTOR_SIZE. +*/ +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *pFile){ + int iRet = sqlite3OsSectorSize(pFile); + if( iRet<32 ){ + iRet = 512; + }else if( iRet>MAX_SECTOR_SIZE ){ + assert( MAX_SECTOR_SIZE>=512 ); + iRet = MAX_SECTOR_SIZE; + } + return iRet; +} + +/* +** Set the value of the Pager.sectorSize variable for the given +** pager based on the value returned by the xSectorSize method +** of the open database file. The sector size will be used +** to determine the size and alignment of journal header and +** super-journal pointers within created journal files. +** +** For temporary files the effective sector size is always 512 bytes. +** +** Otherwise, for non-temporary files, the effective sector size is +** the value returned by the xSectorSize() method rounded up to 32 if +** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it +** is greater than MAX_SECTOR_SIZE. +** +** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set +** the effective sector size to its minimum value (512). The purpose of +** pPager->sectorSize is to define the "blast radius" of bytes that +** might change if a crash occurs while writing to a single byte in +** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero +** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector +** size. For backwards compatibility of the rollback journal file format, +** we cannot reduce the effective sector size below 512. +*/ +static void setSectorSize(Pager *pPager){ + assert( isOpen(pPager->fd) || pPager->tempFile ); + + if( pPager->tempFile + || (sqlite3OsDeviceCharacteristics(pPager->fd) & + SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 + ){ + /* Sector size doesn't matter for temporary files. Also, the file + ** may not have been opened yet, in which case the OsSectorSize() + ** call will segfault. */ + pPager->sectorSize = 512; + }else{ + pPager->sectorSize = sqlite3SectorSize(pPager->fd); + } +} + +/* +** Playback the journal and thus restore the database file to +** the state it was in before we started making changes. +** +** The journal file format is as follows: +** +** (1) 8 byte prefix. A copy of aJournalMagic[]. +** (2) 4 byte big-endian integer which is the number of valid page records +** in the journal. If this value is 0xffffffff, then compute the +** number of page records from the journal size. +** (3) 4 byte big-endian integer which is the initial value for the +** sanity checksum. +** (4) 4 byte integer which is the number of pages to truncate the +** database to during a rollback. +** (5) 4 byte big-endian integer which is the sector size. The header +** is this many bytes in size. +** (6) 4 byte big-endian integer which is the page size. +** (7) zero padding out to the next sector size. +** (8) Zero or more pages instances, each as follows: +** + 4 byte page number. +** + pPager->pageSize bytes of data. +** + 4 byte checksum +** +** When we speak of the journal header, we mean the first 7 items above. +** Each entry in the journal is an instance of the 8th item. +** +** Call the value from the second bullet "nRec". nRec is the number of +** valid page entries in the journal. In most cases, you can compute the +** value of nRec from the size of the journal file. But if a power +** failure occurred while the journal was being written, it could be the +** case that the size of the journal file had already been increased but +** the extra entries had not yet made it safely to disk. In such a case, +** the value of nRec computed from the file size would be too large. For +** that reason, we always use the nRec value in the header. +** +** If the nRec value is 0xffffffff it means that nRec should be computed +** from the file size. This value is used when the user selects the +** no-sync option for the journal. A power failure could lead to corruption +** in this case. But for things like temporary table (which will be +** deleted when the power is restored) we don't care. +** +** If the file opened as the journal file is not a well-formed +** journal file then all pages up to the first corrupted page are rolled +** back (or no pages if the journal header is corrupted). The journal file +** is then deleted and SQLITE_OK returned, just as if no corruption had +** been encountered. +** +** If an I/O or malloc() error occurs, the journal-file is not deleted +** and an error code is returned. +** +** The isHot parameter indicates that we are trying to rollback a journal +** that might be a hot journal. Or, it could be that the journal is +** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE. +** If the journal really is hot, reset the pager cache prior rolling +** back any content. If the journal is merely persistent, no reset is +** needed. +*/ +static int pager_playback(Pager *pPager, int isHot){ + sqlite3_vfs *pVfs = pPager->pVfs; + i64 szJ; /* Size of the journal file in bytes */ + u32 nRec; /* Number of Records in the journal */ + u32 u; /* Unsigned loop counter */ + Pgno mxPg = 0; /* Size of the original file in pages */ + int rc; /* Result code of a subroutine */ + int res = 1; /* Value returned by sqlite3OsAccess() */ + char *zSuper = 0; /* Name of super-journal file if any */ + int needPagerReset; /* True to reset page prior to first page rollback */ + int nPlayback = 0; /* Total number of pages restored from journal */ + u32 savedPageSize = pPager->pageSize; + + /* Figure out how many records are in the journal. Abort early if + ** the journal is empty. + */ + assert( isOpen(pPager->jfd) ); + rc = sqlite3OsFileSize(pPager->jfd, &szJ); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + + /* Read the super-journal name from the journal, if it is present. + ** If a super-journal file name is specified, but the file is not + ** present on disk, then the journal is not hot and does not need to be + ** played back. + ** + ** TODO: Technically the following is an error because it assumes that + ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that + ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c, + ** mxPathname is 512, which is the same as the minimum allowable value + ** for pageSize. + */ + zSuper = pPager->pTmpSpace; + rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); + if( rc==SQLITE_OK && zSuper[0] ){ + rc = sqlite3OsAccess(pVfs, zSuper, SQLITE_ACCESS_EXISTS, &res); + } + zSuper = 0; + if( rc!=SQLITE_OK || !res ){ + goto end_playback; + } + pPager->journalOff = 0; + needPagerReset = isHot; + + /* This loop terminates either when a readJournalHdr() or + ** pager_playback_one_page() call returns SQLITE_DONE or an IO error + ** occurs. + */ + while( 1 ){ + /* Read the next journal header from the journal file. If there are + ** not enough bytes left in the journal file for a complete header, or + ** it is corrupted, then a process must have failed while writing it. + ** This indicates nothing more needs to be rolled back. + */ + rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + goto end_playback; + } + + /* If nRec is 0xffffffff, then this journal was created by a process + ** working in no-sync mode. This means that the rest of the journal + ** file consists of pages, there are no more journal headers. Compute + ** the value of nRec based on this assumption. + */ + if( nRec==0xffffffff ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ); + nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager)); + } + + /* If nRec is 0 and this rollback is of a transaction created by this + ** process and if this is the final header in the journal, then it means + ** that this part of the journal was being filled but has not yet been + ** synced to disk. Compute the number of pages based on the remaining + ** size of the file. + ** + ** The third term of the test was added to fix ticket #2565. + ** When rolling back a hot journal, nRec==0 always means that the next + ** chunk of the journal contains zero pages to be rolled back. But + ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in + ** the journal, it means that the journal might contain additional + ** pages that need to be rolled back and that the number of pages + ** should be computed based on the journal file size. + */ + if( nRec==0 && !isHot && + pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ + nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager)); + } + + /* If this is the first header read from the journal, truncate the + ** database file back to its original size. + */ + if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){ + rc = pager_truncate(pPager, mxPg); + if( rc!=SQLITE_OK ){ + goto end_playback; + } + pPager->dbSize = mxPg; + if( pPager->mxPgnomxPgno = mxPg; + } + } + + /* Copy original pages out of the journal and back into the + ** database file and/or page cache. + */ + for(u=0; ujournalOff,0,1,0); + if( rc==SQLITE_OK ){ + nPlayback++; + }else{ + if( rc==SQLITE_DONE ){ + pPager->journalOff = szJ; + break; + }else if( rc==SQLITE_IOERR_SHORT_READ ){ + /* If the journal has been truncated, simply stop reading and + ** processing the journal. This might happen if the journal was + ** not completely written and synced prior to a crash. In that + ** case, the database should have never been written in the + ** first place so it is OK to simply abandon the rollback. */ + rc = SQLITE_OK; + goto end_playback; + }else{ + /* If we are unable to rollback, quit and return the error + ** code. This will cause the pager to enter the error state + ** so that no further harm will be done. Perhaps the next + ** process to come along will be able to rollback the database. + */ + goto end_playback; + } + } + } + } + /*NOTREACHED*/ + assert( 0 ); + +end_playback: + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSetPagesize(pPager, &savedPageSize, -1); + } + /* Following a rollback, the database file should be back in its original + ** state prior to the start of the transaction, so invoke the + ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the + ** assertion that the transaction counter was modified. + */ +#ifdef SQLITE_DEBUG + sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); +#endif + + /* If this playback is happening automatically as a result of an IO or + ** malloc error that occurred after the change-counter was updated but + ** before the transaction was committed, then the change-counter + ** modification may just have been reverted. If this happens in exclusive + ** mode, then subsequent transactions performed by the connection will not + ** update the change-counter at all. This may lead to cache inconsistency + ** problems for other processes at some point in the future. So, just + ** in case this has happened, clear the changeCountDone flag now. + */ + pPager->changeCountDone = pPager->tempFile; + + if( rc==SQLITE_OK ){ + /* Leave 4 bytes of space before the super-journal filename in memory. + ** This is because it may end up being passed to sqlite3OsOpen(), in + ** which case it requires 4 0x00 bytes in memory immediately before + ** the filename. */ + zSuper = &pPager->pTmpSpace[4]; + rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); + testcase( rc!=SQLITE_OK ); + } + if( rc==SQLITE_OK + && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) + ){ + rc = sqlite3PagerSync(pPager, 0); + } + if( rc==SQLITE_OK ){ + rc = pager_end_transaction(pPager, zSuper[0]!='\0', 0); + testcase( rc!=SQLITE_OK ); + } + if( rc==SQLITE_OK && zSuper[0] && res ){ + /* If there was a super-journal and this routine will return success, + ** see if it is possible to delete the super-journal. + */ + assert( zSuper==&pPager->pTmpSpace[4] ); + memset(&zSuper[-4], 0, 4); + rc = pager_delsuper(pPager, zSuper); + testcase( rc!=SQLITE_OK ); + } + if( isHot && nPlayback ){ + sqlite3_log(SQLITE_NOTICE_RECOVER_ROLLBACK, "recovered %d pages from %s", + nPlayback, pPager->zJournal); + } + + /* The Pager.sectorSize variable may have been updated while rolling + ** back a journal created by a process with a different sector size + ** value. Reset it to the correct value for this process. + */ + setSectorSize(pPager); + return rc; +} + + +/* +** Read the content for page pPg out of the database file (or out of +** the WAL if that is where the most recent copy if found) into +** pPg->pData. A shared lock or greater must be held on the database +** file before this function is called. +** +** If page 1 is read, then the value of Pager.dbFileVers[] is set to +** the value read from the database file. +** +** If an IO error occurs, then the IO error is returned to the caller. +** Otherwise, SQLITE_OK is returned. +*/ +static int readDbPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ + int rc = SQLITE_OK; /* Return code */ + +#ifndef SQLITE_OMIT_WAL + u32 iFrame = 0; /* Frame of WAL containing pgno */ + + assert( pPager->eState>=PAGER_READER && !MEMDB ); + assert( isOpen(pPager->fd) ); + + if( pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); + if( rc ) return rc; + } + if( iFrame ){ + rc = sqlite3WalReadFrame(pPager->pWal, iFrame,pPager->pageSize,pPg->pData); + }else +#endif + { + i64 iOffset = (pPg->pgno-1)*(i64)pPager->pageSize; + rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + + if( pPg->pgno==1 ){ + if( rc ){ + /* If the read is unsuccessful, set the dbFileVers[] to something + ** that will never be a valid file version. dbFileVers[] is a copy + ** of bytes 24..39 of the database. Bytes 28..31 should always be + ** zero or the size of the database in page. Bytes 32..35 and 35..39 + ** should be page numbers which are never 0xffffffff. So filling + ** pPager->dbFileVers[] with all 0xff bytes should suffice. + ** + ** For an encrypted database, the situation is more complex: bytes + ** 24..39 of the database are white noise. But the probability of + ** white noise equaling 16 bytes of 0xff is vanishingly small so + ** we should still be ok. + */ + memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); + }else{ + u8 *dbFileVers = &((u8*)pPg->pData)[24]; + memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); + } + } + CODEC1(pPager, pPg->pData, pPg->pgno, 3, rc = SQLITE_NOMEM_BKPT); + + PAGER_INCR(sqlite3_pager_readdb_count); + PAGER_INCR(pPager->nRead); + IOTRACE(("PGIN %p %d\n", pPager, pPg->pgno)); + PAGERTRACE(("FETCH %d page %d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, pager_pagehash(pPg))); + + return rc; +} + +/* +** Update the value of the change-counter at offsets 24 and 92 in +** the header and the sqlite version number at offset 96. +** +** This is an unconditional update. See also the pager_incr_changecounter() +** routine which only updates the change-counter if the update is actually +** needed, as determined by the pPager->changeCountDone state variable. +*/ +static void pager_write_changecounter(PgHdr *pPg){ + u32 change_counter; + if( NEVER(pPg==0) ) return; + + /* Increment the value just read and write it back to byte 24. */ + change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1; + put32bits(((char*)pPg->pData)+24, change_counter); + + /* Also store the SQLite version number in bytes 96..99 and in + ** bytes 92..95 store the change counter for which the version number + ** is valid. */ + put32bits(((char*)pPg->pData)+92, change_counter); + put32bits(((char*)pPg->pData)+96, SQLITE_VERSION_NUMBER); +} + +#ifndef SQLITE_OMIT_WAL +/* +** This function is invoked once for each page that has already been +** written into the log file when a WAL transaction is rolled back. +** Parameter iPg is the page number of said page. The pCtx argument +** is actually a pointer to the Pager structure. +** +** If page iPg is present in the cache, and has no outstanding references, +** it is discarded. Otherwise, if there are one or more outstanding +** references, the page content is reloaded from the database. If the +** attempt to reload content from the database is required and fails, +** return an SQLite error code. Otherwise, SQLITE_OK. +*/ +static int pagerUndoCallback(void *pCtx, Pgno iPg){ + int rc = SQLITE_OK; + Pager *pPager = (Pager *)pCtx; + PgHdr *pPg; + + assert( pagerUseWal(pPager) ); + pPg = sqlite3PagerLookup(pPager, iPg); + if( pPg ){ + if( sqlite3PcachePageRefcount(pPg)==1 ){ + sqlite3PcacheDrop(pPg); + }else{ + rc = readDbPage(pPg); + if( rc==SQLITE_OK ){ + pPager->xReiniter(pPg); + } + sqlite3PagerUnrefNotNull(pPg); + } + } + + /* Normally, if a transaction is rolled back, any backup processes are + ** updated as data is copied out of the rollback journal and into the + ** database. This is not generally possible with a WAL database, as + ** rollback involves simply truncating the log file. Therefore, if one + ** or more frames have already been written to the log (and therefore + ** also copied into the backup databases) as part of this transaction, + ** the backups must be restarted. + */ + sqlite3BackupRestart(pPager->pBackup); + + return rc; +} + +/* +** This function is called to rollback a transaction on a WAL database. +*/ +static int pagerRollbackWal(Pager *pPager){ + int rc; /* Return Code */ + PgHdr *pList; /* List of dirty pages to revert */ + + /* For all pages in the cache that are currently dirty or have already + ** been written (but not committed) to the log file, do one of the + ** following: + ** + ** + Discard the cached page (if refcount==0), or + ** + Reload page content from the database (if refcount>0). + */ + pPager->dbSize = pPager->dbOrigSize; + rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); + pList = sqlite3PcacheDirtyList(pPager->pPCache); + while( pList && rc==SQLITE_OK ){ + PgHdr *pNext = pList->pDirty; + rc = pagerUndoCallback((void *)pPager, pList->pgno); + pList = pNext; + } + + return rc; +} + +/* +** This function is a wrapper around sqlite3WalFrames(). As well as logging +** the contents of the list of pages headed by pList (connected by pDirty), +** this function notifies any active backup processes that the pages have +** changed. +** +** The list of pages passed into this routine is always sorted by page number. +** Hence, if page 1 appears anywhere on the list, it will be the first page. +*/ +static int pagerWalFrames( + Pager *pPager, /* Pager object */ + PgHdr *pList, /* List of frames to log */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit /* True if this is a commit */ +){ + int rc; /* Return code */ + int nList; /* Number of pages in pList */ + PgHdr *p; /* For looping over pages */ + + assert( pPager->pWal ); + assert( pList ); +#ifdef SQLITE_DEBUG + /* Verify that the page list is in accending order */ + for(p=pList; p && p->pDirty; p=p->pDirty){ + assert( p->pgno < p->pDirty->pgno ); + } +#endif + + assert( pList->pDirty==0 || isCommit ); + if( isCommit ){ + /* If a WAL transaction is being committed, there is no point in writing + ** any pages with page numbers greater than nTruncate into the WAL file. + ** They will never be read by any client. So remove them from the pDirty + ** list here. */ + PgHdr **ppNext = &pList; + nList = 0; + for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ + if( p->pgno<=nTruncate ){ + ppNext = &p->pDirty; + nList++; + } + } + assert( pList ); + }else{ + nList = 1; + } + pPager->aStat[PAGER_STAT_WRITE] += nList; + + if( pList->pgno==1 ) pager_write_changecounter(pList); + rc = sqlite3WalFrames(pPager->pWal, + pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags + ); + if( rc==SQLITE_OK && pPager->pBackup ){ + for(p=pList; p; p=p->pDirty){ + sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); + } + } + +#ifdef SQLITE_CHECK_PAGES + pList = sqlite3PcacheDirtyList(pPager->pPCache); + for(p=pList; p; p=p->pDirty){ + pager_set_pagehash(p); + } +#endif + + return rc; +} + +/* +** Begin a read transaction on the WAL. +** +** This routine used to be called "pagerOpenSnapshot()" because it essentially +** makes a snapshot of the database at the current point in time and preserves +** that snapshot for use by the reader in spite of concurrently changes by +** other writers or checkpointers. +*/ +static int pagerBeginReadTransaction(Pager *pPager){ + int rc; /* Return code */ + int changed = 0; /* True if cache must be reset */ + + assert( pagerUseWal(pPager) ); + assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); + + /* sqlite3WalEndReadTransaction() was not called for the previous + ** transaction in locking_mode=EXCLUSIVE. So call it now. If we + ** are in locking_mode=NORMAL and EndRead() was previously called, + ** the duplicate call is harmless. + */ + sqlite3WalEndReadTransaction(pPager->pWal); + + rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); + if( rc!=SQLITE_OK || changed ){ + pager_reset(pPager); + if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + } + + return rc; +} +#endif + +/* +** This function is called as part of the transition from PAGER_OPEN +** to PAGER_READER state to determine the size of the database file +** in pages (assuming the page size currently stored in Pager.pageSize). +** +** If no error occurs, SQLITE_OK is returned and the size of the database +** in pages is stored in *pnPage. Otherwise, an error code (perhaps +** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified. +*/ +static int pagerPagecount(Pager *pPager, Pgno *pnPage){ + Pgno nPage; /* Value to return via *pnPage */ + + /* Query the WAL sub-system for the database size. The WalDbsize() + ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or + ** if the database size is not available. The database size is not + ** available from the WAL sub-system if the log file is empty or + ** contains no valid committed transactions. + */ + assert( pPager->eState==PAGER_OPEN ); + assert( pPager->eLock>=SHARED_LOCK ); + assert( isOpen(pPager->fd) ); + assert( pPager->tempFile==0 ); + nPage = sqlite3WalDbsize(pPager->pWal); + + /* If the number of pages in the database is not available from the + ** WAL sub-system, determine the page count based on the size of + ** the database file. If the size of the database file is not an + ** integer multiple of the page-size, round up the result. + */ + if( nPage==0 && ALWAYS(isOpen(pPager->fd)) ){ + i64 n = 0; /* Size of db file in bytes */ + int rc = sqlite3OsFileSize(pPager->fd, &n); + if( rc!=SQLITE_OK ){ + return rc; + } + nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); + } + + /* If the current number of pages in the file is greater than the + ** configured maximum pager number, increase the allowed limit so + ** that the file can be read. + */ + if( nPage>pPager->mxPgno ){ + pPager->mxPgno = (Pgno)nPage; + } + + *pnPage = nPage; + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_WAL +/* +** Check if the *-wal file that corresponds to the database opened by pPager +** exists if the database is not empy, or verify that the *-wal file does +** not exist (by deleting it) if the database file is empty. +** +** If the database is not empty and the *-wal file exists, open the pager +** in WAL mode. If the database is empty or if no *-wal file exists and +** if no error occurs, make sure Pager.journalMode is not set to +** PAGER_JOURNALMODE_WAL. +** +** Return SQLITE_OK or an error code. +** +** The caller must hold a SHARED lock on the database file to call this +** function. Because an EXCLUSIVE lock on the db file is required to delete +** a WAL on a none-empty database, this ensures there is no race condition +** between the xAccess() below and an xDelete() being executed by some +** other connection. +*/ +static int pagerOpenWalIfPresent(Pager *pPager){ + int rc = SQLITE_OK; + assert( pPager->eState==PAGER_OPEN ); + assert( pPager->eLock>=SHARED_LOCK ); + + if( !pPager->tempFile ){ + int isWal; /* True if WAL file exists */ + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal + ); + if( rc==SQLITE_OK ){ + if( isWal ){ + Pgno nPage; /* Size of the database file */ + + rc = pagerPagecount(pPager, &nPage); + if( rc ) return rc; + if( nPage==0 ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); + }else{ + testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); + rc = sqlite3PagerOpenWal(pPager, 0); + } + }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + pPager->journalMode = PAGER_JOURNALMODE_DELETE; + } + } + } + return rc; +} +#endif + +/* +** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback +** the entire super-journal file. The case pSavepoint==NULL occurs when +** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction +** savepoint. +** +** When pSavepoint is not NULL (meaning a non-transaction savepoint is +** being rolled back), then the rollback consists of up to three stages, +** performed in the order specified: +** +** * Pages are played back from the main journal starting at byte +** offset PagerSavepoint.iOffset and continuing to +** PagerSavepoint.iHdrOffset, or to the end of the main journal +** file if PagerSavepoint.iHdrOffset is zero. +** +** * If PagerSavepoint.iHdrOffset is not zero, then pages are played +** back starting from the journal header immediately following +** PagerSavepoint.iHdrOffset to the end of the main journal file. +** +** * Pages are then played back from the sub-journal file, starting +** with the PagerSavepoint.iSubRec and continuing to the end of +** the journal file. +** +** Throughout the rollback process, each time a page is rolled back, the +** corresponding bit is set in a bitvec structure (variable pDone in the +** implementation below). This is used to ensure that a page is only +** rolled back the first time it is encountered in either journal. +** +** If pSavepoint is NULL, then pages are only played back from the main +** journal file. There is no need for a bitvec in this case. +** +** In either case, before playback commences the Pager.dbSize variable +** is reset to the value that it held at the start of the savepoint +** (or transaction). No page with a page-number greater than this value +** is played back. If one is encountered it is simply skipped. +*/ +static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ + i64 szJ; /* Effective size of the main journal */ + i64 iHdrOff; /* End of first segment of main-journal records */ + int rc = SQLITE_OK; /* Return code */ + Bitvec *pDone = 0; /* Bitvec to ensure pages played back only once */ + + assert( pPager->eState!=PAGER_ERROR ); + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + + /* Allocate a bitvec to use to store the set of pages rolled back */ + if( pSavepoint ){ + pDone = sqlite3BitvecCreate(pSavepoint->nOrig); + if( !pDone ){ + return SQLITE_NOMEM_BKPT; + } + } + + /* Set the database size back to the value it was before the savepoint + ** being reverted was opened. + */ + pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize; + pPager->changeCountDone = pPager->tempFile; + + if( !pSavepoint && pagerUseWal(pPager) ){ + return pagerRollbackWal(pPager); + } + + /* Use pPager->journalOff as the effective size of the main rollback + ** journal. The actual file might be larger than this in + ** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything + ** past pPager->journalOff is off-limits to us. + */ + szJ = pPager->journalOff; + assert( pagerUseWal(pPager)==0 || szJ==0 ); + + /* Begin by rolling back records from the main journal starting at + ** PagerSavepoint.iOffset and continuing to the next journal header. + ** There might be records in the main journal that have a page number + ** greater than the current database size (pPager->dbSize) but those + ** will be skipped automatically. Pages are added to pDone as they + ** are played back. + */ + if( pSavepoint && !pagerUseWal(pPager) ){ + iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ; + pPager->journalOff = pSavepoint->iOffset; + while( rc==SQLITE_OK && pPager->journalOffjournalOff, pDone, 1, 1); + } + assert( rc!=SQLITE_DONE ); + }else{ + pPager->journalOff = 0; + } + + /* Continue rolling back records out of the main journal starting at + ** the first journal header seen and continuing until the effective end + ** of the main journal file. Continue to skip out-of-range pages and + ** continue adding pages rolled back to pDone. + */ + while( rc==SQLITE_OK && pPager->journalOffjournalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff" + ** test is related to ticket #2565. See the discussion in the + ** pager_playback() function for additional information. + */ + if( nJRec==0 + && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff + ){ + nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager)); + } + for(ii=0; rc==SQLITE_OK && iijournalOffjournalOff, pDone, 1, 1); + } + assert( rc!=SQLITE_DONE ); + } + assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); + + /* Finally, rollback pages from the sub-journal. Page that were + ** previously rolled back out of the main journal (and are hence in pDone) + ** will be skipped. Out-of-range pages are also skipped. + */ + if( pSavepoint ){ + u32 ii; /* Loop counter */ + i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); + + if( pagerUseWal(pPager) ){ + rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); + } + for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && iinSubRec; ii++){ + assert( offset==(i64)ii*(4+pPager->pageSize) ); + rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); + } + assert( rc!=SQLITE_DONE ); + } + + sqlite3BitvecDestroy(pDone); + if( rc==SQLITE_OK ){ + pPager->journalOff = szJ; + } + + return rc; +} + +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to recycle clean and unused pages. +*/ +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ + sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); +} + +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to spill pages to journal. +*/ +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager *pPager, int mxPage){ + return sqlite3PcacheSetSpillsize(pPager->pPCache, mxPage); +} + +/* +** Invoke SQLITE_FCNTL_MMAP_SIZE based on the current value of szMmap. +*/ +static void pagerFixMaplimit(Pager *pPager){ +#if SQLITE_MAX_MMAP_SIZE>0 + sqlite3_file *fd = pPager->fd; + if( isOpen(fd) && fd->pMethods->iVersion>=3 ){ + sqlite3_int64 sz; + sz = pPager->szMmap; + pPager->bUseFetch = (sz>0); + setGetterMethod(pPager); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); + } +#endif +} + +/* +** Change the maximum size of any memory mapping made of the database file. +*/ +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap){ + pPager->szMmap = szMmap; + pagerFixMaplimit(pPager); +} + +/* +** Free as much memory as possible from the pager. +*/ +SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ + sqlite3PcacheShrink(pPager->pPCache); +} + +/* +** Adjust settings of the pager to those specified in the pgFlags parameter. +** +** The "level" in pgFlags & PAGER_SYNCHRONOUS_MASK sets the robustness +** of the database to damage due to OS crashes or power failures by +** changing the number of syncs()s when writing the journals. +** There are four levels: +** +** OFF sqlite3OsSync() is never called. This is the default +** for temporary and transient files. +** +** NORMAL The journal is synced once before writes begin on the +** database. This is normally adequate protection, but +** it is theoretically possible, though very unlikely, +** that an inopertune power failure could leave the journal +** in a state which would cause damage to the database +** when it is rolled back. +** +** FULL The journal is synced twice before writes begin on the +** database (with some additional information - the nRec field +** of the journal header - being written in between the two +** syncs). If we assume that writing a +** single disk sector is atomic, then this mode provides +** assurance that the journal will not be corrupted to the +** point of causing damage to the database during rollback. +** +** EXTRA This is like FULL except that is also syncs the directory +** that contains the rollback journal after the rollback +** journal is unlinked. +** +** The above is for a rollback-journal mode. For WAL mode, OFF continues +** to mean that no syncs ever occur. NORMAL means that the WAL is synced +** prior to the start of checkpoint and that the database file is synced +** at the conclusion of the checkpoint if the entire content of the WAL +** was written back into the database. But no sync operations occur for +** an ordinary commit in NORMAL mode with WAL. FULL means that the WAL +** file is synced following each commit operation, in addition to the +** syncs associated with NORMAL. There is no difference between FULL +** and EXTRA for WAL mode. +** +** Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The +** SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync +** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an +** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL +** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the +** synchronous=FULL versus synchronous=NORMAL setting determines when +** the xSync primitive is called and is relevant to all platforms. +** +** Numeric values associated with these states are OFF==1, NORMAL=2, +** and FULL=3. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +SQLITE_PRIVATE void sqlite3PagerSetFlags( + Pager *pPager, /* The pager to set safety level for */ + unsigned pgFlags /* Various flags */ +){ + unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; + if( pPager->tempFile ){ + pPager->noSync = 1; + pPager->fullSync = 0; + pPager->extraSync = 0; + }else{ + pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; + pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; + pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; + } + if( pPager->noSync ){ + pPager->syncFlags = 0; + }else if( pgFlags & PAGER_FULLFSYNC ){ + pPager->syncFlags = SQLITE_SYNC_FULL; + }else{ + pPager->syncFlags = SQLITE_SYNC_NORMAL; + } + pPager->walSyncFlags = (pPager->syncFlags<<2); + if( pPager->fullSync ){ + pPager->walSyncFlags |= pPager->syncFlags; + } + if( (pgFlags & PAGER_CKPT_FULLFSYNC) && !pPager->noSync ){ + pPager->walSyncFlags |= (SQLITE_SYNC_FULL<<2); + } + if( pgFlags & PAGER_CACHESPILL ){ + pPager->doNotSpill &= ~SPILLFLAG_OFF; + }else{ + pPager->doNotSpill |= SPILLFLAG_OFF; + } +} +#endif + +/* +** The following global variable is incremented whenever the library +** attempts to open a temporary file. This information is used for +** testing and analysis only. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_opentemp_count = 0; +#endif + +/* +** Open a temporary file. +** +** Write the file descriptor into *pFile. Return SQLITE_OK on success +** or some other error code if we fail. The OS will automatically +** delete the temporary file when it is closed. +** +** The flags passed to the VFS layer xOpen() call are those specified +** by parameter vfsFlags ORed with the following: +** +** SQLITE_OPEN_READWRITE +** SQLITE_OPEN_CREATE +** SQLITE_OPEN_EXCLUSIVE +** SQLITE_OPEN_DELETEONCLOSE +*/ +static int pagerOpentemp( + Pager *pPager, /* The pager object */ + sqlite3_file *pFile, /* Write the file descriptor here */ + int vfsFlags /* Flags passed through to the VFS */ +){ + int rc; /* Return code */ + +#ifdef SQLITE_TEST + sqlite3_opentemp_count++; /* Used for testing and analysis only */ +#endif + + vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; + rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0); + assert( rc!=SQLITE_OK || isOpen(pFile) ); + return rc; +} + +/* +** Set the busy handler function. +** +** The pager invokes the busy-handler if sqlite3OsLock() returns +** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock, +** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE +** lock. It does *not* invoke the busy handler when upgrading from +** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE +** (which occurs during hot-journal rollback). Summary: +** +** Transition | Invokes xBusyHandler +** -------------------------------------------------------- +** NO_LOCK -> SHARED_LOCK | Yes +** SHARED_LOCK -> RESERVED_LOCK | No +** SHARED_LOCK -> EXCLUSIVE_LOCK | No +** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes +** +** If the busy-handler callback returns non-zero, the lock is +** retried. If it returns zero, then the SQLITE_BUSY error is +** returned to the caller of the pager API function. +*/ +SQLITE_PRIVATE void sqlite3PagerSetBusyHandler( + Pager *pPager, /* Pager object */ + int (*xBusyHandler)(void *), /* Pointer to busy-handler function */ + void *pBusyHandlerArg /* Argument to pass to xBusyHandler */ +){ + void **ap; + pPager->xBusyHandler = xBusyHandler; + pPager->pBusyHandlerArg = pBusyHandlerArg; + ap = (void **)&pPager->xBusyHandler; + assert( ((int(*)(void *))(ap[0]))==xBusyHandler ); + assert( ap[1]==pBusyHandlerArg ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); +} + +/* +** Change the page size used by the Pager object. The new page size +** is passed in *pPageSize. +** +** If the pager is in the error state when this function is called, it +** is a no-op. The value returned is the error state error code (i.e. +** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). +** +** Otherwise, if all of the following are true: +** +** * the new page size (value of *pPageSize) is valid (a power +** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and +** +** * there are no outstanding page references, and +** +** * the database is either not an in-memory database or it is +** an in-memory database that currently consists of zero pages. +** +** then the pager object page size is set to *pPageSize. +** +** If the page size is changed, then this function uses sqlite3PagerMalloc() +** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt +** fails, SQLITE_NOMEM is returned and the page size remains unchanged. +** In all other cases, SQLITE_OK is returned. +** +** If the page size is not changed, either because one of the enumerated +** conditions above is not true, the pager was in error state when this +** function was called, or because the memory allocation attempt failed, +** then *pPageSize is set to the old, retained page size before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ + int rc = SQLITE_OK; + + /* It is not possible to do a full assert_pager_state() here, as this + ** function may be called from within PagerOpen(), before the state + ** of the Pager object is internally consistent. + ** + ** At one point this function returned an error if the pager was in + ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that + ** there is at least one outstanding page reference, this function + ** is a no-op for that case anyhow. + */ + + u32 pageSize = *pPageSize; + assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); + if( (pPager->memDb==0 || pPager->dbSize==0) + && sqlite3PcacheRefCount(pPager->pPCache)==0 + && pageSize && pageSize!=(u32)pPager->pageSize + ){ + char *pNew = NULL; /* New temp space */ + i64 nByte = 0; + + if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ + rc = sqlite3OsFileSize(pPager->fd, &nByte); + } + if( rc==SQLITE_OK ){ + /* 8 bytes of zeroed overrun space is sufficient so that the b-tree + * cell header parser will never run off the end of the allocation */ + pNew = (char *)sqlite3PageMalloc(pageSize+8); + if( !pNew ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memset(pNew+pageSize, 0, 8); + } + } + + if( rc==SQLITE_OK ){ + pager_reset(pPager); + rc = sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); + } + if( rc==SQLITE_OK ){ + sqlite3PageFree(pPager->pTmpSpace); + pPager->pTmpSpace = pNew; + pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); + pPager->pageSize = pageSize; + pPager->lckPgno = (Pgno)(PENDING_BYTE/pageSize) + 1; + }else{ + sqlite3PageFree(pNew); + } + } + + *pPageSize = pPager->pageSize; + if( rc==SQLITE_OK ){ + if( nReserve<0 ) nReserve = pPager->nReserve; + assert( nReserve>=0 && nReserve<1000 ); + pPager->nReserve = (i16)nReserve; + pagerReportSize(pPager); + pagerFixMaplimit(pPager); + } + return rc; +} + +/* +** Return a pointer to the "temporary page" buffer held internally +** by the pager. This is a buffer that is big enough to hold the +** entire content of a database page. This buffer is used internally +** during rollback and will be overwritten whenever a rollback +** occurs. But other modules are free to use it too, as long as +** no rollbacks are happening. +*/ +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){ + return pPager->pTmpSpace; +} + +/* +** Attempt to set the maximum database page count if mxPage is positive. +** Make no changes if mxPage is zero or negative. And never reduce the +** maximum page count below the current size of the database. +** +** Regardless of mxPage, return the current maximum page count. +*/ +SQLITE_PRIVATE Pgno sqlite3PagerMaxPageCount(Pager *pPager, Pgno mxPage){ + if( mxPage>0 ){ + pPager->mxPgno = mxPage; + } + assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ + return pPager->mxPgno; +} + +/* +** The following set of routines are used to disable the simulated +** I/O error mechanism. These routines are used to avoid simulated +** errors in places where we do not care about errors. +** +** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops +** and generate no code. +*/ +#ifdef SQLITE_TEST +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_hit; +static int saved_cnt; +void disable_simulated_io_errors(void){ + saved_cnt = sqlite3_io_error_pending; + sqlite3_io_error_pending = -1; +} +void enable_simulated_io_errors(void){ + sqlite3_io_error_pending = saved_cnt; +} +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +/* +** Read the first N bytes from the beginning of the file into memory +** that pDest points to. +** +** If the pager was opened on a transient file (zFilename==""), or +** opened on a file less than N bytes in size, the output buffer is +** zeroed and SQLITE_OK returned. The rationale for this is that this +** function is used to read database headers, and a new transient or +** zero sized database has a header than consists entirely of zeroes. +** +** If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered, +** the error code is returned to the caller and the contents of the +** output buffer undefined. +*/ +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){ + int rc = SQLITE_OK; + memset(pDest, 0, N); + assert( isOpen(pPager->fd) || pPager->tempFile ); + + /* This routine is only called by btree immediately after creating + ** the Pager object. There has not been an opportunity to transition + ** to WAL mode yet. + */ + assert( !pagerUseWal(pPager) ); + + if( isOpen(pPager->fd) ){ + IOTRACE(("DBHDR %p 0 %d\n", pPager, N)) + rc = sqlite3OsRead(pPager->fd, pDest, N, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + } + return rc; +} + +/* +** This function may only be called when a read-transaction is open on +** the pager. It returns the total number of pages in the database. +** +** However, if the file is between 1 and bytes in size, then +** this is considered a 1 page file. +*/ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ + assert( pPager->eState>=PAGER_READER ); + assert( pPager->eState!=PAGER_WRITER_FINISHED ); + *pnPage = (int)pPager->dbSize; +} + + +/* +** Try to obtain a lock of type locktype on the database file. If +** a similar or greater lock is already held, this function is a no-op +** (returning SQLITE_OK immediately). +** +** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke +** the busy callback if the lock is currently not available. Repeat +** until the busy callback returns false or until the attempt to +** obtain the lock succeeds. +** +** Return SQLITE_OK on success and an error code if we cannot obtain +** the lock. If the lock is obtained successfully, set the Pager.state +** variable to locktype before returning. +*/ +static int pager_wait_on_lock(Pager *pPager, int locktype){ + int rc; /* Return code */ + + /* Check that this is either a no-op (because the requested lock is + ** already held), or one of the transitions that the busy-handler + ** may be invoked during, according to the comment above + ** sqlite3PagerSetBusyhandler(). + */ + assert( (pPager->eLock>=locktype) + || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK) + || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK) + ); + + do { + rc = pagerLockDb(pPager, locktype); + }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); + return rc; +} + +/* +** Function assertTruncateConstraint(pPager) checks that one of the +** following is true for all dirty pages currently in the page-cache: +** +** a) The page number is less than or equal to the size of the +** current database image, in pages, OR +** +** b) if the page content were written at this time, it would not +** be necessary to write the current content out to the sub-journal. +** +** If the condition asserted by this function were not true, and the +** dirty page were to be discarded from the cache via the pagerStress() +** routine, pagerStress() would not write the current page content to +** the database file. If a savepoint transaction were rolled back after +** this happened, the correct behavior would be to restore the current +** content of the page. However, since this content is not present in either +** the database file or the portion of the rollback journal and +** sub-journal rolled back the content could not be restored and the +** database image would become corrupt. It is therefore fortunate that +** this circumstance cannot arise. +*/ +#if defined(SQLITE_DEBUG) +static void assertTruncateConstraintCb(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( pPg->flags&PGHDR_DIRTY ); + if( pPg->pgno>pPager->dbSize ){ /* if (a) is false */ + Pgno pgno = pPg->pgno; + int i; + for(i=0; ipPager->nSavepoint; i++){ + PagerSavepoint *p = &pPager->aSavepoint[i]; + assert( p->nOrigpInSavepoint,pgno) ); + } + } +} +static void assertTruncateConstraint(Pager *pPager){ + sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); +} +#else +# define assertTruncateConstraint(pPager) +#endif + +/* +** Truncate the in-memory database file image to nPage pages. This +** function does not actually modify the database file on disk. It +** just sets the internal state of the pager object so that the +** truncation will be done when the current transaction is committed. +** +** This function is only called right before committing a transaction. +** Once this function has been called, the transaction must either be +** rolled back or committed. It is not safe to call this function and +** then continue writing to the database. +*/ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ + assert( pPager->dbSize>=nPage || CORRUPT_DB ); + assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); + pPager->dbSize = nPage; + + /* At one point the code here called assertTruncateConstraint() to + ** ensure that all pages being truncated away by this operation are, + ** if one or more savepoints are open, present in the savepoint + ** journal so that they can be restored if the savepoint is rolled + ** back. This is no longer necessary as this function is now only + ** called right before committing a transaction. So although the + ** Pager object may still have open savepoints (Pager.nSavepoint!=0), + ** they cannot be rolled back. So the assertTruncateConstraint() call + ** is no longer correct. */ +} + + +/* +** This function is called before attempting a hot-journal rollback. It +** syncs the journal file to disk, then sets pPager->journalHdr to the +** size of the journal file so that the pager_playback() routine knows +** that the entire journal file has been synced. +** +** Syncing a hot-journal to disk before attempting to roll it back ensures +** that if a power-failure occurs during the rollback, the process that +** attempts rollback following system recovery sees the same journal +** content as this process. +** +** If everything goes as planned, SQLITE_OK is returned. Otherwise, +** an SQLite error code. +*/ +static int pagerSyncHotJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !pPager->noSync ){ + rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); + } + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); + } + return rc; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** Obtain a reference to a memory mapped page object for page number pgno. +** The new object will use the pointer pData, obtained from xFetch(). +** If successful, set *ppPage to point to the new page reference +** and return SQLITE_OK. Otherwise, return an SQLite error code and set +** *ppPage to zero. +** +** Page references obtained by calling this function should be released +** by calling pagerReleaseMapPage(). +*/ +static int pagerAcquireMapPage( + Pager *pPager, /* Pager object */ + Pgno pgno, /* Page number */ + void *pData, /* xFetch()'d data for this page */ + PgHdr **ppPage /* OUT: Acquired page object */ +){ + PgHdr *p; /* Memory mapped page to return */ + + if( pPager->pMmapFreelist ){ + *ppPage = p = pPager->pMmapFreelist; + pPager->pMmapFreelist = p->pDirty; + p->pDirty = 0; + assert( pPager->nExtra>=8 ); + memset(p->pExtra, 0, 8); + }else{ + *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); + if( p==0 ){ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pData); + return SQLITE_NOMEM_BKPT; + } + p->pExtra = (void *)&p[1]; + p->flags = PGHDR_MMAP; + p->nRef = 1; + p->pPager = pPager; + } + + assert( p->pExtra==(void *)&p[1] ); + assert( p->pPage==0 ); + assert( p->flags==PGHDR_MMAP ); + assert( p->pPager==pPager ); + assert( p->nRef==1 ); + + p->pgno = pgno; + p->pData = pData; + pPager->nMmapOut++; + + return SQLITE_OK; +} +#endif + +/* +** Release a reference to page pPg. pPg must have been returned by an +** earlier call to pagerAcquireMapPage(). +*/ +static void pagerReleaseMapPage(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + pPager->nMmapOut--; + pPg->pDirty = pPager->pMmapFreelist; + pPager->pMmapFreelist = pPg; + + assert( pPager->fd->pMethods->iVersion>=3 ); + sqlite3OsUnfetch(pPager->fd, (i64)(pPg->pgno-1)*pPager->pageSize, pPg->pData); +} + +/* +** Free all PgHdr objects stored in the Pager.pMmapFreelist list. +*/ +static void pagerFreeMapHdrs(Pager *pPager){ + PgHdr *p; + PgHdr *pNext; + for(p=pPager->pMmapFreelist; p; p=pNext){ + pNext = p->pDirty; + sqlite3_free(p); + } +} + +/* Verify that the database file has not be deleted or renamed out from +** under the pager. Return SQLITE_OK if the database is still where it ought +** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error +** code from sqlite3OsAccess()) if the database has gone missing. +*/ +static int databaseIsUnmoved(Pager *pPager){ + int bHasMoved = 0; + int rc; + + if( pPager->tempFile ) return SQLITE_OK; + if( pPager->dbSize==0 ) return SQLITE_OK; + assert( pPager->zFilename && pPager->zFilename[0] ); + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); + if( rc==SQLITE_NOTFOUND ){ + /* If the HAS_MOVED file-control is unimplemented, assume that the file + ** has not been moved. That is the historical behavior of SQLite: prior to + ** version 3.8.3, it never checked */ + rc = SQLITE_OK; + }else if( rc==SQLITE_OK && bHasMoved ){ + rc = SQLITE_READONLY_DBMOVED; + } + return rc; +} + + +/* +** Shutdown the page cache. Free all memory and close all files. +** +** If a transaction was in progress when this routine is called, that +** transaction is rolled back. All outstanding pages are invalidated +** and their memory is freed. Any attempt to use a page associated +** with this page cache after this function returns will likely +** result in a coredump. +** +** This function always succeeds. If a transaction is active an attempt +** is made to roll it back. If an error occurs during the rollback +** a hot journal may be left in the filesystem but no error is returned +** to the caller. +*/ +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ + u8 *pTmp = (u8*)pPager->pTmpSpace; + assert( db || pagerUseWal(pPager)==0 ); + assert( assert_pager_state(pPager) ); + disable_simulated_io_errors(); + sqlite3BeginBenignMalloc(); + pagerFreeMapHdrs(pPager); + /* pPager->errCode = 0; */ + pPager->exclusiveMode = 0; +#ifndef SQLITE_OMIT_WAL + { + u8 *a = 0; + assert( db || pPager->pWal==0 ); + if( db && 0==(db->flags & SQLITE_NoCkptOnClose) + && SQLITE_OK==databaseIsUnmoved(pPager) + ){ + a = pTmp; + } + sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,a); + pPager->pWal = 0; + } +#endif + pager_reset(pPager); + if( MEMDB ){ + pager_unlock(pPager); + }else{ + /* If it is open, sync the journal file before calling UnlockAndRollback. + ** If this is not done, then an unsynced portion of the open journal + ** file may be played back into the database. If a power failure occurs + ** while this is happening, the database could become corrupt. + ** + ** If an error occurs while trying to sync the journal, shift the pager + ** into the ERROR state. This causes UnlockAndRollback to unlock the + ** database and close the journal file without attempting to roll it + ** back or finalize it. The next database user will have to do hot-journal + ** rollback before accessing the database file. + */ + if( isOpen(pPager->jfd) ){ + pager_error(pPager, pagerSyncHotJournal(pPager)); + } + pagerUnlockAndRollback(pPager); + } + sqlite3EndBenignMalloc(); + enable_simulated_io_errors(); + PAGERTRACE(("CLOSE %d\n", PAGERID(pPager))); + IOTRACE(("CLOSE %p\n", pPager)) + sqlite3OsClose(pPager->jfd); + sqlite3OsClose(pPager->fd); + sqlite3PageFree(pTmp); + sqlite3PcacheClose(pPager->pPCache); + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); +#endif +/* END SQLCIPHER */ + + assert( !pPager->aSavepoint && !pPager->pInJournal ); + assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ); + + sqlite3_free(pPager); + return SQLITE_OK; +} + +#if !defined(NDEBUG) || defined(SQLITE_TEST) +/* +** Return the page number for page pPg. +*/ +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){ + return pPg->pgno; +} +#endif + +/* +** Increment the reference count for page pPg. +*/ +SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ + sqlite3PcacheRef(pPg); +} + +/* +** Sync the journal. In other words, make sure all the pages that have +** been written to the journal have actually reached the surface of the +** disk and can be restored in the event of a hot-journal rollback. +** +** If the Pager.noSync flag is set, then this function is a no-op. +** Otherwise, the actions required depend on the journal-mode and the +** device characteristics of the file-system, as follows: +** +** * If the journal file is an in-memory journal file, no action need +** be taken. +** +** * Otherwise, if the device does not support the SAFE_APPEND property, +** then the nRec field of the most recently written journal header +** is updated to contain the number of journal records that have +** been written following it. If the pager is operating in full-sync +** mode, then the journal file is synced before this field is updated. +** +** * If the device does not support the SEQUENTIAL property, then +** journal file is synced. +** +** Or, in pseudo-code: +** +** if( NOT ){ +** if( NOT SAFE_APPEND ){ +** if( ) xSync(); +** +** } +** if( NOT SEQUENTIAL ) xSync(); +** } +** +** If successful, this routine clears the PGHDR_NEED_SYNC flag of every +** page currently held in memory before returning SQLITE_OK. If an IO +** error is encountered, then the IO error code is returned to the caller. +*/ +static int syncJournal(Pager *pPager, int newHdr){ + int rc; /* Return code */ + + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + assert( !pagerUseWal(pPager) ); + + rc = sqlite3PagerExclusiveLock(pPager); + if( rc!=SQLITE_OK ) return rc; + + if( !pPager->noSync ){ + assert( !pPager->tempFile ); + if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){ + const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + assert( isOpen(pPager->jfd) ); + + if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + /* This block deals with an obscure problem. If the last connection + ** that wrote to this database was operating in persistent-journal + ** mode, then the journal file may at this point actually be larger + ** than Pager.journalOff bytes. If the next thing in the journal + ** file happens to be a journal-header (written as part of the + ** previous connection's transaction), and a crash or power-failure + ** occurs after nRec is updated but before this connection writes + ** anything else to the journal file (or commits/rolls back its + ** transaction), then SQLite may become confused when doing the + ** hot-journal rollback following recovery. It may roll back all + ** of this connections data, then proceed to rolling back the old, + ** out-of-date data that follows it. Database corruption. + ** + ** To work around this, if the journal file does appear to contain + ** a valid header following Pager.journalOff, then write a 0x00 + ** byte to the start of it to prevent it from being recognized. + ** + ** Variable iNextHdrOffset is set to the offset at which this + ** problematic header will occur, if it exists. aMagic is used + ** as a temporary buffer to inspect the first couple of bytes of + ** the potential journal header. + */ + i64 iNextHdrOffset; + u8 aMagic[8]; + u8 zHeader[sizeof(aJournalMagic)+4]; + + memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); + put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec); + + iNextHdrOffset = journalHdrOffset(pPager); + rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset); + if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){ + static const u8 zerobyte = 0; + rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset); + } + if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + return rc; + } + + /* Write the nRec value into the journal file header. If in + ** full-synchronous mode, sync the journal first. This ensures that + ** all data has really hit the disk before nRec is updated to mark + ** it as a candidate for rollback. + ** + ** This is not required if the persistent media supports the + ** SAFE_APPEND property. Because in this case it is not possible + ** for garbage data to be appended to the file, the nRec field + ** is populated with 0xFFFFFFFF when the journal header is written + ** and never needs to be updated. + */ + if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + if( rc!=SQLITE_OK ) return rc; + } + IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr)); + rc = sqlite3OsWrite( + pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr + ); + if( rc!=SQLITE_OK ) return rc; + } + if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); + IOTRACE(("JSYNC %p\n", pPager)) + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags| + (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) + ); + if( rc!=SQLITE_OK ) return rc; + } + + pPager->journalHdr = pPager->journalOff; + if( newHdr && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + pPager->nRec = 0; + rc = writeJournalHdr(pPager); + if( rc!=SQLITE_OK ) return rc; + } + }else{ + pPager->journalHdr = pPager->journalOff; + } + } + + /* Unless the pager is in noSync mode, the journal file was just + ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on + ** all pages. + */ + sqlite3PcacheClearSyncFlags(pPager->pPCache); + pPager->eState = PAGER_WRITER_DBMOD; + assert( assert_pager_state(pPager) ); + return SQLITE_OK; +} + +/* +** The argument is the first in a linked list of dirty pages connected +** by the PgHdr.pDirty pointer. This function writes each one of the +** in-memory pages in the list to the database file. The argument may +** be NULL, representing an empty list. In this case this function is +** a no-op. +** +** The pager must hold at least a RESERVED lock when this function +** is called. Before writing anything to the database file, this lock +** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained, +** SQLITE_BUSY is returned and no data is written to the database file. +** +** If the pager is a temp-file pager and the actual file-system file +** is not yet open, it is created and opened before any data is +** written out. +** +** Once the lock has been upgraded and, if necessary, the file opened, +** the pages are written out to the database file in list order. Writing +** a page is skipped if it meets either of the following criteria: +** +** * The page number is greater than Pager.dbSize, or +** * The PGHDR_DONT_WRITE flag is set on the page. +** +** If writing out a page causes the database file to grow, Pager.dbFileSize +** is updated accordingly. If page 1 is written out, then the value cached +** in Pager.dbFileVers[] is updated to match the new value stored in +** the database file. +** +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot +** be obtained, SQLITE_BUSY is returned. +*/ +static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ + int rc = SQLITE_OK; /* Return code */ + + /* This function is only called for rollback pagers in WRITER_DBMOD state. */ + assert( !pagerUseWal(pPager) ); + assert( pPager->tempFile || pPager->eState==PAGER_WRITER_DBMOD ); + assert( pPager->eLock==EXCLUSIVE_LOCK ); + assert( isOpen(pPager->fd) || pList->pDirty==0 ); + + /* If the file is a temp-file has not yet been opened, open it now. It + ** is not possible for rc to be other than SQLITE_OK if this branch + ** is taken, as pager_wait_on_lock() is a no-op for temp-files. + */ + if( !isOpen(pPager->fd) ){ + assert( pPager->tempFile && rc==SQLITE_OK ); + rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); + } + + /* Before the first write, give the VFS a hint of what the final + ** file size will be. + */ + assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); + if( rc==SQLITE_OK + && pPager->dbHintSizedbSize + && (pList->pDirty || pList->pgno>pPager->dbHintSize) + ){ + sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); + pPager->dbHintSize = pPager->dbSize; + } + + while( rc==SQLITE_OK && pList ){ + Pgno pgno = pList->pgno; + + /* If there are dirty pages in the page cache with page numbers greater + ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to + ** make the file smaller (presumably by auto-vacuum code). Do not write + ** any such pages to the file. + ** + ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag + ** set (set by sqlite3PagerDontWrite()). + */ + if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ + i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ + char *pData; /* Data to write */ + + assert( (pList->flags&PGHDR_NEED_SYNC)==0 ); + if( pList->pgno==1 ) pager_write_changecounter(pList); + + /* Encode the database */ + CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM_BKPT, pData); + + /* Write out the page data. */ + rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); + + /* If page 1 was just written, update Pager.dbFileVers to match + ** the value now stored in the database file. If writing this + ** page caused the database file to grow, update dbFileSize. + */ + if( pgno==1 ){ + memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); + } + if( pgno>pPager->dbFileSize ){ + pPager->dbFileSize = pgno; + } + pPager->aStat[PAGER_STAT_WRITE]++; + + /* Update any backup objects copying the contents of this pager. */ + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData); + + PAGERTRACE(("STORE %d page %d hash(%08x)\n", + PAGERID(pPager), pgno, pager_pagehash(pList))); + IOTRACE(("PGOUT %p %d\n", pPager, pgno)); + PAGER_INCR(sqlite3_pager_writedb_count); + }else{ + PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); + } + pager_set_pagehash(pList); + pList = pList->pDirty; + } + + return rc; +} + +/* +** Ensure that the sub-journal file is open. If it is already open, this +** function is a no-op. +** +** SQLITE_OK is returned if everything goes according to plan. An +** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() +** fails. +*/ +static int openSubJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !isOpen(pPager->sjfd) ){ + const int flags = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE + | SQLITE_OPEN_DELETEONCLOSE; + int nStmtSpill = sqlite3Config.nStmtSpill; + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ + nStmtSpill = -1; + } + rc = sqlite3JournalOpen(pPager->pVfs, 0, pPager->sjfd, flags, nStmtSpill); + } + return rc; +} + +/* +** Append a record of the current state of page pPg to the sub-journal. +** +** If successful, set the bit corresponding to pPg->pgno in the bitvecs +** for all open savepoints before returning. +** +** This function returns SQLITE_OK if everything is successful, an IO +** error code if the attempt to write to the sub-journal fails, or +** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint +** bitvec. +*/ +static int subjournalPage(PgHdr *pPg){ + int rc = SQLITE_OK; + Pager *pPager = pPg->pPager; + if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + + /* Open the sub-journal, if it has not already been opened */ + assert( pPager->useJournal ); + assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); + assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); + assert( pagerUseWal(pPager) + || pageInJournal(pPager, pPg) + || pPg->pgno>pPager->dbOrigSize + ); + rc = openSubJournal(pPager); + + /* If the sub-journal was opened successfully (or was already open), + ** write the journal record into the file. */ + if( rc==SQLITE_OK ){ + void *pData = pPg->pData; + i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); + char *pData2; + +/* BEGIN SQLCIPHER */ +#if SQLITE_HAS_CODEC + if( !pPager->subjInMemory ){ + CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); + }else +#endif +/* END SQLCIPHER */ + pData2 = pData; + PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); + rc = write32bits(pPager->sjfd, offset, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + } + } + } + if( rc==SQLITE_OK ){ + pPager->nSubRec++; + assert( pPager->nSavepoint>0 ); + rc = addToSavepointBitvecs(pPager, pPg->pgno); + } + return rc; +} +static int subjournalPageIfRequired(PgHdr *pPg){ + if( subjRequiresPage(pPg) ){ + return subjournalPage(pPg); + }else{ + return SQLITE_OK; + } +} + +/* +** This function is called by the pcache layer when it has reached some +** soft memory limit. The first argument is a pointer to a Pager object +** (cast as a void*). The pager is always 'purgeable' (not an in-memory +** database). The second argument is a reference to a page that is +** currently dirty but has no outstanding references. The page +** is always associated with the Pager object passed as the first +** argument. +** +** The job of this function is to make pPg clean by writing its contents +** out to the database file, if possible. This may involve syncing the +** journal file. +** +** If successful, sqlite3PcacheMakeClean() is called on the page and +** SQLITE_OK returned. If an IO error occurs while trying to make the +** page clean, the IO error code is returned. If the page cannot be +** made clean for some other reason, but no error occurs, then SQLITE_OK +** is returned by sqlite3PcacheMakeClean() is not called. +*/ +static int pagerStress(void *p, PgHdr *pPg){ + Pager *pPager = (Pager *)p; + int rc = SQLITE_OK; + + assert( pPg->pPager==pPager ); + assert( pPg->flags&PGHDR_DIRTY ); + + /* The doNotSpill NOSYNC bit is set during times when doing a sync of + ** journal (and adding a new header) is not allowed. This occurs + ** during calls to sqlite3PagerWrite() while trying to journal multiple + ** pages belonging to the same sector. + ** + ** The doNotSpill ROLLBACK and OFF bits inhibits all cache spilling + ** regardless of whether or not a sync is required. This is set during + ** a rollback or by user request, respectively. + ** + ** Spilling is also prohibited when in an error state since that could + ** lead to database corruption. In the current implementation it + ** is impossible for sqlite3PcacheFetch() to be called with createFlag==3 + ** while in the error state, hence it is impossible for this routine to + ** be called in the error state. Nevertheless, we include a NEVER() + ** test for the error state as a safeguard against future changes. + */ + if( NEVER(pPager->errCode) ) return SQLITE_OK; + testcase( pPager->doNotSpill & SPILLFLAG_ROLLBACK ); + testcase( pPager->doNotSpill & SPILLFLAG_OFF ); + testcase( pPager->doNotSpill & SPILLFLAG_NOSYNC ); + if( pPager->doNotSpill + && ((pPager->doNotSpill & (SPILLFLAG_ROLLBACK|SPILLFLAG_OFF))!=0 + || (pPg->flags & PGHDR_NEED_SYNC)!=0) + ){ + return SQLITE_OK; + } + + pPager->aStat[PAGER_STAT_SPILL]++; + pPg->pDirty = 0; + if( pagerUseWal(pPager) ){ + /* Write a single frame for this page to the log. */ + rc = subjournalPageIfRequired(pPg); + if( rc==SQLITE_OK ){ + rc = pagerWalFrames(pPager, pPg, 0, 0); + } + }else{ + +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( pPager->tempFile==0 ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ) return pager_error(pPager, rc); + } +#endif + + /* Sync the journal file if required. */ + if( pPg->flags&PGHDR_NEED_SYNC + || pPager->eState==PAGER_WRITER_CACHEMOD + ){ + rc = syncJournal(pPager, 1); + } + + /* Write the contents of the page out to the database file. */ + if( rc==SQLITE_OK ){ + assert( (pPg->flags&PGHDR_NEED_SYNC)==0 ); + rc = pager_write_pagelist(pPager, pPg); + } + } + + /* Mark the page as clean. */ + if( rc==SQLITE_OK ){ + PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno)); + sqlite3PcacheMakeClean(pPg); + } + + return pager_error(pPager, rc); +} + +/* +** Flush all unreferenced dirty pages to disk. +*/ +SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ + int rc = pPager->errCode; + if( !MEMDB ){ + PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + assert( assert_pager_state(pPager) ); + while( rc==SQLITE_OK && pList ){ + PgHdr *pNext = pList->pDirty; + if( pList->nRef==0 ){ + rc = pagerStress((void*)pPager, pList); + } + pList = pNext; + } + } + + return rc; +} + +/* +** Allocate and initialize a new Pager object and put a pointer to it +** in *ppPager. The pager should eventually be freed by passing it +** to sqlite3PagerClose(). +** +** The zFilename argument is the path to the database file to open. +** If zFilename is NULL then a randomly-named temporary file is created +** and used as the file to be cached. Temporary files are be deleted +** automatically when they are closed. If zFilename is ":memory:" then +** all information is held in cache. It is never written to disk. +** This can be used to implement an in-memory database. +** +** The nExtra parameter specifies the number of bytes of space allocated +** along with each page reference. This space is available to the user +** via the sqlite3PagerGetExtra() API. When a new page is allocated, the +** first 8 bytes of this space are zeroed but the remainder is uninitialized. +** (The extra space is used by btree as the MemPage object.) +** +** The flags argument is used to specify properties that affect the +** operation of the pager. It should be passed some bitwise combination +** of the PAGER_* flags. +** +** The vfsFlags parameter is a bitmask to pass to the flags parameter +** of the xOpen() method of the supplied VFS when opening files. +** +** If the pager object is allocated and the specified file opened +** successfully, SQLITE_OK is returned and *ppPager set to point to +** the new pager object. If an error occurs, *ppPager is set to NULL +** and error code returned. This function may return SQLITE_NOMEM +** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or +** various SQLITE_IO_XXX errors. +*/ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs *pVfs, /* The virtual file system to use */ + Pager **ppPager, /* OUT: Return the Pager structure here */ + const char *zFilename, /* Name of the database file to open */ + int nExtra, /* Extra bytes append to each in-memory page */ + int flags, /* flags controlling this file */ + int vfsFlags, /* flags passed through to sqlite3_vfs.xOpen() */ + void (*xReinit)(DbPage*) /* Function to reinitialize pages */ +){ + u8 *pPtr; + Pager *pPager = 0; /* Pager object to allocate and return */ + int rc = SQLITE_OK; /* Return code */ + int tempFile = 0; /* True for temp files (incl. in-memory files) */ + int memDb = 0; /* True if this is an in-memory file */ +#ifndef SQLITE_OMIT_DESERIALIZE + int memJM = 0; /* Memory journal mode */ +#else +# define memJM 0 +#endif + int readOnly = 0; /* True if this is a read-only file */ + int journalFileSize; /* Bytes to allocate for each journal fd */ + char *zPathname = 0; /* Full path to database file */ + int nPathname = 0; /* Number of bytes in zPathname */ + int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */ + int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ + u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ + const char *zUri = 0; /* URI args to copy */ + int nUriByte = 1; /* Number of bytes of URI args at *zUri */ + int nUri = 0; /* Number of URI parameters */ + + /* Figure out how much space is required for each journal file-handle + ** (there are two of them, the main journal and the sub-journal). */ + journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); + + /* Set the output variable to NULL in case an error occurs. */ + *ppPager = 0; + +#ifndef SQLITE_OMIT_MEMORYDB + if( flags & PAGER_MEMORY ){ + memDb = 1; + if( zFilename && zFilename[0] ){ + zPathname = sqlite3DbStrDup(0, zFilename); + if( zPathname==0 ) return SQLITE_NOMEM_BKPT; + nPathname = sqlite3Strlen30(zPathname); + zFilename = 0; + } + } +#endif + + /* Compute and store the full pathname in an allocated buffer pointed + ** to by zPathname, length nPathname. Or, if this is a temporary file, + ** leave both nPathname and zPathname set to 0. + */ + if( zFilename && zFilename[0] ){ + const char *z; + nPathname = pVfs->mxPathname+1; + zPathname = sqlite3DbMallocRaw(0, nPathname*2); + if( zPathname==0 ){ + return SQLITE_NOMEM_BKPT; + } + zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ + rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_OK_SYMLINK ){ + if( vfsFlags & SQLITE_OPEN_NOFOLLOW ){ + rc = SQLITE_CANTOPEN_SYMLINK; + }else{ + rc = SQLITE_OK; + } + } + } + nPathname = sqlite3Strlen30(zPathname); + z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; + while( *z ){ + z += strlen(z)+1; + z += strlen(z)+1; + nUri++; + } + nUriByte = (int)(&z[1] - zUri); + assert( nUriByte>=1 ); + if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ + /* This branch is taken when the journal path required by + ** the database being opened will be more than pVfs->mxPathname + ** bytes in length. This means the database cannot be opened, + ** as it will not be possible to open the journal file or even + ** check for a hot-journal before reading. + */ + rc = SQLITE_CANTOPEN_BKPT; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(0, zPathname); + return rc; + } + } + + /* Allocate memory for the Pager structure, PCache object, the + ** three file descriptors, the database file name and the journal + ** file name. The layout in memory is as follows: + ** + ** Pager object (sizeof(Pager) bytes) + ** PCache object (sqlite3PcacheSize() bytes) + ** Database file handle (pVfs->szOsFile bytes) + ** Sub-journal file handle (journalFileSize bytes) + ** Main journal file handle (journalFileSize bytes) + ** Ptr back to the Pager (sizeof(Pager*) bytes) + ** \0\0\0\0 database prefix (4 bytes) + ** Database file name (nPathname+1 bytes) + ** URI query parameters (nUriByte bytes) + ** Journal filename (nPathname+8+1 bytes) + ** WAL filename (nPathname+4+1 bytes) + ** \0\0\0 terminator (3 bytes) + ** + ** Some 3rd-party software, over which we have no control, depends on + ** the specific order of the filenames and the \0 separators between them + ** so that it can (for example) find the database filename given the WAL + ** filename without using the sqlite3_filename_database() API. This is a + ** misuse of SQLite and a bug in the 3rd-party software, but the 3rd-party + ** software is in widespread use, so we try to avoid changing the filename + ** order and formatting if possible. In particular, the details of the + ** filename format expected by 3rd-party software should be as follows: + ** + ** - Main Database Path + ** - \0 + ** - Multiple URI components consisting of: + ** - Key + ** - \0 + ** - Value + ** - \0 + ** - \0 + ** - Journal Path + ** - \0 + ** - WAL Path (zWALName) + ** - \0 + ** + ** The sqlite3_create_filename() interface and the databaseFilename() utility + ** that is used by sqlite3_filename_database() and kin also depend on the + ** specific formatting and order of the various filenames, so if the format + ** changes here, be sure to change it there as well. + */ + pPtr = (u8 *)sqlite3MallocZero( + ROUND8(sizeof(*pPager)) + /* Pager structure */ + ROUND8(pcacheSize) + /* PCache object */ + ROUND8(pVfs->szOsFile) + /* The main db file */ + journalFileSize * 2 + /* The two journal files */ + sizeof(pPager) + /* Space to hold a pointer */ + 4 + /* Database prefix */ + nPathname + 1 + /* database filename */ + nUriByte + /* query parameters */ + nPathname + 8 + 1 + /* Journal filename */ +#ifndef SQLITE_OMIT_WAL + nPathname + 4 + 1 + /* WAL filename */ +#endif + 3 /* Terminator */ + ); + assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); + if( !pPtr ){ + sqlite3DbFree(0, zPathname); + return SQLITE_NOMEM_BKPT; + } + pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); + pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); + pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); + pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; + pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; + assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); + memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); + + /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ + pPtr += 4; /* Skip zero prefix */ + pPager->zFilename = (char*)pPtr; + if( nPathname>0 ){ + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname + 1; + if( zUri ){ + memcpy(pPtr, zUri, nUriByte); pPtr += nUriByte; + }else{ + pPtr++; + } + } + + + /* Fill in Pager.zJournal */ + if( nPathname>0 ){ + pPager->zJournal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-journal",8); pPtr += 8 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename,pPager->zJournal); + pPtr = (u8*)(pPager->zJournal + sqlite3Strlen30(pPager->zJournal)+1); +#endif + }else{ + pPager->zJournal = 0; + } + +#ifndef SQLITE_OMIT_WAL + /* Fill in Pager.zWal */ + if( nPathname>0 ){ + pPager->zWal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-wal", 4); pPtr += 4 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename, pPager->zWal); + pPtr = (u8*)(pPager->zWal + sqlite3Strlen30(pPager->zWal)+1); +#endif + }else{ + pPager->zWal = 0; + } +#endif + (void)pPtr; /* Suppress warning about unused pPtr value */ + + if( nPathname ) sqlite3DbFree(0, zPathname); + pPager->pVfs = pVfs; + pPager->vfsFlags = vfsFlags; + + /* Open the pager file. + */ + if( zFilename && zFilename[0] ){ + int fout = 0; /* VFS flags returned by xOpen() */ + rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); + assert( !memDb ); +#ifndef SQLITE_OMIT_DESERIALIZE + pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; +#endif + readOnly = (fout&SQLITE_OPEN_READONLY)!=0; + + /* If the file was successfully opened for read/write access, + ** choose a default page size in case we have to create the + ** database file. The default page size is the maximum of: + ** + ** + SQLITE_DEFAULT_PAGE_SIZE, + ** + The value returned by sqlite3OsSectorSize() + ** + The largest page size that can be written atomically. + */ + if( rc==SQLITE_OK ){ + int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); + if( !readOnly ){ + setSectorSize(pPager); + assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE); + if( szPageDfltsectorSize ){ + if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ + szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; + }else{ + szPageDflt = (u32)pPager->sectorSize; + } + } +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + { + int ii; + assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); + assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); + assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); + for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ + if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){ + szPageDflt = ii; + } + } + } +#endif + } + pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0); + if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 + || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ + vfsFlags |= SQLITE_OPEN_READONLY; + goto act_like_temp_file; + } + } + }else{ + /* If a temporary file is requested, it is not opened immediately. + ** In this case we accept the default page size and delay actually + ** opening the file until the first call to OsWrite(). + ** + ** This branch is also run for an in-memory database. An in-memory + ** database is the same as a temp-file that is never written out to + ** disk and uses an in-memory rollback journal. + ** + ** This branch also runs for files marked as immutable. + */ +act_like_temp_file: + tempFile = 1; + pPager->eState = PAGER_READER; /* Pretend we already have a lock */ + pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE mode */ + pPager->noLock = 1; /* Do no locking */ + readOnly = (vfsFlags&SQLITE_OPEN_READONLY); + } + + /* The following call to PagerSetPagesize() serves to set the value of + ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. + */ + if( rc==SQLITE_OK ){ + assert( pPager->memDb==0 ); + rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); + testcase( rc!=SQLITE_OK ); + } + + /* Initialize the PCache object. */ + if( rc==SQLITE_OK ){ + nExtra = ROUND8(nExtra); + assert( nExtra>=8 && nExtra<1000 ); + rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, + !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); + } + + /* If an error occurred above, free the Pager structure and close the file. + */ + if( rc!=SQLITE_OK ){ + sqlite3OsClose(pPager->fd); + sqlite3PageFree(pPager->pTmpSpace); + sqlite3_free(pPager); + return rc; + } + + PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); + IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) + + pPager->useJournal = (u8)useJournal; + /* pPager->stmtOpen = 0; */ + /* pPager->stmtInUse = 0; */ + /* pPager->nRef = 0; */ + /* pPager->stmtSize = 0; */ + /* pPager->stmtJSize = 0; */ + /* pPager->nPage = 0; */ + pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; + /* pPager->state = PAGER_UNLOCK; */ + /* pPager->errMask = 0; */ + pPager->tempFile = (u8)tempFile; + assert( tempFile==PAGER_LOCKINGMODE_NORMAL + || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); + pPager->exclusiveMode = (u8)tempFile; + pPager->changeCountDone = pPager->tempFile; + pPager->memDb = (u8)memDb; + pPager->readOnly = (u8)readOnly; + assert( useJournal || pPager->tempFile ); + pPager->noSync = pPager->tempFile; + if( pPager->noSync ){ + assert( pPager->fullSync==0 ); + assert( pPager->extraSync==0 ); + assert( pPager->syncFlags==0 ); + assert( pPager->walSyncFlags==0 ); + }else{ + pPager->fullSync = 1; + pPager->extraSync = 0; + pPager->syncFlags = SQLITE_SYNC_NORMAL; + pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL<<2); + } + /* pPager->pFirst = 0; */ + /* pPager->pFirstSynced = 0; */ + /* pPager->pLast = 0; */ + pPager->nExtra = (u16)nExtra; + pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; + assert( isOpen(pPager->fd) || tempFile ); + setSectorSize(pPager); + if( !useJournal ){ + pPager->journalMode = PAGER_JOURNALMODE_OFF; + }else if( memDb || memJM ){ + pPager->journalMode = PAGER_JOURNALMODE_MEMORY; + } + /* pPager->xBusyHandler = 0; */ + /* pPager->pBusyHandlerArg = 0; */ + pPager->xReiniter = xReinit; + setGetterMethod(pPager); + /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ + /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ + + *ppPager = pPager; + return SQLITE_OK; +} + +/* +** Return the sqlite3_file for the main database given the name +** of the corresonding WAL or Journal name as passed into +** xOpen. +*/ +SQLITE_API sqlite3_file *sqlite3_database_file_object(const char *zName){ + Pager *pPager; + while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ + zName--; + } + pPager = *(Pager**)(zName - 4 - sizeof(Pager*)); + return pPager->fd; +} + + +/* +** This function is called after transitioning from PAGER_UNLOCK to +** PAGER_SHARED state. It tests if there is a hot journal present in +** the file-system for the given pager. A hot journal is one that +** needs to be played back. According to this function, a hot-journal +** file exists if the following criteria are met: +** +** * The journal file exists in the file system, and +** * No process holds a RESERVED or greater lock on the database file, and +** * The database file itself is greater than 0 bytes in size, and +** * The first byte of the journal file exists and is not 0x00. +** +** If the current size of the database file is 0 but a journal file +** exists, that is probably an old journal left over from a prior +** database with the same name. In this case the journal file is +** just deleted using OsDelete, *pExists is set to 0 and SQLITE_OK +** is returned. +** +** This routine does not check if there is a super-journal filename +** at the end of the file. If there is, and that super-journal file +** does not exist, then the journal file is not really hot. In this +** case this routine will return a false-positive. The pager_playback() +** routine will discover that the journal file is not really hot and +** will not roll it back. +** +** If a hot-journal file is found to exist, *pExists is set to 1 and +** SQLITE_OK returned. If no hot-journal file is present, *pExists is +** set to 0 and SQLITE_OK returned. If an IO error occurs while trying +** to determine whether or not a hot-journal file exists, the IO error +** code is returned and the value of *pExists is undefined. +*/ +static int hasHotJournal(Pager *pPager, int *pExists){ + sqlite3_vfs * const pVfs = pPager->pVfs; + int rc = SQLITE_OK; /* Return code */ + int exists = 1; /* True if a journal file is present */ + int jrnlOpen = !!isOpen(pPager->jfd); + + assert( pPager->useJournal ); + assert( isOpen(pPager->fd) ); + assert( pPager->eState==PAGER_OPEN ); + + assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) & + SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN + )); + + *pExists = 0; + if( !jrnlOpen ){ + rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists); + } + if( rc==SQLITE_OK && exists ){ + int locked = 0; /* True if some process holds a RESERVED lock */ + + /* Race condition here: Another process might have been holding the + ** the RESERVED lock and have a journal open at the sqlite3OsAccess() + ** call above, but then delete the journal and drop the lock before + ** we get to the following sqlite3OsCheckReservedLock() call. If that + ** is the case, this routine might think there is a hot journal when + ** in fact there is none. This results in a false-positive which will + ** be dealt with by the playback routine. Ticket #3883. + */ + rc = sqlite3OsCheckReservedLock(pPager->fd, &locked); + if( rc==SQLITE_OK && !locked ){ + Pgno nPage; /* Number of pages in database file */ + + assert( pPager->tempFile==0 ); + rc = pagerPagecount(pPager, &nPage); + if( rc==SQLITE_OK ){ + /* If the database is zero pages in size, that means that either (1) the + ** journal is a remnant from a prior database with the same name where + ** the database file but not the journal was deleted, or (2) the initial + ** transaction that populates a new database is being rolled back. + ** In either case, the journal file can be deleted. However, take care + ** not to delete the journal file if it is already open due to + ** journal_mode=PERSIST. + */ + if( nPage==0 && !jrnlOpen ){ + sqlite3BeginBenignMalloc(); + if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ + sqlite3OsDelete(pVfs, pPager->zJournal, 0); + if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + } + sqlite3EndBenignMalloc(); + }else{ + /* The journal file exists and no other connection has a reserved + ** or greater lock on the database file. Now check that there is + ** at least one non-zero bytes at the start of the journal file. + ** If there is, then we consider this journal to be hot. If not, + ** it can be ignored. + */ + if( !jrnlOpen ){ + int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL; + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); + } + if( rc==SQLITE_OK ){ + u8 first = 0; + rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } + if( !jrnlOpen ){ + sqlite3OsClose(pPager->jfd); + } + *pExists = (first!=0); + }else if( rc==SQLITE_CANTOPEN ){ + /* If we cannot open the rollback journal file in order to see if + ** it has a zero header, that might be due to an I/O error, or + ** it might be due to the race condition described above and in + ** ticket #3883. Either way, assume that the journal is hot. + ** This might be a false positive. But if it is, then the + ** automatic journal playback and recovery mechanism will deal + ** with it under an EXCLUSIVE lock where we do not need to + ** worry so much with race conditions. + */ + *pExists = 1; + rc = SQLITE_OK; + } + } + } + } + } + + return rc; +} + +/* +** This function is called to obtain a shared lock on the database file. +** It is illegal to call sqlite3PagerGet() until after this function +** has been successfully called. If a shared-lock is already held when +** this function is called, it is a no-op. +** +** The following operations are also performed by this function. +** +** 1) If the pager is currently in PAGER_OPEN state (no lock held +** on the database file), then an attempt is made to obtain a +** SHARED lock on the database file. Immediately after obtaining +** the SHARED lock, the file-system is checked for a hot-journal, +** which is played back if present. Following any hot-journal +** rollback, the contents of the cache are validated by checking +** the 'change-counter' field of the database file header and +** discarded if they are found to be invalid. +** +** 2) If the pager is running in exclusive-mode, and there are currently +** no outstanding references to any pages, and is in the error state, +** then an attempt is made to clear the error state by discarding +** the contents of the page cache and rolling back any open journal +** file. +** +** If everything is successful, SQLITE_OK is returned. If an IO error +** occurs while locking the database, checking for a hot-journal file or +** rolling back a journal file, the IO error code is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + + /* This routine is only called from b-tree and only when there are no + ** outstanding pages. This implies that the pager state should either + ** be OPEN or READER. READER is only possible if the pager is or was in + ** exclusive access mode. */ + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); + assert( assert_pager_state(pPager) ); + assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); + assert( pPager->errCode==SQLITE_OK ); + + if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ + int bHotJournal = 1; /* True if there exists a hot journal-file */ + + assert( !MEMDB ); + assert( pPager->tempFile==0 || pPager->eLock==EXCLUSIVE_LOCK ); + + rc = pager_wait_on_lock(pPager, SHARED_LOCK); + if( rc!=SQLITE_OK ){ + assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK ); + goto failed; + } + + /* If a journal file exists, and there is no RESERVED lock on the + ** database file, then it either needs to be played back or deleted. + */ + if( pPager->eLock<=SHARED_LOCK ){ + rc = hasHotJournal(pPager, &bHotJournal); + } + if( rc!=SQLITE_OK ){ + goto failed; + } + if( bHotJournal ){ + if( pPager->readOnly ){ + rc = SQLITE_READONLY_ROLLBACK; + goto failed; + } + + /* Get an EXCLUSIVE lock on the database file. At this point it is + ** important that a RESERVED lock is not obtained on the way to the + ** EXCLUSIVE lock. If it were, another process might open the + ** database file, detect the RESERVED lock, and conclude that the + ** database is safe to read while this process is still rolling the + ** hot-journal back. + ** + ** Because the intermediate RESERVED lock is not requested, any + ** other process attempting to access the database file will get to + ** this point in the code and fail to obtain its own EXCLUSIVE lock + ** on the database file. + ** + ** Unless the pager is in locking_mode=exclusive mode, the lock is + ** downgraded to SHARED_LOCK before this function returns. + */ + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + goto failed; + } + + /* If it is not already open and the file exists on disk, open the + ** journal for read/write access. Write access is required because + ** in exclusive-access mode the file descriptor will be kept open + ** and possibly used for a transaction later on. Also, write-access + ** is usually required to finalize the journal in journal_mode=persist + ** mode (and also for journal_mode=truncate on some systems). + ** + ** If the journal does not exist, it usually means that some + ** other connection managed to get in and roll it back before + ** this connection obtained the exclusive lock above. Or, it + ** may mean that the pager was in the error-state when this + ** function was called and the journal file does not exist. + */ + if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + sqlite3_vfs * const pVfs = pPager->pVfs; + int bExists; /* True if journal file exists */ + rc = sqlite3OsAccess( + pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists); + if( rc==SQLITE_OK && bExists ){ + int fout = 0; + int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL; + assert( !pPager->tempFile ); + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout); + assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){ + rc = SQLITE_CANTOPEN_BKPT; + sqlite3OsClose(pPager->jfd); + } + } + } + + /* Playback and delete the journal. Drop the database write + ** lock and reacquire the read lock. Purge the cache before + ** playing back the hot-journal so that we don't end up with + ** an inconsistent cache. Sync the hot journal before playing + ** it back since the process that crashed and left the hot journal + ** probably did not sync it and we are required to always sync + ** the journal before playing it back. + */ + if( isOpen(pPager->jfd) ){ + assert( rc==SQLITE_OK ); + rc = pagerSyncHotJournal(pPager); + if( rc==SQLITE_OK ){ + rc = pager_playback(pPager, !pPager->tempFile); + pPager->eState = PAGER_OPEN; + } + }else if( !pPager->exclusiveMode ){ + pagerUnlockDb(pPager, SHARED_LOCK); + } + + if( rc!=SQLITE_OK ){ + /* This branch is taken if an error occurs while trying to open + ** or roll back a hot-journal while holding an EXCLUSIVE lock. The + ** pager_unlock() routine will be called before returning to unlock + ** the file. If the unlock attempt fails, then Pager.eLock must be + ** set to UNKNOWN_LOCK (see the comment above the #define for + ** UNKNOWN_LOCK above for an explanation). + ** + ** In order to get pager_unlock() to do this, set Pager.eState to + ** PAGER_ERROR now. This is not actually counted as a transition + ** to ERROR state in the state diagram at the top of this file, + ** since we know that the same call to pager_unlock() will very + ** shortly transition the pager object to the OPEN state. Calling + ** assert_pager_state() would fail now, as it should not be possible + ** to be in ERROR state when there are zero outstanding page + ** references. + */ + pager_error(pPager, rc); + goto failed; + } + + assert( pPager->eState==PAGER_OPEN ); + assert( (pPager->eLock==SHARED_LOCK) + || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) + ); + } + + if( !pPager->tempFile && pPager->hasHeldSharedLock ){ + /* The shared-lock has just been acquired then check to + ** see if the database has been modified. If the database has changed, + ** flush the cache. The hasHeldSharedLock flag prevents this from + ** occurring on the very first access to a file, in order to save a + ** single unnecessary sqlite3OsRead() call at the start-up. + ** + ** Database changes are detected by looking at 15 bytes beginning + ** at offset 24 into the file. The first 4 of these 16 bytes are + ** a 32-bit counter that is incremented with each change. The + ** other bytes change randomly with each file change when + ** a codec is in use. + ** + ** There is a vanishingly small chance that a change will not be + ** detected. The chance of an undetected change is so small that + ** it can be neglected. + */ + char dbFileVers[sizeof(pPager->dbFileVers)]; + + IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); + rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); + if( rc!=SQLITE_OK ){ + if( rc!=SQLITE_IOERR_SHORT_READ ){ + goto failed; + } + memset(dbFileVers, 0, sizeof(dbFileVers)); + } + + if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ + pager_reset(pPager); + + /* Unmap the database file. It is possible that external processes + ** may have truncated the database file and then extended it back + ** to its original size while this process was not holding a lock. + ** In this case there may exist a Pager.pMap mapping that appears + ** to be the right size but is not actually valid. Avoid this + ** possibility by unmapping the db here. */ + if( USEFETCH(pPager) ){ + sqlite3OsUnfetch(pPager->fd, 0, 0); + } + } + } + + /* If there is a WAL file in the file-system, open this database in WAL + ** mode. Otherwise, the following function call is a no-op. + */ + rc = pagerOpenWalIfPresent(pPager); +#ifndef SQLITE_OMIT_WAL + assert( pPager->pWal==0 || rc==SQLITE_OK ); +#endif + } + + if( pagerUseWal(pPager) ){ + assert( rc==SQLITE_OK ); + rc = pagerBeginReadTransaction(pPager); + } + + if( pPager->tempFile==0 && pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ + rc = pagerPagecount(pPager, &pPager->dbSize); + } + + failed: + if( rc!=SQLITE_OK ){ + assert( !MEMDB ); + pager_unlock(pPager); + assert( pPager->eState==PAGER_OPEN ); + }else{ + pPager->eState = PAGER_READER; + pPager->hasHeldSharedLock = 1; + } + return rc; +} + +/* +** If the reference count has reached zero, rollback any active +** transaction and unlock the pager. +** +** Except, in locking_mode=EXCLUSIVE when there is nothing to in +** the rollback journal, the unlock is not performed and there is +** nothing to rollback, so this routine is a no-op. +*/ +static void pagerUnlockIfUnused(Pager *pPager){ + if( sqlite3PcacheRefCount(pPager->pPCache)==0 ){ + assert( pPager->nMmapOut==0 ); /* because page1 is never memory mapped */ + pagerUnlockAndRollback(pPager); + } +} + +/* +** The page getter methods each try to acquire a reference to a +** page with page number pgno. If the requested reference is +** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. +** +** There are different implementations of the getter method depending +** on the current state of the pager. +** +** getPageNormal() -- The normal getter +** getPageError() -- Used if the pager is in an error state +** getPageMmap() -- Used if memory-mapped I/O is enabled +** +** If the requested page is already in the cache, it is returned. +** Otherwise, a new page object is allocated and populated with data +** read from the database file. In some cases, the pcache module may +** choose not to allocate a new page object and may reuse an existing +** object with no outstanding references. +** +** The extra data appended to a page is always initialized to zeros the +** first time a page is loaded into memory. If the page requested is +** already in the cache when this function is called, then the extra +** data is left as it was when the page object was last used. +** +** If the database image is smaller than the requested page or if +** the flags parameter contains the PAGER_GET_NOCONTENT bit and the +** requested page is not already stored in the cache, then no +** actual disk read occurs. In this case the memory image of the +** page is initialized to all zeros. +** +** If PAGER_GET_NOCONTENT is true, it means that we do not care about +** the contents of the page. This occurs in two scenarios: +** +** a) When reading a free-list leaf page from the database, and +** +** b) When a savepoint is being rolled back and we need to load +** a new page into the cache to be filled with the data read +** from the savepoint journal. +** +** If PAGER_GET_NOCONTENT is true, then the data returned is zeroed instead +** of being read from the database. Additionally, the bits corresponding +** to pgno in Pager.pInJournal (bitvec of pages already written to the +** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open +** savepoints are set. This means if the page is made writable at any +** point in the future, using a call to sqlite3PagerWrite(), its contents +** will not be journaled. This saves IO. +** +** The acquisition might fail for several reasons. In all cases, +** an appropriate error code is returned and *ppPage is set to NULL. +** +** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt +** to find a page in the in-memory cache first. If the page is not already +** in memory, this routine goes to disk to read it in whereas Lookup() +** just returns 0. This routine acquires a read-lock the first time it +** has to go to disk, and could also playback an old journal if necessary. +** Since Lookup() never goes to disk, it never has to deal with locks +** or journal files. +*/ +static int getPageNormal( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg; + u8 noContent; /* True if PAGER_GET_NOCONTENT is set */ + sqlite3_pcache_page *pBase; + + assert( pPager->errCode==SQLITE_OK ); + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( pPager->hasHeldSharedLock==1 ); + + if( pgno==0 ) return SQLITE_CORRUPT_BKPT; + pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); + if( pBase==0 ){ + pPg = 0; + rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + if( pBase==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto pager_acquire_err; + } + } + pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); + assert( pPg==(*ppPage) ); + assert( pPg->pgno==pgno ); + assert( pPg->pPager==pPager || pPg->pPager==0 ); + + noContent = (flags & PAGER_GET_NOCONTENT)!=0; + if( pPg->pPager && !noContent ){ + /* In this case the pcache already contains an initialized copy of + ** the page. Return without further ado. */ + assert( pgno!=PAGER_SJ_PGNO(pPager) ); + pPager->aStat[PAGER_STAT_HIT]++; + return SQLITE_OK; + + }else{ + /* The pager cache has created a new page. Its content needs to + ** be initialized. But first some error checks: + ** + ** (*) obsolete. Was: maximum page number is 2^31 + ** (2) Never try to fetch the locking page + */ + if( pgno==PAGER_SJ_PGNO(pPager) ){ + rc = SQLITE_CORRUPT_BKPT; + goto pager_acquire_err; + } + + pPg->pPager = pPager; + + assert( !isOpen(pPager->fd) || !MEMDB ); + if( !isOpen(pPager->fd) || pPager->dbSizepPager->mxPgno ){ + rc = SQLITE_FULL; + goto pager_acquire_err; + } + if( noContent ){ + /* Failure to set the bits in the InJournal bit-vectors is benign. + ** It merely means that we might do some extra work to journal a + ** page that does not need to be journaled. Nevertheless, be sure + ** to test the case where a malloc error occurs while trying to set + ** a bit in a bit vector. + */ + sqlite3BeginBenignMalloc(); + if( pgno<=pPager->dbOrigSize ){ + TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); + testcase( rc==SQLITE_NOMEM ); + } + TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); + testcase( rc==SQLITE_NOMEM ); + sqlite3EndBenignMalloc(); + } + memset(pPg->pData, 0, pPager->pageSize); + IOTRACE(("ZERO %p %d\n", pPager, pgno)); + }else{ + assert( pPg->pPager==pPager ); + pPager->aStat[PAGER_STAT_MISS]++; + rc = readDbPage(pPg); + if( rc!=SQLITE_OK ){ + goto pager_acquire_err; + } + } + pager_set_pagehash(pPg); + } + return SQLITE_OK; + +pager_acquire_err: + assert( rc!=SQLITE_OK ); + if( pPg ){ + sqlite3PcacheDrop(pPg); + } + pagerUnlockIfUnused(pPager); + *ppPage = 0; + return rc; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* The page getter for when memory-mapped I/O is enabled */ +static int getPageMMap( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg = 0; + u32 iFrame = 0; /* Frame to read from WAL file */ + + /* It is acceptable to use a read-only (mmap) page for any page except + ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY + ** flag was specified by the caller. And so long as the db is not a + ** temporary or in-memory database. */ + const int bMmapOk = (pgno>1 + && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) + ); + + assert( USEFETCH(pPager) ); +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + assert( pPager->xCodec==0 ); +#endif +/* END SQLCIPHER */ + + /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here + ** allows the compiler optimizer to reuse the results of the "pgno>1" + ** test in the previous statement, and avoid testing pgno==0 in the + ** common case where pgno is large. */ + if( pgno<=1 && pgno==0 ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( pPager->hasHeldSharedLock==1 ); + assert( pPager->errCode==SQLITE_OK ); + + if( bMmapOk && pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + if( bMmapOk && iFrame==0 ){ + void *pData = 0; + rc = sqlite3OsFetch(pPager->fd, + (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData + ); + if( rc==SQLITE_OK && pData ){ + if( pPager->eState>PAGER_READER || pPager->tempFile ){ + pPg = sqlite3PagerLookup(pPager, pgno); + } + if( pPg==0 ){ + rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); + }else{ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); + } + if( pPg ){ + assert( rc==SQLITE_OK ); + *ppPage = pPg; + return SQLITE_OK; + } + } + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + return getPageNormal(pPager, pgno, ppPage, flags); +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* The page getter method for when the pager is an error state */ +static int getPageError( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + UNUSED_PARAMETER(pgno); + UNUSED_PARAMETER(flags); + assert( pPager->errCode!=SQLITE_OK ); + *ppPage = 0; + return pPager->errCode; +} + + +/* Dispatch all page fetch requests to the appropriate getter method. +*/ +SQLITE_PRIVATE int sqlite3PagerGet( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + /* printf("PAGE %u\n", pgno); fflush(stdout); */ + return pPager->xGet(pPager, pgno, ppPage, flags); +} + +/* +** Acquire a page if it is already in the in-memory cache. Do +** not read the page from disk. Return a pointer to the page, +** or 0 if the page is not in cache. +** +** See also sqlite3PagerGet(). The difference between this routine +** and sqlite3PagerGet() is that _get() will go to the disk and read +** in the page if the page is not already in cache. This routine +** returns NULL if the page is not in cache or if a disk I/O error +** has ever happened. +*/ +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ + sqlite3_pcache_page *pPage; + assert( pPager!=0 ); + assert( pgno!=0 ); + assert( pPager->pPCache!=0 ); + pPage = sqlite3PcacheFetch(pPager->pPCache, pgno, 0); + assert( pPage==0 || pPager->hasHeldSharedLock ); + if( pPage==0 ) return 0; + return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); +} + +/* +** Release a page reference. +** +** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be +** used if we know that the page being released is not the last page. +** The btree layer always holds page1 open until the end, so these first +** to routines can be used to release any page other than BtShared.pPage1. +** +** Use sqlite3PagerUnrefPageOne() to release page1. This latter routine +** checks the total number of outstanding pages and if the number of +** pages reaches zero it drops the database lock. +*/ +SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){ + TESTONLY( Pager *pPager = pPg->pPager; ) + assert( pPg!=0 ); + if( pPg->flags & PGHDR_MMAP ){ + assert( pPg->pgno!=1 ); /* Page1 is never memory mapped */ + pagerReleaseMapPage(pPg); + }else{ + sqlite3PcacheRelease(pPg); + } + /* Do not use this routine to release the last reference to page1 */ + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); +} +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ + if( pPg ) sqlite3PagerUnrefNotNull(pPg); +} +SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ + Pager *pPager; + assert( pPg!=0 ); + assert( pPg->pgno==1 ); + assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ + pPager = pPg->pPager; + sqlite3PcacheRelease(pPg); + pagerUnlockIfUnused(pPager); +} + +/* +** This function is called at the start of every write transaction. +** There must already be a RESERVED or EXCLUSIVE lock on the database +** file when this routine is called. +** +** Open the journal file for pager pPager and write a journal header +** to the start of it. If there are active savepoints, open the sub-journal +** as well. This function is only used when the journal file is being +** opened to write a rollback log for a transaction. It is not used +** when opening a hot journal file to roll it back. +** +** If the journal file is already open (as it may be in exclusive mode), +** then this function just writes a journal header to the start of the +** already open file. +** +** Whether or not the journal file is opened by this function, the +** Pager.pInJournal bitvec structure is allocated. +** +** Return SQLITE_OK if everything is successful. Otherwise, return +** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or +** an IO error code if opening or writing the journal file fails. +*/ +static int pager_open_journal(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */ + + assert( pPager->eState==PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + assert( pPager->pInJournal==0 ); + + /* If already in the error state, this function is a no-op. But on + ** the other hand, this routine is never called if we are already in + ** an error state. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize); + if( pPager->pInJournal==0 ){ + return SQLITE_NOMEM_BKPT; + } + + /* Open the journal file if it is not already open. */ + if( !isOpen(pPager->jfd) ){ + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ + sqlite3MemJournalOpen(pPager->jfd); + }else{ + int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + int nSpill; + + if( pPager->tempFile ){ + flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); + nSpill = sqlite3Config.nStmtSpill; + }else{ + flags |= SQLITE_OPEN_MAIN_JOURNAL; + nSpill = jrnlBufferSize(pPager); + } + + /* Verify that the database still has the same name as it did when + ** it was originally opened. */ + rc = databaseIsUnmoved(pPager); + if( rc==SQLITE_OK ){ + rc = sqlite3JournalOpen ( + pVfs, pPager->zJournal, pPager->jfd, flags, nSpill + ); + } + } + assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + } + + + /* Write the first journal header to the journal file and open + ** the sub-journal if necessary. + */ + if( rc==SQLITE_OK ){ + /* TODO: Check if all of these are really required. */ + pPager->nRec = 0; + pPager->journalOff = 0; + pPager->setSuper = 0; + pPager->journalHdr = 0; + rc = writeJournalHdr(pPager); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3BitvecDestroy(pPager->pInJournal); + pPager->pInJournal = 0; + }else{ + assert( pPager->eState==PAGER_WRITER_LOCKED ); + pPager->eState = PAGER_WRITER_CACHEMOD; + } + + return rc; +} + +/* +** Begin a write-transaction on the specified pager object. If a +** write-transaction has already been opened, this function is a no-op. +** +** If the exFlag argument is false, then acquire at least a RESERVED +** lock on the database file. If exFlag is true, then acquire at least +** an EXCLUSIVE lock. If such a lock is already held, no locking +** functions need be called. +** +** If the subjInMemory argument is non-zero, then any sub-journal opened +** within this transaction will be opened as an in-memory file. This +** has no effect if the sub-journal is already opened (as it may be when +** running in exclusive mode) or if the transaction does not require a +** sub-journal. If the subjInMemory argument is zero, then any required +** sub-journal is implemented in-memory if pPager is an in-memory database, +** or using a temporary file otherwise. +*/ +SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ + int rc = SQLITE_OK; + + if( pPager->errCode ) return pPager->errCode; + assert( pPager->eState>=PAGER_READER && pPager->eStatesubjInMemory = (u8)subjInMemory; + + if( pPager->eState==PAGER_READER ){ + assert( pPager->pInJournal==0 ); + + if( pagerUseWal(pPager) ){ + /* If the pager is configured to use locking_mode=exclusive, and an + ** exclusive lock on the database is not already held, obtain it now. + */ + if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){ + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + return rc; + } + (void)sqlite3WalExclusiveMode(pPager->pWal, 1); + } + + /* Grab the write lock on the log file. If successful, upgrade to + ** PAGER_RESERVED state. Otherwise, return an error code to the caller. + ** The busy-handler is not invoked if another connection already + ** holds the write-lock. If possible, the upper layer will call it. + */ + rc = sqlite3WalBeginWriteTransaction(pPager->pWal); + }else{ + /* Obtain a RESERVED lock on the database file. If the exFlag parameter + ** is true, then immediately upgrade this to an EXCLUSIVE lock. The + ** busy-handler callback can be used when upgrading to the EXCLUSIVE + ** lock, but not when obtaining the RESERVED lock. + */ + rc = pagerLockDb(pPager, RESERVED_LOCK); + if( rc==SQLITE_OK && exFlag ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + + if( rc==SQLITE_OK ){ + /* Change to WRITER_LOCKED state. + ** + ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD + ** when it has an open transaction, but never to DBMOD or FINISHED. + ** This is because in those states the code to roll back savepoint + ** transactions may copy data from the sub-journal into the database + ** file as well as into the page cache. Which would be incorrect in + ** WAL mode. + */ + pPager->eState = PAGER_WRITER_LOCKED; + pPager->dbHintSize = pPager->dbSize; + pPager->dbFileSize = pPager->dbSize; + pPager->dbOrigSize = pPager->dbSize; + pPager->journalOff = 0; + } + + assert( rc==SQLITE_OK || pPager->eState==PAGER_READER ); + assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + } + + PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager))); + return rc; +} + +/* +** Write page pPg onto the end of the rollback journal. +*/ +static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc; + u32 cksum; + char *pData2; + i64 iOff = pPager->journalOff; + + /* We should never write to the journal file the page that + ** contains the database locks. The following assert verifies + ** that we do not. */ + assert( pPg->pgno!=PAGER_SJ_PGNO(pPager) ); + + assert( pPager->journalHdr<=pPager->journalOff ); + CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); + cksum = pager_cksum(pPager, (u8*)pData2); + + /* Even if an IO or diskfull error occurs while journalling the + ** page in the block above, set the need-sync flag for the page. + ** Otherwise, when the transaction is rolled back, the logic in + ** playback_one_page() will think that the page needs to be restored + ** in the database file. And if an IO error occurs while doing so, + ** then corruption may follow. + */ + pPg->flags |= PGHDR_NEED_SYNC; + + rc = write32bits(pPager->jfd, iOff, pPg->pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4); + if( rc!=SQLITE_OK ) return rc; + rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); + if( rc!=SQLITE_OK ) return rc; + + IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, + pPager->journalOff, pPager->pageSize)); + PAGER_INCR(sqlite3_pager_writej_count); + PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg))); + + pPager->journalOff += 8 + pPager->pageSize; + pPager->nRec++; + assert( pPager->pInJournal!=0 ); + rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + rc |= addToSavepointBitvecs(pPager, pPg->pgno); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + return rc; +} + +/* +** Mark a single data page as writeable. The page is written into the +** main journal or sub-journal as required. If the page is written into +** one of the journals, the corresponding bit is set in the +** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs +** of any open savepoints as appropriate. +*/ +static int pager_write(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc = SQLITE_OK; + + /* This routine is not called unless a write-transaction has already + ** been started. The journal file may or may not be open at this point. + ** It is never called in the ERROR state. + */ + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + assert( pPager->errCode==0 ); + assert( pPager->readOnly==0 ); + CHECK_PAGE(pPg); + + /* The journal file needs to be opened. Higher level routines have already + ** obtained the necessary locks to begin the write-transaction, but the + ** rollback journal might not yet be open. Open it now if this is the case. + ** + ** This is done before calling sqlite3PcacheMakeDirty() on the page. + ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then + ** an error might occur and the pager would end up in WRITER_LOCKED state + ** with pages marked as dirty in the cache. + */ + if( pPager->eState==PAGER_WRITER_LOCKED ){ + rc = pager_open_journal(pPager); + if( rc!=SQLITE_OK ) return rc; + } + assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); + assert( assert_pager_state(pPager) ); + + /* Mark the page that is about to be modified as dirty. */ + sqlite3PcacheMakeDirty(pPg); + + /* If a rollback journal is in use, them make sure the page that is about + ** to change is in the rollback journal, or if the page is a new page off + ** then end of the file, make sure it is marked as PGHDR_NEED_SYNC. + */ + assert( (pPager->pInJournal!=0) == isOpen(pPager->jfd) ); + if( pPager->pInJournal!=0 + && sqlite3BitvecTestNotNull(pPager->pInJournal, pPg->pgno)==0 + ){ + assert( pagerUseWal(pPager)==0 ); + if( pPg->pgno<=pPager->dbOrigSize ){ + rc = pagerAddPageToRollbackJournal(pPg); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + if( pPager->eState!=PAGER_WRITER_DBMOD ){ + pPg->flags |= PGHDR_NEED_SYNC; + } + PAGERTRACE(("APPEND %d page %d needSync=%d\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); + } + } + + /* The PGHDR_DIRTY bit is set above when the page was added to the dirty-list + ** and before writing the page into the rollback journal. Wait until now, + ** after the page has been successfully journalled, before setting the + ** PGHDR_WRITEABLE bit that indicates that the page can be safely modified. + */ + pPg->flags |= PGHDR_WRITEABLE; + + /* If the statement journal is open and the page is not in it, + ** then write the page into the statement journal. + */ + if( pPager->nSavepoint>0 ){ + rc = subjournalPageIfRequired(pPg); + } + + /* Update the database size and return. */ + if( pPager->dbSizepgno ){ + pPager->dbSize = pPg->pgno; + } + return rc; +} + +/* +** This is a variant of sqlite3PagerWrite() that runs when the sector size +** is larger than the page size. SQLite makes the (reasonable) assumption that +** all bytes of a sector are written together by hardware. Hence, all bytes of +** a sector need to be journalled in case of a power loss in the middle of +** a write. +** +** Usually, the sector size is less than or equal to the page size, in which +** case pages can be individually written. This routine only runs in the +** exceptional case where the page size is smaller than the sector size. +*/ +static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ + int rc = SQLITE_OK; /* Return code */ + Pgno nPageCount; /* Total number of pages in database file */ + Pgno pg1; /* First page of the sector pPg is located on. */ + int nPage = 0; /* Number of pages starting at pg1 to journal */ + int ii; /* Loop counter */ + int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ + Pager *pPager = pPg->pPager; /* The pager that owns pPg */ + Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); + + /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow + ** a journal header to be written between the pages journaled by + ** this function. + */ + assert( !MEMDB ); + assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)==0 ); + pPager->doNotSpill |= SPILLFLAG_NOSYNC; + + /* This trick assumes that both the page-size and sector-size are + ** an integer power of 2. It sets variable pg1 to the identifier + ** of the first page of the sector pPg is located on. + */ + pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; + + nPageCount = pPager->dbSize; + if( pPg->pgno>nPageCount ){ + nPage = (pPg->pgno - pg1)+1; + }else if( (pg1+nPagePerSector-1)>nPageCount ){ + nPage = nPageCount+1-pg1; + }else{ + nPage = nPagePerSector; + } + assert(nPage>0); + assert(pg1<=pPg->pgno); + assert((pg1+nPage)>pPg->pgno); + + for(ii=0; iipgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ + if( pg!=PAGER_SJ_PGNO(pPager) ){ + rc = sqlite3PagerGet(pPager, pg, &pPage, 0); + if( rc==SQLITE_OK ){ + rc = pager_write(pPage); + if( pPage->flags&PGHDR_NEED_SYNC ){ + needSync = 1; + } + sqlite3PagerUnrefNotNull(pPage); + } + } + }else if( (pPage = sqlite3PagerLookup(pPager, pg))!=0 ){ + if( pPage->flags&PGHDR_NEED_SYNC ){ + needSync = 1; + } + sqlite3PagerUnrefNotNull(pPage); + } + } + + /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages + ** starting at pg1, then it needs to be set for all of them. Because + ** writing to any of these nPage pages may damage the others, the + ** journal file must contain sync()ed copies of all of them + ** before any of them can be written out to the database file. + */ + if( rc==SQLITE_OK && needSync ){ + assert( !MEMDB ); + for(ii=0; iiflags |= PGHDR_NEED_SYNC; + sqlite3PagerUnrefNotNull(pPage); + } + } + } + + assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)!=0 ); + pPager->doNotSpill &= ~SPILLFLAG_NOSYNC; + return rc; +} + +/* +** Mark a data page as writeable. This routine must be called before +** making changes to a page. The caller must check the return value +** of this function and be careful not to change any page data unless +** this routine returns SQLITE_OK. +** +** The difference between this function and pager_write() is that this +** function also deals with the special case where 2 or more pages +** fit on a single disk sector. In this case all co-resident pages +** must have been written to the journal file before returning. +** +** If an error occurs, SQLITE_NOMEM or an IO error code is returned +** as appropriate. Otherwise, SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3PagerWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + assert( (pPg->flags & PGHDR_MMAP)==0 ); + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ + if( pPager->nSavepoint ) return subjournalPageIfRequired(pPg); + return SQLITE_OK; + }else if( pPager->errCode ){ + return pPager->errCode; + }else if( pPager->sectorSize > (u32)pPager->pageSize ){ + assert( pPager->tempFile==0 ); + return pagerWriteLargeSector(pPg); + }else{ + return pager_write(pPg); + } +} + +/* +** Return TRUE if the page given in the argument was previously passed +** to sqlite3PagerWrite(). In other words, return TRUE if it is ok +** to change the content of the page. +*/ +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ + return pPg->flags & PGHDR_WRITEABLE; +} +#endif + +/* +** A call to this routine tells the pager that it is not necessary to +** write the information on page pPg back to the disk, even though +** that page might be marked as dirty. This happens, for example, when +** the page has been added as a leaf of the freelist and so its +** content no longer matters. +** +** The overlying software layer calls this routine when all of the data +** on the given page is unused. The pager marks the page as clean so +** that it does not get written to disk. +** +** Tests show that this optimization can quadruple the speed of large +** DELETE operations. +** +** This optimization cannot be used with a temp-file, as the page may +** have been dirty at the start of the transaction. In that case, if +** memory pressure forces page pPg out of the cache, the data does need +** to be written out to disk so that it may be read back in if the +** current transaction is rolled back. +*/ +SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + if( !pPager->tempFile && (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){ + PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager))); + IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) + pPg->flags |= PGHDR_DONT_WRITE; + pPg->flags &= ~PGHDR_WRITEABLE; + testcase( pPg->flags & PGHDR_NEED_SYNC ); + pager_set_pagehash(pPg); + } +} + +/* +** This routine is called to increment the value of the database file +** change-counter, stored as a 4-byte big-endian integer starting at +** byte offset 24 of the pager file. The secondary change counter at +** 92 is also updated, as is the SQLite version number at offset 96. +** +** But this only happens if the pPager->changeCountDone flag is false. +** To avoid excess churning of page 1, the update only happens once. +** See also the pager_write_changecounter() routine that does an +** unconditional update of the change counters. +** +** If the isDirectMode flag is zero, then this is done by calling +** sqlite3PagerWrite() on page 1, then modifying the contents of the +** page data. In this case the file will be updated when the current +** transaction is committed. +** +** The isDirectMode flag may only be non-zero if the library was compiled +** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case, +** if isDirect is non-zero, then the database file is updated directly +** by writing an updated version of page 1 using a call to the +** sqlite3OsWrite() function. +*/ +static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ + int rc = SQLITE_OK; + + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + + /* Declare and initialize constant integer 'isDirect'. If the + ** atomic-write optimization is enabled in this build, then isDirect + ** is initialized to the value passed as the isDirectMode parameter + ** to this function. Otherwise, it is always set to zero. + ** + ** The idea is that if the atomic-write optimization is not + ** enabled at compile time, the compiler can omit the tests of + ** 'isDirect' below, as well as the block enclosed in the + ** "if( isDirect )" condition. + */ +#ifndef SQLITE_ENABLE_ATOMIC_WRITE +# define DIRECT_MODE 0 + assert( isDirectMode==0 ); + UNUSED_PARAMETER(isDirectMode); +#else +# define DIRECT_MODE isDirectMode +#endif + + if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ + PgHdr *pPgHdr; /* Reference to page 1 */ + + assert( !pPager->tempFile && isOpen(pPager->fd) ); + + /* Open page 1 of the file for writing. */ + rc = sqlite3PagerGet(pPager, 1, &pPgHdr, 0); + assert( pPgHdr==0 || rc==SQLITE_OK ); + + /* If page one was fetched successfully, and this function is not + ** operating in direct-mode, make page 1 writable. When not in + ** direct mode, page 1 is always held in cache and hence the PagerGet() + ** above is always successful - hence the ALWAYS on rc==SQLITE_OK. + */ + if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){ + rc = sqlite3PagerWrite(pPgHdr); + } + + if( rc==SQLITE_OK ){ + /* Actually do the update of the change counter */ + pager_write_changecounter(pPgHdr); + + /* If running in direct mode, write the contents of page 1 to the file. */ + if( DIRECT_MODE ){ + const void *zBuf; + assert( pPager->dbFileSize>0 ); + CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM_BKPT, zBuf); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); + pPager->aStat[PAGER_STAT_WRITE]++; + } + if( rc==SQLITE_OK ){ + /* Update the pager's copy of the change-counter. Otherwise, the + ** next time a read transaction is opened the cache will be + ** flushed (as the change-counter values will not match). */ + const void *pCopy = (const void *)&((const char *)zBuf)[24]; + memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); + pPager->changeCountDone = 1; + } + }else{ + pPager->changeCountDone = 1; + } + } + + /* Release the page reference. */ + sqlite3PagerUnref(pPgHdr); + } + return rc; +} + +/* +** Sync the database file to disk. This is a no-op for in-memory databases +** or pages with the Pager.noSync flag set. +** +** If successful, or if called on a pager for which it is a no-op, this +** function returns SQLITE_OK. Otherwise, an IO error code is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zSuper){ + int rc = SQLITE_OK; + void *pArg = (void*)zSuper; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc==SQLITE_OK && !pPager->noSync ){ + assert( !MEMDB ); + rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); + } + return rc; +} + +/* +** This function may only be called while a write-transaction is active in +** rollback. If the connection is in WAL mode, this call is a no-op. +** Otherwise, if the connection does not already have an EXCLUSIVE lock on +** the database file, an attempt is made to obtain one. +** +** If the EXCLUSIVE lock is already held or the attempt to obtain it is +** successful, or the connection is in WAL mode, SQLITE_OK is returned. +** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is +** returned. +*/ +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ + int rc = pPager->errCode; + assert( assert_pager_state(pPager) ); + if( rc==SQLITE_OK ){ + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_WRITER_LOCKED + ); + assert( assert_pager_state(pPager) ); + if( 0==pagerUseWal(pPager) ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } + } + return rc; +} + +/* +** Sync the database file for the pager pPager. zSuper points to the name +** of a super-journal file that should be written into the individual +** journal file. zSuper may be NULL, which is interpreted as no +** super-journal (a single database transaction). +** +** This routine ensures that: +** +** * The database file change-counter is updated, +** * the journal is synced (unless the atomic-write optimization is used), +** * all dirty pages are written to the database file, +** * the database file is truncated (if required), and +** * the database file synced. +** +** The only thing that remains to commit the transaction is to finalize +** (delete, truncate or zero the first part of) the journal file (or +** delete the super-journal file if specified). +** +** Note that if zSuper==NULL, this does not overwrite a previous value +** passed to an sqlite3PagerCommitPhaseOne() call. +** +** If the final parameter - noSync - is true, then the database file itself +** is not synced. The caller must call sqlite3PagerSync() directly to +** sync the database file before calling CommitPhaseTwo() to delete the +** journal file in this case. +*/ +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( + Pager *pPager, /* Pager object */ + const char *zSuper, /* If not NULL, the super-journal name */ + int noSync /* True to omit the xSync on the db file */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_ERROR + ); + assert( assert_pager_state(pPager) ); + + /* If a prior error occurred, report that error again. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + + /* Provide the ability to easily simulate an I/O error during testing */ + if( sqlite3FaultSim(400) ) return SQLITE_IOERR; + + PAGERTRACE(("DATABASE SYNC: File=%s zSuper=%s nSize=%d\n", + pPager->zFilename, zSuper, pPager->dbSize)); + + /* If no database changes have been made, return early. */ + if( pPager->eStatetempFile ); + assert( isOpen(pPager->fd) || pPager->tempFile ); + if( 0==pagerFlushOnCommit(pPager, 1) ){ + /* If this is an in-memory db, or no pages have been written to, or this + ** function has already been called, it is mostly a no-op. However, any + ** backup in progress needs to be restarted. */ + sqlite3BackupRestart(pPager->pBackup); + }else{ + PgHdr *pList; + if( pagerUseWal(pPager) ){ + PgHdr *pPageOne = 0; + pList = sqlite3PcacheDirtyList(pPager->pPCache); + if( pList==0 ){ + /* Must have at least one page for the WAL commit flag. + ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ + rc = sqlite3PagerGet(pPager, 1, &pPageOne, 0); + pList = pPageOne; + pList->pDirty = 0; + } + assert( rc==SQLITE_OK ); + if( ALWAYS(pList) ){ + rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); + } + sqlite3PagerUnref(pPageOne); + if( rc==SQLITE_OK ){ + sqlite3PcacheCleanAll(pPager->pPCache); + } + }else{ + /* The bBatch boolean is true if the batch-atomic-write commit method + ** should be used. No rollback journal is created if batch-atomic-write + ** is enabled. + */ +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + sqlite3_file *fd = pPager->fd; + int bBatch = zSuper==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */ + && (sqlite3OsDeviceCharacteristics(fd) & SQLITE_IOCAP_BATCH_ATOMIC) + && !pPager->noSync + && sqlite3JournalIsInMemory(pPager->jfd); +#else +# define bBatch 0 +#endif + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + /* The following block updates the change-counter. Exactly how it + ** does this depends on whether or not the atomic-update optimization + ** was enabled at compile time, and if this transaction meets the + ** runtime criteria to use the operation: + ** + ** * The file-system supports the atomic-write property for + ** blocks of size page-size, and + ** * This commit is not part of a multi-file transaction, and + ** * Exactly one page has been modified and store in the journal file. + ** + ** If the optimization was not enabled at compile time, then the + ** pager_incr_changecounter() function is called to update the change + ** counter in 'indirect-mode'. If the optimization is compiled in but + ** is not applicable to this transaction, call sqlite3JournalCreate() + ** to make sure the journal file has actually been created, then call + ** pager_incr_changecounter() to update the change-counter in indirect + ** mode. + ** + ** Otherwise, if the optimization is both enabled and applicable, + ** then call pager_incr_changecounter() to update the change-counter + ** in 'direct' mode. In this case the journal file will never be + ** created for this transaction. + */ + if( bBatch==0 ){ + PgHdr *pPg; + assert( isOpen(pPager->jfd) + || pPager->journalMode==PAGER_JOURNALMODE_OFF + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + if( !zSuper && isOpen(pPager->jfd) + && pPager->journalOff==jrnlBufferSize(pPager) + && pPager->dbSize>=pPager->dbOrigSize + && (!(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) + ){ + /* Update the db file change counter via the direct-write method. The + ** following call will modify the in-memory representation of page 1 + ** to include the updated change counter and then write page 1 + ** directly to the database file. Because of the atomic-write + ** property of the host file-system, this is safe. + */ + rc = pager_incr_changecounter(pPager, 1); + }else{ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc==SQLITE_OK ){ + rc = pager_incr_changecounter(pPager, 0); + } + } + } +#else /* SQLITE_ENABLE_ATOMIC_WRITE */ +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( zSuper ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + assert( bBatch==0 ); + } +#endif + rc = pager_incr_changecounter(pPager, 0); +#endif /* !SQLITE_ENABLE_ATOMIC_WRITE */ + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + /* Write the super-journal name into the journal file. If a + ** super-journal file name has already been written to the journal file, + ** or if zSuper is NULL (no super-journal), then this call is a no-op. + */ + rc = writeSuperJournal(pPager, zSuper); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + /* Sync the journal file and write all dirty pages to the database. + ** If the atomic-update optimization is being used, this sync will not + ** create the journal file or perform any real IO. + ** + ** Because the change-counter page was just modified, unless the + ** atomic-update optimization is used it is almost certain that the + ** journal requires a sync here. However, in locking_mode=exclusive + ** on a system under memory pressure it is just possible that this is + ** not the case. In this case it is likely enough that the redundant + ** xSync() call will be changed to a no-op by the OS anyhow. + */ + rc = syncJournal(pPager, 0); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + + pList = sqlite3PcacheDirtyList(pPager->pPCache); +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( bBatch ){ + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, 0); + if( rc==SQLITE_OK ){ + rc = pager_write_pagelist(pPager, pList); + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0); + } + if( rc!=SQLITE_OK ){ + sqlite3OsFileControlHint(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0); + } + } + + if( (rc&0xFF)==SQLITE_IOERR && rc!=SQLITE_IOERR_NOMEM ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ){ + sqlite3OsClose(pPager->jfd); + goto commit_phase_one_exit; + } + bBatch = 0; + }else{ + sqlite3OsClose(pPager->jfd); + } + } +#endif /* SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + if( bBatch==0 ){ + rc = pager_write_pagelist(pPager, pList); + } + if( rc!=SQLITE_OK ){ + assert( rc!=SQLITE_IOERR_BLOCKED ); + goto commit_phase_one_exit; + } + sqlite3PcacheCleanAll(pPager->pPCache); + + /* If the file on disk is smaller than the database image, use + ** pager_truncate to grow the file here. This can happen if the database + ** image was extended as part of the current transaction and then the + ** last page in the db image moved to the free-list. In this case the + ** last page is never written out to disk, leaving the database file + ** undersized. Fix this now if it is the case. */ + if( pPager->dbSize>pPager->dbFileSize ){ + Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_SJ_PGNO(pPager)); + assert( pPager->eState==PAGER_WRITER_DBMOD ); + rc = pager_truncate(pPager, nNew); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + } + + /* Finally, sync the database file. */ + if( !noSync ){ + rc = sqlite3PagerSync(pPager, zSuper); + } + IOTRACE(("DBSYNC %p\n", pPager)) + } + } + +commit_phase_one_exit: + if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ + pPager->eState = PAGER_WRITER_FINISHED; + } + return rc; +} + + +/* +** When this function is called, the database file has been completely +** updated to reflect the changes made by the current transaction and +** synced to disk. The journal file still exists in the file-system +** though, and if a failure occurs at this point it will eventually +** be used as a hot-journal and the current transaction rolled back. +** +** This function finalizes the journal file, either by deleting, +** truncating or partially zeroing it, so that it cannot be used +** for hot-journal rollback. Once this is done the transaction is +** irrevocably committed. +** +** If an error occurs, an IO error code is returned and the pager +** moves into the error state. Otherwise, SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + + /* This routine should not be called if a prior error has occurred. + ** But if (due to a coding error elsewhere in the system) it does get + ** called, just return the same error code without doing anything. */ + if( NEVER(pPager->errCode) ) return pPager->errCode; + pPager->iDataVersion++; + + assert( pPager->eState==PAGER_WRITER_LOCKED + || pPager->eState==PAGER_WRITER_FINISHED + || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD) + ); + assert( assert_pager_state(pPager) ); + + /* An optimization. If the database was not actually modified during + ** this transaction, the pager is running in exclusive-mode and is + ** using persistent journals, then this function is a no-op. + ** + ** The start of the journal file currently contains a single journal + ** header with the nRec field set to 0. If such a journal is used as + ** a hot-journal during hot-journal rollback, 0 changes will be made + ** to the database file. So there is no need to zero the journal + ** header. Since the pager is in exclusive mode, there is no need + ** to drop any locks either. + */ + if( pPager->eState==PAGER_WRITER_LOCKED + && pPager->exclusiveMode + && pPager->journalMode==PAGER_JOURNALMODE_PERSIST + ){ + assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); + pPager->eState = PAGER_READER; + return SQLITE_OK; + } + + PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); + rc = pager_end_transaction(pPager, pPager->setSuper, 1); + return pager_error(pPager, rc); +} + +/* +** If a write transaction is open, then all changes made within the +** transaction are reverted and the current write-transaction is closed. +** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR +** state if an error occurs. +** +** If the pager is already in PAGER_ERROR state when this function is called, +** it returns Pager.errCode immediately. No work is performed in this case. +** +** Otherwise, in rollback mode, this function performs two functions: +** +** 1) It rolls back the journal file, restoring all database file and +** in-memory cache pages to the state they were in when the transaction +** was opened, and +** +** 2) It finalizes the journal file, so that it is not used for hot +** rollback at any point in the future. +** +** Finalization of the journal file (task 2) is only performed if the +** rollback is successful. +** +** In WAL mode, all cache-entries containing data modified within the +** current transaction are either expelled from the cache or reverted to +** their pre-transaction state by re-reading data from the database or +** WAL files. The WAL transaction is then closed. +*/ +SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ + int rc = SQLITE_OK; /* Return code */ + PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager))); + + /* PagerRollback() is a no-op if called in READER or OPEN state. If + ** the pager is already in the ERROR state, the rollback is not + ** attempted here. Instead, the error code is returned to the caller. + */ + assert( assert_pager_state(pPager) ); + if( pPager->eState==PAGER_ERROR ) return pPager->errCode; + if( pPager->eState<=PAGER_READER ) return SQLITE_OK; + + if( pagerUseWal(pPager) ){ + int rc2; + rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1); + rc2 = pager_end_transaction(pPager, pPager->setSuper, 0); + if( rc==SQLITE_OK ) rc = rc2; + }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){ + int eState = pPager->eState; + rc = pager_end_transaction(pPager, 0, 0); + if( !MEMDB && eState>PAGER_WRITER_LOCKED ){ + /* This can happen using journal_mode=off. Move the pager to the error + ** state to indicate that the contents of the cache may not be trusted. + ** Any active readers will get SQLITE_ABORT. + */ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + return rc; + } + }else{ + rc = pager_playback(pPager, 0); + } + + assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); + assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT + || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR + || rc==SQLITE_CANTOPEN + ); + + /* If an error occurs during a ROLLBACK, we can no longer trust the pager + ** cache. So call pager_error() on the way out to make any error persistent. + */ + return pager_error(pPager, rc); +} + +/* +** Return TRUE if the database file is opened read-only. Return FALSE +** if the database is (in theory) writable. +*/ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){ + return pPager->readOnly; +} + +#ifdef SQLITE_DEBUG +/* +** Return the sum of the reference counts for all pages held by pPager. +*/ +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){ + return sqlite3PcacheRefCount(pPager->pPCache); +} +#endif + +/* +** Return the approximate number of bytes of memory currently +** used by the pager and its associated cache. +*/ +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager *pPager){ + int perPageSize = pPager->pageSize + pPager->nExtra + + (int)(sizeof(PgHdr) + 5*sizeof(void*)); + return perPageSize*sqlite3PcachePagecount(pPager->pPCache) + + sqlite3MallocSize(pPager) + + pPager->pageSize; +} + +/* +** Return the number of references to the specified page. +*/ +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage *pPage){ + return sqlite3PcachePageRefcount(pPage); +} + +#ifdef SQLITE_TEST +/* +** This routine is used for testing and analysis only. +*/ +SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ + static int a[11]; + a[0] = sqlite3PcacheRefCount(pPager->pPCache); + a[1] = sqlite3PcachePagecount(pPager->pPCache); + a[2] = sqlite3PcacheGetCachesize(pPager->pPCache); + a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; + a[4] = pPager->eState; + a[5] = pPager->errCode; + a[6] = pPager->aStat[PAGER_STAT_HIT]; + a[7] = pPager->aStat[PAGER_STAT_MISS]; + a[8] = 0; /* Used to be pPager->nOvfl */ + a[9] = pPager->nRead; + a[10] = pPager->aStat[PAGER_STAT_WRITE]; + return a; +} +#endif + +/* +** Parameter eStat must be one of SQLITE_DBSTATUS_CACHE_HIT, _MISS, _WRITE, +** or _WRITE+1. The SQLITE_DBSTATUS_CACHE_WRITE+1 case is a translation +** of SQLITE_DBSTATUS_CACHE_SPILL. The _SPILL case is not contiguous because +** it was added later. +** +** Before returning, *pnVal is incremented by the +** current cache hit or miss count, according to the value of eStat. If the +** reset parameter is non-zero, the cache hit or miss count is zeroed before +** returning. +*/ +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ + + assert( eStat==SQLITE_DBSTATUS_CACHE_HIT + || eStat==SQLITE_DBSTATUS_CACHE_MISS + || eStat==SQLITE_DBSTATUS_CACHE_WRITE + || eStat==SQLITE_DBSTATUS_CACHE_WRITE+1 + ); + + assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS ); + assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE ); + assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 + && PAGER_STAT_WRITE==2 && PAGER_STAT_SPILL==3 ); + + eStat -= SQLITE_DBSTATUS_CACHE_HIT; + *pnVal += pPager->aStat[eStat]; + if( reset ){ + pPager->aStat[eStat] = 0; + } +} + +/* +** Return true if this is an in-memory or temp-file backed pager. +*/ +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ + return pPager->tempFile || pPager->memVfs; +} + +/* +** Check that there are at least nSavepoint savepoints open. If there are +** currently less than nSavepoints open, then open one or more savepoints +** to make up the difference. If the number of savepoints is already +** equal to nSavepoint, then this function is a no-op. +** +** If a memory allocation fails, SQLITE_NOMEM is returned. If an error +** occurs while opening the sub-journal file, then an IO error code is +** returned. Otherwise, SQLITE_OK. +*/ +static SQLITE_NOINLINE int pagerOpenSavepoint(Pager *pPager, int nSavepoint){ + int rc = SQLITE_OK; /* Return code */ + int nCurrent = pPager->nSavepoint; /* Current number of savepoints */ + int ii; /* Iterator variable */ + PagerSavepoint *aNew; /* New Pager.aSavepoint array */ + + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + assert( nSavepoint>nCurrent && pPager->useJournal ); + + /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM + ** if the allocation fails. Otherwise, zero the new portion in case a + ** malloc failure occurs while populating it in the for(...) loop below. + */ + aNew = (PagerSavepoint *)sqlite3Realloc( + pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint + ); + if( !aNew ){ + return SQLITE_NOMEM_BKPT; + } + memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint)); + pPager->aSavepoint = aNew; + + /* Populate the PagerSavepoint structures just allocated. */ + for(ii=nCurrent; iidbSize; + if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ + aNew[ii].iOffset = pPager->journalOff; + }else{ + aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); + } + aNew[ii].iSubRec = pPager->nSubRec; + aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize); + aNew[ii].bTruncateOnRelease = 1; + if( !aNew[ii].pInSavepoint ){ + return SQLITE_NOMEM_BKPT; + } + if( pagerUseWal(pPager) ){ + sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); + } + pPager->nSavepoint = ii+1; + } + assert( pPager->nSavepoint==nSavepoint ); + assertTruncateConstraint(pPager); + return rc; +} +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + + if( nSavepoint>pPager->nSavepoint && pPager->useJournal ){ + return pagerOpenSavepoint(pPager, nSavepoint); + }else{ + return SQLITE_OK; + } +} + + +/* +** This function is called to rollback or release (commit) a savepoint. +** The savepoint to release or rollback need not be the most recently +** created savepoint. +** +** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE. +** If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with +** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes +** that have occurred since the specified savepoint was created. +** +** The savepoint to rollback or release is identified by parameter +** iSavepoint. A value of 0 means to operate on the outermost savepoint +** (the first created). A value of (Pager.nSavepoint-1) means operate +** on the most recently created savepoint. If iSavepoint is greater than +** (Pager.nSavepoint-1), then this function is a no-op. +** +** If a negative value is passed to this function, then the current +** transaction is rolled back. This is different to calling +** sqlite3PagerRollback() because this function does not terminate +** the transaction or unlock the database, it just restores the +** contents of the database to its original state. +** +** In any case, all savepoints with an index greater than iSavepoint +** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE), +** then savepoint iSavepoint is also destroyed. +** +** This function may return SQLITE_NOMEM if a memory allocation fails, +** or an IO error code if an IO error occurs while rolling back a +** savepoint. If no errors occur, SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ + int rc = pPager->errCode; + +#ifdef SQLITE_ENABLE_ZIPVFS + if( op==SAVEPOINT_RELEASE ) rc = SQLITE_OK; +#endif + + assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); + assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK ); + + if( rc==SQLITE_OK && iSavepointnSavepoint ){ + int ii; /* Iterator variable */ + int nNew; /* Number of remaining savepoints after this op. */ + + /* Figure out how many savepoints will still be active after this + ** operation. Store this value in nNew. Then free resources associated + ** with any savepoints that are destroyed by this operation. + */ + nNew = iSavepoint + (( op==SAVEPOINT_RELEASE ) ? 0 : 1); + for(ii=nNew; iinSavepoint; ii++){ + sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); + } + pPager->nSavepoint = nNew; + + /* Truncate the sub-journal so that it only includes the parts + ** that are still in use. */ + if( op==SAVEPOINT_RELEASE ){ + PagerSavepoint *pRel = &pPager->aSavepoint[nNew]; + if( pRel->bTruncateOnRelease && isOpen(pPager->sjfd) ){ + /* Only truncate if it is an in-memory sub-journal. */ + if( sqlite3JournalIsInMemory(pPager->sjfd) ){ + i64 sz = (pPager->pageSize+4)*(i64)pRel->iSubRec; + rc = sqlite3OsTruncate(pPager->sjfd, sz); + assert( rc==SQLITE_OK ); + } + pPager->nSubRec = pRel->iSubRec; + } + } + /* Else this is a rollback operation, playback the specified savepoint. + ** If this is a temp-file, it is possible that the journal file has + ** not yet been opened. In this case there have been no changes to + ** the database file, so the playback operation can be skipped. + */ + else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){ + PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1]; + rc = pagerPlaybackSavepoint(pPager, pSavepoint); + assert(rc!=SQLITE_DONE); + } + +#ifdef SQLITE_ENABLE_ZIPVFS + /* If the cache has been modified but the savepoint cannot be rolled + ** back journal_mode=off, put the pager in the error state. This way, + ** if the VFS used by this pager includes ZipVFS, the entire transaction + ** can be rolled back at the ZipVFS level. */ + else if( + pPager->journalMode==PAGER_JOURNALMODE_OFF + && pPager->eState>=PAGER_WRITER_CACHEMOD + ){ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + } +#endif + } + + return rc; +} + +/* +** Return the full pathname of the database file. +** +** Except, if the pager is in-memory only, then return an empty string if +** nullIfMemDb is true. This routine is called with nullIfMemDb==1 when +** used to report the filename to the user, for compatibility with legacy +** behavior. But when the Btree needs to know the filename for matching to +** shared cache, it uses nullIfMemDb==0 so that in-memory databases can +** participate in shared-cache. +** +** The return value to this routine is always safe to use with +** sqlite3_uri_parameter() and sqlite3_filename_database() and friends. +*/ +SQLITE_PRIVATE const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ + static const char zFake[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + return (nullIfMemDb && pPager->memDb) ? &zFake[4] : pPager->zFilename; +} + +/* +** Return the VFS structure for the pager. +*/ +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ + return pPager->pVfs; +} + +/* +** Return the file handle for the database file associated +** with the pager. This might return NULL if the file has +** not yet been opened. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ + return pPager->fd; +} + +/* +** Return the file handle for the journal file (if it exists). +** This will be either the rollback journal or the WAL file. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ +#if SQLITE_OMIT_WAL + return pPager->jfd; +#else + return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; +#endif +} + +/* +** Return the full pathname of the journal file. +*/ +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ + return pPager->zJournal; +} + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +/* +** Set or retrieve the codec for this pager +*/ +void sqlcipherPagerSetCodec( + Pager *pPager, + void *(*xCodec)(void*,void*,Pgno,int), + void (*xCodecSizeChng)(void*,int,int), + void (*xCodecFree)(void*), + void *pCodec +){ + if( pPager->xCodecFree ){ + pPager->xCodecFree(pPager->pCodec); + }else{ + pager_reset(pPager); + } + pPager->xCodec = pPager->memDb ? 0 : xCodec; + pPager->xCodecSizeChng = xCodecSizeChng; + pPager->xCodecFree = xCodecFree; + pPager->pCodec = pCodec; + setGetterMethod(pPager); + pagerReportSize(pPager); +} +void *sqlcipherPagerGetCodec(Pager *pPager){ + return pPager->pCodec; +} + +/* +** This function is called by the wal module when writing page content +** into the log file. +** +** This function returns a pointer to a buffer containing the encrypted +** page content. If a malloc fails, this function may return NULL. +*/ +void *sqlcipherPagerCodec(PgHdr *pPg){ + void *aData = 0; + CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData); + return aData; +} +#endif /* SQLITE_HAS_CODEC */ +/* END SQLCIPHER */ + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Move the page pPg to location pgno in the file. +** +** There must be no references to the page previously located at +** pgno (which we call pPgOld) though that page is allowed to be +** in cache. If the page previously located at pgno is not already +** in the rollback journal, it is not put there by by this routine. +** +** References to the page pPg remain valid. Updating any +** meta-data associated with pPg (i.e. data stored in the nExtra bytes +** allocated along with the page) is the responsibility of the caller. +** +** A transaction must be active when this routine is called. It used to be +** required that a statement transaction was not active, but this restriction +** has been removed (CREATE INDEX needs to move a page when a statement +** transaction is active). +** +** If the fourth argument, isCommit, is non-zero, then this page is being +** moved as part of a database reorganization just before the transaction +** is being committed. In this case, it is guaranteed that the database page +** pPg refers to will not be written to again within this transaction. +** +** This function may return SQLITE_NOMEM or an IO error code if an error +** occurs. Otherwise, it returns SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ + PgHdr *pPgOld; /* The page being overwritten. */ + Pgno needSyncPgno = 0; /* Old value of pPg->pgno, if sync is required */ + int rc; /* Return code */ + Pgno origPgno; /* The original page number */ + + assert( pPg->nRef>0 ); + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + ); + assert( assert_pager_state(pPager) ); + + /* In order to be able to rollback, an in-memory database must journal + ** the page we are moving from. + */ + assert( pPager->tempFile || !MEMDB ); + if( pPager->tempFile ){ + rc = sqlite3PagerWrite(pPg); + if( rc ) return rc; + } + + /* If the page being moved is dirty and has not been saved by the latest + ** savepoint, then save the current contents of the page into the + ** sub-journal now. This is required to handle the following scenario: + ** + ** BEGIN; + ** + ** SAVEPOINT one; + ** + ** ROLLBACK TO one; + ** + ** If page X were not written to the sub-journal here, it would not + ** be possible to restore its contents when the "ROLLBACK TO one" + ** statement were is processed. + ** + ** subjournalPage() may need to allocate space to store pPg->pgno into + ** one or more savepoint bitvecs. This is the reason this function + ** may return SQLITE_NOMEM. + */ + if( (pPg->flags & PGHDR_DIRTY)!=0 + && SQLITE_OK!=(rc = subjournalPageIfRequired(pPg)) + ){ + return rc; + } + + PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n", + PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno)); + IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) + + /* If the journal needs to be sync()ed before page pPg->pgno can + ** be written to, store pPg->pgno in local variable needSyncPgno. + ** + ** If the isCommit flag is set, there is no need to remember that + ** the journal needs to be sync()ed before database page pPg->pgno + ** can be written to. The caller has already promised not to write to it. + */ + if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ + needSyncPgno = pPg->pgno; + assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || + pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); + assert( pPg->flags&PGHDR_DIRTY ); + } + + /* If the cache contains a page with page-number pgno, remove it + ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for + ** page pgno before the 'move' operation, it needs to be retained + ** for the page moved there. + */ + pPg->flags &= ~PGHDR_NEED_SYNC; + pPgOld = sqlite3PagerLookup(pPager, pgno); + assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB ); + if( pPgOld ){ + if( NEVER(pPgOld->nRef>1) ){ + sqlite3PagerUnrefNotNull(pPgOld); + return SQLITE_CORRUPT_BKPT; + } + pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); + if( pPager->tempFile ){ + /* Do not discard pages from an in-memory database since we might + ** need to rollback later. Just move the page out of the way. */ + sqlite3PcacheMove(pPgOld, pPager->dbSize+1); + }else{ + sqlite3PcacheDrop(pPgOld); + } + } + + origPgno = pPg->pgno; + sqlite3PcacheMove(pPg, pgno); + sqlite3PcacheMakeDirty(pPg); + + /* For an in-memory database, make sure the original page continues + ** to exist, in case the transaction needs to roll back. Use pPgOld + ** as the original page since it has already been allocated. + */ + if( pPager->tempFile && pPgOld ){ + sqlite3PcacheMove(pPgOld, origPgno); + sqlite3PagerUnrefNotNull(pPgOld); + } + + if( needSyncPgno ){ + /* If needSyncPgno is non-zero, then the journal file needs to be + ** sync()ed before any data is written to database file page needSyncPgno. + ** Currently, no such page exists in the page-cache and the + ** "is journaled" bitvec flag has been set. This needs to be remedied by + ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC + ** flag. + ** + ** If the attempt to load the page into the page-cache fails, (due + ** to a malloc() or IO failure), clear the bit in the pInJournal[] + ** array. Otherwise, if the page is loaded and written again in + ** this transaction, it may be written to the database file before + ** it is synced into the journal file. This way, it may end up in + ** the journal file twice, but that is not a problem. + */ + PgHdr *pPgHdr; + rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr, 0); + if( rc!=SQLITE_OK ){ + if( needSyncPgno<=pPager->dbOrigSize ){ + assert( pPager->pTmpSpace!=0 ); + sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); + } + return rc; + } + pPgHdr->flags |= PGHDR_NEED_SYNC; + sqlite3PcacheMakeDirty(pPgHdr); + sqlite3PagerUnrefNotNull(pPgHdr); + } + + return SQLITE_OK; +} +#endif + +/* +** The page handle passed as the first argument refers to a dirty page +** with a page number other than iNew. This function changes the page's +** page number to iNew and sets the value of the PgHdr.flags field to +** the value passed as the third parameter. +*/ +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage *pPg, Pgno iNew, u16 flags){ + assert( pPg->pgno!=iNew ); + pPg->flags = flags; + sqlite3PcacheMove(pPg, iNew); +} + +/* +** Return a pointer to the data for the specified page. +*/ +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){ + assert( pPg->nRef>0 || pPg->pPager->memDb ); + return pPg->pData; +} + +/* +** Return a pointer to the Pager.nExtra bytes of "extra" space +** allocated along with the specified page. +*/ +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ + return pPg->pExtra; +} + +/* +** Get/set the locking-mode for this pager. Parameter eMode must be one +** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then +** the locking-mode is set to the value specified. +** +** The returned value is either PAGER_LOCKINGMODE_NORMAL or +** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated) +** locking-mode. +*/ +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){ + assert( eMode==PAGER_LOCKINGMODE_QUERY + || eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_QUERY<0 ); + assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 ); + assert( pPager->exclusiveMode || 0==sqlite3WalHeapMemory(pPager->pWal) ); + if( eMode>=0 && !pPager->tempFile && !sqlite3WalHeapMemory(pPager->pWal) ){ + pPager->exclusiveMode = (u8)eMode; + } + return (int)pPager->exclusiveMode; +} + +/* +** Set the journal-mode for this pager. Parameter eMode must be one of: +** +** PAGER_JOURNALMODE_DELETE +** PAGER_JOURNALMODE_TRUNCATE +** PAGER_JOURNALMODE_PERSIST +** PAGER_JOURNALMODE_OFF +** PAGER_JOURNALMODE_MEMORY +** PAGER_JOURNALMODE_WAL +** +** The journalmode is set to the value specified if the change is allowed. +** The change may be disallowed for the following reasons: +** +** * An in-memory database can only have its journal_mode set to _OFF +** or _MEMORY. +** +** * Temporary databases cannot have _WAL journalmode. +** +** The returned indicate the current (possibly updated) journal-mode. +*/ +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ + u8 eOld = pPager->journalMode; /* Prior journalmode */ + + /* The eMode parameter is always valid */ + assert( eMode==PAGER_JOURNALMODE_DELETE /* 0 */ + || eMode==PAGER_JOURNALMODE_PERSIST /* 1 */ + || eMode==PAGER_JOURNALMODE_OFF /* 2 */ + || eMode==PAGER_JOURNALMODE_TRUNCATE /* 3 */ + || eMode==PAGER_JOURNALMODE_MEMORY /* 4 */ + || eMode==PAGER_JOURNALMODE_WAL /* 5 */ ); + + /* This routine is only called from the OP_JournalMode opcode, and + ** the logic there will never allow a temporary file to be changed + ** to WAL mode. + */ + assert( pPager->tempFile==0 || eMode!=PAGER_JOURNALMODE_WAL ); + + /* Do allow the journalmode of an in-memory database to be set to + ** anything other than MEMORY or OFF + */ + if( MEMDB ){ + assert( eOld==PAGER_JOURNALMODE_MEMORY || eOld==PAGER_JOURNALMODE_OFF ); + if( eMode!=PAGER_JOURNALMODE_MEMORY && eMode!=PAGER_JOURNALMODE_OFF ){ + eMode = eOld; + } + } + + if( eMode!=eOld ){ + + /* Change the journal mode. */ + assert( pPager->eState!=PAGER_ERROR ); + pPager->journalMode = (u8)eMode; + + /* When transistioning from TRUNCATE or PERSIST to any other journal + ** mode except WAL, unless the pager is in locking_mode=exclusive mode, + ** delete the journal file. + */ + assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 ); + assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 ); + assert( (PAGER_JOURNALMODE_DELETE & 5)==0 ); + assert( (PAGER_JOURNALMODE_MEMORY & 5)==4 ); + assert( (PAGER_JOURNALMODE_OFF & 5)==0 ); + assert( (PAGER_JOURNALMODE_WAL & 5)==5 ); + + assert( isOpen(pPager->fd) || pPager->exclusiveMode ); + if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){ + /* In this case we would like to delete the journal file. If it is + ** not possible, then that is not a problem. Deleting the journal file + ** here is an optimization only. + ** + ** Before deleting the journal file, obtain a RESERVED lock on the + ** database file. This ensures that the journal file is not deleted + ** while it is in use by some other client. + */ + sqlite3OsClose(pPager->jfd); + if( pPager->eLock>=RESERVED_LOCK ){ + sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + }else{ + int rc = SQLITE_OK; + int state = pPager->eState; + assert( state==PAGER_OPEN || state==PAGER_READER ); + if( state==PAGER_OPEN ){ + rc = sqlite3PagerSharedLock(pPager); + } + if( pPager->eState==PAGER_READER ){ + assert( rc==SQLITE_OK ); + rc = pagerLockDb(pPager, RESERVED_LOCK); + } + if( rc==SQLITE_OK ){ + sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + } + if( rc==SQLITE_OK && state==PAGER_READER ){ + pagerUnlockDb(pPager, SHARED_LOCK); + }else if( state==PAGER_OPEN ){ + pager_unlock(pPager); + } + assert( state==pPager->eState ); + } + }else if( eMode==PAGER_JOURNALMODE_OFF ){ + sqlite3OsClose(pPager->jfd); + } + } + + /* Return the new journal mode */ + return (int)pPager->journalMode; +} + +/* +** Return the current journal mode. +*/ +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ + return (int)pPager->journalMode; +} + +/* +** Return TRUE if the pager is in a state where it is OK to change the +** journalmode. Journalmode changes can only happen when the database +** is unmodified. +*/ +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ + assert( assert_pager_state(pPager) ); + if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0; + if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0; + return 1; +} + +/* +** Get/set the size-limit used for persistent journal files. +** +** Setting the size limit to -1 means no limit is enforced. +** An attempt to set a limit smaller than -1 is a no-op. +*/ +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ + if( iLimit>=-1 ){ + pPager->journalSizeLimit = iLimit; + sqlite3WalLimit(pPager->pWal, iLimit); + } + return pPager->journalSizeLimit; +} + +/* +** Return a pointer to the pPager->pBackup variable. The backup module +** in backup.c maintains the content of this variable. This module +** uses it opaquely as an argument to sqlite3BackupRestart() and +** sqlite3BackupUpdate() only. +*/ +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ + return &pPager->pBackup; +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Unless this is an in-memory or temporary database, clear the pager cache. +*/ +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ + assert( MEMDB==0 || pPager->tempFile ); + if( pPager->tempFile==0 ) pager_reset(pPager); +} +#endif + + +#ifndef SQLITE_OMIT_WAL +/* +** This function is called when the user invokes "PRAGMA wal_checkpoint", +** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint() +** or wal_blocking_checkpoint() API functions. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3PagerCheckpoint( + Pager *pPager, /* Checkpoint on this pager */ + sqlite3 *db, /* Db handle used to check for interrupts */ + int eMode, /* Type of checkpoint */ + int *pnLog, /* OUT: Final number of frames in log */ + int *pnCkpt /* OUT: Final number of checkpointed frames */ +){ + int rc = SQLITE_OK; + if( pPager->pWal==0 && pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + /* This only happens when a database file is zero bytes in size opened and + ** then "PRAGMA journal_mode=WAL" is run and then sqlite3_wal_checkpoint() + ** is invoked without any intervening transactions. We need to start + ** a transaction to initialize pWal. The PRAGMA table_list statement is + ** used for this since it starts transactions on every database file, + ** including all ATTACHed databases. This seems expensive for a single + ** sqlite3_wal_checkpoint() call, but it happens very rarely. + ** https://sqlite.org/forum/forumpost/fd0f19d229156939 + */ + sqlite3_exec(db, "PRAGMA table_list",0,0,0); + } + if( pPager->pWal ){ + rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, + (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), + pPager->pBusyHandlerArg, + pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, + pnLog, pnCkpt + ); + } + return rc; +} + +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){ + return sqlite3WalCallback(pPager->pWal); +} + +/* +** Return true if the underlying VFS for the given pager supports the +** primitives necessary for write-ahead logging. +*/ +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){ + const sqlite3_io_methods *pMethods = pPager->fd->pMethods; + if( pPager->noLock ) return 0; + return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); +} + +/* +** Attempt to take an exclusive lock on the database file. If a PENDING lock +** is obtained instead, immediately release it. +*/ +static int pagerExclusiveLock(Pager *pPager){ + int rc; /* Return code */ + + assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); + if( rc!=SQLITE_OK ){ + /* If the attempt to grab the exclusive lock failed, release the + ** pending lock that may have been obtained instead. */ + pagerUnlockDb(pPager, SHARED_LOCK); + } + + return rc; +} + +/* +** Call sqlite3WalOpen() to open the WAL handle. If the pager is in +** exclusive-locking mode when this function is called, take an EXCLUSIVE +** lock on the database file and use heap-memory to store the wal-index +** in. Otherwise, use the normal shared-memory. +*/ +static int pagerOpenWal(Pager *pPager){ + int rc = SQLITE_OK; + + assert( pPager->pWal==0 && pPager->tempFile==0 ); + assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + + /* If the pager is already in exclusive-mode, the WAL module will use + ** heap-memory for the wal-index instead of the VFS shared-memory + ** implementation. Take the exclusive lock now, before opening the WAL + ** file, to make sure this is safe. + */ + if( pPager->exclusiveMode ){ + rc = pagerExclusiveLock(pPager); + } + + /* Open the connection to the log file. If this operation fails, + ** (e.g. due to malloc() failure), return an error code. + */ + if( rc==SQLITE_OK ){ + rc = sqlite3WalOpen(pPager->pVfs, + pPager->fd, pPager->zWal, pPager->exclusiveMode, + pPager->journalSizeLimit, &pPager->pWal + ); + } + pagerFixMaplimit(pPager); + + return rc; +} + + +/* +** The caller must be holding a SHARED lock on the database file to call +** this function. +** +** If the pager passed as the first argument is open on a real database +** file (not a temp file or an in-memory database), and the WAL file +** is not already open, make an attempt to open it now. If successful, +** return SQLITE_OK. If an error occurs or the VFS used by the pager does +** not support the xShmXXX() methods, return an error code. *pbOpen is +** not modified in either case. +** +** If the pager is open on a temp-file (or in-memory database), or if +** the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK +** without doing anything. +*/ +SQLITE_PRIVATE int sqlite3PagerOpenWal( + Pager *pPager, /* Pager object */ + int *pbOpen /* OUT: Set to true if call is a no-op */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( assert_pager_state(pPager) ); + assert( pPager->eState==PAGER_OPEN || pbOpen ); + assert( pPager->eState==PAGER_READER || !pbOpen ); + assert( pbOpen==0 || *pbOpen==0 ); + assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) ); + + if( !pPager->tempFile && !pPager->pWal ){ + if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN; + + /* Close any rollback journal previously open */ + sqlite3OsClose(pPager->jfd); + + rc = pagerOpenWal(pPager); + if( rc==SQLITE_OK ){ + pPager->journalMode = PAGER_JOURNALMODE_WAL; + pPager->eState = PAGER_OPEN; + } + }else{ + *pbOpen = 1; + } + + return rc; +} + +/* +** This function is called to close the connection to the log file prior +** to switching from WAL to rollback mode. +** +** Before closing the log file, this function attempts to take an +** EXCLUSIVE lock on the database file. If this cannot be obtained, an +** error (SQLITE_BUSY) is returned and the log connection is not closed. +** If successful, the EXCLUSIVE lock is not released before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ + int rc = SQLITE_OK; + + assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); + + /* If the log file is not already open, but does exist in the file-system, + ** it may need to be checkpointed before the connection can switch to + ** rollback mode. Open it now so this can happen. + */ + if( !pPager->pWal ){ + int logexists = 0; + rc = pagerLockDb(pPager, SHARED_LOCK); + if( rc==SQLITE_OK ){ + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists + ); + } + if( rc==SQLITE_OK && logexists ){ + rc = pagerOpenWal(pPager); + } + } + + /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on + ** the database file, the log and log-summary files will be deleted. + */ + if( rc==SQLITE_OK && pPager->pWal ){ + rc = pagerExclusiveLock(pPager); + if( rc==SQLITE_OK ){ + rc = sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, + pPager->pageSize, (u8*)pPager->pTmpSpace); + pPager->pWal = 0; + pagerFixMaplimit(pPager); + if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + } + } + return rc; +} + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** If pager pPager is a wal-mode database not in exclusive locking mode, +** invoke the sqlite3WalWriteLock() function on the associated Wal object +** with the same db and bLock parameters as were passed to this function. +** Return an SQLite error code if an error occurs, or SQLITE_OK otherwise. +*/ +SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager *pPager, int bLock){ + int rc = SQLITE_OK; + if( pagerUseWal(pPager) && pPager->exclusiveMode==0 ){ + rc = sqlite3WalWriteLock(pPager->pWal, bLock); + } + return rc; +} + +/* +** Set the database handle used by the wal layer to determine if +** blocking locks are required. +*/ +SQLITE_PRIVATE void sqlite3PagerWalDb(Pager *pPager, sqlite3 *db){ + if( pagerUseWal(pPager) ){ + sqlite3WalDb(pPager->pWal, db); + } +} +#endif + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** If this is a WAL database, obtain a snapshot handle for the snapshot +** currently open. Otherwise, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_ERROR; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); + } + return rc; +} + +/* +** If this is a WAL database, store a pointer to pSnapshot. Next time a +** read transaction is opened, attempt to read from the snapshot it +** identifies. If this is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen( + Pager *pPager, + sqlite3_snapshot *pSnapshot +){ + int rc = SQLITE_OK; + if( pPager->pWal ){ + sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this +** is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ + int rc; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotRecover(pPager->pWal); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** The caller currently has a read transaction open on the database. +** If this is not a WAL database, SQLITE_ERROR is returned. Otherwise, +** this function takes a SHARED lock on the CHECKPOINTER slot and then +** checks if the snapshot passed as the second argument is still +** available. If so, SQLITE_OK is returned. +** +** If the snapshot is not available, SQLITE_ERROR is returned. Or, if +** the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error +** occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER +** lock is released before returning. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot){ + int rc; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotCheck(pPager->pWal, pSnapshot); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** Release a lock obtained by an earlier successful call to +** sqlite3PagerSnapshotCheck(). +*/ +SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){ + assert( pPager->pWal ); + sqlite3WalSnapshotUnlock(pPager->pWal); +} + +#endif /* SQLITE_ENABLE_SNAPSHOT */ +#endif /* !SQLITE_OMIT_WAL */ + +#ifdef SQLITE_ENABLE_ZIPVFS +/* +** A read-lock must be held on the pager when this function is called. If +** the pager is in WAL mode and the WAL file currently contains one or more +** frames, return the size in bytes of the page images stored within the +** WAL frames. Otherwise, if this is not a WAL database or the WAL file +** is empty, return 0. +*/ +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ + assert( pPager->eState>=PAGER_READER ); + return sqlite3WalFramesize(pPager->pWal); +} +#endif + +#endif /* SQLITE_OMIT_DISKIO */ + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + +SQLITE_API int sqlite3pager_is_sj_pgno(Pager *pPager, Pgno pgno) { + return (PAGER_SJ_PGNO(pPager) == pgno) ? 1 : 0; +} + +SQLITE_API void sqlite3pager_error(Pager *pPager, int error) { + pPager->errCode = error; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); +} + +SQLITE_API void sqlite3pager_reset(Pager *pPager){ + pager_reset(pPager); +} + +#endif +/* END SQLCIPHER */ + + +/************** End of pager.c ***********************************************/ +/************** Begin file wal.c *********************************************/ +/* +** 2010 February 1 +** +** 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 contains the implementation of a write-ahead log (WAL) used in +** "journal_mode=WAL" mode. +** +** WRITE-AHEAD LOG (WAL) FILE FORMAT +** +** A WAL file consists of a header followed by zero or more "frames". +** Each frame records the revised content of a single page from the +** database file. All changes to the database are recorded by writing +** frames into the WAL. Transactions commit when a frame is written that +** contains a commit marker. A single WAL can and usually does record +** multiple transactions. Periodically, the content of the WAL is +** transferred back into the database file in an operation called a +** "checkpoint". +** +** A single WAL file can be used multiple times. In other words, the +** WAL can fill up with frames and then be checkpointed and then new +** frames can overwrite the old ones. A WAL always grows from beginning +** toward the end. Checksums and counters attached to each frame are +** used to determine which frames within the WAL are valid and which +** are leftovers from prior checkpoints. +** +** The WAL header is 32 bytes in size and consists of the following eight +** big-endian 32-bit unsigned integer values: +** +** 0: Magic number. 0x377f0682 or 0x377f0683 +** 4: File format version. Currently 3007000 +** 8: Database page size. Example: 1024 +** 12: Checkpoint sequence number +** 16: Salt-1, random integer incremented with each checkpoint +** 20: Salt-2, a different random integer changing with each ckpt +** 24: Checksum-1 (first part of checksum for first 24 bytes of header). +** 28: Checksum-2 (second part of checksum for first 24 bytes of header). +** +** Immediately following the wal-header are zero or more frames. Each +** frame consists of a 24-byte frame-header followed by a bytes +** of page data. The frame-header is six big-endian 32-bit unsigned +** integer values, as follows: +** +** 0: Page number. +** 4: For commit records, the size of the database image in pages +** after the commit. For all other records, zero. +** 8: Salt-1 (copied from the header) +** 12: Salt-2 (copied from the header) +** 16: Checksum-1. +** 20: Checksum-2. +** +** A frame is considered valid if and only if the following conditions are +** true: +** +** (1) The salt-1 and salt-2 values in the frame-header match +** salt values in the wal-header +** +** (2) The checksum values in the final 8 bytes of the frame-header +** exactly match the checksum computed consecutively on the +** WAL header and the first 8 bytes and the content of all frames +** up to and including the current frame. +** +** The checksum is computed using 32-bit big-endian integers if the +** magic number in the first 4 bytes of the WAL is 0x377f0683 and it +** is computed using little-endian if the magic number is 0x377f0682. +** The checksum values are always stored in the frame header in a +** big-endian format regardless of which byte order is used to compute +** the checksum. The checksum is computed by interpreting the input as +** an even number of unsigned 32-bit integers: x[0] through x[N]. The +** algorithm used for the checksum is as follows: +** +** for i from 0 to n-1 step 2: +** s0 += x[i] + s1; +** s1 += x[i+1] + s0; +** endfor +** +** Note that s0 and s1 are both weighted checksums using fibonacci weights +** in reverse order (the largest fibonacci weight occurs on the first element +** of the sequence being summed.) The s1 value spans all 32-bit +** terms of the sequence whereas s0 omits the final term. +** +** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the +** WAL is transferred into the database, then the database is VFS.xSync-ed. +** The VFS.xSync operations serve as write barriers - all writes launched +** before the xSync must complete before any write that launches after the +** xSync begins. +** +** After each checkpoint, the salt-1 value is incremented and the salt-2 +** value is randomized. This prevents old and new frames in the WAL from +** being considered valid at the same time and being checkpointing together +** following a crash. +** +** READER ALGORITHM +** +** To read a page from the database (call it page number P), a reader +** first checks the WAL to see if it contains page P. If so, then the +** last valid instance of page P that is a followed by a commit frame +** or is a commit frame itself becomes the value read. If the WAL +** contains no copies of page P that are valid and which are a commit +** frame or are followed by a commit frame, then page P is read from +** the database file. +** +** To start a read transaction, the reader records the index of the last +** valid frame in the WAL. The reader uses this recorded "mxFrame" value +** for all subsequent read operations. New transactions can be appended +** to the WAL, but as long as the reader uses its original mxFrame value +** and ignores the newly appended content, it will see a consistent snapshot +** of the database from a single point in time. This technique allows +** multiple concurrent readers to view different versions of the database +** content simultaneously. +** +** The reader algorithm in the previous paragraphs works correctly, but +** because frames for page P can appear anywhere within the WAL, the +** reader has to scan the entire WAL looking for page P frames. If the +** WAL is large (multiple megabytes is typical) that scan can be slow, +** and read performance suffers. To overcome this problem, a separate +** data structure called the wal-index is maintained to expedite the +** search for frames of a particular page. +** +** WAL-INDEX FORMAT +** +** Conceptually, the wal-index is shared memory, though VFS implementations +** might choose to implement the wal-index using a mmapped file. Because +** the wal-index is shared memory, SQLite does not support journal_mode=WAL +** on a network filesystem. All users of the database must be able to +** share memory. +** +** In the default unix and windows implementation, the wal-index is a mmapped +** file whose name is the database name with a "-shm" suffix added. For that +** reason, the wal-index is sometimes called the "shm" file. +** +** The wal-index is transient. After a crash, the wal-index can (and should +** be) reconstructed from the original WAL file. In fact, the VFS is required +** to either truncate or zero the header of the wal-index when the last +** connection to it closes. Because the wal-index is transient, it can +** use an architecture-specific format; it does not have to be cross-platform. +** Hence, unlike the database and WAL file formats which store all values +** as big endian, the wal-index can store multi-byte values in the native +** byte order of the host computer. +** +** The purpose of the wal-index is to answer this question quickly: Given +** a page number P and a maximum frame index M, return the index of the +** last frame in the wal before frame M for page P in the WAL, or return +** NULL if there are no frames for page P in the WAL prior to M. +** +** The wal-index consists of a header region, followed by an one or +** more index blocks. +** +** The wal-index header contains the total number of frames within the WAL +** in the mxFrame field. +** +** Each index block except for the first contains information on +** HASHTABLE_NPAGE frames. The first index block contains information on +** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and +** HASHTABLE_NPAGE are selected so that together the wal-index header and +** first index block are the same size as all other index blocks in the +** wal-index. The values are: +** +** HASHTABLE_NPAGE 4096 +** HASHTABLE_NPAGE_ONE 4062 +** +** Each index block contains two sections, a page-mapping that contains the +** database page number associated with each wal frame, and a hash-table +** that allows readers to query an index block for a specific page number. +** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE +** for the first index block) 32-bit page numbers. The first entry in the +** first index-block contains the database page number corresponding to the +** first frame in the WAL file. The first entry in the second index block +** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in +** the log, and so on. +** +** The last index block in a wal-index usually contains less than the full +** complement of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE) page-numbers, +** depending on the contents of the WAL file. This does not change the +** allocated size of the page-mapping array - the page-mapping array merely +** contains unused entries. +** +** Even without using the hash table, the last frame for page P +** can be found by scanning the page-mapping sections of each index block +** starting with the last index block and moving toward the first, and +** within each index block, starting at the end and moving toward the +** beginning. The first entry that equals P corresponds to the frame +** holding the content for that page. +** +** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers. +** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the +** hash table for each page number in the mapping section, so the hash +** table is never more than half full. The expected number of collisions +** prior to finding a match is 1. Each entry of the hash table is an +** 1-based index of an entry in the mapping section of the same +** index block. Let K be the 1-based index of the largest entry in +** the mapping section. (For index blocks other than the last, K will +** always be exactly HASHTABLE_NPAGE (4096) and for the last index block +** K will be (mxFrame%HASHTABLE_NPAGE).) Unused slots of the hash table +** contain a value of 0. +** +** To look for page P in the hash table, first compute a hash iKey on +** P as follows: +** +** iKey = (P * 383) % HASHTABLE_NSLOT +** +** Then start scanning entries of the hash table, starting with iKey +** (wrapping around to the beginning when the end of the hash table is +** reached) until an unused hash slot is found. Let the first unused slot +** be at index iUnused. (iUnused might be less than iKey if there was +** wrap-around.) Because the hash table is never more than half full, +** the search is guaranteed to eventually hit an unused entry. Let +** iMax be the value between iKey and iUnused, closest to iUnused, +** where aHash[iMax]==P. If there is no iMax entry (if there exists +** no hash slot such that aHash[i]==p) then page P is not in the +** current index block. Otherwise the iMax-th mapping entry of the +** current index block corresponds to the last entry that references +** page P. +** +** A hash search begins with the last index block and moves toward the +** first index block, looking for entries corresponding to page P. On +** average, only two or three slots in each index block need to be +** examined in order to either find the last entry for page P, or to +** establish that no such entry exists in the block. Each index block +** holds over 4000 entries. So two or three index blocks are sufficient +** to cover a typical 10 megabyte WAL file, assuming 1K pages. 8 or 10 +** comparisons (on average) suffice to either locate a frame in the +** WAL or to establish that the frame does not exist in the WAL. This +** is much faster than scanning the entire 10MB WAL. +** +** Note that entries are added in order of increasing K. Hence, one +** reader might be using some value K0 and a second reader that started +** at a later time (after additional transactions were added to the WAL +** and to the wal-index) might be using a different value K1, where K1>K0. +** Both readers can use the same hash table and mapping section to get +** the correct result. There may be entries in the hash table with +** K>K0 but to the first reader, those entries will appear to be unused +** slots in the hash table and so the first reader will get an answer as +** if no values greater than K0 had ever been inserted into the hash table +** in the first place - which is what reader one wants. Meanwhile, the +** second reader using K1 will see additional values that were inserted +** later, which is exactly what reader two wants. +** +** When a rollback occurs, the value of K is decreased. Hash table entries +** that correspond to frames greater than the new K value are removed +** from the hash table at this point. +*/ +#ifndef SQLITE_OMIT_WAL + +/* #include "wal.h" */ + +/* +** Trace output macros +*/ +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3WalTrace = 0; +# define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X +#else +# define WALTRACE(X) +#endif + +/* +** The maximum (and only) versions of the wal and wal-index formats +** that may be interpreted by this version of SQLite. +** +** If a client begins recovering a WAL file and finds that (a) the checksum +** values in the wal-header are correct and (b) the version field is not +** WAL_MAX_VERSION, recovery fails and SQLite returns SQLITE_CANTOPEN. +** +** Similarly, if a client successfully reads a wal-index header (i.e. the +** checksum test is successful) and finds that the version field is not +** WALINDEX_MAX_VERSION, then no read-transaction is opened and SQLite +** returns SQLITE_CANTOPEN. +*/ +#define WAL_MAX_VERSION 3007000 +#define WALINDEX_MAX_VERSION 3007000 + +/* +** Index numbers for various locking bytes. WAL_NREADER is the number +** of available reader locks and should be at least 3. The default +** is SQLITE_SHM_NLOCK==8 and WAL_NREADER==5. +** +** Technically, the various VFSes are free to implement these locks however +** they see fit. However, compatibility is encouraged so that VFSes can +** interoperate. The standard implemention used on both unix and windows +** is for the index number to indicate a byte offset into the +** WalCkptInfo.aLock[] array in the wal-index header. In other words, all +** locks are on the shm file. The WALINDEX_LOCK_OFFSET constant (which +** should be 120) is the location in the shm file for the first locking +** byte. +*/ +#define WAL_WRITE_LOCK 0 +#define WAL_ALL_BUT_WRITE 1 +#define WAL_CKPT_LOCK 1 +#define WAL_RECOVER_LOCK 2 +#define WAL_READ_LOCK(I) (3+(I)) +#define WAL_NREADER (SQLITE_SHM_NLOCK-3) + + +/* Object declarations */ +typedef struct WalIndexHdr WalIndexHdr; +typedef struct WalIterator WalIterator; +typedef struct WalCkptInfo WalCkptInfo; + + +/* +** The following object holds a copy of the wal-index header content. +** +** The actual header in the wal-index consists of two copies of this +** object followed by one instance of the WalCkptInfo object. +** For all versions of SQLite through 3.10.0 and probably beyond, +** the locking bytes (WalCkptInfo.aLock) start at offset 120 and +** the total header size is 136 bytes. +** +** The szPage value can be any power of 2 between 512 and 32768, inclusive. +** Or it can be 1 to represent a 65536-byte page. The latter case was +** added in 3.7.1 when support for 64K pages was added. +*/ +struct WalIndexHdr { + u32 iVersion; /* Wal-index version */ + u32 unused; /* Unused (padding) field */ + u32 iChange; /* Counter incremented each transaction */ + u8 isInit; /* 1 when initialized */ + u8 bigEndCksum; /* True if checksums in WAL are big-endian */ + u16 szPage; /* Database page size in bytes. 1==64K */ + u32 mxFrame; /* Index of last valid frame in the WAL */ + u32 nPage; /* Size of database in pages */ + u32 aFrameCksum[2]; /* Checksum of last frame in log */ + u32 aSalt[2]; /* Two salt values copied from WAL header */ + u32 aCksum[2]; /* Checksum over all prior fields */ +}; + +/* +** A copy of the following object occurs in the wal-index immediately +** following the second copy of the WalIndexHdr. This object stores +** information used by checkpoint. +** +** nBackfill is the number of frames in the WAL that have been written +** back into the database. (We call the act of moving content from WAL to +** database "backfilling".) The nBackfill number is never greater than +** WalIndexHdr.mxFrame. nBackfill can only be increased by threads +** holding the WAL_CKPT_LOCK lock (which includes a recovery thread). +** However, a WAL_WRITE_LOCK thread can move the value of nBackfill from +** mxFrame back to zero when the WAL is reset. +** +** nBackfillAttempted is the largest value of nBackfill that a checkpoint +** has attempted to achieve. Normally nBackfill==nBackfillAtempted, however +** the nBackfillAttempted is set before any backfilling is done and the +** nBackfill is only set after all backfilling completes. So if a checkpoint +** crashes, nBackfillAttempted might be larger than nBackfill. The +** WalIndexHdr.mxFrame must never be less than nBackfillAttempted. +** +** The aLock[] field is a set of bytes used for locking. These bytes should +** never be read or written. +** +** There is one entry in aReadMark[] for each reader lock. If a reader +** holds read-lock K, then the value in aReadMark[K] is no greater than +** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff) +** for any aReadMark[] means that entry is unused. aReadMark[0] is +** a special case; its value is never used and it exists as a place-holder +** to avoid having to offset aReadMark[] indexs by one. Readers holding +** WAL_READ_LOCK(0) always ignore the entire WAL and read all content +** directly from the database. +** +** The value of aReadMark[K] may only be changed by a thread that +** is holding an exclusive lock on WAL_READ_LOCK(K). Thus, the value of +** aReadMark[K] cannot changed while there is a reader is using that mark +** since the reader will be holding a shared lock on WAL_READ_LOCK(K). +** +** The checkpointer may only transfer frames from WAL to database where +** the frame numbers are less than or equal to every aReadMark[] that is +** in use (that is, every aReadMark[j] for which there is a corresponding +** WAL_READ_LOCK(j)). New readers (usually) pick the aReadMark[] with the +** largest value and will increase an unused aReadMark[] to mxFrame if there +** is not already an aReadMark[] equal to mxFrame. The exception to the +** previous sentence is when nBackfill equals mxFrame (meaning that everything +** in the WAL has been backfilled into the database) then new readers +** will choose aReadMark[0] which has value 0 and hence such reader will +** get all their all content directly from the database file and ignore +** the WAL. +** +** Writers normally append new frames to the end of the WAL. However, +** if nBackfill equals mxFrame (meaning that all WAL content has been +** written back into the database) and if no readers are using the WAL +** (in other words, if there are no WAL_READ_LOCK(i) where i>0) then +** the writer will first "reset" the WAL back to the beginning and start +** writing new content beginning at frame 1. +** +** We assume that 32-bit loads are atomic and so no locks are needed in +** order to read from any aReadMark[] entries. +*/ +struct WalCkptInfo { + u32 nBackfill; /* Number of WAL frames backfilled into DB */ + u32 aReadMark[WAL_NREADER]; /* Reader marks */ + u8 aLock[SQLITE_SHM_NLOCK]; /* Reserved space for locks */ + u32 nBackfillAttempted; /* WAL frames perhaps written, or maybe not */ + u32 notUsed0; /* Available for future enhancements */ +}; +#define READMARK_NOT_USED 0xffffffff + +/* +** This is a schematic view of the complete 136-byte header of the +** wal-index file (also known as the -shm file): +** +** +-----------------------------+ +** 0: | iVersion | \ +** +-----------------------------+ | +** 4: | (unused padding) | | +** +-----------------------------+ | +** 8: | iChange | | +** +-------+-------+-------------+ | +** 12: | bInit | bBig | szPage | | +** +-------+-------+-------------+ | +** 16: | mxFrame | | First copy of the +** +-----------------------------+ | WalIndexHdr object +** 20: | nPage | | +** +-----------------------------+ | +** 24: | aFrameCksum | | +** | | | +** +-----------------------------+ | +** 32: | aSalt | | +** | | | +** +-----------------------------+ | +** 40: | aCksum | | +** | | / +** +-----------------------------+ +** 48: | iVersion | \ +** +-----------------------------+ | +** 52: | (unused padding) | | +** +-----------------------------+ | +** 56: | iChange | | +** +-------+-------+-------------+ | +** 60: | bInit | bBig | szPage | | +** +-------+-------+-------------+ | Second copy of the +** 64: | mxFrame | | WalIndexHdr +** +-----------------------------+ | +** 68: | nPage | | +** +-----------------------------+ | +** 72: | aFrameCksum | | +** | | | +** +-----------------------------+ | +** 80: | aSalt | | +** | | | +** +-----------------------------+ | +** 88: | aCksum | | +** | | / +** +-----------------------------+ +** 96: | nBackfill | +** +-----------------------------+ +** 100: | 5 read marks | +** | | +** | | +** | | +** | | +** +-------+-------+------+------+ +** 120: | Write | Ckpt | Rcvr | Rd0 | \ +** +-------+-------+------+------+ ) 8 lock bytes +** | Read1 | Read2 | Rd3 | Rd4 | / +** +-------+-------+------+------+ +** 128: | nBackfillAttempted | +** +-----------------------------+ +** 132: | (unused padding) | +** +-----------------------------+ +*/ + +/* A block of WALINDEX_LOCK_RESERVED bytes beginning at +** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems +** only support mandatory file-locks, we do not read or write data +** from the region of the file on which locks are applied. +*/ +#define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2+offsetof(WalCkptInfo,aLock)) +#define WALINDEX_HDR_SIZE (sizeof(WalIndexHdr)*2+sizeof(WalCkptInfo)) + +/* Size of header before each frame in wal */ +#define WAL_FRAME_HDRSIZE 24 + +/* Size of write ahead log header, including checksum. */ +#define WAL_HDRSIZE 32 + +/* WAL magic value. Either this value, or the same value with the least +** significant bit also set (WAL_MAGIC | 0x00000001) is stored in 32-bit +** big-endian format in the first 4 bytes of a WAL file. +** +** If the LSB is set, then the checksums for each frame within the WAL +** file are calculated by treating all data as an array of 32-bit +** big-endian words. Otherwise, they are calculated by interpreting +** all data as 32-bit little-endian words. +*/ +#define WAL_MAGIC 0x377f0682 + +/* +** Return the offset of frame iFrame in the write-ahead log file, +** assuming a database page size of szPage bytes. The offset returned +** is to the start of the write-ahead log frame-header. +*/ +#define walFrameOffset(iFrame, szPage) ( \ + WAL_HDRSIZE + ((iFrame)-1)*(i64)((szPage)+WAL_FRAME_HDRSIZE) \ +) + +/* +** An open write-ahead log file is represented by an instance of the +** following object. +*/ +struct Wal { + sqlite3_vfs *pVfs; /* The VFS used to create pDbFd */ + sqlite3_file *pDbFd; /* File handle for the database file */ + sqlite3_file *pWalFd; /* File handle for WAL file */ + u32 iCallback; /* Value to pass to log callback (or 0) */ + i64 mxWalSize; /* Truncate WAL to this size upon reset */ + int nWiData; /* Size of array apWiData */ + int szFirstBlock; /* Size of first block written to WAL file */ + volatile u32 **apWiData; /* Pointer to wal-index content in memory */ + u32 szPage; /* Database page size */ + i16 readLock; /* Which read lock is being held. -1 for none */ + u8 syncFlags; /* Flags to use to sync header writes */ + u8 exclusiveMode; /* Non-zero if connection is in exclusive mode */ + u8 writeLock; /* True if in a write transaction */ + u8 ckptLock; /* True if holding a checkpoint lock */ + u8 readOnly; /* WAL_RDWR, WAL_RDONLY, or WAL_SHM_RDONLY */ + u8 truncateOnCommit; /* True to truncate WAL file on commit */ + u8 syncHeader; /* Fsync the WAL header if true */ + u8 padToSectorBoundary; /* Pad transactions out to the next sector */ + u8 bShmUnreliable; /* SHM content is read-only and unreliable */ + WalIndexHdr hdr; /* Wal-index header for current transaction */ + u32 minFrame; /* Ignore wal frames before this one */ + u32 iReCksum; /* On commit, recalculate checksums from here */ + const char *zWalName; /* Name of WAL file */ + u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ +#ifdef SQLITE_DEBUG + u8 lockError; /* True if a locking error has occurred */ +#endif +#ifdef SQLITE_ENABLE_SNAPSHOT + WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ +#endif +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + sqlite3 *db; +#endif +}; + +/* +** Candidate values for Wal.exclusiveMode. +*/ +#define WAL_NORMAL_MODE 0 +#define WAL_EXCLUSIVE_MODE 1 +#define WAL_HEAPMEMORY_MODE 2 + +/* +** Possible values for WAL.readOnly +*/ +#define WAL_RDWR 0 /* Normal read/write connection */ +#define WAL_RDONLY 1 /* The WAL file is readonly */ +#define WAL_SHM_RDONLY 2 /* The SHM file is readonly */ + +/* +** Each page of the wal-index mapping contains a hash-table made up of +** an array of HASHTABLE_NSLOT elements of the following type. +*/ +typedef u16 ht_slot; + +/* +** This structure is used to implement an iterator that loops through +** all frames in the WAL in database page order. Where two or more frames +** correspond to the same database page, the iterator visits only the +** frame most recently written to the WAL (in other words, the frame with +** the largest index). +** +** The internals of this structure are only accessed by: +** +** walIteratorInit() - Create a new iterator, +** walIteratorNext() - Step an iterator, +** walIteratorFree() - Free an iterator. +** +** This functionality is used by the checkpoint code (see walCheckpoint()). +*/ +struct WalIterator { + u32 iPrior; /* Last result returned from the iterator */ + int nSegment; /* Number of entries in aSegment[] */ + struct WalSegment { + int iNext; /* Next slot in aIndex[] not yet returned */ + ht_slot *aIndex; /* i0, i1, i2... such that aPgno[iN] ascend */ + u32 *aPgno; /* Array of page numbers. */ + int nEntry; /* Nr. of entries in aPgno[] and aIndex[] */ + int iZero; /* Frame number associated with aPgno[0] */ + } aSegment[1]; /* One for every 32KB page in the wal-index */ +}; + +/* +** Define the parameters of the hash tables in the wal-index file. There +** is a hash-table following every HASHTABLE_NPAGE page numbers in the +** wal-index. +** +** Changing any of these constants will alter the wal-index format and +** create incompatibilities. +*/ +#define HASHTABLE_NPAGE 4096 /* Must be power of 2 */ +#define HASHTABLE_HASH_1 383 /* Should be prime */ +#define HASHTABLE_NSLOT (HASHTABLE_NPAGE*2) /* Must be a power of 2 */ + +/* +** The block of page numbers associated with the first hash-table in a +** wal-index is smaller than usual. This is so that there is a complete +** hash-table on each aligned 32KB page of the wal-index. +*/ +#define HASHTABLE_NPAGE_ONE (HASHTABLE_NPAGE - (WALINDEX_HDR_SIZE/sizeof(u32))) + +/* The wal-index is divided into pages of WALINDEX_PGSZ bytes each. */ +#define WALINDEX_PGSZ ( \ + sizeof(ht_slot)*HASHTABLE_NSLOT + HASHTABLE_NPAGE*sizeof(u32) \ +) + +/* +** Obtain a pointer to the iPage'th page of the wal-index. The wal-index +** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are +** numbered from zero. +** +** If the wal-index is currently smaller the iPage pages then the size +** of the wal-index might be increased, but only if it is safe to do +** so. It is safe to enlarge the wal-index if pWal->writeLock is true +** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE. +** +** Three possible result scenarios: +** +** (1) rc==SQLITE_OK and *ppPage==Requested-Wal-Index-Page +** (2) rc>=SQLITE_ERROR and *ppPage==NULL +** (3) rc==SQLITE_OK and *ppPage==NULL // only if iPage==0 +** +** Scenario (3) can only occur when pWal->writeLock is false and iPage==0 +*/ +static SQLITE_NOINLINE int walIndexPageRealloc( + Wal *pWal, /* The WAL context */ + int iPage, /* The page we seek */ + volatile u32 **ppPage /* Write the page pointer here */ +){ + int rc = SQLITE_OK; + + /* Enlarge the pWal->apWiData[] array if required */ + if( pWal->nWiData<=iPage ){ + sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); + volatile u32 **apNew; + apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte); + if( !apNew ){ + *ppPage = 0; + return SQLITE_NOMEM_BKPT; + } + memset((void*)&apNew[pWal->nWiData], 0, + sizeof(u32*)*(iPage+1-pWal->nWiData)); + pWal->apWiData = apNew; + pWal->nWiData = iPage+1; + } + + /* Request a pointer to the required page from the VFS */ + assert( pWal->apWiData[iPage]==0 ); + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ + pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); + if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, + pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] + ); + assert( pWal->apWiData[iPage]!=0 + || rc!=SQLITE_OK + || (pWal->writeLock==0 && iPage==0) ); + testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK ); + if( rc==SQLITE_OK ){ + if( iPage>0 && sqlite3FaultSim(600) ) rc = SQLITE_NOMEM; + }else if( (rc&0xff)==SQLITE_READONLY ){ + pWal->readOnly |= WAL_SHM_RDONLY; + if( rc==SQLITE_READONLY ){ + rc = SQLITE_OK; + } + } + } + + *ppPage = pWal->apWiData[iPage]; + assert( iPage==0 || *ppPage || rc!=SQLITE_OK ); + return rc; +} +static int walIndexPage( + Wal *pWal, /* The WAL context */ + int iPage, /* The page we seek */ + volatile u32 **ppPage /* Write the page pointer here */ +){ + if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){ + return walIndexPageRealloc(pWal, iPage, ppPage); + } + return SQLITE_OK; +} + +/* +** Return a pointer to the WalCkptInfo structure in the wal-index. +*/ +static volatile WalCkptInfo *walCkptInfo(Wal *pWal){ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]); +} + +/* +** Return a pointer to the WalIndexHdr structure in the wal-index. +*/ +static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + return (volatile WalIndexHdr*)pWal->apWiData[0]; +} + +/* +** The argument to this macro must be of type u32. On a little-endian +** architecture, it returns the u32 value that results from interpreting +** the 4 bytes as a big-endian value. On a big-endian architecture, it +** returns the value that would be produced by interpreting the 4 bytes +** of the input value as a little-endian integer. +*/ +#define BYTESWAP32(x) ( \ + (((x)&0x000000FF)<<24) + (((x)&0x0000FF00)<<8) \ + + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \ +) + +/* +** Generate or extend an 8 byte checksum based on the data in +** array aByte[] and the initial values of aIn[0] and aIn[1] (or +** initial values of 0 and 0 if aIn==NULL). +** +** The checksum is written back into aOut[] before returning. +** +** nByte must be a positive multiple of 8. +*/ +static void walChecksumBytes( + int nativeCksum, /* True for native byte-order, false for non-native */ + u8 *a, /* Content to be checksummed */ + int nByte, /* Bytes of content in a[]. Must be a multiple of 8. */ + const u32 *aIn, /* Initial checksum value input */ + u32 *aOut /* OUT: Final checksum value output */ +){ + u32 s1, s2; + u32 *aData = (u32 *)a; + u32 *aEnd = (u32 *)&a[nByte]; + + if( aIn ){ + s1 = aIn[0]; + s2 = aIn[1]; + }else{ + s1 = s2 = 0; + } + + assert( nByte>=8 ); + assert( (nByte&0x00000007)==0 ); + assert( nByte<=65536 ); + + if( nativeCksum ){ + do { + s1 += *aData++ + s2; + s2 += *aData++ + s1; + }while( aDataexclusiveMode!=WAL_HEAPMEMORY_MODE ){ + sqlite3OsShmBarrier(pWal->pDbFd); + } +} + +/* +** Add the SQLITE_NO_TSAN as part of the return-type of a function +** definition as a hint that the function contains constructs that +** might give false-positive TSAN warnings. +** +** See tag-20200519-1. +*/ +#if defined(__clang__) && !defined(SQLITE_NO_TSAN) +# define SQLITE_NO_TSAN __attribute__((no_sanitize_thread)) +#else +# define SQLITE_NO_TSAN +#endif + +/* +** Write the header information in pWal->hdr into the wal-index. +** +** The checksum on pWal->hdr is updated before it is written. +*/ +static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ + volatile WalIndexHdr *aHdr = walIndexHdr(pWal); + const int nCksum = offsetof(WalIndexHdr, aCksum); + + assert( pWal->writeLock ); + pWal->hdr.isInit = 1; + pWal->hdr.iVersion = WALINDEX_MAX_VERSION; + walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); + /* Possible TSAN false-positive. See tag-20200519-1 */ + memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); + walShmBarrier(pWal); + memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); +} + +/* +** This function encodes a single frame header and writes it to a buffer +** supplied by the caller. A frame-header is made up of a series of +** 4-byte big-endian integers, as follows: +** +** 0: Page number. +** 4: For commit records, the size of the database image in pages +** after the commit. For all other records, zero. +** 8: Salt-1 (copied from the wal-header) +** 12: Salt-2 (copied from the wal-header) +** 16: Checksum-1. +** 20: Checksum-2. +*/ +static void walEncodeFrame( + Wal *pWal, /* The write-ahead log */ + u32 iPage, /* Database page number for frame */ + u32 nTruncate, /* New db size (or 0 for non-commit frames) */ + u8 *aData, /* Pointer to page data */ + u8 *aFrame /* OUT: Write encoded frame here */ +){ + int nativeCksum; /* True for native byte-order checksums */ + u32 *aCksum = pWal->hdr.aFrameCksum; + assert( WAL_FRAME_HDRSIZE==24 ); + sqlite3Put4byte(&aFrame[0], iPage); + sqlite3Put4byte(&aFrame[4], nTruncate); + if( pWal->iReCksum==0 ){ + memcpy(&aFrame[8], pWal->hdr.aSalt, 8); + + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + + sqlite3Put4byte(&aFrame[16], aCksum[0]); + sqlite3Put4byte(&aFrame[20], aCksum[1]); + }else{ + memset(&aFrame[8], 0, 16); + } +} + +/* +** Check to see if the frame with header in aFrame[] and content +** in aData[] is valid. If it is a valid frame, fill *piPage and +** *pnTruncate and return true. Return if the frame is not valid. +*/ +static int walDecodeFrame( + Wal *pWal, /* The write-ahead log */ + u32 *piPage, /* OUT: Database page number for frame */ + u32 *pnTruncate, /* OUT: New db size (or 0 if not commit) */ + u8 *aData, /* Pointer to page data (for checksum) */ + u8 *aFrame /* Frame data */ +){ + int nativeCksum; /* True for native byte-order checksums */ + u32 *aCksum = pWal->hdr.aFrameCksum; + u32 pgno; /* Page number of the frame */ + assert( WAL_FRAME_HDRSIZE==24 ); + + /* A frame is only valid if the salt values in the frame-header + ** match the salt values in the wal-header. + */ + if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){ + return 0; + } + + /* A frame is only valid if the page number is creater than zero. + */ + pgno = sqlite3Get4byte(&aFrame[0]); + if( pgno==0 ){ + return 0; + } + + /* A frame is only valid if a checksum of the WAL header, + ** all prior frams, the first 16 bytes of this frame-header, + ** and the frame-data matches the checksum in the last 8 + ** bytes of this frame-header. + */ + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + if( aCksum[0]!=sqlite3Get4byte(&aFrame[16]) + || aCksum[1]!=sqlite3Get4byte(&aFrame[20]) + ){ + /* Checksum failed. */ + return 0; + } + + /* If we reach this point, the frame is valid. Return the page number + ** and the new database size. + */ + *piPage = pgno; + *pnTruncate = sqlite3Get4byte(&aFrame[4]); + return 1; +} + + +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +/* +** Names of locks. This routine is used to provide debugging output and is not +** a part of an ordinary build. +*/ +static const char *walLockName(int lockIdx){ + if( lockIdx==WAL_WRITE_LOCK ){ + return "WRITE-LOCK"; + }else if( lockIdx==WAL_CKPT_LOCK ){ + return "CKPT-LOCK"; + }else if( lockIdx==WAL_RECOVER_LOCK ){ + return "RECOVER-LOCK"; + }else{ + static char zName[15]; + sqlite3_snprintf(sizeof(zName), zName, "READ-LOCK[%d]", + lockIdx-WAL_READ_LOCK(0)); + return zName; + } +} +#endif /*defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ + + +/* +** Set or release locks on the WAL. Locks are either shared or exclusive. +** A lock cannot be moved directly between shared and exclusive - it must go +** through the unlocked state first. +** +** In locking_mode=EXCLUSIVE, all of these routines become no-ops. +*/ +static int walLockShared(Wal *pWal, int lockIdx){ + int rc; + if( pWal->exclusiveMode ) return SQLITE_OK; + rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, + SQLITE_SHM_LOCK | SQLITE_SHM_SHARED); + WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, + walLockName(lockIdx), rc ? "failed" : "ok")); + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) + return rc; +} +static void walUnlockShared(Wal *pWal, int lockIdx){ + if( pWal->exclusiveMode ) return; + (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, + SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED); + WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx))); +} +static int walLockExclusive(Wal *pWal, int lockIdx, int n){ + int rc; + if( pWal->exclusiveMode ) return SQLITE_OK; + rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, + SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE); + WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, + walLockName(lockIdx), n, rc ? "failed" : "ok")); + VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) + return rc; +} +static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ + if( pWal->exclusiveMode ) return; + (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, + SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE); + WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal, + walLockName(lockIdx), n)); +} + +/* +** Compute a hash on a page number. The resulting hash value must land +** between 0 and (HASHTABLE_NSLOT-1). The walHashNext() function advances +** the hash to the next value in the event of a collision. +*/ +static int walHash(u32 iPage){ + assert( iPage>0 ); + assert( (HASHTABLE_NSLOT & (HASHTABLE_NSLOT-1))==0 ); + return (iPage*HASHTABLE_HASH_1) & (HASHTABLE_NSLOT-1); +} +static int walNextHash(int iPriorHash){ + return (iPriorHash+1)&(HASHTABLE_NSLOT-1); +} + +/* +** An instance of the WalHashLoc object is used to describe the location +** of a page hash table in the wal-index. This becomes the return value +** from walHashGet(). +*/ +typedef struct WalHashLoc WalHashLoc; +struct WalHashLoc { + volatile ht_slot *aHash; /* Start of the wal-index hash table */ + volatile u32 *aPgno; /* aPgno[1] is the page of first frame indexed */ + u32 iZero; /* One less than the frame number of first indexed*/ +}; + +/* +** Return pointers to the hash table and page number array stored on +** page iHash of the wal-index. The wal-index is broken into 32KB pages +** numbered starting from 0. +** +** Set output variable pLoc->aHash to point to the start of the hash table +** in the wal-index file. Set pLoc->iZero to one less than the frame +** number of the first frame indexed by this hash table. If a +** slot in the hash table is set to N, it refers to frame number +** (pLoc->iZero+N) in the log. +** +** Finally, set pLoc->aPgno so that pLoc->aPgno[0] is the page number of the +** first frame indexed by the hash table, frame (pLoc->iZero). +*/ +static int walHashGet( + Wal *pWal, /* WAL handle */ + int iHash, /* Find the iHash'th table */ + WalHashLoc *pLoc /* OUT: Hash table location */ +){ + int rc; /* Return code */ + + rc = walIndexPage(pWal, iHash, &pLoc->aPgno); + assert( rc==SQLITE_OK || iHash>0 ); + + if( pLoc->aPgno ){ + pLoc->aHash = (volatile ht_slot *)&pLoc->aPgno[HASHTABLE_NPAGE]; + if( iHash==0 ){ + pLoc->aPgno = &pLoc->aPgno[WALINDEX_HDR_SIZE/sizeof(u32)]; + pLoc->iZero = 0; + }else{ + pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; + } + }else if( NEVER(rc==SQLITE_OK) ){ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** Return the number of the wal-index page that contains the hash-table +** and page-number array that contain entries corresponding to WAL frame +** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages +** are numbered starting from 0. +*/ +static int walFramePage(u32 iFrame){ + int iHash = (iFrame+HASHTABLE_NPAGE-HASHTABLE_NPAGE_ONE-1) / HASHTABLE_NPAGE; + assert( (iHash==0 || iFrame>HASHTABLE_NPAGE_ONE) + && (iHash>=1 || iFrame<=HASHTABLE_NPAGE_ONE) + && (iHash<=1 || iFrame>(HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE)) + && (iHash>=2 || iFrame<=HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE) + && (iHash<=2 || iFrame>(HASHTABLE_NPAGE_ONE+2*HASHTABLE_NPAGE)) + ); + assert( iHash>=0 ); + return iHash; +} + +/* +** Return the page number associated with frame iFrame in this WAL. +*/ +static u32 walFramePgno(Wal *pWal, u32 iFrame){ + int iHash = walFramePage(iFrame); + if( iHash==0 ){ + return pWal->apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1]; + } + return pWal->apWiData[iHash][(iFrame-1-HASHTABLE_NPAGE_ONE)%HASHTABLE_NPAGE]; +} + +/* +** Remove entries from the hash table that point to WAL slots greater +** than pWal->hdr.mxFrame. +** +** This function is called whenever pWal->hdr.mxFrame is decreased due +** to a rollback or savepoint. +** +** At most only the hash table containing pWal->hdr.mxFrame needs to be +** updated. Any later hash tables will be automatically cleared when +** pWal->hdr.mxFrame advances to the point where those hash tables are +** actually needed. +*/ +static void walCleanupHash(Wal *pWal){ + WalHashLoc sLoc; /* Hash table location */ + int iLimit = 0; /* Zero values greater than this */ + int nByte; /* Number of bytes to zero in aPgno[] */ + int i; /* Used to iterate through aHash[] */ + + assert( pWal->writeLock ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE ); + testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE+1 ); + + if( pWal->hdr.mxFrame==0 ) return; + + /* Obtain pointers to the hash-table and page-number array containing + ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed + ** that the page said hash-table and array reside on is already mapped.(1) + */ + assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) ); + assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] ); + i = walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); + if( NEVER(i) ) return; /* Defense-in-depth, in case (1) above is wrong */ + + /* Zero all hash-table entries that correspond to frame numbers greater + ** than pWal->hdr.mxFrame. + */ + iLimit = pWal->hdr.mxFrame - sLoc.iZero; + assert( iLimit>0 ); + for(i=0; iiLimit ){ + sLoc.aHash[i] = 0; + } + } + + /* Zero the entries in the aPgno array that correspond to frames with + ** frame numbers greater than pWal->hdr.mxFrame. + */ + nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit]); + assert( nByte>=0 ); + memset((void *)&sLoc.aPgno[iLimit], 0, nByte); + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* Verify that the every entry in the mapping region is still reachable + ** via the hash table even after the cleanup. + */ + if( iLimit ){ + int j; /* Loop counter */ + int iKey; /* Hash key */ + for(j=0; j=0 ); + memset((void*)sLoc.aPgno, 0, nByte); + } + + /* If the entry in aPgno[] is already set, then the previous writer + ** must have exited unexpectedly in the middle of a transaction (after + ** writing one or more dirty pages to the WAL to free up memory). + ** Remove the remnants of that writers uncommitted transaction from + ** the hash-table before writing any new entries. + */ + if( sLoc.aPgno[idx-1] ){ + walCleanupHash(pWal); + assert( !sLoc.aPgno[idx-1] ); + } + + /* Write the aPgno[] array entry and the hash-table slot. */ + nCollide = idx; + for(iKey=walHash(iPage); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){ + if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; + } + sLoc.aPgno[idx-1] = iPage; + AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx); + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* Verify that the number of entries in the hash table exactly equals + ** the number of entries in the mapping region. + */ + { + int i; /* Loop counter */ + int nEntry = 0; /* Number of entries in the hash table */ + for(i=0; ickptLock==1 || pWal->ckptLock==0 ); + assert( WAL_ALL_BUT_WRITE==WAL_WRITE_LOCK+1 ); + assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE ); + assert( pWal->writeLock ); + iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock; + rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + if( rc ){ + return rc; + } + + WALTRACE(("WAL%p: recovery begin...\n", pWal)); + + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + + rc = sqlite3OsFileSize(pWal->pWalFd, &nSize); + if( rc!=SQLITE_OK ){ + goto recovery_error; + } + + if( nSize>WAL_HDRSIZE ){ + u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */ + u32 *aPrivate = 0; /* Heap copy of *-shm hash being populated */ + u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */ + int szFrame; /* Number of bytes in buffer aFrame[] */ + u8 *aData; /* Pointer to data part of aFrame buffer */ + int szPage; /* Page size according to the log */ + u32 magic; /* Magic value read from WAL header */ + u32 version; /* Magic value read from WAL header */ + int isValid; /* True if this frame is valid */ + u32 iPg; /* Current 32KB wal-index page */ + u32 iLastFrame; /* Last frame in wal, based on nSize alone */ + + /* Read in the WAL header. */ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); + if( rc!=SQLITE_OK ){ + goto recovery_error; + } + + /* If the database page size is not a power of two, or is greater than + ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid + ** data. Similarly, if the 'magic' value is invalid, ignore the whole + ** WAL file. + */ + magic = sqlite3Get4byte(&aBuf[0]); + szPage = sqlite3Get4byte(&aBuf[8]); + if( (magic&0xFFFFFFFE)!=WAL_MAGIC + || szPage&(szPage-1) + || szPage>SQLITE_MAX_PAGE_SIZE + || szPage<512 + ){ + goto finished; + } + pWal->hdr.bigEndCksum = (u8)(magic&0x00000001); + pWal->szPage = szPage; + pWal->nCkpt = sqlite3Get4byte(&aBuf[12]); + memcpy(&pWal->hdr.aSalt, &aBuf[16], 8); + + /* Verify that the WAL header checksum is correct */ + walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN, + aBuf, WAL_HDRSIZE-2*4, 0, pWal->hdr.aFrameCksum + ); + if( pWal->hdr.aFrameCksum[0]!=sqlite3Get4byte(&aBuf[24]) + || pWal->hdr.aFrameCksum[1]!=sqlite3Get4byte(&aBuf[28]) + ){ + goto finished; + } + + /* Verify that the version number on the WAL format is one that + ** are able to understand */ + version = sqlite3Get4byte(&aBuf[4]); + if( version!=WAL_MAX_VERSION ){ + rc = SQLITE_CANTOPEN_BKPT; + goto finished; + } + + /* Malloc a buffer to read frames into. */ + szFrame = szPage + WAL_FRAME_HDRSIZE; + aFrame = (u8 *)sqlite3_malloc64(szFrame + WALINDEX_PGSZ); + if( !aFrame ){ + rc = SQLITE_NOMEM_BKPT; + goto recovery_error; + } + aData = &aFrame[WAL_FRAME_HDRSIZE]; + aPrivate = (u32*)&aData[szPage]; + + /* Read all frames from the log file. */ + iLastFrame = (nSize - WAL_HDRSIZE) / szFrame; + for(iPg=0; iPg<=(u32)walFramePage(iLastFrame); iPg++){ + u32 *aShare; + u32 iFrame; /* Index of last frame read */ + u32 iLast = MIN(iLastFrame, HASHTABLE_NPAGE_ONE+iPg*HASHTABLE_NPAGE); + u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE); + u32 nHdr, nHdr32; + rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare); + assert( aShare!=0 || rc!=SQLITE_OK ); + if( aShare==0 ) break; + pWal->apWiData[iPg] = aPrivate; + + for(iFrame=iFirst; iFrame<=iLast; iFrame++){ + i64 iOffset = walFrameOffset(iFrame, szPage); + u32 pgno; /* Database page number for frame */ + u32 nTruncate; /* dbsize field from frame header */ + + /* Read and decode the next log frame. */ + rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); + if( rc!=SQLITE_OK ) break; + isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame); + if( !isValid ) break; + rc = walIndexAppend(pWal, iFrame, pgno); + if( NEVER(rc!=SQLITE_OK) ) break; + + /* If nTruncate is non-zero, this is a commit record. */ + if( nTruncate ){ + pWal->hdr.mxFrame = iFrame; + pWal->hdr.nPage = nTruncate; + pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + aFrameCksum[0] = pWal->hdr.aFrameCksum[0]; + aFrameCksum[1] = pWal->hdr.aFrameCksum[1]; + } + } + pWal->apWiData[iPg] = aShare; + nHdr = (iPg==0 ? WALINDEX_HDR_SIZE : 0); + nHdr32 = nHdr / sizeof(u32); +#ifndef SQLITE_SAFER_WALINDEX_RECOVERY + /* Memcpy() should work fine here, on all reasonable implementations. + ** Technically, memcpy() might change the destination to some + ** intermediate value before setting to the final value, and that might + ** cause a concurrent reader to malfunction. Memcpy() is allowed to + ** do that, according to the spec, but no memcpy() implementation that + ** we know of actually does that, which is why we say that memcpy() + ** is safe for this. Memcpy() is certainly a lot faster. + */ + memcpy(&aShare[nHdr32], &aPrivate[nHdr32], WALINDEX_PGSZ-nHdr); +#else + /* In the event that some platform is found for which memcpy() + ** changes the destination to some intermediate value before + ** setting the final value, this alternative copy routine is + ** provided. + */ + { + int i; + for(i=nHdr32; ihdr.aFrameCksum[0] = aFrameCksum[0]; + pWal->hdr.aFrameCksum[1] = aFrameCksum[1]; + walIndexWriteHdr(pWal); + + /* Reset the checkpoint-header. This is safe because this thread is + ** currently holding locks that exclude all other writers and + ** checkpointers. Then set the values of read-mark slots 1 through N. + */ + pInfo = walCkptInfo(pWal); + pInfo->nBackfill = 0; + pInfo->nBackfillAttempted = pWal->hdr.mxFrame; + pInfo->aReadMark[0] = 0; + for(i=1; ihdr.mxFrame ){ + pInfo->aReadMark[i] = pWal->hdr.mxFrame; + }else{ + pInfo->aReadMark[i] = READMARK_NOT_USED; + } + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + }else if( rc!=SQLITE_BUSY ){ + goto recovery_error; + } + } + + /* If more than one frame was recovered from the log file, report an + ** event via sqlite3_log(). This is to help with identifying performance + ** problems caused by applications routinely shutting down without + ** checkpointing the log file. + */ + if( pWal->hdr.nPage ){ + sqlite3_log(SQLITE_NOTICE_RECOVER_WAL, + "recovered %d frames from WAL file %s", + pWal->hdr.mxFrame, pWal->zWalName + ); + } + } + +recovery_error: + WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok")); + walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + return rc; +} + +/* +** Close an open wal-index. +*/ +static void walIndexClose(Wal *pWal, int isDelete){ + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE || pWal->bShmUnreliable ){ + int i; + for(i=0; inWiData; i++){ + sqlite3_free((void *)pWal->apWiData[i]); + pWal->apWiData[i] = 0; + } + } + if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ + sqlite3OsShmUnmap(pWal->pDbFd, isDelete); + } +} + +/* +** Open a connection to the WAL file zWalName. The database file must +** already be opened on connection pDbFd. The buffer that zWalName points +** to must remain valid for the lifetime of the returned Wal* handle. +** +** A SHARED lock should be held on the database file when this function +** is called. The purpose of this SHARED lock is to prevent any other +** client from unlinking the WAL or wal-index file. If another process +** were to do this just after this client opened one of these files, the +** system would be badly broken. +** +** If the log file is successfully opened, SQLITE_OK is returned and +** *ppWal is set to point to a new WAL handle. If an error occurs, +** an SQLite error code is returned and *ppWal is left unmodified. +*/ +SQLITE_PRIVATE int sqlite3WalOpen( + sqlite3_vfs *pVfs, /* vfs module to open wal and wal-index */ + sqlite3_file *pDbFd, /* The open database file */ + const char *zWalName, /* Name of the WAL file */ + int bNoShm, /* True to run in heap-memory mode */ + i64 mxWalSize, /* Truncate WAL to this size on reset */ + Wal **ppWal /* OUT: Allocated Wal handle */ +){ + int rc; /* Return Code */ + Wal *pRet; /* Object to allocate and return */ + int flags; /* Flags passed to OsOpen() */ + + assert( zWalName && zWalName[0] ); + assert( pDbFd ); + + /* Verify the values of various constants. Any changes to the values + ** of these constants would result in an incompatible on-disk format + ** for the -shm file. Any change that causes one of these asserts to + ** fail is a backward compatibility problem, even if the change otherwise + ** works. + ** + ** This table also serves as a helpful cross-reference when trying to + ** interpret hex dumps of the -shm file. + */ + assert( 48 == sizeof(WalIndexHdr) ); + assert( 40 == sizeof(WalCkptInfo) ); + assert( 120 == WALINDEX_LOCK_OFFSET ); + assert( 136 == WALINDEX_HDR_SIZE ); + assert( 4096 == HASHTABLE_NPAGE ); + assert( 4062 == HASHTABLE_NPAGE_ONE ); + assert( 8192 == HASHTABLE_NSLOT ); + assert( 383 == HASHTABLE_HASH_1 ); + assert( 32768 == WALINDEX_PGSZ ); + assert( 8 == SQLITE_SHM_NLOCK ); + assert( 5 == WAL_NREADER ); + assert( 24 == WAL_FRAME_HDRSIZE ); + assert( 32 == WAL_HDRSIZE ); + assert( 120 == WALINDEX_LOCK_OFFSET + WAL_WRITE_LOCK ); + assert( 121 == WALINDEX_LOCK_OFFSET + WAL_CKPT_LOCK ); + assert( 122 == WALINDEX_LOCK_OFFSET + WAL_RECOVER_LOCK ); + assert( 123 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(0) ); + assert( 124 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(1) ); + assert( 125 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(2) ); + assert( 126 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(3) ); + assert( 127 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(4) ); + + /* In the amalgamation, the os_unix.c and os_win.c source files come before + ** this source file. Verify that the #defines of the locking byte offsets + ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value. + ** For that matter, if the lock offset ever changes from its initial design + ** value of 120, we need to know that so there is an assert() to check it. + */ +#ifdef WIN_SHM_BASE + assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET ); +#endif +#ifdef UNIX_SHM_BASE + assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET ); +#endif + + + /* Allocate an instance of struct Wal to return. */ + *ppWal = 0; + pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile); + if( !pRet ){ + return SQLITE_NOMEM_BKPT; + } + + pRet->pVfs = pVfs; + pRet->pWalFd = (sqlite3_file *)&pRet[1]; + pRet->pDbFd = pDbFd; + pRet->readLock = -1; + pRet->mxWalSize = mxWalSize; + pRet->zWalName = zWalName; + pRet->syncHeader = 1; + pRet->padToSectorBoundary = 1; + pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); + + /* Open file handle on the write-ahead log file. */ + flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL); + rc = sqlite3OsOpen(pVfs, zWalName, pRet->pWalFd, flags, &flags); + if( rc==SQLITE_OK && flags&SQLITE_OPEN_READONLY ){ + pRet->readOnly = WAL_RDONLY; + } + + if( rc!=SQLITE_OK ){ + walIndexClose(pRet, 0); + sqlite3OsClose(pRet->pWalFd); + sqlite3_free(pRet); + }else{ + int iDC = sqlite3OsDeviceCharacteristics(pDbFd); + if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; } + if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){ + pRet->padToSectorBoundary = 0; + } + *ppWal = pRet; + WALTRACE(("WAL%d: opened\n", pRet)); + } + return rc; +} + +/* +** Change the size to which the WAL file is trucated on each reset. +*/ +SQLITE_PRIVATE void sqlite3WalLimit(Wal *pWal, i64 iLimit){ + if( pWal ) pWal->mxWalSize = iLimit; +} + +/* +** Find the smallest page number out of all pages held in the WAL that +** has not been returned by any prior invocation of this method on the +** same WalIterator object. Write into *piFrame the frame index where +** that page was last written into the WAL. Write into *piPage the page +** number. +** +** Return 0 on success. If there are no pages in the WAL with a page +** number larger than *piPage, then return 1. +*/ +static int walIteratorNext( + WalIterator *p, /* Iterator */ + u32 *piPage, /* OUT: The page number of the next page */ + u32 *piFrame /* OUT: Wal frame index of next page */ +){ + u32 iMin; /* Result pgno must be greater than iMin */ + u32 iRet = 0xFFFFFFFF; /* 0xffffffff is never a valid page number */ + int i; /* For looping through segments */ + + iMin = p->iPrior; + assert( iMin<0xffffffff ); + for(i=p->nSegment-1; i>=0; i--){ + struct WalSegment *pSegment = &p->aSegment[i]; + while( pSegment->iNextnEntry ){ + u32 iPg = pSegment->aPgno[pSegment->aIndex[pSegment->iNext]]; + if( iPg>iMin ){ + if( iPgiZero + pSegment->aIndex[pSegment->iNext]; + } + break; + } + pSegment->iNext++; + } + } + + *piPage = p->iPrior = iRet; + return (iRet==0xFFFFFFFF); +} + +/* +** This function merges two sorted lists into a single sorted list. +** +** aLeft[] and aRight[] are arrays of indices. The sort key is +** aContent[aLeft[]] and aContent[aRight[]]. Upon entry, the following +** is guaranteed for all J0 && nRight>0 ); + while( iRight=nRight || aContent[aLeft[iLeft]]=nLeft || aContent[aLeft[iLeft]]>dbpage ); + assert( iRight>=nRight || aContent[aRight[iRight]]>dbpage ); + } + + *paRight = aLeft; + *pnRight = iOut; + memcpy(aLeft, aTmp, sizeof(aTmp[0])*iOut); +} + +/* +** Sort the elements in list aList using aContent[] as the sort key. +** Remove elements with duplicate keys, preferring to keep the +** larger aList[] values. +** +** The aList[] entries are indices into aContent[]. The values in +** aList[] are to be sorted so that for all J0 ); + assert( HASHTABLE_NPAGE==(1<<(ArraySize(aSub)-1)) ); + + for(iList=0; iListaList && p->nList<=(1<aList==&aList[iList&~((2<aList, p->nList, &aMerge, &nMerge, aBuffer); + } + aSub[iSub].aList = aMerge; + aSub[iSub].nList = nMerge; + } + + for(iSub++; iSubnList<=(1<aList==&aList[nList&~((2<aList, p->nList, &aMerge, &nMerge, aBuffer); + } + } + assert( aMerge==aList ); + *pnList = nMerge; + +#ifdef SQLITE_DEBUG + { + int i; + for(i=1; i<*pnList; i++){ + assert( aContent[aList[i]] > aContent[aList[i-1]] ); + } + } +#endif +} + +/* +** Free an iterator allocated by walIteratorInit(). +*/ +static void walIteratorFree(WalIterator *p){ + sqlite3_free(p); +} + +/* +** Construct a WalInterator object that can be used to loop over all +** pages in the WAL following frame nBackfill in ascending order. Frames +** nBackfill or earlier may be included - excluding them is an optimization +** only. The caller must hold the checkpoint lock. +** +** On success, make *pp point to the newly allocated WalInterator object +** return SQLITE_OK. Otherwise, return an error code. If this routine +** returns an error, the value of *pp is undefined. +** +** The calling routine should invoke walIteratorFree() to destroy the +** WalIterator object when it has finished with it. +*/ +static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ + WalIterator *p; /* Return value */ + int nSegment; /* Number of segments to merge */ + u32 iLast; /* Last frame in log */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ + int i; /* Iterator variable */ + ht_slot *aTmp; /* Temp space used by merge-sort */ + int rc = SQLITE_OK; /* Return Code */ + + /* This routine only runs while holding the checkpoint lock. And + ** it only runs if there is actually content in the log (mxFrame>0). + */ + assert( pWal->ckptLock && pWal->hdr.mxFrame>0 ); + iLast = pWal->hdr.mxFrame; + + /* Allocate space for the WalIterator object. */ + nSegment = walFramePage(iLast) + 1; + nByte = sizeof(WalIterator) + + (nSegment-1)*sizeof(struct WalSegment) + + iLast*sizeof(ht_slot); + p = (WalIterator *)sqlite3_malloc64(nByte); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + memset(p, 0, nByte); + p->nSegment = nSegment; + + /* Allocate temporary space used by the merge-sort routine. This block + ** of memory will be freed before this function returns. + */ + aTmp = (ht_slot *)sqlite3_malloc64( + sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) + ); + if( !aTmp ){ + rc = SQLITE_NOMEM_BKPT; + } + + for(i=walFramePage(nBackfill+1); rc==SQLITE_OK && iaSegment[p->nSegment])[sLoc.iZero]; + sLoc.iZero++; + + for(j=0; jaSegment[i].iZero = sLoc.iZero; + p->aSegment[i].nEntry = nEntry; + p->aSegment[i].aIndex = aIndex; + p->aSegment[i].aPgno = (u32 *)sLoc.aPgno; + } + } + sqlite3_free(aTmp); + + if( rc!=SQLITE_OK ){ + walIteratorFree(p); + p = 0; + } + *pp = p; + return rc; +} + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Attempt to enable blocking locks. Blocking locks are enabled only if (a) +** they are supported by the VFS, and (b) the database handle is configured +** with a busy-timeout. Return 1 if blocking locks are successfully enabled, +** or 0 otherwise. +*/ +static int walEnableBlocking(Wal *pWal){ + int res = 0; + if( pWal->db ){ + int tmout = pWal->db->busyTimeout; + if( tmout ){ + int rc; + rc = sqlite3OsFileControl( + pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout + ); + res = (rc==SQLITE_OK); + } + } + return res; +} + +/* +** Disable blocking locks. +*/ +static void walDisableBlocking(Wal *pWal){ + int tmout = 0; + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); +} + +/* +** If parameter bLock is true, attempt to enable blocking locks, take +** the WRITER lock, and then disable blocking locks. If blocking locks +** cannot be enabled, no attempt to obtain the WRITER lock is made. Return +** an SQLite error code if an error occurs, or SQLITE_OK otherwise. It is not +** an error if blocking locks can not be enabled. +** +** If the bLock parameter is false and the WRITER lock is held, release it. +*/ +SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock){ + int rc = SQLITE_OK; + assert( pWal->readLock<0 || bLock==0 ); + if( bLock ){ + assert( pWal->db ); + if( walEnableBlocking(pWal) ){ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + } + walDisableBlocking(pWal); + } + }else if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + } + return rc; +} + +/* +** Set the database handle used to determine if blocking locks are required. +*/ +SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db){ + pWal->db = db; +} + +/* +** Take an exclusive WRITE lock. Blocking if so configured. +*/ +static int walLockWriter(Wal *pWal){ + int rc; + walEnableBlocking(pWal); + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + walDisableBlocking(pWal); + return rc; +} +#else +# define walEnableBlocking(x) 0 +# define walDisableBlocking(x) +# define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) +# define sqlite3WalDb(pWal, db) +#endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ + + +/* +** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and +** n. If the attempt fails and parameter xBusy is not NULL, then it is a +** busy-handler function. Invoke it and retry the lock until either the +** lock is successfully obtained or the busy-handler returns 0. +*/ +static int walBusyLock( + Wal *pWal, /* WAL connection */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int lockIdx, /* Offset of first byte to lock */ + int n /* Number of bytes to lock */ +){ + int rc; + do { + rc = walLockExclusive(pWal, lockIdx, n); + }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) ); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ){ + walDisableBlocking(pWal); + rc = SQLITE_BUSY; + } +#endif + return rc; +} + +/* +** The cache of the wal-index header must be valid to call this function. +** Return the page-size in bytes used by the database. +*/ +static int walPagesize(Wal *pWal){ + return (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); +} + +/* +** The following is guaranteed when this function is called: +** +** a) the WRITER lock is held, +** b) the entire log file has been checkpointed, and +** c) any existing readers are reading exclusively from the database +** file - there are no readers that may attempt to read a frame from +** the log file. +** +** This function updates the shared-memory structures so that the next +** client to write to the database (which may be this one) does so by +** writing frames into the start of the log file. +** +** The value of parameter salt1 is used as the aSalt[1] value in the +** new wal-index header. It should be passed a pseudo-random value (i.e. +** one obtained from sqlite3_randomness()). +*/ +static void walRestartHdr(Wal *pWal, u32 salt1){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int i; /* Loop counter */ + u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ + pWal->nCkpt++; + pWal->hdr.mxFrame = 0; + sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); + memcpy(&pWal->hdr.aSalt[1], &salt1, 4); + walIndexWriteHdr(pWal); + AtomicStore(&pInfo->nBackfill, 0); + pInfo->nBackfillAttempted = 0; + pInfo->aReadMark[1] = 0; + for(i=2; iaReadMark[i] = READMARK_NOT_USED; + assert( pInfo->aReadMark[0]==0 ); +} + +/* +** Copy as much content as we can from the WAL back into the database file +** in response to an sqlite3_wal_checkpoint() request or the equivalent. +** +** The amount of information copies from WAL to database might be limited +** by active readers. This routine will never overwrite a database page +** that a concurrent reader might be using. +** +** All I/O barrier operations (a.k.a fsyncs) occur in this routine when +** SQLite is in WAL-mode in synchronous=NORMAL. That means that if +** checkpoints are always run by a background thread or background +** process, foreground threads will never block on a lengthy fsync call. +** +** Fsync is called on the WAL before writing content out of the WAL and +** into the database. This ensures that if the new content is persistent +** in the WAL and can be recovered following a power-loss or hard reset. +** +** Fsync is also called on the database file if (and only if) the entire +** WAL content is copied into the database file. This second fsync makes +** it safe to delete the WAL since the new content will persist in the +** database file. +** +** This routine uses and updates the nBackfill field of the wal-index header. +** This is the only routine that will increase the value of nBackfill. +** (A WAL reset or recovery will revert nBackfill to zero, but not increase +** its value.) +** +** The caller must be holding sufficient locks to ensure that no other +** checkpoint is running (in any other thread or process) at the same +** time. +*/ +static int walCheckpoint( + Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check for interrupts on this handle */ + int eMode, /* One of PASSIVE, FULL or RESTART */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags for OsSync() (or 0) */ + u8 *zBuf /* Temporary buffer to use */ +){ + int rc = SQLITE_OK; /* Return code */ + int szPage; /* Database page-size */ + WalIterator *pIter = 0; /* Wal iterator context */ + u32 iDbpage = 0; /* Next database page to write */ + u32 iFrame = 0; /* Wal frame containing data for iDbpage */ + u32 mxSafeFrame; /* Max frame that can be backfilled */ + u32 mxPage; /* Max database page to write */ + int i; /* Loop counter */ + volatile WalCkptInfo *pInfo; /* The checkpoint status information */ + + szPage = walPagesize(pWal); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + pInfo = walCkptInfo(pWal); + if( pInfo->nBackfillhdr.mxFrame ){ + + /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked + ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ + assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + + /* Compute in mxSafeFrame the index of the last frame of the WAL that is + ** safe to write into the database. Frames beyond mxSafeFrame might + ** overwrite database pages that are in use by active readers and thus + ** cannot be backfilled from the WAL. + */ + mxSafeFrame = pWal->hdr.mxFrame; + mxPage = pWal->hdr.nPage; + for(i=1; iaReadMark+i); + if( mxSafeFrame>y ){ + assert( y<=pWal->hdr.mxFrame ); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); + if( rc==SQLITE_OK ){ + u32 iMark = (i==1 ? mxSafeFrame : READMARK_NOT_USED); + AtomicStore(pInfo->aReadMark+i, iMark); + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + }else if( rc==SQLITE_BUSY ){ + mxSafeFrame = y; + xBusy = 0; + }else{ + goto walcheckpoint_out; + } + } + } + + /* Allocate the iterator */ + if( pInfo->nBackfillnBackfill, &pIter); + assert( rc==SQLITE_OK || pIter==0 ); + } + + if( pIter + && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK + ){ + u32 nBackfill = pInfo->nBackfill; + + pInfo->nBackfillAttempted = mxSafeFrame; + + /* Sync the WAL to disk */ + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); + + /* If the database may grow as a result of this checkpoint, hint + ** about the eventual size of the db file to the VFS layer. + */ + if( rc==SQLITE_OK ){ + i64 nReq = ((i64)mxPage * szPage); + i64 nSize; /* Current size of database file */ + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); + rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); + if( rc==SQLITE_OK && nSizehdr.mxFrame*szPage)pDbFd, SQLITE_FCNTL_SIZE_HINT,&nReq); + } + } + + } + + /* Iterate through the contents of the WAL, copying data to the db file */ + while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ + i64 iOffset; + assert( walFramePgno(pWal, iFrame)==iDbpage ); + if( AtomicLoad(&db->u1.isInterrupted) ){ + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + break; + } + if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ + continue; + } + iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */ + rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + iOffset = (iDbpage-1)*(i64)szPage; + testcase( IS_BIG_INT(iOffset) ); + rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); + if( rc!=SQLITE_OK ) break; + } + sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); + + /* If work was actually accomplished... */ + if( rc==SQLITE_OK ){ + if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ + i64 szDb = pWal->hdr.nPage*(i64)szPage; + testcase( IS_BIG_INT(szDb) ); + rc = sqlite3OsTruncate(pWal->pDbFd, szDb); + if( rc==SQLITE_OK ){ + rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); + } + } + if( rc==SQLITE_OK ){ + AtomicStore(&pInfo->nBackfill, mxSafeFrame); + } + } + + /* Release the reader lock held while backfilling */ + walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1); + } + + if( rc==SQLITE_BUSY ){ + /* Reset the return code so as not to report a checkpoint failure + ** just because there are active readers. */ + rc = SQLITE_OK; + } + } + + /* If this is an SQLITE_CHECKPOINT_RESTART or TRUNCATE operation, and the + ** entire wal file has been copied into the database file, then block + ** until all readers have finished using the wal file. This ensures that + ** the next process to write to the database restarts the wal file. + */ + if( rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + assert( pWal->writeLock ); + if( pInfo->nBackfillhdr.mxFrame ){ + rc = SQLITE_BUSY; + }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ + u32 salt1; + sqlite3_randomness(4, &salt1); + assert( pInfo->nBackfill==pWal->hdr.mxFrame ); + rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc==SQLITE_OK ){ + if( eMode==SQLITE_CHECKPOINT_TRUNCATE ){ + /* IMPLEMENTATION-OF: R-44699-57140 This mode works the same way as + ** SQLITE_CHECKPOINT_RESTART with the addition that it also + ** truncates the log file to zero bytes just prior to a + ** successful return. + ** + ** In theory, it might be safe to do this without updating the + ** wal-index header in shared memory, as all subsequent reader or + ** writer clients should see that the entire log file has been + ** checkpointed and behave accordingly. This seems unsafe though, + ** as it would leave the system in a state where the contents of + ** the wal-index header do not match the contents of the + ** file-system. To avoid this, update the wal-index header to + ** indicate that the log file contains zero valid frames. */ + walRestartHdr(pWal, salt1); + rc = sqlite3OsTruncate(pWal->pWalFd, 0); + } + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + } + } + } + + walcheckpoint_out: + walIteratorFree(pIter); + return rc; +} + +/* +** If the WAL file is currently larger than nMax bytes in size, truncate +** it to exactly nMax bytes. If an error occurs while doing so, ignore it. +*/ +static void walLimitSize(Wal *pWal, i64 nMax){ + i64 sz; + int rx; + sqlite3BeginBenignMalloc(); + rx = sqlite3OsFileSize(pWal->pWalFd, &sz); + if( rx==SQLITE_OK && (sz > nMax ) ){ + rx = sqlite3OsTruncate(pWal->pWalFd, nMax); + } + sqlite3EndBenignMalloc(); + if( rx ){ + sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); + } +} + +/* +** Close a connection to a log file. +*/ +SQLITE_PRIVATE int sqlite3WalClose( + Wal *pWal, /* Wal to close */ + sqlite3 *db, /* For interrupt flag */ + int sync_flags, /* Flags to pass to OsSync() (or 0) */ + int nBuf, + u8 *zBuf /* Buffer of at least nBuf bytes */ +){ + int rc = SQLITE_OK; + if( pWal ){ + int isDelete = 0; /* True to unlink wal and wal-index files */ + + /* If an EXCLUSIVE lock can be obtained on the database file (using the + ** ordinary, rollback-mode locking methods, this guarantees that the + ** connection associated with this log file is the only connection to + ** the database. In this case checkpoint the database and unlink both + ** the wal and wal-index files. + ** + ** The EXCLUSIVE lock is not released before returning. + */ + if( zBuf!=0 + && SQLITE_OK==(rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE)) + ){ + if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + } + rc = sqlite3WalCheckpoint(pWal, db, + SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 + ); + if( rc==SQLITE_OK ){ + int bPersist = -1; + sqlite3OsFileControlHint( + pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersist + ); + if( bPersist!=1 ){ + /* Try to delete the WAL file if the checkpoint completed and + ** fsyned (rc==SQLITE_OK) and if we are not in persistent-wal + ** mode (!bPersist) */ + isDelete = 1; + }else if( pWal->mxWalSize>=0 ){ + /* Try to truncate the WAL file to zero bytes if the checkpoint + ** completed and fsynced (rc==SQLITE_OK) and we are in persistent + ** WAL mode (bPersist) and if the PRAGMA journal_size_limit is a + ** non-negative value (pWal->mxWalSize>=0). Note that we truncate + ** to zero bytes as truncating to the journal_size_limit might + ** leave a corrupt WAL file on disk. */ + walLimitSize(pWal, 0); + } + } + } + + walIndexClose(pWal, isDelete); + sqlite3OsClose(pWal->pWalFd); + if( isDelete ){ + sqlite3BeginBenignMalloc(); + sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0); + sqlite3EndBenignMalloc(); + } + WALTRACE(("WAL%p: closed\n", pWal)); + sqlite3_free((void *)pWal->apWiData); + sqlite3_free(pWal); + } + return rc; +} + +/* +** Try to read the wal-index header. Return 0 on success and 1 if +** there is a problem. +** +** The wal-index is in shared memory. Another thread or process might +** be writing the header at the same time this procedure is trying to +** read it, which might result in inconsistency. A dirty read is detected +** by verifying that both copies of the header are the same and also by +** a checksum on the header. +** +** If and only if the read is consistent and the header is different from +** pWal->hdr, then pWal->hdr is updated to the content of the new header +** and *pChanged is set to 1. +** +** If the checksum cannot be verified return non-zero. If the header +** is read successfully and the checksum verified, return zero. +*/ +static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ + u32 aCksum[2]; /* Checksum on the header content */ + WalIndexHdr h1, h2; /* Two copies of the header content */ + WalIndexHdr volatile *aHdr; /* Header in shared memory */ + + /* The first page of the wal-index must be mapped at this point. */ + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + + /* Read the header. This might happen concurrently with a write to the + ** same area of shared memory on a different CPU in a SMP, + ** meaning it is possible that an inconsistent snapshot is read + ** from the file. If this happens, return non-zero. + ** + ** tag-20200519-1: + ** There are two copies of the header at the beginning of the wal-index. + ** When reading, read [0] first then [1]. Writes are in the reverse order. + ** Memory barriers are used to prevent the compiler or the hardware from + ** reordering the reads and writes. TSAN and similar tools can sometimes + ** give false-positive warnings about these accesses because the tools do not + ** account for the double-read and the memory barrier. The use of mutexes + ** here would be problematic as the memory being accessed is potentially + ** shared among multiple processes and not all mutex implementions work + ** reliably in that environment. + */ + aHdr = walIndexHdr(pWal); + memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); /* Possible TSAN false-positive */ + walShmBarrier(pWal); + memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); + + if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ + return 1; /* Dirty read */ + } + if( h1.isInit==0 ){ + return 1; /* Malformed header - probably all zeros */ + } + walChecksumBytes(1, (u8*)&h1, sizeof(h1)-sizeof(h1.aCksum), 0, aCksum); + if( aCksum[0]!=h1.aCksum[0] || aCksum[1]!=h1.aCksum[1] ){ + return 1; /* Checksum does not match */ + } + + if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){ + *pChanged = 1; + memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr)); + pWal->szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); + testcase( pWal->szPage<=32768 ); + testcase( pWal->szPage>=65536 ); + } + + /* The header was successfully read. Return zero. */ + return 0; +} + +/* +** This is the value that walTryBeginRead returns when it needs to +** be retried. +*/ +#define WAL_RETRY (-1) + +/* +** Read the wal-index header from the wal-index and into pWal->hdr. +** If the wal-header appears to be corrupt, try to reconstruct the +** wal-index from the WAL before returning. +** +** Set *pChanged to 1 if the wal-index header value in pWal->hdr is +** changed by this operation. If pWal->hdr is unchanged, set *pChanged +** to 0. +** +** If the wal-index header is successfully read, return SQLITE_OK. +** Otherwise an SQLite error code. +*/ +static int walIndexReadHdr(Wal *pWal, int *pChanged){ + int rc; /* Return code */ + int badHdr; /* True if a header read failed */ + volatile u32 *page0; /* Chunk of wal-index containing header */ + + /* Ensure that page 0 of the wal-index (the page that contains the + ** wal-index header) is mapped. Return early if an error occurs here. + */ + assert( pChanged ); + rc = walIndexPage(pWal, 0, &page0); + if( rc!=SQLITE_OK ){ + assert( rc!=SQLITE_READONLY ); /* READONLY changed to OK in walIndexPage */ + if( rc==SQLITE_READONLY_CANTINIT ){ + /* The SQLITE_READONLY_CANTINIT return means that the shared-memory + ** was openable but is not writable, and this thread is unable to + ** confirm that another write-capable connection has the shared-memory + ** open, and hence the content of the shared-memory is unreliable, + ** since the shared-memory might be inconsistent with the WAL file + ** and there is no writer on hand to fix it. */ + assert( page0==0 ); + assert( pWal->writeLock==0 ); + assert( pWal->readOnly & WAL_SHM_RDONLY ); + pWal->bShmUnreliable = 1; + pWal->exclusiveMode = WAL_HEAPMEMORY_MODE; + *pChanged = 1; + }else{ + return rc; /* Any other non-OK return is just an error */ + } + }else{ + /* page0 can be NULL if the SHM is zero bytes in size and pWal->writeLock + ** is zero, which prevents the SHM from growing */ + testcase( page0!=0 ); + } + assert( page0!=0 || pWal->writeLock==0 ); + + /* If the first page of the wal-index has been mapped, try to read the + ** wal-index header immediately, without holding any lock. This usually + ** works, but may fail if the wal-index header is corrupt or currently + ** being modified by another thread or process. + */ + badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); + + /* If the first attempt failed, it might have been due to a race + ** with a writer. So get a WRITE lock and try again. + */ + if( badHdr ){ + if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){ + if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ + walUnlockShared(pWal, WAL_WRITE_LOCK); + rc = SQLITE_READONLY_RECOVERY; + } + }else{ + int bWriteLock = pWal->writeLock; + if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ + pWal->writeLock = 1; + if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ + badHdr = walIndexTryHdr(pWal, pChanged); + if( badHdr ){ + /* If the wal-index header is still malformed even while holding + ** a WRITE lock, it can only mean that the header is corrupted and + ** needs to be reconstructed. So run recovery to do exactly that. + */ + rc = walIndexRecover(pWal); + *pChanged = 1; + } + } + if( bWriteLock==0 ){ + pWal->writeLock = 0; + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + } + } + } + } + + /* If the header is read successfully, check the version number to make + ** sure the wal-index was not constructed with some future format that + ** this version of SQLite cannot understand. + */ + if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){ + rc = SQLITE_CANTOPEN_BKPT; + } + if( pWal->bShmUnreliable ){ + if( rc!=SQLITE_OK ){ + walIndexClose(pWal, 0); + pWal->bShmUnreliable = 0; + assert( pWal->nWiData>0 && pWal->apWiData[0]==0 ); + /* walIndexRecover() might have returned SHORT_READ if a concurrent + ** writer truncated the WAL out from under it. If that happens, it + ** indicates that a writer has fixed the SHM file for us, so retry */ + if( rc==SQLITE_IOERR_SHORT_READ ) rc = WAL_RETRY; + } + pWal->exclusiveMode = WAL_NORMAL_MODE; + } + + return rc; +} + +/* +** Open a transaction in a connection where the shared-memory is read-only +** and where we cannot verify that there is a separate write-capable connection +** on hand to keep the shared-memory up-to-date with the WAL file. +** +** This can happen, for example, when the shared-memory is implemented by +** memory-mapping a *-shm file, where a prior writer has shut down and +** left the *-shm file on disk, and now the present connection is trying +** to use that database but lacks write permission on the *-shm file. +** Other scenarios are also possible, depending on the VFS implementation. +** +** Precondition: +** +** The *-wal file has been read and an appropriate wal-index has been +** constructed in pWal->apWiData[] using heap memory instead of shared +** memory. +** +** If this function returns SQLITE_OK, then the read transaction has +** been successfully opened. In this case output variable (*pChanged) +** is set to true before returning if the caller should discard the +** contents of the page cache before proceeding. Or, if it returns +** WAL_RETRY, then the heap memory wal-index has been discarded and +** the caller should retry opening the read transaction from the +** beginning (including attempting to map the *-shm file). +** +** If an error occurs, an SQLite error code is returned. +*/ +static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ + i64 szWal; /* Size of wal file on disk in bytes */ + i64 iOffset; /* Current offset when reading wal file */ + u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */ + u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */ + int szFrame; /* Number of bytes in buffer aFrame[] */ + u8 *aData; /* Pointer to data part of aFrame buffer */ + volatile void *pDummy; /* Dummy argument for xShmMap */ + int rc; /* Return code */ + u32 aSaveCksum[2]; /* Saved copy of pWal->hdr.aFrameCksum */ + + assert( pWal->bShmUnreliable ); + assert( pWal->readOnly & WAL_SHM_RDONLY ); + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + + /* Take WAL_READ_LOCK(0). This has the effect of preventing any + ** writers from running a checkpoint, but does not stop them + ** from running recovery. */ + rc = walLockShared(pWal, WAL_READ_LOCK(0)); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_BUSY ) rc = WAL_RETRY; + goto begin_unreliable_shm_out; + } + pWal->readLock = 0; + + /* Check to see if a separate writer has attached to the shared-memory area, + ** thus making the shared-memory "reliable" again. Do this by invoking + ** the xShmMap() routine of the VFS and looking to see if the return + ** is SQLITE_READONLY instead of SQLITE_READONLY_CANTINIT. + ** + ** If the shared-memory is now "reliable" return WAL_RETRY, which will + ** cause the heap-memory WAL-index to be discarded and the actual + ** shared memory to be used in its place. + ** + ** This step is important because, even though this connection is holding + ** the WAL_READ_LOCK(0) which prevents a checkpoint, a writer might + ** have already checkpointed the WAL file and, while the current + ** is active, wrap the WAL and start overwriting frames that this + ** process wants to use. + ** + ** Once sqlite3OsShmMap() has been called for an sqlite3_file and has + ** returned any SQLITE_READONLY value, it must return only SQLITE_READONLY + ** or SQLITE_READONLY_CANTINIT or some error for all subsequent invocations, + ** even if some external agent does a "chmod" to make the shared-memory + ** writable by us, until sqlite3OsShmUnmap() has been called. + ** This is a requirement on the VFS implementation. + */ + rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy); + assert( rc!=SQLITE_OK ); /* SQLITE_OK not possible for read-only connection */ + if( rc!=SQLITE_READONLY_CANTINIT ){ + rc = (rc==SQLITE_READONLY ? WAL_RETRY : rc); + goto begin_unreliable_shm_out; + } + + /* We reach this point only if the real shared-memory is still unreliable. + ** Assume the in-memory WAL-index substitute is correct and load it + ** into pWal->hdr. + */ + memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + /* Make sure some writer hasn't come in and changed the WAL file out + ** from under us, then disconnected, while we were not looking. + */ + rc = sqlite3OsFileSize(pWal->pWalFd, &szWal); + if( rc!=SQLITE_OK ){ + goto begin_unreliable_shm_out; + } + if( szWalhdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY); + goto begin_unreliable_shm_out; + } + + /* Check the salt keys at the start of the wal file still match. */ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); + if( rc!=SQLITE_OK ){ + goto begin_unreliable_shm_out; + } + if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){ + /* Some writer has wrapped the WAL file while we were not looking. + ** Return WAL_RETRY which will cause the in-memory WAL-index to be + ** rebuilt. */ + rc = WAL_RETRY; + goto begin_unreliable_shm_out; + } + + /* Allocate a buffer to read frames into */ + assert( (pWal->szPage & (pWal->szPage-1))==0 ); + assert( pWal->szPage>=512 && pWal->szPage<=65536 ); + szFrame = pWal->szPage + WAL_FRAME_HDRSIZE; + aFrame = (u8 *)sqlite3_malloc64(szFrame); + if( aFrame==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto begin_unreliable_shm_out; + } + aData = &aFrame[WAL_FRAME_HDRSIZE]; + + /* Check to see if a complete transaction has been appended to the + ** wal file since the heap-memory wal-index was created. If so, the + ** heap-memory wal-index is discarded and WAL_RETRY returned to + ** the caller. */ + aSaveCksum[0] = pWal->hdr.aFrameCksum[0]; + aSaveCksum[1] = pWal->hdr.aFrameCksum[1]; + for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->szPage); + iOffset+szFrame<=szWal; + iOffset+=szFrame + ){ + u32 pgno; /* Database page number for frame */ + u32 nTruncate; /* dbsize field from frame header */ + + /* Read and decode the next log frame. */ + rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); + if( rc!=SQLITE_OK ) break; + if( !walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame) ) break; + + /* If nTruncate is non-zero, then a complete transaction has been + ** appended to this wal file. Set rc to WAL_RETRY and break out of + ** the loop. */ + if( nTruncate ){ + rc = WAL_RETRY; + break; + } + } + pWal->hdr.aFrameCksum[0] = aSaveCksum[0]; + pWal->hdr.aFrameCksum[1] = aSaveCksum[1]; + + begin_unreliable_shm_out: + sqlite3_free(aFrame); + if( rc!=SQLITE_OK ){ + int i; + for(i=0; inWiData; i++){ + sqlite3_free((void*)pWal->apWiData[i]); + pWal->apWiData[i] = 0; + } + pWal->bShmUnreliable = 0; + sqlite3WalEndReadTransaction(pWal); + *pChanged = 1; + } + return rc; +} + +/* +** Attempt to start a read transaction. This might fail due to a race or +** other transient condition. When that happens, it returns WAL_RETRY to +** indicate to the caller that it is safe to retry immediately. +** +** On success return SQLITE_OK. On a permanent failure (such an +** I/O error or an SQLITE_BUSY because another process is running +** recovery) return a positive error code. +** +** The useWal parameter is true to force the use of the WAL and disable +** the case where the WAL is bypassed because it has been completely +** checkpointed. If useWal==0 then this routine calls walIndexReadHdr() +** to make a copy of the wal-index header into pWal->hdr. If the +** wal-index header has changed, *pChanged is set to 1 (as an indication +** to the caller that the local page cache is obsolete and needs to be +** flushed.) When useWal==1, the wal-index header is assumed to already +** be loaded and the pChanged parameter is unused. +** +** The caller must set the cnt parameter to the number of prior calls to +** this routine during the current read attempt that returned WAL_RETRY. +** This routine will start taking more aggressive measures to clear the +** race conditions after multiple WAL_RETRY returns, and after an excessive +** number of errors will ultimately return SQLITE_PROTOCOL. The +** SQLITE_PROTOCOL return indicates that some other process has gone rogue +** and is not honoring the locking protocol. There is a vanishingly small +** chance that SQLITE_PROTOCOL could be returned because of a run of really +** bad luck when there is lots of contention for the wal-index, but that +** possibility is so small that it can be safely neglected, we believe. +** +** On success, this routine obtains a read lock on +** WAL_READ_LOCK(pWal->readLock). The pWal->readLock integer is +** in the range 0 <= pWal->readLock < WAL_NREADER. If pWal->readLock==(-1) +** that means the Wal does not hold any read lock. The reader must not +** access any database page that is modified by a WAL frame up to and +** including frame number aReadMark[pWal->readLock]. The reader will +** use WAL frames up to and including pWal->hdr.mxFrame if pWal->readLock>0 +** Or if pWal->readLock==0, then the reader will ignore the WAL +** completely and get all content directly from the database file. +** If the useWal parameter is 1 then the WAL will never be ignored and +** this routine will always set pWal->readLock>0 on success. +** When the read transaction is completed, the caller must release the +** lock on WAL_READ_LOCK(pWal->readLock) and set pWal->readLock to -1. +** +** This routine uses the nBackfill and aReadMark[] fields of the header +** to select a particular WAL_READ_LOCK() that strives to let the +** checkpoint process do as much work as possible. This routine might +** update values of the aReadMark[] array in the header, but if it does +** so it takes care to hold an exclusive lock on the corresponding +** WAL_READ_LOCK() while changing values. +*/ +static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ + volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */ + u32 mxReadMark; /* Largest aReadMark[] value */ + int mxI; /* Index of largest aReadMark[] value */ + int i; /* Loop counter */ + int rc = SQLITE_OK; /* Return code */ + u32 mxFrame; /* Wal frame to lock to */ + + assert( pWal->readLock<0 ); /* Not currently locked */ + + /* useWal may only be set for read/write connections */ + assert( (pWal->readOnly & WAL_SHM_RDONLY)==0 || useWal==0 ); + + /* Take steps to avoid spinning forever if there is a protocol error. + ** + ** Circumstances that cause a RETRY should only last for the briefest + ** instances of time. No I/O or other system calls are done while the + ** locks are held, so the locks should not be held for very long. But + ** if we are unlucky, another process that is holding a lock might get + ** paged out or take a page-fault that is time-consuming to resolve, + ** during the few nanoseconds that it is holding the lock. In that case, + ** it might take longer than normal for the lock to free. + ** + ** After 5 RETRYs, we begin calling sqlite3OsSleep(). The first few + ** calls to sqlite3OsSleep() have a delay of 1 microsecond. Really this + ** is more of a scheduler yield than an actual delay. But on the 10th + ** an subsequent retries, the delays start becoming longer and longer, + ** so that on the 100th (and last) RETRY we delay for 323 milliseconds. + ** The total delay time before giving up is less than 10 seconds. + */ + if( cnt>5 ){ + int nDelay = 1; /* Pause time in microseconds */ + if( cnt>100 ){ + VVA_ONLY( pWal->lockError = 1; ) + return SQLITE_PROTOCOL; + } + if( cnt>=10 ) nDelay = (cnt-9)*(cnt-9)*39; + sqlite3OsSleep(pWal->pVfs, nDelay); + } + + if( !useWal ){ + assert( rc==SQLITE_OK ); + if( pWal->bShmUnreliable==0 ){ + rc = walIndexReadHdr(pWal, pChanged); + } + if( rc==SQLITE_BUSY ){ + /* If there is not a recovery running in another thread or process + ** then convert BUSY errors to WAL_RETRY. If recovery is known to + ** be running, convert BUSY to BUSY_RECOVERY. There is a race here + ** which might cause WAL_RETRY to be returned even if BUSY_RECOVERY + ** would be technically correct. But the race is benign since with + ** WAL_RETRY this routine will be called again and will probably be + ** right on the second iteration. + */ + if( pWal->apWiData[0]==0 ){ + /* This branch is taken when the xShmMap() method returns SQLITE_BUSY. + ** We assume this is a transient condition, so return WAL_RETRY. The + ** xShmMap() implementation used by the default unix and win32 VFS + ** modules may return SQLITE_BUSY due to a race condition in the + ** code that determines whether or not the shared-memory region + ** must be zeroed before the requested page is returned. + */ + rc = WAL_RETRY; + }else if( SQLITE_OK==(rc = walLockShared(pWal, WAL_RECOVER_LOCK)) ){ + walUnlockShared(pWal, WAL_RECOVER_LOCK); + rc = WAL_RETRY; + }else if( rc==SQLITE_BUSY ){ + rc = SQLITE_BUSY_RECOVERY; + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + else if( pWal->bShmUnreliable ){ + return walBeginShmUnreliable(pWal, pChanged); + } + } + + assert( pWal->nWiData>0 ); + assert( pWal->apWiData[0]!=0 ); + pInfo = walCkptInfo(pWal); + if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame +#ifdef SQLITE_ENABLE_SNAPSHOT + && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) +#endif + ){ + /* The WAL has been completely backfilled (or it is empty). + ** and can be safely ignored. + */ + rc = walLockShared(pWal, WAL_READ_LOCK(0)); + walShmBarrier(pWal); + if( rc==SQLITE_OK ){ + if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){ + /* It is not safe to allow the reader to continue here if frames + ** may have been appended to the log before READ_LOCK(0) was obtained. + ** When holding READ_LOCK(0), the reader ignores the entire log file, + ** which implies that the database file contains a trustworthy + ** snapshot. Since holding READ_LOCK(0) prevents a checkpoint from + ** happening, this is usually correct. + ** + ** However, if frames have been appended to the log (or if the log + ** is wrapped and written for that matter) before the READ_LOCK(0) + ** is obtained, that is not necessarily true. A checkpointer may + ** have started to backfill the appended frames but crashed before + ** it finished. Leaving a corrupt image in the database file. + */ + walUnlockShared(pWal, WAL_READ_LOCK(0)); + return WAL_RETRY; + } + pWal->readLock = 0; + return SQLITE_OK; + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + + /* If we get this far, it means that the reader will want to use + ** the WAL to get at content from recent commits. The job now is + ** to select one of the aReadMark[] entries that is closest to + ** but not exceeding pWal->hdr.mxFrame and lock that entry. + */ + mxReadMark = 0; + mxI = 0; + mxFrame = pWal->hdr.mxFrame; +#ifdef SQLITE_ENABLE_SNAPSHOT + if( pWal->pSnapshot && pWal->pSnapshot->mxFramepSnapshot->mxFrame; + } +#endif + for(i=1; iaReadMark+i); + if( mxReadMark<=thisMark && thisMark<=mxFrame ){ + assert( thisMark!=READMARK_NOT_USED ); + mxReadMark = thisMark; + mxI = i; + } + } + if( (pWal->readOnly & WAL_SHM_RDONLY)==0 + && (mxReadMarkaReadMark+i,mxFrame); + mxReadMark = mxFrame; + mxI = i; + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + break; + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + } + if( mxI==0 ){ + assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 ); + return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTINIT; + } + + rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); + if( rc ){ + return rc==SQLITE_BUSY ? WAL_RETRY : rc; + } + /* Now that the read-lock has been obtained, check that neither the + ** value in the aReadMark[] array or the contents of the wal-index + ** header have changed. + ** + ** It is necessary to check that the wal-index header did not change + ** between the time it was read and when the shared-lock was obtained + ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility + ** that the log file may have been wrapped by a writer, or that frames + ** that occur later in the log than pWal->hdr.mxFrame may have been + ** copied into the database by a checkpointer. If either of these things + ** happened, then reading the database with the current value of + ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry + ** instead. + ** + ** Before checking that the live wal-index header has not changed + ** since it was read, set Wal.minFrame to the first frame in the wal + ** file that has not yet been checkpointed. This client will not need + ** to read any frames earlier than minFrame from the wal file - they + ** can be safely read directly from the database file. + ** + ** Because a ShmBarrier() call is made between taking the copy of + ** nBackfill and checking that the wal-header in shared-memory still + ** matches the one cached in pWal->hdr, it is guaranteed that the + ** checkpointer that set nBackfill was not working with a wal-index + ** header newer than that cached in pWal->hdr. If it were, that could + ** cause a problem. The checkpointer could omit to checkpoint + ** a version of page X that lies before pWal->minFrame (call that version + ** A) on the basis that there is a newer version (version B) of the same + ** page later in the wal file. But if version B happens to like past + ** frame pWal->hdr.mxFrame - then the client would incorrectly assume + ** that it can read version A from the database file. However, since + ** we can guarantee that the checkpointer that set nBackfill could not + ** see any pages past pWal->hdr.mxFrame, this problem does not come up. + */ + pWal->minFrame = AtomicLoad(&pInfo->nBackfill)+1; + walShmBarrier(pWal); + if( AtomicLoad(pInfo->aReadMark+mxI)!=mxReadMark + || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) + ){ + walUnlockShared(pWal, WAL_READ_LOCK(mxI)); + return WAL_RETRY; + }else{ + assert( mxReadMark<=pWal->hdr.mxFrame ); + pWal->readLock = (i16)mxI; + } + return rc; +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted +** variable so that older snapshots can be accessed. To do this, loop +** through all wal frames from nBackfillAttempted to (nBackfill+1), +** comparing their content to the corresponding page with the database +** file, if any. Set nBackfillAttempted to the frame number of the +** first frame for which the wal file content matches the db file. +** +** This is only really safe if the file-system is such that any page +** writes made by earlier checkpointers were atomic operations, which +** is not always true. It is also possible that nBackfillAttempted +** may be left set to a value larger than expected, if a wal frame +** contains content that duplicate of an earlier version of the same +** page. +** +** SQLITE_OK is returned if successful, or an SQLite error code if an +** error occurs. It is not an error if nBackfillAttempted cannot be +** decreased at all. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ + int rc; + + assert( pWal->readLock>=0 ); + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int szPage = (int)pWal->szPage; + i64 szDb; /* Size of db file in bytes */ + + rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); + if( rc==SQLITE_OK ){ + void *pBuf1 = sqlite3_malloc(szPage); + void *pBuf2 = sqlite3_malloc(szPage); + if( pBuf1==0 || pBuf2==0 ){ + rc = SQLITE_NOMEM; + }else{ + u32 i = pInfo->nBackfillAttempted; + for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){ + WalHashLoc sLoc; /* Hash table location */ + u32 pgno; /* Page number in db file */ + i64 iDbOff; /* Offset of db file entry */ + i64 iWalOff; /* Offset of wal file entry */ + + rc = walHashGet(pWal, walFramePage(i), &sLoc); + if( rc!=SQLITE_OK ) break; + assert( i - sLoc.iZero - 1 >=0 ); + pgno = sLoc.aPgno[i-sLoc.iZero-1]; + iDbOff = (i64)(pgno-1) * szPage; + + if( iDbOff+szPage<=szDb ){ + iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; + rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); + + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); + } + + if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ + break; + } + } + + pInfo->nBackfillAttempted = i-1; + } + } + + sqlite3_free(pBuf1); + sqlite3_free(pBuf2); + } + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + } + + return rc; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +/* +** Begin a read transaction on the database. +** +** This routine used to be called sqlite3OpenSnapshot() and with good reason: +** it takes a snapshot of the state of the WAL and wal-index for the current +** instant in time. The current thread will continue to use this snapshot. +** Other threads might append new content to the WAL and wal-index but +** that extra content is ignored by the current thread. +** +** If the database contents have changes since the previous read +** transaction, then *pChanged is set to 1 before returning. The +** Pager layer will use this to know that its cache is stale and +** needs to be flushed. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ + int rc; /* Return code */ + int cnt = 0; /* Number of TryBeginRead attempts */ +#ifdef SQLITE_ENABLE_SNAPSHOT + int bChanged = 0; + WalIndexHdr *pSnapshot = pWal->pSnapshot; +#endif + + assert( pWal->ckptLock==0 ); + +#ifdef SQLITE_ENABLE_SNAPSHOT + if( pSnapshot ){ + if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + bChanged = 1; + } + + /* It is possible that there is a checkpointer thread running + ** concurrent with this code. If this is the case, it may be that the + ** checkpointer has already determined that it will checkpoint + ** snapshot X, where X is later in the wal file than pSnapshot, but + ** has not yet set the pInfo->nBackfillAttempted variable to indicate + ** its intent. To avoid the race condition this leads to, ensure that + ** there is no checkpointer process by taking a shared CKPT lock + ** before checking pInfo->nBackfillAttempted. */ + (void)walEnableBlocking(pWal); + rc = walLockShared(pWal, WAL_CKPT_LOCK); + walDisableBlocking(pWal); + + if( rc!=SQLITE_OK ){ + return rc; + } + pWal->ckptLock = 1; + } +#endif + + do{ + rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); + }while( rc==WAL_RETRY ); + testcase( (rc&0xff)==SQLITE_BUSY ); + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + +#ifdef SQLITE_ENABLE_SNAPSHOT + if( rc==SQLITE_OK ){ + if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + /* At this point the client has a lock on an aReadMark[] slot holding + ** a value equal to or smaller than pSnapshot->mxFrame, but pWal->hdr + ** is populated with the wal-index header corresponding to the head + ** of the wal file. Verify that pSnapshot is still valid before + ** continuing. Reasons why pSnapshot might no longer be valid: + ** + ** (1) The WAL file has been reset since the snapshot was taken. + ** In this case, the salt will have changed. + ** + ** (2) A checkpoint as been attempted that wrote frames past + ** pSnapshot->mxFrame into the database file. Note that the + ** checkpoint need not have completed for this to cause problems. + */ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + + assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); + assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); + + /* Check that the wal file has not been wrapped. Assuming that it has + ** not, also check that no checkpointer has attempted to checkpoint any + ** frames beyond pSnapshot->mxFrame. If either of these conditions are + ** true, return SQLITE_ERROR_SNAPSHOT. Otherwise, overwrite pWal->hdr + ** with *pSnapshot and set *pChanged as appropriate for opening the + ** snapshot. */ + if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + && pSnapshot->mxFrame>=pInfo->nBackfillAttempted + ){ + assert( pWal->readLock>0 ); + memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); + *pChanged = bChanged; + }else{ + rc = SQLITE_ERROR_SNAPSHOT; + } + + /* A client using a non-current snapshot may not ignore any frames + ** from the start of the wal file. This is because, for a system + ** where (minFrame < iSnapshot < maxFrame), a checkpointer may + ** have omitted to checkpoint a frame earlier than minFrame in + ** the file because there exists a frame after iSnapshot that + ** is the same database page. */ + pWal->minFrame = 1; + + if( rc!=SQLITE_OK ){ + sqlite3WalEndReadTransaction(pWal); + } + } + } + + /* Release the shared CKPT lock obtained above. */ + if( pWal->ckptLock ){ + assert( pSnapshot ); + walUnlockShared(pWal, WAL_CKPT_LOCK); + pWal->ckptLock = 0; + } +#endif + return rc; +} + +/* +** Finish with a read transaction. All this does is release the +** read-lock. +*/ +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ + sqlite3WalEndWriteTransaction(pWal); + if( pWal->readLock>=0 ){ + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->readLock = -1; + } +} + +/* +** Search the wal file for page pgno. If found, set *piRead to the frame that +** contains the page. Otherwise, if pgno is not in the wal file, set *piRead +** to zero. +** +** Return SQLITE_OK if successful, or an error code if an error occurs. If an +** error does occur, the final value of *piRead is undefined. +*/ +SQLITE_PRIVATE int sqlite3WalFindFrame( + Wal *pWal, /* WAL handle */ + Pgno pgno, /* Database page number to read data for */ + u32 *piRead /* OUT: Frame number (or zero) */ +){ + u32 iRead = 0; /* If !=0, WAL frame to return data from */ + u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ + int iHash; /* Used to loop through N hash tables */ + int iMinHash; + + /* This routine is only be called from within a read transaction. */ + assert( pWal->readLock>=0 || pWal->lockError ); + + /* If the "last page" field of the wal-index header snapshot is 0, then + ** no data will be read from the wal under any circumstances. Return early + ** in this case as an optimization. Likewise, if pWal->readLock==0, + ** then the WAL is ignored by the reader so return early, as if the + ** WAL were empty. + */ + if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ + *piRead = 0; + return SQLITE_OK; + } + + /* Search the hash table or tables for an entry matching page number + ** pgno. Each iteration of the following for() loop searches one + ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames). + ** + ** This code might run concurrently to the code in walIndexAppend() + ** that adds entries to the wal-index (and possibly to this hash + ** table). This means the value just read from the hash + ** slot (aHash[iKey]) may have been added before or after the + ** current read transaction was opened. Values added after the + ** read transaction was opened may have been written incorrectly - + ** i.e. these slots may contain garbage data. However, we assume + ** that any slots written before the current read transaction was + ** opened remain unmodified. + ** + ** For the reasons above, the if(...) condition featured in the inner + ** loop of the following block is more stringent that would be required + ** if we had exclusive access to the hash-table: + ** + ** (aPgno[iFrame]==pgno): + ** This condition filters out normal hash-table collisions. + ** + ** (iFrame<=iLast): + ** This condition filters out entries that were added to the hash + ** table after the current read-transaction had started. + */ + iMinHash = walFramePage(pWal->minFrame); + for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){ + WalHashLoc sLoc; /* Hash table location */ + int iKey; /* Hash slot index */ + int nCollide; /* Number of hash collisions remaining */ + int rc; /* Error code */ + u32 iH; + + rc = walHashGet(pWal, iHash, &sLoc); + if( rc!=SQLITE_OK ){ + return rc; + } + nCollide = HASHTABLE_NSLOT; + iKey = walHash(pgno); + while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ + u32 iFrame = iH + sLoc.iZero; + if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH-1]==pgno ){ + assert( iFrame>iRead || CORRUPT_DB ); + iRead = iFrame; + } + if( (nCollide--)==0 ){ + return SQLITE_CORRUPT_BKPT; + } + iKey = walNextHash(iKey); + } + if( iRead ) break; + } + +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT + /* If expensive assert() statements are available, do a linear search + ** of the wal-index file content. Make sure the results agree with the + ** result obtained using the hash indexes above. */ + { + u32 iRead2 = 0; + u32 iTest; + assert( pWal->bShmUnreliable || pWal->minFrame>0 ); + for(iTest=iLast; iTest>=pWal->minFrame && iTest>0; iTest--){ + if( walFramePgno(pWal, iTest)==pgno ){ + iRead2 = iTest; + break; + } + } + assert( iRead==iRead2 ); + } +#endif + + *piRead = iRead; + return SQLITE_OK; +} + +/* +** Read the contents of frame iRead from the wal file into buffer pOut +** (which is nOut bytes in size). Return SQLITE_OK if successful, or an +** error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3WalReadFrame( + Wal *pWal, /* WAL handle */ + u32 iRead, /* Frame to read */ + int nOut, /* Size of buffer pOut in bytes */ + u8 *pOut /* Buffer to write page data to */ +){ + int sz; + i64 iOffset; + sz = pWal->hdr.szPage; + sz = (sz&0xfe00) + ((sz&0x0001)<<16); + testcase( sz<=32768 ); + testcase( sz>=65536 ); + iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE; + /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */ + return sqlite3OsRead(pWal->pWalFd, pOut, (nOut>sz ? sz : nOut), iOffset); +} + +/* +** Return the size of the database in pages (or zero, if unknown). +*/ +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){ + if( pWal && ALWAYS(pWal->readLock>=0) ){ + return pWal->hdr.nPage; + } + return 0; +} + + +/* +** This function starts a write transaction on the WAL. +** +** A read transaction must have already been started by a prior call +** to sqlite3WalBeginReadTransaction(). +** +** If another thread or process has written into the database since +** the read transaction was started, then it is not possible for this +** thread to write as doing so would cause a fork. So this routine +** returns SQLITE_BUSY in that case and no write transaction is started. +** +** There can only be a single writer active at a time. +*/ +SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ + int rc; + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* If the write-lock is already held, then it was obtained before the + ** read-transaction was even opened, making this call a no-op. + ** Return early. */ + if( pWal->writeLock ){ + assert( !memcmp(&pWal->hdr,(void *)walIndexHdr(pWal),sizeof(WalIndexHdr)) ); + return SQLITE_OK; + } +#endif + + /* Cannot start a write transaction without first holding a read + ** transaction. */ + assert( pWal->readLock>=0 ); + assert( pWal->writeLock==0 && pWal->iReCksum==0 ); + + if( pWal->readOnly ){ + return SQLITE_READONLY; + } + + /* Only one writer allowed at a time. Get the write lock. Return + ** SQLITE_BUSY if unable. + */ + rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); + if( rc ){ + return rc; + } + pWal->writeLock = 1; + + /* If another connection has written to the database file since the + ** time the read transaction on this connection was started, then + ** the write is disallowed. + */ + if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + rc = SQLITE_BUSY_SNAPSHOT; + } + + return rc; +} + +/* +** End a write transaction. The commit has already been done. This +** routine merely releases the lock. +*/ +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){ + if( pWal->writeLock ){ + walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); + pWal->writeLock = 0; + pWal->iReCksum = 0; + pWal->truncateOnCommit = 0; + } + return SQLITE_OK; +} + +/* +** If any data has been written (but not committed) to the log file, this +** function moves the write-pointer back to the start of the transaction. +** +** Additionally, the callback function is invoked for each frame written +** to the WAL since the start of the transaction. If the callback returns +** other than SQLITE_OK, it is not invoked again and the error code is +** returned to the caller. +** +** Otherwise, if the callback function does not return an error, this +** function returns SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ + int rc = SQLITE_OK; + if( ALWAYS(pWal->writeLock) ){ + Pgno iMax = pWal->hdr.mxFrame; + Pgno iFrame; + + /* Restore the clients cache of the wal-index header to the state it + ** was in before the client began writing to the database. + */ + memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + for(iFrame=pWal->hdr.mxFrame+1; + ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; + iFrame++ + ){ + /* This call cannot fail. Unless the page for which the page number + ** is passed as the second argument is (a) in the cache and + ** (b) has an outstanding reference, then xUndo is either a no-op + ** (if (a) is false) or simply expels the page from the cache (if (b) + ** is false). + ** + ** If the upper layer is doing a rollback, it is guaranteed that there + ** are no outstanding references to any page other than page 1. And + ** page 1 is never written to the log until the transaction is + ** committed. As a result, the call to xUndo may not fail. + */ + assert( walFramePgno(pWal, iFrame)!=1 ); + rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); + } + if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); + } + return rc; +} + +/* +** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32 +** values. This function populates the array with values required to +** "rollback" the write position of the WAL handle back to the current +** point in the event of a savepoint rollback (via WalSavepointUndo()). +*/ +SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ + assert( pWal->writeLock ); + aWalData[0] = pWal->hdr.mxFrame; + aWalData[1] = pWal->hdr.aFrameCksum[0]; + aWalData[2] = pWal->hdr.aFrameCksum[1]; + aWalData[3] = pWal->nCkpt; +} + +/* +** Move the write position of the WAL back to the point identified by +** the values in the aWalData[] array. aWalData must point to an array +** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated +** by a call to WalSavepoint(). +*/ +SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ + int rc = SQLITE_OK; + + assert( pWal->writeLock ); + assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame ); + + if( aWalData[3]!=pWal->nCkpt ){ + /* This savepoint was opened immediately after the write-transaction + ** was started. Right after that, the writer decided to wrap around + ** to the start of the log. Update the savepoint values to match. + */ + aWalData[0] = 0; + aWalData[3] = pWal->nCkpt; + } + + if( aWalData[0]hdr.mxFrame ){ + pWal->hdr.mxFrame = aWalData[0]; + pWal->hdr.aFrameCksum[0] = aWalData[1]; + pWal->hdr.aFrameCksum[1] = aWalData[2]; + walCleanupHash(pWal); + } + + return rc; +} + +/* +** This function is called just before writing a set of frames to the log +** file (see sqlite3WalFrames()). It checks to see if, instead of appending +** to the current log file, it is possible to overwrite the start of the +** existing log file with the new frames (i.e. "reset" the log). If so, +** it sets pWal->hdr.mxFrame to 0. Otherwise, pWal->hdr.mxFrame is left +** unchanged. +** +** SQLITE_OK is returned if no error is encountered (regardless of whether +** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned +** if an error occurs. +*/ +static int walRestartLog(Wal *pWal){ + int rc = SQLITE_OK; + int cnt; + + if( pWal->readLock==0 ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + assert( pInfo->nBackfill==pWal->hdr.mxFrame ); + if( pInfo->nBackfill>0 ){ + u32 salt1; + sqlite3_randomness(4, &salt1); + rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc==SQLITE_OK ){ + /* If all readers are using WAL_READ_LOCK(0) (in other words if no + ** readers are currently using the WAL), then the transactions + ** frames will overwrite the start of the existing log. Update the + ** wal-index header to reflect this. + ** + ** In theory it would be Ok to update the cache of the header only + ** at this point. But updating the actual wal-index header is also + ** safe and means there is no special case for sqlite3WalUndo() + ** to handle if this transaction is rolled back. */ + walRestartHdr(pWal, salt1); + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + }else if( rc!=SQLITE_BUSY ){ + return rc; + } + } + walUnlockShared(pWal, WAL_READ_LOCK(0)); + pWal->readLock = -1; + cnt = 0; + do{ + int notUsed; + rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); + }while( rc==WAL_RETRY ); + assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ + testcase( (rc&0xff)==SQLITE_IOERR ); + testcase( rc==SQLITE_PROTOCOL ); + testcase( rc==SQLITE_OK ); + } + return rc; +} + +/* +** Information about the current state of the WAL file and where +** the next fsync should occur - passed from sqlite3WalFrames() into +** walWriteToLog(). +*/ +typedef struct WalWriter { + Wal *pWal; /* The complete WAL information */ + sqlite3_file *pFd; /* The WAL file to which we write */ + sqlite3_int64 iSyncPoint; /* Fsync at this offset */ + int syncFlags; /* Flags for the fsync */ + int szPage; /* Size of one page */ +} WalWriter; + +/* +** Write iAmt bytes of content into the WAL file beginning at iOffset. +** Do a sync when crossing the p->iSyncPoint boundary. +** +** In other words, if iSyncPoint is in between iOffset and iOffset+iAmt, +** first write the part before iSyncPoint, then sync, then write the +** rest. +*/ +static int walWriteToLog( + WalWriter *p, /* WAL to write to */ + void *pContent, /* Content to be written */ + int iAmt, /* Number of bytes to write */ + sqlite3_int64 iOffset /* Start writing at this offset */ +){ + int rc; + if( iOffsetiSyncPoint && iOffset+iAmt>=p->iSyncPoint ){ + int iFirstAmt = (int)(p->iSyncPoint - iOffset); + rc = sqlite3OsWrite(p->pFd, pContent, iFirstAmt, iOffset); + if( rc ) return rc; + iOffset += iFirstAmt; + iAmt -= iFirstAmt; + pContent = (void*)(iFirstAmt + (char*)pContent); + assert( WAL_SYNC_FLAGS(p->syncFlags)!=0 ); + rc = sqlite3OsSync(p->pFd, WAL_SYNC_FLAGS(p->syncFlags)); + if( iAmt==0 || rc ) return rc; + } + rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); + return rc; +} + +/* +** Write out a single frame of the WAL +*/ +static int walWriteOneFrame( + WalWriter *p, /* Where to write the frame */ + PgHdr *pPage, /* The page of the frame to be written */ + int nTruncate, /* The commit flag. Usually 0. >0 for commit */ + sqlite3_int64 iOffset /* Byte offset at which to write */ +){ + int rc; /* Result code from subfunctions */ + void *pData; /* Data actually written */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ +#if defined(SQLITE_HAS_CODEC) + if( (pData = sqlcipherPagerCodec(pPage))==0 ) return SQLITE_NOMEM_BKPT; +#else + pData = pPage->pData; +#endif + walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); + rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); + if( rc ) return rc; + /* Write the page data */ + rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); + return rc; +} + +/* +** This function is called as part of committing a transaction within which +** one or more frames have been overwritten. It updates the checksums for +** all frames written to the wal file by the current transaction starting +** with the earliest to have been overwritten. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int walRewriteChecksums(Wal *pWal, u32 iLast){ + const int szPage = pWal->szPage;/* Database page size */ + int rc = SQLITE_OK; /* Return code */ + u8 *aBuf; /* Buffer to load data from wal file into */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-headers in */ + u32 iRead; /* Next frame to read from wal file */ + i64 iCksumOff; + + aBuf = sqlite3_malloc(szPage + WAL_FRAME_HDRSIZE); + if( aBuf==0 ) return SQLITE_NOMEM_BKPT; + + /* Find the checksum values to use as input for the recalculating the + ** first checksum. If the first frame is frame 1 (implying that the current + ** transaction restarted the wal file), these values must be read from the + ** wal-file header. Otherwise, read them from the frame header of the + ** previous frame. */ + assert( pWal->iReCksum>0 ); + if( pWal->iReCksum==1 ){ + iCksumOff = 24; + }else{ + iCksumOff = walFrameOffset(pWal->iReCksum-1, szPage) + 16; + } + rc = sqlite3OsRead(pWal->pWalFd, aBuf, sizeof(u32)*2, iCksumOff); + pWal->hdr.aFrameCksum[0] = sqlite3Get4byte(aBuf); + pWal->hdr.aFrameCksum[1] = sqlite3Get4byte(&aBuf[sizeof(u32)]); + + iRead = pWal->iReCksum; + pWal->iReCksum = 0; + for(; rc==SQLITE_OK && iRead<=iLast; iRead++){ + i64 iOff = walFrameOffset(iRead, szPage); + rc = sqlite3OsRead(pWal->pWalFd, aBuf, szPage+WAL_FRAME_HDRSIZE, iOff); + if( rc==SQLITE_OK ){ + u32 iPgno, nDbSize; + iPgno = sqlite3Get4byte(aBuf); + nDbSize = sqlite3Get4byte(&aBuf[4]); + + walEncodeFrame(pWal, iPgno, nDbSize, &aBuf[WAL_FRAME_HDRSIZE], aFrame); + rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOff); + } + } + + sqlite3_free(aBuf); + return rc; +} + +/* +** Write a set of frames to the log. The caller must hold the write-lock +** on the log file (obtained using sqlite3WalBeginWriteTransaction()). +*/ +SQLITE_PRIVATE int sqlite3WalFrames( + Wal *pWal, /* Wal handle to write to */ + int szPage, /* Database page-size in bytes */ + PgHdr *pList, /* List of dirty pages to write */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit, /* True if this is a commit */ + int sync_flags /* Flags to pass to OsSync() (or 0) */ +){ + int rc; /* Used to catch return codes */ + u32 iFrame; /* Next frame address */ + PgHdr *p; /* Iterator to run through pList with. */ + PgHdr *pLast = 0; /* Last frame in list */ + int nExtra = 0; /* Number of extra copies of last page */ + int szFrame; /* The size of a single frame */ + i64 iOffset; /* Next byte to write in WAL file */ + WalWriter w; /* The writer */ + u32 iFirst = 0; /* First frame that may be overwritten */ + WalIndexHdr *pLive; /* Pointer to shared header */ + + assert( pList ); + assert( pWal->writeLock ); + + /* If this frame set completes a transaction, then nTruncate>0. If + ** nTruncate==0 then this frame set does not complete the transaction. */ + assert( (isCommit!=0)==(nTruncate!=0) ); + +#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) + { int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){} + WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n", + pWal, cnt, pWal->hdr.mxFrame, isCommit ? "Commit" : "Spill")); + } +#endif + + pLive = (WalIndexHdr*)walIndexHdr(pWal); + if( memcmp(&pWal->hdr, (void *)pLive, sizeof(WalIndexHdr))!=0 ){ + iFirst = pLive->mxFrame+1; + } + + /* See if it is possible to write these frames into the start of the + ** log file, instead of appending to it at pWal->hdr.mxFrame. + */ + if( SQLITE_OK!=(rc = walRestartLog(pWal)) ){ + return rc; + } + + /* If this is the first frame written into the log, write the WAL + ** header to the start of the WAL file. See comments at the top of + ** this source file for a description of the WAL header format. + */ + iFrame = pWal->hdr.mxFrame; + if( iFrame==0 ){ + u8 aWalHdr[WAL_HDRSIZE]; /* Buffer to assemble wal-header in */ + u32 aCksum[2]; /* Checksum for wal-header */ + + sqlite3Put4byte(&aWalHdr[0], (WAL_MAGIC | SQLITE_BIGENDIAN)); + sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION); + sqlite3Put4byte(&aWalHdr[8], szPage); + sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); + if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); + memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); + walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); + sqlite3Put4byte(&aWalHdr[24], aCksum[0]); + sqlite3Put4byte(&aWalHdr[28], aCksum[1]); + + pWal->szPage = szPage; + pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN; + pWal->hdr.aFrameCksum[0] = aCksum[0]; + pWal->hdr.aFrameCksum[1] = aCksum[1]; + pWal->truncateOnCommit = 1; + + rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0); + WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok")); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Sync the header (unless SQLITE_IOCAP_SEQUENTIAL is true or unless + ** all syncing is turned off by PRAGMA synchronous=OFF). Otherwise + ** an out-of-order write following a WAL restart could result in + ** database corruption. See the ticket: + ** + ** https://sqlite.org/src/info/ff5be73dee + */ + if( pWal->syncHeader ){ + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); + if( rc ) return rc; + } + } + assert( (int)pWal->szPage==szPage ); + + /* Setup information needed to write frames into the WAL */ + w.pWal = pWal; + w.pFd = pWal->pWalFd; + w.iSyncPoint = 0; + w.syncFlags = sync_flags; + w.szPage = szPage; + iOffset = walFrameOffset(iFrame+1, szPage); + szFrame = szPage + WAL_FRAME_HDRSIZE; + + /* Write all frames into the log file exactly once */ + for(p=pList; p; p=p->pDirty){ + int nDbSize; /* 0 normally. Positive == commit flag */ + + /* Check if this page has already been written into the wal file by + ** the current transaction. If so, overwrite the existing frame and + ** set Wal.writeLock to WAL_WRITELOCK_RECKSUM - indicating that + ** checksums must be recomputed when the transaction is committed. */ + if( iFirst && (p->pDirty || isCommit==0) ){ + u32 iWrite = 0; + VVA_ONLY(rc =) sqlite3WalFindFrame(pWal, p->pgno, &iWrite); + assert( rc==SQLITE_OK || iWrite==0 ); + if( iWrite>=iFirst ){ + i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; + void *pData; + if( pWal->iReCksum==0 || iWriteiReCksum ){ + pWal->iReCksum = iWrite; + } +#if defined(SQLITE_HAS_CODEC) + if( (pData = sqlcipherPagerCodec(p))==0 ) return SQLITE_NOMEM; +#else + pData = p->pData; +#endif + rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); + if( rc ) return rc; + p->flags &= ~PGHDR_WAL_APPEND; + continue; + } + } + + iFrame++; + assert( iOffset==walFrameOffset(iFrame, szPage) ); + nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0; + rc = walWriteOneFrame(&w, p, nDbSize, iOffset); + if( rc ) return rc; + pLast = p; + iOffset += szFrame; + p->flags |= PGHDR_WAL_APPEND; + } + + /* Recalculate checksums within the wal file if required. */ + if( isCommit && pWal->iReCksum ){ + rc = walRewriteChecksums(pWal, iFrame); + if( rc ) return rc; + } + + /* If this is the end of a transaction, then we might need to pad + ** the transaction and/or sync the WAL file. + ** + ** Padding and syncing only occur if this set of frames complete a + ** transaction and if PRAGMA synchronous=FULL. If synchronous==NORMAL + ** or synchronous==OFF, then no padding or syncing are needed. + ** + ** If SQLITE_IOCAP_POWERSAFE_OVERWRITE is defined, then padding is not + ** needed and only the sync is done. If padding is needed, then the + ** final frame is repeated (with its commit mark) until the next sector + ** boundary is crossed. Only the part of the WAL prior to the last + ** sector boundary is synced; the part of the last frame that extends + ** past the sector boundary is written after the sync. + */ + if( isCommit && WAL_SYNC_FLAGS(sync_flags)!=0 ){ + int bSync = 1; + if( pWal->padToSectorBoundary ){ + int sectorSize = sqlite3SectorSize(pWal->pWalFd); + w.iSyncPoint = ((iOffset+sectorSize-1)/sectorSize)*sectorSize; + bSync = (w.iSyncPoint==iOffset); + testcase( bSync ); + while( iOffsettruncateOnCommit && pWal->mxWalSize>=0 ){ + i64 sz = pWal->mxWalSize; + if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){ + sz = walFrameOffset(iFrame+nExtra+1, szPage); + } + walLimitSize(pWal, sz); + pWal->truncateOnCommit = 0; + } + + /* Append data to the wal-index. It is not necessary to lock the + ** wal-index to do this as the SQLITE_SHM_WRITE lock held on the wal-index + ** guarantees that there are no other writers, and no data that may + ** be in use by existing readers is being overwritten. + */ + iFrame = pWal->hdr.mxFrame; + for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){ + if( (p->flags & PGHDR_WAL_APPEND)==0 ) continue; + iFrame++; + rc = walIndexAppend(pWal, iFrame, p->pgno); + } + assert( pLast!=0 || nExtra==0 ); + while( rc==SQLITE_OK && nExtra>0 ){ + iFrame++; + nExtra--; + rc = walIndexAppend(pWal, iFrame, pLast->pgno); + } + + if( rc==SQLITE_OK ){ + /* Update the private copy of the header. */ + pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); + testcase( szPage<=32768 ); + testcase( szPage>=65536 ); + pWal->hdr.mxFrame = iFrame; + if( isCommit ){ + pWal->hdr.iChange++; + pWal->hdr.nPage = nTruncate; + } + /* If this is a commit, update the wal-index header too. */ + if( isCommit ){ + walIndexWriteHdr(pWal); + pWal->iCallback = iFrame; + } + } + + WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok")); + return rc; +} + +/* +** This routine is called to implement sqlite3_wal_checkpoint() and +** related interfaces. +** +** Obtain a CHECKPOINT lock and then backfill as much information as +** we can from WAL into the database. +** +** If parameter xBusy is not NULL, it is a pointer to a busy-handler +** callback. In this case this function runs a blocking checkpoint. +*/ +SQLITE_PRIVATE int sqlite3WalCheckpoint( + Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ + int eMode, /* PASSIVE, FULL, RESTART, or TRUNCATE */ + int (*xBusy)(void*), /* Function to call when busy */ + void *pBusyArg, /* Context argument for xBusyHandler */ + int sync_flags, /* Flags to sync db file with (or 0) */ + int nBuf, /* Size of temporary buffer */ + u8 *zBuf, /* Temporary buffer to use */ + int *pnLog, /* OUT: Number of frames in WAL */ + int *pnCkpt /* OUT: Number of backfilled frames in WAL */ +){ + int rc; /* Return code */ + int isChanged = 0; /* True if a new wal-index header is loaded */ + int eMode2 = eMode; /* Mode to pass to walCheckpoint() */ + int (*xBusy2)(void*) = xBusy; /* Busy handler for eMode2 */ + + assert( pWal->ckptLock==0 ); + assert( pWal->writeLock==0 ); + + /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked + ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ + assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); + + if( pWal->readOnly ) return SQLITE_READONLY; + WALTRACE(("WAL%p: checkpoint begins\n", pWal)); + + /* Enable blocking locks, if possible. If blocking locks are successfully + ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ + sqlite3WalDb(pWal, db); + (void)walEnableBlocking(pWal); + + /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive + ** "checkpoint" lock on the database file. + ** EVIDENCE-OF: R-10421-19736 If any other process is running a + ** checkpoint operation at the same time, the lock cannot be obtained and + ** SQLITE_BUSY is returned. + ** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured, + ** it will not be invoked in this case. + */ + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + testcase( rc==SQLITE_BUSY ); + testcase( rc!=SQLITE_OK && xBusy2!=0 ); + if( rc==SQLITE_OK ){ + pWal->ckptLock = 1; + + /* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and + ** TRUNCATE modes also obtain the exclusive "writer" lock on the database + ** file. + ** + ** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained + ** immediately, and a busy-handler is configured, it is invoked and the + ** writer lock retried until either the busy-handler returns 0 or the + ** lock is successfully obtained. + */ + if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); + if( rc==SQLITE_OK ){ + pWal->writeLock = 1; + }else if( rc==SQLITE_BUSY ){ + eMode2 = SQLITE_CHECKPOINT_PASSIVE; + xBusy2 = 0; + rc = SQLITE_OK; + } + } + } + + + /* Read the wal-index header. */ + if( rc==SQLITE_OK ){ + walDisableBlocking(pWal); + rc = walIndexReadHdr(pWal, &isChanged); + (void)walEnableBlocking(pWal); + if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ + sqlite3OsUnfetch(pWal->pDbFd, 0, 0); + } + } + + /* Copy data from the log to the database file. */ + if( rc==SQLITE_OK ){ + + if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); + } + + /* If no error occurred, set the output variables. */ + if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ + if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; + if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); + } + } + + if( isChanged ){ + /* If a new wal-index header was loaded before the checkpoint was + ** performed, then the pager-cache associated with pWal is now + ** out of date. So zero the cached wal-index header to ensure that + ** next time the pager opens a snapshot on this database it knows that + ** the cache needs to be reset. + */ + memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); + } + + walDisableBlocking(pWal); + sqlite3WalDb(pWal, 0); + + /* Release the locks. */ + sqlite3WalEndWriteTransaction(pWal); + if( pWal->ckptLock ){ + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + pWal->ckptLock = 0; + } + WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; +#endif + return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); +} + +/* Return the value to pass to a sqlite3_wal_hook callback, the +** number of frames in the WAL at the point of the last commit since +** sqlite3WalCallback() was called. If no commits have occurred since +** the last call, then return 0. +*/ +SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){ + u32 ret = 0; + if( pWal ){ + ret = pWal->iCallback; + pWal->iCallback = 0; + } + return (int)ret; +} + +/* +** This function is called to change the WAL subsystem into or out +** of locking_mode=EXCLUSIVE. +** +** If op is zero, then attempt to change from locking_mode=EXCLUSIVE +** into locking_mode=NORMAL. This means that we must acquire a lock +** on the pWal->readLock byte. If the WAL is already in locking_mode=NORMAL +** or if the acquisition of the lock fails, then return 0. If the +** transition out of exclusive-mode is successful, return 1. This +** operation must occur while the pager is still holding the exclusive +** lock on the main database file. +** +** If op is one, then change from locking_mode=NORMAL into +** locking_mode=EXCLUSIVE. This means that the pWal->readLock must +** be released. Return 1 if the transition is made and 0 if the +** WAL is already in exclusive-locking mode - meaning that this +** routine is a no-op. The pager must already hold the exclusive lock +** on the main database file before invoking this operation. +** +** If op is negative, then do a dry-run of the op==1 case but do +** not actually change anything. The pager uses this to see if it +** should acquire the database exclusive lock prior to invoking +** the op==1 case. +*/ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ + int rc; + assert( pWal->writeLock==0 ); + assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 ); + + /* pWal->readLock is usually set, but might be -1 if there was a + ** prior error while attempting to acquire are read-lock. This cannot + ** happen if the connection is actually in exclusive mode (as no xShmLock + ** locks are taken in this case). Nor should the pager attempt to + ** upgrade to exclusive-mode following such an error. + */ + assert( pWal->readLock>=0 || pWal->lockError ); + assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); + + if( op==0 ){ + if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){ + pWal->exclusiveMode = WAL_NORMAL_MODE; + if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + } + rc = pWal->exclusiveMode==WAL_NORMAL_MODE; + }else{ + /* Already in locking_mode=NORMAL */ + rc = 0; + } + }else if( op>0 ){ + assert( pWal->exclusiveMode==WAL_NORMAL_MODE ); + assert( pWal->readLock>=0 ); + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; + rc = 1; + }else{ + rc = pWal->exclusiveMode==WAL_NORMAL_MODE; + } + return rc; +} + +/* +** Return true if the argument is non-NULL and the WAL module is using +** heap-memory for the wal-index. Otherwise, if the argument is NULL or the +** WAL module is using shared-memory, return false. +*/ +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){ + return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* Create a snapshot object. The content of a snapshot is opaque to +** every other subsystem, so the WAL module can put whatever it needs +** in the object. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_OK; + WalIndexHdr *pRet; + static const u32 aZero[4] = { 0, 0, 0, 0 }; + + assert( pWal->readLock>=0 && pWal->writeLock==0 ); + + if( memcmp(&pWal->hdr.aFrameCksum[0],aZero,16)==0 ){ + *ppSnapshot = 0; + return SQLITE_ERROR; + } + pRet = (WalIndexHdr*)sqlite3_malloc(sizeof(WalIndexHdr)); + if( pRet==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memcpy(pRet, &pWal->hdr, sizeof(WalIndexHdr)); + *ppSnapshot = (sqlite3_snapshot*)pRet; + } + + return rc; +} + +/* Try to open on pSnapshot when the next read-transaction starts +*/ +SQLITE_PRIVATE void sqlite3WalSnapshotOpen( + Wal *pWal, + sqlite3_snapshot *pSnapshot +){ + pWal->pSnapshot = (WalIndexHdr*)pSnapshot; +} + +/* +** Return a +ve value if snapshot p1 is newer than p2. A -ve value if +** p1 is older than p2 and zero if p1 and p2 are the same snapshot. +*/ +SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ + WalIndexHdr *pHdr1 = (WalIndexHdr*)p1; + WalIndexHdr *pHdr2 = (WalIndexHdr*)p2; + + /* aSalt[0] is a copy of the value stored in the wal file header. It + ** is incremented each time the wal file is restarted. */ + if( pHdr1->aSalt[0]aSalt[0] ) return -1; + if( pHdr1->aSalt[0]>pHdr2->aSalt[0] ) return +1; + if( pHdr1->mxFramemxFrame ) return -1; + if( pHdr1->mxFrame>pHdr2->mxFrame ) return +1; + return 0; +} + +/* +** The caller currently has a read transaction open on the database. +** This function takes a SHARED lock on the CHECKPOINTER slot and then +** checks if the snapshot passed as the second argument is still +** available. If so, SQLITE_OK is returned. +** +** If the snapshot is not available, SQLITE_ERROR is returned. Or, if +** the CHECKPOINTER lock cannot be obtained, SQLITE_BUSY. If any error +** occurs (any value other than SQLITE_OK is returned), the CHECKPOINTER +** lock is released before returning. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot){ + int rc; + rc = walLockShared(pWal, WAL_CKPT_LOCK); + if( rc==SQLITE_OK ){ + WalIndexHdr *pNew = (WalIndexHdr*)pSnapshot; + if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + || pNew->mxFramenBackfillAttempted + ){ + rc = SQLITE_ERROR_SNAPSHOT; + walUnlockShared(pWal, WAL_CKPT_LOCK); + } + } + return rc; +} + +/* +** Release a lock obtained by an earlier successful call to +** sqlite3WalSnapshotCheck(). +*/ +SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal){ + assert( pWal ); + walUnlockShared(pWal, WAL_CKPT_LOCK); +} + + +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifdef SQLITE_ENABLE_ZIPVFS +/* +** If the argument is not NULL, it points to a Wal object that holds a +** read-lock. This function returns the database page-size if it is known, +** or zero if it is not (or if pWal is NULL). +*/ +SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){ + assert( pWal==0 || pWal->readLock>=0 ); + return (pWal ? pWal->szPage : 0); +} +#endif + +/* Return the sqlite3_file object for the WAL file +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ + return pWal->pWalFd; +} + +#endif /* #ifndef SQLITE_OMIT_WAL */ + +/************** End of wal.c *************************************************/ +/************** Begin file btmutex.c *****************************************/ +/* +** 2007 August 27 +** +** 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 contains code used to implement mutexes on Btree objects. +** This code really belongs in btree.c. But btree.c is getting too +** big and we want to break it down some. This packaged seemed like +** a good breakout. +*/ +/************** Include btreeInt.h in the middle of btmutex.c ****************/ +/************** Begin file btreeInt.h ****************************************/ +/* +** 2004 April 6 +** +** 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 an external (disk-based) database using BTrees. +** For a detailed discussion of BTrees, refer to +** +** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: +** "Sorting And Searching", pages 473-480. Addison-Wesley +** Publishing Company, Reading, Massachusetts. +** +** The basic idea is that each page of the file contains N database +** entries and N+1 pointers to subpages. +** +** ---------------------------------------------------------------- +** | Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) | +** ---------------------------------------------------------------- +** +** All of the keys on the page that Ptr(0) points to have values less +** than Key(0). All of the keys on page Ptr(1) and its subpages have +** values greater than Key(0) and less than Key(1). All of the keys +** on Ptr(N) and its subpages have values greater than Key(N-1). And +** so forth. +** +** Finding a particular key requires reading O(log(M)) pages from the +** disk where M is the number of entries in the tree. +** +** In this implementation, a single file can hold one or more separate +** BTrees. Each BTree is identified by the index of its root page. The +** key and data for any entry are combined to form the "payload". A +** fixed amount of payload can be carried directly on the database +** page. If the payload is larger than the preset amount then surplus +** bytes are stored on overflow pages. The payload for an entry +** and the preceding pointer are combined to form a "Cell". Each +** page has a small header which contains the Ptr(N) pointer and other +** information such as the size of key and data. +** +** FORMAT DETAILS +** +** The file is divided into pages. The first page is called page 1, +** the second is page 2, and so forth. A page number of zero indicates +** "no such page". The page size can be any power of 2 between 512 and 65536. +** Each page can be either a btree page, a freelist page, an overflow +** page, or a pointer-map page. +** +** The first page is always a btree page. The first 100 bytes of the first +** page contain a special header (the "file header") that describes the file. +** The format of the file header is as follows: +** +** OFFSET SIZE DESCRIPTION +** 0 16 Header string: "SQLite format 3\000" +** 16 2 Page size in bytes. (1 means 65536) +** 18 1 File format write version +** 19 1 File format read version +** 20 1 Bytes of unused space at the end of each page +** 21 1 Max embedded payload fraction (must be 64) +** 22 1 Min embedded payload fraction (must be 32) +** 23 1 Min leaf payload fraction (must be 32) +** 24 4 File change counter +** 28 4 Reserved for future use +** 32 4 First freelist page +** 36 4 Number of freelist pages in the file +** 40 60 15 4-byte meta values passed to higher layers +** +** 40 4 Schema cookie +** 44 4 File format of schema layer +** 48 4 Size of page cache +** 52 4 Largest root-page (auto/incr_vacuum) +** 56 4 1=UTF-8 2=UTF16le 3=UTF16be +** 60 4 User version +** 64 4 Incremental vacuum mode +** 68 4 Application-ID +** 72 20 unused +** 92 4 The version-valid-for number +** 96 4 SQLITE_VERSION_NUMBER +** +** All of the integer values are big-endian (most significant byte first). +** +** The file change counter is incremented when the database is changed +** This counter allows other processes to know when the file has changed +** and thus when they need to flush their cache. +** +** The max embedded payload fraction is the amount of the total usable +** space in a page that can be consumed by a single cell for standard +** B-tree (non-LEAFDATA) tables. A value of 255 means 100%. The default +** is to limit the maximum cell size so that at least 4 cells will fit +** on one page. Thus the default max embedded payload fraction is 64. +** +** If the payload for a cell is larger than the max payload, then extra +** payload is spilled to overflow pages. Once an overflow page is allocated, +** as many bytes as possible are moved into the overflow pages without letting +** the cell size drop below the min embedded payload fraction. +** +** The min leaf payload fraction is like the min embedded payload fraction +** except that it applies to leaf nodes in a LEAFDATA tree. The maximum +** payload fraction for a LEAFDATA tree is always 100% (or 255) and it +** not specified in the header. +** +** Each btree pages is divided into three sections: The header, the +** cell pointer array, and the cell content area. Page 1 also has a 100-byte +** file header that occurs before the page header. +** +** |----------------| +** | file header | 100 bytes. Page 1 only. +** |----------------| +** | page header | 8 bytes for leaves. 12 bytes for interior nodes +** |----------------| +** | cell pointer | | 2 bytes per cell. Sorted order. +** | array | | Grows downward +** | | v +** |----------------| +** | unallocated | +** | space | +** |----------------| ^ Grows upwards +** | cell content | | Arbitrary order interspersed with freeblocks. +** | area | | and free space fragments. +** |----------------| +** +** The page headers looks like this: +** +** OFFSET SIZE DESCRIPTION +** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf +** 1 2 byte offset to the first freeblock +** 3 2 number of cells on this page +** 5 2 first byte of the cell content area +** 7 1 number of fragmented free bytes +** 8 4 Right child (the Ptr(N) value). Omitted on leaves. +** +** The flags define the format of this btree page. The leaf flag means that +** this page has no children. The zerodata flag means that this page carries +** only keys and no data. The intkey flag means that the key is an integer +** which is stored in the key size entry of the cell header rather than in +** the payload area. +** +** The cell pointer array begins on the first byte after the page header. +** The cell pointer array contains zero or more 2-byte numbers which are +** offsets from the beginning of the page to the cell content in the cell +** content area. The cell pointers occur in sorted order. The system strives +** to keep free space after the last cell pointer so that new cells can +** be easily added without having to defragment the page. +** +** Cell content is stored at the very end of the page and grows toward the +** beginning of the page. +** +** Unused space within the cell content area is collected into a linked list of +** freeblocks. Each freeblock is at least 4 bytes in size. The byte offset +** to the first freeblock is given in the header. Freeblocks occur in +** increasing order. Because a freeblock must be at least 4 bytes in size, +** any group of 3 or fewer unused bytes in the cell content area cannot +** exist on the freeblock chain. A group of 3 or fewer free bytes is called +** a fragment. The total number of bytes in all fragments is recorded. +** in the page header at offset 7. +** +** SIZE DESCRIPTION +** 2 Byte offset of the next freeblock +** 2 Bytes in this freeblock +** +** Cells are of variable length. Cells are stored in the cell content area at +** the end of the page. Pointers to the cells are in the cell pointer array +** that immediately follows the page header. Cells is not necessarily +** contiguous or in order, but cell pointers are contiguous and in order. +** +** Cell content makes use of variable length integers. A variable +** length integer is 1 to 9 bytes where the lower 7 bits of each +** byte are used. The integer consists of all bytes that have bit 8 set and +** the first byte with bit 8 clear. The most significant byte of the integer +** appears first. A variable-length integer may not be more than 9 bytes long. +** As a special case, all 8 bytes of the 9th byte are used as data. This +** allows a 64-bit integer to be encoded in 9 bytes. +** +** 0x00 becomes 0x00000000 +** 0x7f becomes 0x0000007f +** 0x81 0x00 becomes 0x00000080 +** 0x82 0x00 becomes 0x00000100 +** 0x80 0x7f becomes 0x0000007f +** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678 +** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081 +** +** Variable length integers are used for rowids and to hold the number of +** bytes of key and data in a btree cell. +** +** The content of a cell looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of the left child. Omitted if leaf flag is set. +** var Number of bytes of data. Omitted if the zerodata flag is set. +** var Number of bytes of key. Or the key itself if intkey flag is set. +** * Payload +** 4 First page of the overflow chain. Omitted if no overflow +** +** Overflow pages form a linked list. Each page except the last is completely +** filled with data (pagesize - 4 bytes). The last page can have as little +** as 1 byte of data. +** +** SIZE DESCRIPTION +** 4 Page number of next overflow page +** * Data +** +** Freelist pages come in two subtypes: trunk pages and leaf pages. The +** file header points to the first in a linked list of trunk page. Each trunk +** page points to multiple leaf pages. The content of a leaf page is +** unspecified. A trunk page looks like this: +** +** SIZE DESCRIPTION +** 4 Page number of next trunk page +** 4 Number of leaf pointers on this page +** * zero or more pages numbers of leaves +*/ +/* #include "sqliteInt.h" */ + + +/* The following value is the maximum cell size assuming a maximum page +** size give above. +*/ +#define MX_CELL_SIZE(pBt) ((int)(pBt->pageSize-8)) + +/* The maximum number of cells on a single page of the database. This +** assumes a minimum cell size of 6 bytes (4 bytes for the cell itself +** plus 2 bytes for the index to the cell in the page header). Such +** small cells will be rare, but they are possible. +*/ +#define MX_CELL(pBt) ((pBt->pageSize-8)/6) + +/* Forward declarations */ +typedef struct MemPage MemPage; +typedef struct BtLock BtLock; +typedef struct CellInfo CellInfo; + +/* +** This is a magic string that appears at the beginning of every +** SQLite database in order to identify the file as a real database. +** +** You can change this value at compile-time by specifying a +** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The +** header must be exactly 16 bytes including the zero-terminator so +** the string itself should be 15 characters long. If you change +** the header, then your custom library will not be able to read +** databases generated by the standard tools and the standard tools +** will not be able to read databases created by your custom library. +*/ +#ifndef SQLITE_FILE_HEADER /* 123456789 123456 */ +# define SQLITE_FILE_HEADER "SQLite format 3" +#endif + +/* +** Page type flags. An ORed combination of these flags appear as the +** first byte of on-disk image of every BTree page. +*/ +#define PTF_INTKEY 0x01 +#define PTF_ZERODATA 0x02 +#define PTF_LEAFDATA 0x04 +#define PTF_LEAF 0x08 + +/* +** An instance of this object stores information about each a single database +** page that has been loaded into memory. The information in this object +** is derived from the raw on-disk page content. +** +** As each database page is loaded into memory, the pager allocats an +** instance of this object and zeros the first 8 bytes. (This is the +** "extra" information associated with each page of the pager.) +** +** Access to all fields of this structure is controlled by the mutex +** stored in MemPage.pBt->mutex. +*/ +struct MemPage { + u8 isInit; /* True if previously initialized. MUST BE FIRST! */ + u8 intKey; /* True if table b-trees. False for index b-trees */ + u8 intKeyLeaf; /* True if the leaf of an intKey table */ + Pgno pgno; /* Page number for this page */ + /* Only the first 8 bytes (above) are zeroed by pager.c when a new page + ** is allocated. All fields that follow must be initialized before use */ + u8 leaf; /* True if a leaf page */ + u8 hdrOffset; /* 100 for page 1. 0 otherwise */ + u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ + u8 max1bytePayload; /* min(maxLocal,127) */ + u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ + u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ + u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ + u16 cellOffset; /* Index in aData of first cell pointer */ + int nFree; /* Number of free bytes on the page. -1 for unknown */ + u16 nCell; /* Number of cells on this page, local and ovfl */ + u16 maskPage; /* Mask for page offset */ + u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th + ** non-overflow cell */ + u8 *apOvfl[4]; /* Pointers to the body of overflow cells */ + BtShared *pBt; /* Pointer to BtShared that this page is part of */ + u8 *aData; /* Pointer to disk image of the page data */ + u8 *aDataEnd; /* One byte past the end of the entire page - not just + ** the usable space, the entire page. Used to prevent + ** corruption-induced buffer overflow. */ + u8 *aCellIdx; /* The cell index area */ + u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ + DbPage *pDbPage; /* Pager page handle */ + u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ + void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ +}; + +/* +** A linked list of the following structures is stored at BtShared.pLock. +** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor +** is opened on the table with root page BtShared.iTable. Locks are removed +** from this list when a transaction is committed or rolled back, or when +** a btree handle is closed. +*/ +struct BtLock { + Btree *pBtree; /* Btree handle holding this lock */ + Pgno iTable; /* Root page of table */ + u8 eLock; /* READ_LOCK or WRITE_LOCK */ + BtLock *pNext; /* Next in BtShared.pLock list */ +}; + +/* Candidate values for BtLock.eLock */ +#define READ_LOCK 1 +#define WRITE_LOCK 2 + +/* A Btree handle +** +** A database connection contains a pointer to an instance of +** this object for every database file that it has open. This structure +** is opaque to the database connection. The database connection cannot +** see the internals of this structure and only deals with pointers to +** this structure. +** +** For some database files, the same underlying database cache might be +** shared between multiple connections. In that case, each connection +** has it own instance of this object. But each instance of this object +** points to the same BtShared object. The database cache and the +** schema associated with the database file are all contained within +** the BtShared object. +** +** All fields in this structure are accessed under sqlite3.mutex. +** The pBt pointer itself may not be changed while there exists cursors +** in the referenced BtShared that point back to this Btree since those +** cursors have to go through this Btree to find their BtShared and +** they often do so without holding sqlite3.mutex. +*/ +struct Btree { + sqlite3 *db; /* The database connection holding this btree */ + BtShared *pBt; /* Sharable content of this btree */ + u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */ + u8 sharable; /* True if we can share pBt with another db */ + u8 locked; /* True if db currently has pBt locked */ + u8 hasIncrblobCur; /* True if there are one or more Incrblob cursors */ + int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */ + int nBackup; /* Number of backup operations reading this btree */ + u32 iBDataVersion; /* Combines with pBt->pPager->iDataVersion */ + Btree *pNext; /* List of other sharable Btrees from the same db */ + Btree *pPrev; /* Back pointer of the same list */ +#ifdef SQLITE_DEBUG + u64 nSeek; /* Calls to sqlite3BtreeMovetoUnpacked() */ +#endif +#ifndef SQLITE_OMIT_SHARED_CACHE + BtLock lock; /* Object used to lock page 1 */ +#endif +}; + +/* +** Btree.inTrans may take one of the following values. +** +** If the shared-data extension is enabled, there may be multiple users +** of the Btree structure. At most one of these may open a write transaction, +** but any number may have active read transactions. +** +** These values must match SQLITE_TXN_NONE, SQLITE_TXN_READ, and +** SQLITE_TXN_WRITE +*/ +#define TRANS_NONE 0 +#define TRANS_READ 1 +#define TRANS_WRITE 2 + +#if TRANS_NONE!=SQLITE_TXN_NONE +# error wrong numeric code for no-transaction +#endif +#if TRANS_READ!=SQLITE_TXN_READ +# error wrong numeric code for read-transaction +#endif +#if TRANS_WRITE!=SQLITE_TXN_WRITE +# error wrong numeric code for write-transaction +#endif + + +/* +** An instance of this object represents a single database file. +** +** A single database file can be in use at the same time by two +** or more database connections. When two or more connections are +** sharing the same database file, each connection has it own +** private Btree object for the file and each of those Btrees points +** to this one BtShared object. BtShared.nRef is the number of +** connections currently sharing this database file. +** +** Fields in this structure are accessed under the BtShared.mutex +** mutex, except for nRef and pNext which are accessed under the +** global SQLITE_MUTEX_STATIC_MAIN mutex. The pPager field +** may not be modified once it is initially set as long as nRef>0. +** The pSchema field may be set once under BtShared.mutex and +** thereafter is unchanged as long as nRef>0. +** +** isPending: +** +** If a BtShared client fails to obtain a write-lock on a database +** table (because there exists one or more read-locks on the table), +** the shared-cache enters 'pending-lock' state and isPending is +** set to true. +** +** The shared-cache leaves the 'pending lock' state when either of +** the following occur: +** +** 1) The current writer (BtShared.pWriter) concludes its transaction, OR +** 2) The number of locks held by other connections drops to zero. +** +** while in the 'pending-lock' state, no connection may start a new +** transaction. +** +** This feature is included to help prevent writer-starvation. +*/ +struct BtShared { + Pager *pPager; /* The page cache */ + sqlite3 *db; /* Database connection currently using this Btree */ + BtCursor *pCursor; /* A list of all open cursors */ + MemPage *pPage1; /* First page of the database */ + u8 openFlags; /* Flags to sqlite3BtreeOpen() */ +#ifndef SQLITE_OMIT_AUTOVACUUM + u8 autoVacuum; /* True if auto-vacuum is enabled */ + u8 incrVacuum; /* True if incr-vacuum is enabled */ + u8 bDoTruncate; /* True to truncate db on commit */ +#endif + u8 inTransaction; /* Transaction state */ + u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ + u8 nReserveWanted; /* Desired number of extra bytes per page */ + u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ + u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ + u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ + u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */ + u16 minLeaf; /* Minimum local payload in a LEAFDATA table */ + u32 pageSize; /* Total number of bytes on a page */ + u32 usableSize; /* Number of usable bytes on each page */ + int nTransaction; /* Number of open transactions (read + write) */ + u32 nPage; /* Number of pages in the database */ + void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */ + void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */ + sqlite3_mutex *mutex; /* Non-recursive mutex required to access this object */ + Bitvec *pHasContent; /* Set of pages moved to free-list this transaction */ +#ifndef SQLITE_OMIT_SHARED_CACHE + int nRef; /* Number of references to this structure */ + BtShared *pNext; /* Next on a list of sharable BtShared structs */ + BtLock *pLock; /* List of locks held on this shared-btree struct */ + Btree *pWriter; /* Btree with currently open write transaction */ +#endif + u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ + int nPreformatSize; /* Size of last cell written by TransferRow() */ +}; + +/* +** Allowed values for BtShared.btsFlags +*/ +#define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */ +#define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */ +#define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */ +#define BTS_OVERWRITE 0x0008 /* Overwrite deleted content with zeros */ +#define BTS_FAST_SECURE 0x000c /* Combination of the previous two */ +#define BTS_INITIALLY_EMPTY 0x0010 /* Database was empty at trans start */ +#define BTS_NO_WAL 0x0020 /* Do not open write-ahead-log files */ +#define BTS_EXCLUSIVE 0x0040 /* pWriter has an exclusive lock */ +#define BTS_PENDING 0x0080 /* Waiting for read-locks to clear */ + +/* +** An instance of the following structure is used to hold information +** about a cell. The parseCellPtr() function fills in this structure +** based on information extract from the raw disk page. +*/ +struct CellInfo { + i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ + u8 *pPayload; /* Pointer to the start of payload */ + u32 nPayload; /* Bytes of payload */ + u16 nLocal; /* Amount of payload held locally, not on overflow */ + u16 nSize; /* Size of the cell content on the main b-tree page */ +}; + +/* +** Maximum depth of an SQLite B-Tree structure. Any B-Tree deeper than +** this will be declared corrupt. This value is calculated based on a +** maximum database size of 2^31 pages a minimum fanout of 2 for a +** root-node and 3 for all other internal nodes. +** +** If a tree that appears to be taller than this is encountered, it is +** assumed that the database is corrupt. +*/ +#define BTCURSOR_MAX_DEPTH 20 + +/* +** A cursor is a pointer to a particular entry within a particular +** b-tree within a database file. +** +** The entry is identified by its MemPage and the index in +** MemPage.aCell[] of the entry. +** +** A single database file can be shared by two more database connections, +** but cursors cannot be shared. Each cursor is associated with a +** particular database connection identified BtCursor.pBtree.db. +** +** Fields in this structure are accessed under the BtShared.mutex +** found at self->pBt->mutex. +** +** skipNext meaning: +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. +*/ +struct BtCursor { + u8 eState; /* One of the CURSOR_XXX constants (see below) */ + u8 curFlags; /* zero or more BTCF_* flags defined below */ + u8 curPagerFlags; /* Flags to send to sqlite3PagerGet() */ + u8 hints; /* As configured by CursorSetHints() */ + int skipNext; /* Prev() is noop if negative. Next() is noop if positive. + ** Error code if eState==CURSOR_FAULT */ + Btree *pBtree; /* The Btree to which this cursor belongs */ + Pgno *aOverflow; /* Cache of overflow page locations */ + void *pKey; /* Saved key that was cursor last known position */ + /* All fields above are zeroed when the cursor is allocated. See + ** sqlite3BtreeCursorZero(). Fields that follow must be manually + ** initialized. */ +#define BTCURSOR_FIRST_UNINIT pBt /* Name of first uninitialized field */ + BtShared *pBt; /* The BtShared this cursor points to */ + BtCursor *pNext; /* Forms a linked list of all cursors */ + CellInfo info; /* A parse of the cell we are pointing at */ + i64 nKey; /* Size of pKey, or last integer key */ + Pgno pgnoRoot; /* The root page of this tree */ + i8 iPage; /* Index of current page in apPage */ + u8 curIntKey; /* Value of apPage[0]->intKey */ + u16 ix; /* Current index for apPage[iPage] */ + u16 aiIdx[BTCURSOR_MAX_DEPTH-1]; /* Current index in apPage[i] */ + struct KeyInfo *pKeyInfo; /* Arg passed to comparison function */ + MemPage *pPage; /* Current page */ + MemPage *apPage[BTCURSOR_MAX_DEPTH-1]; /* Stack of parents of current page */ +}; + +/* +** Legal values for BtCursor.curFlags +*/ +#define BTCF_WriteFlag 0x01 /* True if a write cursor */ +#define BTCF_ValidNKey 0x02 /* True if info.nKey is valid */ +#define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */ +#define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ +#define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ +#define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ +#define BTCF_Pinned 0x40 /* Cursor is busy and cannot be moved */ + +/* +** Potential values for BtCursor.eState. +** +** CURSOR_INVALID: +** Cursor does not point to a valid entry. This can happen (for example) +** because the table is empty or because BtreeCursorFirst() has not been +** called. +** +** CURSOR_VALID: +** Cursor points to a valid entry. getPayload() etc. may be called. +** +** CURSOR_SKIPNEXT: +** Cursor is valid except that the Cursor.skipNext field is non-zero +** indicating that the next sqlite3BtreeNext() or sqlite3BtreePrevious() +** operation should be a no-op. +** +** CURSOR_REQUIRESEEK: +** The table that this cursor was opened on still exists, but has been +** modified since the cursor was last used. The cursor position is saved +** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in +** this state, restoreCursorPosition() can be called to attempt to +** seek the cursor to the saved position. +** +** CURSOR_FAULT: +** An unrecoverable error (an I/O error or a malloc failure) has occurred +** on a different connection that shares the BtShared cache with this +** cursor. The error has left the cache in an inconsistent state. +** Do nothing else with this cursor. Any attempt to use the cursor +** should return the error code stored in BtCursor.skipNext +*/ +#define CURSOR_VALID 0 +#define CURSOR_INVALID 1 +#define CURSOR_SKIPNEXT 2 +#define CURSOR_REQUIRESEEK 3 +#define CURSOR_FAULT 4 + +/* +** The database page the PENDING_BYTE occupies. This page is never used. +*/ +#define PENDING_BYTE_PAGE(pBt) ((Pgno)((PENDING_BYTE/((pBt)->pageSize))+1)) + +/* +** These macros define the location of the pointer-map entry for a +** database page. The first argument to each is the number of usable +** bytes on each page of the database (often 1024). The second is the +** page number to look up in the pointer map. +** +** PTRMAP_PAGENO returns the database page number of the pointer-map +** page that stores the required pointer. PTRMAP_PTROFFSET returns +** the offset of the requested map entry. +** +** If the pgno argument passed to PTRMAP_PAGENO is a pointer-map page, +** then pgno is returned. So (pgno==PTRMAP_PAGENO(pgsz, pgno)) can be +** used to test if pgno is a pointer-map page. PTRMAP_ISPAGE implements +** this test. +*/ +#define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno) +#define PTRMAP_PTROFFSET(pgptrmap, pgno) (5*(pgno-pgptrmap-1)) +#define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno)) + +/* +** The pointer map is a lookup table that identifies the parent page for +** each child page in the database file. The parent page is the page that +** contains a pointer to the child. Every page in the database contains +** 0 or 1 parent pages. (In this context 'database page' refers +** to any page that is not part of the pointer map itself.) Each pointer map +** entry consists of a single byte 'type' and a 4 byte parent page number. +** The PTRMAP_XXX identifiers below are the valid types. +** +** The purpose of the pointer map is to facility moving pages from one +** position in the file to another as part of autovacuum. When a page +** is moved, the pointer in its parent must be updated to point to the +** new location. The pointer map is used to locate the parent page quickly. +** +** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not +** used in this case. +** +** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number +** is not used in this case. +** +** PTRMAP_OVERFLOW1: The database page is the first page in a list of +** overflow pages. The page number identifies the page that +** contains the cell with a pointer to this overflow page. +** +** PTRMAP_OVERFLOW2: The database page is the second or later page in a list of +** overflow pages. The page-number identifies the previous +** page in the overflow page list. +** +** PTRMAP_BTREE: The database page is a non-root btree page. The page number +** identifies the parent page in the btree. +*/ +#define PTRMAP_ROOTPAGE 1 +#define PTRMAP_FREEPAGE 2 +#define PTRMAP_OVERFLOW1 3 +#define PTRMAP_OVERFLOW2 4 +#define PTRMAP_BTREE 5 + +/* A bunch of assert() statements to check the transaction state variables +** of handle p (type Btree*) are internally consistent. +*/ +#define btreeIntegrity(p) \ + assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \ + assert( p->pBt->inTransaction>=p->inTrans ); + + +/* +** The ISAUTOVACUUM macro is used within balance_nonroot() to determine +** if the database supports auto-vacuum or not. Because it is used +** within an expression that is an argument to another macro +** (sqliteMallocRaw), it is not possible to use conditional compilation. +** So, this macro is defined instead. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define ISAUTOVACUUM (pBt->autoVacuum) +#else +#define ISAUTOVACUUM 0 +#endif + + +/* +** This structure is passed around through all the sanity checking routines +** in order to keep track of some global state information. +** +** The aRef[] array is allocated so that there is 1 bit for each page in +** the database. As the integrity-check proceeds, for each page used in +** the database the corresponding bit is set. This allows integrity-check to +** detect pages that are used twice and orphaned pages (both of which +** indicate corruption). +*/ +typedef struct IntegrityCk IntegrityCk; +struct IntegrityCk { + BtShared *pBt; /* The tree being checked out */ + Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ + u8 *aPgRef; /* 1 bit per page in the db (see above) */ + Pgno nPage; /* Number of pages in the database */ + int mxErr; /* Stop accumulating errors when this reaches zero */ + int nErr; /* Number of messages written to zErrMsg so far */ + int bOomFault; /* A memory allocation error has occurred */ + const char *zPfx; /* Error message prefix */ + Pgno v1; /* Value for first %u substitution in zPfx */ + int v2; /* Value for second %d substitution in zPfx */ + StrAccum errMsg; /* Accumulate the error message text here */ + u32 *heap; /* Min-heap used for analyzing cell coverage */ + sqlite3 *db; /* Database connection running the check */ +}; + +/* +** Routines to read or write a two- and four-byte big-endian integer values. +*/ +#define get2byte(x) ((x)[0]<<8 | (x)[1]) +#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v)) +#define get4byte sqlite3Get4byte +#define put4byte sqlite3Put4byte + +/* +** get2byteAligned(), unlike get2byte(), requires that its argument point to a +** two-byte aligned address. get2bytea() is only used for accessing the +** cell addresses in a btree header. +*/ +#if SQLITE_BYTEORDER==4321 +# define get2byteAligned(x) (*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4008000 +# define get2byteAligned(x) __builtin_bswap16(*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +# define get2byteAligned(x) _byteswap_ushort(*(u16*)(x)) +#else +# define get2byteAligned(x) ((x)[0]<<8 | (x)[1]) +#endif + +/************** End of btreeInt.h ********************************************/ +/************** Continuing where we left off in btmutex.c ********************/ +#ifndef SQLITE_OMIT_SHARED_CACHE +#if SQLITE_THREADSAFE + +/* +** Obtain the BtShared mutex associated with B-Tree handle p. Also, +** set BtShared.db to the database handle associated with p and the +** p->locked boolean to true. +*/ +static void lockBtreeMutex(Btree *p){ + assert( p->locked==0 ); + assert( sqlite3_mutex_notheld(p->pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + + sqlite3_mutex_enter(p->pBt->mutex); + p->pBt->db = p->db; + p->locked = 1; +} + +/* +** Release the BtShared mutex associated with B-Tree handle p and +** clear the p->locked boolean. +*/ +static void SQLITE_NOINLINE unlockBtreeMutex(Btree *p){ + BtShared *pBt = p->pBt; + assert( p->locked==1 ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( sqlite3_mutex_held(p->db->mutex) ); + assert( p->db==pBt->db ); + + sqlite3_mutex_leave(pBt->mutex); + p->locked = 0; +} + +/* Forward reference */ +static void SQLITE_NOINLINE btreeLockCarefully(Btree *p); + +/* +** Enter a mutex on the given BTree object. +** +** If the object is not sharable, then no mutex is ever required +** and this routine is a no-op. The underlying mutex is non-recursive. +** But we keep a reference count in Btree.wantToLock so the behavior +** of this interface is recursive. +** +** To avoid deadlocks, multiple Btrees are locked in the same order +** by all database connections. The p->pNext is a list of other +** Btrees belonging to the same database connection as the p Btree +** which need to be locked after p. If we cannot get a lock on +** p, then first unlock all of the others on p->pNext, then wait +** for the lock to become available on p, then relock all of the +** subsequent Btrees that desire a lock. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + /* Some basic sanity checking on the Btree. The list of Btrees + ** connected by pNext and pPrev should be in sorted order by + ** Btree.pBt value. All elements of the list should belong to + ** the same connection. Only shared Btrees are on the list. */ + assert( p->pNext==0 || p->pNext->pBt>p->pBt ); + assert( p->pPrev==0 || p->pPrev->pBtpBt ); + assert( p->pNext==0 || p->pNext->db==p->db ); + assert( p->pPrev==0 || p->pPrev->db==p->db ); + assert( p->sharable || (p->pNext==0 && p->pPrev==0) ); + + /* Check for locking consistency */ + assert( !p->locked || p->wantToLock>0 ); + assert( p->sharable || p->wantToLock==0 ); + + /* We should already hold a lock on the database connection */ + assert( sqlite3_mutex_held(p->db->mutex) ); + + /* Unless the database is sharable and unlocked, then BtShared.db + ** should already be set correctly. */ + assert( (p->locked==0 && p->sharable) || p->pBt->db==p->db ); + + if( !p->sharable ) return; + p->wantToLock++; + if( p->locked ) return; + btreeLockCarefully(p); +} + +/* This is a helper function for sqlite3BtreeLock(). By moving +** complex, but seldom used logic, out of sqlite3BtreeLock() and +** into this routine, we avoid unnecessary stack pointer changes +** and thus help the sqlite3BtreeLock() routine to run much faster +** in the common case. +*/ +static void SQLITE_NOINLINE btreeLockCarefully(Btree *p){ + Btree *pLater; + + /* In most cases, we should be able to acquire the lock we + ** want without having to go through the ascending lock + ** procedure that follows. Just be sure not to block. + */ + if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){ + p->pBt->db = p->db; + p->locked = 1; + return; + } + + /* To avoid deadlock, first release all locks with a larger + ** BtShared address. Then acquire our lock. Then reacquire + ** the other BtShared locks that we used to hold in ascending + ** order. + */ + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + assert( pLater->sharable ); + assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt ); + assert( !pLater->locked || pLater->wantToLock>0 ); + if( pLater->locked ){ + unlockBtreeMutex(pLater); + } + } + lockBtreeMutex(p); + for(pLater=p->pNext; pLater; pLater=pLater->pNext){ + if( pLater->wantToLock ){ + lockBtreeMutex(pLater); + } + } +} + + +/* +** Exit the recursive mutex on a Btree. +*/ +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){ + assert( sqlite3_mutex_held(p->db->mutex) ); + if( p->sharable ){ + assert( p->wantToLock>0 ); + p->wantToLock--; + if( p->wantToLock==0 ){ + unlockBtreeMutex(p); + } + } +} + +#ifndef NDEBUG +/* +** Return true if the BtShared mutex is held on the btree, or if the +** B-Tree is not marked as sharable. +** +** This routine is used only from within assert() statements. +*/ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ + assert( p->sharable==0 || p->locked==0 || p->wantToLock>0 ); + assert( p->sharable==0 || p->locked==0 || p->db==p->pBt->db ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->pBt->mutex) ); + assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->db->mutex) ); + + return (p->sharable==0 || p->locked); +} +#endif + + +/* +** Enter the mutex on every Btree associated with a database +** connection. This is needed (for example) prior to parsing +** a statement since we will be comparing table and column names +** against all schemas and we do not want those schemas being +** reset out from under us. +** +** There is a corresponding leave-all procedures. +** +** Enter the mutexes in accending order by BtShared pointer address +** to avoid the possibility of deadlock when two threads with +** two or more btrees in common both try to lock all their btrees +** at the same instant. +*/ +static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){ + int i; + int skipOk = 1; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p && p->sharable ){ + sqlite3BtreeEnter(p); + skipOk = 0; + } + } + db->noSharedCache = skipOk; +} +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + if( db->noSharedCache==0 ) btreeEnterAll(db); +} +static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){ + int i; + Btree *p; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inDb; i++){ + p = db->aDb[i].pBt; + if( p ) sqlite3BtreeLeave(p); + } +} +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ + if( db->noSharedCache==0 ) btreeLeaveAll(db); +} + +#ifndef NDEBUG +/* +** Return true if the current thread holds the database connection +** mutex and all required BtShared mutexes. +** +** This routine is used inside assert() statements only. +*/ +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ + int i; + if( !sqlite3_mutex_held(db->mutex) ){ + return 0; + } + for(i=0; inDb; i++){ + Btree *p; + p = db->aDb[i].pBt; + if( p && p->sharable && + (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){ + return 0; + } + } + return 1; +} +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Return true if the correct mutexes are held for accessing the +** db->aDb[iDb].pSchema structure. The mutexes required for schema +** access are: +** +** (1) The mutex on db +** (2) if iDb!=1, then the mutex on db->aDb[iDb].pBt. +** +** If pSchema is not NULL, then iDb is computed from pSchema and +** db using sqlite3SchemaToIndex(). +*/ +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){ + Btree *p; + assert( db!=0 ); + if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema); + assert( iDb>=0 && iDbnDb ); + if( !sqlite3_mutex_held(db->mutex) ) return 0; + if( iDb==1 ) return 1; + p = db->aDb[iDb].pBt; + assert( p!=0 ); + return p->sharable==0 || p->locked==1; +} +#endif /* NDEBUG */ + +#else /* SQLITE_THREADSAFE>0 above. SQLITE_THREADSAFE==0 below */ +/* +** The following are special cases for mutex enter routines for use +** in single threaded applications that use shared cache. Except for +** these two routines, all mutex operations are no-ops in that case and +** are null #defines in btree.h. +** +** If shared cache is disabled, then all btree mutex routines, including +** the ones below, are no-ops and are null #defines in btree.h. +*/ + +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ + p->pBt->db = p->db; +} +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + int i; + for(i=0; inDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + p->pBt->db = p->db; + } + } +} +#endif /* if SQLITE_THREADSAFE */ + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Enter a mutex on a Btree given a cursor owned by that Btree. +** +** These entry points are used by incremental I/O only. Enter() is required +** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not +** the build is threadsafe. Leave() is only required by threadsafe builds. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){ + sqlite3BtreeEnter(pCur->pBtree); +} +# if SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ + sqlite3BtreeLeave(pCur->pBtree); +} +# endif +#endif /* ifndef SQLITE_OMIT_INCRBLOB */ + +#endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ + +/************** End of btmutex.c *********************************************/ +/************** Begin file btree.c *******************************************/ +/* +** 2004 April 6 +** +** 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 an external (disk-based) database using BTrees. +** See the header comment on "btreeInt.h" for additional information. +** Including a description of file format and an overview of operation. +*/ +/* #include "btreeInt.h" */ + +/* +** The header string that appears at the beginning of every +** SQLite database. +*/ +static const char zMagicHeader[] = SQLITE_FILE_HEADER; + +/* +** Set this global variable to 1 to enable tracing using the TRACE +** macro. +*/ +#if 0 +int sqlite3BtreeTrace=1; /* True to enable tracing */ +# define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);} +#else +# define TRACE(X) +#endif + +/* +** Extract a 2-byte big-endian integer from an array of unsigned bytes. +** But if the value is zero, make it 65536. +** +** This routine is used to extract the "offset to cell content area" value +** from the header of a btree page. If the page size is 65536 and the page +** is empty, the offset should be 65536, but the 2-byte value stores zero. +** This routine makes the necessary adjustment to 65536. +*/ +#define get2byteNotZero(X) (((((int)get2byte(X))-1)&0xffff)+1) + +/* +** Values passed as the 5th argument to allocateBtreePage() +*/ +#define BTALLOC_ANY 0 /* Allocate any page */ +#define BTALLOC_EXACT 1 /* Allocate exact page if possible */ +#define BTALLOC_LE 2 /* Allocate any page <= the parameter */ + +/* +** Macro IfNotOmitAV(x) returns (x) if SQLITE_OMIT_AUTOVACUUM is not +** defined, or 0 if it is. For example: +** +** bIncrVacuum = IfNotOmitAV(pBtShared->incrVacuum); +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +#define IfNotOmitAV(expr) (expr) +#else +#define IfNotOmitAV(expr) 0 +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** A list of BtShared objects that are eligible for participation +** in shared cache. This variable has file scope during normal builds, +** but the test harness needs to access it so we make it global for +** test builds. +** +** Access to this variable is protected by SQLITE_MUTEX_STATIC_MAIN. +*/ +#ifdef SQLITE_TEST +SQLITE_PRIVATE BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +#else +static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +#endif +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Enable or disable the shared pager and schema features. +** +** This routine has no effect on existing database connections. +** The shared cache setting effects only future calls to +** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). +*/ +SQLITE_API int sqlite3_enable_shared_cache(int enable){ + sqlite3GlobalConfig.sharedCacheEnabled = enable; + return SQLITE_OK; +} +#endif + + + +#ifdef SQLITE_OMIT_SHARED_CACHE + /* + ** The functions querySharedCacheTableLock(), setSharedCacheTableLock(), + ** and clearAllSharedCacheTableLocks() + ** manipulate entries in the BtShared.pLock linked list used to store + ** shared-cache table level locks. If the library is compiled with the + ** shared-cache feature disabled, then there is only ever one user + ** of each BtShared structure and so this locking is not necessary. + ** So define the lock related functions as no-ops. + */ + #define querySharedCacheTableLock(a,b,c) SQLITE_OK + #define setSharedCacheTableLock(a,b,c) SQLITE_OK + #define clearAllSharedCacheTableLocks(a) + #define downgradeAllSharedCacheTableLocks(a) + #define hasSharedCacheTableLock(a,b,c,d) 1 + #define hasReadConflicts(a, b) 0 +#endif + +#ifdef SQLITE_DEBUG +/* +** Return and reset the seek counter for a Btree object. +*/ +SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree *pBt){ + u64 n = pBt->nSeek; + pBt->nSeek = 0; + return n; +} +#endif + +/* +** Implementation of the SQLITE_CORRUPT_PAGE() macro. Takes a single +** (MemPage*) as an argument. The (MemPage*) must not be NULL. +** +** If SQLITE_DEBUG is not defined, then this macro is equivalent to +** SQLITE_CORRUPT_BKPT. Or, if SQLITE_DEBUG is set, then the log message +** normally produced as a side-effect of SQLITE_CORRUPT_BKPT is augmented +** with the page number and filename associated with the (MemPage*). +*/ +#ifdef SQLITE_DEBUG +int corruptPageError(int lineno, MemPage *p){ + char *zMsg; + sqlite3BeginBenignMalloc(); + zMsg = sqlite3_mprintf("database corruption page %d of %s", + (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0) + ); + sqlite3EndBenignMalloc(); + if( zMsg ){ + sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); + } + sqlite3_free(zMsg); + return SQLITE_CORRUPT_BKPT; +} +# define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage) +#else +# define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno) +#endif + +#ifndef SQLITE_OMIT_SHARED_CACHE + +#ifdef SQLITE_DEBUG +/* +**** This function is only used as part of an assert() statement. *** +** +** Check to see if pBtree holds the required locks to read or write to the +** table with root page iRoot. Return 1 if it does and 0 if not. +** +** For example, when writing to a table with root-page iRoot via +** Btree connection pBtree: +** +** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) ); +** +** When writing to an index that resides in a sharable database, the +** caller should have first obtained a lock specifying the root page of +** the corresponding table. This makes things a bit more complicated, +** as this module treats each table as a separate structure. To determine +** the table corresponding to the index being written, this +** function has to search through the database schema. +** +** Instead of a lock on the table/index rooted at page iRoot, the caller may +** hold a write-lock on the schema table (root page 1). This is also +** acceptable. +*/ +static int hasSharedCacheTableLock( + Btree *pBtree, /* Handle that must hold lock */ + Pgno iRoot, /* Root page of b-tree */ + int isIndex, /* True if iRoot is the root of an index b-tree */ + int eLockType /* Required lock type (READ_LOCK or WRITE_LOCK) */ +){ + Schema *pSchema = (Schema *)pBtree->pBt->pSchema; + Pgno iTab = 0; + BtLock *pLock; + + /* If this database is not shareable, or if the client is reading + ** and has the read-uncommitted flag set, then no lock is required. + ** Return true immediately. + */ + if( (pBtree->sharable==0) + || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommit)) + ){ + return 1; + } + + /* If the client is reading or writing an index and the schema is + ** not loaded, then it is too difficult to actually check to see if + ** the correct locks are held. So do not bother - just return true. + ** This case does not come up very often anyhow. + */ + if( isIndex && (!pSchema || (pSchema->schemaFlags&DB_SchemaLoaded)==0) ){ + return 1; + } + + /* Figure out the root-page that the lock should be held on. For table + ** b-trees, this is just the root page of the b-tree being read or + ** written. For index b-trees, it is the root page of the associated + ** table. */ + if( isIndex ){ + HashElem *p; + int bSeen = 0; + for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ + Index *pIdx = (Index *)sqliteHashData(p); + if( pIdx->tnum==iRoot ){ + if( bSeen ){ + /* Two or more indexes share the same root page. There must + ** be imposter tables. So just return true. The assert is not + ** useful in that case. */ + return 1; + } + iTab = pIdx->pTable->tnum; + bSeen = 1; + } + } + }else{ + iTab = iRoot; + } + + /* Search for the required lock. Either a write-lock on root-page iTab, a + ** write-lock on the schema table, or (if the client is reading) a + ** read-lock on iTab will suffice. Return 1 if any of these are found. */ + for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){ + if( pLock->pBtree==pBtree + && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1)) + && pLock->eLock>=eLockType + ){ + return 1; + } + } + + /* Failed to find the required lock. */ + return 0; +} +#endif /* SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +**** This function may be used as part of assert() statements only. **** +** +** Return true if it would be illegal for pBtree to write into the +** table or index rooted at iRoot because other shared connections are +** simultaneously reading that same table or index. +** +** It is illegal for pBtree to write if some other Btree object that +** shares the same BtShared object is currently reading or writing +** the iRoot table. Except, if the other Btree object has the +** read-uncommitted flag set, then it is OK for the other object to +** have a read cursor. +** +** For example, before writing to any part of the table or index +** rooted at page iRoot, one should call: +** +** assert( !hasReadConflicts(pBtree, iRoot) ); +*/ +static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ + BtCursor *p; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( p->pgnoRoot==iRoot + && p->pBtree!=pBtree + && 0==(p->pBtree->db->flags & SQLITE_ReadUncommit) + ){ + return 1; + } + } + return 0; +} +#endif /* #ifdef SQLITE_DEBUG */ + +/* +** Query to see if Btree handle p may obtain a lock of type eLock +** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return +** SQLITE_OK if the lock may be obtained (by calling +** setSharedCacheTableLock()), or SQLITE_LOCKED if not. +*/ +static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); + assert( p->db!=0 ); + assert( !(p->db->flags&SQLITE_ReadUncommit)||eLock==WRITE_LOCK||iTab==1 ); + + /* If requesting a write-lock, then the Btree must have an open write + ** transaction on this file. And, obviously, for this to be so there + ** must be an open write transaction on the file itself. + */ + assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) ); + assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE ); + + /* This routine is a no-op if the shared-cache is not enabled */ + if( !p->sharable ){ + return SQLITE_OK; + } + + /* If some other connection is holding an exclusive lock, the + ** requested lock may not be obtained. + */ + if( pBt->pWriter!=p && (pBt->btsFlags & BTS_EXCLUSIVE)!=0 ){ + sqlite3ConnectionBlocked(p->db, pBt->pWriter->db); + return SQLITE_LOCKED_SHAREDCACHE; + } + + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + /* The condition (pIter->eLock!=eLock) in the following if(...) + ** statement is a simplification of: + ** + ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK) + ** + ** since we know that if eLock==WRITE_LOCK, then no other connection + ** may hold a WRITE_LOCK on any table in this file (since there can + ** only be a single writer). + */ + assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK ); + assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK); + if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){ + sqlite3ConnectionBlocked(p->db, pIter->pBtree->db); + if( eLock==WRITE_LOCK ){ + assert( p==pBt->pWriter ); + pBt->btsFlags |= BTS_PENDING; + } + return SQLITE_LOCKED_SHAREDCACHE; + } + } + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Add a lock on the table with root-page iTable to the shared-btree used +** by Btree handle p. Parameter eLock must be either READ_LOCK or +** WRITE_LOCK. +** +** This function assumes the following: +** +** (a) The specified Btree object p is connected to a sharable +** database (one with the BtShared.sharable flag set), and +** +** (b) No other Btree objects hold a lock that conflicts +** with the requested lock (i.e. querySharedCacheTableLock() has +** already been called and returned SQLITE_OK). +** +** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM +** is returned if a malloc attempt fails. +*/ +static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ + BtShared *pBt = p->pBt; + BtLock *pLock = 0; + BtLock *pIter; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); + assert( p->db!=0 ); + + /* A connection with the read-uncommitted flag set will never try to + ** obtain a read-lock using this function. The only read-lock obtained + ** by a connection in read-uncommitted mode is on the sqlite_schema + ** table, and that lock is obtained in BtreeBeginTrans(). */ + assert( 0==(p->db->flags&SQLITE_ReadUncommit) || eLock==WRITE_LOCK ); + + /* This function should only be called on a sharable b-tree after it + ** has been determined that no other b-tree holds a conflicting lock. */ + assert( p->sharable ); + assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) ); + + /* First search the list for an existing lock on this table. */ + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->iTable==iTable && pIter->pBtree==p ){ + pLock = pIter; + break; + } + } + + /* If the above search did not find a BtLock struct associating Btree p + ** with table iTable, allocate one and link it into the list. + */ + if( !pLock ){ + pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock)); + if( !pLock ){ + return SQLITE_NOMEM_BKPT; + } + pLock->iTable = iTable; + pLock->pBtree = p; + pLock->pNext = pBt->pLock; + pBt->pLock = pLock; + } + + /* Set the BtLock.eLock variable to the maximum of the current lock + ** and the requested lock. This means if a write-lock was already held + ** and a read-lock requested, we don't incorrectly downgrade the lock. + */ + assert( WRITE_LOCK>READ_LOCK ); + if( eLock>pLock->eLock ){ + pLock->eLock = eLock; + } + + return SQLITE_OK; +} +#endif /* !SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Release all the table locks (locks obtained via calls to +** the setSharedCacheTableLock() procedure) held by Btree object p. +** +** This function assumes that Btree p has an open read or write +** transaction. If it does not, then the BTS_PENDING flag +** may be incorrectly cleared. +*/ +static void clearAllSharedCacheTableLocks(Btree *p){ + BtShared *pBt = p->pBt; + BtLock **ppIter = &pBt->pLock; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->sharable || 0==*ppIter ); + assert( p->inTrans>0 ); + + while( *ppIter ){ + BtLock *pLock = *ppIter; + assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree ); + assert( pLock->pBtree->inTrans>=pLock->eLock ); + if( pLock->pBtree==p ){ + *ppIter = pLock->pNext; + assert( pLock->iTable!=1 || pLock==&p->lock ); + if( pLock->iTable!=1 ){ + sqlite3_free(pLock); + } + }else{ + ppIter = &pLock->pNext; + } + } + + assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter ); + if( pBt->pWriter==p ){ + pBt->pWriter = 0; + pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); + }else if( pBt->nTransaction==2 ){ + /* This function is called when Btree p is concluding its + ** transaction. If there currently exists a writer, and p is not + ** that writer, then the number of locks held by connections other + ** than the writer must be about to drop to zero. In this case + ** set the BTS_PENDING flag to 0. + ** + ** If there is not currently a writer, then BTS_PENDING must + ** be zero already. So this next line is harmless in that case. + */ + pBt->btsFlags &= ~BTS_PENDING; + } +} + +/* +** This function changes all write-locks held by Btree p into read-locks. +*/ +static void downgradeAllSharedCacheTableLocks(Btree *p){ + BtShared *pBt = p->pBt; + if( pBt->pWriter==p ){ + BtLock *pLock; + pBt->pWriter = 0; + pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); + for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){ + assert( pLock->eLock==READ_LOCK || pLock->pBtree==p ); + pLock->eLock = READ_LOCK; + } + } +} + +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +static void releasePage(MemPage *pPage); /* Forward reference */ +static void releasePageOne(MemPage *pPage); /* Forward reference */ +static void releasePageNotNull(MemPage *pPage); /* Forward reference */ + +/* +***** This routine is used inside of assert() only **** +** +** Verify that the cursor holds the mutex on its BtShared +*/ +#ifdef SQLITE_DEBUG +static int cursorHoldsMutex(BtCursor *p){ + return sqlite3_mutex_held(p->pBt->mutex); +} + +/* Verify that the cursor and the BtShared agree about what is the current +** database connetion. This is important in shared-cache mode. If the database +** connection pointers get out-of-sync, it is possible for routines like +** btreeInitPage() to reference an stale connection pointer that references a +** a connection that has already closed. This routine is used inside assert() +** statements only and for the purpose of double-checking that the btree code +** does keep the database connection pointers up-to-date. +*/ +static int cursorOwnsBtShared(BtCursor *p){ + assert( cursorHoldsMutex(p) ); + return (p->pBtree->db==p->pBt->db); +} +#endif + +/* +** Invalidate the overflow cache of the cursor passed as the first argument. +** on the shared btree structure pBt. +*/ +#define invalidateOverflowCache(pCur) (pCur->curFlags &= ~BTCF_ValidOvfl) + +/* +** Invalidate the overflow page-list cache for all cursors opened +** on the shared btree structure pBt. +*/ +static void invalidateAllOverflowCache(BtShared *pBt){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + for(p=pBt->pCursor; p; p=p->pNext){ + invalidateOverflowCache(p); + } +} + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** This function is called before modifying the contents of a table +** to invalidate any incrblob cursors that are open on the +** row or one of the rows being modified. +** +** If argument isClearTable is true, then the entire contents of the +** table is about to be deleted. In this case invalidate all incrblob +** cursors open on any row within the table with root-page pgnoRoot. +** +** Otherwise, if argument isClearTable is false, then the row with +** rowid iRow is being replaced or deleted. In this case invalidate +** only those incrblob cursors open on that specific row. +*/ +static void invalidateIncrblobCursors( + Btree *pBtree, /* The database file to check */ + Pgno pgnoRoot, /* The table that might be changing */ + i64 iRow, /* The rowid that might be changing */ + int isClearTable /* True if all rows are being deleted */ +){ + BtCursor *p; + assert( pBtree->hasIncrblobCur ); + assert( sqlite3BtreeHoldsMutex(pBtree) ); + pBtree->hasIncrblobCur = 0; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( (p->curFlags & BTCF_Incrblob)!=0 ){ + pBtree->hasIncrblobCur = 1; + if( p->pgnoRoot==pgnoRoot && (isClearTable || p->info.nKey==iRow) ){ + p->eState = CURSOR_INVALID; + } + } + } +} + +#else + /* Stub function when INCRBLOB is omitted */ + #define invalidateIncrblobCursors(w,x,y,z) +#endif /* SQLITE_OMIT_INCRBLOB */ + +/* +** Set bit pgno of the BtShared.pHasContent bitvec. This is called +** when a page that previously contained data becomes a free-list leaf +** page. +** +** The BtShared.pHasContent bitvec exists to work around an obscure +** bug caused by the interaction of two useful IO optimizations surrounding +** free-list leaf pages: +** +** 1) When all data is deleted from a page and the page becomes +** a free-list leaf page, the page is not written to the database +** (as free-list leaf pages contain no meaningful data). Sometimes +** such a page is not even journalled (as it will not be modified, +** why bother journalling it?). +** +** 2) When a free-list leaf page is reused, its content is not read +** from the database or written to the journal file (why should it +** be, if it is not at all meaningful?). +** +** By themselves, these optimizations work fine and provide a handy +** performance boost to bulk delete or insert operations. However, if +** a page is moved to the free-list and then reused within the same +** transaction, a problem comes up. If the page is not journalled when +** it is moved to the free-list and it is also not journalled when it +** is extracted from the free-list and reused, then the original data +** may be lost. In the event of a rollback, it may not be possible +** to restore the database to its original configuration. +** +** The solution is the BtShared.pHasContent bitvec. Whenever a page is +** moved to become a free-list leaf page, the corresponding bit is +** set in the bitvec. Whenever a leaf page is extracted from the free-list, +** optimization 2 above is omitted if the corresponding bit is already +** set in BtShared.pHasContent. The contents of the bitvec are cleared +** at the end of every transaction. +*/ +static int btreeSetHasContent(BtShared *pBt, Pgno pgno){ + int rc = SQLITE_OK; + if( !pBt->pHasContent ){ + assert( pgno<=pBt->nPage ); + pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage); + if( !pBt->pHasContent ){ + rc = SQLITE_NOMEM_BKPT; + } + } + if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){ + rc = sqlite3BitvecSet(pBt->pHasContent, pgno); + } + return rc; +} + +/* +** Query the BtShared.pHasContent vector. +** +** This function is called when a free-list leaf page is removed from the +** free-list for reuse. It returns false if it is safe to retrieve the +** page from the pager layer with the 'no-content' flag set. True otherwise. +*/ +static int btreeGetHasContent(BtShared *pBt, Pgno pgno){ + Bitvec *p = pBt->pHasContent; + return p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTestNotNull(p, pgno)); +} + +/* +** Clear (destroy) the BtShared.pHasContent bitvec. This should be +** invoked at the conclusion of each write-transaction. +*/ +static void btreeClearHasContent(BtShared *pBt){ + sqlite3BitvecDestroy(pBt->pHasContent); + pBt->pHasContent = 0; +} + +/* +** Release all of the apPage[] pages for a cursor. +*/ +static void btreeReleaseAllCursorPages(BtCursor *pCur){ + int i; + if( pCur->iPage>=0 ){ + for(i=0; iiPage; i++){ + releasePageNotNull(pCur->apPage[i]); + } + releasePageNotNull(pCur->pPage); + pCur->iPage = -1; + } +} + +/* +** The cursor passed as the only argument must point to a valid entry +** when this function is called (i.e. have eState==CURSOR_VALID). This +** function saves the current cursor key in variables pCur->nKey and +** pCur->pKey. SQLITE_OK is returned if successful or an SQLite error +** code otherwise. +** +** If the cursor is open on an intkey table, then the integer key +** (the rowid) is stored in pCur->nKey and pCur->pKey is left set to +** NULL. If the cursor is open on a non-intkey table, then pCur->pKey is +** set to point to a malloced buffer pCur->nKey bytes in size containing +** the key. +*/ +static int saveCursorKey(BtCursor *pCur){ + int rc = SQLITE_OK; + assert( CURSOR_VALID==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->curIntKey ){ + /* Only the rowid is required for a table btree */ + pCur->nKey = sqlite3BtreeIntegerKey(pCur); + }else{ + /* For an index btree, save the complete key content. It is possible + ** that the current key is corrupt. In that case, it is possible that + ** the sqlite3VdbeRecordUnpack() function may overread the buffer by + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated + ** below. */ + void *pKey; + pCur->nKey = sqlite3BtreePayloadSize(pCur); + pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); + if( pKey ){ + rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); + if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); + pCur->pKey = pKey; + }else{ + sqlite3_free(pKey); + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + } + assert( !pCur->curIntKey || !pCur->pKey ); + return rc; +} + +/* +** Save the current cursor position in the variables BtCursor.nKey +** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK. +** +** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID) +** prior to calling this routine. +*/ +static int saveCursorPosition(BtCursor *pCur){ + int rc; + + assert( CURSOR_VALID==pCur->eState || CURSOR_SKIPNEXT==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->curFlags & BTCF_Pinned ){ + return SQLITE_CONSTRAINT_PINNED; + } + if( pCur->eState==CURSOR_SKIPNEXT ){ + pCur->eState = CURSOR_VALID; + }else{ + pCur->skipNext = 0; + } + + rc = saveCursorKey(pCur); + if( rc==SQLITE_OK ){ + btreeReleaseAllCursorPages(pCur); + pCur->eState = CURSOR_REQUIRESEEK; + } + + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl|BTCF_AtLast); + return rc; +} + +/* Forward reference */ +static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); + +/* +** Save the positions of all cursors (except pExcept) that are open on +** the table with root-page iRoot. "Saving the cursor position" means that +** the location in the btree is remembered in such a way that it can be +** moved back to the same spot after the btree has been modified. This +** routine is called just before cursor pExcept is used to modify the +** table, for example in BtreeDelete() or BtreeInsert(). +** +** If there are two or more cursors on the same btree, then all such +** cursors should have their BTCF_Multiple flag set. The btreeCursor() +** routine enforces that rule. This routine only needs to be called in +** the uncommon case when pExpect has the BTCF_Multiple flag set. +** +** If pExpect!=NULL and if no other cursors are found on the same root-page, +** then the BTCF_Multiple flag on pExpect is cleared, to avoid another +** pointless call to this routine. +** +** Implementation note: This routine merely checks to see if any cursors +** need to be saved. It calls out to saveCursorsOnList() in the (unusual) +** event that cursors are in need to being saved. +*/ +static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ + BtCursor *p; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pExcept==0 || pExcept->pBt==pBt ); + for(p=pBt->pCursor; p; p=p->pNext){ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ) break; + } + if( p ) return saveCursorsOnList(p, iRoot, pExcept); + if( pExcept ) pExcept->curFlags &= ~BTCF_Multiple; + return SQLITE_OK; +} + +/* This helper routine to saveAllCursors does the actual work of saving +** the cursors if and when a cursor is found that actually requires saving. +** The common case is that no cursors need to be saved, so this routine is +** broken out from its caller to avoid unnecessary stack pointer movement. +*/ +static int SQLITE_NOINLINE saveCursorsOnList( + BtCursor *p, /* The first cursor that needs saving */ + Pgno iRoot, /* Only save cursor with this iRoot. Save all if zero */ + BtCursor *pExcept /* Do not save this cursor */ +){ + do{ + if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ + int rc = saveCursorPosition(p); + if( SQLITE_OK!=rc ){ + return rc; + } + }else{ + testcase( p->iPage>=0 ); + btreeReleaseAllCursorPages(p); + } + } + p = p->pNext; + }while( p ); + return SQLITE_OK; +} + +/* +** Clear the current cursor position. +*/ +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + pCur->eState = CURSOR_INVALID; +} + +/* +** In this version of BtreeMoveto, pKey is a packed index record +** such as is generated by the OP_MakeRecord opcode. Unpack the +** record and then call sqlite3BtreeIndexMoveto() to do the work. +*/ +static int btreeMoveto( + BtCursor *pCur, /* Cursor open on the btree to be searched */ + const void *pKey, /* Packed key if the btree is an index */ + i64 nKey, /* Integer key for tables. Size of pKey for indices */ + int bias, /* Bias search to the high end */ + int *pRes /* Write search results here */ +){ + int rc; /* Status code */ + UnpackedRecord *pIdxKey; /* Unpacked index key */ + + if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; + assert( nKey==(i64)(int)nKey ); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = sqlite3BtreeIndexMoveto(pCur, pIdxKey, pRes); + } + sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); + }else{ + pIdxKey = 0; + rc = sqlite3BtreeTableMoveto(pCur, nKey, bias, pRes); + } + return rc; +} + +/* +** Restore the cursor to the position it was in (or as close to as possible) +** when saveCursorPosition() was called. Note that this call deletes the +** saved position info stored by saveCursorPosition(), so there can be +** at most one effective restoreCursorPosition() call after each +** saveCursorPosition(). +*/ +static int btreeRestoreCursorPosition(BtCursor *pCur){ + int rc; + int skipNext = 0; + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState>=CURSOR_REQUIRESEEK ); + if( pCur->eState==CURSOR_FAULT ){ + return pCur->skipNext; + } + pCur->eState = CURSOR_INVALID; + if( sqlite3FaultSim(410) ){ + rc = SQLITE_IOERR; + }else{ + rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); + } + if( rc==SQLITE_OK ){ + sqlite3_free(pCur->pKey); + pCur->pKey = 0; + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); + if( skipNext ) pCur->skipNext = skipNext; + if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ + pCur->eState = CURSOR_SKIPNEXT; + } + } + return rc; +} + +#define restoreCursorPosition(p) \ + (p->eState>=CURSOR_REQUIRESEEK ? \ + btreeRestoreCursorPosition(p) : \ + SQLITE_OK) + +/* +** Determine whether or not a cursor has moved from the position where +** it was last placed, or has been invalidated for any other reason. +** Cursors can move when the row they are pointing at is deleted out +** from under them, for example. Cursor might also move if a btree +** is rebalanced. +** +** Calling this routine with a NULL cursor pointer returns false. +** +** Use the separate sqlite3BtreeCursorRestore() routine to restore a cursor +** back to where it ought to be if this routine returns true. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){ + assert( EIGHT_BYTE_ALIGNMENT(pCur) + || pCur==sqlite3BtreeFakeValidCursor() ); + assert( offsetof(BtCursor, eState)==0 ); + assert( sizeof(pCur->eState)==1 ); + return CURSOR_VALID != *(u8*)pCur; +} + +/* +** Return a pointer to a fake BtCursor object that will always answer +** false to the sqlite3BtreeCursorHasMoved() routine above. The fake +** cursor returned must not be used with any other Btree interface. +*/ +SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void){ + static u8 fakeCursor = CURSOR_VALID; + assert( offsetof(BtCursor, eState)==0 ); + return (BtCursor*)&fakeCursor; +} + +/* +** This routine restores a cursor back to its original position after it +** has been moved by some outside activity (such as a btree rebalance or +** a row having been deleted out from under the cursor). +** +** On success, the *pDifferentRow parameter is false if the cursor is left +** pointing at exactly the same row. *pDifferntRow is the row the cursor +** was pointing to has been deleted, forcing the cursor to point to some +** nearby row. +** +** This routine should only be called for a cursor that just returned +** TRUE from sqlite3BtreeCursorHasMoved(). +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ + int rc; + + assert( pCur!=0 ); + assert( pCur->eState!=CURSOR_VALID ); + rc = restoreCursorPosition(pCur); + if( rc ){ + *pDifferentRow = 1; + return rc; + } + if( pCur->eState!=CURSOR_VALID ){ + *pDifferentRow = 1; + }else{ + *pDifferentRow = 0; + } + return SQLITE_OK; +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Provide hints to the cursor. The particular hint given (and the type +** and number of the varargs parameters) is determined by the eHintType +** parameter. See the definitions of the BTREE_HINT_* macros for details. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){ + /* Used only by system that substitute their own storage engine */ +} +#endif + +/* +** Provide flag hints to the cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor *pCur, unsigned x){ + assert( x==BTREE_SEEK_EQ || x==BTREE_BULKLOAD || x==0 ); + pCur->hints = x; +} + + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Given a page number of a regular database page, return the page +** number for the pointer-map page that contains the entry for the +** input page number. +** +** Return 0 (not a valid page) for pgno==1 since there is +** no pointer map associated with page 1. The integrity_check logic +** requires that ptrmapPageno(*,1)!=1. +*/ +static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ + int nPagesPerMapPage; + Pgno iPtrMap, ret; + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno<2 ) return 0; + nPagesPerMapPage = (pBt->usableSize/5)+1; + iPtrMap = (pgno-2)/nPagesPerMapPage; + ret = (iPtrMap*nPagesPerMapPage) + 2; + if( ret==PENDING_BYTE_PAGE(pBt) ){ + ret++; + } + return ret; +} + +/* +** Write an entry into the pointer map. +** +** This routine updates the pointer map entry for page number 'key' +** so that it maps to type 'eType' and parent page number 'pgno'. +** +** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is +** a no-op. If an error occurs, the appropriate error code is written +** into *pRC. +*/ +static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ + DbPage *pDbPage; /* The pointer map page */ + u8 *pPtrmap; /* The pointer map data */ + Pgno iPtrmap; /* The pointer map page number */ + int offset; /* Offset in pointer map page */ + int rc; /* Return code from subfunctions */ + + if( *pRC ) return; + + assert( sqlite3_mutex_held(pBt->mutex) ); + /* The super-journal page number must never be used as a pointer map page */ + assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); + + assert( pBt->autoVacuum ); + if( key==0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + /* The first byte of the extra data is the MemPage.isInit byte. + ** If that byte is set, it means this page is also being used + ** as a btree page. */ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } + assert( offset <= (int)pBt->usableSize-5 ); + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + *pRC= rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + pPtrmap[offset] = eType; + put4byte(&pPtrmap[offset+1], parent); + } + } + +ptrmap_exit: + sqlite3PagerUnref(pDbPage); +} + +/* +** Read an entry from the pointer map. +** +** This routine retrieves the pointer map entry for page 'key', writing +** the type and parent page number to *pEType and *pPgno respectively. +** An error code is returned if something goes wrong, otherwise SQLITE_OK. +*/ +static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ + DbPage *pDbPage; /* The pointer map page */ + int iPtrmap; /* Pointer map page index */ + u8 *pPtrmap; /* Pointer map page data */ + int offset; /* Offset of entry in pointer map */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + + iPtrmap = PTRMAP_PAGENO(pBt, key); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); + if( rc!=0 ){ + return rc; + } + pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + + offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + sqlite3PagerUnref(pDbPage); + return SQLITE_CORRUPT_BKPT; + } + assert( offset <= (int)pBt->usableSize-5 ); + assert( pEType!=0 ); + *pEType = pPtrmap[offset]; + if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); + + sqlite3PagerUnref(pDbPage); + if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_PGNO(iPtrmap); + return SQLITE_OK; +} + +#else /* if defined SQLITE_OMIT_AUTOVACUUM */ + #define ptrmapPut(w,x,y,z,rc) + #define ptrmapGet(w,x,y,z) SQLITE_OK + #define ptrmapPutOvflPtr(x, y, z, rc) +#endif + +/* +** Given a btree page and a cell index (0 means the first cell on +** the page, 1 means the second cell, and so forth) return a pointer +** to the cell content. +** +** findCellPastPtr() does the same except it skips past the initial +** 4-byte child pointer found on interior pages, if there is one. +** +** This routine works only for pages that do not contain overflow cells. +*/ +#define findCell(P,I) \ + ((P)->aData + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) +#define findCellPastPtr(P,I) \ + ((P)->aDataOfst + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) + + +/* +** This is common tail processing for btreeParseCellPtr() and +** btreeParseCellPtrIndex() for the case when the cell does not fit entirely +** on a single B-tree page. Make necessary adjustments to the CellInfo +** structure. +*/ +static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + /* If the payload will not fit completely on the local page, we have + ** to decide how much to store locally and how much to spill onto + ** overflow pages. The strategy is to minimize the amount of unused + ** space on overflow pages while keeping the amount of local storage + ** in between minLocal and maxLocal. + ** + ** Warning: changing the way overflow payload is distributed in any + ** way will result in an incompatible file format. + */ + int minLocal; /* Minimum amount of payload held locally */ + int maxLocal; /* Maximum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + + minLocal = pPage->minLocal; + maxLocal = pPage->maxLocal; + surplus = minLocal + (pInfo->nPayload - minLocal)%(pPage->pBt->usableSize-4); + testcase( surplus==maxLocal ); + testcase( surplus==maxLocal+1 ); + if( surplus <= maxLocal ){ + pInfo->nLocal = (u16)surplus; + }else{ + pInfo->nLocal = (u16)minLocal; + } + pInfo->nSize = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell) + 4; +} + +/* +** Given a record with nPayload bytes of payload stored within btree +** page pPage, return the number of bytes of payload stored locally. +*/ +static int btreePayloadToLocal(MemPage *pPage, i64 nPayload){ + int maxLocal; /* Maximum amount of payload held locally */ + maxLocal = pPage->maxLocal; + if( nPayload<=maxLocal ){ + return nPayload; + }else{ + int minLocal; /* Minimum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + minLocal = pPage->minLocal; + surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize-4); + return ( surplus <= maxLocal ) ? surplus : minLocal; + } +} + +/* +** The following routines are implementations of the MemPage.xParseCell() +** method. +** +** Parse a cell content block and fill in the CellInfo structure. +** +** btreeParseCellPtr() => table btree leaf nodes +** btreeParseCellNoPayload() => table btree internal nodes +** btreeParseCellPtrIndex() => index btree nodes +** +** There is also a wrapper function btreeParseCell() that works for +** all MemPage types and that references the cell by index rather than +** by pointer. +*/ +static void btreeParseCellPtrNoPayload( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 ); + assert( pPage->childPtrSize==4 ); +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER(pPage); +#endif + pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); + pInfo->nPayload = 0; + pInfo->nLocal = 0; + pInfo->pPayload = 0; + return; +} +static void btreeParseCellPtr( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ + u64 iKey; /* Extracted Key value */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf ); + assert( pPage->childPtrSize==0 ); + pIter = pCell; + + /* The next block of code is equivalent to: + ** + ** pIter += getVarint32(pIter, nPayload); + ** + ** The code is inlined to avoid a function call. + */ + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( (*pIter)>=0x80 && pIternKey); + ** + ** The code is inlined and the loop is unrolled for performance. + ** This routine is a high-runner. + */ + iKey = *pIter; + if( iKey>=0x80 ){ + u8 x; + iKey = ((iKey&0x7f)<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x =*++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + if( x>=0x80 ){ + iKey = (iKey<<8) | (*++pIter); + } + } + } + } + } + } + } + } + pIter++; + + pInfo->nKey = *(i64*)&iKey; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==(u32)pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCellPtrIndex( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf==0 ); + pIter = pCell + pPage->childPtrSize; + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIternKey = nPayload; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==(u32)pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCell( + MemPage *pPage, /* Page containing the cell */ + int iCell, /* The cell index. First cell is 0 */ + CellInfo *pInfo /* Fill in this structure */ +){ + pPage->xParseCell(pPage, findCell(pPage, iCell), pInfo); +} + +/* +** The following routines are implementations of the MemPage.xCellSize +** method. +** +** Compute the total number of bytes that a Cell needs in the cell +** data area of the btree-page. The return number includes the cell +** data header and the local payload, but not any overflow page or +** the space used by the cell pointer. +** +** cellSizePtrNoPayload() => table internal nodes +** cellSizePtrTableLeaf() => table leaf nodes +** cellSizePtr() => all index nodes & table leaf nodes +*/ +static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + u32 nSize; /* Size value to return */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#endif + + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pItermaxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + if( nSize<4 ) nSize = 4; + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} +static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + 4; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#else + UNUSED_PARAMETER(pPage); +#endif + + assert( pPage->childPtrSize==4 ); + pEnd = pIter + 9; + while( (*pIter++)&0x80 && pIterxParseCell(pPage, pCell, &debuginfo); +#endif + + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pItermaxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + if( nSize<4 ) nSize = 4; + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} + + +#ifdef SQLITE_DEBUG +/* This variation on cellSizePtr() is used inside of assert() statements +** only. */ +static u16 cellSize(MemPage *pPage, int iCell){ + return pPage->xCellSize(pPage, findCell(pPage, iCell)); +} +#endif + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPage are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. +*/ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ + CellInfo info; + if( *pRC ) return; + assert( pCell!=0 ); + pPage->xParseCell(pPage, pCell, &info); + if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + ovfl = get4byte(&pCell[info.nSize-4]); + ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); + } +} +#endif + + +/* +** Defragment the page given. This routine reorganizes cells within the +** page so that there are no free-blocks on the free-block list. +** +** Parameter nMaxFrag is the maximum amount of fragmented space that may be +** present in the page after this routine returns. +** +** EVIDENCE-OF: R-44582-60138 SQLite may from time to time reorganize a +** b-tree page so that there are no freeblocks or fragment bytes, all +** unused bytes are contained in the unallocated space region, and all +** cells are packed tightly at the end of the page. +*/ +static int defragmentPage(MemPage *pPage, int nMaxFrag){ + int i; /* Loop counter */ + int pc; /* Address of the i-th cell */ + int hdr; /* Offset to the page header */ + int size; /* Size of a cell */ + int usableSize; /* Number of usable bytes on a page */ + int cellOffset; /* Offset to the cell pointer array */ + int cbrk; /* Offset to the cell content area */ + int nCell; /* Number of cells on the page */ + unsigned char *data; /* The page data */ + unsigned char *temp; /* Temp area for cell content */ + unsigned char *src; /* Source of content */ + int iCellFirst; /* First allowable cell index */ + int iCellLast; /* Last possible cell index */ + int iCellStart; /* First cell offset in input */ + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt!=0 ); + assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); + assert( pPage->nOverflow==0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + temp = 0; + src = data = pPage->aData; + hdr = pPage->hdrOffset; + cellOffset = pPage->cellOffset; + nCell = pPage->nCell; + assert( nCell==get2byte(&data[hdr+3]) || CORRUPT_DB ); + iCellFirst = cellOffset + 2*nCell; + usableSize = pPage->pBt->usableSize; + + /* This block handles pages with two or fewer free blocks and nMaxFrag + ** or fewer fragmented bytes. In this case it is faster to move the + ** two (or one) blocks of cells using memmove() and add the required + ** offsets to each pointer in the cell-pointer array than it is to + ** reconstruct the entire page. */ + if( (int)data[hdr+7]<=nMaxFrag ){ + int iFree = get2byte(&data[hdr+1]); + if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); + if( iFree ){ + int iFree2 = get2byte(&data[iFree]); + if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); + if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ + u8 *pEnd = &data[cellOffset + nCell*2]; + u8 *pAddr; + int sz2 = 0; + int sz = get2byte(&data[iFree+2]); + int top = get2byte(&data[hdr+5]); + if( top>=iFree ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( iFree2 ){ + if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); + sz2 = get2byte(&data[iFree2+2]); + if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); + memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); + sz += sz2; + }else if( NEVER(iFree+sz>usableSize) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + + cbrk = top+sz; + assert( cbrk+(iFree-top) <= usableSize ); + memmove(&data[cbrk], &data[top], iFree-top); + for(pAddr=&data[cellOffset]; pAddriCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pc>=iCellStart && pc<=iCellLast ); + size = pPage->xCellSize(pPage, &src[pc]); + cbrk -= size; + if( cbrkusableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( cbrk+size<=usableSize && cbrk>=iCellStart ); + testcase( cbrk+size==usableSize ); + testcase( pc+size==usableSize ); + put2byte(pAddr, cbrk); + if( temp==0 ){ + if( cbrk==pc ) continue; + temp = sqlite3PagerTempSpace(pPage->pBt->pPager); + memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart); + src = temp; + } + memcpy(&data[cbrk], &src[pc], size); + } + data[hdr+7] = 0; + + defragment_out: + assert( pPage->nFree>=0 ); + if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( cbrk>=iCellFirst ); + put2byte(&data[hdr+5], cbrk); + data[hdr+1] = 0; + data[hdr+2] = 0; + memset(&data[iCellFirst], 0, cbrk-iCellFirst); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + return SQLITE_OK; +} + +/* +** Search the free-list on page pPg for space to store a cell nByte bytes in +** size. If one can be found, return a pointer to the space and remove it +** from the free-list. +** +** If no suitable space can be found on the free-list, return NULL. +** +** This function may detect corruption within pPg. If corruption is +** detected then *pRc is set to SQLITE_CORRUPT and NULL is returned. +** +** Slots on the free list that are between 1 and 3 bytes larger than nByte +** will be ignored if adding the extra space to the fragmentation count +** causes the fragmentation count to exceed 60. +*/ +static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ + const int hdr = pPg->hdrOffset; /* Offset to page header */ + u8 * const aData = pPg->aData; /* Page data */ + int iAddr = hdr + 1; /* Address of ptr to pc */ + u8 *pTmp = &aData[iAddr]; /* Temporary ptr into aData[] */ + int pc = get2byte(pTmp); /* Address of a free slot */ + int x; /* Excess size of the slot */ + int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ + int size; /* Size of the free slot */ + + assert( pc>0 ); + while( pc<=maxPC ){ + /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each + ** freeblock form a big-endian integer which is the size of the freeblock + ** in bytes, including the 4-byte header. */ + pTmp = &aData[pc+2]; + size = get2byte(pTmp); + if( (x = size - nByte)>=0 ){ + testcase( x==4 ); + testcase( x==3 ); + if( x<4 ){ + /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total + ** number of bytes in fragments may not exceed 60. */ + if( aData[hdr+7]>57 ) return 0; + + /* Remove the slot from the free-list. Update the number of + ** fragmented bytes within the page. */ + memcpy(&aData[iAddr], &aData[pc], 2); + aData[hdr+7] += (u8)x; + testcase( pc+x>maxPC ); + return &aData[pc]; + }else if( x+pc > maxPC ){ + /* This slot extends off the end of the usable part of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + return 0; + }else{ + /* The slot remains on the free-list. Reduce its size to account + ** for the portion used by the new allocation. */ + put2byte(&aData[pc+2], x); + } + return &aData[pc + x]; + } + iAddr = pc; + pTmp = &aData[pc]; + pc = get2byte(pTmp); + if( pc<=iAddr+size ){ + if( pc ){ + /* The next slot in the chain is not past the end of the current slot */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + } + return 0; + } + } + if( pc>maxPC+nByte-4 ){ + /* The free slot chain extends off the end of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + } + return 0; +} + +/* +** Allocate nByte bytes of space from within the B-Tree page passed +** as the first argument. Write into *pIdx the index into pPage->aData[] +** of the first byte of allocated space. Return either SQLITE_OK or +** an error code (usually SQLITE_CORRUPT). +** +** The caller guarantees that there is sufficient space to make the +** allocation. This routine might need to defragment in order to bring +** all the space together, however. This routine will avoid using +** the first two bytes past the cell pointer area since presumably this +** allocation is being made in order to insert a new cell, so we will +** also end up needing a new cell pointer. +*/ +static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ + const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */ + u8 * const data = pPage->aData; /* Local cache of pPage->aData */ + int top; /* First byte of cell content area */ + int rc = SQLITE_OK; /* Integer return code */ + u8 *pTmp; /* Temp ptr into data[] */ + int gap; /* First byte of gap between cell pointers and cell content */ + + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( pPage->pBt ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( nByte>=0 ); /* Minimum cell size is 4 */ + assert( pPage->nFree>=nByte ); + assert( pPage->nOverflow==0 ); + assert( nByte < (int)(pPage->pBt->usableSize-8) ); + + assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf ); + gap = pPage->cellOffset + 2*pPage->nCell; + assert( gap<=65536 ); + /* EVIDENCE-OF: R-29356-02391 If the database uses a 65536-byte page size + ** and the reserved space is zero (the usual value for reserved space) + ** then the cell content offset of an empty page wants to be 65536. + ** However, that integer is too large to be stored in a 2-byte unsigned + ** integer, so a value of 0 is used in its place. */ + pTmp = &data[hdr+5]; + top = get2byte(pTmp); + assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ + if( gap>top ){ + if( top==0 && pPage->pBt->usableSize==65536 ){ + top = 65536; + }else{ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + + /* If there is enough space between gap and top for one more cell pointer, + ** and if the freelist is not empty, then search the + ** freelist looking for a slot big enough to satisfy the request. + */ + testcase( gap+2==top ); + testcase( gap+1==top ); + testcase( gap==top ); + if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ + u8 *pSpace = pageFindSlot(pPage, nByte, &rc); + if( pSpace ){ + int g2; + assert( pSpace+nByte<=data+pPage->pBt->usableSize ); + *pIdx = g2 = (int)(pSpace-data); + if( g2<=gap ){ + return SQLITE_CORRUPT_PAGE(pPage); + }else{ + return SQLITE_OK; + } + }else if( rc ){ + return rc; + } + } + + /* The request could not be fulfilled using a freelist slot. Check + ** to see if defragmentation is necessary. + */ + testcase( gap+2+nByte==top ); + if( gap+2+nByte>top ){ + assert( pPage->nCell>0 || CORRUPT_DB ); + assert( pPage->nFree>=0 ); + rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); + if( rc ) return rc; + top = get2byteNotZero(&data[hdr+5]); + assert( gap+2+nByte<=top ); + } + + + /* Allocate memory from the gap in between the cell pointer array + ** and the cell content area. The btreeComputeFreeSpace() call has already + ** validated the freelist. Given that the freelist is valid, there + ** is no way that the allocation can extend off the end of the page. + ** The assert() below verifies the previous sentence. + */ + top -= nByte; + put2byte(&data[hdr+5], top); + assert( top+nByte <= (int)pPage->pBt->usableSize ); + *pIdx = top; + return SQLITE_OK; +} + +/* +** Return a section of the pPage->aData to the freelist. +** The first byte of the new free block is pPage->aData[iStart] +** and the size of the block is iSize bytes. +** +** Adjacent freeblocks are coalesced. +** +** Even though the freeblock list was checked by btreeComputeFreeSpace(), +** that routine will not detect overlap between cells or freeblocks. Nor +** does it detect cells or freeblocks that encrouch into the reserved bytes +** at the end of the page. So do additional corruption checks inside this +** routine and return SQLITE_CORRUPT if any problems are found. +*/ +static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ + u16 iPtr; /* Address of ptr to next freeblock */ + u16 iFreeBlk; /* Address of the next freeblock */ + u8 hdr; /* Page header size. 0 or 100 */ + u8 nFrag = 0; /* Reduction in fragmentation */ + u16 iOrigSize = iSize; /* Original value of iSize */ + u16 x; /* Offset to cell content area */ + u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */ + unsigned char *data = pPage->aData; /* Page content */ + u8 *pTmp; /* Temporary ptr into data[] */ + + assert( pPage->pBt!=0 ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( CORRUPT_DB || iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); + assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( iSize>=4 ); /* Minimum cell size is 4 */ + assert( iStart<=pPage->pBt->usableSize-4 ); + + /* The list of freeblocks must be in ascending order. Find the + ** spot on the list where iStart should be inserted. + */ + hdr = pPage->hdrOffset; + iPtr = hdr + 1; + if( data[iPtr+1]==0 && data[iPtr]==0 ){ + iFreeBlk = 0; /* Shortcut for the case when the freelist is empty */ + }else{ + while( (iFreeBlk = get2byte(&data[iPtr]))pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( iFreeBlk>iPtr || iFreeBlk==0 || CORRUPT_DB ); + + /* At this point: + ** iFreeBlk: First freeblock after iStart, or zero if none + ** iPtr: The address of a pointer to iFreeBlk + ** + ** Check to see if iFreeBlk should be coalesced onto the end of iStart. + */ + if( iFreeBlk && iEnd+3>=iFreeBlk ){ + nFrag = iFreeBlk - iEnd; + if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); + iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); + if( iEnd > pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + iSize = iEnd - iStart; + iFreeBlk = get2byte(&data[iFreeBlk]); + } + + /* If iPtr is another freeblock (that is, if iPtr is not the freelist + ** pointer in the page header) then check to see if iStart should be + ** coalesced onto the end of iPtr. + */ + if( iPtr>hdr+1 ){ + int iPtrEnd = iPtr + get2byte(&data[iPtr+2]); + if( iPtrEnd+3>=iStart ){ + if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PAGE(pPage); + nFrag += iStart - iPtrEnd; + iSize = iEnd - iPtr; + iStart = iPtr; + } + } + if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage); + data[hdr+7] -= nFrag; + } + pTmp = &data[hdr+5]; + x = get2byte(pTmp); + if( iStart<=x ){ + /* The new freeblock is at the beginning of the cell content area, + ** so just extend the cell content area rather than create another + ** freelist entry */ + if( iStartpBt->btsFlags & BTS_FAST_SECURE ){ + /* Overwrite deleted information with zeros when the secure_delete + ** option is enabled */ + memset(&data[iStart], 0, iSize); + } + put2byte(&data[iStart], iFreeBlk); + put2byte(&data[iStart+2], iSize); + pPage->nFree += iOrigSize; + return SQLITE_OK; +} + +/* +** Decode the flags byte (the first byte of the header) for a page +** and initialize fields of the MemPage structure accordingly. +** +** Only the following combinations are supported. Anything different +** indicates a corrupt database files: +** +** PTF_ZERODATA +** PTF_ZERODATA | PTF_LEAF +** PTF_LEAFDATA | PTF_INTKEY +** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF +*/ +static int decodeFlags(MemPage *pPage, int flagByte){ + BtShared *pBt; /* A copy of pPage->pBt */ + + assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); + flagByte &= ~PTF_LEAF; + pPage->childPtrSize = 4-4*pPage->leaf; + pBt = pPage->pBt; + if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ + /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an + ** interior table b-tree page. */ + assert( (PTF_LEAFDATA|PTF_INTKEY)==5 ); + /* EVIDENCE-OF: R-26900-09176 A value of 13 (0x0d) means the page is a + ** leaf table b-tree page. */ + assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 ); + pPage->intKey = 1; + if( pPage->leaf ){ + pPage->intKeyLeaf = 1; + pPage->xCellSize = cellSizePtrTableLeaf; + pPage->xParseCell = btreeParseCellPtr; + }else{ + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtrNoPayload; + pPage->xParseCell = btreeParseCellPtrNoPayload; + } + pPage->maxLocal = pBt->maxLeaf; + pPage->minLocal = pBt->minLeaf; + }else if( flagByte==PTF_ZERODATA ){ + /* EVIDENCE-OF: R-43316-37308 A value of 2 (0x02) means the page is an + ** interior index b-tree page. */ + assert( (PTF_ZERODATA)==2 ); + /* EVIDENCE-OF: R-59615-42828 A value of 10 (0x0a) means the page is a + ** leaf index b-tree page. */ + assert( (PTF_ZERODATA|PTF_LEAF)==10 ); + pPage->intKey = 0; + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtr; + pPage->xParseCell = btreeParseCellPtrIndex; + pPage->maxLocal = pBt->maxLocal; + pPage->minLocal = pBt->minLocal; + }else{ + /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is + ** an error. */ + pPage->intKey = 0; + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtr; + pPage->xParseCell = btreeParseCellPtrIndex; + return SQLITE_CORRUPT_PAGE(pPage); + } + pPage->max1bytePayload = pBt->max1bytePayload; + return SQLITE_OK; +} + +/* +** Compute the amount of freespace on the page. In other words, fill +** in the pPage->nFree field. +*/ +static int btreeComputeFreeSpace(MemPage *pPage){ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 hdr; /* Offset to beginning of page header */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Amount of usable space on each page */ + int nFree; /* Number of unused bytes on the page */ + int top; /* First byte of the cell content area */ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==1 ); + assert( pPage->nFree<0 ); + + usableSize = pPage->pBt->usableSize; + hdr = pPage->hdrOffset; + data = pPage->aData; + /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates + ** the start of the cell content area. A zero value for this integer is + ** interpreted as 65536. */ + top = get2byteNotZero(&data[hdr+5]); + iCellFirst = hdr + 8 + pPage->childPtrSize + 2*pPage->nCell; + iCellLast = usableSize - 4; + + /* Compute the total free space on the page + ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the + ** start of the first freeblock on the page, or is zero if there are no + ** freeblocks. */ + pc = get2byte(&data[hdr+1]); + nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ + if( pc>0 ){ + u32 next, size; + if( pciCellLast ){ + /* Freeblock off the end of the page */ + return SQLITE_CORRUPT_PAGE(pPage); + } + next = get2byte(&data[pc]); + size = get2byte(&data[pc+2]); + nFree = nFree + size; + if( next<=pc+size+3 ) break; + pc = next; + } + if( next>0 ){ + /* Freeblock not in ascending order */ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( pc+size>(unsigned int)usableSize ){ + /* Last freeblock extends past page end */ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + + /* At this point, nFree contains the sum of the offset to the start + ** of the cell-content area plus the number of free bytes within + ** the cell-content area. If this is greater than the usable-size + ** of the page, then the page must be corrupted. This check also + ** serves to verify that the offset to the start of the cell-content + ** area, according to the page header, lies within the page. + */ + if( nFree>usableSize || nFreenFree = (u16)(nFree - iCellFirst); + return SQLITE_OK; +} + +/* +** Do additional sanity check after btreeInitPage() if +** PRAGMA cell_size_check=ON +*/ +static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Maximum usable space on the page */ + int cellOffset; /* Start of cell content area */ + + iCellFirst = pPage->cellOffset + 2*pPage->nCell; + usableSize = pPage->pBt->usableSize; + iCellLast = usableSize - 4; + data = pPage->aData; + cellOffset = pPage->cellOffset; + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + return SQLITE_OK; +} + +/* +** Initialize the auxiliary information for a disk block. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +static int btreeInitPage(MemPage *pPage){ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==0 ); + + pBt = pPage->pBt; + data = pPage->aData + pPage->hdrOffset; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[0]) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; + pPage->aCellIdx = data + pPage->childPtrSize + 8; + pPage->aDataEnd = pPage->aData + pBt->pageSize; + pPage->aDataOfst = pPage->aData + pPage->childPtrSize; + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_PAGE(pPage); + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 + || get2byteNotZero(&data[5])==(int)pBt->usableSize + || CORRUPT_DB ); + pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ + pPage->isInit = 1; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + return btreeCellSizeCheck(pPage); + } + return SQLITE_OK; +} + +/* +** Set up a raw page so that it looks like a database page holding +** no entries. +*/ +static void zeroPage(MemPage *pPage, int flags){ + unsigned char *data = pPage->aData; + BtShared *pBt = pPage->pBt; + u8 hdr = pPage->hdrOffset; + u16 first; + + assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage) == data ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->btsFlags & BTS_FAST_SECURE ){ + memset(&data[hdr], 0, pBt->usableSize - hdr); + } + data[hdr] = (char)flags; + first = hdr + ((flags&PTF_LEAF)==0 ? 12 : 8); + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pBt->usableSize); + pPage->nFree = (u16)(pBt->usableSize - first); + decodeFlags(pPage, flags); + pPage->cellOffset = first; + pPage->aDataEnd = &data[pBt->pageSize]; + pPage->aCellIdx = &data[first]; + pPage->aDataOfst = &data[pPage->childPtrSize]; + pPage->nOverflow = 0; + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nCell = 0; + pPage->isInit = 1; +} + + +/* +** Convert a DbPage obtained from the pager into a MemPage used by +** the btree layer. +*/ +static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ + MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( pgno!=pPage->pgno ){ + pPage->aData = sqlite3PagerGetData(pDbPage); + pPage->pDbPage = pDbPage; + pPage->pBt = pBt; + pPage->pgno = pgno; + pPage->hdrOffset = pgno==1 ? 100 : 0; + } + assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); + return pPage; +} + +/* +** Get a page from the pager. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. See also: btreeGetUnusedPage(). +** +** If the PAGER_GET_NOCONTENT flag is set, it means that we do not care +** about the content of the page at this time. So do not go to the disk +** to fetch the content. Just fill in the content with zeros for now. +** If in the future we call sqlite3PagerWrite() on this page, that +** means we have started to be concerned about content and the disk +** read should occur at that point. +*/ +static int btreeGetPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc; + DbPage *pDbPage; + + assert( flags==0 || flags==PAGER_GET_NOCONTENT || flags==PAGER_GET_READONLY ); + assert( sqlite3_mutex_held(pBt->mutex) ); + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, flags); + if( rc ) return rc; + *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt); + return SQLITE_OK; +} + +/* +** Retrieve a page from the pager cache. If the requested page is not +** already in the pager cache return NULL. Initialize the MemPage.pBt and +** MemPage.aData elements if needed. +*/ +static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){ + DbPage *pDbPage; + assert( sqlite3_mutex_held(pBt->mutex) ); + pDbPage = sqlite3PagerLookup(pBt->pPager, pgno); + if( pDbPage ){ + return btreePageFromDbPage(pDbPage, pgno, pBt); + } + return 0; +} + +/* +** Return the size of the database file in pages. If there is any kind of +** error, return ((unsigned int)-1). +*/ +static Pgno btreePagecount(BtShared *pBt){ + return pBt->nPage; +} +SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree *p){ + assert( sqlite3BtreeHoldsMutex(p) ); + return btreePagecount(p->pBt); +} + +/* +** Get a page from the pager and initialize it. +** +** If pCur!=0 then the page is being fetched as part of a moveToChild() +** call. Do additional sanity checking on the page in this case. +** And if the fetch fails, this routine must decrement pCur->iPage. +** +** The page is fetched as read-write unless pCur is not NULL and is +** a read-only cursor. +** +** If an error occurs, then *ppPage is undefined. It +** may remain unchanged, or it may be set to an invalid value. +*/ +static int getAndInitPage( + BtShared *pBt, /* The database file */ + Pgno pgno, /* Number of the page to get */ + MemPage **ppPage, /* Write the page pointer here */ + BtCursor *pCur, /* Cursor to receive the page, or NULL */ + int bReadOnly /* True for a read-only page */ +){ + int rc; + DbPage *pDbPage; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pCur==0 || ppPage==&pCur->pPage ); + assert( pCur==0 || bReadOnly==pCur->curPagerFlags ); + assert( pCur==0 || pCur->iPage>0 ); + + if( pgno>btreePagecount(pBt) ){ + rc = SQLITE_CORRUPT_BKPT; + goto getAndInitPage_error1; + } + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); + if( rc ){ + goto getAndInitPage_error1; + } + *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( (*ppPage)->isInit==0 ){ + btreePageFromDbPage(pDbPage, pgno, pBt); + rc = btreeInitPage(*ppPage); + if( rc!=SQLITE_OK ){ + goto getAndInitPage_error2; + } + } + assert( (*ppPage)->pgno==pgno || CORRUPT_DB ); + assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); + + /* If obtaining a child page for a cursor, we must verify that the page is + ** compatible with the root page. */ + if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ + rc = SQLITE_CORRUPT_PGNO(pgno); + goto getAndInitPage_error2; + } + return SQLITE_OK; + +getAndInitPage_error2: + releasePage(*ppPage); +getAndInitPage_error1: + if( pCur ){ + pCur->iPage--; + pCur->pPage = pCur->apPage[pCur->iPage]; + } + testcase( pgno==0 ); + assert( pgno!=0 || rc==SQLITE_CORRUPT + || rc==SQLITE_IOERR_NOMEM + || rc==SQLITE_NOMEM ); + return rc; +} + +/* +** Release a MemPage. This should be called once for each prior +** call to btreeGetPage. +** +** Page1 is a special case and must be released using releasePageOne(). +*/ +static void releasePageNotNull(MemPage *pPage){ + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefNotNull(pPage->pDbPage); +} +static void releasePage(MemPage *pPage){ + if( pPage ) releasePageNotNull(pPage); +} +static void releasePageOne(MemPage *pPage){ + assert( pPage!=0 ); + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefPageOne(pPage->pDbPage); +} + +/* +** Get an unused page. +** +** This works just like btreeGetPage() with the addition: +** +** * If the page is already in use for some other purpose, immediately +** release it and return an SQLITE_CURRUPT error. +** * Make sure the isInit flag is clear +*/ +static int btreeGetUnusedPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc = btreeGetPage(pBt, pgno, ppPage, flags); + if( rc==SQLITE_OK ){ + if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){ + releasePage(*ppPage); + *ppPage = 0; + return SQLITE_CORRUPT_BKPT; + } + (*ppPage)->isInit = 0; + }else{ + *ppPage = 0; + } + return rc; +} + + +/* +** During a rollback, when the pager reloads information into the cache +** so that the cache is restored to its original state at the start of +** the transaction, for each page restored this routine is called. +** +** This routine needs to reset the extra data section at the end of the +** page to agree with the restored data. +*/ +static void pageReinit(DbPage *pData){ + MemPage *pPage; + pPage = (MemPage *)sqlite3PagerGetExtra(pData); + assert( sqlite3PagerPageRefcount(pData)>0 ); + if( pPage->isInit ){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + pPage->isInit = 0; + if( sqlite3PagerPageRefcount(pData)>1 ){ + /* pPage might not be a btree page; it might be an overflow page + ** or ptrmap page or a free page. In those cases, the following + ** call to btreeInitPage() will likely return SQLITE_CORRUPT. + ** But no harm is done by this. And it is very important that + ** btreeInitPage() be called on every btree page so we make + ** the call for every page that comes in for re-initing. */ + btreeInitPage(pPage); + } + } +} + +/* +** Invoke the busy handler for a btree. +*/ +static int btreeInvokeBusyHandler(void *pArg){ + BtShared *pBt = (BtShared*)pArg; + assert( pBt->db ); + assert( sqlite3_mutex_held(pBt->db->mutex) ); + return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); +} + +/* +** Open a database file. +** +** zFilename is the name of the database file. If zFilename is NULL +** then an ephemeral database is created. The ephemeral database might +** be exclusively in memory, or it might use a disk-based memory cache. +** Either way, the ephemeral database will be automatically deleted +** when sqlite3BtreeClose() is called. +** +** If zFilename is ":memory:" then an in-memory database is created +** that is automatically destroyed when it is closed. +** +** The "flags" parameter is a bitmask that might contain bits like +** BTREE_OMIT_JOURNAL and/or BTREE_MEMORY. +** +** If the database is already opened in the same database connection +** and we are in shared cache mode, then the open will fail with an +** SQLITE_CONSTRAINT error. We cannot allow two or more BtShared +** objects in the same database connection since doing so will lead +** to problems with locking. +*/ +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use for this b-tree */ + const char *zFilename, /* Name of the file containing the BTree database */ + sqlite3 *db, /* Associated database handle */ + Btree **ppBtree, /* Pointer to new Btree object written here */ + int flags, /* Options */ + int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */ +){ + BtShared *pBt = 0; /* Shared part of btree structure */ + Btree *p; /* Handle to return */ + sqlite3_mutex *mutexOpen = 0; /* Prevents a race condition. Ticket #3537 */ + int rc = SQLITE_OK; /* Result code from this function */ + u8 nReserve; /* Byte of unused space on each page */ + unsigned char zDbHeader[100]; /* Database header content */ + + /* True if opening an ephemeral, temporary database */ + const int isTempDb = zFilename==0 || zFilename[0]==0; + + /* Set the variable isMemdb to true for an in-memory database, or + ** false for a file-based database. + */ +#ifdef SQLITE_OMIT_MEMORYDB + const int isMemdb = 0; +#else + const int isMemdb = (zFilename && strcmp(zFilename, ":memory:")==0) + || (isTempDb && sqlite3TempInMemory(db)) + || (vfsFlags & SQLITE_OPEN_MEMORY)!=0; +#endif + + assert( db!=0 ); + assert( pVfs!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( (flags&0xff)==flags ); /* flags fit in 8 bits */ + + /* Only a BTREE_SINGLE database can be BTREE_UNORDERED */ + assert( (flags & BTREE_UNORDERED)==0 || (flags & BTREE_SINGLE)!=0 ); + + /* A BTREE_SINGLE database is always a temporary and/or ephemeral */ + assert( (flags & BTREE_SINGLE)==0 || isTempDb ); + + if( isMemdb ){ + flags |= BTREE_MEMORY; + } + if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (isMemdb || isTempDb) ){ + vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB; + } + p = sqlite3MallocZero(sizeof(Btree)); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + p->inTrans = TRANS_NONE; + p->db = db; +#ifndef SQLITE_OMIT_SHARED_CACHE + p->lock.pBtree = p; + p->lock.iTable = 1; +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* + ** If this Btree is a candidate for shared cache, try to find an + ** existing BtShared object that we can share with + */ + if( isTempDb==0 && (isMemdb==0 || (vfsFlags&SQLITE_OPEN_URI)!=0) ){ + if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){ + int nFilename = sqlite3Strlen30(zFilename)+1; + int nFullPathname = pVfs->mxPathname+1; + char *zFullPathname = sqlite3Malloc(MAX(nFullPathname,nFilename)); + MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + + p->sharable = 1; + if( !zFullPathname ){ + sqlite3_free(p); + return SQLITE_NOMEM_BKPT; + } + if( isMemdb ){ + memcpy(zFullPathname, zFilename, nFilename); + }else{ + rc = sqlite3OsFullPathname(pVfs, zFilename, + nFullPathname, zFullPathname); + if( rc ){ + if( rc==SQLITE_OK_SYMLINK ){ + rc = SQLITE_OK; + }else{ + sqlite3_free(zFullPathname); + sqlite3_free(p); + return rc; + } + } + } +#if SQLITE_THREADSAFE + mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); + sqlite3_mutex_enter(mutexOpen); + mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); + sqlite3_mutex_enter(mutexShared); +#endif + for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ + assert( pBt->nRef>0 ); + if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager, 0)) + && sqlite3PagerVfs(pBt->pPager)==pVfs ){ + int iDb; + for(iDb=db->nDb-1; iDb>=0; iDb--){ + Btree *pExisting = db->aDb[iDb].pBt; + if( pExisting && pExisting->pBt==pBt ){ + sqlite3_mutex_leave(mutexShared); + sqlite3_mutex_leave(mutexOpen); + sqlite3_free(zFullPathname); + sqlite3_free(p); + return SQLITE_CONSTRAINT; + } + } + p->pBt = pBt; + pBt->nRef++; + break; + } + } + sqlite3_mutex_leave(mutexShared); + sqlite3_free(zFullPathname); + } +#ifdef SQLITE_DEBUG + else{ + /* In debug mode, we mark all persistent databases as sharable + ** even when they are not. This exercises the locking code and + ** gives more opportunity for asserts(sqlite3_mutex_held()) + ** statements to find locking problems. + */ + p->sharable = 1; + } +#endif + } +#endif + if( pBt==0 ){ + /* + ** The following asserts make sure that structures used by the btree are + ** the right size. This is to guard against size changes that result + ** when compiling on a different architecture. + */ + assert( sizeof(i64)==8 ); + assert( sizeof(u64)==8 ); + assert( sizeof(u32)==4 ); + assert( sizeof(u16)==2 ); + assert( sizeof(Pgno)==4 ); + + pBt = sqlite3MallocZero( sizeof(*pBt) ); + if( pBt==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto btree_open_out; + } + rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, + sizeof(MemPage), flags, vfsFlags, pageReinit); + if( rc==SQLITE_OK ){ + sqlite3PagerSetMmapLimit(pBt->pPager, db->szMmap); + rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); + } + if( rc!=SQLITE_OK ){ + goto btree_open_out; + } + pBt->openFlags = (u8)flags; + pBt->db = db; + sqlite3PagerSetBusyHandler(pBt->pPager, btreeInvokeBusyHandler, pBt); + p->pBt = pBt; + + pBt->pCursor = 0; + pBt->pPage1 = 0; + if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; +#if defined(SQLITE_SECURE_DELETE) + pBt->btsFlags |= BTS_SECURE_DELETE; +#elif defined(SQLITE_FAST_SECURE_DELETE) + pBt->btsFlags |= BTS_OVERWRITE; +#endif + /* EVIDENCE-OF: R-51873-39618 The page size for a database file is + ** determined by the 2-byte integer located at an offset of 16 bytes from + ** the beginning of the database file. */ + pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16); + if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE + || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ + pBt->pageSize = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the magic name ":memory:" will create an in-memory database, then + ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if + ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if + ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a + ** regular file-name. In this case the auto-vacuum applies as per normal. + */ + if( zFilename && !isMemdb ){ + pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0); + pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0); + } +#endif + nReserve = 0; + }else{ + /* EVIDENCE-OF: R-37497-42412 The size of the reserved region is + ** determined by the one-byte unsigned integer found at an offset of 20 + ** into the database file header. */ + nReserve = zDbHeader[20]; + pBt->btsFlags |= BTS_PAGESIZE_FIXED; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0); +#endif + } + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); + if( rc ) goto btree_open_out; + pBt->usableSize = pBt->pageSize - nReserve; + assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* Add the new BtShared object to the linked list sharable BtShareds. + */ + pBt->nRef = 1; + if( p->sharable ){ + MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);) + if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){ + pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST); + if( pBt->mutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto btree_open_out; + } + } + sqlite3_mutex_enter(mutexShared); + pBt->pNext = GLOBAL(BtShared*,sqlite3SharedCacheList); + GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt; + sqlite3_mutex_leave(mutexShared); + } +#endif + } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) + /* If the new Btree uses a sharable pBtShared, then link the new + ** Btree into the list of all sharable Btrees for the same connection. + ** The list is kept in ascending order by pBt address. + */ + if( p->sharable ){ + int i; + Btree *pSib; + for(i=0; inDb; i++){ + if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){ + while( pSib->pPrev ){ pSib = pSib->pPrev; } + if( (uptr)p->pBt<(uptr)pSib->pBt ){ + p->pNext = pSib; + p->pPrev = 0; + pSib->pPrev = p; + }else{ + while( pSib->pNext && (uptr)pSib->pNext->pBt<(uptr)p->pBt ){ + pSib = pSib->pNext; + } + p->pNext = pSib->pNext; + p->pPrev = pSib; + if( p->pNext ){ + p->pNext->pPrev = p; + } + pSib->pNext = p; + } + break; + } + } + } +#endif + *ppBtree = p; + +btree_open_out: + if( rc!=SQLITE_OK ){ + if( pBt && pBt->pPager ){ + sqlite3PagerClose(pBt->pPager, 0); + } + sqlite3_free(pBt); + sqlite3_free(p); + *ppBtree = 0; + }else{ + sqlite3_file *pFile; + + /* If the B-Tree was successfully opened, set the pager-cache size to the + ** default value. Except, when opening on an existing shared pager-cache, + ** do not change the pager-cache size. + */ + if( sqlite3BtreeSchema(p, 0, 0)==0 ){ + sqlite3BtreeSetCacheSize(p, SQLITE_DEFAULT_CACHE_SIZE); + } + + pFile = sqlite3PagerFile(pBt->pPager); + if( pFile->pMethods ){ + sqlite3OsFileControlHint(pFile, SQLITE_FCNTL_PDB, (void*)&pBt->db); + } + } + if( mutexOpen ){ + assert( sqlite3_mutex_held(mutexOpen) ); + sqlite3_mutex_leave(mutexOpen); + } + assert( rc!=SQLITE_OK || sqlite3BtreeConnectionCount(*ppBtree)>0 ); + return rc; +} + +/* +** Decrement the BtShared.nRef counter. When it reaches zero, +** remove the BtShared structure from the sharing list. Return +** true if the BtShared.nRef counter reaches zero and return +** false if it is still positive. +*/ +static int removeFromSharingList(BtShared *pBt){ +#ifndef SQLITE_OMIT_SHARED_CACHE + MUTEX_LOGIC( sqlite3_mutex *pMainMtx; ) + BtShared *pList; + int removed = 0; + + assert( sqlite3_mutex_notheld(pBt->mutex) ); + MUTEX_LOGIC( pMainMtx = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + sqlite3_mutex_enter(pMainMtx); + pBt->nRef--; + if( pBt->nRef<=0 ){ + if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){ + GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext; + }else{ + pList = GLOBAL(BtShared*,sqlite3SharedCacheList); + while( ALWAYS(pList) && pList->pNext!=pBt ){ + pList=pList->pNext; + } + if( ALWAYS(pList) ){ + pList->pNext = pBt->pNext; + } + } + if( SQLITE_THREADSAFE ){ + sqlite3_mutex_free(pBt->mutex); + } + removed = 1; + } + sqlite3_mutex_leave(pMainMtx); + return removed; +#else + return 1; +#endif +} + +/* +** Make sure pBt->pTmpSpace points to an allocation of +** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child +** pointer. +*/ +static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){ + assert( pBt!=0 ); + assert( pBt->pTmpSpace==0 ); + /* This routine is called only by btreeCursor() when allocating the + ** first write cursor for the BtShared object */ + assert( pBt->pCursor!=0 && (pBt->pCursor->curFlags & BTCF_WriteFlag)!=0 ); + pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); + if( pBt->pTmpSpace==0 ){ + BtCursor *pCur = pBt->pCursor; + pBt->pCursor = pCur->pNext; /* Unlink the cursor */ + memset(pCur, 0, sizeof(*pCur)); + return SQLITE_NOMEM_BKPT; + } + + /* One of the uses of pBt->pTmpSpace is to format cells before + ** inserting them into a leaf page (function fillInCell()). If + ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes + ** by the various routines that manipulate binary cells. Which + ** can mean that fillInCell() only initializes the first 2 or 3 + ** bytes of pTmpSpace, but that the first 4 bytes are copied from + ** it into a database page. This is not actually a problem, but it + ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** data is passed to system call write(). So to avoid this error, + ** zero the first 4 bytes of temp space here. + ** + ** Also: Provide four bytes of initialized space before the + ** beginning of pTmpSpace as an area available to prepend the + ** left-child pointer to the beginning of a cell. + */ + memset(pBt->pTmpSpace, 0, 8); + pBt->pTmpSpace += 4; + return SQLITE_OK; +} + +/* +** Free the pBt->pTmpSpace allocation +*/ +static void freeTempSpace(BtShared *pBt){ + if( pBt->pTmpSpace ){ + pBt->pTmpSpace -= 4; + sqlite3PageFree(pBt->pTmpSpace); + pBt->pTmpSpace = 0; + } +} + +/* +** Close an open database and invalidate all cursors. +*/ +SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ + BtShared *pBt = p->pBt; + + /* Close all cursors opened via this handle. */ + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + + /* Verify that no other cursors have this Btree open */ +#ifdef SQLITE_DEBUG + { + BtCursor *pCur = pBt->pCursor; + while( pCur ){ + BtCursor *pTmp = pCur; + pCur = pCur->pNext; + assert( pTmp->pBtree!=p ); + + } + } +#endif + + /* Rollback any active transaction and free the handle structure. + ** The call to sqlite3BtreeRollback() drops any table-locks held by + ** this handle. + */ + sqlite3BtreeRollback(p, SQLITE_OK, 0); + sqlite3BtreeLeave(p); + + /* If there are still other outstanding references to the shared-btree + ** structure, return now. The remainder of this procedure cleans + ** up the shared-btree. + */ + assert( p->wantToLock==0 && p->locked==0 ); + if( !p->sharable || removeFromSharingList(pBt) ){ + /* The pBt is no longer on the sharing list, so we can access + ** it without having to hold the mutex. + ** + ** Clean out and delete the BtShared object. + */ + assert( !pBt->pCursor ); + sqlite3PagerClose(pBt->pPager, p->db); + if( pBt->xFreeSchema && pBt->pSchema ){ + pBt->xFreeSchema(pBt->pSchema); + } + sqlite3DbFree(0, pBt->pSchema); + freeTempSpace(pBt); + sqlite3_free(pBt); + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( p->wantToLock==0 ); + assert( p->locked==0 ); + if( p->pPrev ) p->pPrev->pNext = p->pNext; + if( p->pNext ) p->pNext->pPrev = p->pPrev; +#endif + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Change the "soft" limit on the number of pages in the cache. +** Unused and unmodified pages will be recycled when the number of +** pages in the cache exceeds this soft limit. But the size of the +** cache is allowed to grow larger than this limit if it contains +** dirty pages or pages still in active use. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetCachesize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Change the "spill" limit on the number of pages in the cache. +** If the number of pages exceeds this limit during a write transaction, +** the pager might attempt to "spill" pages to the journal early in +** order to free up memory. +** +** The value returned is the current spill size. If zero is passed +** as an argument, no changes are made to the spill size setting, so +** using mxPage of 0 is a way to query the current spill size. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + int res; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + res = sqlite3PagerSetSpillsize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return res; +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** Change the limit on the amount of the database file that may be +** memory mapped. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree *p, sqlite3_int64 szMmap){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetMmapLimit(pBt->pPager, szMmap); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* +** Change the way data is synced to disk in order to increase or decrease +** how well the database resists damage due to OS crashes and power +** failures. Level 1 is the same as asynchronous (no syncs() occur and +** there is a high probability of damage) Level 2 is the default. There +** is a very low but non-zero probability of damage. Level 3 reduces the +** probability of damage to near zero but with a write performance reduction. +*/ +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags( + Btree *p, /* The btree to set the safety level on */ + unsigned pgFlags /* Various PAGER_* flags */ +){ + BtShared *pBt = p->pBt; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + sqlite3PagerSetFlags(pBt->pPager, pgFlags); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} +#endif + +/* +** Change the default pages size and the number of reserved bytes per page. +** Or, if the page size has already been fixed, return SQLITE_READONLY +** without changing anything. +** +** The page size must be a power of 2 between 512 and 65536. If the page +** size supplied does not meet this constraint then the page size is not +** changed. +** +** Page sizes are constrained to be a power of two so that the region +** of the database file used for locking (beginning at PENDING_BYTE, +** the first byte past the 1GB boundary, 0x40000000) needs to occur +** at the beginning of a page. +** +** If parameter nReserve is less than zero, then the number of reserved +** bytes per page is left unchanged. +** +** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size +** and autovacuum mode can no longer be changed. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ + int rc = SQLITE_OK; + int x; + BtShared *pBt = p->pBt; + assert( nReserve>=0 && nReserve<=255 ); + sqlite3BtreeEnter(p); + pBt->nReserveWanted = nReserve; + x = pBt->pageSize - pBt->usableSize; + if( nReservebtsFlags & BTS_PAGESIZE_FIXED ){ + sqlite3BtreeLeave(p); + return SQLITE_READONLY; + } + assert( nReserve>=0 && nReserve<=255 ); + if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && + ((pageSize-1)&pageSize)==0 ){ + assert( (pageSize & 7)==0 ); + assert( !pBt->pCursor ); + if( nReserve>32 && pageSize==512 ) pageSize = 1024; + pBt->pageSize = (u32)pageSize; + freeTempSpace(pBt); + } + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); + pBt->usableSize = pBt->pageSize - (u16)nReserve; + if( iFix ) pBt->btsFlags |= BTS_PAGESIZE_FIXED; + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Return the currently defined page size +*/ +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ + return p->pBt->pageSize; +} + +/* +** This function is similar to sqlite3BtreeGetReserve(), except that it +** may only be called if it is guaranteed that the b-tree mutex is already +** held. +** +** This is useful in one special case in the backup API code where it is +** known that the shared b-tree mutex is held, but the mutex on the +** database handle that owns *p is not. In this case if sqlite3BtreeEnter() +** were to be called, it might collide with some other operation on the +** database handle that owns *p, causing undefined behavior. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){ + int n; + assert( sqlite3_mutex_held(p->pBt->mutex) ); + n = p->pBt->pageSize - p->pBt->usableSize; + return n; +} + +/* +** Return the number of bytes of space at the end of every page that +** are intentually left unused. This is the "reserved" space that is +** sometimes used by extensions. +** +** The value returned is the larger of the current reserve size and +** the latest reserve size requested by SQLITE_FILECTRL_RESERVE_BYTES. +** The amount of reserve can only grow - never shrink. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetRequestedReserve(Btree *p){ + int n1, n2; + sqlite3BtreeEnter(p); + n1 = (int)p->pBt->nReserveWanted; + n2 = sqlite3BtreeGetReserveNoMutex(p); + sqlite3BtreeLeave(p); + return n1>n2 ? n1 : n2; +} + + +/* +** Set the maximum page count for a database if mxPage is positive. +** No changes are made if mxPage is 0 or negative. +** Regardless of the value of mxPage, return the maximum page count. +*/ +SQLITE_PRIVATE Pgno sqlite3BtreeMaxPageCount(Btree *p, Pgno mxPage){ + Pgno n; + sqlite3BtreeEnter(p); + n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return n; +} + +/* +** Change the values for the BTS_SECURE_DELETE and BTS_OVERWRITE flags: +** +** newFlag==0 Both BTS_SECURE_DELETE and BTS_OVERWRITE are cleared +** newFlag==1 BTS_SECURE_DELETE set and BTS_OVERWRITE is cleared +** newFlag==2 BTS_SECURE_DELETE cleared and BTS_OVERWRITE is set +** newFlag==(-1) No changes +** +** This routine acts as a query if newFlag is less than zero +** +** With BTS_OVERWRITE set, deleted content is overwritten by zeros, but +** freelist leaf pages are not written back to the database. Thus in-page +** deleted content is cleared, but freelist deleted content is not. +** +** With BTS_SECURE_DELETE, operation is like BTS_OVERWRITE with the addition +** that freelist leaf pages are written back into the database, increasing +** the amount of disk I/O. +*/ +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ + int b; + if( p==0 ) return 0; + sqlite3BtreeEnter(p); + assert( BTS_OVERWRITE==BTS_SECURE_DELETE*2 ); + assert( BTS_FAST_SECURE==(BTS_OVERWRITE|BTS_SECURE_DELETE) ); + if( newFlag>=0 ){ + p->pBt->btsFlags &= ~BTS_FAST_SECURE; + p->pBt->btsFlags |= BTS_SECURE_DELETE*newFlag; + } + b = (p->pBt->btsFlags & BTS_FAST_SECURE)/BTS_SECURE_DELETE; + sqlite3BtreeLeave(p); + return b; +} + +/* +** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' +** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it +** is disabled. The default value for the auto-vacuum property is +** determined by the SQLITE_DEFAULT_AUTOVACUUM macro. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return SQLITE_READONLY; +#else + BtShared *pBt = p->pBt; + int rc = SQLITE_OK; + u8 av = (u8)autoVacuum; + + sqlite3BtreeEnter(p); + if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){ + rc = SQLITE_READONLY; + }else{ + pBt->autoVacuum = av ?1:0; + pBt->incrVacuum = av==2 ?1:0; + } + sqlite3BtreeLeave(p); + return rc; +#endif +} + +/* +** Return the value of the 'auto-vacuum' property. If auto-vacuum is +** enabled 1 is returned. Otherwise 0. +*/ +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ +#ifdef SQLITE_OMIT_AUTOVACUUM + return BTREE_AUTOVACUUM_NONE; +#else + int rc; + sqlite3BtreeEnter(p); + rc = ( + (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE: + (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL: + BTREE_AUTOVACUUM_INCR + ); + sqlite3BtreeLeave(p); + return rc; +#endif +} + +/* +** If the user has not set the safety-level for this database connection +** using "PRAGMA synchronous", and if the safety-level is not already +** set to the value passed to this function as the second parameter, +** set it so. +*/ +#if SQLITE_DEFAULT_SYNCHRONOUS!=SQLITE_DEFAULT_WAL_SYNCHRONOUS \ + && !defined(SQLITE_OMIT_WAL) +static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){ + sqlite3 *db; + Db *pDb; + if( (db=pBt->db)!=0 && (pDb=db->aDb)!=0 ){ + while( pDb->pBt==0 || pDb->pBt->pBt!=pBt ){ pDb++; } + if( pDb->bSyncSet==0 + && pDb->safety_level!=safety_level + && pDb!=&db->aDb[1] + ){ + pDb->safety_level = safety_level; + sqlite3PagerSetFlags(pBt->pPager, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK)); + } + } +} +#else +# define setDefaultSyncFlag(pBt,safety_level) +#endif + +/* Forward declaration */ +static int newDatabase(BtShared*); + + +/* +** Get a reference to pPage1 of the database file. This will +** also acquire a readlock on that file. +** +** SQLITE_OK is returned on success. If the file is not a +** well-formed database file, then SQLITE_CORRUPT is returned. +** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM +** is returned if we run out of memory. +*/ +static int lockBtree(BtShared *pBt){ + int rc; /* Result code from subfunctions */ + MemPage *pPage1; /* Page 1 of the database file */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pBt->pPage1==0 ); + rc = sqlite3PagerSharedLock(pBt->pPager); + if( rc!=SQLITE_OK ) return rc; + rc = btreeGetPage(pBt, 1, &pPage1, 0); + if( rc!=SQLITE_OK ) return rc; + + /* Do some checking to help insure the file we opened really is + ** a valid database file. + */ + nPage = get4byte(28+(u8*)pPage1->aData); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); + if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ + nPage = nPageFile; + } + if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){ + nPage = 0; + } + if( nPage>0 ){ + u32 pageSize; + u32 usableSize; + u8 *page1 = pPage1->aData; + rc = SQLITE_NOTADB; + /* EVIDENCE-OF: R-43737-39999 Every valid SQLite database file begins + ** with the following 16 bytes (in hex): 53 51 4c 69 74 65 20 66 6f 72 6d + ** 61 74 20 33 00. */ + if( memcmp(page1, zMagicHeader, 16)!=0 ){ + goto page1_init_failed; + } + +#ifdef SQLITE_OMIT_WAL + if( page1[18]>1 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } + if( page1[19]>1 ){ + goto page1_init_failed; + } +#else + if( page1[18]>2 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } + if( page1[19]>2 ){ + goto page1_init_failed; + } + + /* If the read version is set to 2, this database should be accessed + ** in WAL mode. If the log is not already open, open it now. Then + ** return SQLITE_OK and return without populating BtShared.pPage1. + ** The caller detects this and calls this function again. This is + ** required as the version of page 1 currently in the page1 buffer + ** may not be the latest version - there may be a newer one in the log + ** file. + */ + if( page1[19]==2 && (pBt->btsFlags & BTS_NO_WAL)==0 ){ + int isOpen = 0; + rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen); + if( rc!=SQLITE_OK ){ + goto page1_init_failed; + }else{ + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_WAL_SYNCHRONOUS+1); + if( isOpen==0 ){ + releasePageOne(pPage1); + return SQLITE_OK; + } + } + rc = SQLITE_NOTADB; + }else{ + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_SYNCHRONOUS+1); + } +#endif + + /* EVIDENCE-OF: R-15465-20813 The maximum and minimum embedded payload + ** fractions and the leaf payload fraction values must be 64, 32, and 32. + ** + ** The original design allowed these amounts to vary, but as of + ** version 3.6.0, we require them to be fixed. + */ + if( memcmp(&page1[21], "\100\040\040",3)!=0 ){ + goto page1_init_failed; + } + /* EVIDENCE-OF: R-51873-39618 The page size for a database file is + ** determined by the 2-byte integer located at an offset of 16 bytes from + ** the beginning of the database file. */ + pageSize = (page1[16]<<8) | (page1[17]<<16); + /* EVIDENCE-OF: R-25008-21688 The size of a page is a power of two + ** between 512 and 65536 inclusive. */ + if( ((pageSize-1)&pageSize)!=0 + || pageSize>SQLITE_MAX_PAGE_SIZE + || pageSize<=256 + ){ + goto page1_init_failed; + } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; + assert( (pageSize & 7)==0 ); + /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte + ** integer at offset 20 is the number of bytes of space at the end of + ** each page to reserve for extensions. + ** + ** EVIDENCE-OF: R-37497-42412 The size of the reserved region is + ** determined by the one-byte unsigned integer found at an offset of 20 + ** into the database file header. */ + usableSize = pageSize - page1[20]; + if( (u32)pageSize!=pBt->pageSize ){ + /* After reading the first page of the database assuming a page size + ** of BtShared.pageSize, we have discovered that the page-size is + ** actually pageSize. Unlock the database, leave pBt->pPage1 at + ** zero and return SQLITE_OK. The caller will call this function + ** again with the correct page-size. + */ + releasePageOne(pPage1); + pBt->usableSize = usableSize; + pBt->pageSize = pageSize; + freeTempSpace(pBt); + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, + pageSize-usableSize); + return rc; + } + if( nPage>nPageFile ){ + if( sqlite3WritableSchema(pBt->db)==0 ){ + rc = SQLITE_CORRUPT_BKPT; + goto page1_init_failed; + }else{ + nPage = nPageFile; + } + } + /* EVIDENCE-OF: R-28312-64704 However, the usable size is not allowed to + ** be less than 480. In other words, if the page size is 512, then the + ** reserved space size cannot exceed 32. */ + if( usableSize<480 ){ + goto page1_init_failed; + } + pBt->pageSize = pageSize; + pBt->usableSize = usableSize; +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0); + pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0); +#endif + } + + /* maxLocal is the maximum amount of payload to store locally for + ** a cell. Make sure it is small enough so that at least minFanout + ** cells can will fit on one page. We assume a 10-byte page header. + ** Besides the payload, the cell must store: + ** 2-byte pointer to the cell + ** 4-byte child pointer + ** 9-byte nKey value + ** 4-byte nData value + ** 4-byte overflow page pointer + ** So a cell consists of a 2-byte pointer, a header which is as much as + ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow + ** page pointer. + */ + pBt->maxLocal = (u16)((pBt->usableSize-12)*64/255 - 23); + pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23); + pBt->maxLeaf = (u16)(pBt->usableSize - 35); + pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23); + if( pBt->maxLocal>127 ){ + pBt->max1bytePayload = 127; + }else{ + pBt->max1bytePayload = (u8)pBt->maxLocal; + } + assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); + pBt->pPage1 = pPage1; + pBt->nPage = nPage; + return SQLITE_OK; + +page1_init_failed: + releasePageOne(pPage1); + pBt->pPage1 = 0; + return rc; +} + +#ifndef NDEBUG +/* +** Return the number of cursors open on pBt. This is for use +** in assert() expressions, so it is only compiled if NDEBUG is not +** defined. +** +** Only write cursors are counted if wrOnly is true. If wrOnly is +** false then all cursors are counted. +** +** For the purposes of this routine, a cursor is any cursor that +** is capable of reading or writing to the database. Cursors that +** have been tripped into the CURSOR_FAULT state are not counted. +*/ +static int countValidCursors(BtShared *pBt, int wrOnly){ + BtCursor *pCur; + int r = 0; + for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){ + if( (wrOnly==0 || (pCur->curFlags & BTCF_WriteFlag)!=0) + && pCur->eState!=CURSOR_FAULT ) r++; + } + return r; +} +#endif + +/* +** If there are no outstanding cursors and we are not in the middle +** of a transaction but there is a read lock on the database, then +** this routine unrefs the first page of the database file which +** has the effect of releasing the read lock. +** +** If there is a transaction in progress, this routine is a no-op. +*/ +static void unlockBtreeIfUnused(BtShared *pBt){ + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( countValidCursors(pBt,0)==0 || pBt->inTransaction>TRANS_NONE ); + if( pBt->inTransaction==TRANS_NONE && pBt->pPage1!=0 ){ + MemPage *pPage1 = pBt->pPage1; + assert( pPage1->aData ); + assert( sqlite3PagerRefcount(pBt->pPager)==1 ); + pBt->pPage1 = 0; + releasePageOne(pPage1); + } +} + +/* +** If pBt points to an empty file then convert that empty file +** into a new empty database by initializing the first page of +** the database. +*/ +static int newDatabase(BtShared *pBt){ + MemPage *pP1; + unsigned char *data; + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pBt->nPage>0 ){ + return SQLITE_OK; + } + pP1 = pBt->pPage1; + assert( pP1!=0 ); + data = pP1->aData; + rc = sqlite3PagerWrite(pP1->pDbPage); + if( rc ) return rc; + memcpy(data, zMagicHeader, sizeof(zMagicHeader)); + assert( sizeof(zMagicHeader)==16 ); + data[16] = (u8)((pBt->pageSize>>8)&0xff); + data[17] = (u8)((pBt->pageSize>>16)&0xff); + data[18] = 1; + data[19] = 1; + assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize); + data[20] = (u8)(pBt->pageSize - pBt->usableSize); + data[21] = 64; + data[22] = 32; + data[23] = 32; + memset(&data[24], 0, 100-24); + zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); + pBt->btsFlags |= BTS_PAGESIZE_FIXED; +#ifndef SQLITE_OMIT_AUTOVACUUM + assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 ); + assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 ); + put4byte(&data[36 + 4*4], pBt->autoVacuum); + put4byte(&data[36 + 7*4], pBt->incrVacuum); +#endif + pBt->nPage = 1; + data[31] = 1; + return SQLITE_OK; +} + +/* +** Initialize the first page of the database file (creating a database +** consisting of a single page and no schema objects). Return SQLITE_OK +** if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + p->pBt->nPage = 0; + rc = newDatabase(p->pBt); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Attempt to start a new transaction. A write-transaction +** is started if the second argument is nonzero, otherwise a read- +** transaction. If the second argument is 2 or more and exclusive +** transaction is started, meaning that no other process is allowed +** to access the database. A preexisting transaction may not be +** upgraded to exclusive by calling this routine a second time - the +** exclusivity flag only works for a new transaction. +** +** A write-transaction must be started before attempting any +** changes to the database. None of the following routines +** will work unless a transaction is started first: +** +** sqlite3BtreeCreateTable() +** sqlite3BtreeCreateIndex() +** sqlite3BtreeClearTable() +** sqlite3BtreeDropTable() +** sqlite3BtreeInsert() +** sqlite3BtreeDelete() +** sqlite3BtreeUpdateMeta() +** +** If an initial attempt to acquire the lock fails because of lock contention +** and the database was previously unlocked, then invoke the busy handler +** if there is one. But if there was previously a read-lock, do not +** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is +** returned when there is already a read-lock in order to avoid a deadlock. +** +** Suppose there are two processes A and B. A has a read lock and B has +** a reserved lock. B tries to promote to exclusive but is blocked because +** of A's read lock. A tries to promote to reserved but is blocked by B. +** One or the other of the two processes must give way or there can be +** no progress. By returning SQLITE_BUSY and not invoking the busy callback +** when A already has a read lock, we encourage A to give up and let B +** proceed. +*/ +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ + BtShared *pBt = p->pBt; + Pager *pPager = pBt->pPager; + int rc = SQLITE_OK; + + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the btree is already in a write-transaction, or it + ** is already in a read-transaction and a read-transaction + ** is requested, this is a no-op. + */ + if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ + goto trans_begun; + } + assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); + + if( (p->db->flags & SQLITE_ResetDatabase) + && sqlite3PagerIsreadonly(pPager)==0 + ){ + pBt->btsFlags &= ~BTS_READ_ONLY; + } + + /* Write transactions are not possible on a read-only database */ + if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){ + rc = SQLITE_READONLY; + goto trans_begun; + } + +#ifndef SQLITE_OMIT_SHARED_CACHE + { + sqlite3 *pBlock = 0; + /* If another database handle has already opened a write transaction + ** on this shared-btree structure and a second write transaction is + ** requested, return SQLITE_LOCKED. + */ + if( (wrflag && pBt->inTransaction==TRANS_WRITE) + || (pBt->btsFlags & BTS_PENDING)!=0 + ){ + pBlock = pBt->pWriter->db; + }else if( wrflag>1 ){ + BtLock *pIter; + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->pBtree!=p ){ + pBlock = pIter->pBtree->db; + break; + } + } + } + if( pBlock ){ + sqlite3ConnectionBlocked(p->db, pBlock); + rc = SQLITE_LOCKED_SHAREDCACHE; + goto trans_begun; + } + } +#endif + + /* Any read-only or read-write transaction implies a read-lock on + ** page 1. So if some other shared-cache client already has a write-lock + ** on page 1, the transaction cannot be opened. */ + rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); + if( SQLITE_OK!=rc ) goto trans_begun; + + pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; + if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; + do { + sqlite3PagerWalDb(pPager, p->db); + +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* If transitioning from no transaction directly to a write transaction, + ** block for the WRITER lock first if possible. */ + if( pBt->pPage1==0 && wrflag ){ + assert( pBt->inTransaction==TRANS_NONE ); + rc = sqlite3PagerWalWriteLock(pPager, 1); + if( rc!=SQLITE_BUSY && rc!=SQLITE_OK ) break; + } +#endif + + /* Call lockBtree() until either pBt->pPage1 is populated or + ** lockBtree() returns something other than SQLITE_OK. lockBtree() + ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after + ** reading page 1 it discovers that the page-size of the database + ** file is not pBt->pageSize. In this case lockBtree() will update + ** pBt->pageSize to the page-size of the file on disk. + */ + while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); + + if( rc==SQLITE_OK && wrflag ){ + if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ + rc = SQLITE_READONLY; + }else{ + rc = sqlite3PagerBegin(pPager, wrflag>1, sqlite3TempInMemory(p->db)); + if( rc==SQLITE_OK ){ + rc = newDatabase(pBt); + }else if( rc==SQLITE_BUSY_SNAPSHOT && pBt->inTransaction==TRANS_NONE ){ + /* if there was no transaction opened when this function was + ** called and SQLITE_BUSY_SNAPSHOT is returned, change the error + ** code to SQLITE_BUSY. */ + rc = SQLITE_BUSY; + } + } + } + + if( rc!=SQLITE_OK ){ + (void)sqlite3PagerWalWriteLock(pPager, 0); + unlockBtreeIfUnused(pBt); + } + }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && + btreeInvokeBusyHandler(pBt) ); + sqlite3PagerWalDb(pPager, 0); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ) rc = SQLITE_BUSY; +#endif + + if( rc==SQLITE_OK ){ + if( p->inTrans==TRANS_NONE ){ + pBt->nTransaction++; +#ifndef SQLITE_OMIT_SHARED_CACHE + if( p->sharable ){ + assert( p->lock.pBtree==p && p->lock.iTable==1 ); + p->lock.eLock = READ_LOCK; + p->lock.pNext = pBt->pLock; + pBt->pLock = &p->lock; + } +#endif + } + p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ); + if( p->inTrans>pBt->inTransaction ){ + pBt->inTransaction = p->inTrans; + } + if( wrflag ){ + MemPage *pPage1 = pBt->pPage1; +#ifndef SQLITE_OMIT_SHARED_CACHE + assert( !pBt->pWriter ); + pBt->pWriter = p; + pBt->btsFlags &= ~BTS_EXCLUSIVE; + if( wrflag>1 ) pBt->btsFlags |= BTS_EXCLUSIVE; +#endif + + /* If the db-size header field is incorrect (as it may be if an old + ** client has been writing the database file), update it now. Doing + ** this sooner rather than later means the database size can safely + ** re-read the database size from page 1 if a savepoint or transaction + ** rollback occurs within the transaction. + */ + if( pBt->nPage!=get4byte(&pPage1->aData[28]) ){ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pPage1->aData[28], pBt->nPage); + } + } + } + } + +trans_begun: + if( rc==SQLITE_OK ){ + if( pSchemaVersion ){ + *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]); + } + if( wrflag ){ + /* This call makes sure that the pager has the correct number of + ** open savepoints. If the second parameter is greater than 0 and + ** the sub-journal is not already open, then it will be opened here. + */ + rc = sqlite3PagerOpenSavepoint(pPager, p->db->nSavepoint); + } + } + + btreeIntegrity(p); + sqlite3BtreeLeave(p); + return rc; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM + +/* +** Set the pointer-map entries for all children of page pPage. Also, if +** pPage contains cells that point to overflow pages, set the pointer +** map entries for the overflow pages as well. +*/ +static int setChildPtrmaps(MemPage *pPage){ + int i; /* Counter variable */ + int nCell; /* Number of cells in page pPage */ + int rc; /* Return code */ + BtShared *pBt = pPage->pBt; + Pgno pgno = pPage->pgno; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); + if( rc!=SQLITE_OK ) return rc; + nCell = pPage->nCell; + + for(i=0; ileaf ){ + Pgno childPgno = get4byte(pCell); + ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); + } + } + + if( !pPage->leaf ){ + Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); + } + + return rc; +} + +/* +** Somewhere on pPage is a pointer to page iFrom. Modify this pointer so +** that it points to iTo. Parameter eType describes the type of pointer to +** be modified, as follows: +** +** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child +** page of pPage. +** +** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow +** page pointed to by one of the cells on pPage. +** +** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next +** overflow page in the list. +*/ +static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + if( eType==PTRMAP_OVERFLOW2 ){ + /* The pointer is always the first 4 bytes of the page in this case. */ + if( get4byte(pPage->aData)!=iFrom ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + put4byte(pPage->aData, iTo); + }else{ + int i; + int nCell; + int rc; + + rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); + if( rc ) return rc; + nCell = pPage->nCell; + + for(i=0; ixParseCell(pPage, pCell, &info); + if( info.nLocal pPage->aData+pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( iFrom==get4byte(pCell+info.nSize-4) ){ + put4byte(pCell+info.nSize-4, iTo); + break; + } + } + }else{ + if( get4byte(pCell)==iFrom ){ + put4byte(pCell, iTo); + break; + } + } + } + + if( i==nCell ){ + if( eType!=PTRMAP_BTREE || + get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); + } + } + return SQLITE_OK; +} + + +/* +** Move the open database page pDbPage to location iFreePage in the +** database. The pDbPage reference remains valid. +** +** The isCommit flag indicates that there is no need to remember that +** the journal needs to be sync()ed before database page pDbPage->pgno +** can be written to. The caller has already promised not to write to that +** page. +*/ +static int relocatePage( + BtShared *pBt, /* Btree */ + MemPage *pDbPage, /* Open page to move */ + u8 eType, /* Pointer map 'type' entry for pDbPage */ + Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */ + Pgno iFreePage, /* The location to move pDbPage to */ + int isCommit /* isCommit flag passed to sqlite3PagerMovepage */ +){ + MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */ + Pgno iDbPage = pDbPage->pgno; + Pager *pPager = pBt->pPager; + int rc; + + assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || + eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( pDbPage->pBt==pBt ); + if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT; + + /* Move page iDbPage from its current location to page number iFreePage */ + TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", + iDbPage, iFreePage, iPtrPage, eType)); + rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit); + if( rc!=SQLITE_OK ){ + return rc; + } + pDbPage->pgno = iFreePage; + + /* If pDbPage was a btree-page, then it may have child pages and/or cells + ** that point to overflow pages. The pointer map entries for all these + ** pages need to be changed. + ** + ** If pDbPage is an overflow page, then the first 4 bytes may store a + ** pointer to a subsequent overflow page. If this is the case, then + ** the pointer map needs to be updated for the subsequent overflow page. + */ + if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){ + rc = setChildPtrmaps(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + Pgno nextOvfl = get4byte(pDbPage->aData); + if( nextOvfl!=0 ){ + ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc); + if( rc!=SQLITE_OK ){ + return rc; + } + } + } + + /* Fix the database pointer on page iPtrPage that pointed at iDbPage so + ** that it points at iFreePage. Also fix the pointer map entry for + ** iPtrPage. + */ + if( eType!=PTRMAP_ROOTPAGE ){ + rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pPtrPage->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pPtrPage); + return rc; + } + rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType); + releasePage(pPtrPage); + if( rc==SQLITE_OK ){ + ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc); + } + } + return rc; +} + +/* Forward declaration required by incrVacuumStep(). */ +static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); + +/* +** Perform a single step of an incremental-vacuum. If successful, return +** SQLITE_OK. If there is no work to do (and therefore no point in +** calling this function again), return SQLITE_DONE. Or, if an error +** occurs, return some other error code. +** +** More specifically, this function attempts to re-organize the database so +** that the last page of the file currently in use is no longer in use. +** +** Parameter nFin is the number of pages that this database would contain +** were this function called until it returns SQLITE_DONE. +** +** If the bCommit parameter is non-zero, this function assumes that the +** caller will keep calling incrVacuumStep() until it returns SQLITE_DONE +** or an error. bCommit is passed true for an auto-vacuum-on-commit +** operation, or false for an incremental vacuum. +*/ +static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ + Pgno nFreeList; /* Number of pages still on the free-list */ + int rc; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( iLastPg>nFin ); + + if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ + u8 eType; + Pgno iPtrPage; + + nFreeList = get4byte(&pBt->pPage1->aData[36]); + if( nFreeList==0 ){ + return SQLITE_DONE; + } + + rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); + if( rc!=SQLITE_OK ){ + return rc; + } + if( eType==PTRMAP_ROOTPAGE ){ + return SQLITE_CORRUPT_BKPT; + } + + if( eType==PTRMAP_FREEPAGE ){ + if( bCommit==0 ){ + /* Remove the page from the files free-list. This is not required + ** if bCommit is non-zero. In that case, the free-list will be + ** truncated to zero after this function returns, so it doesn't + ** matter if it still contains some garbage entries. + */ + Pgno iFreePg; + MemPage *pFreePg; + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, BTALLOC_EXACT); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( iFreePg==iLastPg ); + releasePage(pFreePg); + } + } else { + Pgno iFreePg; /* Index of free page to move pLastPg to */ + MemPage *pLastPg; + u8 eMode = BTALLOC_ANY; /* Mode parameter for allocateBtreePage() */ + Pgno iNear = 0; /* nearby parameter for allocateBtreePage() */ + + rc = btreeGetPage(pBt, iLastPg, &pLastPg, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If bCommit is zero, this loop runs exactly once and page pLastPg + ** is swapped with the first free page pulled off the free list. + ** + ** On the other hand, if bCommit is greater than zero, then keep + ** looping until a free-page located within the first nFin pages + ** of the file is found. + */ + if( bCommit==0 ){ + eMode = BTALLOC_LE; + iNear = nFin; + } + do { + MemPage *pFreePg; + Pgno dbSize = btreePagecount(pBt); + rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode); + if( rc!=SQLITE_OK ){ + releasePage(pLastPg); + return rc; + } + releasePage(pFreePg); + if( iFreePg>dbSize ){ + releasePage(pLastPg); + return SQLITE_CORRUPT_BKPT; + } + }while( bCommit && iFreePg>nFin ); + assert( iFreePgbDoTruncate = 1; + pBt->nPage = iLastPg; + } + return SQLITE_OK; +} + +/* +** The database opened by the first argument is an auto-vacuum database +** nOrig pages in size containing nFree free pages. Return the expected +** size of the database in pages following an auto-vacuum operation. +*/ +static Pgno finalDbSize(BtShared *pBt, Pgno nOrig, Pgno nFree){ + int nEntry; /* Number of entries on one ptrmap page */ + Pgno nPtrmap; /* Number of PtrMap pages to be freed */ + Pgno nFin; /* Return value */ + + nEntry = pBt->usableSize/5; + nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+nEntry)/nEntry; + nFin = nOrig - nFree - nPtrmap; + if( nOrig>PENDING_BYTE_PAGE(pBt) && nFinpBt; + + sqlite3BtreeEnter(p); + assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); + if( !pBt->autoVacuum ){ + rc = SQLITE_DONE; + }else{ + Pgno nOrig = btreePagecount(pBt); + Pgno nFree = get4byte(&pBt->pPage1->aData[36]); + Pgno nFin = finalDbSize(pBt, nOrig, nFree); + + if( nOrig=nOrig ){ + rc = SQLITE_CORRUPT_BKPT; + }else if( nFree>0 ){ + rc = saveAllCursors(pBt, 0, 0); + if( rc==SQLITE_OK ){ + invalidateAllOverflowCache(pBt); + rc = incrVacuumStep(pBt, nFin, nOrig, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + put4byte(&pBt->pPage1->aData[28], pBt->nPage); + } + }else{ + rc = SQLITE_DONE; + } + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine is called prior to sqlite3PagerCommit when a transaction +** is committed for an auto-vacuum database. +*/ +static int autoVacuumCommit(Btree *p){ + int rc = SQLITE_OK; + Pager *pPager; + BtShared *pBt; + sqlite3 *db; + VVA_ONLY( int nRef ); + + assert( p!=0 ); + pBt = p->pBt; + pPager = pBt->pPager; + VVA_ONLY( nRef = sqlite3PagerRefcount(pPager); ) + + assert( sqlite3_mutex_held(pBt->mutex) ); + invalidateAllOverflowCache(pBt); + assert(pBt->autoVacuum); + if( !pBt->incrVacuum ){ + Pgno nFin; /* Number of pages in database after autovacuuming */ + Pgno nFree; /* Number of pages on the freelist initially */ + Pgno nVac; /* Number of pages to vacuum */ + Pgno iFree; /* The next page to be freed */ + Pgno nOrig; /* Database size before freeing */ + + nOrig = btreePagecount(pBt); + if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){ + /* It is not possible to create a database for which the final page + ** is either a pointer-map page or the pending-byte page. If one + ** is encountered, this indicates corruption. + */ + return SQLITE_CORRUPT_BKPT; + } + + nFree = get4byte(&pBt->pPage1->aData[36]); + db = p->db; + if( db->xAutovacPages ){ + int iDb; + for(iDb=0; ALWAYS(iDbnDb); iDb++){ + if( db->aDb[iDb].pBt==p ) break; + } + nVac = db->xAutovacPages( + db->pAutovacPagesArg, + db->aDb[iDb].zDbSName, + nOrig, + nFree, + pBt->pageSize + ); + if( nVac>nFree ){ + nVac = nFree; + } + if( nVac==0 ){ + return SQLITE_OK; + } + }else{ + nVac = nFree; + } + nFin = finalDbSize(pBt, nOrig, nVac); + if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT; + if( nFinnFin && rc==SQLITE_OK; iFree--){ + rc = incrVacuumStep(pBt, nFin, iFree, nVac==nFree); + } + if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( nVac==nFree ){ + put4byte(&pBt->pPage1->aData[32], 0); + put4byte(&pBt->pPage1->aData[36], 0); + } + put4byte(&pBt->pPage1->aData[28], nFin); + pBt->bDoTruncate = 1; + pBt->nPage = nFin; + } + if( rc!=SQLITE_OK ){ + sqlite3PagerRollback(pPager); + } + } + + assert( nRef>=sqlite3PagerRefcount(pPager) ); + return rc; +} + +#else /* ifndef SQLITE_OMIT_AUTOVACUUM */ +# define setChildPtrmaps(x) SQLITE_OK +#endif + +/* +** This routine does the first phase of a two-phase commit. This routine +** causes a rollback journal to be created (if it does not already exist) +** and populated with enough information so that if a power loss occurs +** the database can be restored to its original state by playing back +** the journal. Then the contents of the journal are flushed out to +** the disk. After the journal is safely on oxide, the changes to the +** database are written into the database file and flushed to oxide. +** At the end of this call, the rollback journal still exists on the +** disk and we are still holding all locks, so the transaction has not +** committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the +** commit process. +** +** This call is a no-op if no write-transaction is currently active on pBt. +** +** Otherwise, sync the database file for the btree pBt. zSuperJrnl points to +** the name of a super-journal file that should be written into the +** individual journal file, or is NULL, indicating no super-journal file +** (single database transaction). +** +** When this is called, the super-journal should already have been +** created, populated with this journal pointer and synced to disk. +** +** Once this is routine has returned, the only thing required to commit +** the write-transaction for this database file is to delete the journal. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zSuperJrnl){ + int rc = SQLITE_OK; + if( p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + rc = autoVacuumCommit(p); + if( rc!=SQLITE_OK ){ + sqlite3BtreeLeave(p); + return rc; + } + } + if( pBt->bDoTruncate ){ + sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); + } +#endif + rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zSuperJrnl, 0); + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** This function is called from both BtreeCommitPhaseTwo() and BtreeRollback() +** at the conclusion of a transaction. +*/ +static void btreeEndTransaction(Btree *p){ + BtShared *pBt = p->pBt; + sqlite3 *db = p->db; + assert( sqlite3BtreeHoldsMutex(p) ); + +#ifndef SQLITE_OMIT_AUTOVACUUM + pBt->bDoTruncate = 0; +#endif + if( p->inTrans>TRANS_NONE && db->nVdbeRead>1 ){ + /* If there are other active statements that belong to this database + ** handle, downgrade to a read-only transaction. The other statements + ** may still be reading from the database. */ + downgradeAllSharedCacheTableLocks(p); + p->inTrans = TRANS_READ; + }else{ + /* If the handle had any kind of transaction open, decrement the + ** transaction count of the shared btree. If the transaction count + ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused() + ** call below will unlock the pager. */ + if( p->inTrans!=TRANS_NONE ){ + clearAllSharedCacheTableLocks(p); + pBt->nTransaction--; + if( 0==pBt->nTransaction ){ + pBt->inTransaction = TRANS_NONE; + } + } + + /* Set the current transaction state to TRANS_NONE and unlock the + ** pager if this call closed the only read or write transaction. */ + p->inTrans = TRANS_NONE; + unlockBtreeIfUnused(pBt); + } + + btreeIntegrity(p); +} + +/* +** Commit the transaction currently in progress. +** +** This routine implements the second phase of a 2-phase commit. The +** sqlite3BtreeCommitPhaseOne() routine does the first phase and should +** be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne() +** routine did all the work of writing information out to disk and flushing the +** contents so that they are written onto the disk platter. All this +** routine has to do is delete or truncate or zero the header in the +** the rollback journal (which causes the transaction to commit) and +** drop locks. +** +** Normally, if an error occurs while the pager layer is attempting to +** finalize the underlying journal file, this function returns an error and +** the upper layer will attempt a rollback. However, if the second argument +** is non-zero then this b-tree transaction is part of a multi-file +** transaction. In this case, the transaction has already been committed +** (by deleting a super-journal file) and the caller will ignore this +** functions return code. So, even if an error occurs in the pager layer, +** reset the b-tree objects internal state to indicate that the write +** transaction has been closed. This is quite safe, as the pager will have +** transitioned to the error state. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ + + if( p->inTrans==TRANS_NONE ) return SQLITE_OK; + sqlite3BtreeEnter(p); + btreeIntegrity(p); + + /* If the handle has a write-transaction open, commit the shared-btrees + ** transaction and set the shared state to TRANS_READ. + */ + if( p->inTrans==TRANS_WRITE ){ + int rc; + BtShared *pBt = p->pBt; + assert( pBt->inTransaction==TRANS_WRITE ); + assert( pBt->nTransaction>0 ); + rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); + if( rc!=SQLITE_OK && bCleanup==0 ){ + sqlite3BtreeLeave(p); + return rc; + } + p->iBDataVersion--; /* Compensate for pPager->iDataVersion++; */ + pBt->inTransaction = TRANS_READ; + btreeClearHasContent(pBt); + } + + btreeEndTransaction(p); + sqlite3BtreeLeave(p); + return SQLITE_OK; +} + +/* +** Do both phases of a commit. +*/ +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){ + int rc; + sqlite3BtreeEnter(p); + rc = sqlite3BtreeCommitPhaseOne(p, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeCommitPhaseTwo(p, 0); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** This routine sets the state to CURSOR_FAULT and the error +** code to errCode for every cursor on any BtShared that pBtree +** references. Or if the writeOnly flag is set to 1, then only +** trip write cursors and leave read cursors unchanged. +** +** Every cursor is a candidate to be tripped, including cursors +** that belong to other database connections that happen to be +** sharing the cache with pBtree. +** +** This routine gets called when a rollback occurs. If the writeOnly +** flag is true, then only write-cursors need be tripped - read-only +** cursors save their current positions so that they may continue +** following the rollback. Or, if writeOnly is false, all cursors are +** tripped. In general, writeOnly is false if the transaction being +** rolled back modified the database schema. In this case b-tree root +** pages may be moved or deleted from the database altogether, making +** it unsafe for read cursors to continue. +** +** If the writeOnly flag is true and an error is encountered while +** saving the current position of a read-only cursor, all cursors, +** including all read-cursors are tripped. +** +** SQLITE_OK is returned if successful, or if an error occurs while +** saving a cursor position, an SQLite error code. +*/ +SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int writeOnly){ + BtCursor *p; + int rc = SQLITE_OK; + + assert( (writeOnly==0 || writeOnly==1) && BTCF_WriteFlag==1 ); + if( pBtree ){ + sqlite3BtreeEnter(pBtree); + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( writeOnly && (p->curFlags & BTCF_WriteFlag)==0 ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ + rc = saveCursorPosition(p); + if( rc!=SQLITE_OK ){ + (void)sqlite3BtreeTripAllCursors(pBtree, rc, 0); + break; + } + } + }else{ + sqlite3BtreeClearCursor(p); + p->eState = CURSOR_FAULT; + p->skipNext = errCode; + } + btreeReleaseAllCursorPages(p); + } + sqlite3BtreeLeave(pBtree); + } + return rc; +} + +/* +** Set the pBt->nPage field correctly, according to the current +** state of the database. Assume pBt->pPage1 is valid. +*/ +static void btreeSetNPage(BtShared *pBt, MemPage *pPage1){ + int nPage = get4byte(&pPage1->aData[28]); + testcase( nPage==0 ); + if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage); + testcase( pBt->nPage!=(u32)nPage ); + pBt->nPage = nPage; +} + +/* +** Rollback the transaction in progress. +** +** If tripCode is not SQLITE_OK then cursors will be invalidated (tripped). +** Only write cursors are tripped if writeOnly is true but all cursors are +** tripped if writeOnly is false. Any attempt to use +** a tripped cursor will result in an error. +** +** This will release the write lock on the database file. If there +** are no active cursors, it also releases the read lock. +*/ +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ + int rc; + BtShared *pBt = p->pBt; + MemPage *pPage1; + + assert( writeOnly==1 || writeOnly==0 ); + assert( tripCode==SQLITE_ABORT_ROLLBACK || tripCode==SQLITE_OK ); + sqlite3BtreeEnter(p); + if( tripCode==SQLITE_OK ){ + rc = tripCode = saveAllCursors(pBt, 0, 0); + if( rc ) writeOnly = 0; + }else{ + rc = SQLITE_OK; + } + if( tripCode ){ + int rc2 = sqlite3BtreeTripAllCursors(p, tripCode, writeOnly); + assert( rc==SQLITE_OK || (writeOnly==0 && rc2==SQLITE_OK) ); + if( rc2!=SQLITE_OK ) rc = rc2; + } + btreeIntegrity(p); + + if( p->inTrans==TRANS_WRITE ){ + int rc2; + + assert( TRANS_WRITE==pBt->inTransaction ); + rc2 = sqlite3PagerRollback(pBt->pPager); + if( rc2!=SQLITE_OK ){ + rc = rc2; + } + + /* The rollback may have destroyed the pPage1->aData value. So + ** call btreeGetPage() on page 1 again to make + ** sure pPage1->aData is set correctly. */ + if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){ + btreeSetNPage(pBt, pPage1); + releasePageOne(pPage1); + } + assert( countValidCursors(pBt, 1)==0 ); + pBt->inTransaction = TRANS_READ; + btreeClearHasContent(pBt); + } + + btreeEndTransaction(p); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Start a statement subtransaction. The subtransaction can be rolled +** back independently of the main transaction. You must start a transaction +** before starting a subtransaction. The subtransaction is ended automatically +** if the main transaction commits or rolls back. +** +** Statement subtransactions are used around individual SQL statements +** that are contained within a BEGIN...COMMIT block. If a constraint +** error occurs within the statement, the effect of that one statement +** can be rolled back without having to rollback the entire transaction. +** +** A statement sub-transaction is implemented as an anonymous savepoint. The +** value passed as the second parameter is the total number of savepoints, +** including the new anonymous savepoint, open on the B-Tree. i.e. if there +** are no active savepoints and no other statement-transactions open, +** iStatement is 1. This anonymous savepoint can be released or rolled back +** using the sqlite3BtreeSavepoint() function. +*/ +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( iStatement>0 ); + assert( iStatement>p->db->nSavepoint ); + assert( pBt->inTransaction==TRANS_WRITE ); + /* At the pager level, a statement transaction is a savepoint with + ** an index greater than all savepoints created explicitly using + ** SQL statements. It is illegal to open, release or rollback any + ** such savepoints while the statement transaction savepoint is active. + */ + rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** The second argument to this function, op, is always SAVEPOINT_ROLLBACK +** or SAVEPOINT_RELEASE. This function either releases or rolls back the +** savepoint identified by parameter iSavepoint, depending on the value +** of op. +** +** Normally, iSavepoint is greater than or equal to zero. However, if op is +** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the +** contents of the entire transaction are rolled back. This is different +** from a normal transaction rollback, as no locks are released and the +** transaction remains open. +*/ +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ + int rc = SQLITE_OK; + if( p && p->inTrans==TRANS_WRITE ){ + BtShared *pBt = p->pBt; + assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); + assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); + sqlite3BtreeEnter(p); + if( op==SAVEPOINT_ROLLBACK ){ + rc = saveAllCursors(pBt, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); + } + if( rc==SQLITE_OK ){ + if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ + pBt->nPage = 0; + } + rc = newDatabase(pBt); + btreeSetNPage(pBt, pBt->pPage1); + + /* pBt->nPage might be zero if the database was corrupt when + ** the transaction was started. Otherwise, it must be at least 1. */ + assert( CORRUPT_DB || pBt->nPage>0 ); + } + sqlite3BtreeLeave(p); + } + return rc; +} + +/* +** Create a new cursor for the BTree whose root is on the page +** iTable. If a read-only cursor is requested, it is assumed that +** the caller already has at least a read-only transaction open +** on the database already. If a write-cursor is requested, then +** the caller is assumed to have an open write transaction. +** +** If the BTREE_WRCSR bit of wrFlag is clear, then the cursor can only +** be used for reading. If the BTREE_WRCSR bit is set, then the cursor +** can be used for reading or for writing if other conditions for writing +** are also met. These are the conditions that must be met in order +** for writing to be allowed: +** +** 1: The cursor must have been opened with wrFlag containing BTREE_WRCSR +** +** 2: Other database connections that share the same pager cache +** but which are not in the READ_UNCOMMITTED state may not have +** cursors open with wrFlag==0 on the same table. Otherwise +** the changes made by this write cursor would be visible to +** the read cursors in the other database connection. +** +** 3: The database must be writable (not on read-only media) +** +** 4: There must be an active transaction. +** +** The BTREE_FORDELETE bit of wrFlag may optionally be set if BTREE_WRCSR +** is set. If FORDELETE is set, that is a hint to the implementation that +** this cursor will only be used to seek to and delete entries of an index +** as part of a larger DELETE statement. The FORDELETE hint is not used by +** this implementation. But in a hypothetical alternative storage engine +** in which index entries are automatically deleted when corresponding table +** rows are deleted, the FORDELETE flag is a hint that all SEEK and DELETE +** operations on this cursor can be no-ops and all READ operations can +** return a null row (2-bytes: 0x01 0x00). +** +** No checking is done to make sure that page iTable really is the +** root page of a b-tree. If it is not, then the cursor acquired +** will not work correctly. +** +** It is assumed that the sqlite3BtreeCursorZero() has been called +** on pCur to initialize the memory space prior to invoking this routine. +*/ +static int btreeCursor( + Btree *p, /* The btree */ + Pgno iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + BtShared *pBt = p->pBt; /* Shared b-tree handle */ + BtCursor *pX; /* Looping over other all cursors */ + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( wrFlag==0 + || wrFlag==BTREE_WRCSR + || wrFlag==(BTREE_WRCSR|BTREE_FORDELETE) + ); + + /* The following assert statements verify that if this is a sharable + ** b-tree database, the connection is holding the required table locks, + ** and that no other connection has any open cursor that conflicts with + ** this lock. The iTable<1 term disables the check for corrupt schemas. */ + assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) + || iTable<1 ); + assert( wrFlag==0 || !hasReadConflicts(p, iTable) ); + + /* Assert that the caller has opened the required transaction. */ + assert( p->inTrans>TRANS_NONE ); + assert( wrFlag==0 || p->inTrans==TRANS_WRITE ); + assert( pBt->pPage1 && pBt->pPage1->aData ); + assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 ); + + if( iTable<=1 ){ + if( iTable<1 ){ + return SQLITE_CORRUPT_BKPT; + }else if( btreePagecount(pBt)==0 ){ + assert( wrFlag==0 ); + iTable = 0; + } + } + + /* Now that no other errors can occur, finish filling in the BtCursor + ** variables and link the cursor into the BtShared list. */ + pCur->pgnoRoot = iTable; + pCur->iPage = -1; + pCur->pKeyInfo = pKeyInfo; + pCur->pBtree = p; + pCur->pBt = pBt; + pCur->curFlags = 0; + /* If there are two or more cursors on the same btree, then all such + ** cursors *must* have the BTCF_Multiple flag set. */ + for(pX=pBt->pCursor; pX; pX=pX->pNext){ + if( pX->pgnoRoot==iTable ){ + pX->curFlags |= BTCF_Multiple; + pCur->curFlags = BTCF_Multiple; + } + } + pCur->eState = CURSOR_INVALID; + pCur->pNext = pBt->pCursor; + pBt->pCursor = pCur; + if( wrFlag ){ + pCur->curFlags |= BTCF_WriteFlag; + pCur->curPagerFlags = 0; + if( pBt->pTmpSpace==0 ) return allocateTempSpace(pBt); + }else{ + pCur->curPagerFlags = PAGER_GET_READONLY; + } + return SQLITE_OK; +} +static int btreeCursorWithLock( + Btree *p, /* The btree */ + Pgno iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + sqlite3BtreeLeave(p); + return rc; +} +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree *p, /* The btree */ + Pgno iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to xCompare() */ + BtCursor *pCur /* Write new cursor here */ +){ + if( p->sharable ){ + return btreeCursorWithLock(p, iTable, wrFlag, pKeyInfo, pCur); + }else{ + return btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + } +} + +/* +** Return the size of a BtCursor object in bytes. +** +** This interfaces is needed so that users of cursors can preallocate +** sufficient storage to hold a cursor. The BtCursor object is opaque +** to users so they cannot do the sizeof() themselves - they must call +** this routine. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ + return ROUND8(sizeof(BtCursor)); +} + +/* +** Initialize memory that will be converted into a BtCursor object. +** +** The simple approach here would be to memset() the entire object +** to zero. But it turns out that the apPage[] and aiIdx[] arrays +** do not need to be zeroed and they are large, so we can save a lot +** of run-time by skipping the initialization of those elements. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ + memset(p, 0, offsetof(BtCursor, BTCURSOR_FIRST_UNINIT)); +} + +/* +** Close a cursor. The read lock on the database file is released +** when the last cursor is closed. +*/ +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ + Btree *pBtree = pCur->pBtree; + if( pBtree ){ + BtShared *pBt = pCur->pBt; + sqlite3BtreeEnter(pBtree); + assert( pBt->pCursor!=0 ); + if( pBt->pCursor==pCur ){ + pBt->pCursor = pCur->pNext; + }else{ + BtCursor *pPrev = pBt->pCursor; + do{ + if( pPrev->pNext==pCur ){ + pPrev->pNext = pCur->pNext; + break; + } + pPrev = pPrev->pNext; + }while( ALWAYS(pPrev) ); + } + btreeReleaseAllCursorPages(pCur); + unlockBtreeIfUnused(pBt); + sqlite3_free(pCur->aOverflow); + sqlite3_free(pCur->pKey); + if( (pBt->openFlags & BTREE_SINGLE) && pBt->pCursor==0 ){ + /* Since the BtShared is not sharable, there is no need to + ** worry about the missing sqlite3BtreeLeave() call here. */ + assert( pBtree->sharable==0 ); + sqlite3BtreeClose(pBtree); + }else{ + sqlite3BtreeLeave(pBtree); + } + pCur->pBtree = 0; + } + return SQLITE_OK; +} + +/* +** Make sure the BtCursor* given in the argument has a valid +** BtCursor.info structure. If it is not already valid, call +** btreeParseCell() to fill it in. +** +** BtCursor.info is a cache of the information in the current cell. +** Using this cache reduces the number of calls to btreeParseCell(). +*/ +#ifndef NDEBUG + static int cellInfoEqual(CellInfo *a, CellInfo *b){ + if( a->nKey!=b->nKey ) return 0; + if( a->pPayload!=b->pPayload ) return 0; + if( a->nPayload!=b->nPayload ) return 0; + if( a->nLocal!=b->nLocal ) return 0; + if( a->nSize!=b->nSize ) return 0; + return 1; + } + static void assertCellInfo(BtCursor *pCur){ + CellInfo info; + memset(&info, 0, sizeof(info)); + btreeParseCell(pCur->pPage, pCur->ix, &info); + assert( CORRUPT_DB || cellInfoEqual(&info, &pCur->info) ); + } +#else + #define assertCellInfo(x) +#endif +static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){ + if( pCur->info.nSize==0 ){ + pCur->curFlags |= BTCF_ValidNKey; + btreeParseCell(pCur->pPage,pCur->ix,&pCur->info); + }else{ + assertCellInfo(pCur); + } +} + +#ifndef NDEBUG /* The next routine used only within assert() statements */ +/* +** Return true if the given BtCursor is valid. A valid cursor is one +** that is currently pointing to a row in a (non-empty) table. +** This is a verification routine is used only within assert() statements. +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor *pCur){ + return pCur && pCur->eState==CURSOR_VALID; +} +#endif /* NDEBUG */ +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor *pCur){ + assert( pCur!=0 ); + return pCur->eState==CURSOR_VALID; +} + +/* +** Return the value of the integer key or "rowid" for a table btree. +** This routine is only valid for a cursor that is pointing into a +** ordinary table btree. If the cursor points to an index btree or +** is invalid, the result of this routine is undefined. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->curIntKey ); + getCellInfo(pCur); + return pCur->info.nKey; +} + +/* +** Pin or unpin a cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)==0 ); + pCur->curFlags |= BTCF_Pinned; +} +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor *pCur){ + assert( (pCur->curFlags & BTCF_Pinned)!=0 ); + pCur->curFlags &= ~BTCF_Pinned; +} + +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +/* +** Return the offset into the database file for the start of the +** payload to which the cursor is pointing. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + getCellInfo(pCur); + return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) + + (i64)(pCur->info.pPayload - pCur->pPage->aData); +} +#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ + +/* +** Return the number of bytes of payload for the entry that pCur is +** currently pointing to. For table btrees, this will be the amount +** of data. For index btrees, this will be the size of the key. +** +** The caller must guarantee that the cursor is pointing to a non-NULL +** valid entry. In other words, the calling procedure must guarantee +** that the cursor has Cursor.eState==CURSOR_VALID. +*/ +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + getCellInfo(pCur); + return pCur->info.nPayload; +} + +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + +/* +** Given the page number of an overflow page in the database (parameter +** ovfl), this function finds the page number of the next page in the +** linked list of overflow pages. If possible, it uses the auto-vacuum +** pointer-map data instead of reading the content of page ovfl to do so. +** +** If an error occurs an SQLite error code is returned. Otherwise: +** +** The page number of the next overflow page in the linked list is +** written to *pPgnoNext. If page ovfl is the last page in its linked +** list, *pPgnoNext is set to zero. +** +** If ppPage is not NULL, and a reference to the MemPage object corresponding +** to page number pOvfl was obtained, then *ppPage is set to point to that +** reference. It is the responsibility of the caller to call releasePage() +** on *ppPage to free the reference. In no reference was obtained (because +** the pointer-map was used to obtain the value for *pPgnoNext), then +** *ppPage is set to zero. +*/ +static int getOverflowPage( + BtShared *pBt, /* The database file */ + Pgno ovfl, /* Current overflow page number */ + MemPage **ppPage, /* OUT: MemPage handle (may be NULL) */ + Pgno *pPgnoNext /* OUT: Next overflow page number */ +){ + Pgno next = 0; + MemPage *pPage = 0; + int rc = SQLITE_OK; + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert(pPgnoNext); + +#ifndef SQLITE_OMIT_AUTOVACUUM + /* Try to find the next page in the overflow list using the + ** autovacuum pointer-map pages. Guess that the next page in + ** the overflow list is page number (ovfl+1). If that guess turns + ** out to be wrong, fall back to loading the data of page + ** number ovfl to determine the next page number. + */ + if( pBt->autoVacuum ){ + Pgno pgno; + Pgno iGuess = ovfl+1; + u8 eType; + + while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){ + iGuess++; + } + + if( iGuess<=btreePagecount(pBt) ){ + rc = ptrmapGet(pBt, iGuess, &eType, &pgno); + if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){ + next = iGuess; + rc = SQLITE_DONE; + } + } + } +#endif + + assert( next==0 || rc==SQLITE_DONE ); + if( rc==SQLITE_OK ){ + rc = btreeGetPage(pBt, ovfl, &pPage, (ppPage==0) ? PAGER_GET_READONLY : 0); + assert( rc==SQLITE_OK || pPage==0 ); + if( rc==SQLITE_OK ){ + next = get4byte(pPage->aData); + } + } + + *pPgnoNext = next; + if( ppPage ){ + *ppPage = pPage; + }else{ + releasePage(pPage); + } + return (rc==SQLITE_DONE ? SQLITE_OK : rc); +} + +/* +** Copy data from a buffer to a page, or from a page to a buffer. +** +** pPayload is a pointer to data stored on database page pDbPage. +** If argument eOp is false, then nByte bytes of data are copied +** from pPayload to the buffer pointed at by pBuf. If eOp is true, +** then sqlite3PagerWrite() is called on pDbPage and nByte bytes +** of data are copied from the buffer pBuf to pPayload. +** +** SQLITE_OK is returned on success, otherwise an error code. +*/ +static int copyPayload( + void *pPayload, /* Pointer to page data */ + void *pBuf, /* Pointer to buffer */ + int nByte, /* Number of bytes to copy */ + int eOp, /* 0 -> copy from page, 1 -> copy to page */ + DbPage *pDbPage /* Page containing pPayload */ +){ + if( eOp ){ + /* Copy data from buffer to page (a write operation) */ + int rc = sqlite3PagerWrite(pDbPage); + if( rc!=SQLITE_OK ){ + return rc; + } + memcpy(pPayload, pBuf, nByte); + }else{ + /* Copy data from page to buffer (a read operation) */ + memcpy(pBuf, pPayload, nByte); + } + return SQLITE_OK; +} + +/* +** This function is used to read or overwrite payload information +** for the entry that the pCur cursor is pointing to. The eOp +** argument is interpreted as follows: +** +** 0: The operation is a read. Populate the overflow cache. +** 1: The operation is a write. Populate the overflow cache. +** +** A total of "amt" bytes are read or written beginning at "offset". +** Data is read to or from the buffer pBuf. +** +** The content being read or written might appear on the main page +** or be scattered out on multiple overflow pages. +** +** If the current cursor entry uses one or more overflow pages +** this function may allocate space for and lazily populate +** the overflow page-list cache array (BtCursor.aOverflow). +** Subsequent calls use this cache to make seeking to the supplied offset +** more efficient. +** +** Once an overflow page-list cache has been allocated, it must be +** invalidated if some other cursor writes to the same table, or if +** the cursor is moved to a different row. Additionally, in auto-vacuum +** mode, the following events may invalidate an overflow page-list cache. +** +** * An incremental vacuum, +** * A commit in auto_vacuum="full" mode, +** * Creating a table (may require moving an overflow page). +*/ +static int accessPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + u32 offset, /* Begin reading this far into payload */ + u32 amt, /* Read this many bytes */ + unsigned char *pBuf, /* Write the bytes into this buffer */ + int eOp /* zero to read. non-zero to write. */ +){ + unsigned char *aPayload; + int rc = SQLITE_OK; + int iIdx = 0; + MemPage *pPage = pCur->pPage; /* Btree page of current entry */ + BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */ +#ifdef SQLITE_DIRECT_OVERFLOW_READ + unsigned char * const pBufStart = pBuf; /* Start of original out buffer */ +#endif + + assert( pPage ); + assert( eOp==0 || eOp==1 ); + assert( pCur->eState==CURSOR_VALID ); + if( pCur->ix>=pPage->nCell ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( cursorHoldsMutex(pCur) ); + + getCellInfo(pCur); + aPayload = pCur->info.pPayload; + assert( offset+amt <= pCur->info.nPayload ); + + assert( aPayload > pPage->aData ); + if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + /* Trying to read or write past the end of the data is an error. The + ** conditional above is really: + ** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] + ** but is recast into its current form to avoid integer overflow problems + */ + return SQLITE_CORRUPT_PAGE(pPage); + } + + /* Check if data must be read/written to/from the btree page itself. */ + if( offsetinfo.nLocal ){ + int a = amt; + if( a+offset>pCur->info.nLocal ){ + a = pCur->info.nLocal - offset; + } + rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage); + offset = 0; + pBuf += a; + amt -= a; + }else{ + offset -= pCur->info.nLocal; + } + + + if( rc==SQLITE_OK && amt>0 ){ + const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */ + Pgno nextPage; + + nextPage = get4byte(&aPayload[pCur->info.nLocal]); + + /* If the BtCursor.aOverflow[] has not been allocated, allocate it now. + ** + ** The aOverflow[] array is sized at one entry for each overflow page + ** in the overflow chain. The page number of the first overflow page is + ** stored in aOverflow[0], etc. A value of 0 in the aOverflow[] array + ** means "not yet known" (the cache is lazily populated). + */ + if( (pCur->curFlags & BTCF_ValidOvfl)==0 ){ + int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize; + if( pCur->aOverflow==0 + || nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow) + ){ + Pgno *aNew = (Pgno*)sqlite3Realloc( + pCur->aOverflow, nOvfl*2*sizeof(Pgno) + ); + if( aNew==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + pCur->aOverflow = aNew; + } + } + memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); + pCur->curFlags |= BTCF_ValidOvfl; + }else{ + /* If the overflow page-list cache has been allocated and the + ** entry for the first required overflow page is valid, skip + ** directly to it. + */ + if( pCur->aOverflow[offset/ovflSize] ){ + iIdx = (offset/ovflSize); + nextPage = pCur->aOverflow[iIdx]; + offset = (offset%ovflSize); + } + } + + assert( rc==SQLITE_OK && amt>0 ); + while( nextPage ){ + /* If required, populate the overflow page-list cache. */ + if( nextPage > pBt->nPage ) return SQLITE_CORRUPT_BKPT; + assert( pCur->aOverflow[iIdx]==0 + || pCur->aOverflow[iIdx]==nextPage + || CORRUPT_DB ); + pCur->aOverflow[iIdx] = nextPage; + + if( offset>=ovflSize ){ + /* The only reason to read this page is to obtain the page + ** number for the next page in the overflow chain. The page + ** data is not required. So first try to lookup the overflow + ** page-list cache, if any, then fall back to the getOverflowPage() + ** function. + */ + assert( pCur->curFlags & BTCF_ValidOvfl ); + assert( pCur->pBtree->db==pBt->db ); + if( pCur->aOverflow[iIdx+1] ){ + nextPage = pCur->aOverflow[iIdx+1]; + }else{ + rc = getOverflowPage(pBt, nextPage, 0, &nextPage); + } + offset -= ovflSize; + }else{ + /* Need to read this page properly. It contains some of the + ** range of data that is being read (eOp==0) or written (eOp!=0). + */ + int a = amt; + if( a + offset > ovflSize ){ + a = ovflSize - offset; + } + +#ifdef SQLITE_DIRECT_OVERFLOW_READ + /* If all the following are true: + ** + ** 1) this is a read operation, and + ** 2) data is required from the start of this overflow page, and + ** 3) there are no dirty pages in the page-cache + ** 4) the database is file-backed, and + ** 5) the page is not in the WAL file + ** 6) at least 4 bytes have already been read into the output buffer + ** + ** then data can be read directly from the database file into the + ** output buffer, bypassing the page-cache altogether. This speeds + ** up loading large records that span many overflow pages. + */ + if( eOp==0 /* (1) */ + && offset==0 /* (2) */ + && sqlite3PagerDirectReadOk(pBt->pPager, nextPage) /* (3,4,5) */ + && &pBuf[-4]>=pBufStart /* (6) */ + ){ + sqlite3_file *fd = sqlite3PagerFile(pBt->pPager); + u8 aSave[4]; + u8 *aWrite = &pBuf[-4]; + assert( aWrite>=pBufStart ); /* due to (6) */ + memcpy(aSave, aWrite, 4); + rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); + if( rc && nextPage>pBt->nPage ) rc = SQLITE_CORRUPT_BKPT; + nextPage = get4byte(aWrite); + memcpy(aWrite, aSave, 4); + }else +#endif + + { + DbPage *pDbPage; + rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage, + (eOp==0 ? PAGER_GET_READONLY : 0) + ); + if( rc==SQLITE_OK ){ + aPayload = sqlite3PagerGetData(pDbPage); + nextPage = get4byte(aPayload); + rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); + sqlite3PagerUnref(pDbPage); + offset = 0; + } + } + amt -= a; + if( amt==0 ) return rc; + pBuf += a; + } + if( rc ) break; + iIdx++; + } + } + + if( rc==SQLITE_OK && amt>0 ){ + /* Overflow chain ends prematurely */ + return SQLITE_CORRUPT_PAGE(pPage); + } + return rc; +} + +/* +** Read part of the payload for the row at which that cursor pCur is currently +** pointing. "amt" bytes will be transferred into pBuf[]. The transfer +** begins at "offset". +** +** pCur can be pointing to either a table or an index b-tree. +** If pointing to a table btree, then the content section is read. If +** pCur is pointing to an index b-tree then the key section is read. +** +** For sqlite3BtreePayload(), the caller must ensure that pCur is pointing +** to a valid row in the table. For sqlite3BtreePayloadChecked(), the +** cursor might be invalid or might need to be restored before being read. +** +** Return SQLITE_OK on success or an error code if anything goes +** wrong. An error is returned if "offset+amt" is larger than +** the available payload. +*/ +SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>=0 && pCur->pPage ); + return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0); +} + +/* +** This variant of sqlite3BtreePayload() works even if the cursor has not +** in the CURSOR_VALID state. It is only used by the sqlite3_blob_read() +** interface. +*/ +#ifndef SQLITE_OMIT_INCRBLOB +static SQLITE_NOINLINE int accessPayloadChecked( + BtCursor *pCur, + u32 offset, + u32 amt, + void *pBuf +){ + int rc; + if ( pCur->eState==CURSOR_INVALID ){ + return SQLITE_ABORT; + } + assert( cursorOwnsBtShared(pCur) ); + rc = btreeRestoreCursorPosition(pCur); + return rc ? rc : accessPayload(pCur, offset, amt, pBuf, 0); +} +SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + if( pCur->eState==CURSOR_VALID ){ + assert( cursorOwnsBtShared(pCur) ); + return accessPayload(pCur, offset, amt, pBuf, 0); + }else{ + return accessPayloadChecked(pCur, offset, amt, pBuf); + } +} +#endif /* SQLITE_OMIT_INCRBLOB */ + +/* +** Return a pointer to payload information from the entry that the +** pCur cursor is pointing to. The pointer is to the beginning of +** the key if index btrees (pPage->intKey==0) and is the data for +** table btrees (pPage->intKey==1). The number of bytes of available +** key/data is written into *pAmt. If *pAmt==0, then the value +** returned will not be a valid pointer. +** +** This routine is an optimization. It is common for the entire key +** and data to fit on the local page and for there to be no overflow +** pages. When that is so, this routine can be used to access the +** key and data without making a copy. If the key and/or data spills +** onto overflow pages, then accessPayload() must be used to reassemble +** the key/data and copy it into a preallocated buffer. +** +** The pointer returned by this routine looks directly into the cached +** page of the database. The data might change or move the next time +** any btree routine is called. +*/ +static const void *fetchPayload( + BtCursor *pCur, /* Cursor pointing to entry to read from */ + u32 *pAmt /* Write the number of available bytes here */ +){ + int amt; + assert( pCur!=0 && pCur->iPage>=0 && pCur->pPage); + assert( pCur->eState==CURSOR_VALID ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->ixpPage->nCell || CORRUPT_DB ); + assert( pCur->info.nSize>0 ); + assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB ); + assert( pCur->info.pPayloadpPage->aDataEnd ||CORRUPT_DB); + amt = pCur->info.nLocal; + if( amt>(int)(pCur->pPage->aDataEnd - pCur->info.pPayload) ){ + /* There is too little space on the page for the expected amount + ** of local content. Database must be corrupt. */ + assert( CORRUPT_DB ); + amt = MAX(0, (int)(pCur->pPage->aDataEnd - pCur->info.pPayload)); + } + *pAmt = (u32)amt; + return (void*)pCur->info.pPayload; +} + + +/* +** For the entry that cursor pCur is point to, return as +** many bytes of the key or data as are available on the local +** b-tree page. Write the number of available bytes into *pAmt. +** +** The pointer returned is ephemeral. The key/data may move +** or be destroyed on the next call to any Btree routine, +** including calls from other threads against the same cache. +** Hence, a mutex on the BtShared should be held prior to calling +** this routine. +** +** These routines is used to get quick access to key and data +** in the common case where no overflow pages are used. +*/ +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ + return fetchPayload(pCur, pAmt); +} + + +/* +** Move the cursor down to a new child page. The newPgno argument is the +** page number of the child page to move to. +** +** This function returns SQLITE_CORRUPT if the page-header flags field of +** the new child page does not match the flags field of the parent (i.e. +** if an intkey page appears to be the parent of a non-intkey page, or +** vice-versa). +*/ +static int moveToChild(BtCursor *pCur, u32 newPgno){ + BtShared *pBt = pCur->pBt; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPageiPage>=0 ); + if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){ + return SQLITE_CORRUPT_BKPT; + } + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->aiIdx[pCur->iPage] = pCur->ix; + pCur->apPage[pCur->iPage] = pCur->pPage; + pCur->ix = 0; + pCur->iPage++; + return getAndInitPage(pBt, newPgno, &pCur->pPage, pCur, pCur->curPagerFlags); +} + +#ifdef SQLITE_DEBUG +/* +** Page pParent is an internal (non-leaf) tree page. This function +** asserts that page number iChild is the left-child if the iIdx'th +** cell in page pParent. Or, if iIdx is equal to the total number of +** cells in pParent, that page number iChild is the right-child of +** the page. +*/ +static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ + if( CORRUPT_DB ) return; /* The conditions tested below might not be true + ** in a corrupt database */ + assert( iIdx<=pParent->nCell ); + if( iIdx==pParent->nCell ){ + assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild ); + }else{ + assert( get4byte(findCell(pParent, iIdx))==iChild ); + } +} +#else +# define assertParentIndex(x,y,z) +#endif + +/* +** Move the cursor up to the parent page. +** +** pCur->idx is set to the cell index that contains the pointer +** to the page we are coming from. If we are coming from the +** right-most child page then pCur->idx is set to one more than +** the largest cell index. +*/ +static void moveToParent(BtCursor *pCur){ + MemPage *pLeaf; + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->iPage>0 ); + assert( pCur->pPage ); + assertParentIndex( + pCur->apPage[pCur->iPage-1], + pCur->aiIdx[pCur->iPage-1], + pCur->pPage->pgno + ); + testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell ); + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->ix = pCur->aiIdx[pCur->iPage-1]; + pLeaf = pCur->pPage; + pCur->pPage = pCur->apPage[--pCur->iPage]; + releasePageNotNull(pLeaf); +} + +/* +** Move the cursor to point to the root page of its b-tree structure. +** +** If the table has a virtual root page, then the cursor is moved to point +** to the virtual root page instead of the actual root page. A table has a +** virtual root page when the actual root page contains no cells and a +** single child page. This can only happen with the table rooted at page 1. +** +** If the b-tree structure is empty, the cursor state is set to +** CURSOR_INVALID and this routine returns SQLITE_EMPTY. Otherwise, +** the cursor is set to point to the first cell located on the root +** (or virtual root) page and the cursor state is set to CURSOR_VALID. +** +** If this function returns successfully, it may be assumed that the +** page-header flags indicate that the [virtual] root-page is the expected +** kind of b-tree page (i.e. if when opening the cursor the caller did not +** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D, +** indicating a table b-tree, or if the caller did specify a KeyInfo +** structure the flags byte is set to 0x02 or 0x0A, indicating an index +** b-tree). +*/ +static int moveToRoot(BtCursor *pCur){ + MemPage *pRoot; + int rc = SQLITE_OK; + + assert( cursorOwnsBtShared(pCur) ); + assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_VALID < CURSOR_REQUIRESEEK ); + assert( CURSOR_FAULT > CURSOR_REQUIRESEEK ); + assert( pCur->eState < CURSOR_REQUIRESEEK || pCur->iPage<0 ); + assert( pCur->pgnoRoot>0 || pCur->iPage<0 ); + + if( pCur->iPage>=0 ){ + if( pCur->iPage ){ + releasePageNotNull(pCur->pPage); + while( --pCur->iPage ){ + releasePageNotNull(pCur->apPage[pCur->iPage]); + } + pRoot = pCur->pPage = pCur->apPage[0]; + goto skip_init; + } + }else if( pCur->pgnoRoot==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_EMPTY; + }else{ + assert( pCur->iPage==(-1) ); + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + if( pCur->eState==CURSOR_FAULT ){ + assert( pCur->skipNext!=SQLITE_OK ); + return pCur->skipNext; + } + sqlite3BtreeClearCursor(pCur); + } + rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->pPage, + 0, pCur->curPagerFlags); + if( rc!=SQLITE_OK ){ + pCur->eState = CURSOR_INVALID; + return rc; + } + pCur->iPage = 0; + pCur->curIntKey = pCur->pPage->intKey; + } + pRoot = pCur->pPage; + assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB ); + + /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor + ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is + ** NULL, the caller expects a table b-tree. If this is not the case, + ** return an SQLITE_CORRUPT error. + ** + ** Earlier versions of SQLite assumed that this test could not fail + ** if the root page was already loaded when this function was called (i.e. + ** if pCur->iPage>=0). But this is not so if the database is corrupted + ** in such a way that page pRoot is linked into a second b-tree table + ** (or the freelist). */ + assert( pRoot->intKey==1 || pRoot->intKey==0 ); + if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){ + return SQLITE_CORRUPT_PAGE(pCur->pPage); + } + +skip_init: + pCur->ix = 0; + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); + + if( pRoot->nCell>0 ){ + pCur->eState = CURSOR_VALID; + }else if( !pRoot->leaf ){ + Pgno subpage; + if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT; + subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); + pCur->eState = CURSOR_VALID; + rc = moveToChild(pCur, subpage); + }else{ + pCur->eState = CURSOR_INVALID; + rc = SQLITE_EMPTY; + } + return rc; +} + +/* +** Move the cursor down to the left-most leaf entry beneath the +** entry to which it is currently pointing. +** +** The left-most leaf is the one with the smallest key - the first +** in ascending order. +*/ +static int moveToLeftmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ + assert( pCur->ixnCell ); + pgno = get4byte(findCell(pPage, pCur->ix)); + rc = moveToChild(pCur, pgno); + } + return rc; +} + +/* +** Move the cursor down to the right-most leaf entry beneath the +** page to which it is currently pointing. Notice the difference +** between moveToLeftmost() and moveToRightmost(). moveToLeftmost() +** finds the left-most entry beneath the *entry* whereas moveToRightmost() +** finds the right-most entry beneath the *page*. +** +** The right-most entry is the one with the largest key - the last +** key in ascending order. +*/ +static int moveToRightmost(BtCursor *pCur){ + Pgno pgno; + int rc = SQLITE_OK; + MemPage *pPage = 0; + + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + while( !(pPage = pCur->pPage)->leaf ){ + pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + pCur->ix = pPage->nCell; + rc = moveToChild(pCur, pgno); + if( rc ) return rc; + } + pCur->ix = pPage->nCell-1; + assert( pCur->info.nSize==0 ); + assert( (pCur->curFlags & BTCF_ValidNKey)==0 ); + return SQLITE_OK; +} + +/* Move the cursor to the first entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->pPage->nCell>0 ); + *pRes = 0; + rc = moveToLeftmost(pCur); + }else if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; + } + return rc; +} + +/* Move the cursor to the last entry in the table. Return SQLITE_OK +** on success. Set *pRes to 0 if the cursor actually points to something +** or set *pRes to 1 if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + + /* If the cursor already points to the last entry, this is a no-op. */ + if( CURSOR_VALID==pCur->eState && (pCur->curFlags & BTCF_AtLast)!=0 ){ +#ifdef SQLITE_DEBUG + /* This block serves to assert() that the cursor really does point + ** to the last entry in the b-tree. */ + int ii; + for(ii=0; iiiPage; ii++){ + assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell ); + } + assert( pCur->ix==pCur->pPage->nCell-1 || CORRUPT_DB ); + testcase( pCur->ix!=pCur->pPage->nCell-1 ); + /* ^-- dbsqlfuzz b92b72e4de80b5140c30ab71372ca719b8feb618 */ + assert( pCur->pPage->leaf ); +#endif + *pRes = 0; + return SQLITE_OK; + } + + rc = moveToRoot(pCur); + if( rc==SQLITE_OK ){ + assert( pCur->eState==CURSOR_VALID ); + *pRes = 0; + rc = moveToRightmost(pCur); + if( rc==SQLITE_OK ){ + pCur->curFlags |= BTCF_AtLast; + }else{ + pCur->curFlags &= ~BTCF_AtLast; + } + }else if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; + } + return rc; +} + +/* Move the cursor so that it points to an entry in a table (a.k.a INTKEY) +** table near the key intKey. Return a success code. +** +** If an exact match is not found, then the cursor is always +** left pointing at a leaf page which would hold the entry if it +** were present. The cursor might point to an entry that comes +** before or after the key. +** +** An integer is written into *pRes which is the result of +** comparing the key with the entry to which the cursor is +** pointing. The meaning of the integer written into +** *pRes is as follows: +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than intKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches intKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than intKey. +*/ +SQLITE_PRIVATE int sqlite3BtreeTableMoveto( + BtCursor *pCur, /* The cursor to be moved */ + i64 intKey, /* The table key */ + int biasRight, /* If true, bias the search to the high end */ + int *pRes /* Write search results here */ +){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( pRes ); + assert( pCur->pKeyInfo==0 ); + assert( pCur->eState!=CURSOR_VALID || pCur->curIntKey!=0 ); + + /* If the cursor is already positioned at the point we are trying + ** to move to, then just return without doing any work */ + if( pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 ){ + if( pCur->info.nKey==intKey ){ + *pRes = 0; + return SQLITE_OK; + } + if( pCur->info.nKeycurFlags & BTCF_AtLast)!=0 ){ + *pRes = -1; + return SQLITE_OK; + } + /* If the requested key is one more than the previous key, then + ** try to get there using sqlite3BtreeNext() rather than a full + ** binary search. This is an optimization only. The correct answer + ** is still obtained without this case, only a little more slowely */ + if( pCur->info.nKey+1==intKey ){ + *pRes = 0; + rc = sqlite3BtreeNext(pCur, 0); + if( rc==SQLITE_OK ){ + getCellInfo(pCur); + if( pCur->info.nKey==intKey ){ + return SQLITE_OK; + } + }else if( rc!=SQLITE_DONE ){ + return rc; + } + } + } + } + +#ifdef SQLITE_DEBUG + pCur->pBtree->nSeek++; /* Performance measurement during testing */ +#endif + + rc = moveToRoot(pCur); + if( rc ){ + if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = -1; + return SQLITE_OK; + } + return rc; + } + assert( pCur->pPage ); + assert( pCur->pPage->isInit ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage->nCell > 0 ); + assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey ); + assert( pCur->curIntKey ); + + for(;;){ + int lwr, upr, idx, c; + Pgno chldPg; + MemPage *pPage = pCur->pPage; + u8 *pCell; /* Pointer to current cell in pPage */ + + /* pPage->nCell must be greater than zero. If this is the root-page + ** the cursor would have been INVALID above and this for(;;) loop + ** not run. If this is not the root-page, then the moveToChild() routine + ** would have already detected db corruption. Similarly, pPage must + ** be the right kind (index or table) of b-tree page. Otherwise + ** a moveToChild() or moveToRoot() call would have detected corruption. */ + assert( pPage->nCell>0 ); + assert( pPage->intKey ); + lwr = 0; + upr = pPage->nCell-1; + assert( biasRight==0 || biasRight==1 ); + idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ + for(;;){ + i64 nCellKey; + pCell = findCellPastPtr(pPage, idx); + if( pPage->intKeyLeaf ){ + while( 0x80 <= *(pCell++) ){ + if( pCell>=pPage->aDataEnd ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + } + getVarint(pCell, (u64*)&nCellKey); + if( nCellKeyupr ){ c = -1; break; } + }else if( nCellKey>intKey ){ + upr = idx-1; + if( lwr>upr ){ c = +1; break; } + }else{ + assert( nCellKey==intKey ); + pCur->ix = (u16)idx; + if( !pPage->leaf ){ + lwr = idx; + goto moveto_table_next_layer; + }else{ + pCur->curFlags |= BTCF_ValidNKey; + pCur->info.nKey = nCellKey; + pCur->info.nSize = 0; + *pRes = 0; + return SQLITE_OK; + } + } + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */ + } + assert( lwr==upr+1 || !pPage->leaf ); + assert( pPage->isInit ); + if( pPage->leaf ){ + assert( pCur->ixpPage->nCell ); + pCur->ix = (u16)idx; + *pRes = c; + rc = SQLITE_OK; + goto moveto_table_finish; + } +moveto_table_next_layer: + if( lwr>=pPage->nCell ){ + chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); + }else{ + chldPg = get4byte(findCell(pPage, lwr)); + } + pCur->ix = (u16)lwr; + rc = moveToChild(pCur, chldPg); + if( rc ) break; + } +moveto_table_finish: + pCur->info.nSize = 0; + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + return rc; +} + +/* +** Compare the "idx"-th cell on the page the cursor pCur is currently +** pointing to to pIdxKey using xRecordCompare. Return negative or +** zero if the cell is less than or equal pIdxKey. Return positive +** if unknown. +** +** Return value negative: Cell at pCur[idx] less than pIdxKey +** +** Return value is zero: Cell at pCur[idx] equals pIdxKey +** +** Return value positive: Nothing is known about the relationship +** of the cell at pCur[idx] and pIdxKey. +** +** This routine is part of an optimization. It is always safe to return +** a positive value as that will cause the optimization to be skipped. +*/ +static int indexCellCompare( + BtCursor *pCur, + int idx, + UnpackedRecord *pIdxKey, + RecordCompare xRecordCompare +){ + MemPage *pPage = pCur->pPage; + int c; + int nCell; /* Size of the pCell cell in bytes */ + u8 *pCell = findCellPastPtr(pPage, idx); + + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* This branch runs if the record-size field of the cell is a + ** single byte varint and the record fits entirely on the main + ** b-tree page. */ + testcase( pCell+nCell+1==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* The record-size field is a 2 byte varint and the record + ** fits entirely on the main b-tree page. */ + testcase( pCell+nCell+2==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* If the record extends into overflow pages, do not attempt + ** the optimization. */ + c = 99; + } + return c; +} + +/* +** Return true (non-zero) if pCur is current pointing to the last +** page of a table. +*/ +static int cursorOnLastPage(BtCursor *pCur){ + int i; + assert( pCur->eState==CURSOR_VALID ); + for(i=0; iiPage; i++){ + MemPage *pPage = pCur->apPage[i]; + if( pCur->aiIdx[i]nCell ) return 0; + } + return 1; +} + +/* Move the cursor so that it points to an entry in an index table +** near the key pIdxKey. Return a success code. +** +** If an exact match is not found, then the cursor is always +** left pointing at a leaf page which would hold the entry if it +** were present. The cursor might point to an entry that comes +** before or after the key. +** +** An integer is written into *pRes which is the result of +** comparing the key with the entry to which the cursor is +** pointing. The meaning of the integer written into +** *pRes is as follows: +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than pIdxKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches pIdxKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than pIdxKey. +** +** The pIdxKey->eqSeen field is set to 1 if there +** exists an entry in the table that exactly matches pIdxKey. +*/ +SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( + BtCursor *pCur, /* The cursor to be moved */ + UnpackedRecord *pIdxKey, /* Unpacked index key */ + int *pRes /* Write search results here */ +){ + int rc; + RecordCompare xRecordCompare; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( pRes ); + assert( pCur->pKeyInfo!=0 ); + +#ifdef SQLITE_DEBUG + pCur->pBtree->nSeek++; /* Performance measurement during testing */ +#endif + + xRecordCompare = sqlite3VdbeFindCompare(pIdxKey); + pIdxKey->errCode = 0; + assert( pIdxKey->default_rc==1 + || pIdxKey->default_rc==0 + || pIdxKey->default_rc==-1 + ); + + + /* Check to see if we can skip a lot of work. Two cases: + ** + ** (1) If the cursor is already pointing to the very last cell + ** in the table and the pIdxKey search key is greater than or + ** equal to that last cell, then no movement is required. + ** + ** (2) If the cursor is on the last page of the table and the first + ** cell on that last page is less than or equal to the pIdxKey + ** search key, then we can start the search on the current page + ** without needing to go back to root. + */ + if( pCur->eState==CURSOR_VALID + && pCur->pPage->leaf + && cursorOnLastPage(pCur) + ){ + int c; + if( pCur->ix==pCur->pPage->nCell-1 + && (c = indexCellCompare(pCur, pCur->ix, pIdxKey, xRecordCompare))<=0 + && pIdxKey->errCode==SQLITE_OK + ){ + *pRes = c; + return SQLITE_OK; /* Cursor already pointing at the correct spot */ + } + if( pCur->iPage>0 + && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0 + && pIdxKey->errCode==SQLITE_OK + ){ + pCur->curFlags &= ~BTCF_ValidOvfl; + if( !pCur->pPage->isInit ){ + return SQLITE_CORRUPT_BKPT; + } + goto bypass_moveto_root; /* Start search on the current page */ + } + pIdxKey->errCode = SQLITE_OK; + } + + rc = moveToRoot(pCur); + if( rc ){ + if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = -1; + return SQLITE_OK; + } + return rc; + } + +bypass_moveto_root: + assert( pCur->pPage ); + assert( pCur->pPage->isInit ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage->nCell > 0 ); + assert( pCur->curIntKey==0 ); + assert( pIdxKey!=0 ); + for(;;){ + int lwr, upr, idx, c; + Pgno chldPg; + MemPage *pPage = pCur->pPage; + u8 *pCell; /* Pointer to current cell in pPage */ + + /* pPage->nCell must be greater than zero. If this is the root-page + ** the cursor would have been INVALID above and this for(;;) loop + ** not run. If this is not the root-page, then the moveToChild() routine + ** would have already detected db corruption. Similarly, pPage must + ** be the right kind (index or table) of b-tree page. Otherwise + ** a moveToChild() or moveToRoot() call would have detected corruption. */ + assert( pPage->nCell>0 ); + assert( pPage->intKey==0 ); + lwr = 0; + upr = pPage->nCell-1; + idx = upr>>1; /* idx = (lwr+upr)/2; */ + for(;;){ + int nCell; /* Size of the pCell cell in bytes */ + pCell = findCellPastPtr(pPage, idx); + + /* The maximum supported page-size is 65536 bytes. This means that + ** the maximum number of record bytes stored on an index B-Tree + ** page is less than 16384 bytes and may be stored as a 2-byte + ** varint. This information is used to attempt to avoid parsing + ** the entire cell by checking for the cases where the record is + ** stored entirely within the b-tree page by inspecting the first + ** 2 bytes of the cell. + */ + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* This branch runs if the record-size field of the cell is a + ** single byte varint and the record fits entirely on the main + ** b-tree page. */ + testcase( pCell+nCell+1==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* The record-size field is a 2 byte varint and the record + ** fits entirely on the main b-tree page. */ + testcase( pCell+nCell+2==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* The record flows over onto one or more overflow pages. In + ** this case the whole cell needs to be parsed, a buffer allocated + ** and accessPayload() used to retrieve the record into the + ** buffer before VdbeRecordCompare() can be called. + ** + ** If the record is corrupt, the xRecordCompare routine may read + ** up to two varints past the end of the buffer. An extra 18 + ** bytes of padding is allocated at the end of the buffer in + ** case this happens. */ + void *pCellKey; + u8 * const pCellBody = pCell - pPage->childPtrSize; + const int nOverrun = 18; /* Size of the overrun padding */ + pPage->xParseCell(pPage, pCellBody, &pCur->info); + nCell = (int)pCur->info.nKey; + testcase( nCell<0 ); /* True if key size is 2^32 or more */ + testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ + testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ + testcase( nCell==2 ); /* Minimum legal index key size */ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ + rc = SQLITE_CORRUPT_PAGE(pPage); + goto moveto_index_finish; + } + pCellKey = sqlite3Malloc( nCell+nOverrun ); + if( pCellKey==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto moveto_index_finish; + } + pCur->ix = (u16)idx; + rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); + memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */ + pCur->curFlags &= ~BTCF_ValidOvfl; + if( rc ){ + sqlite3_free(pCellKey); + goto moveto_index_finish; + } + c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); + sqlite3_free(pCellKey); + } + assert( + (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) + && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) + ); + if( c<0 ){ + lwr = idx+1; + }else if( c>0 ){ + upr = idx-1; + }else{ + assert( c==0 ); + *pRes = 0; + rc = SQLITE_OK; + pCur->ix = (u16)idx; + if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT; + goto moveto_index_finish; + } + if( lwr>upr ) break; + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */ + } + assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); + assert( pPage->isInit ); + if( pPage->leaf ){ + assert( pCur->ixpPage->nCell || CORRUPT_DB ); + pCur->ix = (u16)idx; + *pRes = c; + rc = SQLITE_OK; + goto moveto_index_finish; + } + if( lwr>=pPage->nCell ){ + chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); + }else{ + chldPg = get4byte(findCell(pPage, lwr)); + } + pCur->ix = (u16)lwr; + rc = moveToChild(pCur, chldPg); + if( rc ) break; + } +moveto_index_finish: + pCur->info.nSize = 0; + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + return rc; +} + + +/* +** Return TRUE if the cursor is not pointing at an entry of the table. +** +** TRUE will be returned after a call to sqlite3BtreeNext() moves +** past the last entry in the table or sqlite3BtreePrev() moves past +** the first entry. TRUE is also returned if the table is empty. +*/ +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ + /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries + ** have been deleted? This API will need to change to return an error code + ** as well as the boolean result value. + */ + return (CURSOR_VALID!=pCur->eState); +} + +/* +** Return an estimate for the number of rows in the table that pCur is +** pointing to. Return a negative number if no estimate is currently +** available. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ + i64 n; + u8 i; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + + /* Currently this interface is only called by the OP_IfSmaller + ** opcode, and it that case the cursor will always be valid and + ** will always point to a leaf node. */ + if( NEVER(pCur->eState!=CURSOR_VALID) ) return -1; + if( NEVER(pCur->pPage->leaf==0) ) return -1; + + n = pCur->pPage->nCell; + for(i=0; iiPage; i++){ + n *= pCur->apPage[i]->nCell; + } + return n; +} + +/* +** Advance the cursor to the next entry in the database. +** Return value: +** +** SQLITE_OK success +** SQLITE_DONE cursor is already pointing at the last element +** otherwise some kind of error occurred +** +** The main entry point is sqlite3BtreeNext(). That routine is optimized +** for the common case of merely incrementing the cell counter BtCursor.aiIdx +** to the next cell on the current page. The (slower) btreeNext() helper +** routine is called when it is necessary to move to a different page or +** to restore the cursor. +** +** If bit 0x01 of the F argument in sqlite3BtreeNext(C,F) is 1, then the +** cursor corresponds to an SQL index and this routine could have been +** skipped if the SQL index had been a unique index. The F argument +** is a hint to the implement. SQLite btree implementation does not use +** this hint, but COMDB2 does. +*/ +static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ + int rc; + int idx; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + if( pCur->eState!=CURSOR_VALID ){ + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + return SQLITE_DONE; + } + if( pCur->eState==CURSOR_SKIPNEXT ){ + pCur->eState = CURSOR_VALID; + if( pCur->skipNext>0 ) return SQLITE_OK; + } + } + + pPage = pCur->pPage; + idx = ++pCur->ix; + if( !pPage->isInit || sqlite3FaultSim(412) ){ + /* The only known way for this to happen is for there to be a + ** recursive SQL function that does a DELETE operation as part of a + ** SELECT which deletes content out from under an active cursor + ** in a corrupt database file where the table being DELETE-ed from + ** has pages in common with the table being queried. See TH3 + ** module cov1/btree78.test testcase 220 (2018-06-08) for an + ** example. */ + return SQLITE_CORRUPT_BKPT; + } + + if( idx>=pPage->nCell ){ + if( !pPage->leaf ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + if( rc ) return rc; + return moveToLeftmost(pCur); + } + do{ + if( pCur->iPage==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_DONE; + } + moveToParent(pCur); + pPage = pCur->pPage; + }while( pCur->ix>=pPage->nCell ); + if( pPage->intKey ){ + return sqlite3BtreeNext(pCur, 0); + }else{ + return SQLITE_OK; + } + } + if( pPage->leaf ){ + return SQLITE_OK; + }else{ + return moveToLeftmost(pCur); + } +} +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int flags){ + MemPage *pPage; + UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ + assert( cursorOwnsBtShared(pCur) ); + assert( flags==0 || flags==1 ); + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); + pPage = pCur->pPage; + if( (++pCur->ix)>=pPage->nCell ){ + pCur->ix--; + return btreeNext(pCur); + } + if( pPage->leaf ){ + return SQLITE_OK; + }else{ + return moveToLeftmost(pCur); + } +} + +/* +** Step the cursor to the back to the previous entry in the database. +** Return values: +** +** SQLITE_OK success +** SQLITE_DONE the cursor is already on the first element of the table +** otherwise some kind of error occurred +** +** The main entry point is sqlite3BtreePrevious(). That routine is optimized +** for the common case of merely decrementing the cell counter BtCursor.aiIdx +** to the previous cell on the current page. The (slower) btreePrevious() +** helper routine is called when it is necessary to move to a different page +** or to restore the cursor. +** +** If bit 0x01 of the F argument to sqlite3BtreePrevious(C,F) is 1, then +** the cursor corresponds to an SQL index and this routine could have been +** skipped if the SQL index had been a unique index. The F argument is a +** hint to the implement. The native SQLite btree implementation does not +** use this hint, but COMDB2 does. +*/ +static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ + int rc; + MemPage *pPage; + + assert( cursorOwnsBtShared(pCur) ); + assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); + assert( pCur->info.nSize==0 ); + if( pCur->eState!=CURSOR_VALID ){ + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + return SQLITE_DONE; + } + if( CURSOR_SKIPNEXT==pCur->eState ){ + pCur->eState = CURSOR_VALID; + if( pCur->skipNext<0 ) return SQLITE_OK; + } + } + + pPage = pCur->pPage; + assert( pPage->isInit ); + if( !pPage->leaf ){ + int idx = pCur->ix; + rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); + if( rc ) return rc; + rc = moveToRightmost(pCur); + }else{ + while( pCur->ix==0 ){ + if( pCur->iPage==0 ){ + pCur->eState = CURSOR_INVALID; + return SQLITE_DONE; + } + moveToParent(pCur); + } + assert( pCur->info.nSize==0 ); + assert( (pCur->curFlags & (BTCF_ValidOvfl))==0 ); + + pCur->ix--; + pPage = pCur->pPage; + if( pPage->intKey && !pPage->leaf ){ + rc = sqlite3BtreePrevious(pCur, 0); + }else{ + rc = SQLITE_OK; + } + } + return rc; +} +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ + assert( cursorOwnsBtShared(pCur) ); + assert( flags==0 || flags==1 ); + UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ + pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); + pCur->info.nSize = 0; + if( pCur->eState!=CURSOR_VALID + || pCur->ix==0 + || pCur->pPage->leaf==0 + ){ + return btreePrevious(pCur); + } + pCur->ix--; + return SQLITE_OK; +} + +/* +** Allocate a new page from the database file. +** +** The new page is marked as dirty. (In other words, sqlite3PagerWrite() +** has already been called on the new page.) The new page has also +** been referenced and the calling routine is responsible for calling +** sqlite3PagerUnref() on the new page when it is done. +** +** SQLITE_OK is returned on success. Any other return value indicates +** an error. *ppPage is set to NULL in the event of an error. +** +** If the "nearby" parameter is not 0, then an effort is made to +** locate a page close to the page number "nearby". This can be used in an +** attempt to keep related pages close to each other in the database file, +** which in turn can make database access faster. +** +** If the eMode parameter is BTALLOC_EXACT and the nearby page exists +** anywhere on the free-list, then it is guaranteed to be returned. If +** eMode is BTALLOC_LT then the page returned will be less than or equal +** to nearby if any such page exists. If eMode is BTALLOC_ANY then there +** are no restrictions on which page is returned. +*/ +static int allocateBtreePage( + BtShared *pBt, /* The btree */ + MemPage **ppPage, /* Store pointer to the allocated page here */ + Pgno *pPgno, /* Store the page number here */ + Pgno nearby, /* Search for a page near this one */ + u8 eMode /* BTALLOC_EXACT, BTALLOC_LT, or BTALLOC_ANY */ +){ + MemPage *pPage1; + int rc; + u32 n; /* Number of pages on the freelist */ + u32 k; /* Number of leaves on the trunk of the freelist */ + MemPage *pTrunk = 0; + MemPage *pPrevTrunk = 0; + Pgno mxPage; /* Total size of the database file */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( eMode==BTALLOC_ANY || (nearby>0 && IfNotOmitAV(pBt->autoVacuum)) ); + pPage1 = pBt->pPage1; + mxPage = btreePagecount(pBt); + /* EVIDENCE-OF: R-05119-02637 The 4-byte big-endian integer at offset 36 + ** stores stores the total number of pages on the freelist. */ + n = get4byte(&pPage1->aData[36]); + testcase( n==mxPage-1 ); + if( n>=mxPage ){ + return SQLITE_CORRUPT_BKPT; + } + if( n>0 ){ + /* There are pages on the freelist. Reuse one of those pages. */ + Pgno iTrunk; + u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ + u32 nSearch = 0; /* Count of the number of search attempts */ + + /* If eMode==BTALLOC_EXACT and a query of the pointer-map + ** shows that the page 'nearby' is somewhere on the free-list, then + ** the entire-list will be searched for that page. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( eMode==BTALLOC_EXACT ){ + if( nearby<=mxPage ){ + u8 eType; + assert( nearby>0 ); + assert( pBt->autoVacuum ); + rc = ptrmapGet(pBt, nearby, &eType, 0); + if( rc ) return rc; + if( eType==PTRMAP_FREEPAGE ){ + searchList = 1; + } + } + }else if( eMode==BTALLOC_LE ){ + searchList = 1; + } +#endif + + /* Decrement the free-list count by 1. Set iTrunk to the index of the + ** first free-list trunk page. iPrevTrunk is initially 1. + */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) return rc; + put4byte(&pPage1->aData[36], n-1); + + /* The code within this loop is run only once if the 'searchList' variable + ** is not true. Otherwise, it runs once for each trunk-page on the + ** free-list until the page 'nearby' is located (eMode==BTALLOC_EXACT) + ** or until a page less than 'nearby' is located (eMode==BTALLOC_LT) + */ + do { + pPrevTrunk = pTrunk; + if( pPrevTrunk ){ + /* EVIDENCE-OF: R-01506-11053 The first integer on a freelist trunk page + ** is the page number of the next freelist trunk page in the list or + ** zero if this is the last freelist trunk page. */ + iTrunk = get4byte(&pPrevTrunk->aData[0]); + }else{ + /* EVIDENCE-OF: R-59841-13798 The 4-byte big-endian integer at offset 32 + ** stores the page number of the first page of the freelist, or zero if + ** the freelist is empty. */ + iTrunk = get4byte(&pPage1->aData[32]); + } + testcase( iTrunk==mxPage ); + if( iTrunk>mxPage || nSearch++ > n ){ + rc = SQLITE_CORRUPT_PGNO(pPrevTrunk ? pPrevTrunk->pgno : 1); + }else{ + rc = btreeGetUnusedPage(pBt, iTrunk, &pTrunk, 0); + } + if( rc ){ + pTrunk = 0; + goto end_allocate_page; + } + assert( pTrunk!=0 ); + assert( pTrunk->aData!=0 ); + /* EVIDENCE-OF: R-13523-04394 The second integer on a freelist trunk page + ** is the number of leaf page pointers to follow. */ + k = get4byte(&pTrunk->aData[4]); + if( k==0 && !searchList ){ + /* The trunk has no leaves and the list is not being searched. + ** So extract the trunk page itself and use it as the newly + ** allocated page */ + assert( pPrevTrunk==0 ); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + *pPgno = iTrunk; + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + *ppPage = pTrunk; + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); + }else if( k>(u32)(pBt->usableSize/4 - 2) ){ + /* Value of k is out of range. Database corruption */ + rc = SQLITE_CORRUPT_PGNO(iTrunk); + goto end_allocate_page; +#ifndef SQLITE_OMIT_AUTOVACUUM + }else if( searchList + && (nearby==iTrunk || (iTrunkpDbPage); + if( rc ){ + goto end_allocate_page; + } + if( k==0 ){ + if( !pPrevTrunk ){ + memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4); + } + }else{ + /* The trunk page is required by the caller but it contains + ** pointers to free-list leaves. The first leaf becomes a trunk + ** page in this case. + */ + MemPage *pNewTrunk; + Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); + if( iNewTrunk>mxPage ){ + rc = SQLITE_CORRUPT_PGNO(iTrunk); + goto end_allocate_page; + } + testcase( iNewTrunk==mxPage ); + rc = btreeGetUnusedPage(pBt, iNewTrunk, &pNewTrunk, 0); + if( rc!=SQLITE_OK ){ + goto end_allocate_page; + } + rc = sqlite3PagerWrite(pNewTrunk->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pNewTrunk); + goto end_allocate_page; + } + memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4); + put4byte(&pNewTrunk->aData[4], k-1); + memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4); + releasePage(pNewTrunk); + if( !pPrevTrunk ){ + assert( sqlite3PagerIswriteable(pPage1->pDbPage) ); + put4byte(&pPage1->aData[32], iNewTrunk); + }else{ + rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); + if( rc ){ + goto end_allocate_page; + } + put4byte(&pPrevTrunk->aData[0], iNewTrunk); + } + } + pTrunk = 0; + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); +#endif + }else if( k>0 ){ + /* Extract a leaf from the trunk */ + u32 closest; + Pgno iPage; + unsigned char *aData = pTrunk->aData; + if( nearby>0 ){ + u32 i; + closest = 0; + if( eMode==BTALLOC_LE ){ + for(i=0; imxPage || iPage<2 ){ + rc = SQLITE_CORRUPT_PGNO(iTrunk); + goto end_allocate_page; + } + testcase( iPage==mxPage ); + if( !searchList + || (iPage==nearby || (iPagepgno, n-1)); + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc ) goto end_allocate_page; + if( closestpDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + *ppPage = 0; + } + } + searchList = 0; + } + } + releasePage(pPrevTrunk); + pPrevTrunk = 0; + }while( searchList ); + }else{ + /* There are no pages on the freelist, so append a new page to the + ** database image. + ** + ** Normally, new pages allocated by this block can be requested from the + ** pager layer with the 'no-content' flag set. This prevents the pager + ** from trying to read the pages content from disk. However, if the + ** current transaction has already run one or more incremental-vacuum + ** steps, then the page we are about to allocate may contain content + ** that is required in the event of a rollback. In this case, do + ** not set the no-content flag. This causes the pager to load and journal + ** the current page content before overwriting it. + ** + ** Note that the pager will not actually attempt to load or journal + ** content for any page that really does lie past the end of the database + ** file on disk. So the effects of disabling the no-content optimization + ** here are confined to those pages that lie between the end of the + ** database image and the end of the database file. + */ + int bNoContent = (0==IfNotOmitAV(pBt->bDoTruncate))? PAGER_GET_NOCONTENT:0; + + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc ) return rc; + pBt->nPage++; + if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ) pBt->nPage++; + +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, pBt->nPage) ){ + /* If *pPgno refers to a pointer-map page, allocate two new pages + ** at the end of the file instead of one. The first allocated page + ** becomes a new pointer-map page, the second is used by the caller. + */ + MemPage *pPg = 0; + TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage)); + assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) ); + rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg->pDbPage); + releasePage(pPg); + } + if( rc ) return rc; + pBt->nPage++; + if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ){ pBt->nPage++; } + } +#endif + put4byte(28 + (u8*)pBt->pPage1->aData, pBt->nPage); + *pPgno = pBt->nPage; + + assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + rc = btreeGetUnusedPage(pBt, *pPgno, ppPage, bNoContent); + if( rc ) return rc; + rc = sqlite3PagerWrite((*ppPage)->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + *ppPage = 0; + } + TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); + } + + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); + +end_allocate_page: + releasePage(pTrunk); + releasePage(pPrevTrunk); + assert( rc!=SQLITE_OK || sqlite3PagerPageRefcount((*ppPage)->pDbPage)<=1 ); + assert( rc!=SQLITE_OK || (*ppPage)->isInit==0 ); + return rc; +} + +/* +** This function is used to add page iPage to the database file free-list. +** It is assumed that the page is not already a part of the free-list. +** +** The value passed as the second argument to this function is optional. +** If the caller happens to have a pointer to the MemPage object +** corresponding to page iPage handy, it may pass it as the second value. +** Otherwise, it may pass NULL. +** +** If a pointer to a MemPage object is passed as the second argument, +** its reference count is not altered by this function. +*/ +static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ + MemPage *pTrunk = 0; /* Free-list trunk page */ + Pgno iTrunk = 0; /* Page number of free-list trunk page */ + MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */ + MemPage *pPage; /* Page being freed. May be NULL. */ + int rc; /* Return Code */ + u32 nFree; /* Initial number of pages on free-list */ + + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( CORRUPT_DB || iPage>1 ); + assert( !pMemPage || pMemPage->pgno==iPage ); + + if( iPage<2 || iPage>pBt->nPage ){ + return SQLITE_CORRUPT_BKPT; + } + if( pMemPage ){ + pPage = pMemPage; + sqlite3PagerRef(pPage->pDbPage); + }else{ + pPage = btreePageLookup(pBt, iPage); + } + + /* Increment the free page count on pPage1 */ + rc = sqlite3PagerWrite(pPage1->pDbPage); + if( rc ) goto freepage_out; + nFree = get4byte(&pPage1->aData[36]); + put4byte(&pPage1->aData[36], nFree+1); + + if( pBt->btsFlags & BTS_SECURE_DELETE ){ + /* If the secure_delete option is enabled, then + ** always fully overwrite deleted information with zeros. + */ + if( (!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0) ) + || ((rc = sqlite3PagerWrite(pPage->pDbPage))!=0) + ){ + goto freepage_out; + } + memset(pPage->aData, 0, pPage->pBt->pageSize); + } + + /* If the database supports auto-vacuum, write an entry in the pointer-map + ** to indicate that the page is free. + */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc); + if( rc ) goto freepage_out; + } + + /* Now manipulate the actual database free-list structure. There are two + ** possibilities. If the free-list is currently empty, or if the first + ** trunk page in the free-list is full, then this page will become a + ** new free-list trunk page. Otherwise, it will become a leaf of the + ** first trunk page in the current free-list. This block tests if it + ** is possible to add the page as a new free-list leaf. + */ + if( nFree!=0 ){ + u32 nLeaf; /* Initial number of leaf cells on trunk page */ + + iTrunk = get4byte(&pPage1->aData[32]); + if( iTrunk>btreePagecount(pBt) ){ + rc = SQLITE_CORRUPT_BKPT; + goto freepage_out; + } + rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0); + if( rc!=SQLITE_OK ){ + goto freepage_out; + } + + nLeaf = get4byte(&pTrunk->aData[4]); + assert( pBt->usableSize>32 ); + if( nLeaf > (u32)pBt->usableSize/4 - 2 ){ + rc = SQLITE_CORRUPT_BKPT; + goto freepage_out; + } + if( nLeaf < (u32)pBt->usableSize/4 - 8 ){ + /* In this case there is room on the trunk page to insert the page + ** being freed as a new leaf. + ** + ** Note that the trunk page is not really full until it contains + ** usableSize/4 - 2 entries, not usableSize/4 - 8 entries as we have + ** coded. But due to a coding error in versions of SQLite prior to + ** 3.6.0, databases with freelist trunk pages holding more than + ** usableSize/4 - 8 entries will be reported as corrupt. In order + ** to maintain backwards compatibility with older versions of SQLite, + ** we will continue to restrict the number of entries to usableSize/4 - 8 + ** for now. At some point in the future (once everyone has upgraded + ** to 3.6.0 or later) we should consider fixing the conditional above + ** to read "usableSize/4-2" instead of "usableSize/4-8". + ** + ** EVIDENCE-OF: R-19920-11576 However, newer versions of SQLite still + ** avoid using the last six entries in the freelist trunk page array in + ** order that database files created by newer versions of SQLite can be + ** read by older versions of SQLite. + */ + rc = sqlite3PagerWrite(pTrunk->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pTrunk->aData[4], nLeaf+1); + put4byte(&pTrunk->aData[8+nLeaf*4], iPage); + if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){ + sqlite3PagerDontWrite(pPage->pDbPage); + } + rc = btreeSetHasContent(pBt, iPage); + } + TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); + goto freepage_out; + } + } + + /* If control flows to this point, then it was not possible to add the + ** the page being freed as a leaf page of the first trunk in the free-list. + ** Possibly because the free-list is empty, or possibly because the + ** first trunk in the free-list is full. Either way, the page being freed + ** will become the new first trunk page in the free-list. + */ + if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){ + goto freepage_out; + } + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + goto freepage_out; + } + put4byte(pPage->aData, iTrunk); + put4byte(&pPage->aData[4], 0); + put4byte(&pPage1->aData[32], iPage); + TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk)); + +freepage_out: + if( pPage ){ + pPage->isInit = 0; + } + releasePage(pPage); + releasePage(pTrunk); + return rc; +} +static void freePage(MemPage *pPage, int *pRC){ + if( (*pRC)==SQLITE_OK ){ + *pRC = freePage2(pPage->pBt, pPage, pPage->pgno); + } +} + +/* +** Free the overflow pages associated with the given Cell. +*/ +static SQLITE_NOINLINE int clearCellOverflow( + MemPage *pPage, /* The page that contains the Cell */ + unsigned char *pCell, /* First byte of the Cell */ + CellInfo *pInfo /* Size information about the cell */ +){ + BtShared *pBt; + Pgno ovflPgno; + int rc; + int nOvfl; + u32 ovflPageSize; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pInfo->nLocal!=pInfo->nPayload ); + testcase( pCell + pInfo->nSize == pPage->aDataEnd ); + testcase( pCell + (pInfo->nSize-1) == pPage->aDataEnd ); + if( pCell + pInfo->nSize > pPage->aDataEnd ){ + /* Cell extends past end of page */ + return SQLITE_CORRUPT_PAGE(pPage); + } + ovflPgno = get4byte(pCell + pInfo->nSize - 4); + pBt = pPage->pBt; + assert( pBt->usableSize > 4 ); + ovflPageSize = pBt->usableSize - 4; + nOvfl = (pInfo->nPayload - pInfo->nLocal + ovflPageSize - 1)/ovflPageSize; + assert( nOvfl>0 || + (CORRUPT_DB && (pInfo->nPayload + ovflPageSize)btreePagecount(pBt) ){ + /* 0 is not a legal page number and page 1 cannot be an + ** overflow page. Therefore if ovflPgno<2 or past the end of the + ** file the database must be corrupt. */ + return SQLITE_CORRUPT_BKPT; + } + if( nOvfl ){ + rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext); + if( rc ) return rc; + } + + if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) ) + && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1 + ){ + /* There is no reason any cursor should have an outstanding reference + ** to an overflow page belonging to a cell that is being deleted/updated. + ** So if there exists more than one reference to this page, then it + ** must not really be an overflow page and the database must be corrupt. + ** It is helpful to detect this before calling freePage2(), as + ** freePage2() may zero the page contents if secure-delete mode is + ** enabled. If this 'overflow' page happens to be a page that the + ** caller is iterating through or using in some other way, this + ** can be problematic. + */ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = freePage2(pBt, pOvfl, ovflPgno); + } + + if( pOvfl ){ + sqlite3PagerUnref(pOvfl->pDbPage); + } + if( rc ) return rc; + ovflPgno = iNext; + } + return SQLITE_OK; +} + +/* Call xParseCell to compute the size of a cell. If the cell contains +** overflow, then invoke cellClearOverflow to clear out that overflow. +** STore the result code (SQLITE_OK or some error code) in rc. +** +** Implemented as macro to force inlining for performance. +*/ +#define BTREE_CLEAR_CELL(rc, pPage, pCell, sInfo) \ + pPage->xParseCell(pPage, pCell, &sInfo); \ + if( sInfo.nLocal!=sInfo.nPayload ){ \ + rc = clearCellOverflow(pPage, pCell, &sInfo); \ + }else{ \ + rc = SQLITE_OK; \ + } + + +/* +** Create the byte sequence used to represent a cell on page pPage +** and write that byte sequence into pCell[]. Overflow pages are +** allocated and filled in as necessary. The calling procedure +** is responsible for making sure sufficient space has been allocated +** for pCell[]. +** +** Note that pCell does not necessary need to point to the pPage->aData +** area. pCell might point to some temporary storage. The cell will +** be constructed in this temporary area then copied into pPage->aData +** later. +*/ +static int fillInCell( + MemPage *pPage, /* The page that contains the cell */ + unsigned char *pCell, /* Complete text of the cell */ + const BtreePayload *pX, /* Payload with which to construct the cell */ + int *pnSize /* Write cell size here */ +){ + int nPayload; + const u8 *pSrc; + int nSrc, n, rc, mn; + int spaceLeft; + MemPage *pToRelease; + unsigned char *pPrior; + unsigned char *pPayload; + BtShared *pBt; + Pgno pgnoOvfl; + int nHeader; + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + + /* pPage is not necessarily writeable since pCell might be auxiliary + ** buffer space that is separate from the pPage buffer area */ + assert( pCellaData || pCell>=&pPage->aData[pPage->pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + /* Fill in the header. */ + nHeader = pPage->childPtrSize; + if( pPage->intKey ){ + nPayload = pX->nData + pX->nZero; + pSrc = pX->pData; + nSrc = pX->nData; + assert( pPage->intKeyLeaf ); /* fillInCell() only called for leaves */ + nHeader += putVarint32(&pCell[nHeader], nPayload); + nHeader += putVarint(&pCell[nHeader], *(u64*)&pX->nKey); + }else{ + assert( pX->nKey<=0x7fffffff && pX->pKey!=0 ); + nSrc = nPayload = (int)pX->nKey; + pSrc = pX->pKey; + nHeader += putVarint32(&pCell[nHeader], nPayload); + } + + /* Fill in the payload */ + pPayload = &pCell[nHeader]; + if( nPayload<=pPage->maxLocal ){ + /* This is the common case where everything fits on the btree page + ** and no overflow pages are required. */ + n = nHeader + nPayload; + testcase( n==3 ); + testcase( n==4 ); + if( n<4 ) n = 4; + *pnSize = n; + assert( nSrc<=nPayload ); + testcase( nSrcminLocal; + n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4); + testcase( n==pPage->maxLocal ); + testcase( n==pPage->maxLocal+1 ); + if( n > pPage->maxLocal ) n = mn; + spaceLeft = n; + *pnSize = n + nHeader + 4; + pPrior = &pCell[nHeader+n]; + pToRelease = 0; + pgnoOvfl = 0; + pBt = pPage->pBt; + + /* At this point variables should be set as follows: + ** + ** nPayload Total payload size in bytes + ** pPayload Begin writing payload here + ** spaceLeft Space available at pPayload. If nPayload>spaceLeft, + ** that means content must spill into overflow pages. + ** *pnSize Size of the local cell (not counting overflow pages) + ** pPrior Where to write the pgno of the first overflow page + ** + ** Use a call to btreeParseCellPtr() to verify that the values above + ** were computed correctly. + */ +#ifdef SQLITE_DEBUG + { + CellInfo info; + pPage->xParseCell(pPage, pCell, &info); + assert( nHeader==(int)(info.pPayload - pCell) ); + assert( info.nKey==pX->nKey ); + assert( *pnSize == info.nSize ); + assert( spaceLeft == info.nLocal ); + } +#endif + + /* Write the payload into the local Cell and any extra into overflow pages */ + while( 1 ){ + n = nPayload; + if( n>spaceLeft ) n = spaceLeft; + + /* If pToRelease is not zero than pPayload points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPayload is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPayloadaData || pPayload>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + if( nSrc>=n ){ + memcpy(pPayload, pSrc, n); + }else if( nSrc>0 ){ + n = nSrc; + memcpy(pPayload, pSrc, n); + }else{ + memset(pPayload, 0, n); + } + nPayload -= n; + if( nPayload<=0 ) break; + pPayload += n; + pSrc += n; + nSrc -= n; + spaceLeft -= n; + if( spaceLeft==0 ){ + MemPage *pOvfl = 0; +#ifndef SQLITE_OMIT_AUTOVACUUM + Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ + if( pBt->autoVacuum ){ + do{ + pgnoOvfl++; + } while( + PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) + ); + } +#endif + rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* If the database supports auto-vacuum, and the second or subsequent + ** overflow page is being allocated, add an entry to the pointer-map + ** for that page now. + ** + ** If this is the first overflow page, then write a partial entry + ** to the pointer-map. If we write nothing to this pointer-map slot, + ** then the optimistic overflow chain processing in clearCell() + ** may misinterpret the uninitialized values and delete the + ** wrong pages from the database. + */ + if( pBt->autoVacuum && rc==SQLITE_OK ){ + u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1); + ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc); + if( rc ){ + releasePage(pOvfl); + } + } +#endif + if( rc ){ + releasePage(pToRelease); + return rc; + } + + /* If pToRelease is not zero than pPrior points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPrior is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPrioraData || pPrior>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + put4byte(pPrior, pgnoOvfl); + releasePage(pToRelease); + pToRelease = pOvfl; + pPrior = pOvfl->aData; + put4byte(pPrior, 0); + pPayload = &pOvfl->aData[4]; + spaceLeft = pBt->usableSize - 4; + } + } + releasePage(pToRelease); + return SQLITE_OK; +} + +/* +** Remove the i-th cell from pPage. This routine effects pPage only. +** The cell content is not freed or deallocated. It is assumed that +** the cell content has been copied someplace else. This routine just +** removes the reference to the cell from pPage. +** +** "sz" must be the number of bytes in the cell. +*/ +static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ + u32 pc; /* Offset to cell content of cell being deleted */ + u8 *data; /* pPage->aData */ + u8 *ptr; /* Used to move bytes around within data[] */ + int rc; /* The return code */ + int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */ + + if( *pRC ) return; + assert( idx>=0 ); + assert( idxnCell ); + assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->nFree>=0 ); + data = pPage->aData; + ptr = &pPage->aCellIdx[2*idx]; + assert( pPage->pBt->usableSize > (u32)(ptr-data) ); + pc = get2byte(ptr); + hdr = pPage->hdrOffset; +#if 0 /* Not required. Omit for efficiency */ + if( pcnCell*2 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } +#endif + testcase( pc==(u32)get2byte(&data[hdr+5]) ); + testcase( pc+sz==pPage->pBt->usableSize ); + if( pc+sz > pPage->pBt->usableSize ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + rc = freeSpace(pPage, pc, sz); + if( rc ){ + *pRC = rc; + return; + } + pPage->nCell--; + if( pPage->nCell==0 ){ + memset(&data[hdr+1], 0, 4); + data[hdr+7] = 0; + put2byte(&data[hdr+5], pPage->pBt->usableSize); + pPage->nFree = pPage->pBt->usableSize - pPage->hdrOffset + - pPage->childPtrSize - 8; + }else{ + memmove(ptr, ptr+2, 2*(pPage->nCell - idx)); + put2byte(&data[hdr+3], pPage->nCell); + pPage->nFree += 2; + } +} + +/* +** Insert a new cell on pPage at cell index "i". pCell points to the +** content of the cell. +** +** If the cell content will fit on the page, then put it there. If it +** will not fit, then make a copy of the cell content into pTemp if +** pTemp is not null. Regardless of pTemp, allocate a new entry +** in pPage->apOvfl[] and make it point to the cell content (either +** in pTemp or the original pCell) and also record its index. +** Allocating a new entry in pPage->aCell[] implies that +** pPage->nOverflow is incremented. +** +** *pRC must be SQLITE_OK when this routine is called. +*/ +static void insertCell( + MemPage *pPage, /* Page into which we are copying */ + int i, /* New cell becomes the i-th cell of the page */ + u8 *pCell, /* Content of the new cell */ + int sz, /* Bytes of content in pCell */ + u8 *pTemp, /* Temp storage space for pCell, if needed */ + Pgno iChild, /* If non-zero, replace first 4 bytes with this value */ + int *pRC /* Read and write return code from here */ +){ + int idx = 0; /* Where to write new cell content in data[] */ + int j; /* Loop counter */ + u8 *data; /* The content of the whole page */ + u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */ + + assert( *pRC==SQLITE_OK ); + assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); + assert( MX_CELL(pPage->pBt)<=10921 ); + assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); + assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); + assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); + assert( pPage->nFree>=0 ); + if( pPage->nOverflow || sz+2>pPage->nFree ){ + if( pTemp ){ + memcpy(pTemp, pCell, sz); + pCell = pTemp; + } + if( iChild ){ + put4byte(pCell, iChild); + } + j = pPage->nOverflow++; + /* Comparison against ArraySize-1 since we hold back one extra slot + ** as a contingency. In other words, never need more than 3 overflow + ** slots but 4 are allocated, just to be safe. */ + assert( j < ArraySize(pPage->apOvfl)-1 ); + pPage->apOvfl[j] = pCell; + pPage->aiOvfl[j] = (u16)i; + + /* When multiple overflows occur, they are always sequential and in + ** sorted order. This invariants arise because multiple overflows can + ** only occur when inserting divider cells into the parent page during + ** balancing, and the dividers are adjacent and sorted. + */ + assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ + assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ + }else{ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + data = pPage->aData; + assert( &data[pPage->cellOffset]==pPage->aCellIdx ); + rc = allocateSpace(pPage, sz, &idx); + if( rc ){ *pRC = rc; return; } + /* The allocateSpace() routine guarantees the following properties + ** if it returns successfully */ + assert( idx >= 0 ); + assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); + assert( idx+sz <= (int)pPage->pBt->usableSize ); + pPage->nFree -= (u16)(2 + sz); + if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); + put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); + } + pIns = pPage->aCellIdx + i*2; + memmove(pIns+2, pIns, 2*(pPage->nCell - i)); + put2byte(pIns, idx); + pPage->nCell++; + /* increment the cell count */ + if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pPage->pBt->autoVacuum ){ + /* The cell may contain a pointer to an overflow page. If so, write + ** the entry for the overflow page into the pointer map. + */ + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); + } +#endif + } +} + +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + +/* +** A CellArray object contains a cache of pointers and sizes for a +** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is for an index btree is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2. +** ixNx[2] = Total number of cells. +** +** Sometimes when deleting, a child page can have zero cells. In those +** cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] +** entries, shift down. The end result is that each ixNx[] entry should +** be larger than the previous +*/ +typedef struct CellArray CellArray; +struct CellArray { + int nCell; /* Number of cells in apCell[] */ + MemPage *pRef; /* Reference page */ + u8 **apCell; /* All cells begin balanced */ + u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ +}; + +/* +** Make sure the cell sizes at idx, idx+1, ..., idx+N-1 have been +** computed. +*/ +static void populateCellCache(CellArray *p, int idx, int N){ + assert( idx>=0 && idx+N<=p->nCell ); + while( N>0 ){ + assert( p->apCell[idx]!=0 ); + if( p->szCell[idx]==0 ){ + p->szCell[idx] = p->pRef->xCellSize(p->pRef, p->apCell[idx]); + }else{ + assert( CORRUPT_DB || + p->szCell[idx]==p->pRef->xCellSize(p->pRef, p->apCell[idx]) ); + } + idx++; + N--; + } +} + +/* +** Return the size of the Nth element of the cell array +*/ +static SQLITE_NOINLINE u16 computeCellSize(CellArray *p, int N){ + assert( N>=0 && NnCell ); + assert( p->szCell[N]==0 ); + p->szCell[N] = p->pRef->xCellSize(p->pRef, p->apCell[N]); + return p->szCell[N]; +} +static u16 cachedCellSize(CellArray *p, int N){ + assert( N>=0 && NnCell ); + if( p->szCell[N] ) return p->szCell[N]; + return computeCellSize(p, N); +} + +/* +** Array apCell[] contains pointers to nCell b-tree page cells. The +** szCell[] array contains the size in bytes of each cell. This function +** replaces the current contents of page pPg with the contents of the cell +** array. +** +** Some of the cells in apCell[] may currently be stored in pPg. This +** function works around problems caused by this by making a copy of any +** such cells before overwriting the page data. +** +** The MemPage.nFree field is invalidated by this function. It is the +** responsibility of the caller to set it correctly. +*/ +static int rebuildPage( + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ + int nCell, /* Final number of cells on page */ + MemPage *pPg /* The page to be reconstructed */ +){ + const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ + u8 * const aData = pPg->aData; /* Pointer to data for pPg */ + const int usableSize = pPg->pBt->usableSize; + u8 * const pEnd = &aData[usableSize]; + int i = iFirst; /* Which cell to copy from pCArray*/ + u32 j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ + u8 *pCellptr = pPg->aCellIdx; + u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); + u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ + + assert( i(u32)usableSize ){ j = 0; } + memcpy(&pTmp[j], &aData[j], usableSize - j); + + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; + + pData = pEnd; + while( 1/*exit by break*/ ){ + u8 *pCell = pCArray->apCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); + if( SQLITE_WITHIN(pCell,aData+j,pEnd) ){ + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; + pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; + } + + pData -= sz; + put2byte(pCellptr, (pData - aData)); + pCellptr += 2; + if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; + memmove(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } + } + + /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ + pPg->nCell = nCell; + pPg->nOverflow = 0; + + put2byte(&aData[hdr+1], 0); + put2byte(&aData[hdr+3], pPg->nCell); + put2byte(&aData[hdr+5], pData - aData); + aData[hdr+7] = 0x00; + return SQLITE_OK; +} + +/* +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. +** +** Argument pCellptr points to the first entry in the cell-pointer array +** (part of page pPg) to populate. After cell apCell[0] is written to the +** page body, a 16-bit offset is written to pCellptr. And so on, for each +** cell in the array. It is the responsibility of the caller to ensure +** that it is safe to overwrite this part of the cell-pointer array. +** +** When this function is called, *ppData points to the start of the +** content area on page pPg. If the size of the content area is extended, +** *ppData is updated to point to the new start of the content area +** before returning. +** +** Finally, argument pBegin points to the byte immediately following the +** end of the space required by this page for the cell-pointer area (for +** all cells - not just those inserted by the current call). If the content +** area must be extended to before this point in order to accomodate all +** cells in apCell[], then the cells do not fit and non-zero is returned. +*/ +static int pageInsertArray( + MemPage *pPg, /* Page to add cells to */ + u8 *pBegin, /* End of cell-pointer array */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ + u8 *pCellptr, /* Pointer to cell-pointer area */ + int iFirst, /* Index of first cell to add */ + int nCell, /* Number of cells to add to pPg */ + CellArray *pCArray /* Array of cells */ +){ + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ + assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ + if( iEnd<=iFirst ) return 0; + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ + int sz, rc; + u8 *pSlot; + assert( pCArray->szCell[i]!=0 ); + sz = pCArray->szCell[i]; + if( (aData[1]==0 && aData[2]==0) || (pSlot = pageFindSlot(pPg,sz,&rc))==0 ){ + if( (pData - pBegin)apCell[i] will never overlap on a well-formed + ** database. But they might for a corrupt database. Hence use memmove() + ** since memcpy() sends SIGABORT with overlapping buffers on OpenBSD */ + assert( (pSlot+sz)<=pCArray->apCell[i] + || pSlot>=(pCArray->apCell[i]+sz) + || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } + memmove(pSlot, pCArray->apCell[i], sz); + put2byte(pCellptr, (pSlot - aData)); + pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } + } + *ppData = pData; + return 0; +} + +/* +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. +** +** This function returns the total number of cells added to the free-list. +*/ +static int pageFreeArray( + MemPage *pPg, /* Page to edit */ + int iFirst, /* First cell to delete */ + int nCell, /* Cells to delete */ + CellArray *pCArray /* Array of cells */ +){ + u8 * const aData = pPg->aData; + u8 * const pEnd = &aData[pPg->pBt->usableSize]; + u8 * const pStart = &aData[pPg->hdrOffset + 8 + pPg->childPtrSize]; + int nRet = 0; + int i; + int iEnd = iFirst + nCell; + u8 *pFree = 0; + int szFree = 0; + + for(i=iFirst; iapCell[i]; + if( SQLITE_WITHIN(pCell, pStart, pEnd) ){ + int sz; + /* No need to use cachedCellSize() here. The sizes of all cells that + ** are to be freed have already been computing while deciding which + ** cells need freeing */ + sz = pCArray->szCell[i]; assert( sz>0 ); + if( pFree!=(pCell + sz) ){ + if( pFree ){ + assert( pFree>aData && (pFree - aData)<65536 ); + freeSpace(pPg, (u16)(pFree - aData), szFree); + } + pFree = pCell; + szFree = sz; + if( pFree+sz>pEnd ){ + return 0; + } + }else{ + pFree = pCell; + szFree += sz; + } + nRet++; + } + } + if( pFree ){ + assert( pFree>aData && (pFree - aData)<65536 ); + freeSpace(pPg, (u16)(pFree - aData), szFree); + } + return nRet; +} + +/* +** pCArray contains pointers to and sizes of all cells in the page being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells +** starting at apCell[iNew]. +** +** This routine makes the necessary adjustments to pPg so that it contains +** the correct cells after being balanced. +** +** The pPg->nFree field is invalid when this function returns. It is the +** responsibility of the caller to set it correctly. +*/ +static int editPage( + MemPage *pPg, /* Edit this page */ + int iOld, /* Index of first cell currently on page */ + int iNew, /* Index of new first cell on page */ + int nNew, /* Final number of cells on page */ + CellArray *pCArray /* Array of cells and sizes */ +){ + u8 * const aData = pPg->aData; + const int hdr = pPg->hdrOffset; + u8 *pBegin = &pPg->aCellIdx[nNew * 2]; + int nCell = pPg->nCell; /* Cells stored on pPg */ + u8 *pData; + u8 *pCellptr; + int i; + int iOldEnd = iOld + pPg->nCell + pPg->nOverflow; + int iNewEnd = iNew + nNew; + +#ifdef SQLITE_DEBUG + u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); + memcpy(pTmp, aData, pPg->pBt->usableSize); +#endif + + /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); + if( iOldnCell) ) return SQLITE_CORRUPT_BKPT; + memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); + nCell -= nShift; + } + if( iNewEnd < iOldEnd ){ + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; + } + + pData = &aData[get2byteNotZero(&aData[hdr+5])]; + if( pDatapPg->aDataEnd ) goto editpage_fail; + + /* Add cells to the start of the page */ + if( iNew=0 ); + pCellptr = pPg->aCellIdx; + memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iNew, nAdd, pCArray + ) ) goto editpage_fail; + nCell += nAdd; + } + + /* Add any overflow cells */ + for(i=0; inOverflow; i++){ + int iCell = (iOld + pPg->aiOvfl[i]) - iNew; + if( iCell>=0 && iCellaCellIdx[iCell * 2]; + if( nCell>iCell ){ + memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + } + nCell++; + cachedCellSize(pCArray, iCell+iNew); + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iCell+iNew, 1, pCArray + ) ) goto editpage_fail; + } + } + + /* Append cells to the end of the page */ + assert( nCell>=0 ); + pCellptr = &pPg->aCellIdx[nCell*2]; + if( pageInsertArray( + pPg, pBegin, &pData, pCellptr, + iNew+nCell, nNew-nCell, pCArray + ) ) goto editpage_fail; + + pPg->nCell = nNew; + pPg->nOverflow = 0; + + put2byte(&aData[hdr+3], pPg->nCell); + put2byte(&aData[hdr+5], pData - aData); + +#ifdef SQLITE_DEBUG + for(i=0; iapCell[i+iNew]; + int iOff = get2byteAligned(&pPg->aCellIdx[i*2]); + if( SQLITE_WITHIN(pCell, aData, &aData[pPg->pBt->usableSize]) ){ + pCell = &pTmp[pCell - aData]; + } + assert( 0==memcmp(pCell, &aData[iOff], + pCArray->pRef->xCellSize(pCArray->pRef, pCArray->apCell[i+iNew])) ); + } +#endif + + return SQLITE_OK; + editpage_fail: + /* Unable to edit this page. Rebuild it from scratch instead. */ + populateCellCache(pCArray, iNew, nNew); + return rebuildPage(pCArray, iNew, nNew, pPg); +} + + +#ifndef SQLITE_OMIT_QUICKBALANCE +/* +** This version of balance() handles the common special case where +** a new entry is being inserted on the extreme right-end of the +** tree, in other words, when the new entry will become the largest +** entry in the tree. +** +** Instead of trying to balance the 3 right-most leaf pages, just add +** a new page to the right-hand side and put the one new entry in +** that page. This leaves the right side of the tree somewhat +** unbalanced. But odds are that we will be inserting new entries +** at the end soon afterwards so the nearly empty page will quickly +** fill up. On average. +** +** pPage is the leaf page which is the right-most page in the tree. +** pParent is its parent. pPage must have a single overflow entry +** which is also the right-most entry on the page. +** +** The pSpace buffer is used to store a temporary copy of the divider +** cell that will be inserted into pParent. Such a cell consists of a 4 +** byte page number followed by a variable length integer. In other +** words, at most 13 bytes. Hence the pSpace buffer must be at +** least 13 bytes in size. +*/ +static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ + BtShared *const pBt = pPage->pBt; /* B-Tree Database */ + MemPage *pNew; /* Newly allocated page */ + int rc; /* Return Code */ + Pgno pgnoNew; /* Page number of pNew */ + + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( pPage->nOverflow==1 ); + + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ + assert( pPage->nFree>=0 ); + assert( pParent->nFree>=0 ); + + /* Allocate a new page. This page will become the right-sibling of + ** pPage. Make the parent page writable, so that the new divider cell + ** may be inserted. If both these operations are successful, proceed. + */ + rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); + + if( rc==SQLITE_OK ){ + + u8 *pOut = &pSpace[4]; + u8 *pCell = pPage->apOvfl[0]; + u16 szCell = pPage->xCellSize(pPage, pCell); + u8 *pStop; + CellArray b; + + assert( sqlite3PagerIswriteable(pNew->pDbPage) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } + pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; + + /* If this is an auto-vacuum database, update the pointer map + ** with entries for the new page, and any pointer from the + ** cell on the page to an overflow page. If either of these + ** operations fails, the return code is set, but the contents + ** of the parent page are still manipulated by thh code below. + ** That is Ok, at this point the parent page is guaranteed to + ** be marked as dirty. Returning an error code will cause a + ** rollback, undoing any changes made to the parent page. + */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); + if( szCell>pNew->minLocal ){ + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); + } + } + + /* Create a divider cell to insert into pParent. The divider cell + ** consists of a 4-byte page number (the page number of pPage) and + ** a variable length key value (which must be the same value as the + ** largest key on pPage). + ** + ** To find the largest key value on pPage, first find the right-most + ** cell on pPage. The first two fields of this cell are the + ** record-length (a variable length integer at most 32-bits in size) + ** and the key value (a variable length integer, may have any value). + ** The first of the while(...) loops below skips over the record-length + ** field. The second while(...) loop copies the key value from the + ** cell on pPage into the pSpace buffer. + */ + pCell = findCell(pPage, pPage->nCell-1); + pStop = &pCell[9]; + while( (*(pCell++)&0x80) && pCellnCell, pSpace, (int)(pOut-pSpace), + 0, pPage->pgno, &rc); + } + + /* Set the right-child pointer of pParent to point to the new page. */ + put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); + + /* Release the reference to the new page. */ + releasePage(pNew); + } + + return rc; +} +#endif /* SQLITE_OMIT_QUICKBALANCE */ + +#if 0 +/* +** This function does not contribute anything to the operation of SQLite. +** it is sometimes activated temporarily while debugging code responsible +** for setting pointer-map entries. +*/ +static int ptrmapCheckPages(MemPage **apPage, int nPage){ + int i, j; + for(i=0; ipBt; + assert( pPage->isInit ); + + for(j=0; jnCell; j++){ + CellInfo info; + u8 *z; + + z = findCell(pPage, j); + pPage->xParseCell(pPage, z, &info); + if( info.nLocalpgno && e==PTRMAP_OVERFLOW1 ); + } + if( !pPage->leaf ){ + Pgno child = get4byte(z); + ptrmapGet(pBt, child, &e, &n); + assert( n==pPage->pgno && e==PTRMAP_BTREE ); + } + } + if( !pPage->leaf ){ + Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]); + ptrmapGet(pBt, child, &e, &n); + assert( n==pPage->pgno && e==PTRMAP_BTREE ); + } + } + return 1; +} +#endif + +/* +** This function is used to copy the contents of the b-tree node stored +** on page pFrom to page pTo. If page pFrom was not a leaf page, then +** the pointer-map entries for each child page are updated so that the +** parent page stored in the pointer map is page pTo. If pFrom contained +** any cells with overflow page pointers, then the corresponding pointer +** map entries are also updated so that the parent page is page pTo. +** +** If pFrom is currently carrying any overflow cells (entries in the +** MemPage.apOvfl[] array), they are not copied to pTo. +** +** Before returning, page pTo is reinitialized using btreeInitPage(). +** +** The performance of this function is not critical. It is only used by +** the balance_shallower() and balance_deeper() procedures, neither of +** which are called often under normal circumstances. +*/ +static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ + if( (*pRC)==SQLITE_OK ){ + BtShared * const pBt = pFrom->pBt; + u8 * const aFrom = pFrom->aData; + u8 * const aTo = pTo->aData; + int const iFromHdr = pFrom->hdrOffset; + int const iToHdr = ((pTo->pgno==1) ? 100 : 0); + int rc; + int iData; + + + assert( pFrom->isInit ); + assert( pFrom->nFree>=iToHdr ); + assert( get2byte(&aFrom[iFromHdr+5]) <= (int)pBt->usableSize ); + + /* Copy the b-tree node content from page pFrom to page pTo. */ + iData = get2byte(&aFrom[iFromHdr+5]); + memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData); + memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell); + + /* Reinitialize page pTo so that the contents of the MemPage structure + ** match the new data. The initialization of pTo can actually fail under + ** fairly obscure circumstances, even though it is a copy of initialized + ** page pFrom. + */ + pTo->isInit = 0; + rc = btreeInitPage(pTo); + if( rc==SQLITE_OK ) rc = btreeComputeFreeSpace(pTo); + if( rc!=SQLITE_OK ){ + *pRC = rc; + return; + } + + /* If this is an auto-vacuum database, update the pointer-map entries + ** for any b-tree or overflow pages that pTo now contains the pointers to. + */ + if( ISAUTOVACUUM ){ + *pRC = setChildPtrmaps(pTo); + } + } +} + +/* +** This routine redistributes cells on the iParentIdx'th child of pParent +** (hereafter "the page") and up to 2 siblings so that all pages have about the +** same amount of free space. Usually a single sibling on either side of the +** page are used in the balancing, though both siblings might come from one +** side if the page is the first or last child of its parent. If the page +** has fewer than 2 siblings (something which can only happen if the page +** is a root page or a child of a root page) then all available siblings +** participate in the balancing. +** +** The number of siblings of the page might be increased or decreased by +** one or two in an effort to keep pages nearly full but not over full. +** +** Note that when this routine is called, some of the cells on the page +** might not actually be stored in MemPage.aData[]. This can happen +** if the page is overfull. This routine ensures that all cells allocated +** to the page and its siblings fit into MemPage.aData[] before returning. +** +** In the course of balancing the page and its siblings, cells may be +** inserted into or removed from the parent page (pParent). Doing so +** may cause the parent page to become overfull or underfull. If this +** happens, it is the responsibility of the caller to invoke the correct +** balancing routine to fix this problem (see the balance() routine). +** +** If this routine fails for any reason, it might leave the database +** in a corrupted state. So if this routine fails, the database should +** be rolled back. +** +** The third argument to this function, aOvflSpace, is a pointer to a +** buffer big enough to hold one page. If while inserting cells into the parent +** page (pParent) the parent page becomes overfull, this buffer is +** used to store the parent's overflow cells. Because this function inserts +** a maximum of four divider cells into the parent page, and the maximum +** size of a cell stored within an internal node is always less than 1/4 +** of the page-size, the aOvflSpace[] buffer is guaranteed to be large +** enough for all overflow cells. +** +** If aOvflSpace is set to a null pointer, this function returns +** SQLITE_NOMEM. +*/ +static int balance_nonroot( + MemPage *pParent, /* Parent page of siblings being balanced */ + int iParentIdx, /* Index of "the page" in pParent */ + u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */ + int isRoot, /* True if pParent is a root-page */ + int bBulk /* True if this call is part of a bulk load */ +){ + BtShared *pBt; /* The whole database */ + int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ + int nNew = 0; /* Number of pages in apNew[] */ + int nOld; /* Number of pages in apOld[] */ + int i, j, k; /* Loop counters */ + int nxDiv; /* Next divider slot in pParent->aCell[] */ + int rc = SQLITE_OK; /* The return code */ + u16 leafCorrection; /* 4 if pPage is a leaf. 0 if not */ + int leafData; /* True if pPage is a leaf of a LEAFDATA tree */ + int usableSpace; /* Bytes in pPage beyond the header */ + int pageFlags; /* Value of pPage->aData[0] */ + int iSpace1 = 0; /* First unused byte of aSpace1[] */ + int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */ + int szScratch; /* Size of scratch memory requested */ + MemPage *apOld[NB]; /* pPage and up to two siblings */ + MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */ + u8 *pRight; /* Location in parent of right-sibling pointer */ + u8 *apDiv[NB-1]; /* Divider cells in pParent */ + int cntNew[NB+2]; /* Index in b.paCell[] of cell after i-th page */ + int cntOld[NB+2]; /* Old index in b.apCell[] */ + int szNew[NB+2]; /* Combined size of cells placed on i-th page */ + u8 *aSpace1; /* Space for copies of dividers cells */ + Pgno pgno; /* Temp var to store a page number in */ + u8 abDone[NB+2]; /* True after i'th new page is populated */ + Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ + Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ + u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ + CellArray b; /* Parsed information on cells being balanced */ + + memset(abDone, 0, sizeof(abDone)); + memset(&b, 0, sizeof(b)); + pBt = pParent->pBt; + assert( sqlite3_mutex_held(pBt->mutex) ); + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + + /* At this point pParent may have at most one overflow cell. And if + ** this overflow cell is present, it must be the cell with + ** index iParentIdx. This scenario comes about when this function + ** is called (indirectly) from sqlite3BtreeDelete(). + */ + assert( pParent->nOverflow==0 || pParent->nOverflow==1 ); + assert( pParent->nOverflow==0 || pParent->aiOvfl[0]==iParentIdx ); + + if( !aOvflSpace ){ + return SQLITE_NOMEM_BKPT; + } + assert( pParent->nFree>=0 ); + + /* Find the sibling pages to balance. Also locate the cells in pParent + ** that divide the siblings. An attempt is made to find NN siblings on + ** either side of pPage. More siblings are taken from one side, however, + ** if there are fewer than NN siblings on the other side. If pParent + ** has NB or fewer children then all children of pParent are taken. + ** + ** This loop also drops the divider cells from the parent page. This + ** way, the remainder of the function does not have to deal with any + ** overflow cells in the parent page, since if any existed they will + ** have already been removed. + */ + i = pParent->nOverflow + pParent->nCell; + if( i<2 ){ + nxDiv = 0; + }else{ + assert( bBulk==0 || bBulk==1 ); + if( iParentIdx==0 ){ + nxDiv = 0; + }else if( iParentIdx==i ){ + nxDiv = i-2+bBulk; + }else{ + nxDiv = iParentIdx-1; + } + i = 2-bBulk; + } + nOld = i+1; + if( (i+nxDiv-pParent->nOverflow)==pParent->nCell ){ + pRight = &pParent->aData[pParent->hdrOffset+8]; + }else{ + pRight = findCell(pParent, i+nxDiv-pParent->nOverflow); + } + pgno = get4byte(pRight); + while( 1 ){ + if( rc==SQLITE_OK ){ + rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); + } + if( rc ){ + memset(apOld, 0, (i+1)*sizeof(MemPage*)); + goto balance_cleanup; + } + if( apOld[i]->nFree<0 ){ + rc = btreeComputeFreeSpace(apOld[i]); + if( rc ){ + memset(apOld, 0, (i)*sizeof(MemPage*)); + goto balance_cleanup; + } + } + nMaxCells += apOld[i]->nCell + ArraySize(pParent->apOvfl); + if( (i--)==0 ) break; + + if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ + apDiv[i] = pParent->apOvfl[0]; + pgno = get4byte(apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); + pParent->nOverflow = 0; + }else{ + apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow); + pgno = get4byte(apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); + + /* Drop the cell from the parent page. apDiv[i] still points to + ** the cell within the parent, even though it has been dropped. + ** This is safe because dropping a cell only overwrites the first + ** four bytes of it, and this function does not need the first + ** four bytes of the divider cell. So the pointer is safe to use + ** later on. + ** + ** But not if we are in secure-delete mode. In secure-delete mode, + ** the dropCell() routine will overwrite the entire cell with zeroes. + ** In this case, temporarily copy the cell into the aOvflSpace[] + ** buffer. It will be copied out again as soon as the aSpace[] buffer + ** is allocated. */ + if( pBt->btsFlags & BTS_FAST_SECURE ){ + int iOff; + + /* If the following if() condition is not true, the db is corrupted. + ** The call to dropCell() below will detect this. */ + iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData); + if( (iOff+szNew[i])<=(int)pBt->usableSize ){ + memcpy(&aOvflSpace[iOff], apDiv[i], szNew[i]); + apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData]; + } + } + dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc); + } + } + + /* Make nMaxCells a multiple of 4 in order to preserve 8-byte + ** alignment */ + nMaxCells = (nMaxCells + 3)&~3; + + /* + ** Allocate space for memory structures + */ + szScratch = + nMaxCells*sizeof(u8*) /* b.apCell */ + + nMaxCells*sizeof(u16) /* b.szCell */ + + pBt->pageSize; /* aSpace1 */ + + assert( szScratch<=7*(int)pBt->pageSize ); + b.apCell = sqlite3StackAllocRaw(0, szScratch ); + if( b.apCell==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto balance_cleanup; + } + b.szCell = (u16*)&b.apCell[nMaxCells]; + aSpace1 = (u8*)&b.szCell[nMaxCells]; + assert( EIGHT_BYTE_ALIGNMENT(aSpace1) ); + + /* + ** Load pointers to all cells on sibling pages and the divider cells + ** into the local b.apCell[] array. Make copies of the divider cells + ** into space obtained from aSpace1[]. The divider cells have already + ** been removed from pParent. + ** + ** If the siblings are on leaf pages, then the child pointers of the + ** divider cells are stripped from the cells before they are copied + ** into aSpace1[]. In this way, all cells in b.apCell[] are without + ** child pointers. If siblings are not leaves, then all cell in + ** b.apCell[] include child pointers. Either way, all cells in b.apCell[] + ** are alike. + ** + ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf. + ** leafData: 1 if pPage holds key+data and pParent holds only keys. + */ + b.pRef = apOld[0]; + leafCorrection = b.pRef->leaf*4; + leafData = b.pRef->intKeyLeaf; + for(i=0; inCell; + u8 *aData = pOld->aData; + u16 maskPage = pOld->maskPage; + u8 *piCell = aData + pOld->cellOffset; + u8 *piEnd; + VVA_ONLY( int nCellAtStart = b.nCell; ) + + /* Verify that all sibling pages are of the same "type" (table-leaf, + ** table-interior, index-leaf, or index-interior). + */ + if( pOld->aData[0]!=apOld[0]->aData[0] ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + + /* Load b.apCell[] with pointers to all cells in pOld. If pOld + ** contains overflow cells, include them in the b.apCell[] array + ** in the correct spot. + ** + ** Note that when there are multiple overflow cells, it is always the + ** case that they are sequential and adjacent. This invariant arises + ** because multiple overflows can only occurs when inserting divider + ** cells into a parent on a prior balance, and divider cells are always + ** adjacent and are inserted in order. There is an assert() tagged + ** with "NOTE 1" in the overflow cell insertion loop to prove this + ** invariant. + ** + ** This must be done in advance. Once the balance starts, the cell + ** offset section of the btree page will be overwritten and we will no + ** long be able to find the cells if a pointer to each cell is not saved + ** first. + */ + memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); + if( pOld->nOverflow>0 ){ + if( NEVER(limitaiOvfl[0]) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + limit = pOld->aiOvfl[0]; + for(j=0; jnOverflow; k++){ + assert( k==0 || pOld->aiOvfl[k-1]+1==pOld->aiOvfl[k] );/* NOTE 1 */ + b.apCell[b.nCell] = pOld->apOvfl[k]; + b.nCell++; + } + } + piEnd = aData + pOld->cellOffset + 2*pOld->nCell; + while( piCellnCell+pOld->nOverflow) ); + + cntOld[i] = b.nCell; + if( imaxLocal+23 ); + assert( iSpace1 <= (int)pBt->pageSize ); + memcpy(pTemp, apDiv[i], sz); + b.apCell[b.nCell] = pTemp+leafCorrection; + assert( leafCorrection==0 || leafCorrection==4 ); + b.szCell[b.nCell] = b.szCell[b.nCell] - leafCorrection; + if( !pOld->leaf ){ + assert( leafCorrection==0 ); + assert( pOld->hdrOffset==0 || CORRUPT_DB ); + /* The right pointer of the child page pOld becomes the left + ** pointer of the divider cell */ + memcpy(b.apCell[b.nCell], &pOld->aData[8], 4); + }else{ + assert( leafCorrection==4 ); + while( b.szCell[b.nCell]<4 ){ + /* Do not allow any cells smaller than 4 bytes. If a smaller cell + ** does exist, pad it with 0x00 bytes. */ + assert( b.szCell[b.nCell]==3 || CORRUPT_DB ); + assert( b.apCell[b.nCell]==&aSpace1[iSpace1-3] || CORRUPT_DB ); + aSpace1[iSpace1++] = 0x00; + b.szCell[b.nCell]++; + } + } + b.nCell++; + } + } + + /* + ** Figure out the number of pages needed to hold all b.nCell cells. + ** Store this number in "k". Also compute szNew[] which is the total + ** size of all cells on the i-th page and cntNew[] which is the index + ** in b.apCell[] of the cell that divides page i from page i+1. + ** cntNew[k] should equal b.nCell. + ** + ** Values computed by this block: + ** + ** k: The total number of sibling pages + ** szNew[i]: Spaced used on the i-th sibling page. + ** cntNew[i]: Index in b.apCell[] and b.szCell[] for the first cell to + ** the right of the i-th sibling page. + ** usableSpace: Number of bytes of space available on each sibling. + ** + */ + usableSpace = pBt->usableSize - 12 + leafCorrection; + for(i=k=0; iaDataEnd; + b.ixNx[k] = cntOld[i]; + if( k && b.ixNx[k]==b.ixNx[k-1] ){ + k--; /* Omit b.ixNx[] entry for child pages with no cells */ + } + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } + assert( p->nFree>=0 ); + szNew[i] = usableSpace - p->nFree; + for(j=0; jnOverflow; j++){ + szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); + } + cntNew[i] = cntOld[i]; + } + k = nOld; + for(i=0; iusableSpace ){ + if( i+1>=k ){ + k = i+2; + if( k>NB+2 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } + szNew[k-1] = 0; + cntNew[k-1] = b.nCell; + } + sz = 2 + cachedCellSize(&b, cntNew[i]-1); + szNew[i] -= sz; + if( !leafData ){ + if( cntNew[i]usableSpace ) break; + szNew[i] += sz; + cntNew[i]++; + if( !leafData ){ + if( cntNew[i]=b.nCell ){ + k = i+1; + }else if( cntNew[i] <= (i>0 ? cntNew[i-1] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + } + + /* + ** The packing computed by the previous block is biased toward the siblings + ** on the left side (siblings with smaller keys). The left siblings are + ** always nearly full, while the right-most sibling might be nearly empty. + ** The next block of code attempts to adjust the packing of siblings to + ** get a better balance. + ** + ** This adjustment is more than an optimization. The packing above might + ** be so out of balance as to be illegal. For example, the right-most + ** sibling might be completely empty. This adjustment is not optional. + */ + for(i=k-1; i>0; i--){ + int szRight = szNew[i]; /* Size of sibling on the right */ + int szLeft = szNew[i-1]; /* Size of sibling on the left */ + int r; /* Index of right-most cell in left sibling */ + int d; /* Index of first cell to the left of right sibling */ + + r = cntNew[i-1] - 1; + d = r + 1 - leafData; + (void)cachedCellSize(&b, d); + do{ + assert( d szLeft-(b.szCell[r]+(i==k-1?0:2)))){ + break; + } + szRight += b.szCell[d] + 2; + szLeft -= b.szCell[r] + 2; + cntNew[i-1] = r; + r--; + d--; + }while( r>=0 ); + szNew[i] = szRight; + szNew[i-1] = szLeft; + if( cntNew[i-1] <= (i>1 ? cntNew[i-2] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + } + + /* Sanity check: For a non-corrupt database file one of the follwing + ** must be true: + ** (1) We found one or more cells (cntNew[0])>0), or + ** (2) pPage is a virtual root page. A virtual root page is when + ** the real root page is page 1 and we are the only child of + ** that page. + */ + assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) || CORRUPT_DB); + TRACE(("BALANCE: old: %d(nc=%d) %d(nc=%d) %d(nc=%d)\n", + apOld[0]->pgno, apOld[0]->nCell, + nOld>=2 ? apOld[1]->pgno : 0, nOld>=2 ? apOld[1]->nCell : 0, + nOld>=3 ? apOld[2]->pgno : 0, nOld>=3 ? apOld[2]->nCell : 0 + )); + + /* + ** Allocate k new pages. Reuse old pages where possible. + */ + pageFlags = apOld[0]->aData[0]; + for(i=0; ipDbPage); + nNew++; + if( sqlite3PagerPageRefcount(pNew->pDbPage)!=1+(i==(iParentIdx-nxDiv)) + && rc==SQLITE_OK + ){ + rc = SQLITE_CORRUPT_BKPT; + } + if( rc ) goto balance_cleanup; + }else{ + assert( i>0 ); + rc = allocateBtreePage(pBt, &pNew, &pgno, (bBulk ? 1 : pgno), 0); + if( rc ) goto balance_cleanup; + zeroPage(pNew, pageFlags); + apNew[i] = pNew; + nNew++; + cntOld[i] = b.nCell; + + /* Set the pointer-map entry for the new sibling page. */ + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc); + if( rc!=SQLITE_OK ){ + goto balance_cleanup; + } + } + } + } + + /* + ** Reassign page numbers so that the new pages are in ascending order. + ** This helps to keep entries in the disk file in order so that a scan + ** of the table is closer to a linear scan through the file. That in turn + ** helps the operating system to deliver pages from the disk more rapidly. + ** + ** An O(n^2) insertion sort algorithm is used, but since n is never more + ** than (NB+2) (a small constant), that should not be a problem. + ** + ** When NB==3, this one optimization makes the database about 25% faster + ** for large insertions and deletions. + */ + for(i=0; ipgno; + aPgFlags[i] = apNew[i]->pDbPage->flags; + for(j=0; ji ){ + sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0); + } + sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]); + apNew[i]->pgno = pgno; + } + } + + TRACE(("BALANCE: new: %d(%d nc=%d) %d(%d nc=%d) %d(%d nc=%d) " + "%d(%d nc=%d) %d(%d nc=%d)\n", + apNew[0]->pgno, szNew[0], cntNew[0], + nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0, + nNew>=2 ? cntNew[1] - cntNew[0] - !leafData : 0, + nNew>=3 ? apNew[2]->pgno : 0, nNew>=3 ? szNew[2] : 0, + nNew>=3 ? cntNew[2] - cntNew[1] - !leafData : 0, + nNew>=4 ? apNew[3]->pgno : 0, nNew>=4 ? szNew[3] : 0, + nNew>=4 ? cntNew[3] - cntNew[2] - !leafData : 0, + nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0, + nNew>=5 ? cntNew[4] - cntNew[3] - !leafData : 0 + )); + + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( nNew>=1 && nNew<=ArraySize(apNew) ); + assert( apNew[nNew-1]!=0 ); + put4byte(pRight, apNew[nNew-1]->pgno); + + /* If the sibling pages are not leaves, ensure that the right-child pointer + ** of the right-most new sibling page is set to the value that was + ** originally in the same field of the right-most old sibling page. */ + if( (pageFlags & PTF_LEAF)==0 && nOld!=nNew ){ + MemPage *pOld = (nNew>nOld ? apNew : apOld)[nOld-1]; + memcpy(&apNew[nNew-1]->aData[8], &pOld->aData[8], 4); + } + + /* Make any required updates to pointer map entries associated with + ** cells stored on sibling pages following the balance operation. Pointer + ** map entries associated with divider cells are set by the insertCell() + ** routine. The associated pointer map entries are: + ** + ** a) if the cell contains a reference to an overflow chain, the + ** entry associated with the first page in the overflow chain, and + ** + ** b) if the sibling pages are not leaves, the child page associated + ** with the cell. + ** + ** If the sibling pages are not leaves, then the pointer map entry + ** associated with the right-child of each sibling may also need to be + ** updated. This happens below, after the sibling pages have been + ** populated, not here. + */ + if( ISAUTOVACUUM ){ + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; + int cntOldNext = pNew->nCell + pNew->nOverflow; + int iNew = 0; + int iOld = 0; + + for(i=0; i=0 && iOldnCell + pOld->nOverflow + !leafData; + } + if( i==cntNew[iNew] ){ + pNew = apNew[++iNew]; + if( !leafData ) continue; + } + + /* Cell pCell is destined for new sibling page pNew. Originally, it + ** was either part of sibling page iOld (possibly an overflow cell), + ** or else the divider cell to the left of sibling page iOld. So, + ** if sibling page iOld had the same page number as pNew, and if + ** pCell really was a part of sibling page iOld (not a divider or + ** overflow cell), we can skip updating the pointer map entries. */ + if( iOld>=nNew + || pNew->pgno!=aPgno[iOld] + || !SQLITE_WITHIN(pCell,pOld->aData,pOld->aDataEnd) + ){ + if( !leafCorrection ){ + ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); + } + if( cachedCellSize(&b,i)>pNew->minLocal ){ + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); + } + if( rc ) goto balance_cleanup; + } + } + } + + /* Insert new divider cells into pParent. */ + for(i=0; ileaf ){ + memcpy(&pNew->aData[8], pCell, 4); + }else if( leafData ){ + /* If the tree is a leaf-data tree, and the siblings are leaves, + ** then there is no divider cell in b.apCell[]. Instead, the divider + ** cell consists of the integer key for the right-most cell of + ** the sibling-page assembled above only. + */ + CellInfo info; + j--; + pNew->xParseCell(pNew, b.apCell[j], &info); + pCell = pTemp; + sz = 4 + putVarint(&pCell[4], info.nKey); + pTemp = 0; + }else{ + pCell -= 4; + /* Obscure case for non-leaf-data trees: If the cell at pCell was + ** previously stored on a leaf node, and its reported size was 4 + ** bytes, then it may actually be smaller than this + ** (see btreeParseCellPtr(), 4 bytes is the minimum size of + ** any cell). But it is important to pass the correct size to + ** insertCell(), so reparse the cell now. + ** + ** This can only happen for b-trees used to evaluate "IN (SELECT ...)" + ** and WITHOUT ROWID tables with exactly one column which is the + ** primary key. + */ + if( b.szCell[j]==4 ){ + assert(leafCorrection==4); + sz = pParent->xCellSize(pParent, pCell); + } + } + iOvflSpace += sz; + assert( sz<=pBt->maxLocal+23 ); + assert( iOvflSpace <= (int)pBt->pageSize ); + for(k=0; b.ixNx[k]<=j && ALWAYS(kpgno, &rc); + if( rc!=SQLITE_OK ) goto balance_cleanup; + assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + } + + /* Now update the actual sibling pages. The order in which they are updated + ** is important, as this code needs to avoid disrupting any page from which + ** cells may still to be read. In practice, this means: + ** + ** (1) If cells are moving left (from apNew[iPg] to apNew[iPg-1]) + ** then it is not safe to update page apNew[iPg] until after + ** the left-hand sibling apNew[iPg-1] has been updated. + ** + ** (2) If cells are moving right (from apNew[iPg] to apNew[iPg+1]) + ** then it is not safe to update page apNew[iPg] until after + ** the right-hand sibling apNew[iPg+1] has been updated. + ** + ** If neither of the above apply, the page is safe to update. + ** + ** The iPg value in the following loop starts at nNew-1 goes down + ** to 0, then back up to nNew-1 again, thus making two passes over + ** the pages. On the initial downward pass, only condition (1) above + ** needs to be tested because (2) will always be true from the previous + ** step. On the upward pass, both conditions are always true, so the + ** upwards pass simply processes pages that were missed on the downward + ** pass. + */ + for(i=1-nNew; i=0 && iPg=0 /* On the upwards pass, or... */ + || cntOld[iPg-1]>=cntNew[iPg-1] /* Condition (1) is true */ + ){ + int iNew; + int iOld; + int nNewCell; + + /* Verify condition (1): If cells are moving left, update iPg + ** only after iPg-1 has already been updated. */ + assert( iPg==0 || cntOld[iPg-1]>=cntNew[iPg-1] || abDone[iPg-1] ); + + /* Verify condition (2): If cells are moving right, update iPg + ** only after iPg+1 has already been updated. */ + assert( cntNew[iPg]>=cntOld[iPg] || abDone[iPg+1] ); + + if( iPg==0 ){ + iNew = iOld = 0; + nNewCell = cntNew[0]; + }else{ + iOld = iPgnFree = usableSpace-szNew[iPg]; + assert( apNew[iPg]->nOverflow==0 ); + assert( apNew[iPg]->nCell==nNewCell ); + } + } + + /* All pages have been processed exactly once */ + assert( memcmp(abDone, "\01\01\01\01\01", nNew)==0 ); + + assert( nOld>0 ); + assert( nNew>0 ); + + if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){ + /* The root page of the b-tree now contains no cells. The only sibling + ** page is the right-child of the parent. Copy the contents of the + ** child page into the parent, decreasing the overall height of the + ** b-tree structure by one. This is described as the "balance-shallower" + ** sub-algorithm in some documentation. + ** + ** If this is an auto-vacuum database, the call to copyNodeContent() + ** sets all pointer-map entries corresponding to database image pages + ** for which the pointer is stored within the content being copied. + ** + ** It is critical that the child page be defragmented before being + ** copied into the parent, because if the parent is page 1 then it will + ** by smaller than the child due to the database header, and so all the + ** free space needs to be up front. + */ + assert( nNew==1 || CORRUPT_DB ); + rc = defragmentPage(apNew[0], -1); + testcase( rc!=SQLITE_OK ); + assert( apNew[0]->nFree == + (get2byteNotZero(&apNew[0]->aData[5]) - apNew[0]->cellOffset + - apNew[0]->nCell*2) + || rc!=SQLITE_OK + ); + copyNodeContent(apNew[0], pParent, &rc); + freePage(apNew[0], &rc); + }else if( ISAUTOVACUUM && !leafCorrection ){ + /* Fix the pointer map entries associated with the right-child of each + ** sibling page. All other pointer map entries have already been taken + ** care of. */ + for(i=0; iaData[8]); + ptrmapPut(pBt, key, PTRMAP_BTREE, apNew[i]->pgno, &rc); + } + } + + assert( pParent->isInit ); + TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n", + nOld, nNew, b.nCell)); + + /* Free any old pages that were not reused as new pages. + */ + for(i=nNew; iisInit ){ + /* The ptrmapCheckPages() contains assert() statements that verify that + ** all pointer map pages are set correctly. This is helpful while + ** debugging. This is usually disabled because a corrupt database may + ** cause an assert() statement to fail. */ + ptrmapCheckPages(apNew, nNew); + ptrmapCheckPages(&pParent, 1); + } +#endif + + /* + ** Cleanup before returning. + */ +balance_cleanup: + sqlite3StackFree(0, b.apCell); + for(i=0; ipBt; /* The BTree */ + + assert( pRoot->nOverflow>0 ); + assert( sqlite3_mutex_held(pBt->mutex) ); + + /* Make pRoot, the root page of the b-tree, writable. Allocate a new + ** page that will become the new right-child of pPage. Copy the contents + ** of the node stored on pRoot into the new child page. + */ + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc==SQLITE_OK ){ + rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0); + copyNodeContent(pRoot, pChild, &rc); + if( ISAUTOVACUUM ){ + ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc); + } + } + if( rc ){ + *ppChild = 0; + releasePage(pChild); + return rc; + } + assert( sqlite3PagerIswriteable(pChild->pDbPage) ); + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); + + TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); + + /* Copy the overflow cells from pRoot to pChild */ + memcpy(pChild->aiOvfl, pRoot->aiOvfl, + pRoot->nOverflow*sizeof(pRoot->aiOvfl[0])); + memcpy(pChild->apOvfl, pRoot->apOvfl, + pRoot->nOverflow*sizeof(pRoot->apOvfl[0])); + pChild->nOverflow = pRoot->nOverflow; + + /* Zero the contents of pRoot. Then install pChild as the right-child. */ + zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF); + put4byte(&pRoot->aData[pRoot->hdrOffset+8], pgnoChild); + + *ppChild = pChild; + return SQLITE_OK; +} + +/* +** Return SQLITE_CORRUPT if any cursor other than pCur is currently valid +** on the same B-tree as pCur. +** +** This can occur if a database is corrupt with two or more SQL tables +** pointing to the same b-tree. If an insert occurs on one SQL table +** and causes a BEFORE TRIGGER to do a secondary insert on the other SQL +** table linked to the same b-tree. If the secondary insert causes a +** rebalance, that can change content out from under the cursor on the +** first SQL table, violating invariants on the first insert. +*/ +static int anotherValidCursor(BtCursor *pCur){ + BtCursor *pOther; + for(pOther=pCur->pBt->pCursor; pOther; pOther=pOther->pNext){ + if( pOther!=pCur + && pOther->eState==CURSOR_VALID + && pOther->pPage==pCur->pPage + ){ + return SQLITE_CORRUPT_BKPT; + } + } + return SQLITE_OK; +} + +/* +** The page that pCur currently points to has just been modified in +** some way. This function figures out if this modification means the +** tree needs to be balanced, and if so calls the appropriate balancing +** routine. Balancing routines are: +** +** balance_quick() +** balance_deeper() +** balance_nonroot() +*/ +static int balance(BtCursor *pCur){ + int rc = SQLITE_OK; + u8 aBalanceQuickSpace[13]; + u8 *pFree = 0; + + VVA_ONLY( int balance_quick_called = 0 ); + VVA_ONLY( int balance_deeper_called = 0 ); + + do { + int iPage; + MemPage *pPage = pCur->pPage; + + if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; + if( pPage->nOverflow==0 && pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + /* No rebalance required as long as: + ** (1) There are no overflow cells + ** (2) The amount of free space on the page is less than 2/3rds of + ** the total usable space on the page. */ + break; + }else if( (iPage = pCur->iPage)==0 ){ + if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ + /* The root page of the b-tree is overfull. In this case call the + ** balance_deeper() function to create a new child for the root-page + ** and copy the current contents of the root-page to it. The + ** next iteration of the do-loop will balance the child page. + */ + assert( balance_deeper_called==0 ); + VVA_ONLY( balance_deeper_called++ ); + rc = balance_deeper(pPage, &pCur->apPage[1]); + if( rc==SQLITE_OK ){ + pCur->iPage = 1; + pCur->ix = 0; + pCur->aiIdx[0] = 0; + pCur->apPage[0] = pPage; + pCur->pPage = pCur->apPage[1]; + assert( pCur->pPage->nOverflow ); + } + }else{ + break; + } + }else{ + MemPage * const pParent = pCur->apPage[iPage-1]; + int const iIdx = pCur->aiIdx[iPage-1]; + + rc = sqlite3PagerWrite(pParent->pDbPage); + if( rc==SQLITE_OK && pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + } + if( rc==SQLITE_OK ){ +#ifndef SQLITE_OMIT_QUICKBALANCE + if( pPage->intKeyLeaf + && pPage->nOverflow==1 + && pPage->aiOvfl[0]==pPage->nCell + && pParent->pgno!=1 + && pParent->nCell==iIdx + ){ + /* Call balance_quick() to create a new sibling of pPage on which + ** to store the overflow cell. balance_quick() inserts a new cell + ** into pParent, which may cause pParent overflow. If this + ** happens, the next iteration of the do-loop will balance pParent + ** use either balance_nonroot() or balance_deeper(). Until this + ** happens, the overflow cell is stored in the aBalanceQuickSpace[] + ** buffer. + ** + ** The purpose of the following assert() is to check that only a + ** single call to balance_quick() is made for each call to this + ** function. If this were not verified, a subtle bug involving reuse + ** of the aBalanceQuickSpace[] might sneak in. + */ + assert( balance_quick_called==0 ); + VVA_ONLY( balance_quick_called++ ); + rc = balance_quick(pParent, pPage, aBalanceQuickSpace); + }else +#endif + { + /* In this case, call balance_nonroot() to redistribute cells + ** between pPage and up to 2 of its sibling pages. This involves + ** modifying the contents of pParent, which may cause pParent to + ** become overfull or underfull. The next iteration of the do-loop + ** will balance the parent page to correct this. + ** + ** If the parent page becomes overfull, the overflow cell or cells + ** are stored in the pSpace buffer allocated immediately below. + ** A subsequent iteration of the do-loop will deal with this by + ** calling balance_nonroot() (balance_deeper() may be called first, + ** but it doesn't deal with overflow cells - just moves them to a + ** different page). Once this subsequent call to balance_nonroot() + ** has completed, it is safe to release the pSpace buffer used by + ** the previous call, as the overflow cell data will have been + ** copied either into the body of a database page or into the new + ** pSpace buffer passed to the latter call to balance_nonroot(). + */ + u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize); + rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, + pCur->hints&BTREE_BULKLOAD); + if( pFree ){ + /* If pFree is not NULL, it points to the pSpace buffer used + ** by a previous call to balance_nonroot(). Its contents are + ** now stored either on real database pages or within the + ** new pSpace buffer, so it may be safely freed here. */ + sqlite3PageFree(pFree); + } + + /* The pSpace buffer will be freed after the next call to + ** balance_nonroot(), or just before this function returns, whichever + ** comes first. */ + pFree = pSpace; + } + } + + pPage->nOverflow = 0; + + /* The next iteration of the do-loop balances the parent page. */ + releasePage(pPage); + pCur->iPage--; + assert( pCur->iPage>=0 ); + pCur->pPage = pCur->apPage[pCur->iPage]; + } + }while( rc==SQLITE_OK ); + + if( pFree ){ + sqlite3PageFree(pFree); + } + return rc; +} + +/* Overwrite content from pX into pDest. Only do the write if the +** content is different from what is already there. +*/ +static int btreeOverwriteContent( + MemPage *pPage, /* MemPage on which writing will occur */ + u8 *pDest, /* Pointer to the place to start writing */ + const BtreePayload *pX, /* Source of data to write */ + int iOffset, /* Offset of first byte to write */ + int iAmt /* Number of bytes to be written */ +){ + int nData = pX->nData - iOffset; + if( nData<=0 ){ + /* Overwritting with zeros */ + int i; + for(i=0; ipDbPage); + if( rc ) return rc; + memset(pDest + i, 0, iAmt - i); + } + }else{ + if( nDatapData) + iOffset, iAmt)!=0 ){ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); + } + } + return SQLITE_OK; +} + +/* +** Overwrite the cell that cursor pCur is pointing to with fresh content +** contained in pX. +*/ +static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ + int iOffset; /* Next byte of pX->pData to write */ + int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */ + int rc; /* Return code */ + MemPage *pPage = pCur->pPage; /* Page being written */ + BtShared *pBt; /* Btree */ + Pgno ovflPgno; /* Next overflow page to write */ + u32 ovflPageSize; /* Size to write on overflow page */ + + if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd + || pCur->info.pPayload < pPage->aData + pPage->cellOffset + ){ + return SQLITE_CORRUPT_BKPT; + } + /* Overwrite the local portion first */ + rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX, + 0, pCur->info.nLocal); + if( rc ) return rc; + if( pCur->info.nLocal==nTotal ) return SQLITE_OK; + + /* Now overwrite the overflow pages */ + iOffset = pCur->info.nLocal; + assert( nTotal>=0 ); + assert( iOffset>=0 ); + ovflPgno = get4byte(pCur->info.pPayload + iOffset); + pBt = pPage->pBt; + ovflPageSize = pBt->usableSize - 4; + do{ + rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); + if( rc ) return rc; + if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + if( iOffset+ovflPageSize<(u32)nTotal ){ + ovflPgno = get4byte(pPage->aData); + }else{ + ovflPageSize = nTotal - iOffset; + } + rc = btreeOverwriteContent(pPage, pPage->aData+4, pX, + iOffset, ovflPageSize); + } + sqlite3PagerUnref(pPage->pDbPage); + if( rc ) return rc; + iOffset += ovflPageSize; + }while( iOffset0 then pCur points to a cell +** that is larger than (pKey,nKey). +** +** If seekResult==0, that means pCur is pointing at some unknown location. +** In that case, this routine must seek the cursor to the correct insertion +** point for (pKey,nKey) before doing the insertion. For index btrees, +** if pX->nMem is non-zero, then pX->aMem contains pointers to the unpacked +** key values and pX->aMem can be used instead of pX->pKey to avoid having +** to decode the key. +*/ +SQLITE_PRIVATE int sqlite3BtreeInsert( + BtCursor *pCur, /* Insert data into the table of this cursor */ + const BtreePayload *pX, /* Content of the row to be inserted */ + int flags, /* True if this is likely an append */ + int seekResult /* Result of prior IndexMoveto() call */ +){ + int rc; + int loc = seekResult; /* -1: before desired location +1: after */ + int szNew = 0; + int idx; + MemPage *pPage; + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + unsigned char *oldCell; + unsigned char *newCell = 0; + + assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags ); + assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 ); + + /* Save the positions of any other cursors open on this table. + ** + ** In some cases, the call to btreeMoveto() below is a no-op. For + ** example, when inserting data into a table with auto-generated integer + ** keys, the VDBE layer invokes sqlite3BtreeLast() to figure out the + ** integer key to use. It then calls this function to actually insert the + ** data into the intkey B-Tree. In this case btreeMoveto() recognizes + ** that the cursor is already where it needs to be and returns without + ** doing any work. To avoid thwarting these optimizations, it is important + ** not to clear the cursor here. + */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + if( loc && pCur->iPage<0 ){ + /* This can only happen if the schema is corrupt such that there is more + ** than one table or index with the same root page as used by the cursor. + ** Which can only happen if the SQLITE_NoSchemaError flag was set when + ** the schema was loaded. This cannot be asserted though, as a user might + ** set the flag, load the schema, and then unset the flag. */ + return SQLITE_CORRUPT_BKPT; + } + } + + /* Ensure that the cursor is not in the CURSOR_FAULT state and that it + ** points to a valid cell. + */ + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + testcase( pCur->eState==CURSOR_REQUIRESEEK ); + testcase( pCur->eState==CURSOR_FAULT ); + rc = moveToRoot(pCur); + if( rc && rc!=SQLITE_EMPTY ) return rc; + } + + assert( cursorOwnsBtShared(pCur) ); + assert( (pCur->curFlags & BTCF_WriteFlag)!=0 + && pBt->inTransaction==TRANS_WRITE + && (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + + /* Assert that the caller has been consistent. If this cursor was opened + ** expecting an index b-tree, then the caller should be inserting blob + ** keys with no associated data. If the cursor was opened expecting an + ** intkey table, the caller should be inserting integer keys with a + ** blob of associated data. */ + assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) ); + + if( pCur->pKeyInfo==0 ){ + assert( pX->pKey==0 ); + /* If this is an insert into a table b-tree, invalidate any incrblob + ** cursors open on the row being replaced */ + if( p->hasIncrblobCur ){ + invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0); + } + + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + ** to a row with the same key as the new entry being inserted. + */ +#ifdef SQLITE_DEBUG + if( flags & BTREE_SAVEPOSITION ){ + assert( pCur->curFlags & BTCF_ValidNKey ); + assert( pX->nKey==pCur->info.nKey ); + assert( loc==0 ); + } +#endif + + /* On the other hand, BTREE_SAVEPOSITION==0 does not imply + ** that the cursor is not pointing to a row to be overwritten. + ** So do a complete check. + */ + if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey ){ + /* The cursor is pointing to the entry that is to be + ** overwritten */ + assert( pX->nData>=0 && pX->nZero>=0 ); + if( pCur->info.nSize!=0 + && pCur->info.nPayload==(u32)pX->nData+pX->nZero + ){ + /* New entry is the same size as the old. Do an overwrite */ + return btreeOverwriteCell(pCur, pX); + } + assert( loc==0 ); + }else if( loc==0 ){ + /* The cursor is *not* pointing to the cell to be overwritten, nor + ** to an adjacent cell. Move the cursor so that it is pointing either + ** to the cell to be overwritten or an adjacent cell. + */ + rc = sqlite3BtreeTableMoveto(pCur, pX->nKey, + (flags & BTREE_APPEND)!=0, &loc); + if( rc ) return rc; + } + }else{ + /* This is an index or a WITHOUT ROWID table */ + + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + ** to a row with the same key as the new entry being inserted. + */ + assert( (flags & BTREE_SAVEPOSITION)==0 || loc==0 ); + + /* If the cursor is not already pointing either to the cell to be + ** overwritten, or if a new cell is being inserted, if the cursor is + ** not pointing to an immediately adjacent cell, then move the cursor + ** so that it does. + */ + if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){ + if( pX->nMem ){ + UnpackedRecord r; + r.pKeyInfo = pCur->pKeyInfo; + r.aMem = pX->aMem; + r.nField = pX->nMem; + r.default_rc = 0; + r.eqSeen = 0; + rc = sqlite3BtreeIndexMoveto(pCur, &r, &loc); + }else{ + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, + (flags & BTREE_APPEND)!=0, &loc); + } + if( rc ) return rc; + } + + /* If the cursor is currently pointing to an entry to be overwritten + ** and the new content is the same as as the old, then use the + ** overwrite optimization. + */ + if( loc==0 ){ + getCellInfo(pCur); + if( pCur->info.nKey==pX->nKey ){ + BtreePayload x2; + x2.pData = pX->pKey; + x2.nData = pX->nKey; + x2.nZero = 0; + return btreeOverwriteCell(pCur, &x2); + } + } + } + assert( pCur->eState==CURSOR_VALID + || (pCur->eState==CURSOR_INVALID && loc) ); + + pPage = pCur->pPage; + assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); + assert( pPage->leaf || !pPage->intKey ); + if( pPage->nFree<0 ){ + if( NEVER(pCur->eState>CURSOR_INVALID) ){ + /* ^^^^^--- due to the moveToRoot() call above */ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = btreeComputeFreeSpace(pPage); + } + if( rc ) return rc; + } + + TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", + pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, + loc==0 ? "overwrite" : "new entry")); + assert( pPage->isInit || CORRUPT_DB ); + newCell = pBt->pTmpSpace; + assert( newCell!=0 ); + if( flags & BTREE_PREFORMAT ){ + rc = SQLITE_OK; + szNew = pBt->nPreformatSize; + if( szNew<4 ) szNew = 4; + if( ISAUTOVACUUM && szNew>pPage->maxLocal ){ + CellInfo info; + pPage->xParseCell(pPage, newCell, &info); + if( info.nPayload!=info.nLocal ){ + Pgno ovfl = get4byte(&newCell[szNew-4]); + ptrmapPut(pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, &rc); + } + } + }else{ + rc = fillInCell(pPage, newCell, pX, &szNew); + } + if( rc ) goto end_insert; + assert( szNew==pPage->xCellSize(pPage, newCell) ); + assert( szNew <= MX_CELL_SIZE(pBt) ); + idx = pCur->ix; + if( loc==0 ){ + CellInfo info; + assert( idx>=0 ); + if( idx>=pPage->nCell ){ + return SQLITE_CORRUPT_BKPT; + } + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ){ + goto end_insert; + } + oldCell = findCell(pPage, idx); + if( !pPage->leaf ){ + memcpy(newCell, oldCell, 4); + } + BTREE_CLEAR_CELL(rc, pPage, oldCell, info); + testcase( pCur->curFlags & BTCF_ValidOvfl ); + invalidateOverflowCache(pCur); + if( info.nSize==szNew && info.nLocal==info.nPayload + && (!ISAUTOVACUUM || szNewminLocal) + ){ + /* Overwrite the old cell with the new if they are the same size. + ** We could also try to do this if the old cell is smaller, then add + ** the leftover space to the free list. But experiments show that + ** doing that is no faster then skipping this optimization and just + ** calling dropCell() and insertCell(). + ** + ** This optimization cannot be used on an autovacuum database if the + ** new entry uses overflow pages, as the insertCell() call below is + ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ + assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ + if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ + return SQLITE_CORRUPT_BKPT; + } + if( oldCell+szNew > pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } + memcpy(oldCell, newCell, szNew); + return SQLITE_OK; + } + dropCell(pPage, idx, info.nSize, &rc); + if( rc ) goto end_insert; + }else if( loc<0 && pPage->nCell>0 ){ + assert( pPage->leaf ); + idx = ++pCur->ix; + pCur->curFlags &= ~BTCF_ValidNKey; + }else{ + assert( pPage->leaf ); + } + insertCell(pPage, idx, newCell, szNew, 0, 0, &rc); + assert( pPage->nOverflow==0 || rc==SQLITE_OK ); + assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); + + /* If no error has occurred and pPage has an overflow cell, call balance() + ** to redistribute the cells within the tree. Since balance() may move + ** the cursor, zero the BtCursor.info.nSize and BTCF_ValidNKey + ** variables. + ** + ** Previous versions of SQLite called moveToRoot() to move the cursor + ** back to the root page as balance() used to invalidate the contents + ** of BtCursor.apPage[] and BtCursor.aiIdx[]. Instead of doing that, + ** set the cursor state to "invalid". This makes common insert operations + ** slightly faster. + ** + ** There is a subtle but important optimization here too. When inserting + ** multiple records into an intkey b-tree using a single cursor (as can + ** happen while processing an "INSERT INTO ... SELECT" statement), it + ** is advantageous to leave the cursor pointing to the last entry in + ** the b-tree if possible. If the cursor is left pointing to the last + ** entry in the table, and the next row inserted has an integer key + ** larger than the largest existing key, it is possible to insert the + ** row without seeking the cursor. This can be a big performance boost. + */ + pCur->info.nSize = 0; + if( pPage->nOverflow ){ + assert( rc==SQLITE_OK ); + pCur->curFlags &= ~(BTCF_ValidNKey); + rc = balance(pCur); + + /* Must make sure nOverflow is reset to zero even if the balance() + ** fails. Internal data structure corruption will result otherwise. + ** Also, set the cursor state to invalid. This stops saveCursorPosition() + ** from trying to save the current position of the cursor. */ + pCur->pPage->nOverflow = 0; + pCur->eState = CURSOR_INVALID; + if( (flags & BTREE_SAVEPOSITION) && rc==SQLITE_OK ){ + btreeReleaseAllCursorPages(pCur); + if( pCur->pKeyInfo ){ + assert( pCur->pKey==0 ); + pCur->pKey = sqlite3Malloc( pX->nKey ); + if( pCur->pKey==0 ){ + rc = SQLITE_NOMEM; + }else{ + memcpy(pCur->pKey, pX->pKey, pX->nKey); + } + } + pCur->eState = CURSOR_REQUIRESEEK; + pCur->nKey = pX->nKey; + } + } + assert( pCur->iPage<0 || pCur->pPage->nOverflow==0 ); + +end_insert: + return rc; +} + +/* +** This function is used as part of copying the current row from cursor +** pSrc into cursor pDest. If the cursors are open on intkey tables, then +** parameter iKey is used as the rowid value when the record is copied +** into pDest. Otherwise, the record is copied verbatim. +** +** This function does not actually write the new value to cursor pDest. +** Instead, it creates and populates any required overflow pages and +** writes the data for the new cell into the BtShared.pTmpSpace buffer +** for the destination database. The size of the cell, in bytes, is left +** in BtShared.nPreformatSize. The caller completes the insertion by +** calling sqlite3BtreeInsert() with the BTREE_PREFORMAT flag specified. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 iKey){ + int rc = SQLITE_OK; + BtShared *pBt = pDest->pBt; + u8 *aOut = pBt->pTmpSpace; /* Pointer to next output buffer */ + const u8 *aIn; /* Pointer to next input buffer */ + u32 nIn; /* Size of input buffer aIn[] */ + u32 nRem; /* Bytes of data still to copy */ + + getCellInfo(pSrc); + if( pSrc->info.nPayload<0x80 ){ + *(aOut++) = pSrc->info.nPayload; + }else{ + aOut += sqlite3PutVarint(aOut, pSrc->info.nPayload); + } + if( pDest->pKeyInfo==0 ) aOut += putVarint(aOut, iKey); + nIn = pSrc->info.nLocal; + aIn = pSrc->info.pPayload; + if( aIn+nIn>pSrc->pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } + nRem = pSrc->info.nPayload; + if( nIn==nRem && nInpPage->maxLocal ){ + memcpy(aOut, aIn, nIn); + pBt->nPreformatSize = nIn + (aOut - pBt->pTmpSpace); + }else{ + Pager *pSrcPager = pSrc->pBt->pPager; + u8 *pPgnoOut = 0; + Pgno ovflIn = 0; + DbPage *pPageIn = 0; + MemPage *pPageOut = 0; + u32 nOut; /* Size of output buffer aOut[] */ + + nOut = btreePayloadToLocal(pDest->pPage, pSrc->info.nPayload); + pBt->nPreformatSize = nOut + (aOut - pBt->pTmpSpace); + if( nOutinfo.nPayload ){ + pPgnoOut = &aOut[nOut]; + pBt->nPreformatSize += 4; + } + + if( nRem>nIn ){ + if( aIn+nIn+4>pSrc->pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } + ovflIn = get4byte(&pSrc->info.pPayload[nIn]); + } + + do { + nRem -= nOut; + do{ + assert( nOut>0 ); + if( nIn>0 ){ + int nCopy = MIN(nOut, nIn); + memcpy(aOut, aIn, nCopy); + nOut -= nCopy; + nIn -= nCopy; + aOut += nCopy; + aIn += nCopy; + } + if( nOut>0 ){ + sqlite3PagerUnref(pPageIn); + pPageIn = 0; + rc = sqlite3PagerGet(pSrcPager, ovflIn, &pPageIn, PAGER_GET_READONLY); + if( rc==SQLITE_OK ){ + aIn = (const u8*)sqlite3PagerGetData(pPageIn); + ovflIn = get4byte(aIn); + aIn += 4; + nIn = pSrc->pBt->usableSize - 4; + } + } + }while( rc==SQLITE_OK && nOut>0 ); + + if( rc==SQLITE_OK && nRem>0 && ALWAYS(pPgnoOut) ){ + Pgno pgnoNew; + MemPage *pNew = 0; + rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); + put4byte(pPgnoOut, pgnoNew); + if( ISAUTOVACUUM && pPageOut ){ + ptrmapPut(pBt, pgnoNew, PTRMAP_OVERFLOW2, pPageOut->pgno, &rc); + } + releasePage(pPageOut); + pPageOut = pNew; + if( pPageOut ){ + pPgnoOut = pPageOut->aData; + put4byte(pPgnoOut, 0); + aOut = &pPgnoOut[4]; + nOut = MIN(pBt->usableSize - 4, nRem); + } + } + }while( nRem>0 && rc==SQLITE_OK ); + + releasePage(pPageOut); + sqlite3PagerUnref(pPageIn); + } + + return rc; +} + +/* +** Delete the entry that the cursor is pointing to. +** +** If the BTREE_SAVEPOSITION bit of the flags parameter is zero, then +** the cursor is left pointing at an arbitrary location after the delete. +** But if that bit is set, then the cursor is left in a state such that +** the next call to BtreeNext() or BtreePrev() moves it to the same row +** as it would have been on if the call to BtreeDelete() had been omitted. +** +** The BTREE_AUXDELETE bit of flags indicates that is one of several deletes +** associated with a single table entry and its indexes. Only one of those +** deletes is considered the "primary" delete. The primary delete occurs +** on a cursor that is not a BTREE_FORDELETE cursor. All but one delete +** operation on non-FORDELETE cursors is tagged with the AUXDELETE flag. +** The BTREE_AUXDELETE bit is a hint that is not used by this implementation, +** but which might be used by alternative storage engines. +*/ +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ + Btree *p = pCur->pBtree; + BtShared *pBt = p->pBt; + int rc; /* Return code */ + MemPage *pPage; /* Page to delete cell from */ + unsigned char *pCell; /* Pointer to cell to delete */ + int iCellIdx; /* Index of cell to delete */ + int iCellDepth; /* Depth of node containing pCell */ + CellInfo info; /* Size of the cell being deleted */ + u8 bPreserve; /* Keep cursor valid. 2 for CURSOR_SKIPNEXT */ + + assert( cursorOwnsBtShared(pCur) ); + assert( pBt->inTransaction==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + assert( pCur->curFlags & BTCF_WriteFlag ); + assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); + assert( !hasReadConflicts(p, pCur->pgnoRoot) ); + assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); + if( pCur->eState!=CURSOR_VALID ){ + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + rc = btreeRestoreCursorPosition(pCur); + assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID ); + if( rc || pCur->eState!=CURSOR_VALID ) return rc; + }else{ + return SQLITE_CORRUPT_BKPT; + } + } + assert( pCur->eState==CURSOR_VALID ); + + iCellDepth = pCur->iPage; + iCellIdx = pCur->ix; + pPage = pCur->pPage; + if( pPage->nCell<=iCellIdx ){ + return SQLITE_CORRUPT_BKPT; + } + pCell = findCell(pPage, iCellIdx); + if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){ + return SQLITE_CORRUPT_BKPT; + } + + /* If the BTREE_SAVEPOSITION bit is on, then the cursor position must + ** be preserved following this delete operation. If the current delete + ** will cause a b-tree rebalance, then this is done by saving the cursor + ** key and leaving the cursor in CURSOR_REQUIRESEEK state before + ** returning. + ** + ** If the current delete will not cause a rebalance, then the cursor + ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately + ** before or after the deleted entry. + ** + ** The bPreserve value records which path is required: + ** + ** bPreserve==0 Not necessary to save the cursor position + ** bPreserve==1 Use CURSOR_REQUIRESEEK to save the cursor position + ** bPreserve==2 Cursor won't move. Set CURSOR_SKIPNEXT. + */ + bPreserve = (flags & BTREE_SAVEPOSITION)!=0; + if( bPreserve ){ + if( !pPage->leaf + || (pPage->nFree+pPage->xCellSize(pPage,pCell)+2) > + (int)(pBt->usableSize*2/3) + || pPage->nCell==1 /* See dbfuzz001.test for a test case */ + ){ + /* A b-tree rebalance will be required after deleting this entry. + ** Save the cursor key. */ + rc = saveCursorKey(pCur); + if( rc ) return rc; + }else{ + bPreserve = 2; + } + } + + /* If the page containing the entry to delete is not a leaf page, move + ** the cursor to the largest entry in the tree that is smaller than + ** the entry being deleted. This cell will replace the cell being deleted + ** from the internal node. The 'previous' entry is used for this instead + ** of the 'next' entry, as the previous entry is always a part of the + ** sub-tree headed by the child page of the cell being deleted. This makes + ** balancing the tree following the delete operation easier. */ + if( !pPage->leaf ){ + rc = sqlite3BtreePrevious(pCur, 0); + assert( rc!=SQLITE_DONE ); + if( rc ) return rc; + } + + /* Save the positions of any other cursors open on this table before + ** making any modifications. */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + } + + /* If this is a delete operation to remove a row from a table b-tree, + ** invalidate any incrblob cursors open on the row being deleted. */ + if( pCur->pKeyInfo==0 && p->hasIncrblobCur ){ + invalidateIncrblobCursors(p, pCur->pgnoRoot, pCur->info.nKey, 0); + } + + /* Make the page containing the entry to be deleted writable. Then free any + ** overflow pages associated with the entry and finally remove the cell + ** itself from within the page. */ + rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + BTREE_CLEAR_CELL(rc, pPage, pCell, info); + dropCell(pPage, iCellIdx, info.nSize, &rc); + if( rc ) return rc; + + /* If the cell deleted was not located on a leaf page, then the cursor + ** is currently pointing to the largest entry in the sub-tree headed + ** by the child-page of the cell that was just deleted from an internal + ** node. The cell from the leaf node needs to be moved to the internal + ** node to replace the deleted cell. */ + if( !pPage->leaf ){ + MemPage *pLeaf = pCur->pPage; + int nCell; + Pgno n; + unsigned char *pTmp; + + if( pLeaf->nFree<0 ){ + rc = btreeComputeFreeSpace(pLeaf); + if( rc ) return rc; + } + if( iCellDepthiPage-1 ){ + n = pCur->apPage[iCellDepth+1]->pgno; + }else{ + n = pCur->pPage->pgno; + } + pCell = findCell(pLeaf, pLeaf->nCell-1); + if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_BKPT; + nCell = pLeaf->xCellSize(pLeaf, pCell); + assert( MX_CELL_SIZE(pBt) >= nCell ); + pTmp = pBt->pTmpSpace; + assert( pTmp!=0 ); + rc = sqlite3PagerWrite(pLeaf->pDbPage); + if( rc==SQLITE_OK ){ + insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); + } + dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc); + if( rc ) return rc; + } + + /* Balance the tree. If the entry deleted was located on a leaf page, + ** then the cursor still points to that page. In this case the first + ** call to balance() repairs the tree, and the if(...) condition is + ** never true. + ** + ** Otherwise, if the entry deleted was on an internal node page, then + ** pCur is pointing to the leaf page from which a cell was removed to + ** replace the cell deleted from the internal node. This is slightly + ** tricky as the leaf node may be underfull, and the internal node may + ** be either under or overfull. In this case run the balancing algorithm + ** on the leaf node first. If the balance proceeds far enough up the + ** tree that we can be sure that any problem in the internal node has + ** been corrected, so be it. Otherwise, after balancing the leaf node, + ** walk the cursor up the tree to the internal node and balance it as + ** well. */ + assert( pCur->pPage->nOverflow==0 ); + assert( pCur->pPage->nFree>=0 ); + if( pCur->pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + /* Optimization: If the free space is less than 2/3rds of the page, + ** then balance() will always be a no-op. No need to invoke it. */ + rc = SQLITE_OK; + }else{ + rc = balance(pCur); + } + if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ + releasePageNotNull(pCur->pPage); + pCur->iPage--; + while( pCur->iPage>iCellDepth ){ + releasePage(pCur->apPage[pCur->iPage--]); + } + pCur->pPage = pCur->apPage[pCur->iPage]; + rc = balance(pCur); + } + + if( rc==SQLITE_OK ){ + if( bPreserve>1 ){ + assert( (pCur->iPage==iCellDepth || CORRUPT_DB) ); + assert( pPage==pCur->pPage || CORRUPT_DB ); + assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); + pCur->eState = CURSOR_SKIPNEXT; + if( iCellIdx>=pPage->nCell ){ + pCur->skipNext = -1; + pCur->ix = pPage->nCell-1; + }else{ + pCur->skipNext = 1; + } + }else{ + rc = moveToRoot(pCur); + if( bPreserve ){ + btreeReleaseAllCursorPages(pCur); + pCur->eState = CURSOR_REQUIRESEEK; + } + if( rc==SQLITE_EMPTY ) rc = SQLITE_OK; + } + } + return rc; +} + +/* +** Create a new BTree table. Write into *piTable the page +** number for the root page of the new table. +** +** The type of type is determined by the flags parameter. Only the +** following values of flags are currently in use. Other values for +** flags might not work: +** +** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys +** BTREE_ZERODATA Used for SQL indices +*/ +static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ + BtShared *pBt = p->pBt; + MemPage *pRoot; + Pgno pgnoRoot; + int rc; + int ptfFlags; /* Page-type flage for the root page of new table */ + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( pBt->inTransaction==TRANS_WRITE ); + assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); + +#ifdef SQLITE_OMIT_AUTOVACUUM + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ){ + return rc; + } +#else + if( pBt->autoVacuum ){ + Pgno pgnoMove; /* Move a page here to make room for the root-page */ + MemPage *pPageMove; /* The page to move to. */ + + /* Creating a new table may probably require moving an existing database + ** to make room for the new tables root page. In case this page turns + ** out to be an overflow page, delete all overflow page-map caches + ** held by open cursors. + */ + invalidateAllOverflowCache(pBt); + + /* Read the value of meta[3] from the database to determine where the + ** root page of the new table should go. meta[3] is the largest root-page + ** created so far, so the new root-page is (meta[3]+1). + */ + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot); + if( pgnoRoot>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } + pgnoRoot++; + + /* The new root-page may not be allocated on a pointer-map page, or the + ** PENDING_BYTE page. + */ + while( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) || + pgnoRoot==PENDING_BYTE_PAGE(pBt) ){ + pgnoRoot++; + } + assert( pgnoRoot>=3 ); + + /* Allocate a page. The page that currently resides at pgnoRoot will + ** be moved to the allocated page (unless the allocated page happens + ** to reside at pgnoRoot). + */ + rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, BTALLOC_EXACT); + if( rc!=SQLITE_OK ){ + return rc; + } + + if( pgnoMove!=pgnoRoot ){ + /* pgnoRoot is the page that will be used for the root-page of + ** the new table (assuming an error did not occur). But we were + ** allocated pgnoMove. If required (i.e. if it was not allocated + ** by extending the file), the current page at position pgnoMove + ** is already journaled. + */ + u8 eType = 0; + Pgno iPtrPage = 0; + + /* Save the positions of any open cursors. This is required in + ** case they are holding a reference to an xFetch reference + ** corresponding to page pgnoRoot. */ + rc = saveAllCursors(pBt, 0, 0); + releasePage(pPageMove); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Move the page currently at pgnoRoot to pgnoMove. */ + rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); + if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ + rc = SQLITE_CORRUPT_BKPT; + } + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + assert( eType!=PTRMAP_ROOTPAGE ); + assert( eType!=PTRMAP_FREEPAGE ); + rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove, 0); + releasePage(pRoot); + + /* Obtain the page at pgnoRoot */ + if( rc!=SQLITE_OK ){ + return rc; + } + rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = sqlite3PagerWrite(pRoot->pDbPage); + if( rc!=SQLITE_OK ){ + releasePage(pRoot); + return rc; + } + }else{ + pRoot = pPageMove; + } + + /* Update the pointer-map and meta-data with the new root-page number. */ + ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc); + if( rc ){ + releasePage(pRoot); + return rc; + } + + /* When the new root page was allocated, page 1 was made writable in + ** order either to increase the database filesize, or to decrement the + ** freelist count. Hence, the sqlite3BtreeUpdateMeta() call cannot fail. + */ + assert( sqlite3PagerIswriteable(pBt->pPage1->pDbPage) ); + rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot); + if( NEVER(rc) ){ + releasePage(pRoot); + return rc; + } + + }else{ + rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); + if( rc ) return rc; + } +#endif + assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); + if( createTabFlags & BTREE_INTKEY ){ + ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF; + }else{ + ptfFlags = PTF_ZERODATA | PTF_LEAF; + } + zeroPage(pRoot, ptfFlags); + sqlite3PagerUnref(pRoot->pDbPage); + assert( (pBt->openFlags & BTREE_SINGLE)==0 || pgnoRoot==2 ); + *piTable = pgnoRoot; + return SQLITE_OK; +} +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, Pgno *piTable, int flags){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCreateTable(p, piTable, flags); + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Erase the given database page and all its children. Return +** the page to the freelist. +*/ +static int clearDatabasePage( + BtShared *pBt, /* The BTree that contains the table */ + Pgno pgno, /* Page number to clear */ + int freePageFlag, /* Deallocate page if true */ + i64 *pnChange /* Add number of Cells freed to this counter */ +){ + MemPage *pPage; + int rc; + unsigned char *pCell; + int i; + int hdr; + CellInfo info; + + assert( sqlite3_mutex_held(pBt->mutex) ); + if( pgno>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } + rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); + if( rc ) return rc; + if( (pBt->openFlags & BTREE_SINGLE)==0 + && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1)) + ){ + rc = SQLITE_CORRUPT_BKPT; + goto cleardatabasepage_out; + } + hdr = pPage->hdrOffset; + for(i=0; inCell; i++){ + pCell = findCell(pPage, i); + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); + if( rc ) goto cleardatabasepage_out; + } + BTREE_CLEAR_CELL(rc, pPage, pCell, info); + if( rc ) goto cleardatabasepage_out; + } + if( !pPage->leaf ){ + rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); + if( rc ) goto cleardatabasepage_out; + if( pPage->intKey ) pnChange = 0; + } + if( pnChange ){ + testcase( !pPage->intKey ); + *pnChange += pPage->nCell; + } + if( freePageFlag ){ + freePage(pPage, &rc); + }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ + zeroPage(pPage, pPage->aData[hdr] | PTF_LEAF); + } + +cleardatabasepage_out: + releasePage(pPage); + return rc; +} + +/* +** Delete all information from a single table in the database. iTable is +** the page number of the root of the table. After this routine returns, +** the root page is empty, but still exists. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** read cursors on the table. Open write cursors are moved to the +** root of the table. +** +** If pnChange is not NULL, then the integer value pointed to by pnChange +** is incremented by the number of entries in the table. +*/ +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, i64 *pnChange){ + int rc; + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + + rc = saveAllCursors(pBt, (Pgno)iTable, 0); + + if( SQLITE_OK==rc ){ + /* Invalidate all incrblob cursors open on table iTable (assuming iTable + ** is the root of a table b-tree - if it is not, the following call is + ** a no-op). */ + if( p->hasIncrblobCur ){ + invalidateIncrblobCursors(p, (Pgno)iTable, 0, 1); + } + rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange); + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** Delete all information from the single table that pCur is open on. +** +** This routine only work for pCur on an ephemeral table. +*/ +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor *pCur){ + return sqlite3BtreeClearTable(pCur->pBtree, pCur->pgnoRoot, 0); +} + +/* +** Erase all information in a table and add the root of the table to +** the freelist. Except, the root of the principle table (the one on +** page 1) is never added to the freelist. +** +** This routine will fail with SQLITE_LOCKED if there are any open +** cursors on the table. +** +** If AUTOVACUUM is enabled and the page at iTable is not the last +** root page in the database file, then the last root page +** in the database file is moved into the slot formerly occupied by +** iTable and that last slot formerly occupied by the last root page +** is added to the freelist instead of iTable. In this say, all +** root pages are kept at the beginning of the database file, which +** is necessary for AUTOVACUUM to work right. *piMoved is set to the +** page number that used to be the last root page in the file before +** the move. If no page gets moved, *piMoved is set to 0. +** The last root page is recorded in meta[3] and the value of +** meta[3] is updated by this procedure. +*/ +static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ + int rc; + MemPage *pPage = 0; + BtShared *pBt = p->pBt; + + assert( sqlite3BtreeHoldsMutex(p) ); + assert( p->inTrans==TRANS_WRITE ); + assert( iTable>=2 ); + if( iTable>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } + + rc = sqlite3BtreeClearTable(p, iTable, 0); + if( rc ) return rc; + rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); + if( NEVER(rc) ){ + releasePage(pPage); + return rc; + } + + *piMoved = 0; + +#ifdef SQLITE_OMIT_AUTOVACUUM + freePage(pPage, &rc); + releasePage(pPage); +#else + if( pBt->autoVacuum ){ + Pgno maxRootPgno; + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno); + + if( iTable==maxRootPgno ){ + /* If the table being dropped is the table with the largest root-page + ** number in the database, put the root page on the free list. + */ + freePage(pPage, &rc); + releasePage(pPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + /* The table being dropped does not have the largest root-page + ** number in the database. So move the page that does into the + ** gap left by the deleted root-page. + */ + MemPage *pMove; + releasePage(pPage); + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + pMove = 0; + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + freePage(pMove, &rc); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + *piMoved = maxRootPgno; + } + + /* Set the new 'max-root-page' value in the database header. This + ** is the old value less one, less one more if that happens to + ** be a root-page number, less one again if that is the + ** PENDING_BYTE_PAGE. + */ + maxRootPgno--; + while( maxRootPgno==PENDING_BYTE_PAGE(pBt) + || PTRMAP_ISPAGE(pBt, maxRootPgno) ){ + maxRootPgno--; + } + assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); + + rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); + }else{ + freePage(pPage, &rc); + releasePage(pPage); + } +#endif + return rc; +} +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeDropTable(p, iTable, piMoved); + sqlite3BtreeLeave(p); + return rc; +} + + +/* +** This function may only be called if the b-tree connection already +** has a read or write transaction open on the database. +** +** Read the meta-information out of a database file. Meta[0] +** is the number of free pages currently in the database. Meta[1] +** through meta[15] are available for use by higher layers. Meta[0] +** is read-only, the others are read/write. +** +** The schema layer numbers meta values differently. At the schema +** layer (and the SetCookie and ReadCookie opcodes) the number of +** free pages is not visible. So Cookie[0] is the same as Meta[1]. +** +** This routine treats Meta[BTREE_DATA_VERSION] as a special case. Instead +** of reading the value out of the header, it instead loads the "DataVersion" +** from the pager. The BTREE_DATA_VERSION value is not actually stored in the +** database file. It is a number computed by the pager. But its access +** pattern is the same as header meta values, and so it is convenient to +** read it from this routine. +*/ +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ + BtShared *pBt = p->pBt; + + sqlite3BtreeEnter(p); + assert( p->inTrans>TRANS_NONE ); + assert( SQLITE_OK==querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK) ); + assert( pBt->pPage1 ); + assert( idx>=0 && idx<=15 ); + + if( idx==BTREE_DATA_VERSION ){ + *pMeta = sqlite3PagerDataVersion(pBt->pPager) + p->iBDataVersion; + }else{ + *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]); + } + + /* If auto-vacuum is disabled in this build and this is an auto-vacuum + ** database, mark the database as read-only. */ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ){ + pBt->btsFlags |= BTS_READ_ONLY; + } +#endif + + sqlite3BtreeLeave(p); +} + +/* +** Write meta-information back into the database. Meta[0] is +** read-only and may not be written. +*/ +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ + BtShared *pBt = p->pBt; + unsigned char *pP1; + int rc; + assert( idx>=1 && idx<=15 ); + sqlite3BtreeEnter(p); + assert( p->inTrans==TRANS_WRITE ); + assert( pBt->pPage1!=0 ); + pP1 = pBt->pPage1->aData; + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + put4byte(&pP1[36 + idx*4], iMeta); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( idx==BTREE_INCR_VACUUM ){ + assert( pBt->autoVacuum || iMeta==0 ); + assert( iMeta==0 || iMeta==1 ); + pBt->incrVacuum = (u8)iMeta; + } +#endif + } + sqlite3BtreeLeave(p); + return rc; +} + +/* +** The first argument, pCur, is a cursor opened on some b-tree. Count the +** number of entries in the b-tree and write the result to *pnEntry. +** +** SQLITE_OK is returned if the operation is successfully executed. +** Otherwise, if an error is encountered (i.e. an IO error or database +** corruption) an SQLite error code is returned. +*/ +SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ + i64 nEntry = 0; /* Value to return in *pnEntry */ + int rc; /* Return code */ + + rc = moveToRoot(pCur); + if( rc==SQLITE_EMPTY ){ + *pnEntry = 0; + return SQLITE_OK; + } + + /* Unless an error occurs, the following loop runs one iteration for each + ** page in the B-Tree structure (not including overflow pages). + */ + while( rc==SQLITE_OK && !AtomicLoad(&db->u1.isInterrupted) ){ + int iIdx; /* Index of child node in parent */ + MemPage *pPage; /* Current page of the b-tree */ + + /* If this is a leaf page or the tree is not an int-key tree, then + ** this page contains countable entries. Increment the entry counter + ** accordingly. + */ + pPage = pCur->pPage; + if( pPage->leaf || !pPage->intKey ){ + nEntry += pPage->nCell; + } + + /* pPage is a leaf node. This loop navigates the cursor so that it + ** points to the first interior cell that it points to the parent of + ** the next page in the tree that has not yet been visited. The + ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell + ** of the page, or to the number of cells in the page if the next page + ** to visit is the right-child of its parent. + ** + ** If all pages in the tree have been visited, return SQLITE_OK to the + ** caller. + */ + if( pPage->leaf ){ + do { + if( pCur->iPage==0 ){ + /* All pages of the b-tree have been visited. Return successfully. */ + *pnEntry = nEntry; + return moveToRoot(pCur); + } + moveToParent(pCur); + }while ( pCur->ix>=pCur->pPage->nCell ); + + pCur->ix++; + pPage = pCur->pPage; + } + + /* Descend to the child node of the cell that the cursor currently + ** points at. This is the right-child if (iIdx==pPage->nCell). + */ + iIdx = pCur->ix; + if( iIdx==pPage->nCell ){ + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); + }else{ + rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); + } + } + + /* An error has occurred. Return an error code. */ + return rc; +} + +/* +** Return the pager associated with a BTree. This routine is used for +** testing and debugging only. +*/ +SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){ + return p->pBt->pPager; +} + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** Append a message to the error message string. +*/ +static void checkAppendMsg( + IntegrityCk *pCheck, + const char *zFormat, + ... +){ + va_list ap; + if( !pCheck->mxErr ) return; + pCheck->mxErr--; + pCheck->nErr++; + va_start(ap, zFormat); + if( pCheck->errMsg.nChar ){ + sqlite3_str_append(&pCheck->errMsg, "\n", 1); + } + if( pCheck->zPfx ){ + sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2); + } + sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap); + va_end(ap); + if( pCheck->errMsg.accError==SQLITE_NOMEM ){ + pCheck->bOomFault = 1; + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + +/* +** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that +** corresponds to page iPg is already set. +*/ +static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){ + assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07))); +} + +/* +** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg. +*/ +static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){ + assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07)); +} + + +/* +** Add 1 to the reference count for page iPage. If this is the second +** reference to the page, add an error message to pCheck->zErrMsg. +** Return 1 if there are 2 or more references to the page and 0 if +** if this is the first reference to the page. +** +** Also check that the page number is in bounds. +*/ +static int checkRef(IntegrityCk *pCheck, Pgno iPage){ + if( iPage>pCheck->nPage || iPage==0 ){ + checkAppendMsg(pCheck, "invalid page number %d", iPage); + return 1; + } + if( getPageReferenced(pCheck, iPage) ){ + checkAppendMsg(pCheck, "2nd reference to page %d", iPage); + return 1; + } + if( AtomicLoad(&pCheck->db->u1.isInterrupted) ) return 1; + setPageReferenced(pCheck, iPage); + return 0; +} + +#ifndef SQLITE_OMIT_AUTOVACUUM +/* +** Check that the entry in the pointer-map for page iChild maps to +** page iParent, pointer type ptrType. If not, append an error message +** to pCheck. +*/ +static void checkPtrmap( + IntegrityCk *pCheck, /* Integrity check context */ + Pgno iChild, /* Child page number */ + u8 eType, /* Expected pointer map type */ + Pgno iParent /* Expected pointer map parent page number */ +){ + int rc; + u8 ePtrmapType; + Pgno iPtrmapParent; + + rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->bOomFault = 1; + checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild); + return; + } + + if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ + checkAppendMsg(pCheck, + "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", + iChild, eType, iParent, ePtrmapType, iPtrmapParent); + } +} +#endif + +/* +** Check the integrity of the freelist or of an overflow page list. +** Verify that the number of pages on the list is N. +*/ +static void checkList( + IntegrityCk *pCheck, /* Integrity checking context */ + int isFreeList, /* True for a freelist. False for overflow page list */ + Pgno iPage, /* Page number for first page in the list */ + u32 N /* Expected number of pages in the list */ +){ + int i; + u32 expected = N; + int nErrAtStart = pCheck->nErr; + while( iPage!=0 && pCheck->mxErr ){ + DbPage *pOvflPage; + unsigned char *pOvflData; + if( checkRef(pCheck, iPage) ) break; + N--; + if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ + checkAppendMsg(pCheck, "failed to get page %d", iPage); + break; + } + pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); + if( isFreeList ){ + u32 n = (u32)get4byte(&pOvflData[4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pCheck->pBt->autoVacuum ){ + checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); + } +#endif + if( n>pCheck->pBt->usableSize/4-2 ){ + checkAppendMsg(pCheck, + "freelist leaf count too big on page %d", iPage); + N--; + }else{ + for(i=0; i<(int)n; i++){ + Pgno iFreePage = get4byte(&pOvflData[8+i*4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pCheck->pBt->autoVacuum ){ + checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0); + } +#endif + checkRef(pCheck, iFreePage); + } + N -= n; + } + } +#ifndef SQLITE_OMIT_AUTOVACUUM + else{ + /* If this database supports auto-vacuum and iPage is not the last + ** page in this overflow list, check that the pointer-map entry for + ** the following page matches iPage. + */ + if( pCheck->pBt->autoVacuum && N>0 ){ + i = get4byte(pOvflData); + checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage); + } + } +#endif + iPage = get4byte(pOvflData); + sqlite3PagerUnref(pOvflPage); + } + if( N && nErrAtStart==pCheck->nErr ){ + checkAppendMsg(pCheck, + "%s is %d but should be %d", + isFreeList ? "size" : "overflow list length", + expected-N, expected); + } +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** An implementation of a min-heap. +** +** aHeap[0] is the number of elements on the heap. aHeap[1] is the +** root element. The daughter nodes of aHeap[N] are aHeap[N*2] +** and aHeap[N*2+1]. +** +** The heap property is this: Every node is less than or equal to both +** of its daughter nodes. A consequence of the heap property is that the +** root node aHeap[1] is always the minimum value currently in the heap. +** +** The btreeHeapInsert() routine inserts an unsigned 32-bit number onto +** the heap, preserving the heap property. The btreeHeapPull() routine +** removes the root element from the heap (the minimum value in the heap) +** and then moves other nodes around as necessary to preserve the heap +** property. +** +** This heap is used for cell overlap and coverage testing. Each u32 +** entry represents the span of a cell or freeblock on a btree page. +** The upper 16 bits are the index of the first byte of a range and the +** lower 16 bits are the index of the last byte of that range. +*/ +static void btreeHeapInsert(u32 *aHeap, u32 x){ + u32 j, i = ++aHeap[0]; + aHeap[i] = x; + while( (j = i/2)>0 && aHeap[j]>aHeap[i] ){ + x = aHeap[j]; + aHeap[j] = aHeap[i]; + aHeap[i] = x; + i = j; + } +} +static int btreeHeapPull(u32 *aHeap, u32 *pOut){ + u32 j, i, x; + if( (x = aHeap[0])==0 ) return 0; + *pOut = aHeap[1]; + aHeap[1] = aHeap[x]; + aHeap[x] = 0xffffffff; + aHeap[0]--; + i = 1; + while( (j = i*2)<=aHeap[0] ){ + if( aHeap[j]>aHeap[j+1] ) j++; + if( aHeap[i]zPfx; + int saved_v1 = pCheck->v1; + int saved_v2 = pCheck->v2; + u8 savedIsInit = 0; + + /* Check that the page exists + */ + pBt = pCheck->pBt; + usableSize = pBt->usableSize; + if( iPage==0 ) return 0; + if( checkRef(pCheck, iPage) ) return 0; + pCheck->zPfx = "Page %u: "; + pCheck->v1 = iPage; + if( (rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0 ){ + checkAppendMsg(pCheck, + "unable to get the page. error code=%d", rc); + goto end_of_check; + } + + /* Clear MemPage.isInit to make sure the corruption detection code in + ** btreeInitPage() is executed. */ + savedIsInit = pPage->isInit; + pPage->isInit = 0; + if( (rc = btreeInitPage(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */ + checkAppendMsg(pCheck, + "btreeInitPage() returns error code %d", rc); + goto end_of_check; + } + if( (rc = btreeComputeFreeSpace(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); + checkAppendMsg(pCheck, "free space corruption", rc); + goto end_of_check; + } + data = pPage->aData; + hdr = pPage->hdrOffset; + + /* Set up for cell analysis */ + pCheck->zPfx = "On tree page %u cell %d: "; + contentOffset = get2byteNotZero(&data[hdr+5]); + assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ + + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + nCell = get2byte(&data[hdr+3]); + assert( pPage->nCell==nCell ); + + /* EVIDENCE-OF: R-23882-45353 The cell pointer array of a b-tree page + ** immediately follows the b-tree page header. */ + cellStart = hdr + 12 - 4*pPage->leaf; + assert( pPage->aCellIdx==&data[cellStart] ); + pCellIdx = &data[cellStart + 2*(nCell-1)]; + + if( !pPage->leaf ){ + /* Analyze the right-child page of internal pages */ + pgno = get4byte(&data[hdr+8]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + pCheck->zPfx = "On page %u at right child: "; + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + depth = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + }else{ + /* For leaf pages, the coverage check will occur in the same loop + ** as the other cell checks, so initialize the heap. */ + heap = pCheck->heap; + heap[0] = 0; + } + + /* EVIDENCE-OF: R-02776-14802 The cell pointer array consists of K 2-byte + ** integer offsets to the cell contents. */ + for(i=nCell-1; i>=0 && pCheck->mxErr; i--){ + CellInfo info; + + /* Check cell size */ + pCheck->v2 = i; + assert( pCellIdx==&data[cellStart + i*2] ); + pc = get2byteAligned(pCellIdx); + pCellIdx -= 2; + if( pcusableSize-4 ){ + checkAppendMsg(pCheck, "Offset %d out of range %d..%d", + pc, contentOffset, usableSize-4); + doCoverageCheck = 0; + continue; + } + pCell = &data[pc]; + pPage->xParseCell(pPage, pCell, &info); + if( pc+info.nSize>usableSize ){ + checkAppendMsg(pCheck, "Extends off end of page"); + doCoverageCheck = 0; + continue; + } + + /* Check for integer primary key out of range */ + if( pPage->intKey ){ + if( keyCanBeEqual ? (info.nKey > maxKey) : (info.nKey >= maxKey) ){ + checkAppendMsg(pCheck, "Rowid %lld out of order", info.nKey); + } + maxKey = info.nKey; + keyCanBeEqual = 0; /* Only the first key on the page may ==maxKey */ + } + + /* Check the content overflow list */ + if( info.nPayload>info.nLocal ){ + u32 nPage; /* Number of pages on the overflow chain */ + Pgno pgnoOvfl; /* First page of the overflow chain */ + assert( pc + info.nSize - 4 <= usableSize ); + nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); + pgnoOvfl = get4byte(&pCell[info.nSize - 4]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage); + } +#endif + checkList(pCheck, 0, pgnoOvfl, nPage); + } + + if( !pPage->leaf ){ + /* Check sanity of left child page for internal pages */ + pgno = get4byte(pCell); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + d2 = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + if( d2!=depth ){ + checkAppendMsg(pCheck, "Child page depth differs"); + depth = d2; + } + }else{ + /* Populate the coverage-checking heap for leaf pages */ + btreeHeapInsert(heap, (pc<<16)|(pc+info.nSize-1)); + } + } + *piMinKey = maxKey; + + /* Check for complete coverage of the page + */ + pCheck->zPfx = 0; + if( doCoverageCheck && pCheck->mxErr>0 ){ + /* For leaf pages, the min-heap has already been initialized and the + ** cells have already been inserted. But for internal pages, that has + ** not yet been done, so do it now */ + if( !pPage->leaf ){ + heap = pCheck->heap; + heap[0] = 0; + for(i=nCell-1; i>=0; i--){ + u32 size; + pc = get2byteAligned(&data[cellStart+i*2]); + size = pPage->xCellSize(pPage, &data[pc]); + btreeHeapInsert(heap, (pc<<16)|(pc+size-1)); + } + } + /* Add the freeblocks to the min-heap + ** + ** EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header + ** is the offset of the first freeblock, or zero if there are no + ** freeblocks on the page. + */ + i = get2byte(&data[hdr+1]); + while( i>0 ){ + int size, j; + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ + size = get2byte(&data[i+2]); + assert( (u32)(i+size)<=usableSize ); /* due to btreeComputeFreeSpace() */ + btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); + /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a + ** big-endian integer which is the offset in the b-tree page of the next + ** freeblock in the chain, or zero if the freeblock is the last on the + ** chain. */ + j = get2byte(&data[i]); + /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of + ** increasing offset. */ + assert( j==0 || j>i+size ); /* Enforced by btreeComputeFreeSpace() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ + i = j; + } + /* Analyze the min-heap looking for overlap between cells and/or + ** freeblocks, and counting the number of untracked bytes in nFrag. + ** + ** Each min-heap entry is of the form: (start_address<<16)|end_address. + ** There is an implied first entry the covers the page header, the cell + ** pointer index, and the gap between the cell pointer index and the start + ** of cell content. + ** + ** The loop below pulls entries from the min-heap in order and compares + ** the start_address against the previous end_address. If there is an + ** overlap, that means bytes are used multiple times. If there is a gap, + ** that gap is added to the fragmentation count. + */ + nFrag = 0; + prev = contentOffset - 1; /* Implied first min-heap entry */ + while( btreeHeapPull(heap,&x) ){ + if( (prev&0xffff)>=(x>>16) ){ + checkAppendMsg(pCheck, + "Multiple uses for byte %u of page %u", x>>16, iPage); + break; + }else{ + nFrag += (x>>16) - (prev&0xffff) - 1; + prev = x; + } + } + nFrag += usableSize - (prev&0xffff) - 1; + /* EVIDENCE-OF: R-43263-13491 The total number of bytes in all fragments + ** is stored in the fifth field of the b-tree page header. + ** EVIDENCE-OF: R-07161-27322 The one-byte integer at offset 7 gives the + ** number of fragmented free bytes within the cell content area. + */ + if( heap[0]==0 && nFrag!=data[hdr+7] ){ + checkAppendMsg(pCheck, + "Fragmentation of %d bytes reported as %d on page %u", + nFrag, data[hdr+7], iPage); + } + } + +end_of_check: + if( !doCoverageCheck ) pPage->isInit = savedIsInit; + releasePage(pPage); + pCheck->zPfx = saved_zPfx; + pCheck->v1 = saved_v1; + pCheck->v2 = saved_v2; + return depth+1; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* +** This routine does a complete check of the given BTree file. aRoot[] is +** an array of pages numbers were each page number is the root page of +** a table. nRoot is the number of entries in aRoot. +** +** A read-only or read-write transaction must be opened before calling +** this function. +** +** Write the number of error seen in *pnErr. Except for some memory +** allocation errors, an error message held in memory obtained from +** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is +** returned. If a memory allocation error occurs, NULL is returned. +** +** If the first entry in aRoot[] is 0, that indicates that the list of +** root pages is incomplete. This is a "partial integrity-check". This +** happens when performing an integrity check on a single table. The +** zero is skipped, of course. But in addition, the freelist checks +** and the checks to make sure every page is referenced are also skipped, +** since obviously it is not possible to know which pages are covered by +** the unverified btrees. Except, if aRoot[1] is 1, then the freelist +** checks are still performed. +*/ +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( + sqlite3 *db, /* Database connection that is running the check */ + Btree *p, /* The btree to be checked */ + Pgno *aRoot, /* An array of root pages numbers for individual trees */ + int nRoot, /* Number of entries in aRoot[] */ + int mxErr, /* Stop reporting errors after this many */ + int *pnErr /* Write number of errors seen to this variable */ +){ + Pgno i; + IntegrityCk sCheck; + BtShared *pBt = p->pBt; + u64 savedDbFlags = pBt->db->flags; + char zErr[100]; + int bPartial = 0; /* True if not checking all btrees */ + int bCkFreelist = 1; /* True to scan the freelist */ + VVA_ONLY( int nRef ); + assert( nRoot>0 ); + + /* aRoot[0]==0 means this is a partial check */ + if( aRoot[0]==0 ){ + assert( nRoot>1 ); + bPartial = 1; + if( aRoot[1]!=1 ) bCkFreelist = 0; + } + + sqlite3BtreeEnter(p); + assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE ); + VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) ); + assert( nRef>=0 ); + sCheck.db = db; + sCheck.pBt = pBt; + sCheck.pPager = pBt->pPager; + sCheck.nPage = btreePagecount(sCheck.pBt); + sCheck.mxErr = mxErr; + sCheck.nErr = 0; + sCheck.bOomFault = 0; + sCheck.zPfx = 0; + sCheck.v1 = 0; + sCheck.v2 = 0; + sCheck.aPgRef = 0; + sCheck.heap = 0; + sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); + sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL; + if( sCheck.nPage==0 ){ + goto integrity_ck_cleanup; + } + + sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1); + if( !sCheck.aPgRef ){ + sCheck.bOomFault = 1; + goto integrity_ck_cleanup; + } + sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize ); + if( sCheck.heap==0 ){ + sCheck.bOomFault = 1; + goto integrity_ck_cleanup; + } + + i = PENDING_BYTE_PAGE(pBt); + if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i); + + /* Check the integrity of the freelist + */ + if( bCkFreelist ){ + sCheck.zPfx = "Main freelist: "; + checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), + get4byte(&pBt->pPage1->aData[36])); + sCheck.zPfx = 0; + } + + /* Check all the tables. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + if( !bPartial ){ + if( pBt->autoVacuum ){ + Pgno mx = 0; + Pgno mxInHdr; + for(i=0; (int)ipPage1->aData[52]); + if( mx!=mxInHdr ){ + checkAppendMsg(&sCheck, + "max rootpage (%d) disagrees with header (%d)", + mx, mxInHdr + ); + } + }else if( get4byte(&pBt->pPage1->aData[64])!=0 ){ + checkAppendMsg(&sCheck, + "incremental_vacuum enabled with a max rootpage of zero" + ); + } + } +#endif + testcase( pBt->db->flags & SQLITE_CellSizeCk ); + pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; + for(i=0; (int)iautoVacuum && aRoot[i]>1 && !bPartial ){ + checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); + } +#endif + checkTreePage(&sCheck, aRoot[i], ¬Used, LARGEST_INT64); + } + pBt->db->flags = savedDbFlags; + + /* Make sure every page in the file is referenced + */ + if( !bPartial ){ + for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ +#ifdef SQLITE_OMIT_AUTOVACUUM + if( getPageReferenced(&sCheck, i)==0 ){ + checkAppendMsg(&sCheck, "Page %d is never used", i); + } +#else + /* If the database supports auto-vacuum, make sure no tables contain + ** references to pointer-map pages. + */ + if( getPageReferenced(&sCheck, i)==0 && + (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, "Page %d is never used", i); + } + if( getPageReferenced(&sCheck, i)!=0 && + (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ + checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i); + } +#endif + } + } + + /* Clean up and report errors. + */ +integrity_ck_cleanup: + sqlite3PageFree(sCheck.heap); + sqlite3_free(sCheck.aPgRef); + if( sCheck.bOomFault ){ + sqlite3_str_reset(&sCheck.errMsg); + sCheck.nErr++; + } + *pnErr = sCheck.nErr; + if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg); + /* Make sure this analysis did not leave any unref() pages. */ + assert( nRef==sqlite3PagerRefcount(pBt->pPager) ); + sqlite3BtreeLeave(p); + return sqlite3StrAccumFinish(&sCheck.errMsg); +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* +** Return the full pathname of the underlying database file. Return +** an empty string if the database is in-memory or a TEMP database. +** +** The pager filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerFilename(p->pBt->pPager, 1); +} + +/* +** Return the pathname of the journal file for this database. The return +** value of this routine is the same regardless of whether the journal file +** has been created or not. +** +** The pager journal filename is invariant as long as the pager is +** open so it is safe to access without the BtShared mutex. +*/ +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *p){ + assert( p->pBt->pPager!=0 ); + return sqlite3PagerJournalname(p->pBt->pPager); +} + +/* +** Return one of SQLITE_TXN_NONE, SQLITE_TXN_READ, or SQLITE_TXN_WRITE +** to describe the current transaction state of Btree p. +*/ +SQLITE_PRIVATE int sqlite3BtreeTxnState(Btree *p){ + assert( p==0 || sqlite3_mutex_held(p->db->mutex) ); + return p ? p->inTrans : 0; +} + +#ifndef SQLITE_OMIT_WAL +/* +** Run a checkpoint on the Btree passed as the first argument. +** +** Return SQLITE_LOCKED if this or any other connection has an open +** transaction on the shared-cache the argument Btree is connected to. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +*/ +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; + if( p ){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( pBt->inTransaction!=TRANS_NONE ){ + rc = SQLITE_LOCKED; + }else{ + rc = sqlite3PagerCheckpoint(pBt->pPager, p->db, eMode, pnLog, pnCkpt); + } + sqlite3BtreeLeave(p); + } + return rc; +} +#endif + +/* +** Return true if there is currently a backup running on Btree p. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){ + assert( p ); + assert( sqlite3_mutex_held(p->db->mutex) ); + return p->nBackup!=0; +} + +/* +** This function returns a pointer to a blob of memory associated with +** a single shared-btree. The memory is used by client code for its own +** purposes (for example, to store a high-level schema associated with +** the shared-btree). The btree layer manages reference counting issues. +** +** The first time this is called on a shared-btree, nBytes bytes of memory +** are allocated, zeroed, and returned to the caller. For each subsequent +** call the nBytes parameter is ignored and a pointer to the same blob +** of memory returned. +** +** If the nBytes parameter is 0 and the blob of memory has not yet been +** allocated, a null pointer is returned. If the blob has already been +** allocated, it is returned as normal. +** +** Just before the shared-btree is closed, the function passed as the +** xFree argument when the memory allocation was made is invoked on the +** blob of allocated memory. The xFree function should not call sqlite3_free() +** on the memory, the btree layer does that. +*/ +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){ + BtShared *pBt = p->pBt; + sqlite3BtreeEnter(p); + if( !pBt->pSchema && nBytes ){ + pBt->pSchema = sqlite3DbMallocZero(0, nBytes); + pBt->xFreeSchema = xFree; + } + sqlite3BtreeLeave(p); + return pBt->pSchema; +} + +/* +** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared +** btree as the argument handle holds an exclusive lock on the +** sqlite_schema table. Otherwise SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){ + int rc; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); + assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE ); + sqlite3BtreeLeave(p); + return rc; +} + + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** Obtain a lock on the table whose root page is iTab. The +** lock is a write lock if isWritelock is true or a read lock +** if it is false. +*/ +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ + int rc = SQLITE_OK; + assert( p->inTrans!=TRANS_NONE ); + if( p->sharable ){ + u8 lockType = READ_LOCK + isWriteLock; + assert( READ_LOCK+1==WRITE_LOCK ); + assert( isWriteLock==0 || isWriteLock==1 ); + + sqlite3BtreeEnter(p); + rc = querySharedCacheTableLock(p, iTab, lockType); + if( rc==SQLITE_OK ){ + rc = setSharedCacheTableLock(p, iTab, lockType); + } + sqlite3BtreeLeave(p); + } + return rc; +} +#endif + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Argument pCsr must be a cursor opened for writing on an +** INTKEY table currently pointing at a valid table entry. +** This function modifies the data stored as part of that entry. +** +** Only the data content may only be modified, it is not possible to +** change the length of the data stored. If this function is called with +** parameters that attempt to write past the end of the existing data, +** no modifications are made and SQLITE_CORRUPT is returned. +*/ +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){ + int rc; + assert( cursorOwnsBtShared(pCsr) ); + assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) ); + assert( pCsr->curFlags & BTCF_Incrblob ); + + rc = restoreCursorPosition(pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + assert( pCsr->eState!=CURSOR_REQUIRESEEK ); + if( pCsr->eState!=CURSOR_VALID ){ + return SQLITE_ABORT; + } + + /* Save the positions of all other cursors open on this table. This is + ** required in case any of them are holding references to an xFetch + ** version of the b-tree page modified by the accessPayload call below. + ** + ** Note that pCsr must be open on a INTKEY table and saveCursorPosition() + ** and hence saveAllCursors() cannot fail on a BTREE_INTKEY table, hence + ** saveAllCursors can only return SQLITE_OK. + */ + VVA_ONLY(rc =) saveAllCursors(pCsr->pBt, pCsr->pgnoRoot, pCsr); + assert( rc==SQLITE_OK ); + + /* Check some assumptions: + ** (a) the cursor is open for writing, + ** (b) there is a read/write transaction open, + ** (c) the connection holds a write-lock on the table (if required), + ** (d) there are no conflicting read-locks, and + ** (e) the cursor points at a valid row of an intKey table. + */ + if( (pCsr->curFlags & BTCF_WriteFlag)==0 ){ + return SQLITE_READONLY; + } + assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0 + && pCsr->pBt->inTransaction==TRANS_WRITE ); + assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) ); + assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) ); + assert( pCsr->pPage->intKey ); + + return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1); +} + +/* +** Mark this cursor as an incremental blob cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ + pCur->curFlags |= BTCF_Incrblob; + pCur->pBtree->hasIncrblobCur = 1; +} +#endif + +/* +** Set both the "read version" (single byte at byte offset 18) and +** "write version" (single byte at byte offset 19) fields in the database +** header to iVersion. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){ + BtShared *pBt = pBtree->pBt; + int rc; /* Return code */ + + assert( iVersion==1 || iVersion==2 ); + + /* If setting the version fields to 1, do not automatically open the + ** WAL connection, even if the version fields are currently set to 2. + */ + pBt->btsFlags &= ~BTS_NO_WAL; + if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL; + + rc = sqlite3BtreeBeginTrans(pBtree, 0, 0); + if( rc==SQLITE_OK ){ + u8 *aData = pBt->pPage1->aData; + if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){ + rc = sqlite3BtreeBeginTrans(pBtree, 2, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); + if( rc==SQLITE_OK ){ + aData[18] = (u8)iVersion; + aData[19] = (u8)iVersion; + } + } + } + } + + pBt->btsFlags &= ~BTS_NO_WAL; + return rc; +} + +/* +** Return true if the cursor has a hint specified. This routine is +** only used from within assert() statements +*/ +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor *pCsr, unsigned int mask){ + return (pCsr->hints & mask)!=0; +} + +/* +** Return true if the given Btree is read-only. +*/ +SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *p){ + return (p->pBt->btsFlags & BTS_READ_ONLY)!=0; +} + +/* +** Return the size of the header added to each page by this module. +*/ +SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** Return true if the Btree passed as the only argument is sharable. +*/ +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ + return p->sharable; +} + +/* +** Return the number of connections to the BtShared object accessed by +** the Btree handle passed as the only argument. For private caches +** this is always 1. For shared caches it may be 1 or greater. +*/ +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ + testcase( p->sharable ); + return p->pBt->nRef; +} +#endif + +/************** End of btree.c ***********************************************/ +/************** Begin file backup.c ******************************************/ +/* +** 2009 January 28 +** +** 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 contains the implementation of the sqlite3_backup_XXX() +** API functions and the related features. +*/ +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ + +/* +** Structure allocated for each backup operation. +*/ +struct sqlite3_backup { + sqlite3* pDestDb; /* Destination database handle */ + Btree *pDest; /* Destination b-tree file */ + u32 iDestSchema; /* Original schema cookie in destination */ + int bDestLocked; /* True once a write-transaction is open on pDest */ + + Pgno iNext; /* Page number of the next source page to copy */ + sqlite3* pSrcDb; /* Source database handle */ + Btree *pSrc; /* Source b-tree file */ + + int rc; /* Backup process error code */ + + /* These two variables are set by every call to backup_step(). They are + ** read by calls to backup_remaining() and backup_pagecount(). + */ + Pgno nRemaining; /* Number of pages left to copy */ + Pgno nPagecount; /* Total number of pages to copy */ + + int isAttached; /* True once backup has been registered with pager */ + sqlite3_backup *pNext; /* Next backup associated with source pager */ +}; + +/* +** THREAD SAFETY NOTES: +** +** Once it has been created using backup_init(), a single sqlite3_backup +** structure may be accessed via two groups of thread-safe entry points: +** +** * Via the sqlite3_backup_XXX() API function backup_step() and +** backup_finish(). Both these functions obtain the source database +** handle mutex and the mutex associated with the source BtShared +** structure, in that order. +** +** * Via the BackupUpdate() and BackupRestart() functions, which are +** invoked by the pager layer to report various state changes in +** the page cache associated with the source database. The mutex +** associated with the source database BtShared structure will always +** be held when either of these functions are invoked. +** +** The other sqlite3_backup_XXX() API functions, backup_remaining() and +** backup_pagecount() are not thread-safe functions. If they are called +** while some other thread is calling backup_step() or backup_finish(), +** the values returned may be invalid. There is no way for a call to +** BackupUpdate() or BackupRestart() to interfere with backup_remaining() +** or backup_pagecount(). +** +** Depending on the SQLite configuration, the database handles and/or +** the Btree objects may have their own mutexes that require locking. +** Non-sharable Btrees (in-memory databases for example), do not have +** associated mutexes. +*/ + +/* +** Return a pointer corresponding to database zDb (i.e. "main", "temp") +** in connection handle pDb. If such a database cannot be found, return +** a NULL pointer and write an error message to pErrorDb. +** +** If the "temp" database is requested, it may need to be opened by this +** function. If an error occurs while doing so, return 0 and write an +** error message to pErrorDb. +*/ +static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ + int i = sqlite3FindDbName(pDb, zDb); + + if( i==1 ){ + Parse sParse; + int rc = 0; + sqlite3ParseObjectInit(&sParse,pDb); + if( sqlite3OpenTempDatabase(&sParse) ){ + sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg); + rc = SQLITE_ERROR; + } + sqlite3DbFree(pErrorDb, sParse.zErrMsg); + sqlite3ParseObjectReset(&sParse); + if( rc ){ + return 0; + } + } + + if( i<0 ){ + sqlite3ErrorWithMsg(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb); + return 0; + } + + return pDb->aDb[i].pBt; +} + +/* +** Attempt to set the page size of the destination to match the page size +** of the source. +*/ +static int setDestPgsz(sqlite3_backup *p){ + int rc; + rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),0,0); + return rc; +} + +/* +** Check that there is no open read-transaction on the b-tree passed as the +** second argument. If there is not, return SQLITE_OK. Otherwise, if there +** is an open read-transaction, return SQLITE_ERROR and leave an error +** message in database handle db. +*/ +static int checkReadTransaction(sqlite3 *db, Btree *p){ + if( sqlite3BtreeTxnState(p)!=SQLITE_TXN_NONE ){ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "destination database is in use"); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +/* +** Create an sqlite3_backup process to copy the contents of zSrcDb from +** connection handle pSrcDb to zDestDb in pDestDb. If successful, return +** a pointer to the new sqlite3_backup object. +** +** If an error occurs, NULL is returned and an error code and error message +** stored in database handle pDestDb. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3* pDestDb, /* Database to write to */ + const char *zDestDb, /* Name of database within pDestDb */ + sqlite3* pSrcDb, /* Database connection to read from */ + const char *zSrcDb /* Name of database within pSrcDb */ +){ + sqlite3_backup *p; /* Value to return */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(pSrcDb)||!sqlite3SafetyCheckOk(pDestDb) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + { + extern int sqlcipher_find_db_index(sqlite3*, const char*); + extern void sqlcipherCodecGetKey(sqlite3*, int, void**, int*); + int srcNKey, destNKey; + void *zKey; + + sqlcipherCodecGetKey(pSrcDb, sqlcipher_find_db_index(pSrcDb, zSrcDb), &zKey, &srcNKey); + sqlcipherCodecGetKey(pDestDb, sqlcipher_find_db_index(pDestDb, zDestDb), &zKey, &destNKey); + zKey = NULL; + + /* either both databases must be plaintext, or both must be encrypted */ + if((srcNKey == 0 && destNKey > 0) || (srcNKey > 0 && destNKey == 0)) { + sqlite3ErrorWithMsg(pDestDb, SQLITE_ERROR, "backup is not supported with encrypted databases"); + return NULL; + } + } +#endif +/* END SQLCIPHER */ + + /* Lock the source database handle. The destination database + ** handle is not locked in this routine, but it is locked in + ** sqlite3_backup_step(). The user is required to ensure that no + ** other thread accesses the destination handle for the duration + ** of the backup operation. Any attempt to use the destination + ** database connection while a backup is in progress may cause + ** a malfunction or a deadlock. + */ + sqlite3_mutex_enter(pSrcDb->mutex); + sqlite3_mutex_enter(pDestDb->mutex); + + if( pSrcDb==pDestDb ){ + sqlite3ErrorWithMsg( + pDestDb, SQLITE_ERROR, "source and destination must be distinct" + ); + p = 0; + }else { + /* Allocate space for a new sqlite3_backup object... + ** EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a + ** call to sqlite3_backup_init() and is destroyed by a call to + ** sqlite3_backup_finish(). */ + p = (sqlite3_backup *)sqlite3MallocZero(sizeof(sqlite3_backup)); + if( !p ){ + sqlite3Error(pDestDb, SQLITE_NOMEM_BKPT); + } + } + + /* If the allocation succeeded, populate the new object. */ + if( p ){ + p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb); + p->pDest = findBtree(pDestDb, pDestDb, zDestDb); + p->pDestDb = pDestDb; + p->pSrcDb = pSrcDb; + p->iNext = 1; + p->isAttached = 0; + + if( 0==p->pSrc || 0==p->pDest + || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK + ){ + /* One (or both) of the named databases did not exist or an OOM + ** error was hit. Or there is a transaction open on the destination + ** database. The error has already been written into the pDestDb + ** handle. All that is left to do here is free the sqlite3_backup + ** structure. */ + sqlite3_free(p); + p = 0; + } + } + if( p ){ + p->pSrc->nBackup++; + } + + sqlite3_mutex_leave(pDestDb->mutex); + sqlite3_mutex_leave(pSrcDb->mutex); + return p; +} + +/* +** Argument rc is an SQLite error code. Return true if this error is +** considered fatal if encountered during a backup operation. All errors +** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED. +*/ +static int isFatalError(int rc){ + return (rc!=SQLITE_OK && rc!=SQLITE_BUSY && ALWAYS(rc!=SQLITE_LOCKED)); +} + +/* +** Parameter zSrcData points to a buffer containing the data for +** page iSrcPg from the source database. Copy this data into the +** destination database. +*/ +static int backupOnePage( + sqlite3_backup *p, /* Backup handle */ + Pgno iSrcPg, /* Source database page to backup */ + const u8 *zSrcData, /* Source database page data */ + int bUpdate /* True for an update, false otherwise */ +){ + Pager * const pDestPager = sqlite3BtreePager(p->pDest); + const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc); + int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest); + const int nCopy = MIN(nSrcPgsz, nDestPgsz); + const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz; +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + extern void *sqlcipherPagerGetCodec(Pager*); + /* Use BtreeGetReserveNoMutex() for the source b-tree, as although it is + ** guaranteed that the shared-mutex is held by this thread, handle + ** p->pSrc may not actually be the owner. */ + int nSrcReserve = sqlite3BtreeGetReserveNoMutex(p->pSrc); + int nDestReserve = sqlite3BtreeGetRequestedReserve(p->pDest); +#endif +/* END SQLCIPHER */ + int rc = SQLITE_OK; + i64 iOff; + + assert( sqlite3BtreeGetReserveNoMutex(p->pSrc)>=0 ); + assert( p->bDestLocked ); + assert( !isFatalError(p->rc) ); + assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ); + assert( zSrcData ); + + /* Catch the case where the destination is an in-memory database and the + ** page sizes of the source and destination differ. + */ + if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ + rc = SQLITE_READONLY; + } + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + /* Backup is not possible if the page size of the destination is changing + ** and a codec is in use. + */ + if( nSrcPgsz!=nDestPgsz && sqlcipherPagerGetCodec(pDestPager)!=0 ){ + rc = SQLITE_READONLY; + } + + /* Backup is not possible if the number of bytes of reserve space differ + ** between source and destination. If there is a difference, try to + ** fix the destination to agree with the source. If that is not possible, + ** then the backup cannot proceed. + */ + if( nSrcReserve!=nDestReserve ){ + u32 newPgsz = nSrcPgsz; + rc = sqlite3PagerSetPagesize(pDestPager, &newPgsz, nSrcReserve); + if( rc==SQLITE_OK && newPgsz!=(u32)nSrcPgsz ) rc = SQLITE_READONLY; + } +#endif +/* END SQLCIPHER */ + + /* This loop runs once for each destination page spanned by the source + ** page. For each iteration, variable iOff is set to the byte offset + ** of the destination page. + */ + for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOffpDest->pBt) ) continue; + if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg, 0)) + && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg)) + ){ + const u8 *zIn = &zSrcData[iOff%nSrcPgsz]; + u8 *zDestData = sqlite3PagerGetData(pDestPg); + u8 *zOut = &zDestData[iOff%nDestPgsz]; + + /* Copy the data from the source page into the destination page. + ** Then clear the Btree layer MemPage.isInit flag. Both this module + ** and the pager code use this trick (clearing the first byte + ** of the page 'extra' space to invalidate the Btree layers + ** cached parse of the page). MemPage.isInit is marked + ** "MUST BE FIRST" for this purpose. + */ + memcpy(zOut, zIn, nCopy); + ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0; + if( iOff==0 && bUpdate==0 ){ + sqlite3Put4byte(&zOut[28], sqlite3BtreeLastPage(p->pSrc)); + } + } + sqlite3PagerUnref(pDestPg); + } + + return rc; +} + +/* +** If pFile is currently larger than iSize bytes, then truncate it to +** exactly iSize bytes. If pFile is not larger than iSize bytes, then +** this function is a no-op. +** +** Return SQLITE_OK if everything is successful, or an SQLite error +** code if an error occurs. +*/ +static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){ + i64 iCurrent; + int rc = sqlite3OsFileSize(pFile, &iCurrent); + if( rc==SQLITE_OK && iCurrent>iSize ){ + rc = sqlite3OsTruncate(pFile, iSize); + } + return rc; +} + +/* +** Register this backup object with the associated source pager for +** callbacks when pages are changed or the cache invalidated. +*/ +static void attachBackupObject(sqlite3_backup *p){ + sqlite3_backup **pp; + assert( sqlite3BtreeHoldsMutex(p->pSrc) ); + pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + p->pNext = *pp; + *pp = p; + p->isAttached = 1; +} + +/* +** Copy nPage pages from the source b-tree to the destination. +*/ +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ + int rc; + int destMode; /* Destination journal mode */ + int pgszSrc = 0; /* Source page size */ + int pgszDest = 0; /* Destination page size */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(p->pSrcDb->mutex); + sqlite3BtreeEnter(p->pSrc); + if( p->pDestDb ){ + sqlite3_mutex_enter(p->pDestDb->mutex); + } + + rc = p->rc; + if( !isFatalError(rc) ){ + Pager * const pSrcPager = sqlite3BtreePager(p->pSrc); /* Source pager */ + Pager * const pDestPager = sqlite3BtreePager(p->pDest); /* Dest pager */ + int ii; /* Iterator variable */ + int nSrcPage = -1; /* Size of source db in pages */ + int bCloseTrans = 0; /* True if src db requires unlocking */ + + /* If the source pager is currently in a write-transaction, return + ** SQLITE_BUSY immediately. + */ + if( p->pDestDb && p->pSrc->pBt->inTransaction==TRANS_WRITE ){ + rc = SQLITE_BUSY; + }else{ + rc = SQLITE_OK; + } + + /* If there is no open read-transaction on the source database, open + ** one now. If a transaction is opened here, then it will be closed + ** before this function exits. + */ + if( rc==SQLITE_OK && SQLITE_TXN_NONE==sqlite3BtreeTxnState(p->pSrc) ){ + rc = sqlite3BtreeBeginTrans(p->pSrc, 0, 0); + bCloseTrans = 1; + } + + /* If the destination database has not yet been locked (i.e. if this + ** is the first call to backup_step() for the current backup operation), + ** try to set its page size to the same as the source database. This + ** is especially important on ZipVFS systems, as in that case it is + ** not possible to create a database file that uses one page size by + ** writing to it with another. */ + if( p->bDestLocked==0 && rc==SQLITE_OK && setDestPgsz(p)==SQLITE_NOMEM ){ + rc = SQLITE_NOMEM; + } + + /* Lock the destination database, if it is not locked already. */ + if( SQLITE_OK==rc && p->bDestLocked==0 + && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2, + (int*)&p->iDestSchema)) + ){ + p->bDestLocked = 1; + } + + /* Do not allow backup if the destination database is in WAL mode + ** and the page sizes are different between source and destination */ + pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); + pgszDest = sqlite3BtreeGetPageSize(p->pDest); + destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest)); + if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ + rc = SQLITE_READONLY; + } + + /* Now that there is a read-lock on the source database, query the + ** source pager for the number of pages in the database. + */ + nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc); + assert( nSrcPage>=0 ); + for(ii=0; (nPage<0 || iiiNext<=(Pgno)nSrcPage && !rc; ii++){ + const Pgno iSrcPg = p->iNext; /* Source page number */ + if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){ + DbPage *pSrcPg; /* Source page object */ + rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg,PAGER_GET_READONLY); + if( rc==SQLITE_OK ){ + rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg), 0); + sqlite3PagerUnref(pSrcPg); + } + } + p->iNext++; + } + if( rc==SQLITE_OK ){ + p->nPagecount = nSrcPage; + p->nRemaining = nSrcPage+1-p->iNext; + if( p->iNext>(Pgno)nSrcPage ){ + rc = SQLITE_DONE; + }else if( !p->isAttached ){ + attachBackupObject(p); + } + } + + /* Update the schema version field in the destination database. This + ** is to make sure that the schema-version really does change in + ** the case where the source and destination databases have the + ** same schema version. + */ + if( rc==SQLITE_DONE ){ + if( nSrcPage==0 ){ + rc = sqlite3BtreeNewDb(p->pDest); + nSrcPage = 1; + } + if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1); + } + if( rc==SQLITE_OK ){ + if( p->pDestDb ){ + sqlite3ResetAllSchemasOfConnection(p->pDestDb); + } + if( destMode==PAGER_JOURNALMODE_WAL ){ + rc = sqlite3BtreeSetVersion(p->pDest, 2); + } + } + if( rc==SQLITE_OK ){ + int nDestTruncate; + /* Set nDestTruncate to the final number of pages in the destination + ** database. The complication here is that the destination page + ** size may be different to the source page size. + ** + ** If the source page size is smaller than the destination page size, + ** round up. In this case the call to sqlite3OsTruncate() below will + ** fix the size of the file. However it is important to call + ** sqlite3PagerTruncateImage() here so that any pages in the + ** destination file that lie beyond the nDestTruncate page mark are + ** journalled by PagerCommitPhaseOne() before they are destroyed + ** by the file truncation. + */ + assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) ); + assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) ); + if( pgszSrcpDest->pBt) ){ + nDestTruncate--; + } + }else{ + nDestTruncate = nSrcPage * (pgszSrc/pgszDest); + } + assert( nDestTruncate>0 ); + + if( pgszSrc= iSize || ( + nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) + && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest + )); + + /* This block ensures that all data required to recreate the original + ** database has been stored in the journal for pDestPager and the + ** journal synced to disk. So at this point we may safely modify + ** the database file in any way, knowing that if a power failure + ** occurs, the original database will be reconstructed from the + ** journal file. */ + sqlite3PagerPagecount(pDestPager, &nDstPage); + for(iPg=nDestTruncate; rc==SQLITE_OK && iPg<=(Pgno)nDstPage; iPg++){ + if( iPg!=PENDING_BYTE_PAGE(p->pDest->pBt) ){ + DbPage *pPg; + rc = sqlite3PagerGet(pDestPager, iPg, &pPg, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pPg); + sqlite3PagerUnref(pPg); + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1); + } + + /* Write the extra pages and truncate the database file as required */ + iEnd = MIN(PENDING_BYTE + pgszDest, iSize); + for( + iOff=PENDING_BYTE+pgszSrc; + rc==SQLITE_OK && iOffpDest, 0)) + ){ + rc = SQLITE_DONE; + } + } + } + + /* If bCloseTrans is true, then this function opened a read transaction + ** on the source database. Close the read transaction here. There is + ** no need to check the return values of the btree methods here, as + ** "committing" a read-only transaction cannot fail. + */ + if( bCloseTrans ){ + TESTONLY( int rc2 ); + TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0); + TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0); + assert( rc2==SQLITE_OK ); + } + + if( rc==SQLITE_IOERR_NOMEM ){ + rc = SQLITE_NOMEM_BKPT; + } + p->rc = rc; + } + if( p->pDestDb ){ + sqlite3_mutex_leave(p->pDestDb->mutex); + } + sqlite3BtreeLeave(p->pSrc); + sqlite3_mutex_leave(p->pSrcDb->mutex); + return rc; +} + +/* +** Release all resources associated with an sqlite3_backup* handle. +*/ +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){ + sqlite3_backup **pp; /* Ptr to head of pagers backup list */ + sqlite3 *pSrcDb; /* Source database connection */ + int rc; /* Value to return */ + + /* Enter the mutexes */ + if( p==0 ) return SQLITE_OK; + pSrcDb = p->pSrcDb; + sqlite3_mutex_enter(pSrcDb->mutex); + sqlite3BtreeEnter(p->pSrc); + if( p->pDestDb ){ + sqlite3_mutex_enter(p->pDestDb->mutex); + } + + /* Detach this backup from the source pager. */ + if( p->pDestDb ){ + p->pSrc->nBackup--; + } + if( p->isAttached ){ + pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + assert( pp!=0 ); + while( *pp!=p ){ + pp = &(*pp)->pNext; + assert( pp!=0 ); + } + *pp = p->pNext; + } + + /* If a transaction is still open on the Btree, roll it back. */ + sqlite3BtreeRollback(p->pDest, SQLITE_OK, 0); + + /* Set the error code of the destination database handle. */ + rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc; + if( p->pDestDb ){ + sqlite3Error(p->pDestDb, rc); + + /* Exit the mutexes and free the backup context structure. */ + sqlite3LeaveMutexAndCloseZombie(p->pDestDb); + } + sqlite3BtreeLeave(p->pSrc); + if( p->pDestDb ){ + /* EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a + ** call to sqlite3_backup_init() and is destroyed by a call to + ** sqlite3_backup_finish(). */ + sqlite3_free(p); + } + sqlite3LeaveMutexAndCloseZombie(pSrcDb); + return rc; +} + +/* +** Return the number of pages still to be backed up as of the most recent +** call to sqlite3_backup_step(). +*/ +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return p->nRemaining; +} + +/* +** Return the total number of pages in the source database as of the most +** recent call to sqlite3_backup_step(). +*/ +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return p->nPagecount; +} + +/* +** This function is called after the contents of page iPage of the +** source database have been modified. If page iPage has already been +** copied into the destination database, then the data written to the +** destination is now invalidated. The destination copy of iPage needs +** to be updated with the new data before the backup operation is +** complete. +** +** It is assumed that the mutex associated with the BtShared object +** corresponding to the source database is held when this function is +** called. +*/ +static SQLITE_NOINLINE void backupUpdate( + sqlite3_backup *p, + Pgno iPage, + const u8 *aData +){ + assert( p!=0 ); + do{ + assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); + if( !isFatalError(p->rc) && iPageiNext ){ + /* The backup process p has already copied page iPage. But now it + ** has been modified by a transaction on the source pager. Copy + ** the new data into the backup. + */ + int rc; + assert( p->pDestDb ); + sqlite3_mutex_enter(p->pDestDb->mutex); + rc = backupOnePage(p, iPage, aData, 1); + sqlite3_mutex_leave(p->pDestDb->mutex); + assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED ); + if( rc!=SQLITE_OK ){ + p->rc = rc; + } + } + }while( (p = p->pNext)!=0 ); +} +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){ + if( pBackup ) backupUpdate(pBackup, iPage, aData); +} + +/* +** Restart the backup process. This is called when the pager layer +** detects that the database has been modified by an external database +** connection. In this case there is no way of knowing which of the +** pages that have been copied into the destination database are still +** valid and which are not, so the entire process needs to be restarted. +** +** It is assumed that the mutex associated with the BtShared object +** corresponding to the source database is held when this function is +** called. +*/ +SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){ + sqlite3_backup *p; /* Iterator variable */ + for(p=pBackup; p; p=p->pNext){ + assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); + p->iNext = 1; + } +} + +#ifndef SQLITE_OMIT_VACUUM +/* +** Copy the complete content of pBtFrom into pBtTo. A transaction +** must be active for both files. +** +** The size of file pTo may be reduced by this operation. If anything +** goes wrong, the transaction on pTo is rolled back. If successful, the +** transaction is committed before returning. +*/ +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ + int rc; + sqlite3_file *pFd; /* File descriptor for database pTo */ + sqlite3_backup b; + sqlite3BtreeEnter(pTo); + sqlite3BtreeEnter(pFrom); + + assert( sqlite3BtreeTxnState(pTo)==SQLITE_TXN_WRITE ); + pFd = sqlite3PagerFile(sqlite3BtreePager(pTo)); + if( pFd->pMethods ){ + i64 nByte = sqlite3BtreeGetPageSize(pFrom)*(i64)sqlite3BtreeLastPage(pFrom); + rc = sqlite3OsFileControl(pFd, SQLITE_FCNTL_OVERWRITE, &nByte); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc ) goto copy_finished; + } + + /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set + ** to 0. This is used by the implementations of sqlite3_backup_step() + ** and sqlite3_backup_finish() to detect that they are being called + ** from this function, not directly by the user. + */ + memset(&b, 0, sizeof(b)); + b.pSrcDb = pFrom->db; + b.pSrc = pFrom; + b.pDest = pTo; + b.iNext = 1; + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + sqlite3PagerAlignReserve(sqlite3BtreePager(pTo), sqlite3BtreePager(pFrom)); +#endif +/* END SQLCIPHER */ + + /* 0x7FFFFFFF is the hard limit for the number of pages in a database + ** file. By passing this as the number of pages to copy to + ** sqlite3_backup_step(), we can guarantee that the copy finishes + ** within a single call (unless an error occurs). The assert() statement + ** checks this assumption - (p->rc) should be set to either SQLITE_DONE + ** or an error code. */ + sqlite3_backup_step(&b, 0x7FFFFFFF); + assert( b.rc!=SQLITE_OK ); + + rc = sqlite3_backup_finish(&b); + if( rc==SQLITE_OK ){ + pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; + }else{ + sqlite3PagerClearCache(sqlite3BtreePager(b.pDest)); + } + + assert( sqlite3BtreeTxnState(pTo)!=SQLITE_TXN_WRITE ); +copy_finished: + sqlite3BtreeLeave(pFrom); + sqlite3BtreeLeave(pTo); + return rc; +} +#endif /* SQLITE_OMIT_VACUUM */ + +/************** End of backup.c **********************************************/ +/************** Begin file vdbemem.c *****************************************/ +/* +** 2004 May 26 +** +** 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 contains code use to manipulate "Mem" structure. A "Mem" +** stores a single value in the VDBE. Mem is an opaque structure visible +** only within the VDBE. Interface routines refer to a Mem using the +** name sqlite_value +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* True if X is a power of two. 0 is considered a power of two here. +** In other words, return true if X has at most one bit set. +*/ +#define ISPOWEROF2(X) (((X)&((X)-1))==0) + +#ifdef SQLITE_DEBUG +/* +** Check invariants on a Mem object. +** +** This routine is intended for use inside of assert() statements, like +** this: assert( sqlite3VdbeCheckMemInvariants(pMem) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ + /* If MEM_Dyn is set then Mem.xDel!=0. + ** Mem.xDel might not be initialized if MEM_Dyn is clear. + */ + assert( (p->flags & MEM_Dyn)==0 || p->xDel!=0 ); + + /* MEM_Dyn may only be set if Mem.szMalloc==0. In this way we + ** ensure that if Mem.szMalloc>0 then it is safe to do + ** Mem.z = Mem.zMalloc without having to check Mem.flags&MEM_Dyn. + ** That saves a few cycles in inner loops. */ + assert( (p->flags & MEM_Dyn)==0 || p->szMalloc==0 ); + + /* Cannot have more than one of MEM_Int, MEM_Real, or MEM_IntReal */ + assert( ISPOWEROF2(p->flags & (MEM_Int|MEM_Real|MEM_IntReal)) ); + + if( p->flags & MEM_Null ){ + /* Cannot be both MEM_Null and some other type */ + assert( (p->flags & (MEM_Int|MEM_Real|MEM_Str|MEM_Blob|MEM_Agg))==0 ); + + /* If MEM_Null is set, then either the value is a pure NULL (the usual + ** case) or it is a pointer set using sqlite3_bind_pointer() or + ** sqlite3_result_pointer(). If a pointer, then MEM_Term must also be + ** set. + */ + if( (p->flags & (MEM_Term|MEM_Subtype))==(MEM_Term|MEM_Subtype) ){ + /* This is a pointer type. There may be a flag to indicate what to + ** do with the pointer. */ + assert( ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) <= 1 ); + + /* No other bits set */ + assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype|MEM_FromBind + |MEM_Dyn|MEM_Ephem|MEM_Static))==0 ); + }else{ + /* A pure NULL might have other flags, such as MEM_Static, MEM_Dyn, + ** MEM_Ephem, MEM_Cleared, or MEM_Subtype */ + } + }else{ + /* The MEM_Cleared bit is only allowed on NULLs */ + assert( (p->flags & MEM_Cleared)==0 ); + } + + /* The szMalloc field holds the correct memory allocation size */ + assert( p->szMalloc==0 + || (p->flags==MEM_Undefined + && p->szMalloc<=sqlite3DbMallocSize(p->db,p->zMalloc)) + || p->szMalloc==sqlite3DbMallocSize(p->db,p->zMalloc)); + + /* If p holds a string or blob, the Mem.z must point to exactly + ** one of the following: + ** + ** (1) Memory in Mem.zMalloc and managed by the Mem object + ** (2) Memory to be freed using Mem.xDel + ** (3) An ephemeral string or blob + ** (4) A static string or blob + */ + if( (p->flags & (MEM_Str|MEM_Blob)) && p->n>0 ){ + assert( + ((p->szMalloc>0 && p->z==p->zMalloc)? 1 : 0) + + ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) == 1 + ); + } + return 1; +} +#endif + +/* +** Render a Mem object which is one of MEM_Int, MEM_Real, or MEM_IntReal +** into a buffer. +*/ +static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ + StrAccum acc; + assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) ); + assert( sz>22 ); + if( p->flags & MEM_Int ){ +#if GCC_VERSION>=7000000 + /* Work-around for GCC bug + ** https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270 */ + i64 x; + assert( (p->flags&MEM_Int)*2==sizeof(x) ); + memcpy(&x, (char*)&p->u, (p->flags&MEM_Int)*2); + sqlite3Int64ToText(x, zBuf); +#else + sqlite3Int64ToText(p->u.i, zBuf); +#endif + }else{ + sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0); + sqlite3_str_appendf(&acc, "%!.15g", + (p->flags & MEM_IntReal)!=0 ? (double)p->u.i : p->u.r); + assert( acc.zText==zBuf && acc.mxAlloc<=0 ); + zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */ + } +} + +#ifdef SQLITE_DEBUG +/* +** Validity checks on pMem. pMem holds a string. +** +** (1) Check that string value of pMem agrees with its integer or real value. +** (2) Check that the string is correctly zero terminated +** +** A single int or real value always converts to the same strings. But +** many different strings can be converted into the same int or real. +** If a table contains a numeric value and an index is based on the +** corresponding string value, then it is important that the string be +** derived from the numeric value, not the other way around, to ensure +** that the index and table are consistent. See ticket +** https://www.sqlite.org/src/info/343634942dd54ab (2018-01-31) for +** an example. +** +** This routine looks at pMem to verify that if it has both a numeric +** representation and a string representation then the string rep has +** been derived from the numeric and not the other way around. It returns +** true if everything is ok and false if there is a problem. +** +** This routine is for use inside of assert() statements only. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){ + char zBuf[100]; + char *z; + int i, j, incr; + if( (p->flags & MEM_Str)==0 ) return 1; + if( p->flags & MEM_Term ){ + /* Insure that the string is properly zero-terminated. Pay particular + ** attention to the case where p->n is odd */ + if( p->szMalloc>0 && p->z==p->zMalloc ){ + assert( p->enc==SQLITE_UTF8 || p->szMalloc >= ((p->n+1)&~1)+2 ); + assert( p->enc!=SQLITE_UTF8 || p->szMalloc >= p->n+1 ); + } + assert( p->z[p->n]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[(p->n+1)&~1]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[((p->n+1)&~1)+1]==0 ); + } + if( (p->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ) return 1; + vdbeMemRenderNum(sizeof(zBuf), zBuf, p); + z = p->z; + i = j = 0; + incr = 1; + if( p->enc!=SQLITE_UTF8 ){ + incr = 2; + if( p->enc==SQLITE_UTF16BE ) z++; + } + while( zBuf[j] ){ + if( zBuf[j++]!=z[i] ) return 0; + i += incr; + } + return 1; +} +#endif /* SQLITE_DEBUG */ + +/* +** If pMem is an object with a valid string representation, this routine +** ensures the internal encoding for the string representation is +** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE. +** +** If pMem is not a string object, or the encoding of the string +** representation is already stored using the requested encoding, then this +** routine is a no-op. +** +** SQLITE_OK is returned if the conversion is successful (or not required). +** SQLITE_NOMEM may be returned if a malloc() fails during conversion +** between formats. +*/ +SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ +#ifndef SQLITE_OMIT_UTF16 + int rc; +#endif + assert( pMem!=0 ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE + || desiredEnc==SQLITE_UTF16BE ); + if( !(pMem->flags&MEM_Str) ){ + pMem->enc = desiredEnc; + return SQLITE_OK; + } + if( pMem->enc==desiredEnc ){ + return SQLITE_OK; + } + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); +#ifdef SQLITE_OMIT_UTF16 + return SQLITE_ERROR; +#else + + /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned, + ** then the encoding of the value may not have changed. + */ + rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc); + assert(rc==SQLITE_OK || rc==SQLITE_NOMEM); + assert(rc==SQLITE_OK || pMem->enc!=desiredEnc); + assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc); + return rc; +#endif +} + +/* +** Make sure pMem->z points to a writable allocation of at least n bytes. +** +** If the bPreserve argument is true, then copy of the content of +** pMem->z into the new allocation. pMem must be either a string or +** blob if bPreserve is true. If bPreserve is false, any prior content +** in pMem->z is discarded. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ + assert( sqlite3VdbeCheckMemInvariants(pMem) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + testcase( pMem->db==0 ); + + /* If the bPreserve flag is set to true, then the memory cell must already + ** contain a valid string or blob value. */ + assert( bPreserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); + testcase( bPreserve && pMem->z==0 ); + + assert( pMem->szMalloc==0 + || (pMem->flags==MEM_Undefined + && pMem->szMalloc<=sqlite3DbMallocSize(pMem->db,pMem->zMalloc)) + || pMem->szMalloc==sqlite3DbMallocSize(pMem->db,pMem->zMalloc)); + if( pMem->szMalloc>0 && bPreserve && pMem->z==pMem->zMalloc ){ + if( pMem->db ){ + pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); + }else{ + pMem->zMalloc = sqlite3Realloc(pMem->z, n); + if( pMem->zMalloc==0 ) sqlite3_free(pMem->z); + pMem->z = pMem->zMalloc; + } + bPreserve = 0; + }else{ + if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); + } + if( pMem->zMalloc==0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + pMem->szMalloc = 0; + return SQLITE_NOMEM_BKPT; + }else{ + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + } + + if( bPreserve && pMem->z ){ + assert( pMem->z!=pMem->zMalloc ); + memcpy(pMem->zMalloc, pMem->z, pMem->n); + } + if( (pMem->flags&MEM_Dyn)!=0 ){ + assert( pMem->xDel!=0 && pMem->xDel!=SQLITE_DYNAMIC ); + pMem->xDel((void *)(pMem->z)); + } + + pMem->z = pMem->zMalloc; + pMem->flags &= ~(MEM_Dyn|MEM_Ephem|MEM_Static); + return SQLITE_OK; +} + +/* +** Change the pMem->zMalloc allocation to be at least szNew bytes. +** If pMem->zMalloc already meets or exceeds the requested size, this +** routine is a no-op. +** +** Any prior string or blob content in the pMem object may be discarded. +** The pMem->xDel destructor is called, if it exists. Though MEM_Str +** and MEM_Blob values may be discarded, MEM_Int, MEM_Real, MEM_IntReal, +** and MEM_Null values are preserved. +** +** Return SQLITE_OK on success or an error code (probably SQLITE_NOMEM) +** if unable to complete the resizing. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ + assert( CORRUPT_DB || szNew>0 ); + assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); + if( pMem->szMallocflags & MEM_Dyn)==0 ); + pMem->z = pMem->zMalloc; + pMem->flags &= (MEM_Null|MEM_Int|MEM_Real|MEM_IntReal); + return SQLITE_OK; +} + +/* +** It is already known that pMem contains an unterminated string. +** Add the zero terminator. +** +** Three bytes of zero are added. In this way, there is guaranteed +** to be a double-zero byte at an even byte boundary in order to +** terminate a UTF16 string, even if the initial size of the buffer +** is an odd number of bytes. +*/ +static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ + if( sqlite3VdbeMemGrow(pMem, pMem->n+3, 1) ){ + return SQLITE_NOMEM_BKPT; + } + pMem->z[pMem->n] = 0; + pMem->z[pMem->n+1] = 0; + pMem->z[pMem->n+2] = 0; + pMem->flags |= MEM_Term; + return SQLITE_OK; +} + +/* +** Change pMem so that its MEM_Str or MEM_Blob value is stored in +** MEM.zMalloc, where it can be safely written. +** +** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){ + if( ExpandBlob(pMem) ) return SQLITE_NOMEM; + if( pMem->szMalloc==0 || pMem->z!=pMem->zMalloc ){ + int rc = vdbeMemAddTerminator(pMem); + if( rc ) return rc; + } + } + pMem->flags &= ~MEM_Ephem; +#ifdef SQLITE_DEBUG + pMem->pScopyFrom = 0; +#endif + + return SQLITE_OK; +} + +/* +** If the given Mem* has a zero-filled tail, turn it into an ordinary +** blob stored in dynamically allocated space. +*/ +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ + int nByte; + assert( pMem!=0 ); + assert( pMem->flags & MEM_Zero ); + assert( (pMem->flags&MEM_Blob)!=0 || MemNullNochng(pMem) ); + testcase( sqlite3_value_nochange(pMem) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + + /* Set nByte to the number of bytes required to store the expanded blob. */ + nByte = pMem->n + pMem->u.nZero; + if( nByte<=0 ){ + if( (pMem->flags & MEM_Blob)==0 ) return SQLITE_OK; + nByte = 1; + } + if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ + return SQLITE_NOMEM_BKPT; + } + assert( pMem->z!=0 ); + assert( sqlite3DbMallocSize(pMem->db,pMem->z) >= nByte ); + + memset(&pMem->z[pMem->n], 0, pMem->u.nZero); + pMem->n += pMem->u.nZero; + pMem->flags &= ~(MEM_Zero|MEM_Term); + return SQLITE_OK; +} +#endif + +/* +** Make sure the given Mem is \u0000 terminated. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){ + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + testcase( (pMem->flags & (MEM_Term|MEM_Str))==(MEM_Term|MEM_Str) ); + testcase( (pMem->flags & (MEM_Term|MEM_Str))==0 ); + if( (pMem->flags & (MEM_Term|MEM_Str))!=MEM_Str ){ + return SQLITE_OK; /* Nothing to do */ + }else{ + return vdbeMemAddTerminator(pMem); + } +} + +/* +** Add MEM_Str to the set of representations for the given Mem. This +** routine is only called if pMem is a number of some kind, not a NULL +** or a BLOB. +** +** Existing representations MEM_Int, MEM_Real, or MEM_IntReal are invalidated +** if bForce is true but are retained if bForce is false. +** +** A MEM_Null value will never be passed to this function. This function is +** used for converting values to text for returning to the user (i.e. via +** sqlite3_value_text()), or for ensuring that values to be used as btree +** keys are strings. In the former case a NULL pointer is returned the +** user and the latter is an internal programming error. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ + const int nByte = 32; + + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !(pMem->flags&MEM_Zero) ); + assert( !(pMem->flags&(MEM_Str|MEM_Blob)) ); + assert( pMem->flags&(MEM_Int|MEM_Real|MEM_IntReal) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + + if( sqlite3VdbeMemClearAndResize(pMem, nByte) ){ + pMem->enc = 0; + return SQLITE_NOMEM_BKPT; + } + + vdbeMemRenderNum(nByte, pMem->z, pMem); + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30NN(pMem->z); + pMem->enc = SQLITE_UTF8; + pMem->flags |= MEM_Str|MEM_Term; + if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal); + sqlite3VdbeChangeEncoding(pMem, enc); + return SQLITE_OK; +} + +/* +** Memory cell pMem contains the context of an aggregate function. +** This routine calls the finalize method for that function. The +** result of the aggregate is stored back into pMem. +** +** Return SQLITE_ERROR if the finalizer reports an error. SQLITE_OK +** otherwise. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ + sqlite3_context ctx; + Mem t; + assert( pFunc!=0 ); + assert( pMem!=0 ); + assert( pMem->db!=0 ); + assert( pFunc->xFinalize!=0 ); + assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); + assert( sqlite3_mutex_held(pMem->db->mutex) ); + memset(&ctx, 0, sizeof(ctx)); + memset(&t, 0, sizeof(t)); + t.flags = MEM_Null; + t.db = pMem->db; + ctx.pOut = &t; + ctx.pMem = pMem; + ctx.pFunc = pFunc; + ctx.enc = ENC(t.db); + pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ + assert( (pMem->flags & MEM_Dyn)==0 ); + if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + memcpy(pMem, &t, sizeof(t)); + return ctx.isError; +} + +/* +** Memory cell pAccum contains the context of an aggregate function. +** This routine calls the xValue method for that function and stores +** the results in memory cell pMem. +** +** SQLITE_ERROR is returned if xValue() reports an error. SQLITE_OK +** otherwise. +*/ +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc){ + sqlite3_context ctx; + assert( pFunc!=0 ); + assert( pFunc->xValue!=0 ); + assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef ); + assert( pAccum->db!=0 ); + assert( sqlite3_mutex_held(pAccum->db->mutex) ); + memset(&ctx, 0, sizeof(ctx)); + sqlite3VdbeMemSetNull(pOut); + ctx.pOut = pOut; + ctx.pMem = pAccum; + ctx.pFunc = pFunc; + ctx.enc = ENC(pAccum->db); + pFunc->xValue(&ctx); + return ctx.isError; +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** If the memory cell contains a value that must be freed by +** invoking the external callback in Mem.xDel, then this routine +** will free that value. It also sets Mem.flags to MEM_Null. +** +** This is a helper routine for sqlite3VdbeMemSetNull() and +** for sqlite3VdbeMemRelease(). Use those other routines as the +** entry point for releasing Mem resources. +*/ +static SQLITE_NOINLINE void vdbeMemClearExternAndSetNull(Mem *p){ + assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) ); + assert( VdbeMemDynamic(p) ); + if( p->flags&MEM_Agg ){ + sqlite3VdbeMemFinalize(p, p->u.pDef); + assert( (p->flags & MEM_Agg)==0 ); + testcase( p->flags & MEM_Dyn ); + } + if( p->flags&MEM_Dyn ){ + assert( p->xDel!=SQLITE_DYNAMIC && p->xDel!=0 ); + p->xDel((void *)p->z); + } + p->flags = MEM_Null; +} + +/* +** Release memory held by the Mem p, both external memory cleared +** by p->xDel and memory in p->zMalloc. +** +** This is a helper routine invoked by sqlite3VdbeMemRelease() in +** the unusual case where there really is memory in p that needs +** to be freed. +*/ +static SQLITE_NOINLINE void vdbeMemClear(Mem *p){ + if( VdbeMemDynamic(p) ){ + vdbeMemClearExternAndSetNull(p); + } + if( p->szMalloc ){ + sqlite3DbFreeNN(p->db, p->zMalloc); + p->szMalloc = 0; + } + p->z = 0; +} + +/* +** Release any memory resources held by the Mem. Both the memory that is +** free by Mem.xDel and the Mem.zMalloc allocation are freed. +** +** Use this routine prior to clean up prior to abandoning a Mem, or to +** reset a Mem back to its minimum memory utilization. +** +** Use sqlite3VdbeMemSetNull() to release just the Mem.xDel space +** prior to inserting new content into the Mem. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ + assert( sqlite3VdbeCheckMemInvariants(p) ); + if( VdbeMemDynamic(p) || p->szMalloc ){ + vdbeMemClear(p); + } +} + +/* Like sqlite3VdbeMemRelease() but faster for cases where we +** know in advance that the Mem is not MEM_Dyn or MEM_Agg. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem *p){ + assert( !VdbeMemDynamic(p) ); + if( p->szMalloc ) vdbeMemClear(p); +} + +/* +** Convert a 64-bit IEEE double into a 64-bit signed integer. +** If the double is out of range of a 64-bit signed integer then +** return the closest available 64-bit signed integer. +*/ +static SQLITE_NOINLINE i64 doubleToInt64(double r){ +#ifdef SQLITE_OMIT_FLOATING_POINT + /* When floating-point is omitted, double and int64 are the same thing */ + return r; +#else + /* + ** Many compilers we encounter do not define constants for the + ** minimum and maximum 64-bit integers, or they define them + ** inconsistently. And many do not understand the "LL" notation. + ** So we define our own static constants here using nothing + ** larger than a 32-bit integer constant. + */ + static const i64 maxInt = LARGEST_INT64; + static const i64 minInt = SMALLEST_INT64; + + if( r<=(double)minInt ){ + return minInt; + }else if( r>=(double)maxInt ){ + return maxInt; + }else{ + return (i64)r; + } +#endif +} + +/* +** Return some kind of integer value which is the best we can do +** at representing the value that *pMem describes as an integer. +** If pMem is an integer, then the value is exact. If pMem is +** a floating-point then the value returned is the integer part. +** If pMem is a string or blob, then we make an attempt to convert +** it into an integer and return that. If pMem represents an +** an SQL-NULL value, return 0. +** +** If pMem represents a string value, its encoding might be changed. +*/ +static SQLITE_NOINLINE i64 memIntValue(const Mem *pMem){ + i64 value = 0; + sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc); + return value; +} +SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem *pMem){ + int flags; + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + flags = pMem->flags; + if( flags & (MEM_Int|MEM_IntReal) ){ + testcase( flags & MEM_IntReal ); + return pMem->u.i; + }else if( flags & MEM_Real ){ + return doubleToInt64(pMem->u.r); + }else if( (flags & (MEM_Str|MEM_Blob))!=0 && pMem->z!=0 ){ + return memIntValue(pMem); + }else{ + return 0; + } +} + +/* +** Return the best representation of pMem that we can get into a +** double. If pMem is already a double or an integer, return its +** value. If it is a string or blob, try to convert it to a double. +** If it is a NULL, return 0.0. +*/ +static SQLITE_NOINLINE double memRealValue(Mem *pMem){ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + double val = (double)0; + sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc); + return val; +} +SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + if( pMem->flags & MEM_Real ){ + return pMem->u.r; + }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pMem->flags & MEM_IntReal ); + return (double)pMem->u.i; + }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ + return memRealValue(pMem); + }else{ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + return (double)0; + } +} + +/* +** Return 1 if pMem represents true, and return 0 if pMem represents false. +** Return the value ifNull if pMem is NULL. +*/ +SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){ + testcase( pMem->flags & MEM_IntReal ); + if( pMem->flags & (MEM_Int|MEM_IntReal) ) return pMem->u.i!=0; + if( pMem->flags & MEM_Null ) return ifNull; + return sqlite3VdbeRealValue(pMem)!=0.0; +} + +/* +** The MEM structure is already a MEM_Real. Try to also make it a +** MEM_Int if we can. +*/ +SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ + i64 ix; + assert( pMem!=0 ); + assert( pMem->flags & MEM_Real ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + ix = doubleToInt64(pMem->u.r); + + /* Only mark the value as an integer if + ** + ** (1) the round-trip conversion real->int->real is a no-op, and + ** (2) The integer is neither the largest nor the smallest + ** possible integer (ticket #3922) + ** + ** The second and third terms in the following conditional enforces + ** the second condition under the assumption that addition overflow causes + ** values to wrap around. + */ + if( pMem->u.r==ix && ix>SMALLEST_INT64 && ixu.i = ix; + MemSetTypeFlag(pMem, MEM_Int); + } +} + +/* +** Convert pMem to type integer. Invalidate any prior representations. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){ + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + pMem->u.i = sqlite3VdbeIntValue(pMem); + MemSetTypeFlag(pMem, MEM_Int); + return SQLITE_OK; +} + +/* +** Convert pMem so that it is of type MEM_Real. +** Invalidate any prior representations. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + + pMem->u.r = sqlite3VdbeRealValue(pMem); + MemSetTypeFlag(pMem, MEM_Real); + return SQLITE_OK; +} + +/* Compare a floating point value to an integer. Return true if the two +** values are the same within the precision of the floating point value. +** +** This function assumes that i was obtained by assignment from r1. +** +** For some versions of GCC on 32-bit machines, if you do the more obvious +** comparison of "r1==(double)i" you sometimes get an answer of false even +** though the r1 and (double)i values are bit-for-bit the same. +*/ +SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ + double r2 = (double)i; + return r1==0.0 + || (memcmp(&r1, &r2, sizeof(r1))==0 + && i >= -2251799813685248LL && i < 2251799813685248LL); +} + +/* +** Convert pMem so that it has type MEM_Real or MEM_Int. +** Invalidate any prior representations. +** +** Every effort is made to force the conversion, even if the input +** is a string that does not look completely like a number. Convert +** as much of the string as we can and ignore the rest. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ + assert( pMem!=0 ); + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_Real ); + testcase( pMem->flags & MEM_IntReal ); + testcase( pMem->flags & MEM_Null ); + if( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))==0 ){ + int rc; + sqlite3_int64 ix; + assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1) + || sqlite3RealSameAsInt(pMem->u.r, (ix = (i64)pMem->u.r)) + ){ + pMem->u.i = ix; + MemSetTypeFlag(pMem, MEM_Int); + }else{ + MemSetTypeFlag(pMem, MEM_Real); + } + } + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))!=0 ); + pMem->flags &= ~(MEM_Str|MEM_Blob|MEM_Zero); + return SQLITE_OK; +} + +/* +** Cast the datatype of the value in pMem according to the affinity +** "aff". Casting is different from applying affinity in that a cast +** is forced. In other words, the value is converted into the desired +** affinity even if that results in loss of data. This routine is +** used (for example) to implement the SQL "cast()" operator. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ + if( pMem->flags & MEM_Null ) return SQLITE_OK; + switch( aff ){ + case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ + if( (pMem->flags & MEM_Blob)==0 ){ + sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); + assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); + if( pMem->flags & MEM_Str ) MemSetTypeFlag(pMem, MEM_Blob); + }else{ + pMem->flags &= ~(MEM_TypeMask&~MEM_Blob); + } + break; + } + case SQLITE_AFF_NUMERIC: { + sqlite3VdbeMemNumerify(pMem); + break; + } + case SQLITE_AFF_INTEGER: { + sqlite3VdbeMemIntegerify(pMem); + break; + } + case SQLITE_AFF_REAL: { + sqlite3VdbeMemRealify(pMem); + break; + } + default: { + assert( aff==SQLITE_AFF_TEXT ); + assert( MEM_Str==(MEM_Blob>>3) ); + pMem->flags |= (pMem->flags&MEM_Blob)>>3; + sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); + assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); + pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal|MEM_Blob|MEM_Zero); + return sqlite3VdbeChangeEncoding(pMem, encoding); + } + } + return SQLITE_OK; +} + +/* +** Initialize bulk memory to be a consistent Mem object. +** +** The minimum amount of initialization feasible is performed. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem *pMem, sqlite3 *db, u16 flags){ + assert( (flags & ~MEM_TypeMask)==0 ); + pMem->flags = flags; + pMem->db = db; + pMem->szMalloc = 0; +} + + +/* +** Delete any previous value and set the value stored in *pMem to NULL. +** +** This routine calls the Mem.xDel destructor to dispose of values that +** require the destructor. But it preserves the Mem.zMalloc memory allocation. +** To free all resources, use sqlite3VdbeMemRelease(), which both calls this +** routine to invoke the destructor and deallocates Mem.zMalloc. +** +** Use this routine to reset the Mem prior to insert a new value. +** +** Use sqlite3VdbeMemRelease() to complete erase the Mem prior to abandoning it. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){ + if( VdbeMemDynamic(pMem) ){ + vdbeMemClearExternAndSetNull(pMem); + }else{ + pMem->flags = MEM_Null; + } +} +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ + sqlite3VdbeMemSetNull((Mem*)p); +} + +/* +** Delete any previous value and set the value to be a BLOB of length +** n containing all zeros. +*/ +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ + sqlite3VdbeMemRelease(pMem); + pMem->flags = MEM_Blob|MEM_Zero; + pMem->n = 0; + if( n<0 ) n = 0; + pMem->u.nZero = n; + pMem->enc = SQLITE_UTF8; + pMem->z = 0; +} +#else +SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ + int nByte = n>0?n:1; + if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){ + return SQLITE_NOMEM_BKPT; + } + assert( pMem->z!=0 ); + assert( sqlite3DbMallocSize(pMem->db, pMem->z)>=nByte ); + memset(pMem->z, 0, nByte); + pMem->n = n>0?n:0; + pMem->flags = MEM_Blob; + pMem->enc = SQLITE_UTF8; + return SQLITE_OK; +} +#endif + +/* +** The pMem is known to contain content that needs to be destroyed prior +** to a value change. So invoke the destructor, then set the value to +** a 64-bit integer. +*/ +static SQLITE_NOINLINE void vdbeReleaseAndSetInt64(Mem *pMem, i64 val){ + sqlite3VdbeMemSetNull(pMem); + pMem->u.i = val; + pMem->flags = MEM_Int; +} + +/* +** Delete any previous value and set the value stored in *pMem to val, +** manifest type INTEGER. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){ + if( VdbeMemDynamic(pMem) ){ + vdbeReleaseAndSetInt64(pMem, val); + }else{ + pMem->u.i = val; + pMem->flags = MEM_Int; + } +} + +/* A no-op destructor */ +SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); } + +/* +** Set the value stored in *pMem should already be a NULL. +** Also store a pointer to go with it. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetPointer( + Mem *pMem, + void *pPtr, + const char *zPType, + void (*xDestructor)(void*) +){ + assert( pMem->flags==MEM_Null ); + vdbeMemClear(pMem); + pMem->u.zPType = zPType ? zPType : ""; + pMem->z = pPtr; + pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term; + pMem->eSubtype = 'p'; + pMem->xDel = xDestructor ? xDestructor : sqlite3NoopDestructor; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Delete any previous value and set the value stored in *pMem to val, +** manifest type REAL. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){ + sqlite3VdbeMemSetNull(pMem); + if( !sqlite3IsNaN(val) ){ + pMem->u.r = val; + pMem->flags = MEM_Real; + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Return true if the Mem holds a RowSet object. This routine is intended +** for use inside of assert() statements. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem *pMem){ + return (pMem->flags&(MEM_Blob|MEM_Dyn))==(MEM_Blob|MEM_Dyn) + && pMem->xDel==sqlite3RowSetDelete; +} +#endif + +/* +** Delete any previous value and set the value of pMem to be an +** empty boolean index. +** +** Return SQLITE_OK on success and SQLITE_NOMEM if a memory allocation +** error occurs. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem *pMem){ + sqlite3 *db = pMem->db; + RowSet *p; + assert( db!=0 ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + sqlite3VdbeMemRelease(pMem); + p = sqlite3RowSetInit(db); + if( p==0 ) return SQLITE_NOMEM; + pMem->z = (char*)p; + pMem->flags = MEM_Blob|MEM_Dyn; + pMem->xDel = sqlite3RowSetDelete; + return SQLITE_OK; +} + +/* +** Return true if the Mem object contains a TEXT or BLOB that is +** too large - whose size exceeds SQLITE_MAX_LENGTH. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ + assert( p->db!=0 ); + if( p->flags & (MEM_Str|MEM_Blob) ){ + int n = p->n; + if( p->flags & MEM_Zero ){ + n += p->u.nZero; + } + return n>p->db->aLimit[SQLITE_LIMIT_LENGTH]; + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** This routine prepares a memory cell for modification by breaking +** its link to a shallow copy and by marking any current shallow +** copies of this cell as invalid. +** +** This is used for testing and debugging only - to help ensure that shallow +** copies (created by OP_SCopy) are not misused. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ + int i; + Mem *pX; + for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ + if( pX->pScopyFrom==pMem ){ + u16 mFlags; + if( pVdbe->db->flags & SQLITE_VdbeTrace ){ + sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", + (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + } + /* If pX is marked as a shallow copy of pMem, then try to verify that + ** no significant changes have been made to pX since the OP_SCopy. + ** A significant change would indicated a missed call to this + ** function for pX. Minor changes, such as adding or removing a + ** dual type, are allowed, as long as the underlying value is the + ** same. */ + mFlags = pMem->flags & pX->flags & pX->mScopyFlags; + assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); + + /* pMem is the register that is changing. But also mark pX as + ** undefined so that we can quickly detect the shallow-copy error */ + pX->flags = MEM_Undefined; + pX->pScopyFrom = 0; + } + } + pMem->pScopyFrom = 0; +} +#endif /* SQLITE_DEBUG */ + +/* +** Make an shallow copy of pFrom into pTo. Prior contents of +** pTo are freed. The pFrom->z field is not duplicated. If +** pFrom->z is used, then pTo->z points to the same thing as pFrom->z +** and flags gets srcType (either MEM_Ephem or MEM_Static). +*/ +static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){ + vdbeMemClearExternAndSetNull(pTo); + assert( !VdbeMemDynamic(pTo) ); + sqlite3VdbeMemShallowCopy(pTo, pFrom, eType); +} +SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ + assert( !sqlite3VdbeMemIsRowSet(pFrom) ); + assert( pTo->db==pFrom->db ); + if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; } + memcpy(pTo, pFrom, MEMCELLSIZE); + if( (pFrom->flags&MEM_Static)==0 ){ + pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); + assert( srcType==MEM_Ephem || srcType==MEM_Static ); + pTo->flags |= srcType; + } +} + +/* +** Make a full copy of pFrom into pTo. Prior contents of pTo are +** freed before the copy is made. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ + int rc = SQLITE_OK; + + assert( !sqlite3VdbeMemIsRowSet(pFrom) ); + if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); + memcpy(pTo, pFrom, MEMCELLSIZE); + pTo->flags &= ~MEM_Dyn; + if( pTo->flags&(MEM_Str|MEM_Blob) ){ + if( 0==(pFrom->flags&MEM_Static) ){ + pTo->flags |= MEM_Ephem; + rc = sqlite3VdbeMemMakeWriteable(pTo); + } + } + + return rc; +} + +/* +** Transfer the contents of pFrom to pTo. Any existing value in pTo is +** freed. If pFrom contains ephemeral data, a copy is made. +** +** pFrom contains an SQL NULL when this routine returns. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ + assert( pFrom->db==0 || sqlite3_mutex_held(pFrom->db->mutex) ); + assert( pTo->db==0 || sqlite3_mutex_held(pTo->db->mutex) ); + assert( pFrom->db==0 || pTo->db==0 || pFrom->db==pTo->db ); + + sqlite3VdbeMemRelease(pTo); + memcpy(pTo, pFrom, sizeof(Mem)); + pFrom->flags = MEM_Null; + pFrom->szMalloc = 0; +} + +/* +** Change the value of a Mem to be a string or a BLOB. +** +** The memory management strategy depends on the value of the xDel +** parameter. If the value passed is SQLITE_TRANSIENT, then the +** string is copied into a (possibly existing) buffer managed by the +** Mem structure. Otherwise, any existing buffer is freed and the +** pointer copied. +** +** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH +** size limit) then no memory allocation occurs. If the string can be +** stored without allocating memory, then it is. If a memory allocation +** is required to store the string, then value of pMem is unchanged. In +** either case, SQLITE_TOOBIG is returned. +** +** The "enc" parameter is the text encoding for the string, or zero +** to store a blob. +** +** If n is negative, then the string consists of all bytes up to but +** excluding the first zero character. The n parameter must be +** non-negative for blobs. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemSetStr( + Mem *pMem, /* Memory cell to set to string value */ + const char *z, /* String pointer */ + i64 n, /* Bytes in string, or negative */ + u8 enc, /* Encoding of z. 0 for BLOBs */ + void (*xDel)(void*) /* Destructor function */ +){ + i64 nByte = n; /* New value for pMem->n */ + int iLimit; /* Maximum allowed string or blob size */ + u16 flags; /* New value for pMem->flags */ + + assert( pMem!=0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( enc!=0 || n>=0 ); + + /* If z is a NULL pointer, set pMem to contain an SQL NULL. */ + if( !z ){ + sqlite3VdbeMemSetNull(pMem); + return SQLITE_OK; + } + + if( pMem->db ){ + iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH]; + }else{ + iLimit = SQLITE_MAX_LENGTH; + } + if( nByte<0 ){ + assert( enc!=0 ); + if( enc==SQLITE_UTF8 ){ + nByte = strlen(z); + }else{ + for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} + } + flags= MEM_Str|MEM_Term; + }else if( enc==0 ){ + flags = MEM_Blob; + enc = SQLITE_UTF8; + }else{ + flags = MEM_Str; + } + if( nByte>iLimit ){ + if( xDel && xDel!=SQLITE_TRANSIENT ){ + if( xDel==SQLITE_DYNAMIC ){ + sqlite3DbFree(pMem->db, (void*)z); + }else{ + xDel((void*)z); + } + } + sqlite3VdbeMemSetNull(pMem); + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); + } + + /* The following block sets the new values of Mem.z and Mem.xDel. It + ** also sets a flag in local variable "flags" to indicate the memory + ** management (one of MEM_Dyn or MEM_Static). + */ + if( xDel==SQLITE_TRANSIENT ){ + i64 nAlloc = nByte; + if( flags&MEM_Term ){ + nAlloc += (enc==SQLITE_UTF8?1:2); + } + testcase( nAlloc==0 ); + testcase( nAlloc==31 ); + testcase( nAlloc==32 ); + if( sqlite3VdbeMemClearAndResize(pMem, (int)MAX(nAlloc,32)) ){ + return SQLITE_NOMEM_BKPT; + } + memcpy(pMem->z, z, nAlloc); + }else{ + sqlite3VdbeMemRelease(pMem); + pMem->z = (char *)z; + if( xDel==SQLITE_DYNAMIC ){ + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + }else{ + pMem->xDel = xDel; + flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + } + } + + pMem->n = (int)(nByte & 0x7fffffff); + pMem->flags = flags; + pMem->enc = enc; + +#ifndef SQLITE_OMIT_UTF16 + if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + return SQLITE_NOMEM_BKPT; + } +#endif + + + return SQLITE_OK; +} + +/* +** Move data out of a btree key or data field and into a Mem structure. +** The data is payload from the entry that pCur is currently pointing +** to. offset and amt determine what portion of the data or key to retrieve. +** The result is written into the pMem element. +** +** The pMem object must have been initialized. This routine will use +** pMem->zMalloc to hold the content from the btree, if possible. New +** pMem->zMalloc space will be allocated if necessary. The calling routine +** is responsible for making sure that the pMem object is eventually +** destroyed. +** +** If this routine fails for any reason (malloc returns NULL or unable +** to read from the disk) then the pMem is left in an inconsistent state. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 offset, /* Offset from the start of data to return bytes from. */ + u32 amt, /* Number of bytes to return. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + int rc; + pMem->flags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); + if( rc==SQLITE_OK ){ + pMem->z[amt] = 0; /* Overrun area used when reading malformed records */ + pMem->flags = MEM_Blob; + pMem->n = (int)amt; + }else{ + sqlite3VdbeMemRelease(pMem); + } + } + return rc; +} +SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 amt, /* Number of bytes to return. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + u32 available = 0; /* Number of bytes available on the local btree page */ + int rc = SQLITE_OK; /* Return code */ + + assert( sqlite3BtreeCursorIsValid(pCur) ); + assert( !VdbeMemDynamic(pMem) ); + + /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() + ** that both the BtShared and database handle mutexes are held. */ + assert( !sqlite3VdbeMemIsRowSet(pMem) ); + pMem->z = (char *)sqlite3BtreePayloadFetch(pCur, &available); + assert( pMem->z!=0 ); + + if( amt<=available ){ + pMem->flags = MEM_Blob|MEM_Ephem; + pMem->n = (int)amt; + }else{ + rc = sqlite3VdbeMemFromBtree(pCur, 0, amt, pMem); + } + + return rc; +} + +/* +** The pVal argument is known to be a value other than NULL. +** Convert it into a string with encoding enc and return a pointer +** to a zero-terminated version of that string. +*/ +static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ + assert( pVal!=0 ); + assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) ); + assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); + assert( !sqlite3VdbeMemIsRowSet(pVal) ); + assert( (pVal->flags & (MEM_Null))==0 ); + if( pVal->flags & (MEM_Blob|MEM_Str) ){ + if( ExpandBlob(pVal) ) return 0; + pVal->flags |= MEM_Str; + if( pVal->enc != (enc & ~SQLITE_UTF16_ALIGNED) ){ + sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED); + } + if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){ + assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 ); + if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){ + return 0; + } + } + sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-31275-44060 */ + }else{ + sqlite3VdbeMemStringify(pVal, enc, 0); + assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) ); + } + assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0 + || pVal->db->mallocFailed ); + if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){ + assert( sqlite3VdbeMemValidStrRep(pVal) ); + return pVal->z; + }else{ + return 0; + } +} + +/* This function is only available internally, it is not part of the +** external API. It works in a similar way to sqlite3_value_text(), +** except the data returned is in the encoding specified by the second +** parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or +** SQLITE_UTF8. +** +** (2006-02-16:) The enc value can be or-ed with SQLITE_UTF16_ALIGNED. +** If that is the case, then the result must be aligned on an even byte +** boundary. +*/ +SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ + if( !pVal ) return 0; + assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) ); + assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); + assert( !sqlite3VdbeMemIsRowSet(pVal) ); + if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){ + assert( sqlite3VdbeMemValidStrRep(pVal) ); + return pVal->z; + } + if( pVal->flags&MEM_Null ){ + return 0; + } + return valueToText(pVal, enc); +} + +/* +** Create a new sqlite3_value object. +*/ +SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ + Mem *p = sqlite3DbMallocZero(db, sizeof(*p)); + if( p ){ + p->flags = MEM_Null; + p->db = db; + } + return p; +} + +/* +** Context object passed by sqlite3Stat4ProbeSetValue() through to +** valueNew(). See comments above valueNew() for details. +*/ +struct ValueNewStat4Ctx { + Parse *pParse; + Index *pIdx; + UnpackedRecord **ppRec; + int iVal; +}; + +/* +** Allocate and return a pointer to a new sqlite3_value object. If +** the second argument to this function is NULL, the object is allocated +** by calling sqlite3ValueNew(). +** +** Otherwise, if the second argument is non-zero, then this function is +** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not +** already been allocated, allocate the UnpackedRecord structure that +** that function will return to its caller here. Then return a pointer to +** an sqlite3_value within the UnpackedRecord.a[] array. +*/ +static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ +#ifdef SQLITE_ENABLE_STAT4 + if( p ){ + UnpackedRecord *pRec = p->ppRec[0]; + + if( pRec==0 ){ + Index *pIdx = p->pIdx; /* Index being probed */ + int nByte; /* Bytes of space to allocate */ + int i; /* Counter variable */ + int nCol = pIdx->nColumn; /* Number of index columns including rowid */ + + nByte = sizeof(Mem) * nCol + ROUND8(sizeof(UnpackedRecord)); + pRec = (UnpackedRecord*)sqlite3DbMallocZero(db, nByte); + if( pRec ){ + pRec->pKeyInfo = sqlite3KeyInfoOfIndex(p->pParse, pIdx); + if( pRec->pKeyInfo ){ + assert( pRec->pKeyInfo->nAllField==nCol ); + assert( pRec->pKeyInfo->enc==ENC(db) ); + pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); + for(i=0; iaMem[i].flags = MEM_Null; + pRec->aMem[i].db = db; + } + }else{ + sqlite3DbFreeNN(db, pRec); + pRec = 0; + } + } + if( pRec==0 ) return 0; + p->ppRec[0] = pRec; + } + + pRec->nField = p->iVal+1; + return &pRec->aMem[p->iVal]; + } +#else + UNUSED_PARAMETER(p); +#endif /* defined(SQLITE_ENABLE_STAT4) */ + return sqlite3ValueNew(db); +} + +/* +** The expression object indicated by the second argument is guaranteed +** to be a scalar SQL function. If +** +** * all function arguments are SQL literals, +** * one of the SQLITE_FUNC_CONSTANT or _SLOCHNG function flags is set, and +** * the SQLITE_FUNC_NEEDCOLL function flag is not set, +** +** then this routine attempts to invoke the SQL function. Assuming no +** error occurs, output parameter (*ppVal) is set to point to a value +** object containing the result before returning SQLITE_OK. +** +** Affinity aff is applied to the result of the function before returning. +** If the result is a text value, the sqlite3_value object uses encoding +** enc. +** +** If the conditions above are not met, this function returns SQLITE_OK +** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to +** NULL and an SQLite error code returned. +*/ +#ifdef SQLITE_ENABLE_STAT4 +static int valueFromFunction( + sqlite3 *db, /* The database connection */ + const Expr *p, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 aff, /* Affinity to use */ + sqlite3_value **ppVal, /* Write the new value here */ + struct ValueNewStat4Ctx *pCtx /* Second argument for valueNew() */ +){ + sqlite3_context ctx; /* Context object for function invocation */ + sqlite3_value **apVal = 0; /* Function arguments */ + int nVal = 0; /* Size of apVal[] array */ + FuncDef *pFunc = 0; /* Function definition */ + sqlite3_value *pVal = 0; /* New value */ + int rc = SQLITE_OK; /* Return code */ + ExprList *pList = 0; /* Function arguments */ + int i; /* Iterator variable */ + + assert( pCtx!=0 ); + assert( (p->flags & EP_TokenOnly)==0 ); + assert( ExprUseXList(p) ); + pList = p->x.pList; + if( pList ) nVal = pList->nExpr; + assert( !ExprHasProperty(p, EP_IntValue) ); + pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); + assert( pFunc ); + if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 + || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + ){ + return SQLITE_OK; + } + + if( pList ){ + apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal); + if( apVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + for(i=0; ia[i].pExpr, enc, aff, &apVal[i]); + if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; + } + } + + pVal = valueNew(db, pCtx); + if( pVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + + testcase( pCtx->pParse->rc==SQLITE_ERROR ); + testcase( pCtx->pParse->rc==SQLITE_OK ); + memset(&ctx, 0, sizeof(ctx)); + ctx.pOut = pVal; + ctx.pFunc = pFunc; + ctx.enc = ENC(db); + pFunc->xSFunc(&ctx, nVal, apVal); + if( ctx.isError ){ + rc = ctx.isError; + sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal)); + }else{ + sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); + assert( rc==SQLITE_OK ); + rc = sqlite3VdbeChangeEncoding(pVal, enc); + if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ + rc = SQLITE_TOOBIG; + pCtx->pParse->nErr++; + } + } + pCtx->pParse->rc = rc; + + value_from_function_out: + if( rc!=SQLITE_OK ){ + pVal = 0; + } + if( apVal ){ + for(i=0; iop)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; + if( op==TK_REGISTER ) op = pExpr->op2; + + /* Compressed expressions only appear when parsing the DEFAULT clause + ** on a table column definition, and hence only when pCtx==0. This + ** check ensures that an EP_TokenOnly expression is never passed down + ** into valueFromFunction(). */ + assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 ); + + if( op==TK_CAST ){ + u8 aff; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + aff = sqlite3AffinityType(pExpr->u.zToken,0); + rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); + testcase( rc!=SQLITE_OK ); + if( *ppVal ){ + sqlite3VdbeMemCast(*ppVal, aff, enc); + sqlite3ValueApplyAffinity(*ppVal, affinity, enc); + } + return rc; + } + + /* Handle negative integers in a single step. This is needed in the + ** case when the value is -9223372036854775808. + */ + if( op==TK_UMINUS + && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){ + pExpr = pExpr->pLeft; + op = pExpr->op; + negInt = -1; + zNeg = "-"; + } + + if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ + pVal = valueNew(db, pCtx); + if( pVal==0 ) goto no_mem; + if( ExprHasProperty(pExpr, EP_IntValue) ){ + sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt); + }else{ + zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); + if( zVal==0 ) goto no_mem; + sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); + } + if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_BLOB ){ + sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); + }else{ + sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); + } + assert( (pVal->flags & MEM_IntReal)==0 ); + if( pVal->flags & (MEM_Int|MEM_IntReal|MEM_Real) ){ + testcase( pVal->flags & MEM_Int ); + testcase( pVal->flags & MEM_Real ); + pVal->flags &= ~MEM_Str; + } + if( enc!=SQLITE_UTF8 ){ + rc = sqlite3VdbeChangeEncoding(pVal, enc); + } + }else if( op==TK_UMINUS ) { + /* This branch happens for multiple negative signs. Ex: -(-5) */ + if( SQLITE_OK==valueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal,pCtx) + && pVal!=0 + ){ + sqlite3VdbeMemNumerify(pVal); + if( pVal->flags & MEM_Real ){ + pVal->u.r = -pVal->u.r; + }else if( pVal->u.i==SMALLEST_INT64 ){ +#ifndef SQLITE_OMIT_FLOATING_POINT + pVal->u.r = -(double)SMALLEST_INT64; +#else + pVal->u.r = LARGEST_INT64; +#endif + MemSetTypeFlag(pVal, MEM_Real); + }else{ + pVal->u.i = -pVal->u.i; + } + sqlite3ValueApplyAffinity(pVal, affinity, enc); + } + }else if( op==TK_NULL ){ + pVal = valueNew(db, pCtx); + if( pVal==0 ) goto no_mem; + sqlite3VdbeMemSetNull(pVal); + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + else if( op==TK_BLOB ){ + int nVal; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); + assert( pExpr->u.zToken[1]=='\'' ); + pVal = valueNew(db, pCtx); + if( !pVal ) goto no_mem; + zVal = &pExpr->u.zToken[2]; + nVal = sqlite3Strlen30(zVal)-1; + assert( zVal[nVal]=='\'' ); + sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2, + 0, SQLITE_DYNAMIC); + } +#endif +#ifdef SQLITE_ENABLE_STAT4 + else if( op==TK_FUNCTION && pCtx!=0 ){ + rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); + } +#endif + else if( op==TK_TRUEFALSE ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } + } + + *ppVal = pVal; + return rc; + +no_mem: +#ifdef SQLITE_ENABLE_STAT4 + if( pCtx==0 || NEVER(pCtx->pParse->nErr==0) ) +#endif + sqlite3OomFault(db); + sqlite3DbFree(db, zVal); + assert( *ppVal==0 ); +#ifdef SQLITE_ENABLE_STAT4 + if( pCtx==0 ) sqlite3ValueFree(pVal); +#else + assert( pCtx==0 ); sqlite3ValueFree(pVal); +#endif + return SQLITE_NOMEM_BKPT; +} + +/* +** Create a new sqlite3_value object, containing the value of pExpr. +** +** This only works for very simple expressions that consist of one constant +** token (i.e. "5", "5.1", "'a string'"). If the expression can +** be converted directly into a value, then the value is allocated and +** a pointer written to *ppVal. The caller is responsible for deallocating +** the value by passing it to sqlite3ValueFree() later on. If the expression +** cannot be converted to a value, then *ppVal is set to NULL. +*/ +SQLITE_PRIVATE int sqlite3ValueFromExpr( + sqlite3 *db, /* The database connection */ + const Expr *pExpr, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 affinity, /* Affinity to use */ + sqlite3_value **ppVal /* Write the new value here */ +){ + return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; +} + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Attempt to extract a value from pExpr and use it to construct *ppVal. +** +** If pAlloc is not NULL, then an UnpackedRecord object is created for +** pAlloc if one does not exist and the new value is added to the +** UnpackedRecord object. +** +** A value is extracted in the following cases: +** +** * (pExpr==0). In this case the value is assumed to be an SQL NULL, +** +** * The expression is a bound variable, and this is a reprepare, or +** +** * The expression is a literal value. +** +** On success, *ppVal is made to point to the extracted value. The caller +** is responsible for ensuring that the value is eventually freed. +*/ +static int stat4ValueFromExpr( + Parse *pParse, /* Parse context */ + Expr *pExpr, /* The expression to extract a value from */ + u8 affinity, /* Affinity to use */ + struct ValueNewStat4Ctx *pAlloc,/* How to allocate space. Or NULL */ + sqlite3_value **ppVal /* OUT: New value object (or NULL) */ +){ + int rc = SQLITE_OK; + sqlite3_value *pVal = 0; + sqlite3 *db = pParse->db; + + /* Skip over any TK_COLLATE nodes */ + pExpr = sqlite3ExprSkipCollate(pExpr); + + assert( pExpr==0 || pExpr->op!=TK_REGISTER || pExpr->op2!=TK_VARIABLE ); + if( !pExpr ){ + pVal = valueNew(db, pAlloc); + if( pVal ){ + sqlite3VdbeMemSetNull((Mem*)pVal); + } + }else if( pExpr->op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ + Vdbe *v; + int iBindVar = pExpr->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iBindVar); + if( (v = pParse->pReprepare)!=0 ){ + pVal = valueNew(db, pAlloc); + if( pVal ){ + rc = sqlite3VdbeMemCopy((Mem*)pVal, &v->aVar[iBindVar-1]); + sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); + pVal->db = pParse->db; + } + } + }else{ + rc = valueFromExpr(db, pExpr, ENC(db), affinity, &pVal, pAlloc); + } + + assert( pVal==0 || pVal->db==db ); + *ppVal = pVal; + return rc; +} + +/* +** This function is used to allocate and populate UnpackedRecord +** structures intended to be compared against sample index keys stored +** in the sqlite_stat4 table. +** +** A single call to this function populates zero or more fields of the +** record starting with field iVal (fields are numbered from left to +** right starting with 0). A single field is populated if: +** +** * (pExpr==0). In this case the value is assumed to be an SQL NULL, +** +** * The expression is a bound variable, and this is a reprepare, or +** +** * The sqlite3ValueFromExpr() function is able to extract a value +** from the expression (i.e. the expression is a literal value). +** +** Or, if pExpr is a TK_VECTOR, one field is populated for each of the +** vector components that match either of the two latter criteria listed +** above. +** +** Before any value is appended to the record, the affinity of the +** corresponding column within index pIdx is applied to it. Before +** this function returns, output parameter *pnExtract is set to the +** number of values appended to the record. +** +** When this function is called, *ppRec must either point to an object +** allocated by an earlier call to this function, or must be NULL. If it +** is NULL and a value can be successfully extracted, a new UnpackedRecord +** is allocated (and *ppRec set to point to it) before returning. +** +** Unless an error is encountered, SQLITE_OK is returned. It is not an +** error if a value cannot be extracted from pExpr. If an error does +** occur, an SQLite error code is returned. +*/ +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse *pParse, /* Parse context */ + Index *pIdx, /* Index being probed */ + UnpackedRecord **ppRec, /* IN/OUT: Probe record */ + Expr *pExpr, /* The expression to extract a value from */ + int nElem, /* Maximum number of values to append */ + int iVal, /* Array element to populate */ + int *pnExtract /* OUT: Values appended to the record */ +){ + int rc = SQLITE_OK; + int nExtract = 0; + + if( pExpr==0 || pExpr->op!=TK_SELECT ){ + int i; + struct ValueNewStat4Ctx alloc; + + alloc.pParse = pParse; + alloc.pIdx = pIdx; + alloc.ppRec = ppRec; + + for(i=0; idb, pIdx, iVal+i); + alloc.iVal = iVal+i; + rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc, &pVal); + if( !pVal ) break; + nExtract++; + } + } + + *pnExtract = nExtract; + return rc; +} + +/* +** Attempt to extract a value from expression pExpr using the methods +** as described for sqlite3Stat4ProbeSetValue() above. +** +** If successful, set *ppVal to point to a new value object and return +** SQLITE_OK. If no value can be extracted, but no other error occurs +** (e.g. OOM), return SQLITE_OK and set *ppVal to NULL. Or, if an error +** does occur, return an SQLite error code. The final value of *ppVal +** is undefined in this case. +*/ +SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr( + Parse *pParse, /* Parse context */ + Expr *pExpr, /* The expression to extract a value from */ + u8 affinity, /* Affinity to use */ + sqlite3_value **ppVal /* OUT: New value object (or NULL) */ +){ + return stat4ValueFromExpr(pParse, pExpr, affinity, 0, ppVal); +} + +/* +** Extract the iCol-th column from the nRec-byte record in pRec. Write +** the column value into *ppVal. If *ppVal is initially NULL then a new +** sqlite3_value object is allocated. +** +** If *ppVal is initially NULL then the caller is responsible for +** ensuring that the value written into *ppVal is eventually freed. +*/ +SQLITE_PRIVATE int sqlite3Stat4Column( + sqlite3 *db, /* Database handle */ + const void *pRec, /* Pointer to buffer containing record */ + int nRec, /* Size of buffer pRec in bytes */ + int iCol, /* Column to extract */ + sqlite3_value **ppVal /* OUT: Extracted value */ +){ + u32 t = 0; /* a column type code */ + int nHdr; /* Size of the header in the record */ + int iHdr; /* Next unread header byte */ + int iField; /* Next unread data byte */ + int szField = 0; /* Size of the current data field */ + int i; /* Column index */ + u8 *a = (u8*)pRec; /* Typecast byte array */ + Mem *pMem = *ppVal; /* Write result into this Mem object */ + + assert( iCol>0 ); + iHdr = getVarint32(a, nHdr); + if( nHdr>nRec || iHdr>=nHdr ) return SQLITE_CORRUPT_BKPT; + iField = nHdr; + for(i=0; i<=iCol; i++){ + iHdr += getVarint32(&a[iHdr], t); + testcase( iHdr==nHdr ); + testcase( iHdr==nHdr+1 ); + if( iHdr>nHdr ) return SQLITE_CORRUPT_BKPT; + szField = sqlite3VdbeSerialTypeLen(t); + iField += szField; + } + testcase( iField==nRec ); + testcase( iField==nRec+1 ); + if( iField>nRec ) return SQLITE_CORRUPT_BKPT; + if( pMem==0 ){ + pMem = *ppVal = sqlite3ValueNew(db); + if( pMem==0 ) return SQLITE_NOMEM_BKPT; + } + sqlite3VdbeSerialGet(&a[iField-szField], t, pMem); + pMem->enc = ENC(db); + return SQLITE_OK; +} + +/* +** Unless it is NULL, the argument must be an UnpackedRecord object returned +** by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes +** the object. +*/ +SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ + if( pRec ){ + int i; + int nCol = pRec->pKeyInfo->nAllField; + Mem *aMem = pRec->aMem; + sqlite3 *db = aMem[0].db; + for(i=0; ipKeyInfo); + sqlite3DbFreeNN(db, pRec); + } +} +#endif /* ifdef SQLITE_ENABLE_STAT4 */ + +/* +** Change the string value of an sqlite3_value object +*/ +SQLITE_PRIVATE void sqlite3ValueSetStr( + sqlite3_value *v, /* Value to be set */ + int n, /* Length of string z */ + const void *z, /* Text of the new string */ + u8 enc, /* Encoding to use */ + void (*xDel)(void*) /* Destructor for the string */ +){ + if( v ) sqlite3VdbeMemSetStr((Mem *)v, z, n, enc, xDel); +} + +/* +** Free an sqlite3_value object +*/ +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){ + if( !v ) return; + sqlite3VdbeMemRelease((Mem *)v); + sqlite3DbFreeNN(((Mem*)v)->db, v); +} + +/* +** The sqlite3ValueBytes() routine returns the number of bytes in the +** sqlite3_value object assuming that it uses the encoding "enc". +** The valueBytes() routine is a helper function. +*/ +static SQLITE_NOINLINE int valueBytes(sqlite3_value *pVal, u8 enc){ + return valueToText(pVal, enc)!=0 ? pVal->n : 0; +} +SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ + Mem *p = (Mem*)pVal; + assert( (p->flags & MEM_Null)==0 || (p->flags & (MEM_Str|MEM_Blob))==0 ); + if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){ + return p->n; + } + if( (p->flags & MEM_Blob)!=0 ){ + if( p->flags & MEM_Zero ){ + return p->n + p->u.nZero; + }else{ + return p->n; + } + } + if( p->flags & MEM_Null ) return 0; + return valueBytes(pVal, enc); +} + +/************** End of vdbemem.c *********************************************/ +/************** Begin file vdbeaux.c *****************************************/ +/* +** 2003 September 6 +** +** 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 contains code used for creating, destroying, and populating +** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* Forward references */ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef); +static void vdbeFreeOpArray(sqlite3 *, Op *, int); + +/* +** Create a new virtual database engine. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ + sqlite3 *db = pParse->db; + Vdbe *p; + p = sqlite3DbMallocRawNN(db, sizeof(Vdbe) ); + if( p==0 ) return 0; + memset(&p->aOp, 0, sizeof(Vdbe)-offsetof(Vdbe,aOp)); + p->db = db; + if( db->pVdbe ){ + db->pVdbe->pPrev = p; + } + p->pNext = db->pVdbe; + p->pPrev = 0; + db->pVdbe = p; + assert( p->eVdbeState==VDBE_INIT_STATE ); + p->pParse = pParse; + pParse->pVdbe = p; + assert( pParse->aLabel==0 ); + assert( pParse->nLabel==0 ); + assert( p->nOpAlloc==0 ); + assert( pParse->szOpAlloc==0 ); + sqlite3VdbeAddOp2(p, OP_Init, 0, 1); + return p; +} + +/* +** Return the Parse object that owns a Vdbe object. +*/ +SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe *p){ + return p->pParse; +} + +/* +** Change the error string stored in Vdbe.zErrMsg +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe *p, const char *zFormat, ...){ + va_list ap; + sqlite3DbFree(p->db, p->zErrMsg); + va_start(ap, zFormat); + p->zErrMsg = sqlite3VMPrintf(p->db, zFormat, ap); + va_end(ap); +} + +/* +** Remember the SQL string for a prepared statement. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlags){ + if( p==0 ) return; + p->prepFlags = prepFlags; + if( (prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){ + p->expmask = 0; + } + assert( p->zSql==0 ); + p->zSql = sqlite3DbStrNDup(p->db, z, n); +} + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Add a new element to the Vdbe->pDblStr list. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ + if( p ){ + int n = sqlite3Strlen30(z); + DblquoteStr *pStr = sqlite3DbMallocRawNN(db, + sizeof(*pStr)+n+1-sizeof(pStr->z)); + if( pStr ){ + pStr->pNextStr = p->pDblStr; + p->pDblStr = pStr; + memcpy(pStr->z, z, n+1); + } + } +} +#endif + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** zId of length nId is a double-quoted identifier. Check to see if +** that identifier is really used as a string literal. +*/ +SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString( + Vdbe *pVdbe, /* The prepared statement */ + const char *zId /* The double-quoted identifier, already dequoted */ +){ + DblquoteStr *pStr; + assert( zId!=0 ); + if( pVdbe->pDblStr==0 ) return 0; + for(pStr=pVdbe->pDblStr; pStr; pStr=pStr->pNextStr){ + if( strcmp(zId, pStr->z)==0 ) return 1; + } + return 0; +} +#endif + +/* +** Swap all content between two VDBE structures. +*/ +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ + Vdbe tmp, *pTmp; + char *zTmp; + assert( pA->db==pB->db ); + tmp = *pA; + *pA = *pB; + *pB = tmp; + pTmp = pA->pNext; + pA->pNext = pB->pNext; + pB->pNext = pTmp; + pTmp = pA->pPrev; + pA->pPrev = pB->pPrev; + pB->pPrev = pTmp; + zTmp = pA->zSql; + pA->zSql = pB->zSql; + pB->zSql = zTmp; +#ifdef SQLITE_ENABLE_NORMALIZE + zTmp = pA->zNormSql; + pA->zNormSql = pB->zNormSql; + pB->zNormSql = zTmp; +#endif + pB->expmask = pA->expmask; + pB->prepFlags = pA->prepFlags; + memcpy(pB->aCounter, pA->aCounter, sizeof(pB->aCounter)); + pB->aCounter[SQLITE_STMTSTATUS_REPREPARE]++; +} + +/* +** Resize the Vdbe.aOp array so that it is at least nOp elements larger +** than its current size. nOp is guaranteed to be less than or equal +** to 1024/sizeof(Op). +** +** If an out-of-memory error occurs while resizing the array, return +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain +** unchanged (this is so that any opcodes already allocated can be +** correctly deallocated along with the rest of the Vdbe). +*/ +static int growOpArray(Vdbe *v, int nOp){ + VdbeOp *pNew; + Parse *p = v->pParse; + + /* The SQLITE_TEST_REALLOC_STRESS compile-time option is designed to force + ** more frequent reallocs and hence provide more opportunities for + ** simulated OOM faults. SQLITE_TEST_REALLOC_STRESS is generally used + ** during testing only. With SQLITE_TEST_REALLOC_STRESS grow the op array + ** by the minimum* amount required until the size reaches 512. Normal + ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current + ** size of the op array or add 1KB of space, whichever is smaller. */ +#ifdef SQLITE_TEST_REALLOC_STRESS + sqlite3_int64 nNew = (v->nOpAlloc>=512 ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)v->nOpAlloc+nOp); +#else + sqlite3_int64 nNew = (v->nOpAlloc ? 2*(sqlite3_int64)v->nOpAlloc + : (sqlite3_int64)(1024/sizeof(Op))); + UNUSED_PARAMETER(nOp); +#endif + + /* Ensure that the size of a VDBE does not grow too large */ + if( nNew > p->db->aLimit[SQLITE_LIMIT_VDBE_OP] ){ + sqlite3OomFault(p->db); + return SQLITE_NOMEM; + } + + assert( nOp<=(int)(1024/sizeof(Op)) ); + assert( nNew>=(v->nOpAlloc+nOp) ); + pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); + if( pNew ){ + p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); + v->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->aOp = pNew; + } + return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); +} + +#ifdef SQLITE_DEBUG +/* This routine is just a convenient place to set a breakpoint that will +** fire after each opcode is inserted and displayed using +** "PRAGMA vdbe_addoptrace=on". Parameters "pc" (program counter) and +** pOp are available to make the breakpoint conditional. +** +** Other useful labels for breakpoints include: +** test_trace_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_addop_breakpoint(int pc, Op *pOp){ + static int n = 0; + n++; +} +#endif + +/* +** Add a new instruction to the list of instructions current in the +** VDBE. Return the address of the new instruction. +** +** Parameters: +** +** p Pointer to the VDBE +** +** op The opcode for this instruction +** +** p1, p2, p3 Operands +** +** Use the sqlite3VdbeResolveLabel() function to fix an address and +** the sqlite3VdbeChangeP4() function to change the value of the P4 +** operand. +*/ +static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ + assert( p->nOpAlloc<=p->nOp ); + if( growOpArray(p, 1) ) return 1; + assert( p->nOpAlloc>p->nOp ); + return sqlite3VdbeAddOp3(p, op, p1, p2, p3); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ + int i; + VdbeOp *pOp; + + i = p->nOp; + assert( p->eVdbeState==VDBE_INIT_STATE ); + assert( op>=0 && op<0xff ); + if( p->nOpAlloc<=i ){ + return growOp3(p, op, p1, p2, p3); + } + assert( p->aOp!=0 ); + p->nOp++; + pOp = &p->aOp[i]; + assert( pOp!=0 ); + pOp->opcode = (u8)op; + pOp->p5 = 0; + pOp->p1 = p1; + pOp->p2 = p2; + pOp->p3 = p3; + pOp->p4.p = 0; + pOp->p4type = P4_NOTUSED; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOp->zComment = 0; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i, &p->aOp[i]); + test_addop_breakpoint(i, &p->aOp[i]); + } +#endif +#ifdef VDBE_PROFILE + pOp->cycles = 0; + pOp->cnt = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOp->iSrcLine = 0; +#endif + return i; +} +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){ + return sqlite3VdbeAddOp3(p, op, 0, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe *p, int op, int p1){ + return sqlite3VdbeAddOp3(p, op, p1, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){ + return sqlite3VdbeAddOp3(p, op, p1, p2, 0); +} + +/* Generate code for an unconditional jump to instruction iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe *p, int iDest){ + return sqlite3VdbeAddOp3(p, OP_Goto, 0, iDest, 0); +} + +/* Generate code to cause the string zStr to be loaded into +** register iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){ + return sqlite3VdbeAddOp4(p, OP_String8, 0, iDest, 0, zStr, 0); +} + +/* +** Generate code that initializes multiple registers to string or integer +** constants. The registers begin with iDest and increase consecutively. +** One register is initialized for each characgter in zTypes[]. For each +** "s" character in zTypes[], the register is a string if the argument is +** not NULL, or OP_Null if the value is a null pointer. For each "i" character +** in zTypes[], the register is initialized to an integer. +** +** If the input string does not end with "X" then an OP_ResultRow instruction +** is generated for the values inserted. +*/ +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){ + va_list ap; + int i; + char c; + va_start(ap, zTypes); + for(i=0; (c = zTypes[i])!=0; i++){ + if( c=='s' ){ + const char *z = va_arg(ap, const char*); + sqlite3VdbeAddOp4(p, z==0 ? OP_Null : OP_String8, 0, iDest+i, 0, z, 0); + }else if( c=='i' ){ + sqlite3VdbeAddOp2(p, OP_Integer, va_arg(ap, int), iDest+i); + }else{ + goto skip_op_resultrow; + } + } + sqlite3VdbeAddOp2(p, OP_ResultRow, iDest, i); +skip_op_resultrow: + va_end(ap); +} + +/* +** Add an opcode that includes the p4 value as a pointer. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + const char *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + sqlite3VdbeChangeP4(p, addr, zP4, p4type); + return addr; +} + +/* +** Add an OP_Function or OP_PureFunc opcode. +** +** The eCallCtx argument is information (typically taken from Expr.op2) +** that describes the calling context of the function. 0 means a general +** function call. NC_IsCheck means called by a check constraint, +** NC_IdxExpr means called as part of an index expression. NC_PartIdx +** means in the WHERE clause of a partial index. NC_GenCol means called +** while computing a generated column value. 0 is the usual case. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( + Parse *pParse, /* Parsing context */ + int p1, /* Constant argument mask */ + int p2, /* First argument register */ + int p3, /* Register into which results are written */ + int nArg, /* Number of argument */ + const FuncDef *pFunc, /* The function to be invoked */ + int eCallCtx /* Calling context */ +){ + Vdbe *v = pParse->pVdbe; + int nByte; + int addr; + sqlite3_context *pCtx; + assert( v ); + nByte = sizeof(*pCtx) + (nArg-1)*sizeof(sqlite3_value*); + pCtx = sqlite3DbMallocRawNN(pParse->db, nByte); + if( pCtx==0 ){ + assert( pParse->db->mallocFailed ); + freeEphemeralFunction(pParse->db, (FuncDef*)pFunc); + return 0; + } + pCtx->pOut = 0; + pCtx->pFunc = (FuncDef*)pFunc; + pCtx->pVdbe = 0; + pCtx->isError = 0; + pCtx->argc = nArg; + pCtx->iOp = sqlite3VdbeCurrentAddr(v); + addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, + p1, p2, p3, (char*)pCtx, P4_FUNCCTX); + sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); + return addr; +} + +/* +** Add an opcode that includes the p4 value with a P4_INT64 or +** P4_REAL type. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + const u8 *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + char *p4copy = sqlite3DbMallocRawNN(sqlite3VdbeDb(p), 8); + if( p4copy ) memcpy(p4copy, zP4, 8); + return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type); +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Return the address of the current EXPLAIN QUERY PLAN baseline. +** 0 means "none". +*/ +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){ + VdbeOp *pOp; + if( pParse->addrExplain==0 ) return 0; + pOp = sqlite3VdbeGetOp(pParse->pVdbe, pParse->addrExplain); + return pOp->p2; +} + +/* +** Set a debugger breakpoint on the following routine in order to +** monitor the EXPLAIN QUERY PLAN code generation. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ + (void)z1; + (void)z2; +} +#endif + +/* +** Add a new OP_Explain opcode. +** +** If the bPush flag is true, then make this opcode the parent for +** subsequent Explains until sqlite3VdbeExplainPop() is called. +*/ +SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ +#ifndef SQLITE_DEBUG + /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. + ** But omit them (for performance) during production builds */ + if( pParse->explain==2 ) +#endif + { + char *zMsg; + Vdbe *v; + va_list ap; + int iThis; + va_start(ap, zFmt); + zMsg = sqlite3VMPrintf(pParse->db, zFmt, ap); + va_end(ap); + v = pParse->pVdbe; + iThis = v->nOp; + sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, + zMsg, P4_DYNAMIC); + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + if( bPush){ + pParse->addrExplain = iThis; + } + } +} + +/* +** Pop the EXPLAIN QUERY PLAN stack one level. +*/ +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ + sqlite3ExplainBreakpoint("POP", 0); + pParse->addrExplain = sqlite3VdbeExplainParent(pParse); +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +/* +** Add an OP_ParseSchema opcode. This routine is broken out from +** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees +** as having been used. +** +** The zWhere string must have been obtained from sqlite3_malloc(). +** This routine will take ownership of the allocated memory. +*/ +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere, u16 p5){ + int j; + sqlite3VdbeAddOp4(p, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC); + sqlite3VdbeChangeP5(p, p5); + for(j=0; jdb->nDb; j++) sqlite3VdbeUsesBtree(p, j); + sqlite3MayAbort(p->pParse); +} + +/* +** Add an opcode that includes the p4 value as an integer. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + int p4 /* The P4 operand as an integer */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + if( p->db->mallocFailed==0 ){ + VdbeOp *pOp = &p->aOp[addr]; + pOp->p4type = P4_INT32; + pOp->p4.i = p4; + } + return addr; +} + +/* Insert the end of a co-routine +*/ +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + + /* Clear the temporary register cache, thereby ensuring that each + ** co-routine has its own independent set of registers, because co-routines + ** might expect their registers to be preserved across an OP_Yield, and + ** that could cause problems if two or more co-routines are using the same + ** temporary register. + */ + v->pParse->nTempReg = 0; + v->pParse->nRangeReg = 0; +} + +/* +** Create a new symbolic label for an instruction that has yet to be +** coded. The symbolic label is really just a negative number. The +** label can be used as the P2 value of an operation. Later, when +** the label is resolved to a specific address, the VDBE will scan +** through its operation list and change all values of P2 which match +** the label into the resolved address. +** +** The VDBE knows that a P2 value is a label because labels are +** always negative and P2 values are suppose to be non-negative. +** Hence, a negative P2 value is a label that has yet to be resolved. +** (Later:) This is only true for opcodes that have the OPFLG_JUMP +** property. +** +** Variable usage notes: +** +** Parse.aLabel[x] Stores the address that the x-th label resolves +** into. For testing (SQLITE_DEBUG), unresolved +** labels stores -1, but that is not required. +** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] +** Parse.nLabel The *negative* of the number of labels that have +** been issued. The negative is stored because +** that gives a performance improvement over storing +** the equivalent positive value. +*/ +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse *pParse){ + return --pParse->nLabel; +} + +/* +** Resolve label "x" to be the address of the next instruction to +** be inserted. The parameter "x" must have been obtained from +** a prior call to sqlite3VdbeMakeLabel(). +*/ +static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ + int nNewSize = 10 - p->nLabel; + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + nNewSize*sizeof(p->aLabel[0])); + if( p->aLabel==0 ){ + p->nLabelAlloc = 0; + }else{ +#ifdef SQLITE_DEBUG + int i; + for(i=p->nLabelAlloc; iaLabel[i] = -1; +#endif + p->nLabelAlloc = nNewSize; + p->aLabel[j] = v->nOp; + } +} +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ + Parse *p = v->pParse; + int j = ADDR(x); + assert( v->eVdbeState==VDBE_INIT_STATE ); + assert( j<-p->nLabel ); + assert( j>=0 ); +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } +#endif + if( p->nLabelAlloc + p->nLabel < 0 ){ + resizeResolveLabel(p,v,j); + }else{ + assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ + p->aLabel[j] = v->nOp; + } +} + +/* +** Mark the VDBE as one that can only be run one time. +*/ +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ + sqlite3VdbeAddOp2(p, OP_Expire, 1, 1); +} + +/* +** Mark the VDBE as one that can be run multiple times. +*/ +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ + int i; + for(i=1; ALWAYS(inOp); i++){ + if( ALWAYS(p->aOp[i].opcode==OP_Expire) ){ + p->aOp[1].opcode = OP_Noop; + break; + } + } +} + +#ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */ + +/* +** The following type and function are used to iterate through all opcodes +** in a Vdbe main program and each of the sub-programs (triggers) it may +** invoke directly or indirectly. It should be used as follows: +** +** Op *pOp; +** VdbeOpIter sIter; +** +** memset(&sIter, 0, sizeof(sIter)); +** sIter.v = v; // v is of type Vdbe* +** while( (pOp = opIterNext(&sIter)) ){ +** // Do something with pOp +** } +** sqlite3DbFree(v->db, sIter.apSub); +** +*/ +typedef struct VdbeOpIter VdbeOpIter; +struct VdbeOpIter { + Vdbe *v; /* Vdbe to iterate through the opcodes of */ + SubProgram **apSub; /* Array of subprograms */ + int nSub; /* Number of entries in apSub */ + int iAddr; /* Address of next instruction to return */ + int iSub; /* 0 = main program, 1 = first sub-program etc. */ +}; +static Op *opIterNext(VdbeOpIter *p){ + Vdbe *v = p->v; + Op *pRet = 0; + Op *aOp; + int nOp; + + if( p->iSub<=p->nSub ){ + + if( p->iSub==0 ){ + aOp = v->aOp; + nOp = v->nOp; + }else{ + aOp = p->apSub[p->iSub-1]->aOp; + nOp = p->apSub[p->iSub-1]->nOp; + } + assert( p->iAddriAddr]; + p->iAddr++; + if( p->iAddr==nOp ){ + p->iSub++; + p->iAddr = 0; + } + + if( pRet->p4type==P4_SUBPROGRAM ){ + int nByte = (p->nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; jnSub; j++){ + if( p->apSub[j]==pRet->p4.pProgram ) break; + } + if( j==p->nSub ){ + p->apSub = sqlite3DbReallocOrFree(v->db, p->apSub, nByte); + if( !p->apSub ){ + pRet = 0; + }else{ + p->apSub[p->nSub++] = pRet->p4.pProgram; + } + } + } + } + + return pRet; +} + +/* +** Check if the program stored in the VM associated with pParse may +** throw an ABORT exception (causing the statement, but not entire transaction +** to be rolled back). This condition is true if the main program or any +** sub-programs contains any of the following: +** +** * OP_Halt with P1=SQLITE_CONSTRAINT and P2=OE_Abort. +** * OP_HaltIfNull with P1=SQLITE_CONSTRAINT and P2=OE_Abort. +** * OP_Destroy +** * OP_VUpdate +** * OP_VCreate +** * OP_VRename +** * OP_FkCounter with P2==0 (immediate foreign key constraint) +** * OP_CreateBtree/BTREE_INTKEY and OP_InitCoroutine +** (for CREATE TABLE AS SELECT ...) +** +** Then check that the value of Parse.mayAbort is true if an +** ABORT may be thrown, or false otherwise. Return true if it does +** match, or false otherwise. This function is intended to be used as +** part of an assert statement in the compiler. Similar to: +** +** assert( sqlite3VdbeAssertMayAbort(pParse->pVdbe, pParse->mayAbort) ); +*/ +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ + int hasAbort = 0; + int hasFkCounter = 0; + int hasCreateTable = 0; + int hasCreateIndex = 0; + int hasInitCoroutine = 0; + Op *pOp; + VdbeOpIter sIter; + + if( v==0 ) return 0; + memset(&sIter, 0, sizeof(sIter)); + sIter.v = v; + + while( (pOp = opIterNext(&sIter))!=0 ){ + int opcode = pOp->opcode; + if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || opcode==OP_VDestroy + || opcode==OP_VCreate + || opcode==OP_ParseSchema + || ((opcode==OP_Halt || opcode==OP_HaltIfNull) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) + ){ + hasAbort = 1; + break; + } + if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; + if( mayAbort ){ + /* hasCreateIndex may also be set for some DELETE statements that use + ** OP_Clear. So this routine may end up returning true in the case + ** where a "DELETE FROM tbl" has a statement-journal but does not + ** require one. This is not so bad - it is an inefficiency, not a bug. */ + if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( opcode==OP_Clear ) hasCreateIndex = 1; + } + if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ + hasFkCounter = 1; + } +#endif + } + sqlite3DbFree(v->db, sIter.apSub); + + /* Return true if hasAbort==mayAbort. Or if a malloc failure occurred. + ** If malloc failed, then the while() loop above may not have iterated + ** through all opcodes and hasAbort may be set incorrectly. Return + ** true for this case to prevent the assert() in the callers frame + ** from failing. */ + return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter + || (hasCreateTable && hasInitCoroutine) || hasCreateIndex + ); +} +#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ + +#ifdef SQLITE_DEBUG +/* +** Increment the nWrite counter in the VDBE if the cursor is not an +** ephemeral cursor, or if the cursor argument is NULL. +*/ +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe *p, VdbeCursor *pC){ + if( pC==0 + || (pC->eCurType!=CURTYPE_SORTER + && pC->eCurType!=CURTYPE_PSEUDO + && !pC->isEphemeral) + ){ + p->nWrite++; + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Assert if an Abort at this point in time might result in a corrupt +** database. +*/ +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){ + assert( p->nWrite==0 || p->usesStmtJournal ); +} +#endif + +/* +** This routine is called after all opcodes have been inserted. It loops +** through all the opcodes and fixes up some details. +** +** (1) For each jump instruction with a negative P2 value (a label) +** resolve the P2 value to an actual address. +** +** (2) Compute the maximum number of arguments used by any SQL function +** and store that value in *pMaxFuncArgs. +** +** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately +** indicate what the prepared statement actually does. +** +** (4) (discontinued) +** +** (5) Reclaim the memory allocated for storing labels. +** +** This routine will only function correctly if the mkopcodeh.tcl generator +** script numbers the opcodes correctly. Changes to this routine must be +** coordinated with changes to mkopcodeh.tcl. +*/ +static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ + int nMaxArgs = *pMaxFuncArgs; + Op *pOp; + Parse *pParse = p->pParse; + int *aLabel = pParse->aLabel; + p->readOnly = 1; + p->bIsReader = 0; + pOp = &p->aOp[p->nOp-1]; + while(1){ + + /* Only JUMP opcodes and the short list of special opcodes in the switch + ** below need to be considered. The mkopcodeh.tcl generator script groups + ** all these opcodes together near the front of the opcode list. Skip + ** any opcode that does not need processing by virtual of the fact that + ** it is larger than SQLITE_MX_JUMP_OPCODE, as a performance optimization. + */ + if( pOp->opcode<=SQLITE_MX_JUMP_OPCODE ){ + /* NOTE: Be sure to update mkopcodeh.tcl when adding or removing + ** cases from this switch! */ + switch( pOp->opcode ){ + case OP_Transaction: { + if( pOp->p2!=0 ) p->readOnly = 0; + /* no break */ deliberate_fall_through + } + case OP_AutoCommit: + case OP_Savepoint: { + p->bIsReader = 1; + break; + } +#ifndef SQLITE_OMIT_WAL + case OP_Checkpoint: +#endif + case OP_Vacuum: + case OP_JournalMode: { + p->readOnly = 0; + p->bIsReader = 1; + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case OP_VUpdate: { + if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; + break; + } + case OP_VFilter: { + int n; + assert( (pOp - p->aOp) >= 3 ); + assert( pOp[-1].opcode==OP_Integer ); + n = pOp[-1].p1; + if( n>nMaxArgs ) nMaxArgs = n; + /* Fall through into the default case */ + /* no break */ deliberate_fall_through + } +#endif + default: { + if( pOp->p2<0 ){ + /* The mkopcodeh.tcl script has so arranged things that the only + ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to + ** have non-negative values for P2. */ + assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); + assert( ADDR(pOp->p2)<-pParse->nLabel ); + pOp->p2 = aLabel[ADDR(pOp->p2)]; + } + break; + } + } + /* The mkopcodeh.tcl script has so arranged things that the only + ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to + ** have non-negative values for P2. */ + assert( (sqlite3OpcodeProperty[pOp->opcode]&OPFLG_JUMP)==0 || pOp->p2>=0); + } + if( pOp==p->aOp ) break; + pOp--; + } + if( aLabel ){ + sqlite3DbFreeNN(p->db, pParse->aLabel); + pParse->aLabel = 0; + } + pParse->nLabel = 0; + *pMaxFuncArgs = nMaxArgs; + assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); +} + +#ifdef SQLITE_DEBUG +/* +** Check to see if a subroutine contains a jump to a location outside of +** the subroutine. If a jump outside the subroutine is detected, add code +** that will cause the program to halt with an error message. +** +** The subroutine consists of opcodes between iFirst and iLast. Jumps to +** locations within the subroutine are acceptable. iRetReg is a register +** that contains the return address. Jumps to outside the range of iFirst +** through iLast are also acceptable as long as the jump destination is +** an OP_Return to iReturnAddr. +** +** A jump to an unresolved label means that the jump destination will be +** beyond the current address. That is normally a jump to an early +** termination and is consider acceptable. +** +** This routine only runs during debug builds. The purpose is (of course) +** to detect invalid escapes out of a subroutine. The OP_Halt opcode +** is generated rather than an assert() or other error, so that ".eqp full" +** will still work to show the original bytecode, to aid in debugging. +*/ +SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn( + Vdbe *v, /* The byte-code program under construction */ + int iFirst, /* First opcode of the subroutine */ + int iLast, /* Last opcode of the subroutine */ + int iRetReg /* Subroutine return address register */ +){ + VdbeOp *pOp; + Parse *pParse; + int i; + sqlite3_str *pErr = 0; + assert( v!=0 ); + pParse = v->pParse; + assert( pParse!=0 ); + if( pParse->nErr ) return; + assert( iLast>=iFirst ); + assert( iLastnOp ); + pOp = &v->aOp[iFirst]; + for(i=iFirst; i<=iLast; i++, pOp++){ + if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ){ + int iDest = pOp->p2; /* Jump destination */ + if( iDest==0 ) continue; + if( pOp->opcode==OP_Gosub ) continue; + if( iDest<0 ){ + int j = ADDR(iDest); + assert( j>=0 ); + if( j>=-pParse->nLabel || pParse->aLabel[j]<0 ){ + continue; + } + iDest = pParse->aLabel[j]; + } + if( iDestiLast ){ + int j = iDest; + for(; jnOp; j++){ + VdbeOp *pX = &v->aOp[j]; + if( pX->opcode==OP_Return ){ + if( pX->p1==iRetReg ) break; + continue; + } + if( pX->opcode==OP_Noop ) continue; + if( pX->opcode==OP_Explain ) continue; + if( pErr==0 ){ + pErr = sqlite3_str_new(0); + }else{ + sqlite3_str_appendchar(pErr, 1, '\n'); + } + sqlite3_str_appendf(pErr, + "Opcode at %d jumps to %d which is outside the " + "subroutine at %d..%d", + i, iDest, iFirst, iLast); + break; + } + } + } + } + if( pErr ){ + char *zErr = sqlite3_str_finish(pErr); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_INTERNAL, OE_Abort, 0, zErr, 0); + sqlite3_free(zErr); + sqlite3MayAbort(pParse); + } +} +#endif /* SQLITE_DEBUG */ + +/* +** Return the address of the next instruction to be inserted. +*/ +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ + assert( p->eVdbeState==VDBE_INIT_STATE ); + return p->nOp; +} + +/* +** Verify that at least N opcode slots are available in p without +** having to malloc for more space (except when compiled using +** SQLITE_TEST_REALLOC_STRESS). This interface is used during testing +** to verify that certain calls to sqlite3VdbeAddOpList() can never +** fail due to a OOM fault and hence that the return value from +** sqlite3VdbeAddOpList() will always be non-NULL. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ + assert( p->nOp + N <= p->nOpAlloc ); +} +#endif + +/* +** Verify that the VM passed as the only argument does not contain +** an OP_ResultRow opcode. Fail an assert() if it does. This is used +** by code in pragma.c to ensure that the implementation of certain +** pragmas comports with the flags specified in the mkpragmatab.tcl +** script. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){ + int i; + for(i=0; inOp; i++){ + assert( p->aOp[i].opcode!=OP_ResultRow ); + } +} +#endif + +/* +** Generate code (a single OP_Abortable opcode) that will +** verify that the VDBE program can safely call Abort in the current +** context. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){ + if( onError==OE_Abort ) sqlite3VdbeAddOp0(p, OP_Abortable); +} +#endif + +/* +** This function returns a pointer to the array of opcodes associated with +** the Vdbe passed as the first argument. It is the callers responsibility +** to arrange for the returned array to be eventually freed using the +** vdbeFreeOpArray() function. +** +** Before returning, *pnOp is set to the number of entries in the returned +** array. Also, *pnMaxArg is set to the larger of its current value and +** the number of entries in the Vdbe.apArg[] array required to execute the +** returned program. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ + VdbeOp *aOp = p->aOp; + assert( aOp && !p->db->mallocFailed ); + + /* Check that sqlite3VdbeUsesBtree() was not called on this VM */ + assert( DbMaskAllZero(p->btreeMask) ); + + resolveP2Values(p, pnMaxArg); + *pnOp = p->nOp; + p->aOp = 0; + return aOp; +} + +/* +** Add a whole list of operations to the operation stack. Return a +** pointer to the first operation inserted. +** +** Non-zero P2 arguments to jump instructions are automatically adjusted +** so that the jump target is relative to the first operation inserted. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( + Vdbe *p, /* Add opcodes to the prepared statement */ + int nOp, /* Number of opcodes to add */ + VdbeOpList const *aOp, /* The opcodes to be added */ + int iLineno /* Source-file line number of first opcode */ +){ + int i; + VdbeOp *pOut, *pFirst; + assert( nOp>0 ); + assert( p->eVdbeState==VDBE_INIT_STATE ); + if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ + return 0; + } + pFirst = pOut = &p->aOp[p->nOp]; + for(i=0; iopcode = aOp->opcode; + pOut->p1 = aOp->p1; + pOut->p2 = aOp->p2; + assert( aOp->p2>=0 ); + if( (sqlite3OpcodeProperty[aOp->opcode] & OPFLG_JUMP)!=0 && aOp->p2>0 ){ + pOut->p2 += p->nOp; + } + pOut->p3 = aOp->p3; + pOut->p4type = P4_NOTUSED; + pOut->p4.p = 0; + pOut->p5 = 0; +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOut->zComment = 0; +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOut->iSrcLine = iLineno+i; +#else + (void)iLineno; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i+p->nOp, &p->aOp[i+p->nOp]); + } +#endif + } + p->nOp += nOp; + return pFirst; +} + +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) +/* +** Add an entry to the array of counters managed by sqlite3_stmt_scanstatus(). +*/ +SQLITE_PRIVATE void sqlite3VdbeScanStatus( + Vdbe *p, /* VM to add scanstatus() to */ + int addrExplain, /* Address of OP_Explain (or 0) */ + int addrLoop, /* Address of loop counter */ + int addrVisit, /* Address of rows visited counter */ + LogEst nEst, /* Estimated number of output rows */ + const char *zName /* Name of table or index being scanned */ +){ + sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); + ScanStatus *aNew; + aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); + if( aNew ){ + ScanStatus *pNew = &aNew[p->nScan++]; + pNew->addrExplain = addrExplain; + pNew->addrLoop = addrLoop; + pNew->addrVisit = addrVisit; + pNew->nEst = nEst; + pNew->zName = sqlite3DbStrDup(p->db, zName); + p->aScan = aNew; + } +} +#endif + + +/* +** Change the value of the opcode, or P1, P2, P3, or P5 operands +** for a specific instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){ + sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ + sqlite3VdbeGetOp(p,addr)->p1 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ + sqlite3VdbeGetOp(p,addr)->p2 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ + sqlite3VdbeGetOp(p,addr)->p3 = val; +} +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ + assert( p->nOp>0 || p->db->mallocFailed ); + if( p->nOp>0 ) p->aOp[p->nOp-1].p5 = p5; +} + +/* +** Change the P2 operand of instruction addr so that it points to +** the address of the next instruction to be coded. +*/ +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ + sqlite3VdbeChangeP2(p, addr, p->nOp); +} + +/* +** Change the P2 operand of the jump instruction at addr so that +** the jump lands on the next opcode. Or if the jump instruction was +** the previous opcode (and is thus a no-op) then simply back up +** the next instruction counter by one slot so that the jump is +** overwritten by the next inserted opcode. +** +** This routine is an optimization of sqlite3VdbeJumpHere() that +** strives to omit useless byte-code like this: +** +** 7 Once 0 8 0 +** 8 ... +*/ +SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){ + if( addr==p->nOp-1 ){ + assert( p->aOp[addr].opcode==OP_Once + || p->aOp[addr].opcode==OP_If + || p->aOp[addr].opcode==OP_FkIfZero ); + assert( p->aOp[addr].p4type==0 ); +#ifdef SQLITE_VDBE_COVERAGE + sqlite3VdbeGetOp(p,-1)->iSrcLine = 0; /* Erase VdbeCoverage() macros */ +#endif + p->nOp--; + }else{ + sqlite3VdbeChangeP2(p, addr, p->nOp); + } +} + + +/* +** If the input FuncDef structure is ephemeral, then free it. If +** the FuncDef is not ephermal, then do nothing. +*/ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ + if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ + sqlite3DbFreeNN(db, pDef); + } +} + +/* +** Delete a P4 value if necessary. +*/ +static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + sqlite3DbFreeNN(db, p); +} +static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ + freeEphemeralFunction(db, p->pFunc); + sqlite3DbFreeNN(db, p); +} +static void freeP4(sqlite3 *db, int p4type, void *p4){ + assert( db ); + switch( p4type ){ + case P4_FUNCCTX: { + freeP4FuncCtx(db, (sqlite3_context*)p4); + break; + } + case P4_REAL: + case P4_INT64: + case P4_DYNAMIC: + case P4_INTARRAY: { + sqlite3DbFree(db, p4); + break; + } + case P4_KEYINFO: { + if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + sqlite3ExprDelete(db, (Expr*)p4); + break; + } +#endif + case P4_FUNCDEF: { + freeEphemeralFunction(db, (FuncDef*)p4); + break; + } + case P4_MEM: { + if( db->pnBytesFreed==0 ){ + sqlite3ValueFree((sqlite3_value*)p4); + }else{ + freeP4Mem(db, (Mem*)p4); + } + break; + } + case P4_VTAB : { + if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); + break; + } + } +} + +/* +** Free the space allocated for aOp and any p4 values allocated for the +** opcodes contained within. If aOp is not NULL it is assumed to contain +** nOp entries. +*/ +static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ + assert( nOp>=0 ); + if( aOp ){ + Op *pOp = &aOp[nOp-1]; + while(1){ /* Exit via break */ + if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + sqlite3DbFree(db, pOp->zComment); +#endif + if( pOp==aOp ) break; + pOp--; + } + sqlite3DbFreeNN(db, aOp); + } +} + +/* +** Link the SubProgram object passed as the second argument into the linked +** list at Vdbe.pSubProgram. This list is used to delete all sub-program +** objects when the VM is no longer required. +*/ +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ + p->pNext = pVdbe->pProgram; + pVdbe->pProgram = p; +} + +/* +** Return true if the given Vdbe has any SubPrograms. +*/ +SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe *pVdbe){ + return pVdbe->pProgram!=0; +} + +/* +** Change the opcode at addr into OP_Noop +*/ +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ + VdbeOp *pOp; + if( p->db->mallocFailed ) return 0; + assert( addr>=0 && addrnOp ); + pOp = &p->aOp[addr]; + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = P4_NOTUSED; + pOp->p4.z = 0; + pOp->opcode = OP_Noop; + return 1; +} + +/* +** If the last opcode is "op" and it is not a jump destination, +** then remove it. Return true if and only if an opcode was removed. +*/ +SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ + if( p->nOp>0 && p->aOp[p->nOp-1].opcode==op ){ + return sqlite3VdbeChangeToNoop(p, p->nOp-1); + }else{ + return 0; + } +} + +#ifdef SQLITE_DEBUG +/* +** Generate an OP_ReleaseReg opcode to indicate that a range of +** registers, except any identified by mask, are no longer in use. +*/ +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( + Parse *pParse, /* Parsing context */ + int iFirst, /* Index of first register to be released */ + int N, /* Number of registers to release */ + u32 mask, /* Mask of registers to NOT release */ + int bUndefine /* If true, mark registers as undefined */ +){ + if( N==0 || OptimizationDisabled(pParse->db, SQLITE_ReleaseReg) ) return; + assert( pParse->pVdbe ); + assert( iFirst>=1 ); + assert( iFirst+N-1<=pParse->nMem ); + if( N<=31 && mask!=0 ){ + while( N>0 && (mask&1)!=0 ){ + mask >>= 1; + iFirst++; + N--; + } + while( N>0 && N<=32 && (mask & MASKBIT32(N-1))!=0 ){ + mask &= ~MASKBIT32(N-1); + N--; + } + } + if( N>0 ){ + sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); + } +} +#endif /* SQLITE_DEBUG */ + + +/* +** Change the value of the P4 operand for a specific instruction. +** This routine is useful when a large program is loaded from a +** static array using sqlite3VdbeAddOpList but we want to make a +** few minor changes to the program. +** +** If n>=0 then the P4 operand is dynamic, meaning that a copy of +** the string is made into memory obtained from sqlite3_malloc(). +** A value of n==0 means copy bytes of zP4 up to and including the +** first null byte. If n>0 then copy n+1 bytes of zP4. +** +** Other values of n (P4_STATIC, P4_COLLSEQ etc.) indicate that zP4 points +** to a string or structure that is guaranteed to exist for the lifetime of +** the Vdbe. In these cases we can just copy the pointer. +** +** If addr<0 then change P4 on the most recently inserted instruction. +*/ +static void SQLITE_NOINLINE vdbeChangeP4Full( + Vdbe *p, + Op *pOp, + const char *zP4, + int n +){ + if( pOp->p4type ){ + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = 0; + pOp->p4.p = 0; + } + if( n<0 ){ + sqlite3VdbeChangeP4(p, (int)(pOp - p->aOp), zP4, n); + }else{ + if( n==0 ) n = sqlite3Strlen30(zP4); + pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n); + pOp->p4type = P4_DYNAMIC; + } +} +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){ + Op *pOp; + sqlite3 *db; + assert( p!=0 ); + db = p->db; + assert( p->eVdbeState==VDBE_INIT_STATE ); + assert( p->aOp!=0 || db->mallocFailed ); + if( db->mallocFailed ){ + if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4); + return; + } + assert( p->nOp>0 ); + assert( addrnOp ); + if( addr<0 ){ + addr = p->nOp - 1; + } + pOp = &p->aOp[addr]; + if( n>=0 || pOp->p4type ){ + vdbeChangeP4Full(p, pOp, zP4, n); + return; + } + if( n==P4_INT32 ){ + /* Note: this cast is safe, because the origin data point was an int + ** that was cast to a (const char *). */ + pOp->p4.i = SQLITE_PTR_TO_INT(zP4); + pOp->p4type = P4_INT32; + }else if( zP4!=0 ){ + assert( n<0 ); + pOp->p4.p = (void*)zP4; + pOp->p4type = (signed char)n; + if( n==P4_VTAB ) sqlite3VtabLock((VTable*)zP4); + } +} + +/* +** Change the P4 operand of the most recently coded instruction +** to the value defined by the arguments. This is a high-speed +** version of sqlite3VdbeChangeP4(). +** +** The P4 operand must not have been previously defined. And the new +** P4 must not be P4_INT32. Use sqlite3VdbeChangeP4() in either of +** those cases. +*/ +SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){ + VdbeOp *pOp; + assert( n!=P4_INT32 && n!=P4_VTAB ); + assert( n<=0 ); + if( p->db->mallocFailed ){ + freeP4(p->db, n, pP4); + }else{ + assert( pP4!=0 ); + assert( p->nOp>0 ); + pOp = &p->aOp[p->nOp-1]; + assert( pOp->p4type==P4_NOTUSED ); + pOp->p4type = n; + pOp->p4.p = pP4; + } +} + +/* +** Set the P4 on the most recently added opcode to the KeyInfo for the +** index given. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ + Vdbe *v = pParse->pVdbe; + KeyInfo *pKeyInfo; + assert( v!=0 ); + assert( pIdx!=0 ); + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pIdx); + if( pKeyInfo ) sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* +** Change the comment on the most recently coded instruction. Or +** insert a No-op and add the comment to that new instruction. This +** makes the code easier to read during debugging. None of this happens +** in a production build. +*/ +static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){ + assert( p->nOp>0 || p->aOp==0 ); + assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->pParse->nErr>0 ); + if( p->nOp ){ + assert( p->aOp ); + sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment); + p->aOp[p->nOp-1].zComment = sqlite3VMPrintf(p->db, zFormat, ap); + } +} +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){ + va_list ap; + if( p ){ + va_start(ap, zFormat); + vdbeVComment(p, zFormat, ap); + va_end(ap); + } +} +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ + va_list ap; + if( p ){ + sqlite3VdbeAddOp0(p, OP_Noop); + va_start(ap, zFormat); + vdbeVComment(p, zFormat, ap); + va_end(ap); + } +} +#endif /* NDEBUG */ + +#ifdef SQLITE_VDBE_COVERAGE +/* +** Set the value if the iSrcLine field for the previously coded instruction. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ + sqlite3VdbeGetOp(v,-1)->iSrcLine = iLine; +} +#endif /* SQLITE_VDBE_COVERAGE */ + +/* +** Return the opcode for a given address. If the address is -1, then +** return the most recently inserted opcode. +** +** If a memory allocation error has occurred prior to the calling of this +** routine, then a pointer to a dummy VdbeOp will be returned. That opcode +** is readable but not writable, though it is cast to a writable value. +** The return of a dummy opcode allows the call to continue functioning +** after an OOM fault without having to check to see if the return from +** this routine is a valid pointer. But because the dummy.opcode is 0, +** dummy will never be written to. This is verified by code inspection and +** by running with Valgrind. +*/ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ + /* C89 specifies that the constant "dummy" will be initialized to all + ** zeros, which is correct. MSVC generates a warning, nevertheless. */ + static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ + assert( p->eVdbeState==VDBE_INIT_STATE ); + if( addr<0 ){ + addr = p->nOp - 1; + } + assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); + if( p->db->mallocFailed ){ + return (VdbeOp*)&dummy; + }else{ + return &p->aOp[addr]; + } +} + +#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) +/* +** Return an integer value for one of the parameters to the opcode pOp +** determined by character c. +*/ +static int translateP(char c, const Op *pOp){ + if( c=='1' ) return pOp->p1; + if( c=='2' ) return pOp->p2; + if( c=='3' ) return pOp->p3; + if( c=='4' ) return pOp->p4.i; + return pOp->p5; +} + +/* +** 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 +*/ +SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( + sqlite3 *db, /* Optional - Oom error reporting only */ + const Op *pOp, /* The opcode to be commented */ + const char *zP4 /* Previously obtained value for P4 */ +){ + const char *zOpName; + const char *zSynopsis; + int nOpName; + int ii; + char zAlt[50]; + StrAccum x; + + sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); + zOpName = sqlite3OpcodeName(pOp->opcode); + nOpName = sqlite3Strlen30(zOpName); + if( zOpName[nOpName+1] ){ + int seenCom = 0; + char c; + zSynopsis = zOpName + nOpName + 1; + if( strncmp(zSynopsis,"IF ",3)==0 ){ + sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3); + zSynopsis = zAlt; + } + for(ii=0; (c = zSynopsis[ii])!=0; ii++){ + if( c=='P' ){ + c = zSynopsis[++ii]; + if( c=='4' ){ + sqlite3_str_appendall(&x, zP4); + }else if( c=='X' ){ + if( pOp->zComment && pOp->zComment[0] ){ + sqlite3_str_appendall(&x, pOp->zComment); + seenCom = 1; + break; + } + }else{ + int v1 = translateP(c, pOp); + int v2; + if( strncmp(zSynopsis+ii+1, "@P", 2)==0 ){ + ii += 3; + v2 = translateP(zSynopsis[ii], pOp); + if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ + ii += 2; + v2++; + } + if( v2<2 ){ + sqlite3_str_appendf(&x, "%d", v1); + }else{ + sqlite3_str_appendf(&x, "%d..%d", v1, v1+v2-1); + } + }else if( strncmp(zSynopsis+ii+1, "@NP", 3)==0 ){ + sqlite3_context *pCtx = pOp->p4.pCtx; + if( pOp->p4type!=P4_FUNCCTX || pCtx->argc==1 ){ + sqlite3_str_appendf(&x, "%d", v1); + }else if( pCtx->argc>1 ){ + sqlite3_str_appendf(&x, "%d..%d", v1, v1+pCtx->argc-1); + }else if( x.accError==0 ){ + assert( x.nChar>2 ); + x.nChar -= 2; + ii++; + } + ii += 3; + }else{ + sqlite3_str_appendf(&x, "%d", v1); + if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ + ii += 4; + } + } + } + }else{ + sqlite3_str_appendchar(&x, 1, c); + } + } + if( !seenCom && pOp->zComment ){ + sqlite3_str_appendf(&x, "; %s", pOp->zComment); + } + }else if( pOp->zComment ){ + sqlite3_str_appendall(&x, pOp->zComment); + } + if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ + sqlite3OomFault(db); + } + return sqlite3StrAccumFinish(&x); +} +#endif /* SQLITE_ENABLE_EXPLAIN_COMMENTS */ + +#if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) +/* +** Translate the P4.pExpr value for an OP_CursorHint opcode into text +** that can be displayed in the P4 column of EXPLAIN output. +*/ +static void displayP4Expr(StrAccum *p, Expr *pExpr){ + const char *zOp = 0; + switch( pExpr->op ){ + case TK_STRING: + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3_str_appendf(p, "%Q", pExpr->u.zToken); + break; + case TK_INTEGER: + sqlite3_str_appendf(p, "%d", pExpr->u.iValue); + break; + case TK_NULL: + sqlite3_str_appendf(p, "NULL"); + break; + case TK_REGISTER: { + sqlite3_str_appendf(p, "r[%d]", pExpr->iTable); + break; + } + case TK_COLUMN: { + if( pExpr->iColumn<0 ){ + sqlite3_str_appendf(p, "rowid"); + }else{ + sqlite3_str_appendf(p, "c%d", (int)pExpr->iColumn); + } + break; + } + case TK_LT: zOp = "LT"; break; + case TK_LE: zOp = "LE"; break; + case TK_GT: zOp = "GT"; break; + case TK_GE: zOp = "GE"; break; + case TK_NE: zOp = "NE"; break; + case TK_EQ: zOp = "EQ"; break; + case TK_IS: zOp = "IS"; break; + case TK_ISNOT: zOp = "ISNOT"; break; + case TK_AND: zOp = "AND"; break; + case TK_OR: zOp = "OR"; break; + case TK_PLUS: zOp = "ADD"; break; + case TK_STAR: zOp = "MUL"; break; + case TK_MINUS: zOp = "SUB"; break; + case TK_REM: zOp = "REM"; break; + case TK_BITAND: zOp = "BITAND"; break; + case TK_BITOR: zOp = "BITOR"; break; + case TK_SLASH: zOp = "DIV"; break; + case TK_LSHIFT: zOp = "LSHIFT"; break; + case TK_RSHIFT: zOp = "RSHIFT"; break; + case TK_CONCAT: zOp = "CONCAT"; break; + case TK_UMINUS: zOp = "MINUS"; break; + case TK_UPLUS: zOp = "PLUS"; break; + case TK_BITNOT: zOp = "BITNOT"; break; + case TK_NOT: zOp = "NOT"; break; + case TK_ISNULL: zOp = "ISNULL"; break; + case TK_NOTNULL: zOp = "NOTNULL"; break; + + default: + sqlite3_str_appendf(p, "%s", "expr"); + break; + } + + if( zOp ){ + sqlite3_str_appendf(p, "%s(", zOp); + displayP4Expr(p, pExpr->pLeft); + if( pExpr->pRight ){ + sqlite3_str_append(p, ",", 1); + displayP4Expr(p, pExpr->pRight); + } + sqlite3_str_append(p, ")", 1); + } +} +#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */ + + +#if VDBE_DISPLAY_P4 +/* +** Compute a string that describes the P4 parameter for an opcode. +** Use zTemp for any required temporary buffer space. +*/ +SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ + char *zP4 = 0; + StrAccum x; + + sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); + switch( pOp->p4type ){ + case P4_KEYINFO: { + int j; + KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; + assert( pKeyInfo->aSortFlags!=0 ); + sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); + for(j=0; jnKeyField; j++){ + CollSeq *pColl = pKeyInfo->aColl[j]; + const char *zColl = pColl ? pColl->zName : ""; + if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; + sqlite3_str_appendf(&x, ",%s%s%s", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", + zColl); + } + sqlite3_str_append(&x, ")", 1); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + displayP4Expr(&x, pOp->p4.pExpr); + break; + } +#endif + case P4_COLLSEQ: { + static const char *const encnames[] = {"?", "8", "16LE", "16BE"}; + CollSeq *pColl = pOp->p4.pColl; + assert( pColl->enc<4 ); + sqlite3_str_appendf(&x, "%.18s-%s", pColl->zName, + encnames[pColl->enc]); + break; + } + case P4_FUNCDEF: { + FuncDef *pDef = pOp->p4.pFunc; + sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } + case P4_FUNCCTX: { + FuncDef *pDef = pOp->p4.pCtx->pFunc; + sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } + case P4_INT64: { + sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64); + break; + } + case P4_INT32: { + sqlite3_str_appendf(&x, "%d", pOp->p4.i); + break; + } + case P4_REAL: { + sqlite3_str_appendf(&x, "%.16g", *pOp->p4.pReal); + break; + } + case P4_MEM: { + Mem *pMem = pOp->p4.pMem; + if( pMem->flags & MEM_Str ){ + zP4 = pMem->z; + }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + sqlite3_str_appendf(&x, "%lld", pMem->u.i); + }else if( pMem->flags & MEM_Real ){ + sqlite3_str_appendf(&x, "%.16g", pMem->u.r); + }else if( pMem->flags & MEM_Null ){ + zP4 = "NULL"; + }else{ + assert( pMem->flags & MEM_Blob ); + zP4 = "(blob)"; + } + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case P4_VTAB: { + sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab; + sqlite3_str_appendf(&x, "vtab:%p", pVtab); + break; + } +#endif + case P4_INTARRAY: { + u32 i; + u32 *ai = pOp->p4.ai; + u32 n = ai[0]; /* The first element of an INTARRAY is always the + ** count of the number of elements to follow */ + for(i=1; i<=n; i++){ + sqlite3_str_appendf(&x, "%c%u", (i==1 ? '[' : ','), ai[i]); + } + sqlite3_str_append(&x, "]", 1); + break; + } + case P4_SUBPROGRAM: { + zP4 = "program"; + break; + } + case P4_TABLE: { + zP4 = pOp->p4.pTab->zName; + break; + } + default: { + zP4 = pOp->p4.z; + } + } + if( zP4 ) sqlite3_str_appendall(&x, zP4); + if( (x.accError & SQLITE_NOMEM)!=0 ){ + sqlite3OomFault(db); + } + return sqlite3StrAccumFinish(&x); +} +#endif /* VDBE_DISPLAY_P4 */ + +/* +** Declare to the Vdbe that the BTree object at db->aDb[i] is used. +** +** The prepared statements need to know in advance the complete set of +** attached databases that will be use. A mask of these databases +** is maintained in p->btreeMask. The p->lockMask value is the subset of +** p->btreeMask of databases that will require a lock. +*/ +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ + assert( i>=0 && idb->nDb && i<(int)sizeof(yDbMask)*8 ); + assert( i<(int)sizeof(p->btreeMask)*8 ); + DbMaskSet(p->btreeMask, i); + if( i!=1 && sqlite3BtreeSharable(p->db->aDb[i].pBt) ){ + DbMaskSet(p->lockMask, i); + } +} + +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** If SQLite is compiled to support shared-cache mode and to be threadsafe, +** this routine obtains the mutex associated with each BtShared structure +** that may be accessed by the VM passed as an argument. In doing so it also +** sets the BtShared.db member of each of the BtShared structures, ensuring +** that the correct busy-handler callback is invoked if required. +** +** If SQLite is not threadsafe but does support shared-cache mode, then +** sqlite3BtreeEnter() is invoked to set the BtShared.db variables +** of all of BtShared structures accessible via the database handle +** associated with the VM. +** +** If SQLite is not threadsafe and does not support shared-cache mode, this +** function is a no-op. +** +** The p->btreeMask field is a bitmask of all btrees that the prepared +** statement p will ever use. Let N be the number of bits in p->btreeMask +** corresponding to btrees that use shared cache. Then the runtime of +** this routine is N*N. But as N is rarely more than 1, this should not +** be a problem. +*/ +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe *p){ + int i; + sqlite3 *db; + Db *aDb; + int nDb; + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + db = p->db; + aDb = db->aDb; + nDb = db->nDb; + for(i=0; ilockMask,i) && ALWAYS(aDb[i].pBt!=0) ){ + sqlite3BtreeEnter(aDb[i].pBt); + } + } +} +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +/* +** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter(). +*/ +static SQLITE_NOINLINE void vdbeLeave(Vdbe *p){ + int i; + sqlite3 *db; + Db *aDb; + int nDb; + db = p->db; + aDb = db->aDb; + nDb = db->nDb; + for(i=0; ilockMask,i) && ALWAYS(aDb[i].pBt!=0) ){ + sqlite3BtreeLeave(aDb[i].pBt); + } + } +} +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + vdbeLeave(p); +} +#endif + +#if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +/* +** Print a single opcode. This routine is used for debugging only. +*/ +SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ + char *zP4; + char *zCom; + sqlite3 dummyDb; + static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-13s %.2X %s\n"; + if( pOut==0 ) pOut = stdout; + sqlite3BeginBenignMalloc(); + dummyDb.mallocFailed = 1; + zP4 = sqlite3VdbeDisplayP4(&dummyDb, pOp); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + zCom = sqlite3VdbeDisplayComment(0, pOp, zP4); +#else + zCom = 0; +#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, + sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, + zP4 ? zP4 : "", pOp->p5, + zCom ? zCom : "" + ); + fflush(pOut); + sqlite3_free(zP4); + sqlite3_free(zCom); + sqlite3EndBenignMalloc(); +} +#endif + +/* +** Initialize an array of N Mem element. +** +** This is a high-runner, so only those fields that really do need to +** be initialized are set. The Mem structure is organized so that +** the fields that get initialized are nearby and hopefully on the same +** cache line. +** +** Mem.flags = flags +** Mem.db = db +** Mem.szMalloc = 0 +** +** All other fields of Mem can safely remain uninitialized for now. They +** will be initialized before use. +*/ +static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ + if( N>0 ){ + do{ + p->flags = flags; + p->db = db; + p->szMalloc = 0; +#ifdef SQLITE_DEBUG + p->pScopyFrom = 0; +#endif + p++; + }while( (--N)>0 ); + } +} + +/* +** Release auxiliary memory held in an array of N Mem elements. +** +** After this routine returns, all Mem elements in the array will still +** be valid. Those Mem elements that were not holding auxiliary resources +** will be unchanged. Mem elements which had something freed will be +** set to MEM_Undefined. +*/ +static void releaseMemArray(Mem *p, int N){ + if( p && N ){ + Mem *pEnd = &p[N]; + sqlite3 *db = p->db; + if( db->pnBytesFreed ){ + do{ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + }while( (++p)flags & MEM_Agg ); + testcase( p->flags & MEM_Dyn ); + if( p->flags&(MEM_Agg|MEM_Dyn) ){ + testcase( (p->flags & MEM_Dyn)!=0 && p->xDel==sqlite3VdbeFrameMemDel ); + sqlite3VdbeMemRelease(p); + p->flags = MEM_Undefined; + }else if( p->szMalloc ){ + sqlite3DbFreeNN(db, p->zMalloc); + p->szMalloc = 0; + p->flags = MEM_Undefined; + } +#ifdef SQLITE_DEBUG + else{ + p->flags = MEM_Undefined; + } +#endif + }while( (++p)iFrameMagic!=SQLITE_FRAME_MAGIC ) return 0; + return 1; +} +#endif + + +/* +** This is a destructor on a Mem object (which is really an sqlite3_value) +** that deletes the Frame object that is attached to it as a blob. +** +** This routine does not delete the Frame right away. It merely adds the +** frame to a list of frames to be deleted when the Vdbe halts. +*/ +SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void *pArg){ + VdbeFrame *pFrame = (VdbeFrame*)pArg; + assert( sqlite3VdbeFrameIsValid(pFrame) ); + pFrame->pParent = pFrame->v->pDelFrame; + pFrame->v->pDelFrame = pFrame; +} + +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) || !defined(SQLITE_OMIT_EXPLAIN) +/* +** Locate the next opcode to be displayed in EXPLAIN or EXPLAIN +** QUERY PLAN output. +** +** Return SQLITE_ROW on success. Return SQLITE_DONE if there are no +** more opcodes to be displayed. +*/ +SQLITE_PRIVATE int sqlite3VdbeNextOpcode( + Vdbe *p, /* The statement being explained */ + Mem *pSub, /* Storage for keeping track of subprogram nesting */ + int eMode, /* 0: normal. 1: EQP. 2: TablesUsed */ + int *piPc, /* IN/OUT: Current rowid. Overwritten with next rowid */ + int *piAddr, /* OUT: Write index into (*paOp)[] here */ + Op **paOp /* OUT: Write the opcode array here */ +){ + int nRow; /* Stop when row count reaches this */ + int nSub = 0; /* Number of sub-vdbes seen so far */ + SubProgram **apSub = 0; /* Array of sub-vdbes */ + int i; /* Next instruction address */ + int rc = SQLITE_OK; /* Result code */ + Op *aOp = 0; /* Opcode array */ + int iPc; /* Rowid. Copy of value in *piPc */ + + /* When the number of output rows reaches nRow, that means the + ** listing has finished and sqlite3_step() should return SQLITE_DONE. + ** nRow is the sum of the number of rows in the main program, plus + ** the sum of the number of rows in all trigger subprograms encountered + ** so far. The nRow value will increase as new trigger subprograms are + ** encountered, but p->pc will eventually catch up to nRow. + */ + nRow = p->nOp; + if( pSub!=0 ){ + if( pSub->flags&MEM_Blob ){ + /* pSub is initiallly NULL. It is initialized to a BLOB by + ** the P4_SUBPROGRAM processing logic below */ + nSub = pSub->n/sizeof(Vdbe*); + apSub = (SubProgram **)pSub->z; + } + for(i=0; inOp; + } + } + iPc = *piPc; + while(1){ /* Loop exits via break */ + i = iPc++; + if( i>=nRow ){ + p->rc = SQLITE_OK; + rc = SQLITE_DONE; + break; + } + if( inOp ){ + /* The rowid is small enough that we are still in the + ** main program. */ + aOp = p->aOp; + }else{ + /* We are currently listing subprograms. Figure out which one and + ** pick up the appropriate opcode. */ + int j; + i -= p->nOp; + assert( apSub!=0 ); + assert( nSub>0 ); + for(j=0; i>=apSub[j]->nOp; j++){ + i -= apSub[j]->nOp; + assert( inOp || j+1aOp; + } + + /* When an OP_Program opcode is encounter (the only opcode that has + ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms + ** kept in p->aMem[9].z to hold the new program - assuming this subprogram + ** has not already been seen. + */ + if( pSub!=0 && aOp[i].p4type==P4_SUBPROGRAM ){ + int nByte = (nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; jrc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + break; + } + apSub = (SubProgram **)pSub->z; + apSub[nSub++] = aOp[i].p4.pProgram; + MemSetTypeFlag(pSub, MEM_Blob); + pSub->n = nSub*sizeof(SubProgram*); + nRow += aOp[i].p4.pProgram->nOp; + } + } + if( eMode==0 ) break; +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + if( eMode==2 ){ + Op *pOp = aOp + i; + if( pOp->opcode==OP_OpenRead ) break; + if( pOp->opcode==OP_OpenWrite && (pOp->p5 & OPFLAG_P2ISREG)==0 ) break; + if( pOp->opcode==OP_ReopenIdx ) break; + }else +#endif + { + assert( eMode==1 ); + if( aOp[i].opcode==OP_Explain ) break; + if( aOp[i].opcode==OP_Init && iPc>1 ) break; + } + } + *piPc = iPc; + *piAddr = i; + *paOp = aOp; + return rc; +} +#endif /* SQLITE_ENABLE_BYTECODE_VTAB || !SQLITE_OMIT_EXPLAIN */ + + +/* +** Delete a VdbeFrame object and its contents. VdbeFrame objects are +** allocated by the OP_Program opcode in sqlite3VdbeExec(). +*/ +SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ + int i; + Mem *aMem = VdbeFrameMem(p); + VdbeCursor **apCsr = (VdbeCursor **)&aMem[p->nChildMem]; + assert( sqlite3VdbeFrameIsValid(p) ); + for(i=0; inChildCsr; i++){ + if( apCsr[i] ) sqlite3VdbeFreeCursorNN(p->v, apCsr[i]); + } + releaseMemArray(aMem, p->nChildMem); + sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); + sqlite3DbFree(p->v->db, p); +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Give a listing of the program in the virtual machine. +** +** The interface is the same as sqlite3VdbeExec(). But instead of +** running the code, it invokes the callback once for each instruction. +** This feature is used to implement "EXPLAIN". +** +** When p->explain==1, each instruction is listed. When +** p->explain==2, only OP_Explain instructions are listed and these +** are shown in a different format. p->explain==2 is used to implement +** EXPLAIN QUERY PLAN. +** 2018-04-24: In p->explain==2 mode, the OP_Init opcodes of triggers +** are also shown, so that the boundaries between the main program and +** each trigger are clear. +** +** When p->explain==1, first the main program is listed, then each of +** the trigger subprograms are listed one by one. +*/ +SQLITE_PRIVATE int sqlite3VdbeList( + Vdbe *p /* The VDBE */ +){ + Mem *pSub = 0; /* Memory cell hold array of subprogs */ + sqlite3 *db = p->db; /* The database connection */ + int i; /* Loop counter */ + int rc = SQLITE_OK; /* Return code */ + Mem *pMem = &p->aMem[1]; /* First Mem of result set */ + int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0); + Op *aOp; /* Array of opcodes */ + Op *pOp; /* Current opcode */ + + assert( p->explain ); + assert( p->eVdbeState==VDBE_RUN_STATE ); + assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM ); + + /* Even though this opcode does not use dynamic strings for + ** the result, result columns may become dynamic if the user calls + ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. + */ + releaseMemArray(pMem, 8); + p->pResultSet = 0; + + if( p->rc==SQLITE_NOMEM ){ + /* This happens if a malloc() inside a call to sqlite3_column_text() or + ** sqlite3_column_text16() failed. */ + sqlite3OomFault(db); + return SQLITE_ERROR; + } + + if( bListSubprogs ){ + /* The first 8 memory cells are used for the result set. So we will + ** commandeer the 9th cell to use as storage for an array of pointers + ** to trigger subprograms. The VDBE is guaranteed to have at least 9 + ** cells. */ + assert( p->nMem>9 ); + pSub = &p->aMem[9]; + }else{ + pSub = 0; + } + + /* Figure out which opcode is next to display */ + rc = sqlite3VdbeNextOpcode(p, pSub, p->explain==2, &p->pc, &i, &aOp); + + if( rc==SQLITE_OK ){ + pOp = aOp + i; + if( AtomicLoad(&db->u1.isInterrupted) ){ + p->rc = SQLITE_INTERRUPT; + rc = SQLITE_ERROR; + sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); + }else{ + char *zP4 = sqlite3VdbeDisplayP4(db, pOp); + if( p->explain==2 ){ + sqlite3VdbeMemSetInt64(pMem, pOp->p1); + sqlite3VdbeMemSetInt64(pMem+1, pOp->p2); + sqlite3VdbeMemSetInt64(pMem+2, pOp->p3); + sqlite3VdbeMemSetStr(pMem+3, zP4, -1, SQLITE_UTF8, sqlite3_free); + p->nResColumn = 4; + }else{ + sqlite3VdbeMemSetInt64(pMem+0, i); + sqlite3VdbeMemSetStr(pMem+1, (char*)sqlite3OpcodeName(pOp->opcode), + -1, SQLITE_UTF8, SQLITE_STATIC); + sqlite3VdbeMemSetInt64(pMem+2, pOp->p1); + sqlite3VdbeMemSetInt64(pMem+3, pOp->p2); + sqlite3VdbeMemSetInt64(pMem+4, pOp->p3); + /* pMem+5 for p4 is done last */ + sqlite3VdbeMemSetInt64(pMem+6, pOp->p5); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + { + char *zCom = sqlite3VdbeDisplayComment(db, pOp, zP4); + sqlite3VdbeMemSetStr(pMem+7, zCom, -1, SQLITE_UTF8, sqlite3_free); + } +#else + sqlite3VdbeMemSetNull(pMem+7); +#endif + sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free); + p->nResColumn = 8; + } + p->pResultSet = pMem; + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM; + rc = SQLITE_ERROR; + }else{ + p->rc = SQLITE_OK; + rc = SQLITE_ROW; + } + } + } + return rc; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_DEBUG +/* +** Print the SQL that was used to generate a VDBE program. +*/ +SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){ + const char *z = 0; + if( p->zSql ){ + z = p->zSql; + }else if( p->nOp>=1 ){ + const VdbeOp *pOp = &p->aOp[0]; + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ + z = pOp->p4.z; + while( sqlite3Isspace(*z) ) z++; + } + } + if( z ) printf("SQL: [%s]\n", z); +} +#endif + +#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +/* +** Print an IOTRACE message showing SQL content. +*/ +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ + int nOp = p->nOp; + VdbeOp *pOp; + if( sqlite3IoTrace==0 ) return; + if( nOp<1 ) return; + pOp = &p->aOp[0]; + if( pOp->opcode==OP_Init && pOp->p4.z!=0 ){ + int i, j; + char z[1000]; + sqlite3_snprintf(sizeof(z), z, "%s", pOp->p4.z); + for(i=0; sqlite3Isspace(z[i]); i++){} + for(j=0; z[i]; i++){ + if( sqlite3Isspace(z[i]) ){ + if( z[i-1]!=' ' ){ + z[j++] = ' '; + } + }else{ + z[j++] = z[i]; + } + } + z[j] = 0; + sqlite3IoTrace("SQL %s\n", z); + } +} +#endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ + +/* An instance of this object describes bulk memory available for use +** by subcomponents of a prepared statement. Space is allocated out +** of a ReusableSpace object by the allocSpace() routine below. +*/ +struct ReusableSpace { + u8 *pSpace; /* Available memory */ + sqlite3_int64 nFree; /* Bytes of available memory */ + sqlite3_int64 nNeeded; /* Total bytes that could not be allocated */ +}; + +/* Try to allocate nByte bytes of 8-byte aligned bulk memory for pBuf +** from the ReusableSpace object. Return a pointer to the allocated +** memory on success. If insufficient memory is available in the +** ReusableSpace object, increase the ReusableSpace.nNeeded +** value by the amount needed and return NULL. +** +** If pBuf is not initially NULL, that means that the memory has already +** been allocated by a prior call to this routine, so just return a copy +** of pBuf and leave ReusableSpace unchanged. +** +** This allocator is employed to repurpose unused slots at the end of the +** opcode array of prepared state for other memory needs of the prepared +** statement. +*/ +static void *allocSpace( + struct ReusableSpace *p, /* Bulk memory available for allocation */ + void *pBuf, /* Pointer to a prior allocation */ + sqlite3_int64 nByte /* Bytes of memory needed. */ +){ + assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); + if( pBuf==0 ){ + nByte = ROUND8P(nByte); + if( nByte <= p->nFree ){ + p->nFree -= nByte; + pBuf = &p->pSpace[p->nFree]; + }else{ + p->nNeeded += nByte; + } + } + assert( EIGHT_BYTE_ALIGNMENT(pBuf) ); + return pBuf; +} + +/* +** Rewind the VDBE back to the beginning in preparation for +** running it. +*/ +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + int i; +#endif + assert( p!=0 ); + assert( p->eVdbeState==VDBE_INIT_STATE + || p->eVdbeState==VDBE_READY_STATE + || p->eVdbeState==VDBE_HALT_STATE ); + + /* There should be at least one opcode. + */ + assert( p->nOp>0 ); + + p->eVdbeState = VDBE_READY_STATE; + +#ifdef SQLITE_DEBUG + for(i=0; inMem; i++){ + assert( p->aMem[i].db==p->db ); + } +#endif + p->pc = -1; + p->rc = SQLITE_OK; + p->errorAction = OE_Abort; + p->nChange = 0; + p->cacheCtr = 1; + p->minWriteFileFormat = 255; + p->iStatement = 0; + p->nFkConstraint = 0; +#ifdef VDBE_PROFILE + for(i=0; inOp; i++){ + p->aOp[i].cnt = 0; + p->aOp[i].cycles = 0; + } +#endif +} + +/* +** Prepare a virtual machine for execution for the first time after +** creating the virtual machine. This involves things such +** as allocating registers and initializing the program counter. +** After the VDBE has be prepped, it can be executed by one or more +** calls to sqlite3VdbeExec(). +** +** This function may be called exactly once on each virtual machine. +** After this routine is called the VM has been "packaged" and is ready +** to run. After this routine is called, further calls to +** sqlite3VdbeAddOp() functions are prohibited. This routine disconnects +** the Vdbe from the Parse object that helped generate it so that the +** the Vdbe becomes an independent entity and the Parse object can be +** destroyed. +** +** Use the sqlite3VdbeRewind() procedure to restore a virtual machine back +** to its initial state after it has been run. +*/ +SQLITE_PRIVATE void sqlite3VdbeMakeReady( + Vdbe *p, /* The VDBE */ + Parse *pParse /* Parsing context */ +){ + sqlite3 *db; /* The database connection */ + int nVar; /* Number of parameters */ + int nMem; /* Number of VM memory registers */ + int nCursor; /* Number of cursors required */ + int nArg; /* Number of arguments in subprograms */ + int n; /* Loop counter */ + struct ReusableSpace x; /* Reusable bulk memory */ + + assert( p!=0 ); + assert( p->nOp>0 ); + assert( pParse!=0 ); + assert( p->eVdbeState==VDBE_INIT_STATE ); + assert( pParse==p->pParse ); + p->pVList = pParse->pVList; + pParse->pVList = 0; + db = p->db; + assert( db->mallocFailed==0 ); + nVar = pParse->nVar; + nMem = pParse->nMem; + nCursor = pParse->nTab; + nArg = pParse->nMaxArg; + + /* Each cursor uses a memory cell. The first cursor (cursor 0) can + ** use aMem[0] which is not otherwise used by the VDBE program. Allocate + ** space at the end of aMem[] for cursors 1 and greater. + ** See also: allocateCursor(). + */ + nMem += nCursor; + if( nCursor==0 && nMem>0 ) nMem++; /* Space for aMem[0] even if not used */ + + /* Figure out how much reusable memory is available at the end of the + ** opcode array. This extra memory will be reallocated for other elements + ** of the prepared statement. + */ + n = ROUND8P(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ + x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */ + assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); + x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ + assert( x.nFree>=0 ); + assert( EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]) ); + + resolveP2Values(p, &nArg); + p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); + if( pParse->explain ){ + static const char * const azColName[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", + "id", "parent", "notused", "detail" + }; + int iFirst, mx, i; + if( nMem<10 ) nMem = 10; + p->explain = pParse->explain; + if( pParse->explain==2 ){ + sqlite3VdbeSetNumCols(p, 4); + iFirst = 8; + mx = 12; + }else{ + sqlite3VdbeSetNumCols(p, 8); + iFirst = 0; + mx = 8; + } + for(i=iFirst; iexpired = 0; + + /* Memory for registers, parameters, cursor, etc, is allocated in one or two + ** passes. On the first pass, we try to reuse unused memory at the + ** end of the opcode array. If we are unable to satisfy all memory + ** requirements by reusing the opcode array tail, then the second + ** pass will fill in the remainder using a fresh memory allocation. + ** + ** This two-pass approach that reuses as much memory as possible from + ** the leftover memory at the end of the opcode array. This can significantly + ** reduce the amount of memory held by a prepared statement. + */ + x.nNeeded = 0; + p->aMem = allocSpace(&x, 0, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64)); +#endif + if( x.nNeeded ){ + x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); + x.nFree = x.nNeeded; + if( !db->mallocFailed ){ + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + } + } + + if( db->mallocFailed ){ + p->nVar = 0; + p->nCursor = 0; + p->nMem = 0; + }else{ + p->nCursor = nCursor; + p->nVar = (ynVar)nVar; + initMemArray(p->aVar, nVar, db, MEM_Null); + p->nMem = nMem; + initMemArray(p->aMem, nMem, db, MEM_Undefined); + memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + memset(p->anExec, 0, p->nOp*sizeof(i64)); +#endif + } + sqlite3VdbeRewind(p); +} + +/* +** Close a VDBE cursor and release all the resources that cursor +** happens to hold. +*/ +SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ + if( pCx ) sqlite3VdbeFreeCursorNN(p,pCx); +} +SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){ + switch( pCx->eCurType ){ + case CURTYPE_SORTER: { + sqlite3VdbeSorterClose(p->db, pCx); + break; + } + case CURTYPE_BTREE: { + assert( pCx->uc.pCursor!=0 ); + sqlite3BtreeCloseCursor(pCx->uc.pCursor); + break; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + case CURTYPE_VTAB: { + sqlite3_vtab_cursor *pVCur = pCx->uc.pVCur; + const sqlite3_module *pModule = pVCur->pVtab->pModule; + assert( pVCur->pVtab->nRef>0 ); + pVCur->pVtab->nRef--; + pModule->xClose(pVCur); + break; + } +#endif + } +} + +/* +** Close all cursors in the current frame. +*/ +static void closeCursorsInFrame(Vdbe *p){ + int i; + for(i=0; inCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursorNN(p, pC); + p->apCsr[i] = 0; + } + } +} + +/* +** Copy the values stored in the VdbeFrame structure to its Vdbe. This +** is used, for example, when a trigger sub-program is halted to restore +** control to the main program. +*/ +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ + Vdbe *v = pFrame->v; + closeCursorsInFrame(v); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + v->anExec = pFrame->anExec; +#endif + v->aOp = pFrame->aOp; + v->nOp = pFrame->nOp; + v->aMem = pFrame->aMem; + v->nMem = pFrame->nMem; + v->apCsr = pFrame->apCsr; + v->nCursor = pFrame->nCursor; + v->db->lastRowid = pFrame->lastRowid; + v->nChange = pFrame->nChange; + v->db->nChange = pFrame->nDbChange; + sqlite3VdbeDeleteAuxData(v->db, &v->pAuxData, -1, 0); + v->pAuxData = pFrame->pAuxData; + pFrame->pAuxData = 0; + return pFrame->pc; +} + +/* +** Close all cursors. +** +** Also release any dynamic memory held by the VM in the Vdbe.aMem memory +** cell array. This is necessary as the memory cell array may contain +** pointers to VdbeFrame objects, which may in turn contain pointers to +** open cursors. +*/ +static void closeAllCursors(Vdbe *p){ + if( p->pFrame ){ + VdbeFrame *pFrame; + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + sqlite3VdbeFrameRestore(pFrame); + p->pFrame = 0; + p->nFrame = 0; + } + assert( p->nFrame==0 ); + closeCursorsInFrame(p); + releaseMemArray(p->aMem, p->nMem); + while( p->pDelFrame ){ + VdbeFrame *pDel = p->pDelFrame; + p->pDelFrame = pDel->pParent; + sqlite3VdbeFrameDelete(pDel); + } + + /* Delete any auxdata allocations made by the VM */ + if( p->pAuxData ) sqlite3VdbeDeleteAuxData(p->db, &p->pAuxData, -1, 0); + assert( p->pAuxData==0 ); +} + +/* +** Set the number of result columns that will be returned by this SQL +** statement. This is now set at compile time, rather than during +** execution of the vdbe program so that sqlite3_column_count() can +** be called on an SQL statement before sqlite3_step(). +*/ +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ + int n; + sqlite3 *db = p->db; + + if( p->nResColumn ){ + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFree(db, p->aColName); + } + n = nResColumn*COLNAME_N; + p->nResColumn = (u16)nResColumn; + p->aColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); + if( p->aColName==0 ) return; + initMemArray(p->aColName, n, db, MEM_Null); +} + +/* +** Set the name of the idx'th column to be returned by the SQL statement. +** zName must be a pointer to a nul terminated string. +** +** This call must be made after a call to sqlite3VdbeSetNumCols(). +** +** The final parameter, xDel, must be one of SQLITE_DYNAMIC, SQLITE_STATIC +** or SQLITE_TRANSIENT. If it is SQLITE_DYNAMIC, then the buffer pointed +** to by zName will be freed by sqlite3DbFree() when the vdbe is destroyed. +*/ +SQLITE_PRIVATE int sqlite3VdbeSetColName( + Vdbe *p, /* Vdbe being configured */ + int idx, /* Index of column zName applies to */ + int var, /* One of the COLNAME_* constants */ + const char *zName, /* Pointer to buffer containing name */ + void (*xDel)(void*) /* Memory management strategy for zName */ +){ + int rc; + Mem *pColName; + assert( idxnResColumn ); + assert( vardb->mallocFailed ){ + assert( !zName || xDel!=SQLITE_DYNAMIC ); + return SQLITE_NOMEM_BKPT; + } + assert( p->aColName!=0 ); + pColName = &(p->aColName[idx+var*p->nResColumn]); + rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, xDel); + assert( rc!=0 || !zName || (pColName->flags&MEM_Term)!=0 ); + return rc; +} + +/* +** A read or write transaction may or may not be active on database handle +** db. If a transaction is active, commit it. If there is a +** write-transaction spanning more than one database file, this routine +** takes care of the super-journal trickery. +*/ +static int vdbeCommit(sqlite3 *db, Vdbe *p){ + int i; + int nTrans = 0; /* Number of databases with an active write-transaction + ** that are candidates for a two-phase commit using a + ** super-journal */ + int rc = SQLITE_OK; + int needXcommit = 0; + +#ifdef SQLITE_OMIT_VIRTUALTABLE + /* With this option, sqlite3VtabSync() is defined to be simply + ** SQLITE_OK so p is not used. + */ + UNUSED_PARAMETER(p); +#endif + + /* Before doing anything else, call the xSync() callback for any + ** virtual module tables written in this transaction. This has to + ** be done before determining whether a super-journal file is + ** required, as an xSync() callback may add an attached database + ** to the transaction. + */ + rc = sqlite3VtabSync(db, p); + + /* This loop determines (a) if the commit hook should be invoked and + ** (b) how many database files have open write transactions, not + ** including the temp database. (b) is important because if more than + ** one database file has an open write transaction, a super-journal + ** file is required for an atomic commit. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeTxnState(pBt)==SQLITE_TXN_WRITE ){ + /* Whether or not a database might need a super-journal depends upon + ** its journal mode (among other things). This matrix determines which + ** journal modes use a super-journal and which do not */ + static const u8 aMJNeeded[] = { + /* DELETE */ 1, + /* PERSIST */ 1, + /* OFF */ 0, + /* TRUNCATE */ 1, + /* MEMORY */ 0, + /* WAL */ 0 + }; + Pager *pPager; /* Pager associated with pBt */ + needXcommit = 1; + sqlite3BtreeEnter(pBt); + pPager = sqlite3BtreePager(pBt); + if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF + && aMJNeeded[sqlite3PagerGetJournalMode(pPager)] + && sqlite3PagerIsMemdb(pPager)==0 + ){ + assert( i!=1 ); + nTrans++; + } + rc = sqlite3PagerExclusiveLock(pPager); + sqlite3BtreeLeave(pBt); + } + } + if( rc!=SQLITE_OK ){ + return rc; + } + + /* If there are any write-transactions at all, invoke the commit hook */ + if( needXcommit && db->xCommitCallback ){ + rc = db->xCommitCallback(db->pCommitArg); + if( rc ){ + return SQLITE_CONSTRAINT_COMMITHOOK; + } + } + + /* The simple case - no more than one database file (not counting the + ** TEMP database) has a transaction active. There is no need for the + ** super-journal. + ** + ** If the return value of sqlite3BtreeGetFilename() is a zero length + ** string, it means the main database is :memory: or a temp file. In + ** that case we do not support atomic multi-file commits, so use the + ** simple case then too. + */ + if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt)) + || nTrans<=1 + ){ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, 0); + } + } + + /* Do the commit only if all databases successfully complete phase 1. + ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an + ** IO error while deleting or truncating a journal file. It is unlikely, + ** but could happen. In this case abandon processing and return the error. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseTwo(pBt, 0); + } + } + if( rc==SQLITE_OK ){ + sqlite3VtabCommit(db); + } + } + + /* The complex case - There is a multi-file write-transaction active. + ** This requires a super-journal file to ensure the transaction is + ** committed atomically. + */ +#ifndef SQLITE_OMIT_DISKIO + else{ + sqlite3_vfs *pVfs = db->pVfs; + char *zSuper = 0; /* File-name for the super-journal */ + char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt); + sqlite3_file *pSuperJrnl = 0; + i64 offset = 0; + int res; + int retryCount = 0; + int nMainFile; + + /* Select a super-journal file name */ + nMainFile = sqlite3Strlen30(zMainFile); + zSuper = sqlite3MPrintf(db, "%.4c%s%.16c", 0,zMainFile,0); + if( zSuper==0 ) return SQLITE_NOMEM_BKPT; + zSuper += 4; + do { + u32 iRandom; + if( retryCount ){ + if( retryCount>100 ){ + sqlite3_log(SQLITE_FULL, "MJ delete: %s", zSuper); + sqlite3OsDelete(pVfs, zSuper, 0); + break; + }else if( retryCount==1 ){ + sqlite3_log(SQLITE_FULL, "MJ collide: %s", zSuper); + } + } + retryCount++; + sqlite3_randomness(sizeof(iRandom), &iRandom); + sqlite3_snprintf(13, &zSuper[nMainFile], "-mj%06X9%02X", + (iRandom>>8)&0xffffff, iRandom&0xff); + /* The antipenultimate character of the super-journal name must + ** be "9" to avoid name collisions when using 8+3 filenames. */ + assert( zSuper[sqlite3Strlen30(zSuper)-3]=='9' ); + sqlite3FileSuffix3(zMainFile, zSuper); + rc = sqlite3OsAccess(pVfs, zSuper, SQLITE_ACCESS_EXISTS, &res); + }while( rc==SQLITE_OK && res ); + if( rc==SQLITE_OK ){ + /* Open the super-journal. */ + rc = sqlite3OsOpenMalloc(pVfs, zSuper, &pSuperJrnl, + SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| + SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_SUPER_JOURNAL, 0 + ); + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, zSuper-4); + return rc; + } + + /* Write the name of each database file in the transaction into the new + ** super-journal file. If an error occurs at this point close + ** and delete the super-journal file. All the individual journal files + ** still have 'null' as the super-journal pointer, so they will roll + ** back independently if a failure occurs. + */ + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( sqlite3BtreeTxnState(pBt)==SQLITE_TXN_WRITE ){ + char const *zFile = sqlite3BtreeGetJournalname(pBt); + if( zFile==0 ){ + continue; /* Ignore TEMP and :memory: databases */ + } + assert( zFile[0]!=0 ); + rc = sqlite3OsWrite(pSuperJrnl, zFile, sqlite3Strlen30(zFile)+1,offset); + offset += sqlite3Strlen30(zFile)+1; + if( rc!=SQLITE_OK ){ + sqlite3OsCloseFree(pSuperJrnl); + sqlite3OsDelete(pVfs, zSuper, 0); + sqlite3DbFree(db, zSuper-4); + return rc; + } + } + } + + /* Sync the super-journal file. If the IOCAP_SEQUENTIAL device + ** flag is set this is not required. + */ + if( 0==(sqlite3OsDeviceCharacteristics(pSuperJrnl)&SQLITE_IOCAP_SEQUENTIAL) + && SQLITE_OK!=(rc = sqlite3OsSync(pSuperJrnl, SQLITE_SYNC_NORMAL)) + ){ + sqlite3OsCloseFree(pSuperJrnl); + sqlite3OsDelete(pVfs, zSuper, 0); + sqlite3DbFree(db, zSuper-4); + return rc; + } + + /* Sync all the db files involved in the transaction. The same call + ** sets the super-journal pointer in each individual journal. If + ** an error occurs here, do not delete the super-journal file. + ** + ** If the error occurs during the first call to + ** sqlite3BtreeCommitPhaseOne(), then there is a chance that the + ** super-journal file will be orphaned. But we cannot delete it, + ** in case the super-journal file name was written into the journal + ** file before the failure occurred. + */ + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + rc = sqlite3BtreeCommitPhaseOne(pBt, zSuper); + } + } + sqlite3OsCloseFree(pSuperJrnl); + assert( rc!=SQLITE_BUSY ); + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, zSuper-4); + return rc; + } + + /* Delete the super-journal file. This commits the transaction. After + ** doing this the directory is synced again before any individual + ** transaction files are deleted. + */ + rc = sqlite3OsDelete(pVfs, zSuper, 1); + sqlite3DbFree(db, zSuper-4); + zSuper = 0; + if( rc ){ + return rc; + } + + /* All files and directories have already been synced, so the following + ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and + ** deleting or truncating journals. If something goes wrong while + ** this is happening we don't really care. The integrity of the + ** transaction is already guaranteed, but some stray 'cold' journals + ** may be lying around. Returning an error code won't help matters. + */ + disable_simulated_io_errors(); + sqlite3BeginBenignMalloc(); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + sqlite3BtreeCommitPhaseTwo(pBt, 1); + } + } + sqlite3EndBenignMalloc(); + enable_simulated_io_errors(); + + sqlite3VtabCommit(db); + } +#endif + + return rc; +} + +/* +** This routine checks that the sqlite3.nVdbeActive count variable +** matches the number of vdbe's in the list sqlite3.pVdbe that are +** currently active. An assertion fails if the two counts do not match. +** This is an internal self-check only - it is not an essential processing +** step. +** +** This is a no-op if NDEBUG is defined. +*/ +#ifndef NDEBUG +static void checkActiveVdbeCnt(sqlite3 *db){ + Vdbe *p; + int cnt = 0; + int nWrite = 0; + int nRead = 0; + p = db->pVdbe; + while( p ){ + if( sqlite3_stmt_busy((sqlite3_stmt*)p) ){ + cnt++; + if( p->readOnly==0 ) nWrite++; + if( p->bIsReader ) nRead++; + } + p = p->pNext; + } + assert( cnt==db->nVdbeActive ); + assert( nWrite==db->nVdbeWrite ); + assert( nRead==db->nVdbeRead ); +} +#else +#define checkActiveVdbeCnt(x) +#endif + +/* +** If the Vdbe passed as the first argument opened a statement-transaction, +** close it now. Argument eOp must be either SAVEPOINT_ROLLBACK or +** SAVEPOINT_RELEASE. If it is SAVEPOINT_ROLLBACK, then the statement +** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the +** statement transaction is committed. +** +** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned. +** Otherwise SQLITE_OK. +*/ +static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ + sqlite3 *const db = p->db; + int rc = SQLITE_OK; + int i; + const int iSavepoint = p->iStatement-1; + + assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE); + assert( db->nStatement>0 ); + assert( p->iStatement==(db->nStatement+db->nSavepoint) ); + + for(i=0; inDb; i++){ + int rc2 = SQLITE_OK; + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + if( eOp==SAVEPOINT_ROLLBACK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc2==SQLITE_OK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint); + } + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + db->nStatement--; + p->iStatement = 0; + + if( rc==SQLITE_OK ){ + if( eOp==SAVEPOINT_ROLLBACK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc==SQLITE_OK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint); + } + } + + /* If the statement transaction is being rolled back, also restore the + ** database handles deferred constraint counter to the value it had when + ** the statement transaction was opened. */ + if( eOp==SAVEPOINT_ROLLBACK ){ + db->nDeferredCons = p->nStmtDefCons; + db->nDeferredImmCons = p->nStmtDefImmCons; + } + return rc; +} +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ + if( p->db->nStatement && p->iStatement ){ + return vdbeCloseStatement(p, eOp); + } + return SQLITE_OK; +} + + +/* +** This function is called when a transaction opened by the database +** handle associated with the VM passed as an argument is about to be +** committed. If there are outstanding deferred foreign key constraint +** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK. +** +** If there are outstanding FK violations and this function returns +** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY +** and write an error message to it. Then return SQLITE_ERROR. +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ + sqlite3 *db = p->db; + if( (deferred && (db->nDeferredCons+db->nDeferredImmCons)>0) + || (!deferred && p->nFkConstraint>0) + ){ + p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; + p->errorAction = OE_Abort; + sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ) return SQLITE_ERROR; + return SQLITE_CONSTRAINT_FOREIGNKEY; + } + return SQLITE_OK; +} +#endif + +/* +** This routine is called the when a VDBE tries to halt. If the VDBE +** has made changes and is in autocommit mode, then commit those +** changes. If a rollback is needed, then do the rollback. +** +** This routine is the only way to move the sqlite3eOpenState of a VM from +** SQLITE_STATE_RUN to SQLITE_STATE_HALT. It is harmless to +** call this on a VM that is in the SQLITE_STATE_HALT state. +** +** Return an error code. If the commit could not complete because of +** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it +** means the close did not happen and needs to be repeated. +*/ +SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ + int rc; /* Used to store transient return codes */ + sqlite3 *db = p->db; + + /* This function contains the logic that determines if a statement or + ** transaction will be committed or rolled back as a result of the + ** execution of this virtual machine. + ** + ** If any of the following errors occur: + ** + ** SQLITE_NOMEM + ** SQLITE_IOERR + ** SQLITE_FULL + ** SQLITE_INTERRUPT + ** + ** Then the internal cache might have been left in an inconsistent + ** state. We need to rollback the statement transaction, if there is + ** one, or the complete transaction if there is no statement transaction. + */ + + assert( p->eVdbeState==VDBE_RUN_STATE ); + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + closeAllCursors(p); + checkActiveVdbeCnt(db); + + /* No commit or rollback needed if the program never started or if the + ** SQL statement does not read or write a database file. */ + if( p->bIsReader ){ + int mrc; /* Primary error code from p->rc */ + int eStatementOp = 0; + int isSpecialError; /* Set to true if a 'special' error */ + + /* Lock all btrees used by the statement */ + sqlite3VdbeEnter(p); + + /* Check for one of the special errors */ + if( p->rc ){ + mrc = p->rc & 0xff; + isSpecialError = mrc==SQLITE_NOMEM + || mrc==SQLITE_IOERR + || mrc==SQLITE_INTERRUPT + || mrc==SQLITE_FULL; + }else{ + mrc = isSpecialError = 0; + } + if( isSpecialError ){ + /* If the query was read-only and the error code is SQLITE_INTERRUPT, + ** no rollback is necessary. Otherwise, at least a savepoint + ** transaction must be rolled back to restore the database to a + ** consistent state. + ** + ** Even if the statement is read-only, it is important to perform + ** a statement or transaction rollback operation. If the error + ** occurred while writing to the journal, sub-journal or database + ** file as part of an effort to free up cache space (see function + ** pagerStress() in pager.c), the rollback is required to restore + ** the pager to a consistent state. + */ + if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){ + if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && p->usesStmtJournal ){ + eStatementOp = SAVEPOINT_ROLLBACK; + }else{ + /* We are forced to roll back the active transaction. Before doing + ** so, abort any other statements this handle currently has active. + */ + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + } + + /* Check for immediate foreign key violations. */ + if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ + sqlite3VdbeCheckFk(p, 0); + } + + /* If the auto-commit flag is set and this is the only active writer + ** VM, then we do either a commit or rollback of the current transaction. + ** + ** Note: This block also runs if one of the special errors handled + ** above has occurred. + */ + if( !sqlite3VtabInSync(db) + && db->autoCommit + && db->nVdbeWrite==(p->readOnly==0) + ){ + if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ + rc = sqlite3VdbeCheckFk(p, 1); + if( rc!=SQLITE_OK ){ + if( NEVER(p->readOnly) ){ + sqlite3VdbeLeave(p); + return SQLITE_ERROR; + } + rc = SQLITE_CONSTRAINT_FOREIGNKEY; + }else if( db->flags & SQLITE_CorruptRdOnly ){ + rc = SQLITE_CORRUPT; + db->flags &= ~SQLITE_CorruptRdOnly; + }else{ + /* The auto-commit flag is true, the vdbe program was successful + ** or hit an 'OR FAIL' constraint and there are no deferred foreign + ** key constraints to hold up the transaction. This means a commit + ** is required. */ + rc = vdbeCommit(db, p); + } + if( rc==SQLITE_BUSY && p->readOnly ){ + sqlite3VdbeLeave(p); + return SQLITE_BUSY; + }else if( rc!=SQLITE_OK ){ + p->rc = rc; + sqlite3RollbackAll(db, SQLITE_OK); + p->nChange = 0; + }else{ + db->nDeferredCons = 0; + db->nDeferredImmCons = 0; + db->flags &= ~(u64)SQLITE_DeferFKs; + sqlite3CommitInternalChanges(db); + } + }else{ + sqlite3RollbackAll(db, SQLITE_OK); + p->nChange = 0; + } + db->nStatement = 0; + }else if( eStatementOp==0 ){ + if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){ + eStatementOp = SAVEPOINT_RELEASE; + }else if( p->errorAction==OE_Abort ){ + eStatementOp = SAVEPOINT_ROLLBACK; + }else{ + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + + /* If eStatementOp is non-zero, then a statement transaction needs to + ** be committed or rolled back. Call sqlite3VdbeCloseStatement() to + ** do so. If this operation returns an error, and the current statement + ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the + ** current statement error code. + */ + if( eStatementOp ){ + rc = sqlite3VdbeCloseStatement(p, eStatementOp); + if( rc ){ + if( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ){ + p->rc = rc; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + sqlite3CloseSavepoints(db); + db->autoCommit = 1; + p->nChange = 0; + } + } + + /* If this was an INSERT, UPDATE or DELETE and no statement transaction + ** has been rolled back, update the database connection change-counter. + */ + if( p->changeCntOn ){ + if( eStatementOp!=SAVEPOINT_ROLLBACK ){ + sqlite3VdbeSetChanges(db, p->nChange); + }else{ + sqlite3VdbeSetChanges(db, 0); + } + p->nChange = 0; + } + + /* Release the locks */ + sqlite3VdbeLeave(p); + } + + /* We have successfully halted and closed the VM. Record this fact. */ + db->nVdbeActive--; + if( !p->readOnly ) db->nVdbeWrite--; + if( p->bIsReader ) db->nVdbeRead--; + assert( db->nVdbeActive>=db->nVdbeRead ); + assert( db->nVdbeRead>=db->nVdbeWrite ); + assert( db->nVdbeWrite>=0 ); + p->eVdbeState = VDBE_HALT_STATE; + checkActiveVdbeCnt(db); + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + + /* If the auto-commit flag is set to true, then any locks that were held + ** by connection db have now been released. Call sqlite3ConnectionUnlocked() + ** to invoke any required unlock-notify callbacks. + */ + if( db->autoCommit ){ + sqlite3ConnectionUnlocked(db); + } + + assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); + return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); +} + + +/* +** Each VDBE holds the result of the most recent sqlite3_step() call +** in p->rc. This routine sets that result back to SQLITE_OK. +*/ +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){ + p->rc = SQLITE_OK; +} + +/* +** Copy the error code and error message belonging to the VDBE passed +** as the first argument to its database handle (so that they will be +** returned by calls to sqlite3_errcode() and sqlite3_errmsg()). +** +** This function does not clear the VDBE error code or message, just +** copies them to the database handle. +*/ +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ + sqlite3 *db = p->db; + int rc = p->rc; + if( p->zErrMsg ){ + db->bBenignMalloc++; + sqlite3BeginBenignMalloc(); + if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); + sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); + sqlite3EndBenignMalloc(); + db->bBenignMalloc--; + }else if( db->pErr ){ + sqlite3ValueSetNull(db->pErr); + } + db->errCode = rc; + db->errByteOffset = -1; + return rc; +} + +#ifdef SQLITE_ENABLE_SQLLOG +/* +** If an SQLITE_CONFIG_SQLLOG hook is registered and the VM has been run, +** invoke it. +*/ +static void vdbeInvokeSqllog(Vdbe *v){ + if( sqlite3GlobalConfig.xSqllog && v->rc==SQLITE_OK && v->zSql && v->pc>=0 ){ + char *zExpanded = sqlite3VdbeExpandSql(v, v->zSql); + assert( v->db->init.busy==0 ); + if( zExpanded ){ + sqlite3GlobalConfig.xSqllog( + sqlite3GlobalConfig.pSqllogArg, v->db, zExpanded, 1 + ); + sqlite3DbFree(v->db, zExpanded); + } + } +} +#else +# define vdbeInvokeSqllog(x) +#endif + +/* +** Clean up a VDBE after execution but do not delete the VDBE just yet. +** Write any error messages into *pzErrMsg. Return the result code. +** +** After this routine is run, the VDBE should be ready to be executed +** again. +** +** To look at it another way, this routine resets the state of the +** virtual machine from VDBE_RUN_STATE or VDBE_HALT_STATE back to +** VDBE_READY_STATE. +*/ +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + int i; +#endif + + sqlite3 *db; + db = p->db; + + /* If the VM did not run to completion or if it encountered an + ** error, then it might not have been halted properly. So halt + ** it now. + */ + if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); + + /* If the VDBE has been run even partially, then transfer the error code + ** and error message from the VDBE into the main database structure. But + ** if the VDBE has just been set to run but has not actually executed any + ** instructions yet, leave the main database error information unchanged. + */ + if( p->pc>=0 ){ + vdbeInvokeSqllog(p); + if( db->pErr || p->zErrMsg ){ + sqlite3VdbeTransferError(p); + }else{ + db->errCode = p->rc; + } + } + + /* Reset register contents and reclaim error message memory. + */ +#ifdef SQLITE_DEBUG + /* Execute assert() statements to ensure that the Vdbe.apCsr[] and + ** Vdbe.aMem[] arrays have already been cleaned up. */ + if( p->apCsr ) for(i=0; inCursor; i++) assert( p->apCsr[i]==0 ); + if( p->aMem ){ + for(i=0; inMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); + } +#endif + if( p->zErrMsg ){ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } + p->pResultSet = 0; +#ifdef SQLITE_DEBUG + p->nWrite = 0; +#endif + + /* Save profiling information from this VDBE run. + */ +#ifdef VDBE_PROFILE + { + FILE *out = fopen("vdbe_profile.out", "a"); + if( out ){ + fprintf(out, "---- "); + for(i=0; inOp; i++){ + fprintf(out, "%02x", p->aOp[i].opcode); + } + fprintf(out, "\n"); + if( p->zSql ){ + char c, pc = 0; + fprintf(out, "-- "); + for(i=0; (c = p->zSql[i])!=0; i++){ + if( pc=='\n' ) fprintf(out, "-- "); + putc(c, out); + pc = c; + } + if( pc!='\n' ) fprintf(out, "\n"); + } + for(i=0; inOp; i++){ + char zHdr[100]; + sqlite3_snprintf(sizeof(zHdr), zHdr, "%6u %12llu %8llu ", + p->aOp[i].cnt, + p->aOp[i].cycles, + p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0 + ); + fprintf(out, "%s", zHdr); + sqlite3VdbePrintOp(out, i, &p->aOp[i]); + } + fclose(out); + } + } +#endif + return p->rc & db->errMask; +} + +/* +** Clean up and delete a VDBE after execution. Return an integer which is +** the result code. Write any error message text into *pzErrMsg. +*/ +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ + int rc = SQLITE_OK; + assert( VDBE_RUN_STATE>VDBE_READY_STATE ); + assert( VDBE_HALT_STATE>VDBE_READY_STATE ); + assert( VDBE_INIT_STATEeVdbeState>=VDBE_READY_STATE ){ + rc = sqlite3VdbeReset(p); + assert( (rc & p->db->errMask)==rc ); + } + sqlite3VdbeDelete(p); + return rc; +} + +/* +** If parameter iOp is less than zero, then invoke the destructor for +** all auxiliary data pointers currently cached by the VM passed as +** the first argument. +** +** Or, if iOp is greater than or equal to zero, then the destructor is +** only invoked for those auxiliary data pointers created by the user +** function invoked by the OP_Function opcode at instruction iOp of +** VM pVdbe, and only then if: +** +** * the associated function parameter is the 32nd or later (counting +** from left to right), or +** +** * the corresponding bit in argument mask is clear (where the first +** function parameter corresponds to bit 0 etc.). +*/ +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){ + while( *pp ){ + AuxData *pAux = *pp; + if( (iOp<0) + || (pAux->iAuxOp==iOp + && pAux->iAuxArg>=0 + && (pAux->iAuxArg>31 || !(mask & MASKBIT32(pAux->iAuxArg)))) + ){ + testcase( pAux->iAuxArg==31 ); + if( pAux->xDeleteAux ){ + pAux->xDeleteAux(pAux->pAux); + } + *pp = pAux->pNextAux; + sqlite3DbFree(db, pAux); + }else{ + pp= &pAux->pNextAux; + } + } +} + +/* +** Free all memory associated with the Vdbe passed as the second argument, +** except for object itself, which is preserved. +** +** The difference between this function and sqlite3VdbeDelete() is that +** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with +** the database connection and frees the object itself. +*/ +static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ + SubProgram *pSub, *pNext; + assert( p->db==0 || p->db==db ); + if( p->aColName ){ + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFreeNN(db, p->aColName); + } + for(pSub=p->pProgram; pSub; pSub=pNext){ + pNext = pSub->pNext; + vdbeFreeOpArray(db, pSub->aOp, pSub->nOp); + sqlite3DbFree(db, pSub); + } + if( p->eVdbeState!=VDBE_INIT_STATE ){ + releaseMemArray(p->aVar, p->nVar); + if( p->pVList ) sqlite3DbFreeNN(db, p->pVList); + if( p->pFree ) sqlite3DbFreeNN(db, p->pFree); + } + vdbeFreeOpArray(db, p->aOp, p->nOp); + sqlite3DbFree(db, p->zSql); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3DbFree(db, p->zNormSql); + { + DblquoteStr *pThis, *pNext; + for(pThis=p->pDblStr; pThis; pThis=pNext){ + pNext = pThis->pNextStr; + sqlite3DbFree(db, pThis); + } + } +#endif +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + { + int i; + for(i=0; inScan; i++){ + sqlite3DbFree(db, p->aScan[i].zName); + } + sqlite3DbFree(db, p->aScan); + } +#endif +} + +/* +** Delete an entire VDBE. +*/ +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ + sqlite3 *db; + + assert( p!=0 ); + db = p->db; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3VdbeClearObject(db, p); + if( db->pnBytesFreed==0 ){ + if( p->pPrev ){ + p->pPrev->pNext = p->pNext; + }else{ + assert( db->pVdbe==p ); + db->pVdbe = p->pNext; + } + if( p->pNext ){ + p->pNext->pPrev = p->pPrev; + } + } + sqlite3DbFreeNN(db, p); +} + +/* +** The cursor "p" has a pending seek operation that has not yet been +** carried out. Seek the cursor now. If an error occurs, return +** the appropriate error code. +*/ +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ + int res, rc; +#ifdef SQLITE_TEST + extern int sqlite3_search_count; +#endif + assert( p->deferredMoveto ); + assert( p->isTable ); + assert( p->eCurType==CURTYPE_BTREE ); + rc = sqlite3BtreeTableMoveto(p->uc.pCursor, p->movetoTarget, 0, &res); + if( rc ) return rc; + if( res!=0 ) return SQLITE_CORRUPT_BKPT; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + p->deferredMoveto = 0; + p->cacheStatus = CACHE_STALE; + return SQLITE_OK; +} + +/* +** Something has moved cursor "p" out of place. Maybe the row it was +** pointed to was deleted out from under it. Or maybe the btree was +** rebalanced. Whatever the cause, try to restore "p" to the place it +** is supposed to be pointing. If the row was deleted out from under the +** cursor, set the cursor to point to a NULL row. +*/ +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p){ + int isDifferentRow, rc; + assert( p->eCurType==CURTYPE_BTREE ); + assert( p->uc.pCursor!=0 ); + assert( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ); + rc = sqlite3BtreeCursorRestore(p->uc.pCursor, &isDifferentRow); + p->cacheStatus = CACHE_STALE; + if( isDifferentRow ) p->nullRow = 1; + return rc; +} + +/* +** Check to ensure that the cursor is valid. Restore the cursor +** if need be. Return any I/O error from the restore operation. +*/ +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ + assert( p->eCurType==CURTYPE_BTREE || IsNullCursor(p) ); + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ + return sqlite3VdbeHandleMovedCursor(p); + } + return SQLITE_OK; +} + +/* +** The following functions: +** +** sqlite3VdbeSerialType() +** sqlite3VdbeSerialTypeLen() +** sqlite3VdbeSerialLen() +** sqlite3VdbeSerialPut() <--- in-lined into OP_MakeRecord as of 2022-04-02 +** sqlite3VdbeSerialGet() +** +** encapsulate the code that serializes values for storage in SQLite +** data and index records. Each serialized value consists of a +** 'serial-type' and a blob of data. The serial type is an 8-byte unsigned +** integer, stored as a varint. +** +** In an SQLite index record, the serial type is stored directly before +** the blob of data that it corresponds to. In a table record, all serial +** types are stored at the start of the record, and the blobs of data at +** the end. Hence these functions allow the caller to handle the +** serial-type and data blob separately. +** +** The following table describes the various storage classes for data: +** +** serial type bytes of data type +** -------------- --------------- --------------- +** 0 0 NULL +** 1 1 signed integer +** 2 2 signed integer +** 3 3 signed integer +** 4 4 signed integer +** 5 6 signed integer +** 6 8 signed integer +** 7 8 IEEE float +** 8 0 Integer constant 0 +** 9 0 Integer constant 1 +** 10,11 reserved for expansion +** N>=12 and even (N-12)/2 BLOB +** N>=13 and odd (N-13)/2 text +** +** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions +** of SQLite will not understand those serial types. +*/ + +#if 0 /* Inlined into the OP_MakeRecord opcode */ +/* +** Return the serial-type for the value stored in pMem. +** +** This routine might convert a large MEM_IntReal value into MEM_Real. +** +** 2019-07-11: The primary user of this subroutine was the OP_MakeRecord +** opcode in the byte-code engine. But by moving this routine in-line, we +** can omit some redundant tests and make that opcode a lot faster. So +** this routine is now only used by the STAT3 logic and STAT3 support has +** ended. The code is kept here for historical reference only. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ + int flags = pMem->flags; + u32 n; + + assert( pLen!=0 ); + if( flags&MEM_Null ){ + *pLen = 0; + return 0; + } + if( flags&(MEM_Int|MEM_IntReal) ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ +# define MAX_6BYTE ((((i64)0x00008000)<<32)-1) + i64 i = pMem->u.i; + u64 u; + testcase( flags & MEM_Int ); + testcase( flags & MEM_IntReal ); + if( i<0 ){ + u = ~i; + }else{ + u = i; + } + if( u<=127 ){ + if( (i&1)==i && file_format>=4 ){ + *pLen = 0; + return 8+(u32)u; + }else{ + *pLen = 1; + return 1; + } + } + if( u<=32767 ){ *pLen = 2; return 2; } + if( u<=8388607 ){ *pLen = 3; return 3; } + if( u<=2147483647 ){ *pLen = 4; return 4; } + if( u<=MAX_6BYTE ){ *pLen = 6; return 5; } + *pLen = 8; + if( flags&MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pMem->u.r = (double)pMem->u.i; + pMem->flags &= ~MEM_IntReal; + pMem->flags |= MEM_Real; + return 7; + } + return 6; + } + if( flags&MEM_Real ){ + *pLen = 8; + return 7; + } + assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) ); + assert( pMem->n>=0 ); + n = (u32)pMem->n; + if( flags & MEM_Zero ){ + n += pMem->u.nZero; + } + *pLen = n; + return ((n*2) + 12 + ((flags&MEM_Str)!=0)); +} +#endif /* inlined into OP_MakeRecord */ + +/* +** The sizes for serial types less than 128 +*/ +SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[128] = { + /* 0 1 2 3 4 5 6 7 8 9 */ +/* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, +/* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, +/* 20 */ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, +/* 30 */ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, +/* 40 */ 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, +/* 50 */ 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, +/* 60 */ 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, +/* 70 */ 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, +/* 80 */ 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, +/* 90 */ 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, +/* 100 */ 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, +/* 110 */ 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, +/* 120 */ 54, 54, 55, 55, 56, 56, 57, 57 +}; + +/* +** Return the length of the data corresponding to the supplied serial-type. +*/ +SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){ + if( serial_type>=128 ){ + return (serial_type-12)/2; + }else{ + assert( serial_type<12 + || sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 ); + return sqlite3SmallTypeSizes[serial_type]; + } +} +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ + assert( serial_type<128 ); + return sqlite3SmallTypeSizes[serial_type]; +} + +/* +** If we are on an architecture with mixed-endian floating +** points (ex: ARM7) then swap the lower 4 bytes with the +** upper 4 bytes. Return the result. +** +** For most architectures, this is a no-op. +** +** (later): It is reported to me that the mixed-endian problem +** on ARM7 is an issue with GCC, not with the ARM7 chip. It seems +** that early versions of GCC stored the two words of a 64-bit +** float in the wrong order. And that error has been propagated +** ever since. The blame is not necessarily with GCC, though. +** GCC might have just copying the problem from a prior compiler. +** I am also told that newer versions of GCC that follow a different +** ABI get the byte order right. +** +** Developers using SQLite on an ARM7 should compile and run their +** application using -DSQLITE_DEBUG=1 at least once. With DEBUG +** enabled, some asserts below will ensure that the byte order of +** floating point values is correct. +** +** (2007-08-30) Frank van Vugt has studied this problem closely +** and has send his findings to the SQLite developers. Frank +** writes that some Linux kernels offer floating point hardware +** emulation that uses only 32-bit mantissas instead of a full +** 48-bits as required by the IEEE standard. (This is the +** CONFIG_FPE_FASTFPE option.) On such systems, floating point +** byte swapping becomes very complicated. To avoid problems, +** the necessary byte swapping is carried out using a 64-bit integer +** rather than a 64-bit float. Frank assures us that the code here +** works for him. We, the developers, have no way to independently +** verify this, but Frank seems to know what he is talking about +** so we trust him. +*/ +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){ + union { + u64 r; + u32 i[2]; + } u; + u32 t; + + u.r = in; + t = u.i[0]; + u.i[0] = u.i[1]; + u.i[1] = t; + return u.r; +} +#endif /* SQLITE_MIXED_ENDIAN_64BIT_FLOAT */ + + +/* Input "x" is a sequence of unsigned characters that represent a +** big-endian integer. Return the equivalent native integer +*/ +#define ONE_BYTE_INT(x) ((i8)(x)[0]) +#define TWO_BYTE_INT(x) (256*(i8)((x)[0])|(x)[1]) +#define THREE_BYTE_INT(x) (65536*(i8)((x)[0])|((x)[1]<<8)|(x)[2]) +#define FOUR_BYTE_UINT(x) (((u32)(x)[0]<<24)|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) +#define FOUR_BYTE_INT(x) (16777216*(i8)((x)[0])|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) + +/* +** Deserialize the data blob pointed to by buf as serial type serial_type +** and store the result in pMem. +** +** This function is implemented as two separate routines for performance. +** The few cases that require local variables are broken out into a separate +** routine so that in most cases the overhead of moving the stack pointer +** is avoided. +*/ +static void serialGet( + const unsigned char *buf, /* Buffer to deserialize from */ + u32 serial_type, /* Serial type to deserialize */ + Mem *pMem /* Memory cell to write value into */ +){ + u64 x = FOUR_BYTE_UINT(buf); + u32 y = FOUR_BYTE_UINT(buf+4); + x = (x<<32) + y; + if( serial_type==6 ){ + /* EVIDENCE-OF: R-29851-52272 Value is a big-endian 64-bit + ** twos-complement integer. */ + pMem->u.i = *(i64*)&x; + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + }else{ + /* EVIDENCE-OF: R-57343-49114 Value is a big-endian IEEE 754-2008 64-bit + ** floating point number. */ +#if !defined(NDEBUG) && !defined(SQLITE_OMIT_FLOATING_POINT) + /* Verify that integers and floating point values use the same + ** byte order. Or, that if SQLITE_MIXED_ENDIAN_64BIT_FLOAT is + ** defined that 64-bit floating point values really are mixed + ** endian. + */ + static const u64 t1 = ((u64)0x3ff00000)<<32; + static const double r1 = 1.0; + u64 t2 = t1; + swapMixedEndianFloat(t2); + assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 ); +#endif + assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); + swapMixedEndianFloat(x); + memcpy(&pMem->u.r, &x, sizeof(x)); + pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; + } +} +SQLITE_PRIVATE void sqlite3VdbeSerialGet( + const unsigned char *buf, /* Buffer to deserialize from */ + u32 serial_type, /* Serial type to deserialize */ + Mem *pMem /* Memory cell to write value into */ +){ + switch( serial_type ){ + case 10: { /* Internal use only: NULL with virtual table + ** UPDATE no-change flag set */ + pMem->flags = MEM_Null|MEM_Zero; + pMem->n = 0; + pMem->u.nZero = 0; + return; + } + case 11: /* Reserved for future use */ + case 0: { /* Null */ + /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ + pMem->flags = MEM_Null; + return; + } + case 1: { + /* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement + ** integer. */ + pMem->u.i = ONE_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return; + } + case 2: { /* 2-byte signed integer */ + /* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit + ** twos-complement integer. */ + pMem->u.i = TWO_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return; + } + case 3: { /* 3-byte signed integer */ + /* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit + ** twos-complement integer. */ + pMem->u.i = THREE_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return; + } + case 4: { /* 4-byte signed integer */ + /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit + ** twos-complement integer. */ + pMem->u.i = FOUR_BYTE_INT(buf); +#ifdef __HP_cc + /* Work around a sign-extension bug in the HP compiler for HP/UX */ + if( buf[0]&0x80 ) pMem->u.i |= 0xffffffff80000000LL; +#endif + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return; + } + case 5: { /* 6-byte signed integer */ + /* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit + ** twos-complement integer. */ + pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf); + pMem->flags = MEM_Int; + testcase( pMem->u.i<0 ); + return; + } + case 6: /* 8-byte signed integer */ + case 7: { /* IEEE floating point */ + /* These use local variables, so do them in a separate routine + ** to avoid having to move the frame pointer in the common case */ + serialGet(buf,serial_type,pMem); + return; + } + case 8: /* Integer 0 */ + case 9: { /* Integer 1 */ + /* EVIDENCE-OF: R-12976-22893 Value is the integer 0. */ + /* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */ + pMem->u.i = serial_type-8; + pMem->flags = MEM_Int; + return; + } + default: { + /* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in + ** length. + ** EVIDENCE-OF: R-28401-00140 Value is a string in the text encoding and + ** (N-13)/2 bytes in length. */ + static const u16 aFlag[] = { MEM_Blob|MEM_Ephem, MEM_Str|MEM_Ephem }; + pMem->z = (char *)buf; + pMem->n = (serial_type-12)/2; + pMem->flags = aFlag[serial_type&1]; + return; + } + } + return; +} +/* +** This routine is used to allocate sufficient space for an UnpackedRecord +** structure large enough to be used with sqlite3VdbeRecordUnpack() if +** the first argument is a pointer to KeyInfo structure pKeyInfo. +** +** The space is either allocated using sqlite3DbMallocRaw() or from within +** the unaligned buffer passed via the second and third arguments (presumably +** stack space). If the former, then *ppFree is set to a pointer that should +** be eventually freed by the caller using sqlite3DbFree(). Or, if the +** allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL +** before returning. +** +** If an OOM error occurs, NULL is returned. +*/ +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( + KeyInfo *pKeyInfo /* Description of the record */ +){ + UnpackedRecord *p; /* Unpacked record to return */ + int nByte; /* Number of bytes required for *p */ + nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); + p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); + if( !p ) return 0; + p->aMem = (Mem*)&((char*)p)[ROUND8P(sizeof(UnpackedRecord))]; + assert( pKeyInfo->aSortFlags!=0 ); + p->pKeyInfo = pKeyInfo; + p->nField = pKeyInfo->nKeyField + 1; + return p; +} + +/* +** Given the nKey-byte encoding of a record in pKey[], populate the +** UnpackedRecord structure indicated by the fourth argument with the +** contents of the decoded record. +*/ +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( + KeyInfo *pKeyInfo, /* Information about the record format */ + int nKey, /* Size of the binary record */ + const void *pKey, /* The binary record */ + UnpackedRecord *p /* Populate this structure before returning. */ +){ + const unsigned char *aKey = (const unsigned char *)pKey; + u32 d; + u32 idx; /* Offset in aKey[] to read from */ + u16 u; /* Unsigned loop counter */ + u32 szHdr; + Mem *pMem = p->aMem; + + p->default_rc = 0; + assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + idx = getVarint32(aKey, szHdr); + d = szHdr; + u = 0; + while( idxenc = pKeyInfo->enc; + pMem->db = pKeyInfo->db; + /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ + pMem->szMalloc = 0; + pMem->z = 0; + sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); + d += sqlite3VdbeSerialTypeLen(serial_type); + pMem++; + if( (++u)>=p->nField ) break; + } + if( d>(u32)nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } + assert( u<=pKeyInfo->nKeyField + 1 ); + p->nField = u; +} + +#ifdef SQLITE_DEBUG +/* +** This function compares two index or table record keys in the same way +** as the sqlite3VdbeRecordCompare() routine. Unlike VdbeRecordCompare(), +** this function deserializes and compares values using the +** sqlite3VdbeSerialGet() and sqlite3MemCompare() functions. It is used +** in assert() statements to ensure that the optimized code in +** sqlite3VdbeRecordCompare() returns results with these two primitives. +** +** Return true if the result of comparison is equivalent to desiredResult. +** Return false if there is a disagreement. +*/ +static int vdbeRecordCompareDebug( + int nKey1, const void *pKey1, /* Left key */ + const UnpackedRecord *pPKey2, /* Right key */ + int desiredResult /* Correct answer */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + u32 idx1; /* Offset into aKey[] of next header element */ + u32 szHdr1; /* Number of bytes in header */ + int i = 0; + int rc = 0; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + KeyInfo *pKeyInfo; + Mem mem1; + + pKeyInfo = pPKey2->pKeyInfo; + if( pKeyInfo->db==0 ) return 1; + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + /* mem1.flags = 0; // Will be initialized by sqlite3VdbeSerialGet() */ + VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ + + /* Compilers may complain that mem1.u.i is potentially uninitialized. + ** We could initialize it, as shown here, to silence those complaints. + ** But in fact, mem1.u.i will never actually be used uninitialized, and doing + ** the unnecessary initialization has a measurable negative performance + ** impact, since this routine is a very high runner. And so, we choose + ** to ignore the compiler warnings and leave this variable uninitialized. + */ + /* mem1.u.i = 0; // not needed, here to silence compiler warning */ + + idx1 = getVarint32(aKey1, szHdr1); + if( szHdr1>98307 ) return SQLITE_CORRUPT; + d1 = szHdr1; + assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); + assert( pKeyInfo->aSortFlags!=0 ); + assert( pKeyInfo->nKeyField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type1; + + /* Read the serial types for the next element in each key. */ + idx1 += getVarint32( aKey1+idx1, serial_type1 ); + + /* Verify that there is enough key space remaining to avoid + ** a buffer overread. The "d1+serial_type1+2" subexpression will + ** always be greater than or equal to the amount of required key space. + ** Use that approximation to avoid the more expensive call to + ** sqlite3VdbeSerialTypeLen() in the common case. + */ + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 + ){ + break; + } + + /* Extract the values to be compared. + */ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); + d1 += sqlite3VdbeSerialTypeLen(serial_type1); + + /* Do the comparison + */ + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); + if( rc!=0 ){ + assert( mem1.szMalloc==0 ); /* See comment below */ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) + ){ + rc = -rc; + } + if( pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC ){ + rc = -rc; /* Invert the result for DESC sort order. */ + } + goto debugCompareEnd; + } + i++; + }while( idx1nField ); + + /* No memory allocation is ever used on mem1. Prove this using + ** the following assert(). If the assert() fails, it indicates a + ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). + */ + assert( mem1.szMalloc==0 ); + + /* rc==0 here means that one of the keys ran out of fields and + ** all the fields up to that point were equal. Return the default_rc + ** value. */ + rc = pPKey2->default_rc; + +debugCompareEnd: + if( desiredResult==0 && rc==0 ) return 1; + if( desiredResult<0 && rc<0 ) return 1; + if( desiredResult>0 && rc>0 ) return 1; + if( CORRUPT_DB ) return 1; + if( pKeyInfo->db->mallocFailed ) return 1; + return 0; +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Count the number of fields (a.k.a. columns) in the record given by +** pKey,nKey. The verify that this count is less than or equal to the +** limit given by pKeyInfo->nAllField. +** +** If this constraint is not satisfied, it means that the high-speed +** vdbeRecordCompareInt() and vdbeRecordCompareString() routines will +** not work correctly. If this assert() ever fires, it probably means +** that the KeyInfo.nKeyField or KeyInfo.nAllField values were computed +** incorrectly. +*/ +static void vdbeAssertFieldCountWithinLimits( + int nKey, const void *pKey, /* The record to verify */ + const KeyInfo *pKeyInfo /* Compare size with this KeyInfo */ +){ + int nField = 0; + u32 szHdr; + u32 idx; + u32 notUsed; + const unsigned char *aKey = (const unsigned char*)pKey; + + if( CORRUPT_DB ) return; + idx = getVarint32(aKey, szHdr); + assert( nKey>=0 ); + assert( szHdr<=(u32)nKey ); + while( idxnAllField ); +} +#else +# define vdbeAssertFieldCountWithinLimits(A,B,C) +#endif + +/* +** Both *pMem1 and *pMem2 contain string values. Compare the two values +** using the collation sequence pColl. As usual, return a negative , zero +** or positive value if *pMem1 is less than, equal to or greater than +** *pMem2, respectively. Similar in spirit to "rc = (*pMem1) - (*pMem2);". +*/ +static int vdbeCompareMemString( + const Mem *pMem1, + const Mem *pMem2, + const CollSeq *pColl, + u8 *prcErr /* If an OOM occurs, set to SQLITE_NOMEM */ +){ + if( pMem1->enc==pColl->enc ){ + /* The strings are already in the correct encoding. Call the + ** comparison function directly */ + return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z); + }else{ + int rc; + const void *v1, *v2; + Mem c1; + Mem c2; + sqlite3VdbeMemInit(&c1, pMem1->db, MEM_Null); + sqlite3VdbeMemInit(&c2, pMem1->db, MEM_Null); + sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); + sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); + v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); + v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); + if( (v1==0 || v2==0) ){ + if( prcErr ) *prcErr = SQLITE_NOMEM_BKPT; + rc = 0; + }else{ + rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); + } + sqlite3VdbeMemReleaseMalloc(&c1); + sqlite3VdbeMemReleaseMalloc(&c2); + return rc; + } +} + +/* +** The input pBlob is guaranteed to be a Blob that is not marked +** with MEM_Zero. Return true if it could be a zero-blob. +*/ +static int isAllZero(const char *z, int n){ + int i; + for(i=0; in; + int n2 = pB2->n; + + /* It is possible to have a Blob value that has some non-zero content + ** followed by zero content. But that only comes up for Blobs formed + ** by the OP_MakeRecord opcode, and such Blobs never get passed into + ** sqlite3MemCompare(). */ + assert( (pB1->flags & MEM_Zero)==0 || n1==0 ); + assert( (pB2->flags & MEM_Zero)==0 || n2==0 ); + + if( (pB1->flags|pB2->flags) & MEM_Zero ){ + if( pB1->flags & pB2->flags & MEM_Zero ){ + return pB1->u.nZero - pB2->u.nZero; + }else if( pB1->flags & MEM_Zero ){ + if( !isAllZero(pB2->z, pB2->n) ) return -1; + return pB1->u.nZero - n2; + }else{ + if( !isAllZero(pB1->z, pB1->n) ) return +1; + return n1 - pB2->u.nZero; + } + } + c = memcmp(pB1->z, pB2->z, n1>n2 ? n2 : n1); + if( c ) return c; + return n1 - n2; +} + +/* +** Do a comparison between a 64-bit signed integer and a 64-bit floating-point +** number. Return negative, zero, or positive if the first (i64) is less than, +** equal to, or greater than the second (double). +*/ +SQLITE_PRIVATE int sqlite3IntFloatCompare(i64 i, double r){ + if( sizeof(LONGDOUBLE_TYPE)>8 ){ + LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; + testcase( xr ); + testcase( x==r ); + if( xr ) return +1; /*NO_TEST*/ /* work around bugs in gcov */ + return 0; /*NO_TEST*/ /* work around bugs in gcov */ + }else{ + i64 y; + double s; + if( r<-9223372036854775808.0 ) return +1; + if( r>=9223372036854775808.0 ) return -1; + y = (i64)r; + if( iy ) return +1; + s = (double)i; + if( sr ) return +1; + return 0; + } +} + +/* +** Compare the values contained by the two memory cells, returning +** negative, zero or positive if pMem1 is less than, equal to, or greater +** than pMem2. Sorting order is NULL's first, followed by numbers (integers +** and reals) sorted numerically, followed by text ordered by the collating +** sequence pColl and finally blob's ordered by memcmp(). +** +** Two NULL values are considered equal by this function. +*/ +SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){ + int f1, f2; + int combined_flags; + + f1 = pMem1->flags; + f2 = pMem2->flags; + combined_flags = f1|f2; + assert( !sqlite3VdbeMemIsRowSet(pMem1) && !sqlite3VdbeMemIsRowSet(pMem2) ); + + /* If one value is NULL, it is less than the other. If both values + ** are NULL, return 0. + */ + if( combined_flags&MEM_Null ){ + return (f2&MEM_Null) - (f1&MEM_Null); + } + + /* At least one of the two values is a number + */ + if( combined_flags&(MEM_Int|MEM_Real|MEM_IntReal) ){ + testcase( combined_flags & MEM_Int ); + testcase( combined_flags & MEM_Real ); + testcase( combined_flags & MEM_IntReal ); + if( (f1 & f2 & (MEM_Int|MEM_IntReal))!=0 ){ + testcase( f1 & f2 & MEM_Int ); + testcase( f1 & f2 & MEM_IntReal ); + if( pMem1->u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return +1; + return 0; + } + if( (f1 & f2 & MEM_Real)!=0 ){ + if( pMem1->u.r < pMem2->u.r ) return -1; + if( pMem1->u.r > pMem2->u.r ) return +1; + return 0; + } + if( (f1&(MEM_Int|MEM_IntReal))!=0 ){ + testcase( f1 & MEM_Int ); + testcase( f1 & MEM_IntReal ); + if( (f2&MEM_Real)!=0 ){ + return sqlite3IntFloatCompare(pMem1->u.i, pMem2->u.r); + }else if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ + if( pMem1->u.i < pMem2->u.i ) return -1; + if( pMem1->u.i > pMem2->u.i ) return +1; + return 0; + }else{ + return -1; + } + } + if( (f1&MEM_Real)!=0 ){ + if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ + testcase( f2 & MEM_Int ); + testcase( f2 & MEM_IntReal ); + return -sqlite3IntFloatCompare(pMem2->u.i, pMem1->u.r); + }else{ + return -1; + } + } + return +1; + } + + /* If one value is a string and the other is a blob, the string is less. + ** If both are strings, compare using the collating functions. + */ + if( combined_flags&MEM_Str ){ + if( (f1 & MEM_Str)==0 ){ + return 1; + } + if( (f2 & MEM_Str)==0 ){ + return -1; + } + + assert( pMem1->enc==pMem2->enc || pMem1->db->mallocFailed ); + assert( pMem1->enc==SQLITE_UTF8 || + pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); + + /* The collation sequence must be defined at this point, even if + ** the user deletes the collation sequence after the vdbe program is + ** compiled (this was not always the case). + */ + assert( !pColl || pColl->xCmp ); + + if( pColl ){ + return vdbeCompareMemString(pMem1, pMem2, pColl, 0); + } + /* If a NULL pointer was passed as the collate function, fall through + ** to the blob case and use memcmp(). */ + } + + /* Both values must be blobs. Compare using memcmp(). */ + return sqlite3BlobCompare(pMem1, pMem2); +} + + +/* +** The first argument passed to this function is a serial-type that +** corresponds to an integer - all values between 1 and 9 inclusive +** except 7. The second points to a buffer containing an integer value +** serialized according to serial_type. This function deserializes +** and returns the value. +*/ +static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ + u32 y; + assert( CORRUPT_DB || (serial_type>=1 && serial_type<=9 && serial_type!=7) ); + switch( serial_type ){ + case 0: + case 1: + testcase( aKey[0]&0x80 ); + return ONE_BYTE_INT(aKey); + case 2: + testcase( aKey[0]&0x80 ); + return TWO_BYTE_INT(aKey); + case 3: + testcase( aKey[0]&0x80 ); + return THREE_BYTE_INT(aKey); + case 4: { + testcase( aKey[0]&0x80 ); + y = FOUR_BYTE_UINT(aKey); + return (i64)*(int*)&y; + } + case 5: { + testcase( aKey[0]&0x80 ); + return FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + } + case 6: { + u64 x = FOUR_BYTE_UINT(aKey); + testcase( aKey[0]&0x80 ); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + return (i64)*(i64*)&x; + } + } + + return (serial_type - 8); +} + +/* +** This function compares the two table rows or index records +** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero +** or positive integer if key1 is less than, equal to or +** greater than key2. The {nKey1, pKey1} key must be a blob +** created by the OP_MakeRecord opcode of the VDBE. The pPKey2 +** key must be a parsed key such as obtained from +** sqlite3VdbeParseRecord. +** +** If argument bSkip is non-zero, it is assumed that the caller has already +** determined that the first fields of the keys are equal. +** +** Key1 and Key2 do not have to contain the same number of fields. If all +** fields that appear in both keys are equal, then pPKey2->default_rc is +** returned. +** +** If database corruption is discovered, set pPKey2->errCode to +** SQLITE_CORRUPT and return 0. If an OOM error is encountered, +** pPKey2->errCode is set to SQLITE_NOMEM and, if it is not NULL, the +** malloc-failed flag set on database handle (pPKey2->pKeyInfo->db). +*/ +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2, /* Right key */ + int bSkip /* If true, skip the first field */ +){ + u32 d1; /* Offset into aKey[] of next data element */ + int i; /* Index of next field to compare */ + u32 szHdr1; /* Size of record header in bytes */ + u32 idx1; /* Offset of first type in header */ + int rc = 0; /* Return value */ + Mem *pRhs = pPKey2->aMem; /* Next field of pPKey2 to compare */ + KeyInfo *pKeyInfo; + const unsigned char *aKey1 = (const unsigned char *)pKey1; + Mem mem1; + + /* If bSkip is true, then the caller has already determined that the first + ** two elements in the keys are equal. Fix the various stack variables so + ** that this routine begins comparing at the second field. */ + if( bSkip ){ + u32 s1 = aKey1[1]; + if( s1<0x80 ){ + idx1 = 2; + }else{ + idx1 = 1 + sqlite3GetVarint32(&aKey1[1], &s1); + } + szHdr1 = aKey1[0]; + d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); + i = 1; + pRhs++; + }else{ + if( (szHdr1 = aKey1[0])<0x80 ){ + idx1 = 1; + }else{ + idx1 = sqlite3GetVarint32(aKey1, &szHdr1); + } + d1 = szHdr1; + i = 0; + } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } + + VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ + assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField + || CORRUPT_DB ); + assert( pPKey2->pKeyInfo->aSortFlags!=0 ); + assert( pPKey2->pKeyInfo->nKeyField>0 ); + assert( idx1<=szHdr1 || CORRUPT_DB ); + do{ + u32 serial_type; + + /* RHS is an integer */ + if( pRhs->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pRhs->flags & MEM_Int ); + testcase( pRhs->flags & MEM_IntReal ); + serial_type = aKey1[idx1]; + testcase( serial_type==12 ); + if( serial_type>=10 ){ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else if( serial_type==7 ){ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + rc = -sqlite3IntFloatCompare(pRhs->u.i, mem1.u.r); + }else{ + i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); + i64 rhs = pRhs->u.i; + if( lhsrhs ){ + rc = +1; + } + } + } + + /* RHS is real */ + else if( pRhs->flags & MEM_Real ){ + serial_type = aKey1[idx1]; + if( serial_type>=10 ){ + /* Serial types 12 or greater are strings and blobs (greater than + ** numbers). Types 10 and 11 are currently "reserved for future + ** use", so it doesn't really matter what the results of comparing + ** them to numberic values are. */ + rc = +1; + }else if( serial_type==0 ){ + rc = -1; + }else{ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + if( serial_type==7 ){ + if( mem1.u.ru.r ){ + rc = -1; + }else if( mem1.u.r>pRhs->u.r ){ + rc = +1; + } + }else{ + rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); + } + } + } + + /* RHS is a string */ + else if( pRhs->flags & MEM_Str ){ + getVarint32NR(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 ){ + rc = -1; + }else if( !(serial_type & 0x01) ){ + rc = +1; + }else{ + mem1.n = (serial_type - 12) / 2; + testcase( (d1+mem1.n)==(unsigned)nKey1 ); + testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + }else if( pKeyInfo->aColl[i] ){ + mem1.enc = pKeyInfo->enc; + mem1.db = pKeyInfo->db; + mem1.flags = MEM_Str; + mem1.z = (char*)&aKey1[d1]; + rc = vdbeCompareMemString( + &mem1, pRhs, pKeyInfo->aColl[i], &pPKey2->errCode + ); + }else{ + int nCmp = MIN(mem1.n, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = mem1.n - pRhs->n; + } + } + } + + /* RHS is a blob */ + else if( pRhs->flags & MEM_Blob ){ + assert( (pRhs->flags & MEM_Zero)==0 || pRhs->n==0 ); + getVarint32NR(&aKey1[idx1], serial_type); + testcase( serial_type==12 ); + if( serial_type<12 || (serial_type & 0x01) ){ + rc = -1; + }else{ + int nStr = (serial_type - 12) / 2; + testcase( (d1+nStr)==(unsigned)nKey1 ); + testcase( (d1+nStr+1)==(unsigned)nKey1 ); + if( (d1+nStr) > (unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + }else if( pRhs->flags & MEM_Zero ){ + if( !isAllZero((const char*)&aKey1[d1],nStr) ){ + rc = 1; + }else{ + rc = nStr - pRhs->u.nZero; + } + }else{ + int nCmp = MIN(nStr, pRhs->n); + rc = memcmp(&aKey1[d1], pRhs->z, nCmp); + if( rc==0 ) rc = nStr - pRhs->n; + } + } + } + + /* RHS is null */ + else{ + serial_type = aKey1[idx1]; + rc = (serial_type!=0); + } + + if( rc!=0 ){ + int sortFlags = pPKey2->pKeyInfo->aSortFlags[i]; + if( sortFlags ){ + if( (sortFlags & KEYINFO_ORDER_BIGNULL)==0 + || ((sortFlags & KEYINFO_ORDER_DESC) + !=(serial_type==0 || (pRhs->flags&MEM_Null))) + ){ + rc = -rc; + } + } + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); + assert( mem1.szMalloc==0 ); /* See comment below */ + return rc; + } + + i++; + if( i==pPKey2->nField ) break; + pRhs++; + d1 += sqlite3VdbeSerialTypeLen(serial_type); + idx1 += sqlite3VarintLen(serial_type); + }while( idx1<(unsigned)szHdr1 && d1<=(unsigned)nKey1 ); + + /* No memory allocation is ever used on mem1. Prove this using + ** the following assert(). If the assert() fails, it indicates a + ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). */ + assert( mem1.szMalloc==0 ); + + /* rc==0 here means that one or both of the keys ran out of fields and + ** all the fields up to that point were equal. Return the default_rc + ** value. */ + assert( CORRUPT_DB + || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) + || pPKey2->pKeyInfo->db->mallocFailed + ); + pPKey2->eqSeen = 1; + return pPKey2->default_rc; +} +SQLITE_PRIVATE int sqlite3VdbeRecordCompare( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0); +} + + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is an integer, and (b) the +** size-of-header varint at the start of (pKey1/nKey1) fits in a single +** byte (i.e. is less than 128). +** +** To avoid concerns about buffer overreads, this routine is only used +** on schemas where the maximum valid header size is 63 bytes or less. +*/ +static int vdbeRecordCompareInt( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + const u8 *aKey = &((const u8*)pKey1)[*(const u8*)pKey1 & 0x3F]; + int serial_type = ((const u8*)pKey1)[1]; + int res; + u32 y; + u64 x; + i64 v; + i64 lhs; + + vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); + assert( (*(u8*)pKey1)<=0x3F || CORRUPT_DB ); + switch( serial_type ){ + case 1: { /* 1-byte signed integer */ + lhs = ONE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 2: { /* 2-byte signed integer */ + lhs = TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 3: { /* 3-byte signed integer */ + lhs = THREE_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 4: { /* 4-byte signed integer */ + y = FOUR_BYTE_UINT(aKey); + lhs = (i64)*(int*)&y; + testcase( lhs<0 ); + break; + } + case 5: { /* 6-byte signed integer */ + lhs = FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + testcase( lhs<0 ); + break; + } + case 6: { /* 8-byte signed integer */ + x = FOUR_BYTE_UINT(aKey); + x = (x<<32) | FOUR_BYTE_UINT(aKey+4); + lhs = *(i64*)&x; + testcase( lhs<0 ); + break; + } + case 8: + lhs = 0; + break; + case 9: + lhs = 1; + break; + + /* This case could be removed without changing the results of running + ** this code. Including it causes gcc to generate a faster switch + ** statement (since the range of switch targets now starts at zero and + ** is contiguous) but does not cause any duplicate code to be generated + ** (as gcc is clever enough to combine the two like cases). Other + ** compilers might be similar. */ + case 0: case 7: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); + + default: + return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); + } + + assert( pPKey2->u.i == pPKey2->aMem[0].u.i ); + v = pPKey2->u.i; + if( v>lhs ){ + res = pPKey2->r1; + }else if( vr2; + }else if( pPKey2->nField>1 ){ + /* The first fields of the two keys are equal. Compare the trailing + ** fields. */ + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + }else{ + /* The first fields of the two keys are equal and there are no trailing + ** fields. Return pPKey2->default_rc in this case. */ + res = pPKey2->default_rc; + pPKey2->eqSeen = 1; + } + + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) ); + return res; +} + +/* +** This function is an optimized version of sqlite3VdbeRecordCompare() +** that (a) the first field of pPKey2 is a string, that (b) the first field +** uses the collation sequence BINARY and (c) that the size-of-header varint +** at the start of (pKey1/nKey1) fits in a single byte. +*/ +static int vdbeRecordCompareString( + int nKey1, const void *pKey1, /* Left key */ + UnpackedRecord *pPKey2 /* Right key */ +){ + const u8 *aKey1 = (const u8*)pKey1; + int serial_type; + int res; + + assert( pPKey2->aMem[0].flags & MEM_Str ); + assert( pPKey2->aMem[0].n == pPKey2->n ); + assert( pPKey2->aMem[0].z == pPKey2->u.z ); + vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); + serial_type = (signed char)(aKey1[1]); + +vrcs_restart: + if( serial_type<12 ){ + if( serial_type<0 ){ + sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); + if( serial_type>=12 ) goto vrcs_restart; + assert( CORRUPT_DB ); + } + res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ + }else if( !(serial_type & 0x01) ){ + res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ + }else{ + int nCmp; + int nStr; + int szHdr = aKey1[0]; + + nStr = (serial_type-12) / 2; + if( (szHdr + nStr) > nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } + nCmp = MIN( pPKey2->n, nStr ); + res = memcmp(&aKey1[szHdr], pPKey2->u.z, nCmp); + + if( res>0 ){ + res = pPKey2->r2; + }else if( res<0 ){ + res = pPKey2->r1; + }else{ + res = nStr - pPKey2->n; + if( res==0 ){ + if( pPKey2->nField>1 ){ + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + }else{ + res = pPKey2->default_rc; + pPKey2->eqSeen = 1; + } + }else if( res>0 ){ + res = pPKey2->r2; + }else{ + res = pPKey2->r1; + } + } + } + + assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) + || CORRUPT_DB + || pPKey2->pKeyInfo->db->mallocFailed + ); + return res; +} + +/* +** Return a pointer to an sqlite3VdbeRecordCompare() compatible function +** suitable for comparing serialized records to the unpacked record passed +** as the only argument. +*/ +SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ + /* varintRecordCompareInt() and varintRecordCompareString() both assume + ** that the size-of-header varint that occurs at the start of each record + ** fits in a single byte (i.e. is 127 or less). varintRecordCompareInt() + ** also assumes that it is safe to overread a buffer by at least the + ** maximum possible legal header size plus 8 bytes. Because there is + ** guaranteed to be at least 74 (but not 136) bytes of padding following each + ** buffer passed to varintRecordCompareInt() this makes it convenient to + ** limit the size of the header to 64 bytes in cases where the first field + ** is an integer. + ** + ** The easiest way to enforce this limit is to consider only records with + ** 13 fields or less. If the first field is an integer, the maximum legal + ** header size is (12*5 + 1 + 1) bytes. */ + if( p->pKeyInfo->nAllField<=13 ){ + int flags = p->aMem[0].flags; + if( p->pKeyInfo->aSortFlags[0] ){ + if( p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL ){ + return sqlite3VdbeRecordCompare; + } + p->r1 = 1; + p->r2 = -1; + }else{ + p->r1 = -1; + p->r2 = 1; + } + if( (flags & MEM_Int) ){ + p->u.i = p->aMem[0].u.i; + return vdbeRecordCompareInt; + } + testcase( flags & MEM_Real ); + testcase( flags & MEM_Null ); + testcase( flags & MEM_Blob ); + if( (flags & (MEM_Real|MEM_IntReal|MEM_Null|MEM_Blob))==0 + && p->pKeyInfo->aColl[0]==0 + ){ + assert( flags & MEM_Str ); + p->u.z = p->aMem[0].z; + p->n = p->aMem[0].n; + return vdbeRecordCompareString; + } + } + + return sqlite3VdbeRecordCompare; +} + +/* +** pCur points at an index entry created using the OP_MakeRecord opcode. +** Read the rowid (the last field in the record) and store it in *rowid. +** Return SQLITE_OK if everything works, or an error code otherwise. +** +** pCur might be pointing to text obtained from a corrupt database file. +** So the content cannot be trusted. Do appropriate checks on the content. +*/ +SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ + i64 nCellKey = 0; + int rc; + u32 szHdr; /* Size of the header */ + u32 typeRowid; /* Serial type of the rowid */ + u32 lenRowid; /* Size of the rowid */ + Mem m, v; + + /* Get the size of the index entry. Only indices entries of less + ** than 2GiB are support - anything large must be database corruption. + ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so + ** this code can safely assume that nCellKey is 32-bits + */ + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); + + /* Read in the complete content of the index entry */ + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); + if( rc ){ + return rc; + } + + /* The index entry must begin with a header size */ + getVarint32NR((u8*)m.z, szHdr); + testcase( szHdr==3 ); + testcase( szHdr==(u32)m.n ); + testcase( szHdr>0x7fffffff ); + assert( m.n>=0 ); + if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){ + goto idx_rowid_corruption; + } + + /* The last field of the index should be an integer - the ROWID. + ** Verify that the last entry really is an integer. */ + getVarint32NR((u8*)&m.z[szHdr-1], typeRowid); + testcase( typeRowid==1 ); + testcase( typeRowid==2 ); + testcase( typeRowid==3 ); + testcase( typeRowid==4 ); + testcase( typeRowid==5 ); + testcase( typeRowid==6 ); + testcase( typeRowid==8 ); + testcase( typeRowid==9 ); + if( unlikely(typeRowid<1 || typeRowid>9 || typeRowid==7) ){ + goto idx_rowid_corruption; + } + lenRowid = sqlite3SmallTypeSizes[typeRowid]; + testcase( (u32)m.n==szHdr+lenRowid ); + if( unlikely((u32)m.neCurType==CURTYPE_BTREE ); + pCur = pC->uc.pCursor; + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + /* nCellKey will always be between 0 and 0xffffffff because of the way + ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ + if( nCellKey<=0 || nCellKey>0x7fffffff ){ + *res = 0; + return SQLITE_CORRUPT_BKPT; + } + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); + if( rc ){ + return rc; + } + *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0); + sqlite3VdbeMemReleaseMalloc(&m); + return SQLITE_OK; +} + +/* +** This routine sets the value to be returned by subsequent calls to +** sqlite3_changes() on the database handle 'db'. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, i64 nChange){ + assert( sqlite3_mutex_held(db->mutex) ); + db->nChange = nChange; + db->nTotalChange += nChange; +} + +/* +** Set a flag in the vdbe to update the change counter when it is finalised +** or reset. +*/ +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){ + v->changeCntOn = 1; +} + +/* +** Mark every prepared statement associated with a database connection +** as expired. +** +** An expired statement means that recompilation of the statement is +** recommend. Statements expire when things happen that make their +** programs obsolete. Removing user-defined functions or collating +** sequences, or changing an authorization function are the types of +** things that make prepared statements obsolete. +** +** If iCode is 1, then expiration is advisory. The statement should +** be reprepared before being restarted, but if it is already running +** it is allowed to run to completion. +** +** Internally, this function just sets the Vdbe.expired flag on all +** prepared statements. The flag is set to 1 for an immediate expiration +** and set to 2 for an advisory expiration. +*/ +SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db, int iCode){ + Vdbe *p; + for(p = db->pVdbe; p; p=p->pNext){ + p->expired = iCode+1; + } +} + +/* +** Return the database associated with the Vdbe. +*/ +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){ + return v->db; +} + +/* +** Return the SQLITE_PREPARE flags for a Vdbe. +*/ +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe *v){ + return v->prepFlags; +} + +/* +** Return a pointer to an sqlite3_value structure containing the value bound +** parameter iVar of VM v. Except, if the value is an SQL NULL, return +** 0 instead. Unless it is NULL, apply affinity aff (one of the SQLITE_AFF_* +** constants) to the value before returning it. +** +** The returned value must be freed by the caller using sqlite3ValueFree(). +*/ +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff){ + assert( iVar>0 ); + if( v ){ + Mem *pMem = &v->aVar[iVar-1]; + assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + if( 0==(pMem->flags & MEM_Null) ){ + sqlite3_value *pRet = sqlite3ValueNew(v->db); + if( pRet ){ + sqlite3VdbeMemCopy((Mem *)pRet, pMem); + sqlite3ValueApplyAffinity(pRet, aff, SQLITE_UTF8); + } + return pRet; + } + } + return 0; +} + +/* +** Configure SQL variable iVar so that binding a new value to it signals +** to sqlite3_reoptimize() that re-preparing the statement may result +** in a better query plan. +*/ +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ + assert( iVar>0 ); + assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + if( iVar>=32 ){ + v->expmask |= 0x80000000; + }else{ + v->expmask |= ((u32)1 << (iVar-1)); + } +} + +/* +** Cause a function to throw an error if it was call from OP_PureFunc +** rather than OP_Function. +** +** OP_PureFunc means that the function must be deterministic, and should +** throw an error if it is given inputs that would make it non-deterministic. +** This routine is invoked by date/time functions that use non-deterministic +** features such as 'now'. +*/ +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ + const VdbeOp *pOp; +#ifdef SQLITE_ENABLE_STAT4 + if( pCtx->pVdbe==0 ) return 1; +#endif + pOp = pCtx->pVdbe->aOp + pCtx->iOp; + if( pOp->opcode==OP_PureFunc ){ + const char *zContext; + char *zMsg; + if( pOp->p5 & NC_IsCheck ){ + zContext = "a CHECK constraint"; + }else if( pOp->p5 & NC_GenCol ){ + zContext = "a generated column"; + }else{ + zContext = "an index"; + } + zMsg = sqlite3_mprintf("non-deterministic use of %s() in %s", + pCtx->pFunc->zName, zContext); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); + return 0; + } + return 1; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored +** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored +** in memory obtained from sqlite3DbMalloc). +*/ +SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ + if( pVtab->zErrMsg ){ + sqlite3 *db = p->db; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg); + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + } +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + +/* +** If the second argument is not NULL, release any allocations associated +** with the memory cells in the p->aMem[] array. Also free the UnpackedRecord +** structure itself, using sqlite3DbFree(). +** +** This function is used to free UnpackedRecord structures allocated by +** the vdbeUnpackRecord() function found in vdbeapi.c. +*/ +static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ + if( p ){ + int i; + for(i=0; iaMem[i]; + if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem); + } + sqlite3DbFreeNN(db, p); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Invoke the pre-update hook. If this is an UPDATE or DELETE pre-update call, +** then cursor passed as the second argument should point to the row about +** to be update or deleted. If the application calls sqlite3_preupdate_old(), +** the required value will be read from the row the cursor points to. +*/ +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( + Vdbe *v, /* Vdbe pre-update hook is invoked by */ + VdbeCursor *pCsr, /* Cursor to grab old.* values from */ + int op, /* SQLITE_INSERT, UPDATE or DELETE */ + const char *zDb, /* Database name */ + Table *pTab, /* Modified table */ + i64 iKey1, /* Initial key value */ + int iReg, /* Register for new.* record */ + int iBlobWrite +){ + sqlite3 *db = v->db; + i64 iKey2; + PreUpdate preupdate; + const char *zTbl = pTab->zName; + static const u8 fakeSortOrder = 0; + + assert( db->pPreUpdate==0 ); + memset(&preupdate, 0, sizeof(PreUpdate)); + if( HasRowid(pTab)==0 ){ + iKey1 = iKey2 = 0; + preupdate.pPk = sqlite3PrimaryKeyIndex(pTab); + }else{ + if( op==SQLITE_UPDATE ){ + iKey2 = v->aMem[iReg].u.i; + }else{ + iKey2 = iKey1; + } + } + + assert( pCsr!=0 ); + assert( pCsr->eCurType==CURTYPE_BTREE ); + assert( pCsr->nField==pTab->nCol + || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) + ); + + preupdate.v = v; + preupdate.pCsr = pCsr; + preupdate.op = op; + preupdate.iNewReg = iReg; + preupdate.keyinfo.db = db; + preupdate.keyinfo.enc = ENC(db); + preupdate.keyinfo.nKeyField = pTab->nCol; + preupdate.keyinfo.aSortFlags = (u8*)&fakeSortOrder; + preupdate.iKey1 = iKey1; + preupdate.iKey2 = iKey2; + preupdate.pTab = pTab; + preupdate.iBlobWrite = iBlobWrite; + + db->pPreUpdate = &preupdate; + db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2); + db->pPreUpdate = 0; + sqlite3DbFree(db, preupdate.aRecord); + vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pUnpacked); + vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pNewUnpacked); + if( preupdate.aNew ){ + int i; + for(i=0; inField; i++){ + sqlite3VdbeMemRelease(&preupdate.aNew[i]); + } + sqlite3DbFreeNN(db, preupdate.aNew); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +/************** End of vdbeaux.c *********************************************/ +/************** Begin file vdbeapi.c *****************************************/ +/* +** 2004 May 26 +** +** 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 contains code use to implement APIs that are part of the +** VDBE. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Return TRUE (non-zero) of the statement supplied as an argument needs +** to be recompiled. A statement needs to be recompiled whenever the +** execution environment changes in a way that would alter the program +** that sqlite3_prepare() generates. For example, if new functions or +** collating sequences are registered or if an authorizer function is +** added or changed. +*/ +SQLITE_API int sqlite3_expired(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + return p==0 || p->expired; +} +#endif + +/* +** Check on a Vdbe to make sure it has not been finalized. Log +** an error and return true if it has been finalized (or is otherwise +** invalid). Return false if it is ok. +*/ +static int vdbeSafety(Vdbe *p){ + if( p->db==0 ){ + sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement"); + return 1; + }else{ + return 0; + } +} +static int vdbeSafetyNotNull(Vdbe *p){ + if( p==0 ){ + sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement"); + return 1; + }else{ + return vdbeSafety(p); + } +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Invoke the profile callback. This routine is only called if we already +** know that the profile callback is defined and needs to be invoked. +*/ +static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ + sqlite3_int64 iNow; + sqlite3_int64 iElapse; + assert( p->startTime>0 ); + assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); + assert( db->init.busy==0 ); + assert( p->zSql!=0 ); + sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); + iElapse = (iNow - p->startTime)*1000000; +#ifndef SQLITE_OMIT_DEPRECATED + if( db->xProfile ){ + db->xProfile(db->pProfileArg, p->zSql, iElapse); + } +#endif + if( db->mTrace & SQLITE_TRACE_PROFILE ){ + db->trace.xV2(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); + } + p->startTime = 0; +} +/* +** The checkProfileCallback(DB,P) macro checks to see if a profile callback +** is needed, and it invokes the callback if it is needed. +*/ +# define checkProfileCallback(DB,P) \ + if( ((P)->startTime)>0 ){ invokeProfileCallback(DB,P); } +#else +# define checkProfileCallback(DB,P) /*no-op*/ +#endif + +/* +** The following routine destroys a virtual machine that is created by +** the sqlite3_compile() routine. The integer returned is an SQLITE_ +** success/failure code that describes the result of executing the virtual +** machine. +** +** This routine sets the error code and string returned by +** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){ + int rc; + if( pStmt==0 ){ + /* IMPLEMENTATION-OF: R-57228-12904 Invoking sqlite3_finalize() on a NULL + ** pointer is a harmless no-op. */ + rc = SQLITE_OK; + }else{ + Vdbe *v = (Vdbe*)pStmt; + sqlite3 *db = v->db; + if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); + rc = sqlite3VdbeFinalize(v); + rc = sqlite3ApiExit(db, rc); + sqlite3LeaveMutexAndCloseZombie(db); + } + return rc; +} + +/* +** Terminate the current execution of an SQL statement and reset it +** back to its starting state so that it can be reused. A success code from +** the prior execution is returned. +** +** This routine sets the error code and string returned by +** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16(). +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){ + int rc; + if( pStmt==0 ){ + rc = SQLITE_OK; + }else{ + Vdbe *v = (Vdbe*)pStmt; + sqlite3 *db = v->db; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); + rc = sqlite3VdbeReset(v); + sqlite3VdbeRewind(v); + assert( (rc & (db->errMask))==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + } + return rc; +} + +/* +** Set all the parameters in the compiled SQL statement to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ + int i; + int rc = SQLITE_OK; + Vdbe *p = (Vdbe*)pStmt; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex; +#endif + sqlite3_mutex_enter(mutex); + for(i=0; inVar; i++){ + sqlite3VdbeMemRelease(&p->aVar[i]); + p->aVar[i].flags = MEM_Null; + } + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); + if( p->expmask ){ + p->expired = 1; + } + sqlite3_mutex_leave(mutex); + return rc; +} + + +/**************************** sqlite3_value_ ******************************* +** The following routines extract information from a Mem or sqlite3_value +** structure. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value *pVal){ + Mem *p = (Mem*)pVal; + if( p->flags & (MEM_Blob|MEM_Str) ){ + if( ExpandBlob(p)!=SQLITE_OK ){ + assert( p->flags==MEM_Null && p->z==0 ); + return 0; + } + p->flags |= MEM_Blob; + return p->n ? p->z : 0; + }else{ + return sqlite3_value_text(pVal); + } +} +SQLITE_API int sqlite3_value_bytes(sqlite3_value *pVal){ + return sqlite3ValueBytes(pVal, SQLITE_UTF8); +} +SQLITE_API int sqlite3_value_bytes16(sqlite3_value *pVal){ + return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE); +} +SQLITE_API double sqlite3_value_double(sqlite3_value *pVal){ + return sqlite3VdbeRealValue((Mem*)pVal); +} +SQLITE_API int sqlite3_value_int(sqlite3_value *pVal){ + return (int)sqlite3VdbeIntValue((Mem*)pVal); +} +SQLITE_API sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ + return sqlite3VdbeIntValue((Mem*)pVal); +} +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ + Mem *pMem = (Mem*)pVal; + return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); +} +SQLITE_API void *sqlite3_value_pointer(sqlite3_value *pVal, const char *zPType){ + Mem *p = (Mem*)pVal; + if( (p->flags&(MEM_TypeMask|MEM_Term|MEM_Subtype)) == + (MEM_Null|MEM_Term|MEM_Subtype) + && zPType!=0 + && p->eSubtype=='p' + && strcmp(p->u.zPType, zPType)==0 + ){ + return (void*)p->z; + }else{ + return 0; + } +} +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ + return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_value_text16(sqlite3_value* pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); +} +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value *pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16BE); +} +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ + return sqlite3ValueText(pVal, SQLITE_UTF16LE); +} +#endif /* SQLITE_OMIT_UTF16 */ +/* EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five +** fundamental datatypes: 64-bit signed integer 64-bit IEEE floating +** point number string BLOB NULL +*/ +SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ + static const u8 aType[] = { + SQLITE_BLOB, /* 0x00 (not possible) */ + SQLITE_NULL, /* 0x01 NULL */ + SQLITE_TEXT, /* 0x02 TEXT */ + SQLITE_NULL, /* 0x03 (not possible) */ + SQLITE_INTEGER, /* 0x04 INTEGER */ + SQLITE_NULL, /* 0x05 (not possible) */ + SQLITE_INTEGER, /* 0x06 INTEGER + TEXT */ + SQLITE_NULL, /* 0x07 (not possible) */ + SQLITE_FLOAT, /* 0x08 FLOAT */ + SQLITE_NULL, /* 0x09 (not possible) */ + SQLITE_FLOAT, /* 0x0a FLOAT + TEXT */ + SQLITE_NULL, /* 0x0b (not possible) */ + SQLITE_INTEGER, /* 0x0c (not possible) */ + SQLITE_NULL, /* 0x0d (not possible) */ + SQLITE_INTEGER, /* 0x0e (not possible) */ + SQLITE_NULL, /* 0x0f (not possible) */ + SQLITE_BLOB, /* 0x10 BLOB */ + SQLITE_NULL, /* 0x11 (not possible) */ + SQLITE_TEXT, /* 0x12 (not possible) */ + SQLITE_NULL, /* 0x13 (not possible) */ + SQLITE_INTEGER, /* 0x14 INTEGER + BLOB */ + SQLITE_NULL, /* 0x15 (not possible) */ + SQLITE_INTEGER, /* 0x16 (not possible) */ + SQLITE_NULL, /* 0x17 (not possible) */ + SQLITE_FLOAT, /* 0x18 FLOAT + BLOB */ + SQLITE_NULL, /* 0x19 (not possible) */ + SQLITE_FLOAT, /* 0x1a (not possible) */ + SQLITE_NULL, /* 0x1b (not possible) */ + SQLITE_INTEGER, /* 0x1c (not possible) */ + SQLITE_NULL, /* 0x1d (not possible) */ + SQLITE_INTEGER, /* 0x1e (not possible) */ + SQLITE_NULL, /* 0x1f (not possible) */ + SQLITE_FLOAT, /* 0x20 INTREAL */ + SQLITE_NULL, /* 0x21 (not possible) */ + SQLITE_TEXT, /* 0x22 INTREAL + TEXT */ + SQLITE_NULL, /* 0x23 (not possible) */ + SQLITE_FLOAT, /* 0x24 (not possible) */ + SQLITE_NULL, /* 0x25 (not possible) */ + SQLITE_FLOAT, /* 0x26 (not possible) */ + SQLITE_NULL, /* 0x27 (not possible) */ + SQLITE_FLOAT, /* 0x28 (not possible) */ + SQLITE_NULL, /* 0x29 (not possible) */ + SQLITE_FLOAT, /* 0x2a (not possible) */ + SQLITE_NULL, /* 0x2b (not possible) */ + SQLITE_FLOAT, /* 0x2c (not possible) */ + SQLITE_NULL, /* 0x2d (not possible) */ + SQLITE_FLOAT, /* 0x2e (not possible) */ + SQLITE_NULL, /* 0x2f (not possible) */ + SQLITE_BLOB, /* 0x30 (not possible) */ + SQLITE_NULL, /* 0x31 (not possible) */ + SQLITE_TEXT, /* 0x32 (not possible) */ + SQLITE_NULL, /* 0x33 (not possible) */ + SQLITE_FLOAT, /* 0x34 (not possible) */ + SQLITE_NULL, /* 0x35 (not possible) */ + SQLITE_FLOAT, /* 0x36 (not possible) */ + SQLITE_NULL, /* 0x37 (not possible) */ + SQLITE_FLOAT, /* 0x38 (not possible) */ + SQLITE_NULL, /* 0x39 (not possible) */ + SQLITE_FLOAT, /* 0x3a (not possible) */ + SQLITE_NULL, /* 0x3b (not possible) */ + SQLITE_FLOAT, /* 0x3c (not possible) */ + SQLITE_NULL, /* 0x3d (not possible) */ + SQLITE_FLOAT, /* 0x3e (not possible) */ + SQLITE_NULL, /* 0x3f (not possible) */ + }; +#ifdef SQLITE_DEBUG + { + int eType = SQLITE_BLOB; + if( pVal->flags & MEM_Null ){ + eType = SQLITE_NULL; + }else if( pVal->flags & (MEM_Real|MEM_IntReal) ){ + eType = SQLITE_FLOAT; + }else if( pVal->flags & MEM_Int ){ + eType = SQLITE_INTEGER; + }else if( pVal->flags & MEM_Str ){ + eType = SQLITE_TEXT; + } + assert( eType == aType[pVal->flags&MEM_AffMask] ); + } +#endif + return aType[pVal->flags&MEM_AffMask]; +} + +/* Return true if a parameter to xUpdate represents an unchanged column */ +SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){ + return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero); +} + +/* Return true if a parameter value originated from an sqlite3_bind() */ +SQLITE_API int sqlite3_value_frombind(sqlite3_value *pVal){ + return (pVal->flags&MEM_FromBind)!=0; +} + +/* Make a copy of an sqlite3_value object +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ + sqlite3_value *pNew; + if( pOrig==0 ) return 0; + pNew = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return 0; + memset(pNew, 0, sizeof(*pNew)); + memcpy(pNew, pOrig, MEMCELLSIZE); + pNew->flags &= ~MEM_Dyn; + pNew->db = 0; + if( pNew->flags&(MEM_Str|MEM_Blob) ){ + pNew->flags &= ~(MEM_Static|MEM_Dyn); + pNew->flags |= MEM_Ephem; + if( sqlite3VdbeMemMakeWriteable(pNew)!=SQLITE_OK ){ + sqlite3ValueFree(pNew); + pNew = 0; + } + }else if( pNew->flags & MEM_Null ){ + /* Do not duplicate pointer values */ + pNew->flags &= ~(MEM_Term|MEM_Subtype); + } + return pNew; +} + +/* Destroy an sqlite3_value object previously obtained from +** sqlite3_value_dup(). +*/ +SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ + sqlite3ValueFree(pOld); +} + + +/**************************** sqlite3_result_ ******************************* +** The following routines are used by user-defined functions to specify +** the function result. +** +** The setStrOrError() function calls sqlite3VdbeMemSetStr() to store the +** result as a string or blob. Appropriate errors are set if the string/blob +** is too big or if an OOM occurs. +** +** The invokeValueDestructor(P,X) routine invokes destructor function X() +** on value P is not going to be used and need to be destroyed. +*/ +static void setResultStrOrError( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* String pointer */ + int n, /* Bytes in string, or negative */ + u8 enc, /* Encoding of z. 0 for BLOBs */ + void (*xDel)(void*) /* Destructor function */ +){ + Mem *pOut = pCtx->pOut; + int rc = sqlite3VdbeMemSetStr(pOut, z, n, enc, xDel); + if( rc ){ + if( rc==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(pCtx); + }else{ + /* The only errors possible from sqlite3VdbeMemSetStr are + ** SQLITE_TOOBIG and SQLITE_NOMEM */ + assert( rc==SQLITE_NOMEM ); + sqlite3_result_error_nomem(pCtx); + } + return; + } + sqlite3VdbeChangeEncoding(pOut, pCtx->enc); + if( sqlite3VdbeMemTooBig(pOut) ){ + sqlite3_result_error_toobig(pCtx); + } +} +static int invokeValueDestructor( + const void *p, /* Value to destroy */ + void (*xDel)(void*), /* The destructor */ + sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if no NULL */ +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( xDel==0 ){ + /* noop */ + }else if( xDel==SQLITE_TRANSIENT ){ + /* noop */ + }else{ + xDel((void*)p); + } + sqlite3_result_error_toobig(pCtx); + return SQLITE_TOOBIG; +} +SQLITE_API void sqlite3_result_blob( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( n>=0 ); + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, 0, xDel); +} +SQLITE_API void sqlite3_result_blob64( + sqlite3_context *pCtx, + const void *z, + sqlite3_uint64 n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert( xDel!=SQLITE_DYNAMIC ); + if( n>0x7fffffff ){ + (void)invokeValueDestructor(z, xDel, pCtx); + }else{ + setResultStrOrError(pCtx, z, (int)n, 0, xDel); + } +} +SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetDouble(pCtx->pOut, rVal); +} +SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_ERROR; + sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_ERROR; + sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); +} +#endif +SQLITE_API void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetInt64(pCtx->pOut, (i64)iVal); +} +SQLITE_API void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetInt64(pCtx->pOut, iVal); +} +SQLITE_API void sqlite3_result_null(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); +} +SQLITE_API void sqlite3_result_pointer( + sqlite3_context *pCtx, + void *pPtr, + const char *zPType, + void (*xDestructor)(void*) +){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + sqlite3VdbeMemRelease(pOut); + pOut->flags = MEM_Null; + sqlite3VdbeMemSetPointer(pOut, pPtr, zPType, xDestructor); +} +SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + pOut->eSubtype = eSubtype & 0xff; + pOut->flags |= MEM_Subtype; +} +SQLITE_API void sqlite3_result_text( + sqlite3_context *pCtx, + const char *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel); +} +SQLITE_API void sqlite3_result_text64( + sqlite3_context *pCtx, + const char *z, + sqlite3_uint64 n, + void (*xDel)(void *), + unsigned char enc +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert( xDel!=SQLITE_DYNAMIC ); + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + if( n>0x7fffffff ){ + (void)invokeValueDestructor(z, xDel, pCtx); + }else{ + setResultStrOrError(pCtx, z, (int)n, enc, xDel); + } +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API void sqlite3_result_text16( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel); +} +SQLITE_API void sqlite3_result_text16be( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel); +} +SQLITE_API void sqlite3_result_text16le( + sqlite3_context *pCtx, + const void *z, + int n, + void (*xDel)(void *) +){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel); +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemCopy(pOut, pValue); + sqlite3VdbeChangeEncoding(pOut, pCtx->enc); + if( sqlite3VdbeMemTooBig(pOut) ){ + sqlite3_result_error_toobig(pCtx); + } +} +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ + sqlite3_result_zeroblob64(pCtx, n>0 ? n : 0); +} +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(pCtx); + return SQLITE_TOOBIG; + } +#ifndef SQLITE_OMIT_INCRBLOB + sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n); + return SQLITE_OK; +#else + return sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n); +#endif +} +SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ + pCtx->isError = errCode ? errCode : -1; +#ifdef SQLITE_DEBUG + if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; +#endif + if( pCtx->pOut->flags & MEM_Null ){ + setResultStrOrError(pCtx, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, + SQLITE_STATIC); + } +} + +/* Force an SQLITE_TOOBIG error. */ +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + pCtx->isError = SQLITE_TOOBIG; + sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, + SQLITE_UTF8, SQLITE_STATIC); +} + +/* An SQLITE_NOMEM error. */ +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); + pCtx->isError = SQLITE_NOMEM_BKPT; + sqlite3OomFault(pCtx->pOut->db); +} + +#ifndef SQLITE_UNTESTABLE +/* Force the INT64 value currently stored as the result to be +** a MEM_IntReal value. See the SQLITE_TESTCTRL_RESULT_INTREAL +** test-control. +*/ +SQLITE_PRIVATE void sqlite3ResultIntReal(sqlite3_context *pCtx){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + if( pCtx->pOut->flags & MEM_Int ){ + pCtx->pOut->flags &= ~MEM_Int; + pCtx->pOut->flags |= MEM_IntReal; + } +} +#endif + + +/* +** This function is called after a transaction has been committed. It +** invokes callbacks registered with sqlite3_wal_hook() as required. +*/ +static int doWalCallbacks(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_WAL + int i; + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + int nEntry; + sqlite3BtreeEnter(pBt); + nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt)); + sqlite3BtreeLeave(pBt); + if( nEntry>0 && db->xWalCallback && rc==SQLITE_OK ){ + rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zDbSName, nEntry); + } + } + } +#endif + return rc; +} + + +/* +** Execute the statement pStmt, either until a row of data is ready, the +** statement is completely executed or an error occurs. +** +** This routine implements the bulk of the logic behind the sqlite_step() +** API. The only thing omitted is the automatic recompile if a +** schema change has occurred. That detail is handled by the +** outer sqlite3_step() wrapper procedure. +*/ +static int sqlite3Step(Vdbe *p){ + sqlite3 *db; + int rc; + + assert(p); + db = p->db; + if( p->eVdbeState!=VDBE_RUN_STATE ){ + restart_step: + if( p->eVdbeState==VDBE_READY_STATE ){ + if( p->expired ){ + p->rc = SQLITE_SCHEMA; + rc = SQLITE_ERROR; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ + /* If this statement was prepared using saved SQL and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same + ** value. + */ + rc = sqlite3VdbeTransferError(p); + } + goto end_of_step; + } + + /* If there are no other statements currently running, then + ** reset the interrupt flag. This prevents a call to sqlite3_interrupt + ** from interrupting a statement that has not yet started. + */ + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + + assert( db->nVdbeWrite>0 || db->autoCommit==0 + || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + ); + +#ifndef SQLITE_OMIT_TRACE + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 + && !db->init.busy && p->zSql ){ + sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); + } +#endif + + db->nVdbeActive++; + if( p->readOnly==0 ) db->nVdbeWrite++; + if( p->bIsReader ) db->nVdbeRead++; + p->pc = 0; + p->eVdbeState = VDBE_RUN_STATE; + }else + + if( ALWAYS(p->eVdbeState==VDBE_HALT_STATE) ){ + /* We used to require that sqlite3_reset() be called before retrying + ** sqlite3_step() after any error or after SQLITE_DONE. But beginning + ** with version 3.7.0, we changed this so that sqlite3_reset() would + ** be called automatically instead of throwing the SQLITE_MISUSE error. + ** This "automatic-reset" change is not technically an incompatibility, + ** since any application that receives an SQLITE_MISUSE is broken by + ** definition. + ** + ** Nevertheless, some published applications that were originally written + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** returns, and those were broken by the automatic-reset change. As a + ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the + ** legacy behavior of returning SQLITE_MISUSE for cases where the + ** previous sqlite3_step() returned something other than a SQLITE_LOCKED + ** or SQLITE_BUSY error. + */ +#ifdef SQLITE_OMIT_AUTORESET + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + sqlite3_reset((sqlite3_stmt*)p); + }else{ + return SQLITE_MISUSE_BKPT; + } +#else + sqlite3_reset((sqlite3_stmt*)p); +#endif + assert( p->eVdbeState==VDBE_READY_STATE ); + goto restart_step; + } + } + +#ifdef SQLITE_DEBUG + p->rcApp = SQLITE_OK; +#endif +#ifndef SQLITE_OMIT_EXPLAIN + if( p->explain ){ + rc = sqlite3VdbeList(p); + }else +#endif /* SQLITE_OMIT_EXPLAIN */ + { + db->nVdbeExec++; + rc = sqlite3VdbeExec(p); + db->nVdbeExec--; + } + + if( rc==SQLITE_ROW ){ + assert( p->rc==SQLITE_OK ); + assert( db->mallocFailed==0 ); + db->errCode = SQLITE_ROW; + return SQLITE_ROW; + }else{ +#ifndef SQLITE_OMIT_TRACE + /* If the statement completed successfully, invoke the profile callback */ + checkProfileCallback(db, p); +#endif + + if( rc==SQLITE_DONE && db->autoCommit ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } + }else if( rc!=SQLITE_DONE && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ + /* If this statement was prepared using saved SQL and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same value. + */ + rc = sqlite3VdbeTransferError(p); + } + } + + db->errCode = rc; + if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){ + p->rc = SQLITE_NOMEM_BKPT; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ) rc = p->rc; + } +end_of_step: + /* There are only a limited number of result codes allowed from the + ** statements prepared using the legacy sqlite3_prepare() interface */ + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 + || rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR + || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE + ); + return (rc&db->errMask); +} + +/* +** This is the top-level implementation of sqlite3_step(). Call +** sqlite3Step() to do most of the work. If a schema error occurs, +** call sqlite3Reprepare() and try again. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ + int rc = SQLITE_OK; /* Result from sqlite3Step() */ + Vdbe *v = (Vdbe*)pStmt; /* the prepared statement */ + int cnt = 0; /* Counter to prevent infinite loop of reprepares */ + sqlite3 *db; /* The database connection */ + + if( vdbeSafetyNotNull(v) ){ + return SQLITE_MISUSE_BKPT; + } + db = v->db; + sqlite3_mutex_enter(db->mutex); + while( (rc = sqlite3Step(v))==SQLITE_SCHEMA + && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){ + int savedPc = v->pc; + rc = sqlite3Reprepare(v); + if( rc!=SQLITE_OK ){ + /* This case occurs after failing to recompile an sql statement. + ** The error message from the SQL compiler has already been loaded + ** into the database handle. This block copies the error message + ** from the database handle into the statement and sets the statement + ** program counter to 0 to ensure that when the statement is + ** finalized or reset the parser error message is available via + ** sqlite3_errmsg() and sqlite3_errcode(). + */ + const char *zErr = (const char *)sqlite3_value_text(db->pErr); + sqlite3DbFree(db, v->zErrMsg); + if( !db->mallocFailed ){ + v->zErrMsg = sqlite3DbStrDup(db, zErr); + v->rc = rc = sqlite3ApiExit(db, rc); + } else { + v->zErrMsg = 0; + v->rc = rc = SQLITE_NOMEM_BKPT; + } + break; + } + sqlite3_reset(pStmt); + if( savedPc>=0 ){ + /* Setting minWriteFileFormat to 254 is a signal to the OP_Init and + ** OP_Trace opcodes to *not* perform SQLITE_TRACE_STMT because it has + ** already been done once on a prior invocation that failed due to + ** SQLITE_SCHEMA. tag-20220401a */ + v->minWriteFileFormat = 254; + } + assert( v->expired==0 ); + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** Extract the user data from a sqlite3_context structure and return a +** pointer to it. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ + assert( p && p->pFunc ); + return p->pFunc->pUserData; +} + +/* +** Extract the user data from a sqlite3_context structure and return a +** pointer to it. +** +** IMPLEMENTATION-OF: R-46798-50301 The sqlite3_context_db_handle() interface +** returns a copy of the pointer to the database connection (the 1st +** parameter) of the sqlite3_create_function() and +** sqlite3_create_function16() routines that originally registered the +** application defined function. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ + assert( p && p->pOut ); + return p->pOut->db; +} + +/* +** If this routine is invoked from within an xColumn method of a virtual +** table, then it returns true if and only if the the call is during an +** UPDATE operation and the value of the column will not be modified +** by the UPDATE. +** +** If this routine is called from any context other than within the +** xColumn method of a virtual table, then the return value is meaningless +** and arbitrary. +** +** Virtual table implements might use this routine to optimize their +** performance by substituting a NULL result, or some other light-weight +** value, as a signal to the xUpdate routine that the column is unchanged. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ + assert( p ); + return sqlite3_value_nochange(p->pOut); +} + +/* +** Implementation of sqlite3_vtab_in_first() (if bNext==0) and +** sqlite3_vtab_in_next() (if bNext!=0). +*/ +static int valueFromValueList( + sqlite3_value *pVal, /* Pointer to the ValueList object */ + sqlite3_value **ppOut, /* Store the next value from the list here */ + int bNext /* 1 for _next(). 0 for _first() */ +){ + int rc; + ValueList *pRhs; + + *ppOut = 0; + if( pVal==0 ) return SQLITE_MISUSE; + pRhs = (ValueList*)sqlite3_value_pointer(pVal, "ValueList"); + if( pRhs==0 ) return SQLITE_MISUSE; + if( bNext ){ + rc = sqlite3BtreeNext(pRhs->pCsr, 0); + }else{ + int dummy = 0; + rc = sqlite3BtreeFirst(pRhs->pCsr, &dummy); + assert( rc==SQLITE_OK || sqlite3BtreeEof(pRhs->pCsr) ); + if( sqlite3BtreeEof(pRhs->pCsr) ) rc = SQLITE_DONE; + } + if( rc==SQLITE_OK ){ + u32 sz; /* Size of current row in bytes */ + Mem sMem; /* Raw content of current row */ + memset(&sMem, 0, sizeof(sMem)); + sz = sqlite3BtreePayloadSize(pRhs->pCsr); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pRhs->pCsr,(int)sz,&sMem); + if( rc==SQLITE_OK ){ + u8 *zBuf = (u8*)sMem.z; + u32 iSerial; + sqlite3_value *pOut = pRhs->pOut; + int iOff = 1 + getVarint32(&zBuf[1], iSerial); + sqlite3VdbeSerialGet(&zBuf[iOff], iSerial, pOut); + pOut->enc = ENC(pOut->db); + if( (pOut->flags & MEM_Ephem)!=0 && sqlite3VdbeMemMakeWriteable(pOut) ){ + rc = SQLITE_NOMEM; + }else{ + *ppOut = pOut; + } + } + sqlite3VdbeMemRelease(&sMem); + } + return rc; +} + +/* +** Set the iterator value pVal to point to the first value in the set. +** Set (*ppOut) to point to this value before returning. +*/ +SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut){ + return valueFromValueList(pVal, ppOut, 0); +} + +/* +** Set the iterator value pVal to point to the next value in the set. +** Set (*ppOut) to point to this value before returning. +*/ +SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut){ + return valueFromValueList(pVal, ppOut, 1); +} + +/* +** Return the current time for a statement. If the current time +** is requested more than once within the same run of a single prepared +** statement, the exact same time is returned for each invocation regardless +** of the amount of time that elapses between invocations. In other words, +** the time returned is always the time of the first call. +*/ +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ + int rc; +#ifndef SQLITE_ENABLE_STAT4 + sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; + assert( p->pVdbe!=0 ); +#else + sqlite3_int64 iTime = 0; + sqlite3_int64 *piTime = p->pVdbe!=0 ? &p->pVdbe->iCurrentTime : &iTime; +#endif + if( *piTime==0 ){ + rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, piTime); + if( rc ) *piTime = 0; + } + return *piTime; +} + +/* +** Create a new aggregate context for p and return a pointer to +** its pMem->z element. +*/ +static SQLITE_NOINLINE void *createAggContext(sqlite3_context *p, int nByte){ + Mem *pMem = p->pMem; + assert( (pMem->flags & MEM_Agg)==0 ); + if( nByte<=0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + }else{ + sqlite3VdbeMemClearAndResize(pMem, nByte); + pMem->flags = MEM_Agg; + pMem->u.pDef = p->pFunc; + if( pMem->z ){ + memset(pMem->z, 0, nByte); + } + } + return (void*)pMem->z; +} + +/* +** Allocate or return the aggregate context for a user function. A new +** context is allocated on the first call. Subsequent calls return the +** same context that was returned on prior calls. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ + assert( p && p->pFunc && p->pFunc->xFinalize ); + assert( sqlite3_mutex_held(p->pOut->db->mutex) ); + testcase( nByte<0 ); + if( (p->pMem->flags & MEM_Agg)==0 ){ + return createAggContext(p, nByte); + }else{ + return (void*)p->pMem->z; + } +} + +/* +** Return the auxiliary data pointer, if any, for the iArg'th argument to +** the user-function defined by pCtx. +** +** The left-most argument is 0. +** +** Undocumented behavior: If iArg is negative then access a cache of +** auxiliary data pointers that is available to all functions within a +** single prepared statement. The iArg values must match. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ + AuxData *pAuxData; + + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); +#if SQLITE_ENABLE_STAT4 + if( pCtx->pVdbe==0 ) return 0; +#else + assert( pCtx->pVdbe!=0 ); +#endif + for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ + if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + return pAuxData->pAux; + } + } + return 0; +} + +/* +** Set the auxiliary data pointer and delete function, for the iArg'th +** argument to the user-function defined by pCtx. Any previous value is +** deleted by calling the delete function specified when it was set. +** +** The left-most argument is 0. +** +** Undocumented behavior: If iArg is negative then make the data available +** to all functions within the current prepared statement using iArg as an +** access code. +*/ +SQLITE_API void sqlite3_set_auxdata( + sqlite3_context *pCtx, + int iArg, + void *pAux, + void (*xDelete)(void*) +){ + AuxData *pAuxData; + Vdbe *pVdbe = pCtx->pVdbe; + + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); +#ifdef SQLITE_ENABLE_STAT4 + if( pVdbe==0 ) goto failed; +#else + assert( pVdbe!=0 ); +#endif + + for(pAuxData=pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ + if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + break; + } + } + if( pAuxData==0 ){ + pAuxData = sqlite3DbMallocZero(pVdbe->db, sizeof(AuxData)); + if( !pAuxData ) goto failed; + pAuxData->iAuxOp = pCtx->iOp; + pAuxData->iAuxArg = iArg; + pAuxData->pNextAux = pVdbe->pAuxData; + pVdbe->pAuxData = pAuxData; + if( pCtx->isError==0 ) pCtx->isError = -1; + }else if( pAuxData->xDeleteAux ){ + pAuxData->xDeleteAux(pAuxData->pAux); + } + + pAuxData->pAux = pAux; + pAuxData->xDeleteAux = xDelete; + return; + +failed: + if( xDelete ){ + xDelete(pAux); + } +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Return the number of times the Step function of an aggregate has been +** called. +** +** This function is deprecated. Do not use it for new code. It is +** provide only to avoid breaking legacy code. New aggregate function +** implementations should keep their own counts within their aggregate +** context. +*/ +SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){ + assert( p && p->pMem && p->pFunc && p->pFunc->xFinalize ); + return p->pMem->n; +} +#endif + +/* +** Return the number of columns in the result set for the statement pStmt. +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){ + Vdbe *pVm = (Vdbe *)pStmt; + return pVm ? pVm->nResColumn : 0; +} + +/* +** Return the number of values available from the current row of the +** currently executing statement pStmt. +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt){ + Vdbe *pVm = (Vdbe *)pStmt; + if( pVm==0 || pVm->pResultSet==0 ) return 0; + return pVm->nResColumn; +} + +/* +** Return a pointer to static memory containing an SQL NULL value. +*/ +static const Mem *columnNullValue(void){ + /* Even though the Mem structure contains an element + ** of type i64, on certain architectures (x86) with certain compiler + ** switches (-Os), gcc may align this Mem object on a 4-byte boundary + ** instead of an 8-byte one. This all works fine, except that when + ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s + ** that a Mem structure is located on an 8-byte boundary. To prevent + ** these assert()s from failing, when building with SQLITE_DEBUG defined + ** using gcc, we force nullMem to be 8-byte aligned using the magical + ** __attribute__((aligned(8))) macro. */ + static const Mem nullMem +#if defined(SQLITE_DEBUG) && defined(__GNUC__) + __attribute__((aligned(8))) +#endif + = { + /* .u = */ {0}, + /* .z = */ (char*)0, + /* .n = */ (int)0, + /* .flags = */ (u16)MEM_Null, + /* .enc = */ (u8)0, + /* .eSubtype = */ (u8)0, + /* .db = */ (sqlite3*)0, + /* .szMalloc = */ (int)0, + /* .uTemp = */ (u32)0, + /* .zMalloc = */ (char*)0, + /* .xDel = */ (void(*)(void*))0, +#ifdef SQLITE_DEBUG + /* .pScopyFrom = */ (Mem*)0, + /* .mScopyFlags= */ 0, +#endif + }; + return &nullMem; +} + +/* +** Check to see if column iCol of the given statement is valid. If +** it is, return a pointer to the Mem for the value of that column. +** If iCol is not valid, return a pointer to a Mem which has a value +** of NULL. +*/ +static Mem *columnMem(sqlite3_stmt *pStmt, int i){ + Vdbe *pVm; + Mem *pOut; + + pVm = (Vdbe *)pStmt; + if( pVm==0 ) return (Mem*)columnNullValue(); + assert( pVm->db ); + sqlite3_mutex_enter(pVm->db->mutex); + if( pVm->pResultSet!=0 && inResColumn && i>=0 ){ + pOut = &pVm->pResultSet[i]; + }else{ + sqlite3Error(pVm->db, SQLITE_RANGE); + pOut = (Mem*)columnNullValue(); + } + return pOut; +} + +/* +** This function is called after invoking an sqlite3_value_XXX function on a +** column value (i.e. a value returned by evaluating an SQL expression in the +** select list of a SELECT statement) that may cause a malloc() failure. If +** malloc() has failed, the threads mallocFailed flag is cleared and the result +** code of statement pStmt set to SQLITE_NOMEM. +** +** Specifically, this is called from within: +** +** sqlite3_column_int() +** sqlite3_column_int64() +** sqlite3_column_text() +** sqlite3_column_text16() +** sqlite3_column_real() +** sqlite3_column_bytes() +** sqlite3_column_bytes16() +** sqiite3_column_blob() +*/ +static void columnMallocFailure(sqlite3_stmt *pStmt) +{ + /* If malloc() failed during an encoding conversion within an + ** sqlite3_column_XXX API, then set the return code of the statement to + ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR + ** and _finalize() will return NOMEM. + */ + Vdbe *p = (Vdbe *)pStmt; + if( p ){ + assert( p->db!=0 ); + assert( sqlite3_mutex_held(p->db->mutex) ); + p->rc = sqlite3ApiExit(p->db, p->rc); + sqlite3_mutex_leave(p->db->mutex); + } +} + +/**************************** sqlite3_column_ ******************************* +** The following routines are used to access elements of the current row +** in the result set. +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ + const void *val; + val = sqlite3_value_blob( columnMem(pStmt,i) ); + /* Even though there is no encoding conversion, value_blob() might + ** need to call malloc() to expand the result of a zeroblob() + ** expression. + */ + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_bytes( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_bytes16( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ + double val = sqlite3_value_double( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ + int val = sqlite3_value_int( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ + sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ + const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){ + Mem *pOut = columnMem(pStmt, i); + if( pOut->flags&MEM_Static ){ + pOut->flags &= ~MEM_Static; + pOut->flags |= MEM_Ephem; + } + columnMallocFailure(pStmt); + return (sqlite3_value *)pOut; +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ + const void *val = sqlite3_value_text16( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return val; +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ + int iType = sqlite3_value_type( columnMem(pStmt,i) ); + columnMallocFailure(pStmt); + return iType; +} + +/* +** Convert the N-th element of pStmt->pColName[] into a string using +** xFunc() then return that string. If N is out of range, return 0. +** +** There are up to 5 names for each column. useType determines which +** name is returned. Here are the names: +** +** 0 The column name as it should be displayed for output +** 1 The datatype name for the column +** 2 The name of the database that the column derives from +** 3 The name of the table that the column derives from +** 4 The name of the table column that the result column derives from +** +** If the result is not a simple column reference (if it is an expression +** or a constant) then useTypes 2, 3, and 4 return NULL. +*/ +static const void *columnName( + sqlite3_stmt *pStmt, /* The statement */ + int N, /* Which column to get the name for */ + int useUtf16, /* True to return the name as UTF16 */ + int useType /* What type of name */ +){ + const void *ret; + Vdbe *p; + int n; + sqlite3 *db; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pStmt==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + ret = 0; + p = (Vdbe *)pStmt; + db = p->db; + assert( db!=0 ); + n = sqlite3_column_count(pStmt); + if( N=0 ){ + N += useType*n; + sqlite3_mutex_enter(db->mutex); + assert( db->mallocFailed==0 ); +#ifndef SQLITE_OMIT_UTF16 + if( useUtf16 ){ + ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); + }else +#endif + { + ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); + } + /* A malloc may have failed inside of the _text() call. If this + ** is the case, clear the mallocFailed flag and return NULL. + */ + if( db->mallocFailed ){ + sqlite3OomClear(db); + ret = 0; + } + sqlite3_mutex_leave(db->mutex); + } + return ret; +} + +/* +** Return the name of the Nth column of the result set returned by SQL +** statement pStmt. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_NAME); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_NAME); +} +#endif + +/* +** Constraint: If you have ENABLE_COLUMN_METADATA then you must +** not define OMIT_DECLTYPE. +*/ +#if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA) +# error "Must not define both SQLITE_OMIT_DECLTYPE \ + and SQLITE_ENABLE_COLUMN_METADATA" +#endif + +#ifndef SQLITE_OMIT_DECLTYPE +/* +** Return the column declaration type (if applicable) of the 'i'th column +** of the result set of SQL statement pStmt. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_DECLTYPE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_DECLTYPE); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_DECLTYPE */ + +#ifdef SQLITE_ENABLE_COLUMN_METADATA +/* +** Return the name of the database from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_DATABASE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_DATABASE); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the name of the table from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_TABLE); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_TABLE); +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the name of the table column from which a result column derives. +** NULL is returned if the result column is an expression or constant or +** anything else which is not an unambiguous reference to a database column. +*/ +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 0, COLNAME_COLUMN); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ + return columnName(pStmt, N, 1, COLNAME_COLUMN); +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_ENABLE_COLUMN_METADATA */ + + +/******************************* sqlite3_bind_ *************************** +** +** Routines used to attach values to wildcards in a compiled SQL statement. +*/ +/* +** Unbind the value bound to variable i in virtual machine p. This is the +** the same as binding a NULL value to the column. If the "i" parameter is +** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. +** +** A successful evaluation of this routine acquires the mutex on p. +** the mutex is released if any kind of error occurs. +** +** The error code stored in database p->db is overwritten with the return +** value in any case. +*/ +static int vdbeUnbind(Vdbe *p, int i){ + Mem *pVar; + if( vdbeSafetyNotNull(p) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(p->db->mutex); + if( p->eVdbeState!=VDBE_READY_STATE ){ + sqlite3Error(p->db, SQLITE_MISUSE); + sqlite3_mutex_leave(p->db->mutex); + sqlite3_log(SQLITE_MISUSE, + "bind on a busy prepared statement: [%s]", p->zSql); + return SQLITE_MISUSE_BKPT; + } + if( i<1 || i>p->nVar ){ + sqlite3Error(p->db, SQLITE_RANGE); + sqlite3_mutex_leave(p->db->mutex); + return SQLITE_RANGE; + } + i--; + pVar = &p->aVar[i]; + sqlite3VdbeMemRelease(pVar); + pVar->flags = MEM_Null; + p->db->errCode = SQLITE_OK; + + /* If the bit corresponding to this variable in Vdbe.expmask is set, then + ** binding a new value to this variable invalidates the current query plan. + ** + ** IMPLEMENTATION-OF: R-57496-20354 If the specific value bound to a host + ** parameter in the WHERE clause might influence the choice of query plan + ** for a statement, then the statement will be automatically recompiled, + ** as if there had been a schema change, on the first sqlite3_step() call + ** following any change to the bindings of that parameter. + */ + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); + if( p->expmask!=0 && (p->expmask & (i>=31 ? 0x80000000 : (u32)1<expired = 1; + } + return SQLITE_OK; +} + +/* +** Bind a text or BLOB value. +*/ +static int bindText( + sqlite3_stmt *pStmt, /* The statement to bind against */ + int i, /* Index of the parameter to bind */ + const void *zData, /* Pointer to the data to be bound */ + i64 nData, /* Number of bytes of data to be bound */ + void (*xDel)(void*), /* Destructor for the data */ + u8 encoding /* Encoding for the data */ +){ + Vdbe *p = (Vdbe *)pStmt; + Mem *pVar; + int rc; + + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + if( zData!=0 ){ + pVar = &p->aVar[i-1]; + rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel); + if( rc==SQLITE_OK && encoding!=0 ){ + rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); + } + if( rc ){ + sqlite3Error(p->db, rc); + rc = sqlite3ApiExit(p->db, rc); + } + } + sqlite3_mutex_leave(p->db->mutex); + }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){ + xDel((void*)zData); + } + return rc; +} + + +/* +** Bind a blob value to an SQL statement variable. +*/ +SQLITE_API int sqlite3_bind_blob( + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, + void (*xDel)(void*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( nData<0 ) return SQLITE_MISUSE_BKPT; +#endif + return bindText(pStmt, i, zData, nData, xDel, 0); +} +SQLITE_API int sqlite3_bind_blob64( + sqlite3_stmt *pStmt, + int i, + const void *zData, + sqlite3_uint64 nData, + void (*xDel)(void*) +){ + assert( xDel!=SQLITE_DYNAMIC ); + return bindText(pStmt, i, zData, nData, xDel, 0); +} +SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ + return sqlite3_bind_int64(p, i, (i64)iValue); +} +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){ + int rc; + Vdbe *p = (Vdbe*)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_pointer( + sqlite3_stmt *pStmt, + int i, + void *pPtr, + const char *zPTtype, + void (*xDestructor)(void*) +){ + int rc; + Vdbe *p = (Vdbe*)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor); + sqlite3_mutex_leave(p->db->mutex); + }else if( xDestructor ){ + xDestructor(pPtr); + } + return rc; +} +SQLITE_API int sqlite3_bind_text( + sqlite3_stmt *pStmt, + int i, + const char *zData, + int nData, + void (*xDel)(void*) +){ + return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8); +} +SQLITE_API int sqlite3_bind_text64( + sqlite3_stmt *pStmt, + int i, + const char *zData, + sqlite3_uint64 nData, + void (*xDel)(void*), + unsigned char enc +){ + assert( xDel!=SQLITE_DYNAMIC ); + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + return bindText(pStmt, i, zData, nData, xDel, enc); +} +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API int sqlite3_bind_text16( + sqlite3_stmt *pStmt, + int i, + const void *zData, + int nData, + void (*xDel)(void*) +){ + return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE); +} +#endif /* SQLITE_OMIT_UTF16 */ +SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ + int rc; + switch( sqlite3_value_type((sqlite3_value*)pValue) ){ + case SQLITE_INTEGER: { + rc = sqlite3_bind_int64(pStmt, i, pValue->u.i); + break; + } + case SQLITE_FLOAT: { + assert( pValue->flags & (MEM_Real|MEM_IntReal) ); + rc = sqlite3_bind_double(pStmt, i, + (pValue->flags & MEM_Real) ? pValue->u.r : (double)pValue->u.i + ); + break; + } + case SQLITE_BLOB: { + if( pValue->flags & MEM_Zero ){ + rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero); + }else{ + rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT); + } + break; + } + case SQLITE_TEXT: { + rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT, + pValue->enc); + break; + } + default: { + rc = sqlite3_bind_null(pStmt, i); + break; + } + } + return rc; +} +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ +#ifndef SQLITE_OMIT_INCRBLOB + sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); +#else + rc = sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); +#endif + sqlite3_mutex_leave(p->db->mutex); + } + return rc; +} +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint64 n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + rc = SQLITE_TOOBIG; + }else{ + assert( (n & 0x7FFFFFFF)==n ); + rc = sqlite3_bind_zeroblob(pStmt, i, n); + } + rc = sqlite3ApiExit(p->db, rc); + sqlite3_mutex_leave(p->db->mutex); + return rc; +} + +/* +** Return the number of wildcards that can be potentially bound to. +** This routine is added to support DBD::SQLite. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + return p ? p->nVar : 0; +} + +/* +** Return the name of a wildcard parameter. Return NULL if the index +** is out of range or if the wildcard is unnamed. +** +** The result is always UTF-8. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ + Vdbe *p = (Vdbe*)pStmt; + if( p==0 ) return 0; + return sqlite3VListNumToName(p->pVList, i); +} + +/* +** Given a wildcard parameter name, return the index of the variable +** with that name. If there is no variable with the given name, +** return 0. +*/ +SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){ + if( p==0 || zName==0 ) return 0; + return sqlite3VListNameToNum(p->pVList, zName, nName); +} +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ + return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName)); +} + +/* +** Transfer all bindings from the first statement over to the second. +*/ +SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + int i; + assert( pTo->db==pFrom->db ); + assert( pTo->nVar==pFrom->nVar ); + sqlite3_mutex_enter(pTo->db->mutex); + for(i=0; inVar; i++){ + sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); + } + sqlite3_mutex_leave(pTo->db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Deprecated external interface. Internal/core SQLite code +** should call sqlite3TransferBindings. +** +** It is misuse to call this routine with statements from different +** database connections. But as this is a deprecated interface, we +** will not bother to check for that condition. +** +** If the two statements contain a different number of bindings, then +** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise +** SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ + Vdbe *pFrom = (Vdbe*)pFromStmt; + Vdbe *pTo = (Vdbe*)pToStmt; + if( pFrom->nVar!=pTo->nVar ){ + return SQLITE_ERROR; + } + assert( (pTo->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || pTo->expmask==0 ); + if( pTo->expmask ){ + pTo->expired = 1; + } + assert( (pFrom->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || pFrom->expmask==0 ); + if( pFrom->expmask ){ + pFrom->expired = 1; + } + return sqlite3TransferBindings(pFromStmt, pToStmt); +} +#endif + +/* +** Return the sqlite3* database handle to which the prepared statement given +** in the argument belongs. This is the same database handle that was +** the first argument to the sqlite3_prepare() that was used to create +** the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->db : 0; +} + +/* +** Return true if the prepared statement is guaranteed to not modify the +** database. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; +} + +/* +** Return 1 if the statement is an EXPLAIN and return 2 if the +** statement is an EXPLAIN QUERY PLAN +*/ +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->explain : 0; +} + +/* +** Return true if the prepared statement is in need of being reset. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ + Vdbe *v = (Vdbe*)pStmt; + return v!=0 && v->eVdbeState==VDBE_RUN_STATE; +} + +/* +** Return a pointer to the next prepared statement after pStmt associated +** with database connection pDb. If pStmt is NULL, return the first +** prepared statement for the database connection. Return NULL if there +** are no more. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ + sqlite3_stmt *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(pDb) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(pDb->mutex); + if( pStmt==0 ){ + pNext = (sqlite3_stmt*)pDb->pVdbe; + }else{ + pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext; + } + sqlite3_mutex_leave(pDb->mutex); + return pNext; +} + +/* +** Return the value of a status counter for a prepared statement +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ + Vdbe *pVdbe = (Vdbe*)pStmt; + u32 v; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !pStmt + || (op!=SQLITE_STMTSTATUS_MEMUSED && (op<0||op>=ArraySize(pVdbe->aCounter))) + ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + if( op==SQLITE_STMTSTATUS_MEMUSED ){ + sqlite3 *db = pVdbe->db; + sqlite3_mutex_enter(db->mutex); + v = 0; + db->pnBytesFreed = (int*)&v; + sqlite3VdbeDelete(pVdbe); + db->pnBytesFreed = 0; + sqlite3_mutex_leave(db->mutex); + }else{ + v = pVdbe->aCounter[op]; + if( resetFlag ) pVdbe->aCounter[op] = 0; + } + return (int)v; +} + +/* +** Return the SQL associated with a prepared statement +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + return p ? p->zSql : 0; +} + +/* +** Return the SQL associated with a prepared statement with +** bound parameters expanded. Space to hold the returned string is +** obtained from sqlite3_malloc(). The caller is responsible for +** freeing the returned string by passing it to sqlite3_free(). +** +** The SQLITE_TRACE_SIZE_LIMIT puts an upper bound on the size of +** expanded bound parameters. +*/ +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ +#ifdef SQLITE_OMIT_TRACE + return 0; +#else + char *z = 0; + const char *zSql = sqlite3_sql(pStmt); + if( zSql ){ + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + z = sqlite3VdbeExpandSql(p, zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return z; +#endif +} + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Return the normalized SQL associated with a prepared statement. +*/ +SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + if( p==0 ) return 0; + if( p->zNormSql==0 && ALWAYS(p->zSql!=0) ){ + sqlite3_mutex_enter(p->db->mutex); + p->zNormSql = sqlite3Normalize(p, p->zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return p->zNormSql; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Allocate and populate an UnpackedRecord structure based on the serialized +** record in nKey/pKey. Return a pointer to the new UnpackedRecord structure +** if successful, or a NULL pointer if an OOM error is encountered. +*/ +static UnpackedRecord *vdbeUnpackRecord( + KeyInfo *pKeyInfo, + int nKey, + const void *pKey +){ + UnpackedRecord *pRet; /* Return value */ + + pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( pRet ){ + memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nKeyField+1)); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); + } + return pRet; +} + +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or deleted. +*/ +SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + Mem *pMem; + int rc = SQLITE_OK; + + /* Test that this call is being made from within an SQLITE_DELETE or + ** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */ + if( !p || p->op==SQLITE_INSERT ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_old_out; + } + if( p->pPk ){ + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_old_out; + } + + /* If the old.* record has not yet been loaded into memory, do so now. */ + if( p->pUnpacked==0 ){ + u32 nRec; + u8 *aRec; + + assert( p->pCsr->eCurType==CURTYPE_BTREE ); + nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); + aRec = sqlite3DbMallocRaw(db, nRec); + if( !aRec ) goto preupdate_old_out; + rc = sqlite3BtreePayload(p->pCsr->uc.pCursor, 0, nRec, aRec); + if( rc==SQLITE_OK ){ + p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec); + if( !p->pUnpacked ) rc = SQLITE_NOMEM; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, aRec); + goto preupdate_old_out; + } + p->aRecord = aRec; + } + + pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey1); + }else if( iIdx>=p->pUnpacked->nField ){ + *ppValue = (sqlite3_value *)columnNullValue(); + }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ + if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_IntReal ); + sqlite3VdbeMemRealify(pMem); + } + } + + preupdate_old_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** the number of columns in the row being updated, deleted or inserted. +*/ +SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->keyinfo.nKeyField : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is designed to be called from within a pre-update callback +** only. It returns zero if the change that caused the callback was made +** immediately by a user SQL statement. Or, if the change was made by a +** trigger program, it returns the number of trigger programs currently +** on the stack (1 for a top-level trigger, 2 for a trigger fired by a +** top-level trigger etc.). +** +** For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL +** or SET DEFAULT action is considered a trigger. +*/ +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->v->nFrame : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is designed to be called from within a pre-update callback +** only. +*/ +SQLITE_API int sqlite3_preupdate_blobwrite(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->iBlobWrite : -1); +} +#endif + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or inserted. +*/ +SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + int rc = SQLITE_OK; + Mem *pMem; + + if( !p || p->op==SQLITE_DELETE ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_new_out; + } + if( p->pPk && p->op!=SQLITE_UPDATE ){ + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_new_out; + } + + if( p->op==SQLITE_INSERT ){ + /* For an INSERT, memory cell p->iNewReg contains the serialized record + ** that is being inserted. Deserialize it. */ + UnpackedRecord *pUnpack = p->pNewUnpacked; + if( !pUnpack ){ + Mem *pData = &p->v->aMem[p->iNewReg]; + rc = ExpandBlob(pData); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + pUnpack = vdbeUnpackRecord(&p->keyinfo, pData->n, pData->z); + if( !pUnpack ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + p->pNewUnpacked = pUnpack; + } + pMem = &pUnpack->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else if( iIdx>=pUnpack->nField ){ + pMem = (sqlite3_value *)columnNullValue(); + } + }else{ + /* For an UPDATE, memory cell (p->iNewReg+1+iIdx) contains the required + ** value. Make a copy of the cell contents and return a pointer to it. + ** It is not safe to return a pointer to the memory cell itself as the + ** caller may modify the value text encoding. + */ + assert( p->op==SQLITE_UPDATE ); + if( !p->aNew ){ + p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem) * p->pCsr->nField); + if( !p->aNew ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + } + assert( iIdx>=0 && iIdxpCsr->nField ); + pMem = &p->aNew[iIdx]; + if( pMem->flags==0 ){ + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else{ + rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iIdx]); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + } + } + } + *ppValue = pMem; + + preupdate_new_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Return status data for a single loop within query pStmt. +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement being queried */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Which metric to return */ + void *pOut /* OUT: Write the answer here */ +){ + Vdbe *p = (Vdbe*)pStmt; + ScanStatus *pScan; + if( idx<0 || idx>=p->nScan ) return 1; + pScan = &p->aScan[idx]; + switch( iScanStatusOp ){ + case SQLITE_SCANSTAT_NLOOP: { + *(sqlite3_int64*)pOut = p->anExec[pScan->addrLoop]; + break; + } + case SQLITE_SCANSTAT_NVISIT: { + *(sqlite3_int64*)pOut = p->anExec[pScan->addrVisit]; + break; + } + case SQLITE_SCANSTAT_EST: { + double r = 1.0; + LogEst x = pScan->nEst; + while( x<100 ){ + x += 10; + r *= 0.5; + } + *(double*)pOut = r*sqlite3LogEstToInt(x); + break; + } + case SQLITE_SCANSTAT_NAME: { + *(const char**)pOut = pScan->zName; + break; + } + case SQLITE_SCANSTAT_EXPLAIN: { + if( pScan->addrExplain ){ + *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z; + }else{ + *(const char**)pOut = 0; + } + break; + } + case SQLITE_SCANSTAT_SELECTID: { + if( pScan->addrExplain ){ + *(int*)pOut = p->aOp[ pScan->addrExplain ].p1; + }else{ + *(int*)pOut = -1; + } + break; + } + default: { + return 1; + } + } + return 0; +} + +/* +** Zero all counters associated with the sqlite3_stmt_scanstatus() data. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe*)pStmt; + memset(p->anExec, 0, p->nOp * sizeof(i64)); +} +#endif /* SQLITE_ENABLE_STMT_SCANSTATUS */ + +/************** End of vdbeapi.c *********************************************/ +/************** Begin file vdbetrace.c ***************************************/ +/* +** 2009 November 25 +** +** 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 contains code used to insert the values of host parameters +** (aka "wildcards") into the SQL text output by sqlite3_trace(). +** +** The Vdbe parse-tree explainer is also found here. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_TRACE + +/* +** zSql is a zero-terminated string of UTF-8 SQL text. Return the number of +** bytes in this text up to but excluding the first character in +** a host parameter. If the text contains no host parameters, return +** the total number of bytes in the text. +*/ +static int findNextHostParameter(const char *zSql, int *pnToken){ + int tokenType; + int nTotal = 0; + int n; + + *pnToken = 0; + while( zSql[0] ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + assert( n>0 && tokenType!=TK_ILLEGAL ); + if( tokenType==TK_VARIABLE ){ + *pnToken = n; + break; + } + nTotal += n; + zSql += n; + } + return nTotal; +} + +/* +** This function returns a pointer to a nul-terminated string in memory +** obtained from sqlite3DbMalloc(). If sqlite3.nVdbeExec is 1, then the +** string contains a copy of zRawSql but with host parameters expanded to +** their current bindings. Or, if sqlite3.nVdbeExec is greater than 1, +** then the returned string holds a copy of zRawSql with "-- " prepended +** to each line of text. +** +** If the SQLITE_TRACE_SIZE_LIMIT macro is defined to an integer, then +** then long strings and blobs are truncated to that many bytes. This +** can be used to prevent unreasonably large trace strings when dealing +** with large (multi-megabyte) strings and blobs. +** +** The calling function is responsible for making sure the memory returned +** is eventually freed. +** +** ALGORITHM: Scan the input string looking for host parameters in any of +** these forms: ?, ?N, $A, @A, :A. Take care to avoid text within +** string literals, quoted identifier names, and comments. For text forms, +** the host parameter index is found by scanning the prepared +** statement for the corresponding OP_Variable opcode. Once the host +** parameter index is known, locate the value in p->aVar[]. Then render +** the value as a literal in place of the host parameter name. +*/ +SQLITE_PRIVATE char *sqlite3VdbeExpandSql( + Vdbe *p, /* The prepared statement being evaluated */ + const char *zRawSql /* Raw text of the SQL statement */ +){ + sqlite3 *db; /* The database connection */ + int idx = 0; /* Index of a host parameter */ + int nextIndex = 1; /* Index of next ? host parameter */ + int n; /* Length of a token prefix */ + int nToken; /* Length of the parameter token */ + int i; /* Loop counter */ + Mem *pVar; /* Value of a host parameter */ + StrAccum out; /* Accumulate the output here */ +#ifndef SQLITE_OMIT_UTF16 + Mem utf8; /* Used to convert UTF16 into UTF8 for display */ +#endif + + db = p->db; + sqlite3StrAccumInit(&out, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + if( db->nVdbeExec>1 ){ + while( *zRawSql ){ + const char *zStart = zRawSql; + while( *(zRawSql++)!='\n' && *zRawSql ); + sqlite3_str_append(&out, "-- ", 3); + assert( (zRawSql - zStart) > 0 ); + sqlite3_str_append(&out, zStart, (int)(zRawSql-zStart)); + } + }else if( p->nVar==0 ){ + sqlite3_str_append(&out, zRawSql, sqlite3Strlen30(zRawSql)); + }else{ + while( zRawSql[0] ){ + n = findNextHostParameter(zRawSql, &nToken); + assert( n>0 ); + sqlite3_str_append(&out, zRawSql, n); + zRawSql += n; + assert( zRawSql[0] || nToken==0 ); + if( nToken==0 ) break; + if( zRawSql[0]=='?' ){ + if( nToken>1 ){ + assert( sqlite3Isdigit(zRawSql[1]) ); + sqlite3GetInt32(&zRawSql[1], &idx); + }else{ + idx = nextIndex; + } + }else{ + assert( zRawSql[0]==':' || zRawSql[0]=='$' || + zRawSql[0]=='@' || zRawSql[0]=='#' ); + testcase( zRawSql[0]==':' ); + testcase( zRawSql[0]=='$' ); + testcase( zRawSql[0]=='@' ); + testcase( zRawSql[0]=='#' ); + idx = sqlite3VdbeParameterIndex(p, zRawSql, nToken); + assert( idx>0 ); + } + zRawSql += nToken; + nextIndex = MAX(idx + 1, nextIndex); + assert( idx>0 && idx<=p->nVar ); + pVar = &p->aVar[idx-1]; + if( pVar->flags & MEM_Null ){ + sqlite3_str_append(&out, "NULL", 4); + }else if( pVar->flags & (MEM_Int|MEM_IntReal) ){ + sqlite3_str_appendf(&out, "%lld", pVar->u.i); + }else if( pVar->flags & MEM_Real ){ + sqlite3_str_appendf(&out, "%!.15g", pVar->u.r); + }else if( pVar->flags & MEM_Str ){ + int nOut; /* Number of bytes of the string text to include in output */ +#ifndef SQLITE_OMIT_UTF16 + u8 enc = ENC(db); + if( enc!=SQLITE_UTF8 ){ + memset(&utf8, 0, sizeof(utf8)); + utf8.db = db; + sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC); + if( SQLITE_NOMEM==sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) ){ + out.accError = SQLITE_NOMEM; + out.nAlloc = 0; + } + pVar = &utf8; + } +#endif + nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOut>SQLITE_TRACE_SIZE_LIMIT ){ + nOut = SQLITE_TRACE_SIZE_LIMIT; + while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } + } +#endif + sqlite3_str_appendf(&out, "'%.*q'", nOut, pVar->z); +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOutn ){ + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); + } +#endif +#ifndef SQLITE_OMIT_UTF16 + if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); +#endif + }else if( pVar->flags & MEM_Zero ){ + sqlite3_str_appendf(&out, "zeroblob(%d)", pVar->u.nZero); + }else{ + int nOut; /* Number of bytes of the blob to include in output */ + assert( pVar->flags & MEM_Blob ); + sqlite3_str_append(&out, "x'", 2); + nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; +#endif + for(i=0; iz[i]&0xff); + } + sqlite3_str_append(&out, "'", 1); +#ifdef SQLITE_TRACE_SIZE_LIMIT + if( nOutn ){ + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); + } +#endif + } + } + } + if( out.accError ) sqlite3_str_reset(&out); + return sqlite3StrAccumFinish(&out); +} + +#endif /* #ifndef SQLITE_OMIT_TRACE */ + +/************** End of vdbetrace.c *******************************************/ +/************** Begin file vdbe.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** The code in this file implements the function that runs the +** bytecode of a prepared statement. +** +** Various scripts scan this source file in order to generate HTML +** documentation, headers files, or other derived files. The formatting +** of the code in this file is, therefore, important. See other comments +** in this file for details. If in doubt, do not deviate from existing +** commenting and indentation practices when changing or adding code. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** Invoke this macro on memory cells just prior to changing the +** value of the cell. This macro verifies that shallow copies are +** not misused. A shallow copy of a string or blob just copies a +** pointer to the string or blob, not the content. If the original +** is changed while the copy is still in use, the string or blob might +** be changed out from under the copy. This macro verifies that nothing +** like that ever happens. +*/ +#ifdef SQLITE_DEBUG +# define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M) +#else +# define memAboutToChange(P,M) +#endif + +/* +** The following global variable is incremented every time a cursor +** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test +** procedures use this information to make sure that indices are +** working correctly. This variable has no function other than to +** help verify the correct operation of the library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_search_count = 0; +#endif + +/* +** When this global variable is positive, it gets decremented once before +** each instruction in the VDBE. When it reaches zero, the u1.isInterrupted +** field of the sqlite3 structure is set in order to simulate an interrupt. +** +** This facility is used for testing purposes only. It does not function +** in an ordinary build. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_interrupt_count = 0; +#endif + +/* +** The next global variable is incremented each type the OP_Sort opcode +** is executed. The test procedures use this information to make sure that +** sorting is occurring or not occurring at appropriate times. This variable +** has no function other than to help verify the correct operation of the +** library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_sort_count = 0; +#endif + +/* +** The next global variable records the size of the largest MEM_Blob +** or MEM_Str that has been used by a VDBE opcode. The test procedures +** use this information to make sure that the zero-blob functionality +** is working correctly. This variable has no function other than to +** help verify the correct operation of the library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_max_blobsize = 0; +static void updateMaxBlobsize(Mem *p){ + if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){ + sqlite3_max_blobsize = p->n; + } +} +#endif + +/* +** This macro evaluates to true if either the update hook or the preupdate +** hook are enabled for database connect DB. +*/ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +# define HAS_UPDATE_HOOK(DB) ((DB)->xPreUpdateCallback||(DB)->xUpdateCallback) +#else +# define HAS_UPDATE_HOOK(DB) ((DB)->xUpdateCallback) +#endif + +/* +** The next global variable is incremented each time the OP_Found opcode +** is executed. This is used to test whether or not the foreign key +** operation implemented using OP_FkIsZero is working. This variable +** has no function other than to help verify the correct operation of the +** library. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_found_count = 0; +#endif + +/* +** Test a register to see if it exceeds the current maximum blob size. +** If it does, record the new maximum blob size. +*/ +#if defined(SQLITE_TEST) && !defined(SQLITE_UNTESTABLE) +# define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P) +#else +# define UPDATE_MAX_BLOBSIZE(P) +#endif + +#ifdef SQLITE_DEBUG +/* This routine provides a convenient place to set a breakpoint during +** tracing with PRAGMA vdbe_trace=on. The breakpoint fires right after +** each opcode is printed. Variables "pc" (program counter) and pOp are +** available to add conditionals to the breakpoint. GDB example: +** +** break test_trace_breakpoint if pc=22 +** +** Other useful labels for breakpoints include: +** test_addop_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ + static int n = 0; + n++; +} +#endif + +/* +** Invoke the VDBE coverage callback, if that callback is defined. This +** feature is used for test suite validation only and does not appear an +** production builds. +** +** M is the type of branch. I is the direction taken for this instance of +** the branch. +** +** M: 2 - two-way branch (I=0: fall-thru 1: jump ) +** 3 - two-way + NULL (I=0: fall-thru 1: jump 2: NULL ) +** 4 - OP_Jump (I=0: jump p1 1: jump p2 2: jump p3) +** +** In other words, if M is 2, then I is either 0 (for fall-through) or +** 1 (for when the branch is taken). If M is 3, the I is 0 for an +** ordinary fall-through, I is 1 if the branch was taken, and I is 2 +** if the result of comparison is NULL. For M=3, I=2 the jump may or +** may not be taken, depending on the SQLITE_JUMPIFNULL flags in p5. +** When M is 4, that means that an OP_Jump is being run. I is 0, 1, or 2 +** depending on if the operands are less than, equal, or greater than. +** +** iSrcLine is the source code line (from the __LINE__ macro) that +** generated the VDBE instruction combined with flag bits. The source +** code line number is in the lower 24 bits of iSrcLine and the upper +** 8 bytes are flags. The lower three bits of the flags indicate +** values for I that should never occur. For example, if the branch is +** always taken, the flags should be 0x05 since the fall-through and +** alternate branch are never taken. If a branch is never taken then +** flags should be 0x06 since only the fall-through approach is allowed. +** +** Bit 0x08 of the flags indicates an OP_Jump opcode that is only +** interested in equal or not-equal. In other words, I==0 and I==2 +** should be treated as equivalent +** +** Since only a line number is retained, not the filename, this macro +** only works for amalgamation builds. But that is ok, since these macros +** should be no-ops except for special builds used to measure test coverage. +*/ +#if !defined(SQLITE_VDBE_COVERAGE) +# define VdbeBranchTaken(I,M) +#else +# define VdbeBranchTaken(I,M) vdbeTakeBranch(pOp->iSrcLine,I,M) + static void vdbeTakeBranch(u32 iSrcLine, u8 I, u8 M){ + u8 mNever; + assert( I<=2 ); /* 0: fall through, 1: taken, 2: alternate taken */ + assert( M<=4 ); /* 2: two-way branch, 3: three-way branch, 4: OP_Jump */ + assert( I> 24; + assert( (I & mNever)==0 ); + if( sqlite3GlobalConfig.xVdbeBranch==0 ) return; /*NO_TEST*/ + /* Invoke the branch coverage callback with three arguments: + ** iSrcLine - the line number of the VdbeCoverage() macro, with + ** flags removed. + ** I - Mask of bits 0x07 indicating which cases are are + ** fulfilled by this instance of the jump. 0x01 means + ** fall-thru, 0x02 means taken, 0x04 means NULL. Any + ** impossible cases (ex: if the comparison is never NULL) + ** are filled in automatically so that the coverage + ** measurement logic does not flag those impossible cases + ** as missed coverage. + ** M - Type of jump. Same as M argument above + */ + I |= mNever; + if( M==2 ) I |= 0x04; + if( M==4 ){ + I |= 0x08; + if( (mNever&0x08)!=0 && (I&0x05)!=0) I |= 0x05; /*NO_TEST*/ + } + sqlite3GlobalConfig.xVdbeBranch(sqlite3GlobalConfig.pVdbeBranchArg, + iSrcLine&0xffffff, I, M); + } +#endif + +/* +** An ephemeral string value (signified by the MEM_Ephem flag) contains +** a pointer to a dynamically allocated string where some other entity +** is responsible for deallocating that string. Because the register +** does not control the string, it might be deleted without the register +** knowing it. +** +** This routine converts an ephemeral string into a dynamically allocated +** string that the register itself controls. In other words, it +** converts an MEM_Ephem string into a string with P.z==P.zMalloc. +*/ +#define Deephemeralize(P) \ + if( ((P)->flags&MEM_Ephem)!=0 \ + && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;} + +/* Return true if the cursor was opened using the OP_OpenSorter opcode. */ +#define isSorter(x) ((x)->eCurType==CURTYPE_SORTER) + +/* +** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL +** if we run out of memory. +*/ +static VdbeCursor *allocateCursor( + Vdbe *p, /* The virtual machine */ + int iCur, /* Index of the new VdbeCursor */ + int nField, /* Number of fields in the table or index */ + u8 eCurType /* Type of the new cursor */ +){ + /* Find the memory cell that will be used to store the blob of memory + ** required for this VdbeCursor structure. It is convenient to use a + ** vdbe memory cell to manage the memory allocation required for a + ** VdbeCursor structure for the following reasons: + ** + ** * Sometimes cursor numbers are used for a couple of different + ** purposes in a vdbe program. The different uses might require + ** different sized allocations. Memory cells provide growable + ** allocations. + ** + ** * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can + ** be freed lazily via the sqlite3_release_memory() API. This + ** minimizes the number of malloc calls made by the system. + ** + ** The memory cell for cursor 0 is aMem[0]. The rest are allocated from + ** the top of the register space. Cursor 1 is at Mem[p->nMem-1]. + ** Cursor 2 is at Mem[p->nMem-2]. And so forth. + */ + Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem; + + int nByte; + VdbeCursor *pCx = 0; + nByte = + ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); + + assert( iCur>=0 && iCurnCursor ); + if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + sqlite3VdbeFreeCursorNN(p, p->apCsr[iCur]); + p->apCsr[iCur] = 0; + } + + /* There used to be a call to sqlite3VdbeMemClearAndResize() to make sure + ** the pMem used to hold space for the cursor has enough storage available + ** in pMem->zMalloc. But for the special case of the aMem[] entries used + ** to hold cursors, it is faster to in-line the logic. */ + assert( pMem->flags==MEM_Undefined ); + assert( (pMem->flags & MEM_Dyn)==0 ); + assert( pMem->szMalloc==0 || pMem->z==pMem->zMalloc ); + if( pMem->szMallocszMalloc>0 ){ + sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + } + pMem->z = pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, nByte); + if( pMem->zMalloc==0 ){ + pMem->szMalloc = 0; + return 0; + } + pMem->szMalloc = nByte; + } + + p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->zMalloc; + memset(pCx, 0, offsetof(VdbeCursor,pAltCursor)); + pCx->eCurType = eCurType; + pCx->nField = nField; + pCx->aOffset = &pCx->aType[nField]; + if( eCurType==CURTYPE_BTREE ){ + pCx->uc.pCursor = (BtCursor*) + &pMem->z[ROUND8P(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; + sqlite3BtreeCursorZero(pCx->uc.pCursor); + } + return pCx; +} + +/* +** The string in pRec is known to look like an integer and to have a +** floating point value of rValue. Return true and set *piValue to the +** integer value if the string is in range to be an integer. Otherwise, +** return false. +*/ +static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ + i64 iValue = (double)rValue; + if( sqlite3RealSameAsInt(rValue,iValue) ){ + *piValue = iValue; + return 1; + } + return 0==sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); +} + +/* +** Try to convert a value into a numeric representation if we can +** do so without loss of information. In other words, if the string +** looks like a number, convert it into a number. If it does not +** look like a number, leave it alone. +** +** If the bTryForInt flag is true, then extra effort is made to give +** an integer representation. Strings that look like floating point +** values but which have no fractional component (example: '48.00') +** will have a MEM_Int representation when bTryForInt is true. +** +** If bTryForInt is false, then if the input string contains a decimal +** point or exponential notation, the result is only MEM_Real, even +** if there is an exact integer representation of the quantity. +*/ +static void applyNumericAffinity(Mem *pRec, int bTryForInt){ + double rValue; + u8 enc = pRec->enc; + int rc; + assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real|MEM_IntReal))==MEM_Str ); + rc = sqlite3AtoF(pRec->z, &rValue, pRec->n, enc); + if( rc<=0 ) return; + if( rc==1 && alsoAnInt(pRec, rValue, &pRec->u.i) ){ + pRec->flags |= MEM_Int; + }else{ + pRec->u.r = rValue; + pRec->flags |= MEM_Real; + if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec); + } + /* TEXT->NUMERIC is many->one. Hence, it is important to invalidate the + ** string representation after computing a numeric equivalent, because the + ** string representation might not be the canonical representation for the + ** numeric value. Ticket [343634942dd54ab57b7024] 2018-01-31. */ + pRec->flags &= ~MEM_Str; +} + +/* +** Processing is determine by the affinity parameter: +** +** SQLITE_AFF_INTEGER: +** SQLITE_AFF_REAL: +** SQLITE_AFF_NUMERIC: +** Try to convert pRec to an integer representation or a +** floating-point representation if an integer representation +** is not possible. Note that the integer representation is +** always preferred, even if the affinity is REAL, because +** an integer representation is more space efficient on disk. +** +** SQLITE_AFF_TEXT: +** Convert pRec to a text representation. +** +** SQLITE_AFF_BLOB: +** SQLITE_AFF_NONE: +** No-op. pRec is unchanged. +*/ +static void applyAffinity( + Mem *pRec, /* The value to apply affinity to */ + char affinity, /* The affinity to be applied */ + u8 enc /* Use this text encoding */ +){ + if( affinity>=SQLITE_AFF_NUMERIC ){ + assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL + || affinity==SQLITE_AFF_NUMERIC ); + if( (pRec->flags & MEM_Int)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags & MEM_Real)==0 ){ + if( pRec->flags & MEM_Str ) applyNumericAffinity(pRec,1); + }else{ + sqlite3VdbeIntegerAffinity(pRec); + } + } + }else if( affinity==SQLITE_AFF_TEXT ){ + /* Only attempt the conversion to TEXT if there is an integer or real + ** representation (blob and NULL do not get converted) but no string + ** representation. It would be harmless to repeat the conversion if + ** there is already a string rep, but it is pointless to waste those + ** CPU cycles. */ + if( 0==(pRec->flags&MEM_Str) ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags&(MEM_Real|MEM_Int|MEM_IntReal)) ){ + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_Real ); + testcase( pRec->flags & MEM_IntReal ); + sqlite3VdbeMemStringify(pRec, enc, 1); + } + } + pRec->flags &= ~(MEM_Real|MEM_Int|MEM_IntReal); + } +} + +/* +** Try to convert the type of a function argument or a result column +** into a numeric representation. Use either INTEGER or REAL whichever +** is appropriate. But only do the conversion if it is possible without +** loss of information and return the revised type of the argument. +*/ +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ + int eType = sqlite3_value_type(pVal); + if( eType==SQLITE_TEXT ){ + Mem *pMem = (Mem*)pVal; + applyNumericAffinity(pMem, 0); + eType = sqlite3_value_type(pVal); + } + return eType; +} + +/* +** Exported version of applyAffinity(). This one works on sqlite3_value*, +** not the internal Mem* type. +*/ +SQLITE_PRIVATE void sqlite3ValueApplyAffinity( + sqlite3_value *pVal, + u8 affinity, + u8 enc +){ + applyAffinity((Mem *)pVal, affinity, enc); +} + +/* +** pMem currently only holds a string type (or maybe a BLOB that we can +** interpret as a string if we want to). Compute its corresponding +** numeric type, if has one. Set the pMem->u.r and pMem->u.i fields +** accordingly. +*/ +static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ + int rc; + sqlite3_int64 ix; + assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ); + assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); + if( ExpandBlob(pMem) ){ + pMem->u.i = 0; + return MEM_Int; + } + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( rc<=0 ){ + if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ + pMem->u.i = ix; + return MEM_Int; + }else{ + return MEM_Real; + } + }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + pMem->u.i = ix; + return MEM_Int; + } + return MEM_Real; +} + +/* +** Return the numeric type for pMem, either MEM_Int or MEM_Real or both or +** none. +** +** Unlike applyNumericAffinity(), this routine does not modify pMem->flags. +** But it does set pMem->u.r and pMem->u.i appropriately. +*/ +static u16 numericType(Mem *pMem){ + if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal) ){ + testcase( pMem->flags & MEM_Int ); + testcase( pMem->flags & MEM_Real ); + testcase( pMem->flags & MEM_IntReal ); + return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal); + } + if( pMem->flags & (MEM_Str|MEM_Blob) ){ + testcase( pMem->flags & MEM_Str ); + testcase( pMem->flags & MEM_Blob ); + return computeNumericType(pMem); + } + return 0; +} + +#ifdef SQLITE_DEBUG +/* +** Write a nice string representation of the contents of cell pMem +** into buffer zBuf, length nBuf. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ + int f = pMem->flags; + static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"}; + if( f&MEM_Blob ){ + int i; + char c; + if( f & MEM_Dyn ){ + c = 'z'; + assert( (f & (MEM_Static|MEM_Ephem))==0 ); + }else if( f & MEM_Static ){ + c = 't'; + assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); + }else if( f & MEM_Ephem ){ + c = 'e'; + assert( (f & (MEM_Static|MEM_Dyn))==0 ); + }else{ + c = 's'; + } + sqlite3_str_appendf(pStr, "%cx[", c); + for(i=0; i<25 && in; i++){ + sqlite3_str_appendf(pStr, "%02X", ((int)pMem->z[i] & 0xFF)); + } + sqlite3_str_appendf(pStr, "|"); + for(i=0; i<25 && in; i++){ + char z = pMem->z[i]; + sqlite3_str_appendchar(pStr, 1, (z<32||z>126)?'.':z); + } + sqlite3_str_appendf(pStr,"]"); + if( f & MEM_Zero ){ + sqlite3_str_appendf(pStr, "+%dz",pMem->u.nZero); + } + }else if( f & MEM_Str ){ + int j; + u8 c; + if( f & MEM_Dyn ){ + c = 'z'; + assert( (f & (MEM_Static|MEM_Ephem))==0 ); + }else if( f & MEM_Static ){ + c = 't'; + assert( (f & (MEM_Dyn|MEM_Ephem))==0 ); + }else if( f & MEM_Ephem ){ + c = 'e'; + assert( (f & (MEM_Static|MEM_Dyn))==0 ); + }else{ + c = 's'; + } + sqlite3_str_appendf(pStr, " %c%d[", c, pMem->n); + for(j=0; j<25 && jn; j++){ + c = pMem->z[j]; + sqlite3_str_appendchar(pStr, 1, (c>=0x20&&c<=0x7f) ? c : '.'); + } + sqlite3_str_appendf(pStr, "]%s", encnames[pMem->enc]); + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Print the value of a register for tracing purposes: +*/ +static void memTracePrint(Mem *p){ + if( p->flags & MEM_Undefined ){ + printf(" undefined"); + }else if( p->flags & MEM_Null ){ + printf(p->flags & MEM_Zero ? " NULL-nochng" : " NULL"); + }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){ + printf(" si:%lld", p->u.i); + }else if( (p->flags & (MEM_IntReal))!=0 ){ + printf(" ir:%lld", p->u.i); + }else if( p->flags & MEM_Int ){ + printf(" i:%lld", p->u.i); +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( p->flags & MEM_Real ){ + printf(" r:%.17g", p->u.r); +#endif + }else if( sqlite3VdbeMemIsRowSet(p) ){ + printf(" (rowset)"); + }else{ + StrAccum acc; + char zBuf[1000]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3VdbeMemPrettyPrint(p, &acc); + printf(" %s", sqlite3StrAccumFinish(&acc)); + } + if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); +} +static void registerTrace(int iReg, Mem *p){ + printf("R[%d] = ", iReg); + memTracePrint(p); + if( p->pScopyFrom ){ + printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); + } + printf("\n"); + sqlite3VdbeCheckMemInvariants(p); +} +/**/ void sqlite3PrintMem(Mem *pMem){ + memTracePrint(pMem); + printf("\n"); + fflush(stdout); +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Show the values of all registers in the virtual machine. Used for +** interactive debugging. +*/ +SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe *v){ + int i; + for(i=1; inMem; i++) registerTrace(i, v->aMem+i); +} +#endif /* SQLITE_DEBUG */ + + +#ifdef SQLITE_DEBUG +# define REGISTER_TRACE(R,M) if(db->flags&SQLITE_VdbeTrace)registerTrace(R,M) +#else +# define REGISTER_TRACE(R,M) +#endif + + +#ifdef VDBE_PROFILE + +/* +** hwtime.h contains inline assembler code for implementing +** high-performance timing routines. +*/ +/* #include "hwtime.h" */ + +#endif + +#ifndef NDEBUG +/* +** This function is only called from within an assert() expression. It +** checks that the sqlite3.nTransaction variable is correctly set to +** the number of non-transaction savepoints currently in the +** linked list starting at sqlite3.pSavepoint. +** +** Usage: +** +** assert( checkSavepointCount(db) ); +*/ +static int checkSavepointCount(sqlite3 *db){ + int n = 0; + Savepoint *p; + for(p=db->pSavepoint; p; p=p->pNext) n++; + assert( n==(db->nSavepoint + db->isTransactionSavepoint) ); + return 1; +} +#endif + +/* +** Return the register of pOp->p2 after first preparing it to be +** overwritten with an integer value. +*/ +static SQLITE_NOINLINE Mem *out2PrereleaseWithClear(Mem *pOut){ + sqlite3VdbeMemSetNull(pOut); + pOut->flags = MEM_Int; + return pOut; +} +static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ + Mem *pOut; + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + pOut = &p->aMem[pOp->p2]; + memAboutToChange(p, pOut); + if( VdbeMemDynamic(pOut) ){ /*OPTIMIZATION-IF-FALSE*/ + return out2PrereleaseWithClear(pOut); + }else{ + pOut->flags = MEM_Int; + return pOut; + } +} + +/* +** Compute a bloom filter hash using pOp->p4.i registers from aMem[] beginning +** with pOp->p3. Return the hash. +*/ +static u64 filterHash(const Mem *aMem, const Op *pOp){ + int i, mx; + u64 h = 0; + + assert( pOp->p4type==P4_INT32 ); + for(i=pOp->p3, mx=i+pOp->p4.i; iflags & (MEM_Int|MEM_IntReal) ){ + h += p->u.i; + }else if( p->flags & MEM_Real ){ + h += sqlite3VdbeIntValue(p); + }else if( p->flags & (MEM_Str|MEM_Blob) ){ + h += p->n; + if( p->flags & MEM_Zero ) h += p->u.nZero; + } + } + return h; +} + +/* +** Return the symbolic name for the data type of a pMem +*/ +static const char *vdbeMemTypeName(Mem *pMem){ + static const char *azTypes[] = { + /* SQLITE_INTEGER */ "INT", + /* SQLITE_FLOAT */ "REAL", + /* SQLITE_TEXT */ "TEXT", + /* SQLITE_BLOB */ "BLOB", + /* SQLITE_NULL */ "NULL" + }; + return azTypes[sqlite3_value_type(pMem)-1]; +} + +/* +** Execute as much of a VDBE program as we can. +** This is the core of sqlite3_step(). +*/ +SQLITE_PRIVATE int sqlite3VdbeExec( + Vdbe *p /* The VDBE */ +){ + Op *aOp = p->aOp; /* Copy of p->aOp */ + Op *pOp = aOp; /* Current operation */ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + Op *pOrigOp; /* Value of pOp at the top of the loop */ +#endif +#ifdef SQLITE_DEBUG + int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */ +#endif + int rc = SQLITE_OK; /* Value to return */ + sqlite3 *db = p->db; /* The database */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */ + u8 encoding = ENC(db); /* The database encoding */ + int iCompare = 0; /* Result of last comparison */ + u64 nVmStep = 0; /* Number of virtual machine steps */ +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + u64 nProgressLimit; /* Invoke xProgress() when nVmStep reaches this */ +#endif + Mem *aMem = p->aMem; /* Copy of p->aMem */ + Mem *pIn1 = 0; /* 1st input operand */ + Mem *pIn2 = 0; /* 2nd input operand */ + Mem *pIn3 = 0; /* 3rd input operand */ + Mem *pOut = 0; /* Output operand */ +#ifdef VDBE_PROFILE + u64 start; /* CPU clock count at start of opcode */ +#endif + /*** INSERT STACK UNION HERE ***/ + + assert( p->eVdbeState==VDBE_RUN_STATE ); /* sqlite3_step() verifies this */ + sqlite3VdbeEnter(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; + assert( 0 < db->nProgressOps ); + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + }else{ + nProgressLimit = LARGEST_UINT64; + } +#endif + if( p->rc==SQLITE_NOMEM ){ + /* This happens if a malloc() inside a call to sqlite3_column_text() or + ** sqlite3_column_text16() failed. */ + goto no_mem; + } + assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); + testcase( p->rc!=SQLITE_OK ); + p->rc = SQLITE_OK; + assert( p->bIsReader || p->readOnly!=0 ); + p->iCurrentTime = 0; + assert( p->explain==0 ); + p->pResultSet = 0; + db->busyHandler.nBusy = 0; + if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; + sqlite3VdbeIOTraceSql(p); +#ifdef SQLITE_DEBUG + sqlite3BeginBenignMalloc(); + if( p->pc==0 + && (p->db->flags & (SQLITE_VdbeListing|SQLITE_VdbeEQP|SQLITE_VdbeTrace))!=0 + ){ + int i; + int once = 1; + sqlite3VdbePrintSql(p); + if( p->db->flags & SQLITE_VdbeListing ){ + printf("VDBE Program Listing:\n"); + for(i=0; inOp; i++){ + sqlite3VdbePrintOp(stdout, i, &aOp[i]); + } + } + if( p->db->flags & SQLITE_VdbeEQP ){ + for(i=0; inOp; i++){ + if( aOp[i].opcode==OP_Explain ){ + if( once ) printf("VDBE Query Plan:\n"); + printf("%s\n", aOp[i].p4.z); + once = 0; + } + } + } + if( p->db->flags & SQLITE_VdbeTrace ) printf("VDBE Trace:\n"); + } + sqlite3EndBenignMalloc(); +#endif + for(pOp=&aOp[p->pc]; 1; pOp++){ + /* Errors are detected by individual opcodes, with an immediate + ** jumps to abort_due_to_error. */ + assert( rc==SQLITE_OK ); + + assert( pOp>=aOp && pOp<&aOp[p->nOp]); +#ifdef VDBE_PROFILE + start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); +#endif + nVmStep++; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + if( p->anExec ) p->anExec[(int)(pOp-aOp)]++; +#endif + + /* Only allow tracing if SQLITE_DEBUG is defined. + */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp,p); + } +#endif + + + /* Check to see if we need to simulate an interrupt. This only happens + ** if we have a special test build. + */ +#ifdef SQLITE_TEST + if( sqlite3_interrupt_count>0 ){ + sqlite3_interrupt_count--; + if( sqlite3_interrupt_count==0 ){ + sqlite3_interrupt(db); + } + } +#endif + + /* Sanity checking on other operands */ +#ifdef SQLITE_DEBUG + { + u8 opProperty = sqlite3OpcodeProperty[pOp->opcode]; + if( (opProperty & OPFLG_IN1)!=0 ){ + assert( pOp->p1>0 ); + assert( pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p1]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p1]) ); + REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); + } + if( (opProperty & OPFLG_IN2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p2]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p2]) ); + REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_IN3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p3]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p3]) ); + REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); + } + if( (opProperty & OPFLG_OUT2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_OUT3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p3]); + } + } +#endif +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + pOrigOp = pOp; +#endif + + switch( pOp->opcode ){ + +/***************************************************************************** +** What follows is a massive switch statement where each case implements a +** separate instruction in the virtual machine. If we follow the usual +** indentation conventions, each case should be indented by 6 spaces. But +** that is a lot of wasted space on the left margin. So the code within +** the switch statement will break with convention and be flush-left. Another +** big comment (similar to this one) will mark the point in the code where +** we transition back to normal indentation. +** +** The formatting of each case is important. The makefile for SQLite +** generates two C files "opcodes.h" and "opcodes.c" by scanning this +** file looking for lines that begin with "case OP_". The opcodes.h files +** will be filled with #defines that give unique integer values to each +** opcode and the opcodes.c file is filled with an array of strings where +** each string is the symbolic name for the corresponding opcode. If the +** case statement is followed by a comment of the form "/# same as ... #/" +** that comment is used to determine the particular value of the opcode. +** +** Other keywords in the comment that follows each case are used to +** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[]. +** Keywords include: in1, in2, in3, out2, out3. See +** the mkopcodeh.awk script for additional information. +** +** Documentation about VDBE opcodes is generated by scanning this file +** for lines of that contain "Opcode:". That line and all subsequent +** comment lines are used in the generation of the opcode.html documentation +** file. +** +** SUMMARY: +** +** Formatting is important to scripts that scan this file. +** Do not deviate from the formatting style currently in use. +** +*****************************************************************************/ + +/* Opcode: Goto * P2 * * * +** +** An unconditional jump to address P2. +** The next instruction executed will be +** the one at index P2 from the beginning of +** the program. +** +** The P1 parameter is not actually used by this opcode. However, it +** is sometimes set to 1 instead of 0 as a hint to the command-line shell +** that this Goto is the bottom of a loop and that the lines from P2 down +** to the current line should be indented for EXPLAIN output. +*/ +case OP_Goto: { /* jump */ + +#ifdef SQLITE_DEBUG + /* In debuggging mode, when the p5 flags is set on an OP_Goto, that + ** means we should really jump back to the preceeding OP_ReleaseReg + ** instruction. */ + if( pOp->p5 ){ + assert( pOp->p2 < (int)(pOp - aOp) ); + assert( pOp->p2 > 1 ); + pOp = &aOp[pOp->p2 - 2]; + assert( pOp[1].opcode==OP_ReleaseReg ); + goto check_for_interrupt; + } +#endif + +jump_to_p2_and_check_for_interrupt: + pOp = &aOp[pOp->p2 - 1]; + + /* Opcodes that are used as the bottom of a loop (OP_Next, OP_Prev, + ** OP_VNext, or OP_SorterNext) all jump here upon + ** completion. Check to see if sqlite3_interrupt() has been called + ** or if the progress callback needs to be invoked. + ** + ** This code uses unstructured "goto" statements and does not look clean. + ** But that is not due to sloppy coding habits. The code is written this + ** way for performance, to avoid having to run the interrupt and progress + ** checks on every opcode. This helps sqlite3_step() to run about 1.5% + ** faster according to "valgrind --tool=cachegrind" */ +check_for_interrupt: + if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + /* Call the progress callback if it is configured and the required number + ** of VDBE ops have been executed (either since this invocation of + ** sqlite3VdbeExec() or since last time the progress callback was called). + ** If the progress callback returns non-zero, exit the virtual machine with + ** a return code SQLITE_ABORT. + */ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + assert( db->nProgressOps!=0 ); + nProgressLimit += db->nProgressOps; + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = LARGEST_UINT64; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif + + break; +} + +/* Opcode: Gosub P1 P2 * * * +** +** Write the current address onto register P1 +** and then jump to address P2. +*/ +case OP_Gosub: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( VdbeMemDynamic(pIn1)==0 ); + memAboutToChange(p, pIn1); + pIn1->flags = MEM_Int; + pIn1->u.i = (int)(pOp-aOp); + REGISTER_TRACE(pOp->p1, pIn1); + goto jump_to_p2_and_check_for_interrupt; +} + +/* Opcode: Return P1 P2 P3 * * +** +** Jump to the address stored in register P1. If P1 is a return address +** register, then this accomplishes a return from a subroutine. +** +** If P3 is 1, then the jump is only taken if register P1 holds an integer +** values, otherwise execution falls through to the next opcode, and the +** OP_Return becomes a no-op. If P3 is 0, then register P1 must hold an +** integer or else an assert() is raised. P3 should be set to 1 when +** this opcode is used in combination with OP_BeginSubrtn, and set to 0 +** otherwise. +** +** The value in register P1 is unchanged by this opcode. +** +** P2 is not used by the byte-code engine. However, if P2 is positive +** and also less than the current address, then the "EXPLAIN" output +** formatter in the CLI will indent all opcodes from the P2 opcode up +** to be not including the current Return. P2 should be the first opcode +** in the subroutine from which this opcode is returning. Thus the P2 +** value is a byte-code indentation hint. See tag-20220407a in +** wherecode.c and shell.c. +*/ +case OP_Return: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + if( pIn1->flags & MEM_Int ){ + if( pOp->p3 ){ VdbeBranchTaken(1, 2); } + pOp = &aOp[pIn1->u.i]; + }else if( ALWAYS(pOp->p3) ){ + VdbeBranchTaken(0, 2); + } + break; +} + +/* Opcode: InitCoroutine P1 P2 P3 * * +** +** Set up register P1 so that it will Yield to the coroutine +** located at address P3. +** +** If P2!=0 then the coroutine implementation immediately follows +** this opcode. So jump over the coroutine implementation to +** address P2. +** +** See also: EndCoroutine +*/ +case OP_InitCoroutine: { /* jump */ + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( pOp->p2>=0 && pOp->p2nOp ); + assert( pOp->p3>=0 && pOp->p3nOp ); + pOut = &aMem[pOp->p1]; + assert( !VdbeMemDynamic(pOut) ); + pOut->u.i = pOp->p3 - 1; + pOut->flags = MEM_Int; + if( pOp->p2==0 ) break; + + /* Most jump operations do a goto to this spot in order to update + ** the pOp pointer. */ +jump_to_p2: + assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */ + assert( pOp->p2nOp ); /* Jumps must be in range */ + pOp = &aOp[pOp->p2 - 1]; + break; +} + +/* Opcode: EndCoroutine P1 * * * * +** +** The instruction at the address in register P1 is a Yield. +** Jump to the P2 parameter of that Yield. +** After the jump, register P1 becomes undefined. +** +** See also: InitCoroutine +*/ +case OP_EndCoroutine: { /* in1 */ + VdbeOp *pCaller; + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags==MEM_Int ); + assert( pIn1->u.i>=0 && pIn1->u.inOp ); + pCaller = &aOp[pIn1->u.i]; + assert( pCaller->opcode==OP_Yield ); + assert( pCaller->p2>=0 && pCaller->p2nOp ); + pOp = &aOp[pCaller->p2 - 1]; + pIn1->flags = MEM_Undefined; + break; +} + +/* Opcode: Yield P1 P2 * * * +** +** Swap the program counter with the value in register P1. This +** has the effect of yielding to a coroutine. +** +** If the coroutine that is launched by this instruction ends with +** Yield or Return then continue to the next instruction. But if +** the coroutine launched by this instruction ends with +** EndCoroutine, then jump to P2 rather than continuing with the +** next instruction. +** +** See also: InitCoroutine +*/ +case OP_Yield: { /* in1, jump */ + int pcDest; + pIn1 = &aMem[pOp->p1]; + assert( VdbeMemDynamic(pIn1)==0 ); + pIn1->flags = MEM_Int; + pcDest = (int)pIn1->u.i; + pIn1->u.i = (int)(pOp - aOp); + REGISTER_TRACE(pOp->p1, pIn1); + pOp = &aOp[pcDest]; + break; +} + +/* Opcode: HaltIfNull P1 P2 P3 P4 P5 +** Synopsis: if r[P3]=null halt +** +** Check the value in register P3. If it is NULL then Halt using +** parameter P1, P2, and P4 as if this were a Halt instruction. If the +** value in register P3 is not NULL, then this routine is a no-op. +** The P5 parameter should be 1. +*/ +case OP_HaltIfNull: { /* in3 */ + pIn3 = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } +#endif + if( (pIn3->flags & MEM_Null)==0 ) break; + /* Fall through into OP_Halt */ + /* no break */ deliberate_fall_through +} + +/* Opcode: Halt P1 P2 * P4 P5 +** +** Exit immediately. All open cursors, etc are closed +** automatically. +** +** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(), +** or sqlite3_finalize(). For a normal halt, this should be SQLITE_OK (0). +** For errors, it can be some other value. If P1!=0 then P2 will determine +** whether or not to rollback the current transaction. Do not rollback +** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort, +** then back out all changes that have occurred during this execution of the +** VDBE, but do not rollback the transaction. +** +** If P4 is not null then it is an error message string. +** +** P5 is a value between 0 and 4, inclusive, that modifies the P4 string. +** +** 0: (no change) +** 1: NOT NULL contraint failed: P4 +** 2: UNIQUE constraint failed: P4 +** 3: CHECK constraint failed: P4 +** 4: FOREIGN KEY constraint failed: P4 +** +** If P5 is not zero and P4 is NULL, then everything after the ":" is +** omitted. +** +** There is an implied "Halt 0 0 0" instruction inserted at the very end of +** every program. So a jump past the last instruction of the program +** is the same as executing Halt. +*/ +case OP_Halt: { + VdbeFrame *pFrame; + int pcx; + +#ifdef SQLITE_DEBUG + if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } +#endif + if( p->pFrame && pOp->p1==SQLITE_OK ){ + /* Halt the sub-program. Return control to the parent frame. */ + pFrame = p->pFrame; + p->pFrame = pFrame->pParent; + p->nFrame--; + sqlite3VdbeSetChanges(db, p->nChange); + pcx = sqlite3VdbeFrameRestore(pFrame); + if( pOp->p2==OE_Ignore ){ + /* Instruction pcx is the OP_Program that invoked the sub-program + ** currently being halted. If the p2 instruction of this OP_Halt + ** instruction is set to OE_Ignore, then the sub-program is throwing + ** an IGNORE exception. In this case jump to the address specified + ** as the p2 of the calling OP_Program. */ + pcx = p->aOp[pcx].p2-1; + } + aOp = p->aOp; + aMem = p->aMem; + pOp = &aOp[pcx]; + break; + } + p->rc = pOp->p1; + p->errorAction = (u8)pOp->p2; + assert( pOp->p5<=4 ); + if( p->rc ){ + if( pOp->p5 ){ + static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK", + "FOREIGN KEY" }; + testcase( pOp->p5==1 ); + testcase( pOp->p5==2 ); + testcase( pOp->p5==3 ); + testcase( pOp->p5==4 ); + sqlite3VdbeError(p, "%s constraint failed", azType[pOp->p5-1]); + if( pOp->p4.z ){ + p->zErrMsg = sqlite3MPrintf(db, "%z: %s", p->zErrMsg, pOp->p4.z); + } + }else{ + sqlite3VdbeError(p, "%s", pOp->p4.z); + } + pcx = (int)(pOp - aOp); + sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg); + } + rc = sqlite3VdbeHalt(p); + assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR ); + if( rc==SQLITE_BUSY ){ + p->rc = SQLITE_BUSY; + }else{ + assert( rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ); + assert( rc==SQLITE_OK || db->nDeferredCons>0 || db->nDeferredImmCons>0 ); + rc = p->rc ? SQLITE_ERROR : SQLITE_DONE; + } + goto vdbe_return; +} + +/* Opcode: Integer P1 P2 * * * +** Synopsis: r[P2]=P1 +** +** The 32-bit integer value P1 is written into register P2. +*/ +case OP_Integer: { /* out2 */ + pOut = out2Prerelease(p, pOp); + pOut->u.i = pOp->p1; + break; +} + +/* Opcode: Int64 * P2 * P4 * +** Synopsis: r[P2]=P4 +** +** P4 is a pointer to a 64-bit integer value. +** Write that value into register P2. +*/ +case OP_Int64: { /* out2 */ + pOut = out2Prerelease(p, pOp); + assert( pOp->p4.pI64!=0 ); + pOut->u.i = *pOp->p4.pI64; + break; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* Opcode: Real * P2 * P4 * +** Synopsis: r[P2]=P4 +** +** P4 is a pointer to a 64-bit floating point value. +** Write that value into register P2. +*/ +case OP_Real: { /* same as TK_FLOAT, out2 */ + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Real; + assert( !sqlite3IsNaN(*pOp->p4.pReal) ); + pOut->u.r = *pOp->p4.pReal; + break; +} +#endif + +/* Opcode: String8 * P2 * P4 * +** Synopsis: r[P2]='P4' +** +** P4 points to a nul terminated UTF-8 string. This opcode is transformed +** into a String opcode before it is executed for the first time. During +** this transformation, the length of string P4 is computed and stored +** as the P1 parameter. +*/ +case OP_String8: { /* same as TK_STRING, out2 */ + assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); + pOp->p1 = sqlite3Strlen30(pOp->p4.z); + +#ifndef SQLITE_OMIT_UTF16 + if( encoding!=SQLITE_UTF8 ){ + rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); + assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( rc ) goto too_big; + if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; + assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); + assert( VdbeMemDynamic(pOut)==0 ); + pOut->szMalloc = 0; + pOut->flags |= MEM_Static; + if( pOp->p4type==P4_DYNAMIC ){ + sqlite3DbFree(db, pOp->p4.z); + } + pOp->p4type = P4_DYNAMIC; + pOp->p4.z = pOut->z; + pOp->p1 = pOut->n; + } +#endif + if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + pOp->opcode = OP_String; + assert( rc==SQLITE_OK ); + /* Fall through to the next case, OP_String */ + /* no break */ deliberate_fall_through +} + +/* Opcode: String P1 P2 P3 P4 P5 +** Synopsis: r[P2]='P4' (len=P1) +** +** The string value P4 of length P1 (bytes) is stored in register P2. +** +** If P3 is not zero and the content of register P3 is equal to P5, then +** the datatype of the register P2 is converted to BLOB. The content is +** the same sequence of bytes, it is merely interpreted as a BLOB instead +** of a string, as if it had been CAST. In other words: +** +** if( P3!=0 and reg[P3]==P5 ) reg[P2] := CAST(reg[P2] as BLOB) +*/ +case OP_String: { /* out2 */ + assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Str|MEM_Static|MEM_Term; + pOut->z = pOp->p4.z; + pOut->n = pOp->p1; + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pOp->p3>0 ){ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pIn3 = &aMem[pOp->p3]; + assert( pIn3->flags & MEM_Int ); + if( pIn3->u.i==pOp->p5 ) pOut->flags = MEM_Blob|MEM_Static|MEM_Term; + } +#endif + break; +} + +/* Opcode: BeginSubrtn * P2 * * * +** Synopsis: r[P2]=NULL +** +** Mark the beginning of a subroutine that can be entered in-line +** or that can be called using OP_Gosub. The subroutine should +** be terminated by an OP_Return instruction that has a P1 operand that +** is the same as the P2 operand to this opcode and that has P3 set to 1. +** If the subroutine is entered in-line, then the OP_Return will simply +** fall through. But if the subroutine is entered using OP_Gosub, then +** the OP_Return will jump back to the first instruction after the OP_Gosub. +** +** This routine works by loading a NULL into the P2 register. When the +** return address register contains a NULL, the OP_Return instruction is +** a no-op that simply falls through to the next instruction (assuming that +** the OP_Return opcode has a P3 value of 1). Thus if the subroutine is +** entered in-line, then the OP_Return will cause in-line execution to +** continue. But if the subroutine is entered via OP_Gosub, then the +** OP_Return will cause a return to the address following the OP_Gosub. +** +** This opcode is identical to OP_Null. It has a different name +** only to make the byte code easier to read and verify. +*/ +/* Opcode: Null P1 P2 P3 * * +** Synopsis: r[P2..P3]=NULL +** +** Write a NULL into registers P2. If P3 greater than P2, then also write +** NULL into register P3 and every register in between P2 and P3. If P3 +** is less than P2 (typically P3 is zero) then only register P2 is +** set to NULL. +** +** If the P1 value is non-zero, then also set the MEM_Cleared flag so that +** NULL values will not compare equal even if SQLITE_NULLEQ is set on +** OP_Ne or OP_Eq. +*/ +case OP_BeginSubrtn: +case OP_Null: { /* out2 */ + int cnt; + u16 nullFlag; + pOut = out2Prerelease(p, pOp); + cnt = pOp->p3-pOp->p2; + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; + pOut->n = 0; +#ifdef SQLITE_DEBUG + pOut->uTemp = 0; +#endif + while( cnt>0 ){ + pOut++; + memAboutToChange(p, pOut); + sqlite3VdbeMemSetNull(pOut); + pOut->flags = nullFlag; + pOut->n = 0; + cnt--; + } + break; +} + +/* Opcode: SoftNull P1 * * * * +** Synopsis: r[P1]=NULL +** +** Set register P1 to have the value NULL as seen by the OP_MakeRecord +** instruction, but do not free any string or blob memory associated with +** the register, so that if the value was a string or blob that was +** previously copied using OP_SCopy, the copies will continue to be valid. +*/ +case OP_SoftNull: { + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pOut = &aMem[pOp->p1]; + pOut->flags = (pOut->flags&~(MEM_Undefined|MEM_AffMask))|MEM_Null; + break; +} + +/* Opcode: Blob P1 P2 * P4 * +** Synopsis: r[P2]=P4 (len=P1) +** +** P4 points to a blob of data P1 bytes long. Store this +** blob in register P2. If P4 is a NULL pointer, then construct +** a zero-filled blob that is P1 bytes long in P2. +*/ +case OP_Blob: { /* out2 */ + assert( pOp->p1 <= SQLITE_MAX_LENGTH ); + pOut = out2Prerelease(p, pOp); + if( pOp->p4.z==0 ){ + sqlite3VdbeMemSetZeroBlob(pOut, pOp->p1); + if( sqlite3VdbeMemExpandBlob(pOut) ) goto no_mem; + }else{ + sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0); + } + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Variable P1 P2 * P4 * +** Synopsis: r[P2]=parameter(P1,P4) +** +** Transfer the values of bound parameter P1 into register P2 +** +** If the parameter is named, then its name appears in P4. +** The P4 value is used by sqlite3_bind_parameter_name(). +*/ +case OP_Variable: { /* out2 */ + Mem *pVar; /* Value being transferred */ + + assert( pOp->p1>0 && pOp->p1<=p->nVar ); + assert( pOp->p4.z==0 || pOp->p4.z==sqlite3VListNumToName(p->pVList,pOp->p1) ); + pVar = &p->aVar[pOp->p1 - 1]; + if( sqlite3VdbeMemTooBig(pVar) ){ + goto too_big; + } + pOut = &aMem[pOp->p2]; + if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut); + memcpy(pOut, pVar, MEMCELLSIZE); + pOut->flags &= ~(MEM_Dyn|MEM_Ephem); + pOut->flags |= MEM_Static|MEM_FromBind; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Move P1 P2 P3 * * +** Synopsis: r[P2@P3]=r[P1@P3] +** +** Move the P3 values in register P1..P1+P3-1 over into +** registers P2..P2+P3-1. Registers P1..P1+P3-1 are +** left holding a NULL. It is an error for register ranges +** P1..P1+P3-1 and P2..P2+P3-1 to overlap. It is an error +** for P3 to be less than 1. +*/ +case OP_Move: { + int n; /* Number of registers left to copy */ + int p1; /* Register to copy from */ + int p2; /* Register to copy to */ + + n = pOp->p3; + p1 = pOp->p1; + p2 = pOp->p2; + assert( n>0 && p1>0 && p2>0 ); + assert( p1+n<=p2 || p2+n<=p1 ); + + pIn1 = &aMem[p1]; + pOut = &aMem[p2]; + do{ + assert( pOut<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( pIn1<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( memIsValid(pIn1) ); + memAboutToChange(p, pOut); + sqlite3VdbeMemMove(pOut, pIn1); +#ifdef SQLITE_DEBUG + pIn1->pScopyFrom = 0; + { int i; + for(i=1; inMem; i++){ + if( aMem[i].pScopyFrom==pIn1 ){ + aMem[i].pScopyFrom = pOut; + } + } + } +#endif + Deephemeralize(pOut); + REGISTER_TRACE(p2++, pOut); + pIn1++; + pOut++; + }while( --n ); + break; +} + +/* Opcode: Copy P1 P2 P3 * P5 +** Synopsis: r[P2@P3+1]=r[P1@P3+1] +** +** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. +** +** If the 0x0002 bit of P5 is set then also clear the MEM_Subtype flag in the +** destination. The 0x0001 bit of P5 indicates that this Copy opcode cannot +** be merged. The 0x0001 bit is used by the query planner and does not +** come into play during query execution. +** +** This instruction makes a deep copy of the value. A duplicate +** is made of any string or blob constant. See also OP_SCopy. +*/ +case OP_Copy: { + int n; + + n = pOp->p3; + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + assert( pOut!=pIn1 ); + while( 1 ){ + memAboutToChange(p, pOut); + sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); + Deephemeralize(pOut); + if( (pOut->flags & MEM_Subtype)!=0 && (pOp->p5 & 0x0002)!=0 ){ + pOut->flags &= ~MEM_Subtype; + } +#ifdef SQLITE_DEBUG + pOut->pScopyFrom = 0; +#endif + REGISTER_TRACE(pOp->p2+pOp->p3-n, pOut); + if( (n--)==0 ) break; + pOut++; + pIn1++; + } + break; +} + +/* Opcode: SCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Make a shallow copy of register P1 into register P2. +** +** This instruction makes a shallow copy of the value. If the value +** is a string or blob, then the copy is only a pointer to the +** original and hence if the original changes so will the copy. +** Worse, if the original is deallocated, the copy becomes invalid. +** Thus the program must guarantee that the original will not change +** during the lifetime of the copy. Use OP_Copy to make a complete +** copy. +*/ +case OP_SCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + assert( pOut!=pIn1 ); + sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); +#ifdef SQLITE_DEBUG + pOut->pScopyFrom = pIn1; + pOut->mScopyFlags = pIn1->flags; +#endif + break; +} + +/* Opcode: IntCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Transfer the integer value held in register P1 into register P2. +** +** This is an optimized version of SCopy that works only for integer +** values. +*/ +case OP_IntCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Int)!=0 ); + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetInt64(pOut, pIn1->u.i); + break; +} + +/* Opcode: FkCheck * * * * * +** +** Halt with an SQLITE_CONSTRAINT error if there are any unresolved +** foreign key constraint violations. If there are no foreign key +** constraint violations, this is a no-op. +** +** FK constraint violations are also checked when the prepared statement +** exits. This opcode is used to raise foreign key constraint errors prior +** to returning results such as a row change count or the result of a +** RETURNING clause. +*/ +case OP_FkCheck: { + if( (rc = sqlite3VdbeCheckFk(p,0))!=SQLITE_OK ){ + goto abort_due_to_error; + } + break; +} + +/* Opcode: ResultRow P1 P2 * * * +** Synopsis: output=r[P1@P2] +** +** The registers P1 through P1+P2-1 contain a single row of +** results. This opcode causes the sqlite3_step() call to terminate +** with an SQLITE_ROW return code and it sets up the sqlite3_stmt +** structure to provide access to the r(P1)..r(P1+P2-1) values as +** the result row. +*/ +case OP_ResultRow: { + assert( p->nResColumn==pOp->p2 ); + assert( pOp->p1>0 || CORRUPT_DB ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + + p->cacheCtr = (p->cacheCtr + 2)|1; + p->pResultSet = &aMem[pOp->p1]; +#ifdef SQLITE_DEBUG + { + Mem *pMem = p->pResultSet; + int i; + for(i=0; ip2; i++){ + assert( memIsValid(&pMem[i]) ); + REGISTER_TRACE(pOp->p1+i, &pMem[i]); + /* The registers in the result will not be used again when the + ** prepared statement restarts. This is because sqlite3_column() + ** APIs might have caused type conversions of made other changes to + ** the register values. Therefore, we can go ahead and break any + ** OP_SCopy dependencies. */ + pMem[i].pScopyFrom = 0; + } + } +#endif + if( db->mallocFailed ) goto no_mem; + if( db->mTrace & SQLITE_TRACE_ROW ){ + db->trace.xV2(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); + } + p->pc = (int)(pOp - aOp) + 1; + rc = SQLITE_ROW; + goto vdbe_return; +} + +/* Opcode: Concat P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]+r[P1] +** +** Add the text in register P1 onto the end of the text in +** register P2 and store the result in register P3. +** If either the P1 or P2 text are NULL then store NULL in P3. +** +** P3 = P2 || P1 +** +** It is illegal for P1 and P3 to be the same register. Sometimes, +** if P3 is the same register as P2, the implementation is able +** to avoid a memcpy(). +*/ +case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ + i64 nByte; /* Total size of the output string or blob */ + u16 flags1; /* Initial flags for P1 */ + u16 flags2; /* Initial flags for P2 */ + + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; + testcase( pOut==pIn2 ); + assert( pIn1!=pOut ); + flags1 = pIn1->flags; + testcase( flags1 & MEM_Null ); + testcase( pIn2->flags & MEM_Null ); + if( (flags1 | pIn2->flags) & MEM_Null ){ + sqlite3VdbeMemSetNull(pOut); + break; + } + if( (flags1 & (MEM_Str|MEM_Blob))==0 ){ + if( sqlite3VdbeMemStringify(pIn1,encoding,0) ) goto no_mem; + flags1 = pIn1->flags & ~MEM_Str; + }else if( (flags1 & MEM_Zero)!=0 ){ + if( sqlite3VdbeMemExpandBlob(pIn1) ) goto no_mem; + flags1 = pIn1->flags & ~MEM_Str; + } + flags2 = pIn2->flags; + if( (flags2 & (MEM_Str|MEM_Blob))==0 ){ + if( sqlite3VdbeMemStringify(pIn2,encoding,0) ) goto no_mem; + flags2 = pIn2->flags & ~MEM_Str; + }else if( (flags2 & MEM_Zero)!=0 ){ + if( sqlite3VdbeMemExpandBlob(pIn2) ) goto no_mem; + flags2 = pIn2->flags & ~MEM_Str; + } + nByte = pIn1->n + pIn2->n; + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ + goto no_mem; + } + MemSetTypeFlag(pOut, MEM_Str); + if( pOut!=pIn2 ){ + memcpy(pOut->z, pIn2->z, pIn2->n); + assert( (pIn2->flags & MEM_Dyn) == (flags2 & MEM_Dyn) ); + pIn2->flags = flags2; + } + memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; + if( encoding>SQLITE_UTF8 ) nByte &= ~1; + pOut->z[nByte]=0; + pOut->z[nByte+1] = 0; + pOut->flags |= MEM_Term; + pOut->n = (int)nByte; + pOut->enc = encoding; + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Add P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]+r[P2] +** +** Add the value in register P1 to the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Multiply P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]*r[P2] +** +** +** Multiply the value in register P1 by the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Subtract P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]-r[P1] +** +** Subtract the value in register P1 from the value in register P2 +** and store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: Divide P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]/r[P1] +** +** Divide the value in register P1 by the value in register P2 +** and store the result in register P3 (P3=P2/P1). If the value in +** register P1 is zero, then the result is NULL. If either input is +** NULL, the result is NULL. +*/ +/* Opcode: Remainder P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]%r[P1] +** +** Compute the remainder after integer register P2 is divided by +** register P1 and store the result in register P3. +** If the value in register P1 is zero the result is NULL. +** If either operand is NULL, the result is NULL. +*/ +case OP_Add: /* same as TK_PLUS, in1, in2, out3 */ +case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */ +case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ +case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ +case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ + u16 flags; /* Combined MEM_* flags from both inputs */ + u16 type1; /* Numeric type of left operand */ + u16 type2; /* Numeric type of right operand */ + i64 iA; /* Integer value of left operand */ + i64 iB; /* Integer value of right operand */ + double rA; /* Real value of left operand */ + double rB; /* Real value of right operand */ + + pIn1 = &aMem[pOp->p1]; + type1 = numericType(pIn1); + pIn2 = &aMem[pOp->p2]; + type2 = numericType(pIn2); + pOut = &aMem[pOp->p3]; + flags = pIn1->flags | pIn2->flags; + if( (type1 & type2 & MEM_Int)!=0 ){ + iA = pIn1->u.i; + iB = pIn2->u.i; + switch( pOp->opcode ){ + case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break; + case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break; + case OP_Multiply: if( sqlite3MulInt64(&iB,iA) ) goto fp_math; break; + case OP_Divide: { + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 && iB==SMALLEST_INT64 ) goto fp_math; + iB /= iA; + break; + } + default: { + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 ) iA = 1; + iB %= iA; + break; + } + } + pOut->u.i = iB; + MemSetTypeFlag(pOut, MEM_Int); + }else if( (flags & MEM_Null)!=0 ){ + goto arithmetic_result_is_null; + }else{ +fp_math: + rA = sqlite3VdbeRealValue(pIn1); + rB = sqlite3VdbeRealValue(pIn2); + switch( pOp->opcode ){ + case OP_Add: rB += rA; break; + case OP_Subtract: rB -= rA; break; + case OP_Multiply: rB *= rA; break; + case OP_Divide: { + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + if( rA==(double)0 ) goto arithmetic_result_is_null; + rB /= rA; + break; + } + default: { + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); + if( iA==0 ) goto arithmetic_result_is_null; + if( iA==-1 ) iA = 1; + rB = (double)(iB % iA); + break; + } + } +#ifdef SQLITE_OMIT_FLOATING_POINT + pOut->u.i = rB; + MemSetTypeFlag(pOut, MEM_Int); +#else + if( sqlite3IsNaN(rB) ){ + goto arithmetic_result_is_null; + } + pOut->u.r = rB; + MemSetTypeFlag(pOut, MEM_Real); +#endif + } + break; + +arithmetic_result_is_null: + sqlite3VdbeMemSetNull(pOut); + break; +} + +/* Opcode: CollSeq P1 * * P4 +** +** P4 is a pointer to a CollSeq object. If the next call to a user function +** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will +** be returned. This is used by the built-in min(), max() and nullif() +** functions. +** +** If P1 is not zero, then it is a register that a subsequent min() or +** max() aggregate will set to 1 if the current row is not the minimum or +** maximum. The P1 register is initialized to 0 by this instruction. +** +** The interface used by the implementation of the aforementioned functions +** to retrieve the collation sequence set by this opcode is not available +** publicly. Only built-in functions have access to this feature. +*/ +case OP_CollSeq: { + assert( pOp->p4type==P4_COLLSEQ ); + if( pOp->p1 ){ + sqlite3VdbeMemSetInt64(&aMem[pOp->p1], 0); + } + break; +} + +/* Opcode: BitAnd P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]&r[P2] +** +** Take the bit-wise AND of the values in register P1 and P2 and +** store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: BitOr P1 P2 P3 * * +** Synopsis: r[P3]=r[P1]|r[P2] +** +** Take the bit-wise OR of the values in register P1 and P2 and +** store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +/* Opcode: ShiftLeft P1 P2 P3 * * +** Synopsis: r[P3]=r[P2]<>r[P1] +** +** Shift the integer value in register P2 to the right by the +** number of bits specified by the integer in register P1. +** Store the result in register P3. +** If either input is NULL, the result is NULL. +*/ +case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */ +case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */ +case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */ +case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ + i64 iA; + u64 uA; + i64 iB; + u8 op; + + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + pOut = &aMem[pOp->p3]; + if( (pIn1->flags | pIn2->flags) & MEM_Null ){ + sqlite3VdbeMemSetNull(pOut); + break; + } + iA = sqlite3VdbeIntValue(pIn2); + iB = sqlite3VdbeIntValue(pIn1); + op = pOp->opcode; + if( op==OP_BitAnd ){ + iA &= iB; + }else if( op==OP_BitOr ){ + iA |= iB; + }else if( iB!=0 ){ + assert( op==OP_ShiftRight || op==OP_ShiftLeft ); + + /* If shifting by a negative amount, shift in the other direction */ + if( iB<0 ){ + assert( OP_ShiftRight==OP_ShiftLeft+1 ); + op = 2*OP_ShiftLeft + 1 - op; + iB = iB>(-64) ? -iB : 64; + } + + if( iB>=64 ){ + iA = (iA>=0 || op==OP_ShiftLeft) ? 0 : -1; + }else{ + memcpy(&uA, &iA, sizeof(uA)); + if( op==OP_ShiftLeft ){ + uA <<= iB; + }else{ + uA >>= iB; + /* Sign-extend on a right shift of a negative number */ + if( iA<0 ) uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-iB); + } + memcpy(&iA, &uA, sizeof(iA)); + } + } + pOut->u.i = iA; + MemSetTypeFlag(pOut, MEM_Int); + break; +} + +/* Opcode: AddImm P1 P2 * * * +** Synopsis: r[P1]=r[P1]+P2 +** +** Add the constant P2 to the value in register P1. +** The result is always an integer. +** +** To force any register to be an integer, just add 0. +*/ +case OP_AddImm: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + memAboutToChange(p, pIn1); + sqlite3VdbeMemIntegerify(pIn1); + pIn1->u.i += pOp->p2; + break; +} + +/* Opcode: MustBeInt P1 P2 * * * +** +** Force the value in register P1 to be an integer. If the value +** in P1 is not an integer and cannot be converted into an integer +** without data loss, then jump immediately to P2, or if P2==0 +** raise an SQLITE_MISMATCH exception. +*/ +case OP_MustBeInt: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + if( (pIn1->flags & MEM_Int)==0 ){ + applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); + if( (pIn1->flags & MEM_Int)==0 ){ + VdbeBranchTaken(1, 2); + if( pOp->p2==0 ){ + rc = SQLITE_MISMATCH; + goto abort_due_to_error; + }else{ + goto jump_to_p2; + } + } + } + VdbeBranchTaken(0, 2); + MemSetTypeFlag(pIn1, MEM_Int); + break; +} + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* Opcode: RealAffinity P1 * * * * +** +** If register P1 holds an integer convert it to a real value. +** +** This opcode is used when extracting information from a column that +** has REAL affinity. Such column values may still be stored as +** integers, for space efficiency, but after extraction we want them +** to have only a real value. +*/ +case OP_RealAffinity: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + if( pIn1->flags & (MEM_Int|MEM_IntReal) ){ + testcase( pIn1->flags & MEM_Int ); + testcase( pIn1->flags & MEM_IntReal ); + sqlite3VdbeMemRealify(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); + } + break; +} +#endif + +#ifndef SQLITE_OMIT_CAST +/* Opcode: Cast P1 P2 * * * +** Synopsis: affinity(r[P1]) +** +** Force the value in register P1 to be the type defined by P2. +** +**
          +**
        • P2=='A' → BLOB +**
        • P2=='B' → TEXT +**
        • P2=='C' → NUMERIC +**
        • P2=='D' → INTEGER +**
        • P2=='E' → REAL +**
        +** +** A NULL value is not changed by this routine. It remains NULL. +*/ +case OP_Cast: { /* in1 */ + assert( pOp->p2>=SQLITE_AFF_BLOB && pOp->p2<=SQLITE_AFF_REAL ); + testcase( pOp->p2==SQLITE_AFF_TEXT ); + testcase( pOp->p2==SQLITE_AFF_BLOB ); + testcase( pOp->p2==SQLITE_AFF_NUMERIC ); + testcase( pOp->p2==SQLITE_AFF_INTEGER ); + testcase( pOp->p2==SQLITE_AFF_REAL ); + pIn1 = &aMem[pOp->p1]; + memAboutToChange(p, pIn1); + rc = ExpandBlob(pIn1); + if( rc ) goto abort_due_to_error; + rc = sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); + if( rc ) goto abort_due_to_error; + UPDATE_MAX_BLOBSIZE(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); + break; +} +#endif /* SQLITE_OMIT_CAST */ + +/* Opcode: Eq P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]==r[P1] +** +** Compare the values in register P1 and P3. If reg(P3)==reg(P1) then +** jump to address P2. +** +** The SQLITE_AFF_MASK portion of P5 must be an affinity character - +** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made +** to coerce both inputs according to this affinity before the +** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric +** affinity is used. Note that the affinity conversions are stored +** back into the input registers P1 and P3. So this opcode can cause +** persistent changes to registers P1 and P3. +** +** Once any conversions have taken place, and neither value is NULL, +** the values are compared. If both values are blobs then memcmp() is +** used to determine the results of the comparison. If both values +** are text, then the appropriate collating function specified in +** P4 is used to do the comparison. If P4 is not specified then +** memcmp() is used to compare text string. If both values are +** numeric, then a numeric comparison is used. If the two values +** are of different types, then numbers are considered less than +** strings and strings are considered less than blobs. +** +** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either +** true or false and is never NULL. If both operands are NULL then the result +** of comparison is true. If either operand is NULL then the result is false. +** If neither operand is NULL the result is the same as it would be if +** the SQLITE_NULLEQ flag were omitted from P5. +** +** This opcode saves the result of comparison for use by the new +** OP_Jump opcode. +*/ +/* Opcode: Ne P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]!=r[P1] +** +** This works just like the Eq opcode except that the jump is taken if +** the operands in registers P1 and P3 are not equal. See the Eq opcode for +** additional information. +*/ +/* Opcode: Lt P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]r[P1] +** +** This works just like the Lt opcode except that the jump is taken if +** the content of register P3 is greater than the content of +** register P1. See the Lt opcode for additional information. +*/ +/* Opcode: Ge P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]>=r[P1] +** +** This works just like the Lt opcode except that the jump is taken if +** the content of register P3 is greater than or equal to the content of +** register P1. See the Lt opcode for additional information. +*/ +case OP_Eq: /* same as TK_EQ, jump, in1, in3 */ +case OP_Ne: /* same as TK_NE, jump, in1, in3 */ +case OP_Lt: /* same as TK_LT, jump, in1, in3 */ +case OP_Le: /* same as TK_LE, jump, in1, in3 */ +case OP_Gt: /* same as TK_GT, jump, in1, in3 */ +case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ + int res, res2; /* Result of the comparison of pIn1 against pIn3 */ + char affinity; /* Affinity to use for comparison */ + u16 flags1; /* Copy of initial value of pIn1->flags */ + u16 flags3; /* Copy of initial value of pIn3->flags */ + + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + flags1 = pIn1->flags; + flags3 = pIn3->flags; + if( (flags1 & flags3 & MEM_Int)!=0 ){ + assert( (pOp->p5 & SQLITE_AFF_MASK)!=SQLITE_AFF_TEXT || CORRUPT_DB ); + /* Common case of comparison of two integers */ + if( pIn3->u.i > pIn1->u.i ){ + if( sqlite3aGTb[pOp->opcode] ){ + VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); + goto jump_to_p2; + } + iCompare = +1; + }else if( pIn3->u.i < pIn1->u.i ){ + if( sqlite3aLTb[pOp->opcode] ){ + VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); + goto jump_to_p2; + } + iCompare = -1; + }else{ + if( sqlite3aEQb[pOp->opcode] ){ + VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); + goto jump_to_p2; + } + iCompare = 0; + } + VdbeBranchTaken(0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + break; + } + if( (flags1 | flags3)&MEM_Null ){ + /* One or both operands are NULL */ + if( pOp->p5 & SQLITE_NULLEQ ){ + /* If SQLITE_NULLEQ is set (which will only happen if the operator is + ** OP_Eq or OP_Ne) then take the jump or not depending on whether + ** or not both operands are null. + */ + assert( (flags1 & MEM_Cleared)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 || CORRUPT_DB ); + testcase( (pOp->p5 & SQLITE_JUMPIFNULL)!=0 ); + if( (flags1&flags3&MEM_Null)!=0 + && (flags3&MEM_Cleared)==0 + ){ + res = 0; /* Operands are equal */ + }else{ + res = ((flags3 & MEM_Null) ? -1 : +1); /* Operands are not equal */ + } + }else{ + /* SQLITE_NULLEQ is clear and at least one operand is NULL, + ** then the result is always NULL. + ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. + */ + VdbeBranchTaken(2,3); + if( pOp->p5 & SQLITE_JUMPIFNULL ){ + goto jump_to_p2; + } + iCompare = 1; /* Operands are not equal */ + break; + } + }else{ + /* Neither operand is NULL and we couldn't do the special high-speed + ** integer comparison case. So do a general-case comparison. */ + affinity = pOp->p5 & SQLITE_AFF_MASK; + if( affinity>=SQLITE_AFF_NUMERIC ){ + if( (flags1 | flags3)&MEM_Str ){ + if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn1,0); + testcase( flags3==pIn3->flags ); + flags3 = pIn3->flags; + } + if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3,0); + } + } + }else if( affinity==SQLITE_AFF_TEXT ){ + if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + testcase( pIn1->flags & MEM_Int ); + testcase( pIn1->flags & MEM_Real ); + testcase( pIn1->flags & MEM_IntReal ); + sqlite3VdbeMemStringify(pIn1, encoding, 1); + testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); + flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); + if( pIn1==pIn3 ) flags3 = flags1 | MEM_Str; + } + if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + testcase( pIn3->flags & MEM_Int ); + testcase( pIn3->flags & MEM_Real ); + testcase( pIn3->flags & MEM_IntReal ); + sqlite3VdbeMemStringify(pIn3, encoding, 1); + testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); + flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask); + } + } + assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); + res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); + } + + /* At this point, res is negative, zero, or positive if reg[P1] is + ** less than, equal to, or greater than reg[P3], respectively. Compute + ** the answer to this operator in res2, depending on what the comparison + ** operator actually is. The next block of code depends on the fact + ** that the 6 comparison operators are consecutive integers in this + ** order: NE, EQ, GT, LE, LT, GE */ + assert( OP_Eq==OP_Ne+1 ); assert( OP_Gt==OP_Ne+2 ); assert( OP_Le==OP_Ne+3 ); + assert( OP_Lt==OP_Ne+4 ); assert( OP_Ge==OP_Ne+5 ); + if( res<0 ){ + res2 = sqlite3aLTb[pOp->opcode]; + }else if( res==0 ){ + res2 = sqlite3aEQb[pOp->opcode]; + }else{ + res2 = sqlite3aGTb[pOp->opcode]; + } + iCompare = res; + + /* Undo any changes made by applyAffinity() to the input registers. */ + assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) ); + pIn3->flags = flags3; + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; + + VdbeBranchTaken(res2!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); + if( res2 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: ElseEq * P2 * * * +** +** This opcode must follow an OP_Lt or OP_Gt comparison operator. There +** can be zero or more OP_ReleaseReg opcodes intervening, but no other +** opcodes are allowed to occur between this instruction and the previous +** OP_Lt or OP_Gt. +** +** If result of an OP_Eq comparison on the same two operands as the +** prior OP_Lt or OP_Gt would have been true, then jump to P2. +** If the result of an OP_Eq comparison on the two previous +** operands would have been false or NULL, then fall through. +*/ +case OP_ElseEq: { /* same as TK_ESCAPE, jump */ + +#ifdef SQLITE_DEBUG + /* Verify the preconditions of this opcode - that it follows an OP_Lt or + ** OP_Gt with zero or more intervening OP_ReleaseReg opcodes */ + int iAddr; + for(iAddr = (int)(pOp - aOp) - 1; ALWAYS(iAddr>=0); iAddr--){ + if( aOp[iAddr].opcode==OP_ReleaseReg ) continue; + assert( aOp[iAddr].opcode==OP_Lt || aOp[iAddr].opcode==OP_Gt ); + break; + } +#endif /* SQLITE_DEBUG */ + VdbeBranchTaken(iCompare==0, 2); + if( iCompare==0 ) goto jump_to_p2; + break; +} + + +/* Opcode: Permutation * * * P4 * +** +** Set the permutation used by the OP_Compare operator in the next +** instruction. The permutation is stored in the P4 operand. +** +** The permutation is only valid for the next opcode which must be +** an OP_Compare that has the OPFLAG_PERMUTE bit set in P5. +** +** The first integer in the P4 integer array is the length of the array +** and does not become part of the permutation. +*/ +case OP_Permutation: { + assert( pOp->p4type==P4_INTARRAY ); + assert( pOp->p4.ai ); + assert( pOp[1].opcode==OP_Compare ); + assert( pOp[1].p5 & OPFLAG_PERMUTE ); + break; +} + +/* Opcode: Compare P1 P2 P3 P4 P5 +** Synopsis: r[P1@P3] <-> r[P2@P3] +** +** Compare two vectors of registers in reg(P1)..reg(P1+P3-1) (call this +** vector "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of +** the comparison for use by the next OP_Jump instruct. +** +** If P5 has the OPFLAG_PERMUTE bit set, then the order of comparison is +** determined by the most recent OP_Permutation operator. If the +** OPFLAG_PERMUTE bit is clear, then register are compared in sequential +** order. +** +** P4 is a KeyInfo structure that defines collating sequences and sort +** orders for the comparison. The permutation applies to registers +** only. The KeyInfo elements are used sequentially. +** +** The comparison is a sort comparison, so NULLs compare equal, +** NULLs are less than numbers, numbers are less than strings, +** and strings are less than blobs. +** +** This opcode must be immediately followed by an OP_Jump opcode. +*/ +case OP_Compare: { + int n; + int i; + int p1; + int p2; + const KeyInfo *pKeyInfo; + u32 idx; + CollSeq *pColl; /* Collating sequence to use on this term */ + int bRev; /* True for DESCENDING sort order */ + u32 *aPermute; /* The permutation */ + + if( (pOp->p5 & OPFLAG_PERMUTE)==0 ){ + aPermute = 0; + }else{ + assert( pOp>aOp ); + assert( pOp[-1].opcode==OP_Permutation ); + assert( pOp[-1].p4type==P4_INTARRAY ); + aPermute = pOp[-1].p4.ai + 1; + assert( aPermute!=0 ); + } + n = pOp->p3; + pKeyInfo = pOp->p4.pKeyInfo; + assert( n>0 ); + assert( pKeyInfo!=0 ); + p1 = pOp->p1; + p2 = pOp->p2; +#ifdef SQLITE_DEBUG + if( aPermute ){ + int k, mx = 0; + for(k=0; k(u32)mx ) mx = aPermute[k]; + assert( p1>0 && p1+mx<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+mx<=(p->nMem+1 - p->nCursor)+1 ); + }else{ + assert( p1>0 && p1+n<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+n<=(p->nMem+1 - p->nCursor)+1 ); + } +#endif /* SQLITE_DEBUG */ + for(i=0; inKeyField ); + pColl = pKeyInfo->aColl[i]; + bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC); + iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); + if( iCompare ){ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null)) + ){ + iCompare = -iCompare; + } + if( bRev ) iCompare = -iCompare; + break; + } + } + assert( pOp[1].opcode==OP_Jump ); + break; +} + +/* Opcode: Jump P1 P2 P3 * * +** +** Jump to the instruction at address P1, P2, or P3 depending on whether +** in the most recent OP_Compare instruction the P1 vector was less than +** equal to, or greater than the P2 vector, respectively. +** +** This opcode must immediately follow an OP_Compare opcode. +*/ +case OP_Jump: { /* jump */ + assert( pOp>aOp && pOp[-1].opcode==OP_Compare ); + if( iCompare<0 ){ + VdbeBranchTaken(0,4); pOp = &aOp[pOp->p1 - 1]; + }else if( iCompare==0 ){ + VdbeBranchTaken(1,4); pOp = &aOp[pOp->p2 - 1]; + }else{ + VdbeBranchTaken(2,4); pOp = &aOp[pOp->p3 - 1]; + } + break; +} + +/* Opcode: And P1 P2 P3 * * +** Synopsis: r[P3]=(r[P1] && r[P2]) +** +** Take the logical AND of the values in registers P1 and P2 and +** write the result into register P3. +** +** If either P1 or P2 is 0 (false) then the result is 0 even if +** the other input is NULL. A NULL and true or two NULLs give +** a NULL output. +*/ +/* Opcode: Or P1 P2 P3 * * +** Synopsis: r[P3]=(r[P1] || r[P2]) +** +** Take the logical OR of the values in register P1 and P2 and +** store the answer in register P3. +** +** If either P1 or P2 is nonzero (true) then the result is 1 (true) +** even if the other input is NULL. A NULL and false or two NULLs +** give a NULL output. +*/ +case OP_And: /* same as TK_AND, in1, in2, out3 */ +case OP_Or: { /* same as TK_OR, in1, in2, out3 */ + int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ + int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ + + v1 = sqlite3VdbeBooleanValue(&aMem[pOp->p1], 2); + v2 = sqlite3VdbeBooleanValue(&aMem[pOp->p2], 2); + if( pOp->opcode==OP_And ){ + static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 }; + v1 = and_logic[v1*3+v2]; + }else{ + static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 }; + v1 = or_logic[v1*3+v2]; + } + pOut = &aMem[pOp->p3]; + if( v1==2 ){ + MemSetTypeFlag(pOut, MEM_Null); + }else{ + pOut->u.i = v1; + MemSetTypeFlag(pOut, MEM_Int); + } + break; +} + +/* Opcode: IsTrue P1 P2 P3 P4 * +** Synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 +** +** This opcode implements the IS TRUE, IS FALSE, IS NOT TRUE, and +** IS NOT FALSE operators. +** +** Interpret the value in register P1 as a boolean value. Store that +** boolean (a 0 or 1) in register P2. Or if the value in register P1 is +** NULL, then the P3 is stored in register P2. Invert the answer if P4 +** is 1. +** +** The logic is summarized like this: +** +**
          +**
        • If P3==0 and P4==0 then r[P2] := r[P1] IS TRUE +**
        • If P3==1 and P4==1 then r[P2] := r[P1] IS FALSE +**
        • If P3==0 and P4==1 then r[P2] := r[P1] IS NOT TRUE +**
        • If P3==1 and P4==0 then r[P2] := r[P1] IS NOT FALSE +**
        +*/ +case OP_IsTrue: { /* in1, out2 */ + assert( pOp->p4type==P4_INT32 ); + assert( pOp->p4.i==0 || pOp->p4.i==1 ); + assert( pOp->p3==0 || pOp->p3==1 ); + sqlite3VdbeMemSetInt64(&aMem[pOp->p2], + sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3) ^ pOp->p4.i); + break; +} + +/* Opcode: Not P1 P2 * * * +** Synopsis: r[P2]= !r[P1] +** +** Interpret the value in register P1 as a boolean value. Store the +** boolean complement in register P2. If the value in register P1 is +** NULL, then a NULL is stored in P2. +*/ +case OP_Not: { /* same as TK_NOT, in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + if( (pIn1->flags & MEM_Null)==0 ){ + sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeBooleanValue(pIn1,0)); + }else{ + sqlite3VdbeMemSetNull(pOut); + } + break; +} + +/* Opcode: BitNot P1 P2 * * * +** Synopsis: r[P2]= ~r[P1] +** +** Interpret the content of register P1 as an integer. Store the +** ones-complement of the P1 value into register P2. If P1 holds +** a NULL then store a NULL in P2. +*/ +case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetNull(pOut); + if( (pIn1->flags & MEM_Null)==0 ){ + pOut->flags = MEM_Int; + pOut->u.i = ~sqlite3VdbeIntValue(pIn1); + } + break; +} + +/* Opcode: Once P1 P2 * * * +** +** Fall through to the next instruction the first time this opcode is +** encountered on each invocation of the byte-code program. Jump to P2 +** on the second and all subsequent encounters during the same invocation. +** +** Top-level programs determine first invocation by comparing the P1 +** operand against the P1 operand on the OP_Init opcode at the beginning +** of the program. If the P1 values differ, then fall through and make +** the P1 of this opcode equal to the P1 of OP_Init. If P1 values are +** the same then take the jump. +** +** For subprograms, there is a bitmask in the VdbeFrame that determines +** whether or not the jump should be taken. The bitmask is necessary +** because the self-altering code trick does not work for recursive +** triggers. +*/ +case OP_Once: { /* jump */ + u32 iAddr; /* Address of this instruction */ + assert( p->aOp[0].opcode==OP_Init ); + if( p->pFrame ){ + iAddr = (int)(pOp - p->aOp); + if( (p->pFrame->aOnce[iAddr/8] & (1<<(iAddr & 7)))!=0 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } + p->pFrame->aOnce[iAddr/8] |= 1<<(iAddr & 7); + }else{ + if( p->aOp[0].p1==pOp->p1 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } + } + VdbeBranchTaken(0, 2); + pOp->p1 = p->aOp[0].p1; + break; +} + +/* Opcode: If P1 P2 P3 * * +** +** Jump to P2 if the value in register P1 is true. The value +** is considered true if it is numeric and non-zero. If the value +** in P1 is NULL then take the jump if and only if P3 is non-zero. +*/ +case OP_If: { /* jump, in1 */ + int c; + c = sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3); + VdbeBranchTaken(c!=0, 2); + if( c ) goto jump_to_p2; + break; +} + +/* Opcode: IfNot P1 P2 P3 * * +** +** Jump to P2 if the value in register P1 is False. The value +** is considered false if it has a numeric value of zero. If the value +** in P1 is NULL then take the jump if and only if P3 is non-zero. +*/ +case OP_IfNot: { /* jump, in1 */ + int c; + c = !sqlite3VdbeBooleanValue(&aMem[pOp->p1], !pOp->p3); + VdbeBranchTaken(c!=0, 2); + if( c ) goto jump_to_p2; + break; +} + +/* Opcode: IsNull P1 P2 * * * +** Synopsis: if r[P1]==NULL goto P2 +** +** Jump to P2 if the value in register P1 is NULL. +*/ +case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)!=0, 2); + if( (pIn1->flags & MEM_Null)!=0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: IsNullOrType P1 P2 P3 * * +** Synopsis: if typeof(r[P1]) IN (P3,5) goto P2 +** +** Jump to P2 if the value in register P1 is NULL or has a datatype P3. +** P3 is an integer which should be one of SQLITE_INTEGER, SQLITE_FLOAT, +** SQLITE_BLOB, SQLITE_NULL, or SQLITE_TEXT. +*/ +case OP_IsNullOrType: { /* jump, in1 */ + int doTheJump; + pIn1 = &aMem[pOp->p1]; + doTheJump = (pIn1->flags & MEM_Null)!=0 || sqlite3_value_type(pIn1)==pOp->p3; + VdbeBranchTaken( doTheJump, 2); + if( doTheJump ) goto jump_to_p2; + break; +} + +/* Opcode: ZeroOrNull P1 P2 P3 * * +** Synopsis: r[P2] = 0 OR NULL +** +** If all both registers P1 and P3 are NOT NULL, then store a zero in +** register P2. If either registers P1 or P3 are NULL then put +** a NULL in register P2. +*/ +case OP_ZeroOrNull: { /* in1, in2, out2, in3 */ + if( (aMem[pOp->p1].flags & MEM_Null)!=0 + || (aMem[pOp->p3].flags & MEM_Null)!=0 + ){ + sqlite3VdbeMemSetNull(aMem + pOp->p2); + }else{ + sqlite3VdbeMemSetInt64(aMem + pOp->p2, 0); + } + break; +} + +/* Opcode: NotNull P1 P2 * * * +** Synopsis: if r[P1]!=NULL goto P2 +** +** Jump to P2 if the value in register P1 is not NULL. +*/ +case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ + pIn1 = &aMem[pOp->p1]; + VdbeBranchTaken( (pIn1->flags & MEM_Null)==0, 2); + if( (pIn1->flags & MEM_Null)==0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: IfNullRow P1 P2 P3 * * +** Synopsis: if P1.nullRow then r[P3]=NULL, goto P2 +** +** Check the cursor P1 to see if it is currently pointing at a NULL row. +** If it is, then set register P3 to NULL and jump immediately to P2. +** If P1 is not on a NULL row, then fall through without making any +** changes. +*/ +case OP_IfNullRow: { /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( p->apCsr[pOp->p1]!=0 ); + if( p->apCsr[pOp->p1]->nullRow ){ + sqlite3VdbeMemSetNull(aMem + pOp->p3); + goto jump_to_p2; + } + break; +} + +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +/* Opcode: Offset P1 P2 P3 * * +** Synopsis: r[P3] = sqlite_offset(P1) +** +** Store in register r[P3] the byte offset into the database file that is the +** start of the payload for the record at which that cursor P1 is currently +** pointing. +** +** P2 is the column number for the argument to the sqlite_offset() function. +** This opcode does not use P2 itself, but the P2 value is used by the +** code generator. The P1, P2, and P3 operands to this opcode are the +** same as for OP_Column. +** +** This opcode is only available if SQLite is compiled with the +** -DSQLITE_ENABLE_OFFSET_SQL_FUNC option. +*/ +case OP_Offset: { /* out3 */ + VdbeCursor *pC; /* The VDBE cursor */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + pOut = &p->aMem[pOp->p3]; + if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){ + sqlite3VdbeMemSetNull(pOut); + }else{ + if( pC->deferredMoveto ){ + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + } + if( sqlite3BtreeEof(pC->uc.pCursor) ){ + sqlite3VdbeMemSetNull(pOut); + }else{ + sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor)); + } + } + break; +} +#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ + +/* Opcode: Column P1 P2 P3 P4 P5 +** Synopsis: r[P3]=PX cursor P1 column P2 +** +** Interpret the data that cursor P1 points to as a structure built using +** the MakeRecord instruction. (See the MakeRecord opcode for additional +** information about the format of the data.) Extract the P2-th column +** from this record. If there are less that (P2+1) +** values in the record, extract a NULL. +** +** The value extracted is stored in register P3. +** +** If the record contains fewer than P2 fields, then extract a NULL. Or, +** if the P4 argument is a P4_MEM use the value of the P4 argument as +** the result. +** +** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then +** the result is guaranteed to only be used as the argument of a length() +** or typeof() function, respectively. The loading of large blobs can be +** skipped for length() and all content loading can be skipped for typeof(). +*/ +case OP_Column: { + u32 p2; /* column number to retrieve */ + VdbeCursor *pC; /* The VDBE cursor */ + BtCursor *pCrsr; /* The B-Tree cursor corresponding to pC */ + u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */ + int len; /* The length of the serialized data for the column */ + int i; /* Loop counter */ + Mem *pDest; /* Where to write the extracted value */ + Mem sMem; /* For storing the record being decoded */ + const u8 *zData; /* Part of the record being decoded */ + const u8 *zHdr; /* Next unparsed byte of the header */ + const u8 *zEndHdr; /* Pointer to first byte after the header */ + u64 offset64; /* 64-bit offset */ + u32 t; /* A type code from the record header */ + Mem *pReg; /* PseudoTable input register */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pC = p->apCsr[pOp->p1]; + p2 = (u32)pOp->p2; + +op_column_restart: + assert( pC!=0 ); + assert( p2<(u32)pC->nField + || (pC->eCurType==CURTYPE_PSEUDO && pC->seekResult==0) ); + aOffset = pC->aOffset; + assert( aOffset==pC->aType+pC->nField ); + assert( pC->eCurType!=CURTYPE_VTAB ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + assert( pC->eCurType!=CURTYPE_SORTER ); + + if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ + if( pC->nullRow ){ + if( pC->eCurType==CURTYPE_PSEUDO && pC->seekResult>0 ){ + /* For the special case of as pseudo-cursor, the seekResult field + ** identifies the register that holds the record */ + pReg = &aMem[pC->seekResult]; + assert( pReg->flags & MEM_Blob ); + assert( memIsValid(pReg) ); + pC->payloadSize = pC->szRow = pReg->n; + pC->aRow = (u8*)pReg->z; + }else{ + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + sqlite3VdbeMemSetNull(pDest); + goto op_column_out; + } + }else{ + pCrsr = pC->uc.pCursor; + if( pC->deferredMoveto ){ + u32 iMap; + assert( !pC->isEphemeral ); + if( pC->ub.aAltMap && (iMap = pC->ub.aAltMap[1+p2])>0 ){ + pC = pC->pAltCursor; + p2 = iMap - 1; + goto op_column_restart; + } + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + }else if( sqlite3BtreeCursorHasMoved(pCrsr) ){ + rc = sqlite3VdbeHandleMovedCursor(pC); + if( rc ) goto abort_due_to_error; + goto op_column_restart; + } + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pCrsr ); + assert( sqlite3BtreeCursorIsValid(pCrsr) ); + pC->payloadSize = sqlite3BtreePayloadSize(pCrsr); + pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &pC->szRow); + assert( pC->szRow<=pC->payloadSize ); + assert( pC->szRow<=65536 ); /* Maximum page size is 64KiB */ + } + pC->cacheStatus = p->cacheCtr; + if( (aOffset[0] = pC->aRow[0])<0x80 ){ + pC->iHdrOffset = 1; + }else{ + pC->iHdrOffset = sqlite3GetVarint32(pC->aRow, aOffset); + } + pC->nHdrParsed = 0; + + if( pC->szRowaRow does not have to hold the entire row, but it does at least + ** need to cover the header of the record. If pC->aRow does not contain + ** the complete header, then set it to zero, forcing the header to be + ** dynamically allocated. */ + pC->aRow = 0; + pC->szRow = 0; + + /* Make sure a corrupt database has not given us an oversize header. + ** Do this now to avoid an oversize memory allocation. + ** + ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte + ** types use so much data space that there can only be 4096 and 32 of + ** them, respectively. So the maximum header length results from a + ** 3-byte type for each of the maximum of 32768 columns plus three + ** extra bytes for the header length itself. 32768*3 + 3 = 98307. + */ + if( aOffset[0] > 98307 || aOffset[0] > pC->payloadSize ){ + goto op_column_corrupt; + } + }else{ + /* This is an optimization. By skipping over the first few tests + ** (ex: pC->nHdrParsed<=p2) in the next section, we achieve a + ** measurable performance gain. + ** + ** This branch is taken even if aOffset[0]==0. Such a record is never + ** generated by SQLite, and could be considered corruption, but we + ** accept it for historical reasons. When aOffset[0]==0, the code this + ** branch jumps to reads past the end of the record, but never more + ** than a few bytes. Even if the record occurs at the end of the page + ** content area, the "page header" comes after the page content and so + ** this overread is harmless. Similar overreads can occur for a corrupt + ** database file. + */ + zData = pC->aRow; + assert( pC->nHdrParsed<=p2 ); /* Conditional skipped */ + testcase( aOffset[0]==0 ); + goto op_column_read_header; + } + }else if( sqlite3BtreeCursorHasMoved(pC->uc.pCursor) ){ + rc = sqlite3VdbeHandleMovedCursor(pC); + if( rc ) goto abort_due_to_error; + goto op_column_restart; + } + + /* Make sure at least the first p2+1 entries of the header have been + ** parsed and valid information is in aOffset[] and pC->aType[]. + */ + if( pC->nHdrParsed<=p2 ){ + /* If there is more header available for parsing in the record, try + ** to extract additional fields up through the p2+1-th field + */ + if( pC->iHdrOffsetaRow==0 ){ + memset(&sMem, 0, sizeof(sMem)); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pC->uc.pCursor,aOffset[0],&sMem); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + zData = (u8*)sMem.z; + }else{ + zData = pC->aRow; + } + + /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ + op_column_read_header: + i = pC->nHdrParsed; + offset64 = aOffset[i]; + zHdr = zData + pC->iHdrOffset; + zEndHdr = zData + aOffset[0]; + testcase( zHdr>=zEndHdr ); + do{ + if( (pC->aType[i] = t = zHdr[0])<0x80 ){ + zHdr++; + offset64 += sqlite3VdbeOneByteSerialTypeLen(t); + }else{ + zHdr += sqlite3GetVarint32(zHdr, &t); + pC->aType[i] = t; + offset64 += sqlite3VdbeSerialTypeLen(t); + } + aOffset[++i] = (u32)(offset64 & 0xffffffff); + }while( (u32)i<=p2 && zHdr=zEndHdr && (zHdr>zEndHdr || offset64!=pC->payloadSize)) + || (offset64 > pC->payloadSize) + ){ + if( aOffset[0]==0 ){ + i = 0; + zHdr = zEndHdr; + }else{ + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + goto op_column_corrupt; + } + } + + pC->nHdrParsed = i; + pC->iHdrOffset = (u32)(zHdr - zData); + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + }else{ + t = 0; + } + + /* If after trying to extract new entries from the header, nHdrParsed is + ** still not up to p2, that means that the record has fewer than p2 + ** columns. So the result will be either the default value or a NULL. + */ + if( pC->nHdrParsed<=p2 ){ + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + if( pOp->p4type==P4_MEM ){ + sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); + }else{ + sqlite3VdbeMemSetNull(pDest); + } + goto op_column_out; + } + }else{ + t = pC->aType[p2]; + } + + /* Extract the content for the p2+1-th column. Control can only + ** reach this point if aOffset[p2], aOffset[p2+1], and pC->aType[p2] are + ** all valid. + */ + assert( p2nHdrParsed ); + assert( rc==SQLITE_OK ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + assert( sqlite3VdbeCheckMemInvariants(pDest) ); + if( VdbeMemDynamic(pDest) ){ + sqlite3VdbeMemSetNull(pDest); + } + assert( t==pC->aType[p2] ); + if( pC->szRow>=aOffset[p2+1] ){ + /* This is the common case where the desired content fits on the original + ** page - where the content is not on an overflow page */ + zData = pC->aRow + aOffset[p2]; + if( t<12 ){ + sqlite3VdbeSerialGet(zData, t, pDest); + }else{ + /* If the column value is a string, we need a persistent value, not + ** a MEM_Ephem value. This branch is a fast short-cut that is equivalent + ** to calling sqlite3VdbeSerialGet() and sqlite3VdbeDeephemeralize(). + */ + static const u16 aFlag[] = { MEM_Blob, MEM_Str|MEM_Term }; + pDest->n = len = (t-12)/2; + pDest->enc = encoding; + if( pDest->szMalloc < len+2 ){ + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; + pDest->flags = MEM_Null; + if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem; + }else{ + pDest->z = pDest->zMalloc; + } + memcpy(pDest->z, zData, len); + pDest->z[len] = 0; + pDest->z[len+1] = 0; + pDest->flags = aFlag[t&1]; + } + }else{ + pDest->enc = encoding; + /* This branch happens only when content is on overflow pages */ + if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 + && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) + || (len = sqlite3VdbeSerialTypeLen(t))==0 + ){ + /* Content is irrelevant for + ** 1. the typeof() function, + ** 2. the length(X) function if X is a blob, and + ** 3. if the content length is zero. + ** So we might as well use bogus content rather than reading + ** content from disk. + ** + ** Although sqlite3VdbeSerialGet() may read at most 8 bytes from the + ** buffer passed to it, debugging function VdbeMemPrettyPrint() may + ** read more. Use the global constant sqlite3CtypeMap[] as the array, + ** as that array is 256 bytes long (plenty for VdbeMemPrettyPrint()) + ** and it begins with a bunch of zeros. + */ + sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest); + }else{ + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); + pDest->flags &= ~MEM_Ephem; + } + } + +op_column_out: + UPDATE_MAX_BLOBSIZE(pDest); + REGISTER_TRACE(pOp->p3, pDest); + break; + +op_column_corrupt: + if( aOp[0].p3>0 ){ + pOp = &aOp[aOp[0].p3-1]; + break; + }else{ + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } +} + +/* Opcode: TypeCheck P1 P2 P3 P4 * +** Synopsis: typecheck(r[P1@P2]) +** +** Apply affinities to the range of P2 registers beginning with P1. +** Take the affinities from the Table object in P4. If any value +** cannot be coerced into the correct type, then raise an error. +** +** This opcode is similar to OP_Affinity except that this opcode +** forces the register type to the Table column type. This is used +** to implement "strict affinity". +** +** GENERATED ALWAYS AS ... STATIC columns are only checked if P3 +** is zero. When P3 is non-zero, no type checking occurs for +** static generated columns. Virtual columns are computed at query time +** and so they are never checked. +** +** Preconditions: +** +**
          +**
        • P2 should be the number of non-virtual columns in the +** table of P4. +**
        • Table P4 should be a STRICT table. +**
        +** +** If any precondition is false, an assertion fault occurs. +*/ +case OP_TypeCheck: { + Table *pTab; + Column *aCol; + int i; + + assert( pOp->p4type==P4_TABLE ); + pTab = pOp->p4.pTab; + assert( pTab->tabFlags & TF_Strict ); + assert( pTab->nNVCol==pOp->p2 ); + aCol = pTab->aCol; + pIn1 = &aMem[pOp->p1]; + for(i=0; inCol; i++){ + if( aCol[i].colFlags & COLFLAG_GENERATED ){ + if( aCol[i].colFlags & COLFLAG_VIRTUAL ) continue; + if( pOp->p3 ){ pIn1++; continue; } + } + assert( pIn1 < &aMem[pOp->p1+pOp->p2] ); + applyAffinity(pIn1, aCol[i].affinity, encoding); + if( (pIn1->flags & MEM_Null)==0 ){ + switch( aCol[i].eCType ){ + case COLTYPE_BLOB: { + if( (pIn1->flags & MEM_Blob)==0 ) goto vdbe_type_error; + break; + } + case COLTYPE_INTEGER: + case COLTYPE_INT: { + if( (pIn1->flags & MEM_Int)==0 ) goto vdbe_type_error; + break; + } + case COLTYPE_TEXT: { + if( (pIn1->flags & MEM_Str)==0 ) goto vdbe_type_error; + break; + } + case COLTYPE_REAL: { + testcase( (pIn1->flags & (MEM_Real|MEM_IntReal))==MEM_Real ); + testcase( (pIn1->flags & (MEM_Real|MEM_IntReal))==MEM_IntReal ); + if( pIn1->flags & MEM_Int ){ + /* When applying REAL affinity, if the result is still an MEM_Int + ** that will fit in 6 bytes, then change the type to MEM_IntReal + ** so that we keep the high-resolution integer value but know that + ** the type really wants to be REAL. */ + testcase( pIn1->u.i==140737488355328LL ); + testcase( pIn1->u.i==140737488355327LL ); + testcase( pIn1->u.i==-140737488355328LL ); + testcase( pIn1->u.i==-140737488355329LL ); + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL){ + pIn1->flags |= MEM_IntReal; + pIn1->flags &= ~MEM_Int; + }else{ + pIn1->u.r = (double)pIn1->u.i; + pIn1->flags |= MEM_Real; + pIn1->flags &= ~MEM_Int; + } + }else if( (pIn1->flags & (MEM_Real|MEM_IntReal))==0 ){ + goto vdbe_type_error; + } + break; + } + default: { + /* COLTYPE_ANY. Accept anything. */ + break; + } + } + } + REGISTER_TRACE((int)(pIn1-aMem), pIn1); + pIn1++; + } + assert( pIn1 == &aMem[pOp->p1+pOp->p2] ); + break; + +vdbe_type_error: + sqlite3VdbeError(p, "cannot store %s value in %s column %s.%s", + vdbeMemTypeName(pIn1), sqlite3StdType[aCol[i].eCType-1], + pTab->zName, aCol[i].zCnName); + rc = SQLITE_CONSTRAINT_DATATYPE; + goto abort_due_to_error; +} + +/* Opcode: Affinity P1 P2 * P4 * +** Synopsis: affinity(r[P1@P2]) +** +** Apply affinities to a range of P2 registers starting with P1. +** +** P4 is a string that is P2 characters long. The N-th character of the +** string indicates the column affinity that should be used for the N-th +** memory cell in the range. +*/ +case OP_Affinity: { + const char *zAffinity; /* The affinity to be applied */ + + zAffinity = pOp->p4.z; + assert( zAffinity!=0 ); + assert( pOp->p2>0 ); + assert( zAffinity[pOp->p2]==0 ); + pIn1 = &aMem[pOp->p1]; + while( 1 /*exit-by-break*/ ){ + assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); + assert( zAffinity[0]==SQLITE_AFF_NONE || memIsValid(pIn1) ); + applyAffinity(pIn1, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pIn1->flags & MEM_Int)!=0 ){ + /* When applying REAL affinity, if the result is still an MEM_Int + ** that will fit in 6 bytes, then change the type to MEM_IntReal + ** so that we keep the high-resolution integer value but know that + ** the type really wants to be REAL. */ + testcase( pIn1->u.i==140737488355328LL ); + testcase( pIn1->u.i==140737488355327LL ); + testcase( pIn1->u.i==-140737488355328LL ); + testcase( pIn1->u.i==-140737488355329LL ); + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL ){ + pIn1->flags |= MEM_IntReal; + pIn1->flags &= ~MEM_Int; + }else{ + pIn1->u.r = (double)pIn1->u.i; + pIn1->flags |= MEM_Real; + pIn1->flags &= ~MEM_Int; + } + } + REGISTER_TRACE((int)(pIn1-aMem), pIn1); + zAffinity++; + if( zAffinity[0]==0 ) break; + pIn1++; + } + break; +} + +/* Opcode: MakeRecord P1 P2 P3 P4 * +** Synopsis: r[P3]=mkrec(r[P1@P2]) +** +** Convert P2 registers beginning with P1 into the [record format] +** use as a data record in a database table or as a key +** in an index. The OP_Column opcode can decode the record later. +** +** P4 may be a string that is P2 characters long. The N-th character of the +** string indicates the column affinity that should be used for the N-th +** field of the index key. +** +** The mapping from character to affinity is given by the SQLITE_AFF_ +** macros defined in sqliteInt.h. +** +** If P4 is NULL then all index fields have the affinity BLOB. +** +** The meaning of P5 depends on whether or not the SQLITE_ENABLE_NULL_TRIM +** compile-time option is enabled: +** +** * If SQLITE_ENABLE_NULL_TRIM is enabled, then the P5 is the index +** of the right-most table that can be null-trimmed. +** +** * If SQLITE_ENABLE_NULL_TRIM is omitted, then P5 has the value +** OPFLAG_NOCHNG_MAGIC if the OP_MakeRecord opcode is allowed to +** accept no-change records with serial_type 10. This value is +** only used inside an assert() and does not affect the end result. +*/ +case OP_MakeRecord: { + Mem *pRec; /* The new record */ + u64 nData; /* Number of bytes of data space */ + int nHdr; /* Number of bytes of header space */ + i64 nByte; /* Data space required for this record */ + i64 nZero; /* Number of zero bytes at the end of the record */ + int nVarint; /* Number of bytes in a varint */ + u32 serial_type; /* Type field */ + Mem *pData0; /* First field to be combined into the record */ + Mem *pLast; /* Last field of the record */ + int nField; /* Number of fields in the record */ + char *zAffinity; /* The affinity string for the record */ + u32 len; /* Length of a field */ + u8 *zHdr; /* Where to write next byte of the header */ + u8 *zPayload; /* Where to write next byte of the payload */ + + /* Assuming the record contains N fields, the record format looks + ** like this: + ** + ** ------------------------------------------------------------------------ + ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 | + ** ------------------------------------------------------------------------ + ** + ** Data(0) is taken from register P1. Data(1) comes from register P1+1 + ** and so forth. + ** + ** Each type field is a varint representing the serial type of the + ** corresponding data element (see sqlite3VdbeSerialType()). The + ** hdr-size field is also a varint which is the offset from the beginning + ** of the record to data0. + */ + nData = 0; /* Number of bytes of data space */ + nHdr = 0; /* Number of bytes of header space */ + nZero = 0; /* Number of zero bytes at the end of the record */ + nField = pOp->p1; + zAffinity = pOp->p4.z; + assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=(p->nMem+1 - p->nCursor)+1 ); + pData0 = &aMem[nField]; + nField = pOp->p2; + pLast = &pData0[nField-1]; + + /* Identify the output register */ + assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); + pOut = &aMem[pOp->p3]; + memAboutToChange(p, pOut); + + /* Apply the requested affinity to all inputs + */ + assert( pData0<=pLast ); + if( zAffinity ){ + pRec = pData0; + do{ + applyAffinity(pRec, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pRec->flags & MEM_Int) ){ + pRec->flags |= MEM_IntReal; + pRec->flags &= ~(MEM_Int); + } + REGISTER_TRACE((int)(pRec-aMem), pRec); + zAffinity++; + pRec++; + assert( zAffinity[0]==0 || pRec<=pLast ); + }while( zAffinity[0] ); + } + +#ifdef SQLITE_ENABLE_NULL_TRIM + /* NULLs can be safely trimmed from the end of the record, as long as + ** as the schema format is 2 or more and none of the omitted columns + ** have a non-NULL default value. Also, the record must be left with + ** at least one field. If P5>0 then it will be one more than the + ** index of the right-most column with a non-NULL default value */ + if( pOp->p5 ){ + while( (pLast->flags & MEM_Null)!=0 && nField>pOp->p5 ){ + pLast--; + nField--; + } + } +#endif + + /* Loop through the elements that will make up the record to figure + ** out how much space is required for the new record. After this loop, + ** the Mem.uTemp field of each term should hold the serial-type that will + ** be used for that term in the generated record: + ** + ** Mem.uTemp value type + ** --------------- --------------- + ** 0 NULL + ** 1 1-byte signed integer + ** 2 2-byte signed integer + ** 3 3-byte signed integer + ** 4 4-byte signed integer + ** 5 6-byte signed integer + ** 6 8-byte signed integer + ** 7 IEEE float + ** 8 Integer constant 0 + ** 9 Integer constant 1 + ** 10,11 reserved for expansion + ** N>=12 and even BLOB + ** N>=13 and odd text + ** + ** The following additional values are computed: + ** nHdr Number of bytes needed for the record header + ** nData Number of bytes of data space needed for the record + ** nZero Zero bytes at the end of the record + */ + pRec = pLast; + do{ + assert( memIsValid(pRec) ); + if( pRec->flags & MEM_Null ){ + if( pRec->flags & MEM_Zero ){ + /* Values with MEM_Null and MEM_Zero are created by xColumn virtual + ** table methods that never invoke sqlite3_result_xxxxx() while + ** computing an unchanging column value in an UPDATE statement. + ** Give such values a special internal-use-only serial-type of 10 + ** so that they can be passed through to xUpdate and have + ** a true sqlite3_value_nochange(). */ +#ifndef SQLITE_ENABLE_NULL_TRIM + assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); +#endif + pRec->uTemp = 10; + }else{ + pRec->uTemp = 0; + } + nHdr++; + }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ + i64 i = pRec->u.i; + u64 uu; + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_IntReal ); + if( i<0 ){ + uu = ~i; + }else{ + uu = i; + } + nHdr++; + testcase( uu==127 ); testcase( uu==128 ); + testcase( uu==32767 ); testcase( uu==32768 ); + testcase( uu==8388607 ); testcase( uu==8388608 ); + testcase( uu==2147483647 ); testcase( uu==2147483648LL ); + testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); + if( uu<=127 ){ + if( (i&1)==i && p->minWriteFileFormat>=4 ){ + pRec->uTemp = 8+(u32)uu; + }else{ + nData++; + pRec->uTemp = 1; + } + }else if( uu<=32767 ){ + nData += 2; + pRec->uTemp = 2; + }else if( uu<=8388607 ){ + nData += 3; + pRec->uTemp = 3; + }else if( uu<=2147483647 ){ + nData += 4; + pRec->uTemp = 4; + }else if( uu<=140737488355327LL ){ + nData += 6; + pRec->uTemp = 5; + }else{ + nData += 8; + if( pRec->flags & MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pRec->u.r = (double)pRec->u.i; + pRec->flags &= ~MEM_IntReal; + pRec->flags |= MEM_Real; + pRec->uTemp = 7; + }else{ + pRec->uTemp = 6; + } + } + }else if( pRec->flags & MEM_Real ){ + nHdr++; + nData += 8; + pRec->uTemp = 7; + }else{ + assert( db->mallocFailed || pRec->flags&(MEM_Str|MEM_Blob) ); + assert( pRec->n>=0 ); + len = (u32)pRec->n; + serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0); + if( pRec->flags & MEM_Zero ){ + serial_type += pRec->u.nZero*2; + if( nData ){ + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + len += pRec->u.nZero; + }else{ + nZero += pRec->u.nZero; + } + } + nData += len; + nHdr += sqlite3VarintLen(serial_type); + pRec->uTemp = serial_type; + } + if( pRec==pData0 ) break; + pRec--; + }while(1); + + /* EVIDENCE-OF: R-22564-11647 The header begins with a single varint + ** which determines the total number of bytes in the header. The varint + ** value is the size of the header in bytes including the size varint + ** itself. */ + testcase( nHdr==126 ); + testcase( nHdr==127 ); + if( nHdr<=126 ){ + /* The common case */ + nHdr += 1; + }else{ + /* Rare case of a really large header */ + nVarint = sqlite3VarintLen(nHdr); + nHdr += nVarint; + if( nVarintp3) is not allowed to + ** be one of the input registers (because the following call to + ** sqlite3VdbeMemClearAndResize() could clobber the value before it is used). + */ + if( nByte+nZero<=pOut->szMalloc ){ + /* The output register is already large enough to hold the record. + ** No error checks or buffer enlargement is required */ + pOut->z = pOut->zMalloc; + }else{ + /* Need to make sure that the output is not too big and then enlarge + ** the output register to hold the full result */ + if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ + goto no_mem; + } + } + pOut->n = (int)nByte; + pOut->flags = MEM_Blob; + if( nZero ){ + pOut->u.nZero = nZero; + pOut->flags |= MEM_Zero; + } + UPDATE_MAX_BLOBSIZE(pOut); + zHdr = (u8 *)pOut->z; + zPayload = zHdr + nHdr; + + /* Write the record */ + if( nHdr<0x80 ){ + *(zHdr++) = nHdr; + }else{ + zHdr += sqlite3PutVarint(zHdr,nHdr); + } + assert( pData0<=pLast ); + pRec = pData0; + while( 1 /*exit-by-break*/ ){ + serial_type = pRec->uTemp; + /* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more + ** additional varints, one per column. + ** EVIDENCE-OF: R-64536-51728 The values for each column in the record + ** immediately follow the header. */ + if( serial_type<=7 ){ + *(zHdr++) = serial_type; + if( serial_type==0 ){ + /* NULL value. No change in zPayload */ + }else{ + u64 v; + u32 i; + if( serial_type==7 ){ + assert( sizeof(v)==sizeof(pRec->u.r) ); + memcpy(&v, &pRec->u.r, sizeof(v)); + swapMixedEndianFloat(v); + }else{ + v = pRec->u.i; + } + len = i = sqlite3SmallTypeSizes[serial_type]; + assert( i>0 ); + while( 1 /*exit-by-break*/ ){ + zPayload[--i] = (u8)(v&0xFF); + if( i==0 ) break; + v >>= 8; + } + zPayload += len; + } + }else if( serial_type<0x80 ){ + *(zHdr++) = serial_type; + if( serial_type>=14 && pRec->n>0 ){ + assert( pRec->z!=0 ); + memcpy(zPayload, pRec->z, pRec->n); + zPayload += pRec->n; + } + }else{ + zHdr += sqlite3PutVarint(zHdr, serial_type); + if( pRec->n ){ + assert( pRec->z!=0 ); + memcpy(zPayload, pRec->z, pRec->n); + zPayload += pRec->n; + } + } + if( pRec==pLast ) break; + pRec++; + } + assert( nHdr==(int)(zHdr - (u8*)pOut->z) ); + assert( nByte==(int)(zPayload - (u8*)pOut->z) ); + + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + REGISTER_TRACE(pOp->p3, pOut); + break; +} + +/* Opcode: Count P1 P2 P3 * * +** Synopsis: r[P2]=count() +** +** Store the number of entries (an integer value) in the table or index +** opened by cursor P1 in register P2. +** +** If P3==0, then an exact count is obtained, which involves visiting +** every btree page of the table. But if P3 is non-zero, an estimate +** is returned based on the current cursor position. +*/ +case OP_Count: { /* out2 */ + i64 nEntry; + BtCursor *pCrsr; + + assert( p->apCsr[pOp->p1]->eCurType==CURTYPE_BTREE ); + pCrsr = p->apCsr[pOp->p1]->uc.pCursor; + assert( pCrsr ); + if( pOp->p3 ){ + nEntry = sqlite3BtreeRowCountEst(pCrsr); + }else{ + nEntry = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3BtreeCount(db, pCrsr, &nEntry); + if( rc ) goto abort_due_to_error; + } + pOut = out2Prerelease(p, pOp); + pOut->u.i = nEntry; + goto check_for_interrupt; +} + +/* Opcode: Savepoint P1 * * P4 * +** +** Open, release or rollback the savepoint named by parameter P4, depending +** on the value of P1. To open a new savepoint set P1==0 (SAVEPOINT_BEGIN). +** To release (commit) an existing savepoint set P1==1 (SAVEPOINT_RELEASE). +** To rollback an existing savepoint set P1==2 (SAVEPOINT_ROLLBACK). +*/ +case OP_Savepoint: { + int p1; /* Value of P1 operand */ + char *zName; /* Name of savepoint */ + int nName; + Savepoint *pNew; + Savepoint *pSavepoint; + Savepoint *pTmp; + int iSavepoint; + int ii; + + p1 = pOp->p1; + zName = pOp->p4.z; + + /* Assert that the p1 parameter is valid. Also that if there is no open + ** transaction, then there cannot be any savepoints. + */ + assert( db->pSavepoint==0 || db->autoCommit==0 ); + assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK ); + assert( db->pSavepoint || db->isTransactionSavepoint==0 ); + assert( checkSavepointCount(db) ); + assert( p->bIsReader ); + + if( p1==SAVEPOINT_BEGIN ){ + if( db->nVdbeWrite>0 ){ + /* A new savepoint cannot be created if there are active write + ** statements (i.e. open read/write incremental blob handles). + */ + sqlite3VdbeError(p, "cannot open savepoint - SQL statements in progress"); + rc = SQLITE_BUSY; + }else{ + nName = sqlite3Strlen30(zName); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* This call is Ok even if this savepoint is actually a transaction + ** savepoint (and therefore should not prompt xSavepoint()) callbacks. + ** If this is a transaction savepoint being opened, it is guaranteed + ** that the db->aVTrans[] array is empty. */ + assert( db->autoCommit==0 || db->nVTrans==0 ); + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, + db->nStatement+db->nSavepoint); + if( rc!=SQLITE_OK ) goto abort_due_to_error; +#endif + + /* Create a new savepoint structure. */ + pNew = sqlite3DbMallocRawNN(db, sizeof(Savepoint)+nName+1); + if( pNew ){ + pNew->zName = (char *)&pNew[1]; + memcpy(pNew->zName, zName, nName+1); + + /* If there is no open transaction, then mark this as a special + ** "transaction savepoint". */ + if( db->autoCommit ){ + db->autoCommit = 0; + db->isTransactionSavepoint = 1; + }else{ + db->nSavepoint++; + } + + /* Link the new savepoint into the database handle's list. */ + pNew->pNext = db->pSavepoint; + db->pSavepoint = pNew; + pNew->nDeferredCons = db->nDeferredCons; + pNew->nDeferredImmCons = db->nDeferredImmCons; + } + } + }else{ + assert( p1==SAVEPOINT_RELEASE || p1==SAVEPOINT_ROLLBACK ); + iSavepoint = 0; + + /* Find the named savepoint. If there is no such savepoint, then an + ** an error is returned to the user. */ + for( + pSavepoint = db->pSavepoint; + pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName); + pSavepoint = pSavepoint->pNext + ){ + iSavepoint++; + } + if( !pSavepoint ){ + sqlite3VdbeError(p, "no such savepoint: %s", zName); + rc = SQLITE_ERROR; + }else if( db->nVdbeWrite>0 && p1==SAVEPOINT_RELEASE ){ + /* It is not possible to release (commit) a savepoint if there are + ** active write statements. + */ + sqlite3VdbeError(p, "cannot release savepoint - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + }else{ + + /* Determine whether or not this is a transaction savepoint. If so, + ** and this is a RELEASE command, then the current transaction + ** is committed. + */ + int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint; + if( isTransaction && p1==SAVEPOINT_RELEASE ){ + if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + goto vdbe_return; + } + db->autoCommit = 1; + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = 0; + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; + } + rc = p->rc; + if( rc ){ + db->autoCommit = 0; + }else{ + db->isTransactionSavepoint = 0; + } + }else{ + int isSchemaChange; + iSavepoint = db->nSavepoint - iSavepoint - 1; + if( p1==SAVEPOINT_ROLLBACK ){ + isSchemaChange = (db->mDbFlags & DBFLAG_SchemaChange)!=0; + for(ii=0; iinDb; ii++){ + rc = sqlite3BtreeTripAllCursors(db->aDb[ii].pBt, + SQLITE_ABORT_ROLLBACK, + isSchemaChange==0); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + } + }else{ + assert( p1==SAVEPOINT_RELEASE ); + isSchemaChange = 0; + } + for(ii=0; iinDb; ii++){ + rc = sqlite3BtreeSavepoint(db->aDb[ii].pBt, p1, iSavepoint); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + } + if( isSchemaChange ){ + sqlite3ExpirePreparedStatements(db, 0); + sqlite3ResetAllSchemasOfConnection(db); + db->mDbFlags |= DBFLAG_SchemaChange; + } + } + if( rc ) goto abort_due_to_error; + + /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all + ** savepoints nested inside of the savepoint being operated on. */ + while( db->pSavepoint!=pSavepoint ){ + pTmp = db->pSavepoint; + db->pSavepoint = pTmp->pNext; + sqlite3DbFree(db, pTmp); + db->nSavepoint--; + } + + /* If it is a RELEASE, then destroy the savepoint being operated on + ** too. If it is a ROLLBACK TO, then set the number of deferred + ** constraint violations present in the database to the value stored + ** when the savepoint was created. */ + if( p1==SAVEPOINT_RELEASE ){ + assert( pSavepoint==db->pSavepoint ); + db->pSavepoint = pSavepoint->pNext; + sqlite3DbFree(db, pSavepoint); + if( !isTransaction ){ + db->nSavepoint--; + } + }else{ + assert( p1==SAVEPOINT_ROLLBACK ); + db->nDeferredCons = pSavepoint->nDeferredCons; + db->nDeferredImmCons = pSavepoint->nDeferredImmCons; + } + + if( !isTransaction || p1==SAVEPOINT_ROLLBACK ){ + rc = sqlite3VtabSavepoint(db, p1, iSavepoint); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + } + } + } + if( rc ) goto abort_due_to_error; + if( p->eVdbeState==VDBE_HALT_STATE ){ + rc = SQLITE_DONE; + goto vdbe_return; + } + break; +} + +/* Opcode: AutoCommit P1 P2 * * * +** +** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll +** back any currently active btree transactions. If there are any active +** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if +** there are active writing VMs or active VMs that use shared cache. +** +** This instruction causes the VM to halt. +*/ +case OP_AutoCommit: { + int desiredAutoCommit; + int iRollback; + + desiredAutoCommit = pOp->p1; + iRollback = pOp->p2; + assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); + assert( desiredAutoCommit==1 || iRollback==0 ); + assert( db->nVdbeActive>0 ); /* At least this one VM is active */ + assert( p->bIsReader ); + + if( desiredAutoCommit!=db->autoCommit ){ + if( iRollback ){ + assert( desiredAutoCommit==1 ); + sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); + db->autoCommit = 1; + }else if( desiredAutoCommit && db->nVdbeWrite>0 ){ + /* If this instruction implements a COMMIT and other VMs are writing + ** return an error indicating that the other VMs must complete first. + */ + sqlite3VdbeError(p, "cannot commit transaction - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + goto abort_due_to_error; + }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ + goto vdbe_return; + }else{ + db->autoCommit = (u8)desiredAutoCommit; + } + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = (u8)(1-desiredAutoCommit); + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; + } + sqlite3CloseSavepoints(db); + if( p->rc==SQLITE_OK ){ + rc = SQLITE_DONE; + }else{ + rc = SQLITE_ERROR; + } + goto vdbe_return; + }else{ + sqlite3VdbeError(p, + (!desiredAutoCommit)?"cannot start a transaction within a transaction":( + (iRollback)?"cannot rollback - no transaction is active": + "cannot commit - no transaction is active")); + + rc = SQLITE_ERROR; + goto abort_due_to_error; + } + /*NOTREACHED*/ assert(0); +} + +/* Opcode: Transaction P1 P2 P3 P4 P5 +** +** Begin a transaction on database P1 if a transaction is not already +** active. +** If P2 is non-zero, then a write-transaction is started, or if a +** read-transaction is already active, it is upgraded to a write-transaction. +** If P2 is zero, then a read-transaction is started. If P2 is 2 or more +** then an exclusive transaction is started. +** +** P1 is the index of the database file on which the transaction is +** started. Index 0 is the main database file and index 1 is the +** file used for temporary tables. Indices of 2 or more are used for +** attached databases. +** +** If a write-transaction is started and the Vdbe.usesStmtJournal flag is +** true (this flag is set if the Vdbe may modify more than one row and may +** throw an ABORT exception), a statement transaction may also be opened. +** More specifically, a statement transaction is opened iff the database +** connection is currently not in autocommit mode, or if there are other +** active statements. A statement transaction allows the changes made by this +** VDBE to be rolled back after an error without having to roll back the +** entire transaction. If no error is encountered, the statement transaction +** will automatically commit when the VDBE halts. +** +** If P5!=0 then this opcode also checks the schema cookie against P3 +** and the schema generation counter against P4. +** The cookie changes its value whenever the database schema changes. +** This operation is used to detect when that the cookie has changed +** and that the current process needs to reread the schema. If the schema +** cookie in P3 differs from the schema cookie in the database header or +** if the schema generation counter in P4 differs from the current +** generation counter, then an SQLITE_SCHEMA error is raised and execution +** halts. The sqlite3_step() wrapper function might then reprepare the +** statement and rerun it from the beginning. +*/ +case OP_Transaction: { + Btree *pBt; + Db *pDb; + int iMeta = 0; + + assert( p->bIsReader ); + assert( p->readOnly==0 || pOp->p2==0 ); + assert( pOp->p2>=0 && pOp->p2<=2 ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( rc==SQLITE_OK ); + if( pOp->p2 && (db->flags & (SQLITE_QueryOnly|SQLITE_CorruptRdOnly))!=0 ){ + if( db->flags & SQLITE_QueryOnly ){ + /* Writes prohibited by the "PRAGMA query_only=TRUE" statement */ + rc = SQLITE_READONLY; + }else{ + /* Writes prohibited due to a prior SQLITE_CORRUPT in the current + ** transaction */ + rc = SQLITE_CORRUPT; + } + goto abort_due_to_error; + } + pDb = &db->aDb[pOp->p1]; + pBt = pDb->pBt; + + if( pBt ){ + rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta); + testcase( rc==SQLITE_BUSY_SNAPSHOT ); + testcase( rc==SQLITE_BUSY_RECOVERY ); + if( rc!=SQLITE_OK ){ + if( (rc&0xff)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + p->rc = rc; + goto vdbe_return; + } + goto abort_due_to_error; + } + + if( p->usesStmtJournal + && pOp->p2 + && (db->autoCommit==0 || db->nVdbeRead>1) + ){ + assert( sqlite3BtreeTxnState(pBt)==SQLITE_TXN_WRITE ); + if( p->iStatement==0 ){ + assert( db->nStatement>=0 && db->nSavepoint>=0 ); + db->nStatement++; + p->iStatement = db->nSavepoint + db->nStatement; + } + + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); + } + + /* Store the current value of the database handles deferred constraint + ** counter. If the statement transaction needs to be rolled back, + ** the value of this counter needs to be restored too. */ + p->nStmtDefCons = db->nDeferredCons; + p->nStmtDefImmCons = db->nDeferredImmCons; + } + } + assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); + if( rc==SQLITE_OK + && pOp->p5 + && (iMeta!=pOp->p3 || pDb->pSchema->iGeneration!=pOp->p4.i) + ){ + /* + ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema + ** version is checked to ensure that the schema has not changed since the + ** SQL statement was prepared. + */ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); + /* If the schema-cookie from the database file matches the cookie + ** stored with the in-memory representation of the schema, do + ** not reload the schema from the database file. + ** + ** If virtual-tables are in use, this is not just an optimization. + ** Often, v-tables store their data in other SQLite tables, which + ** are queried from within xNext() and other v-table methods using + ** prepared queries. If such a query is out-of-date, we do not want to + ** discard the database schema, as the user code implementing the + ** v-table would have to be ready for the sqlite3_vtab structure itself + ** to be invalidated whenever sqlite3_step() is called from within + ** a v-table method. + */ + if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ + sqlite3ResetOneSchema(db, pOp->p1); + } + p->expired = 1; + rc = SQLITE_SCHEMA; + + /* Set changeCntOn to 0 to prevent the value returned by sqlite3_changes() + ** from being modified in sqlite3VdbeHalt(). If this statement is + ** reprepared, changeCntOn will be set again. */ + p->changeCntOn = 0; + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ReadCookie P1 P2 P3 * * +** +** Read cookie number P3 from database P1 and write it into register P2. +** P3==1 is the schema version. P3==2 is the database format. +** P3==3 is the recommended pager cache size, and so forth. P1==0 is +** the main database file and P1==1 is the database file used to store +** temporary tables. +** +** There must be a read-lock on the database (either a transaction +** must be started or there must be an open cursor) before +** executing this instruction. +*/ +case OP_ReadCookie: { /* out2 */ + int iMeta; + int iDb; + int iCookie; + + assert( p->bIsReader ); + iDb = pOp->p1; + iCookie = pOp->p3; + assert( pOp->p3=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + assert( DbMaskTest(p->btreeMask, iDb) ); + + sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta); + pOut = out2Prerelease(p, pOp); + pOut->u.i = iMeta; + break; +} + +/* Opcode: SetCookie P1 P2 P3 * P5 +** +** Write the integer value P3 into cookie number P2 of database P1. +** P2==1 is the schema version. P2==2 is the database format. +** P2==3 is the recommended pager cache +** size, and so forth. P1==0 is the main database file and P1==1 is the +** database file used to store temporary tables. +** +** A transaction must be started before executing this opcode. +** +** If P2 is the SCHEMA_VERSION cookie (cookie number 1) then the internal +** schema version is set to P3-P5. The "PRAGMA schema_version=N" statement +** has P5 set to 1, so that the internal schema version will be different +** from the database schema version, resulting in a schema reset. +*/ +case OP_SetCookie: { + Db *pDb; + + sqlite3VdbeIncrWriteCounter(p, 0); + assert( pOp->p2p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pDb = &db->aDb[pOp->p1]; + assert( pDb->pBt!=0 ); + assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); + /* See note about index shifting on OP_ReadCookie */ + rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); + if( pOp->p2==BTREE_SCHEMA_VERSION ){ + /* When the schema cookie changes, record the new cookie internally */ + *(u32*)&pDb->pSchema->schema_cookie = *(u32*)&pOp->p3 - pOp->p5; + db->mDbFlags |= DBFLAG_SchemaChange; + sqlite3FkClearTriggerCache(db, pOp->p1); + }else if( pOp->p2==BTREE_FILE_FORMAT ){ + /* Record changes in the file format */ + pDb->pSchema->file_format = pOp->p3; + } + if( pOp->p1==1 ){ + /* Invalidate all prepared statements whenever the TEMP database + ** schema is changed. Ticket #1644 */ + sqlite3ExpirePreparedStatements(db, 0); + p->expired = 0; + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: OpenRead P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** Open a read-only cursor for the database table whose root page is +** P2 in a database file. The database file is determined by P3. +** P3==0 means the main database, P3==1 means the database used for +** temporary tables, and P3>1 means used the corresponding attached +** database. Give the new cursor an identifier of P1. The P1 +** values need not be contiguous but all P1 values should be small integers. +** It is an error for P1 to be negative. +** +** Allowed P5 bits: +**
          +**
        • 0x02 OPFLAG_SEEKEQ: This cursor will only be used for +** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT +** of OP_SeekLE/OP_IdxLT) +**
        +** +** The P4 value may be either an integer (P4_INT32) or a pointer to +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** object, then table being opened must be an [index b-tree] where the +** KeyInfo object defines the content and collating +** sequence of that index b-tree. Otherwise, if P4 is an integer +** value, then the table being opened must be a [table b-tree] with a +** number of columns no less than the value of P4. +** +** See also: OpenWrite, ReopenIdx +*/ +/* Opcode: ReopenIdx P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** The ReopenIdx opcode works like OP_OpenRead except that it first +** checks to see if the cursor on P1 is already open on the same +** b-tree and if it is this opcode becomes a no-op. In other words, +** if the cursor is already open, do not reopen it. +** +** The ReopenIdx opcode may only be used with P5==0 or P5==OPFLAG_SEEKEQ +** and with P4 being a P4_KEYINFO object. Furthermore, the P3 value must +** be the same as every other ReopenIdx or OpenRead for the same cursor +** number. +** +** Allowed P5 bits: +**
          +**
        • 0x02 OPFLAG_SEEKEQ: This cursor will only be used for +** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT +** of OP_SeekLE/OP_IdxLT) +**
        +** +** See also: OP_OpenRead, OP_OpenWrite +*/ +/* Opcode: OpenWrite P1 P2 P3 P4 P5 +** Synopsis: root=P2 iDb=P3 +** +** Open a read/write cursor named P1 on the table or index whose root +** page is P2 (or whose root page is held in register P2 if the +** OPFLAG_P2ISREG bit is set in P5 - see below). +** +** The P4 value may be either an integer (P4_INT32) or a pointer to +** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo +** object, then table being opened must be an [index b-tree] where the +** KeyInfo object defines the content and collating +** sequence of that index b-tree. Otherwise, if P4 is an integer +** value, then the table being opened must be a [table b-tree] with a +** number of columns no less than the value of P4. +** +** Allowed P5 bits: +**
          +**
        • 0x02 OPFLAG_SEEKEQ: This cursor will only be used for +** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT +** of OP_SeekLE/OP_IdxLT) +**
        • 0x08 OPFLAG_FORDELETE: This cursor is used only to seek +** and subsequently delete entries in an index btree. This is a +** hint to the storage engine that the storage engine is allowed to +** ignore. The hint is not used by the official SQLite b*tree storage +** engine, but is used by COMDB2. +**
        • 0x10 OPFLAG_P2ISREG: Use the content of register P2 +** as the root page, not the value of P2 itself. +**
        +** +** This instruction works like OpenRead except that it opens the cursor +** in read/write mode. +** +** See also: OP_OpenRead, OP_ReopenIdx +*/ +case OP_ReopenIdx: { + int nField; + KeyInfo *pKeyInfo; + u32 p2; + int iDb; + int wrFlag; + Btree *pX; + VdbeCursor *pCur; + Db *pDb; + + assert( pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( pOp->p4type==P4_KEYINFO ); + pCur = p->apCsr[pOp->p1]; + if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){ + assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */ + assert( pCur->eCurType==CURTYPE_BTREE ); + sqlite3BtreeClearCursor(pCur->uc.pCursor); + goto open_cursor_set_hints; + } + /* If the cursor is not currently open or is open on a different + ** index, then fall through into OP_OpenRead to force a reopen */ +case OP_OpenRead: +case OP_OpenWrite: + + assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( p->bIsReader ); + assert( pOp->opcode==OP_OpenRead || pOp->opcode==OP_ReopenIdx + || p->readOnly==0 ); + + if( p->expired==1 ){ + rc = SQLITE_ABORT_ROLLBACK; + goto abort_due_to_error; + } + + nField = 0; + pKeyInfo = 0; + p2 = (u32)pOp->p2; + iDb = pOp->p3; + assert( iDb>=0 && iDbnDb ); + assert( DbMaskTest(p->btreeMask, iDb) ); + pDb = &db->aDb[iDb]; + pX = pDb->pBt; + assert( pX!=0 ); + if( pOp->opcode==OP_OpenWrite ){ + assert( OPFLAG_FORDELETE==BTREE_FORDELETE ); + wrFlag = BTREE_WRCSR | (pOp->p5 & OPFLAG_FORDELETE); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( pDb->pSchema->file_format < p->minWriteFileFormat ){ + p->minWriteFileFormat = pDb->pSchema->file_format; + } + }else{ + wrFlag = 0; + } + if( pOp->p5 & OPFLAG_P2ISREG ){ + assert( p2>0 ); + assert( p2<=(u32)(p->nMem+1 - p->nCursor) ); + assert( pOp->opcode==OP_OpenWrite ); + pIn2 = &aMem[p2]; + assert( memIsValid(pIn2) ); + assert( (pIn2->flags & MEM_Int)!=0 ); + sqlite3VdbeMemIntegerify(pIn2); + p2 = (int)pIn2->u.i; + /* The p2 value always comes from a prior OP_CreateBtree opcode and + ** that opcode will always set the p2 value to 2 or more or else fail. + ** If there were a failure, the prepared statement would have halted + ** before reaching this instruction. */ + assert( p2>=2 ); + } + if( pOp->p4type==P4_KEYINFO ){ + pKeyInfo = pOp->p4.pKeyInfo; + assert( pKeyInfo->enc==ENC(db) ); + assert( pKeyInfo->db==db ); + nField = pKeyInfo->nAllField; + }else if( pOp->p4type==P4_INT32 ){ + nField = pOp->p4.i; + } + assert( pOp->p1>=0 ); + assert( nField>=0 ); + testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ + pCur = allocateCursor(p, pOp->p1, nField, CURTYPE_BTREE); + if( pCur==0 ) goto no_mem; + pCur->iDb = iDb; + pCur->nullRow = 1; + pCur->isOrdered = 1; + pCur->pgnoRoot = p2; +#ifdef SQLITE_DEBUG + pCur->wrFlag = wrFlag; +#endif + rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->uc.pCursor); + pCur->pKeyInfo = pKeyInfo; + /* Set the VdbeCursor.isTable variable. Previous versions of + ** SQLite used to check if the root-page flags were sane at this point + ** and report database corruption if they were not, but this check has + ** since moved into the btree layer. */ + pCur->isTable = pOp->p4type!=P4_KEYINFO; + +open_cursor_set_hints: + assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); + assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); + testcase( pOp->p5 & OPFLAG_BULKCSR ); + testcase( pOp->p2 & OPFLAG_SEEKEQ ); + sqlite3BtreeCursorHintFlags(pCur->uc.pCursor, + (pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ))); + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: OpenDup P1 P2 * * * +** +** Open a new cursor P1 that points to the same ephemeral table as +** cursor P2. The P2 cursor must have been opened by a prior OP_OpenEphemeral +** opcode. Only ephemeral cursors may be duplicated. +** +** Duplicate ephemeral cursors are used for self-joins of materialized views. +*/ +case OP_OpenDup: { + VdbeCursor *pOrig; /* The original cursor to be duplicated */ + VdbeCursor *pCx; /* The new cursor */ + + pOrig = p->apCsr[pOp->p2]; + assert( pOrig ); + assert( pOrig->isEphemeral ); /* Only ephemeral cursors can be duplicated */ + + pCx = allocateCursor(p, pOp->p1, pOrig->nField, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + pCx->pKeyInfo = pOrig->pKeyInfo; + pCx->isTable = pOrig->isTable; + pCx->pgnoRoot = pOrig->pgnoRoot; + pCx->isOrdered = pOrig->isOrdered; + pCx->ub.pBtx = pOrig->ub.pBtx; + pCx->noReuse = 1; + pOrig->noReuse = 1; + rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pCx->pKeyInfo, pCx->uc.pCursor); + /* The sqlite3BtreeCursor() routine can only fail for the first cursor + ** opened for a database. Since there is already an open cursor when this + ** opcode is run, the sqlite3BtreeCursor() cannot fail */ + assert( rc==SQLITE_OK ); + break; +} + + +/* Opcode: OpenEphemeral P1 P2 P3 P4 P5 +** Synopsis: nColumn=P2 +** +** Open a new cursor P1 to a transient table. +** The cursor is always opened read/write even if +** the main database is read-only. The ephemeral +** table is deleted automatically when the cursor is closed. +** +** If the cursor P1 is already opened on an ephemeral table, the table +** is cleared (all content is erased). +** +** P2 is the number of columns in the ephemeral table. +** The cursor points to a BTree table if P4==0 and to a BTree index +** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure +** that defines the format of keys in the index. +** +** The P5 parameter can be a mask of the BTREE_* flags defined +** in btree.h. These flags control aspects of the operation of +** the btree. The BTREE_OMIT_JOURNAL and BTREE_SINGLE flags are +** added automatically. +** +** If P3 is positive, then reg[P3] is modified slightly so that it +** can be used as zero-length data for OP_Insert. This is an optimization +** that avoids an extra OP_Blob opcode to initialize that register. +*/ +/* Opcode: OpenAutoindex P1 P2 * P4 * +** Synopsis: nColumn=P2 +** +** This opcode works the same as OP_OpenEphemeral. It has a +** different name to distinguish its use. Tables created using +** by this opcode will be used for automatically created transient +** indices in joins. +*/ +case OP_OpenAutoindex: +case OP_OpenEphemeral: { + VdbeCursor *pCx; + KeyInfo *pKeyInfo; + + static const int vfsFlags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TRANSIENT_DB; + assert( pOp->p1>=0 ); + assert( pOp->p2>=0 ); + if( pOp->p3>0 ){ + /* Make register reg[P3] into a value that can be used as the data + ** form sqlite3BtreeInsert() where the length of the data is zero. */ + assert( pOp->p2==0 ); /* Only used when number of columns is zero */ + assert( pOp->opcode==OP_OpenEphemeral ); + assert( aMem[pOp->p3].flags & MEM_Null ); + aMem[pOp->p3].n = 0; + aMem[pOp->p3].z = ""; + } + pCx = p->apCsr[pOp->p1]; + if( pCx && !pCx->noReuse && ALWAYS(pOp->p2<=pCx->nField) ){ + /* If the ephermeral table is already open and has no duplicates from + ** OP_OpenDup, then erase all existing content so that the table is + ** empty again, rather than creating a new table. */ + assert( pCx->isEphemeral ); + pCx->seqCount = 0; + pCx->cacheStatus = CACHE_STALE; + rc = sqlite3BtreeClearTable(pCx->ub.pBtx, pCx->pgnoRoot, 0); + }else{ + pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->ub.pBtx, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, + vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->ub.pBtx, 1, 0); + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->ub.pBtx, &pCx->pgnoRoot, + BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pCx->pgnoRoot==SCHEMA_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + pCx->pgnoRoot = SCHEMA_ROOT; + rc = sqlite3BtreeCursor(pCx->ub.pBtx, SCHEMA_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; + } + } + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); + if( rc ){ + sqlite3BtreeClose(pCx->ub.pBtx); + } + } + } + if( rc ) goto abort_due_to_error; + pCx->nullRow = 1; + break; +} + +/* Opcode: SorterOpen P1 P2 P3 P4 * +** +** This opcode works like OP_OpenEphemeral except that it opens +** a transient index that is specifically designed to sort large +** tables using an external merge-sort algorithm. +** +** If argument P3 is non-zero, then it indicates that the sorter may +** assume that a stable sort considering the first P3 fields of each +** key is sufficient to produce the required results. +*/ +case OP_SorterOpen: { + VdbeCursor *pCx; + + assert( pOp->p1>=0 ); + assert( pOp->p2>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_SORTER); + if( pCx==0 ) goto no_mem; + pCx->pKeyInfo = pOp->p4.pKeyInfo; + assert( pCx->pKeyInfo->db==db ); + assert( pCx->pKeyInfo->enc==ENC(db) ); + rc = sqlite3VdbeSorterInit(db, pOp->p3, pCx); + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: SequenceTest P1 P2 * * * +** Synopsis: if( cursor[P1].ctr++ ) pc = P2 +** +** P1 is a sorter cursor. If the sequence counter is currently zero, jump +** to P2. Regardless of whether or not the jump is taken, increment the +** the sequence value. +*/ +case OP_SequenceTest: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + if( (pC->seqCount++)==0 ){ + goto jump_to_p2; + } + break; +} + +/* Opcode: OpenPseudo P1 P2 P3 * * +** Synopsis: P3 columns in r[P2] +** +** Open a new cursor that points to a fake table that contains a single +** row of data. The content of that one row is the content of memory +** register P2. In other words, cursor P1 becomes an alias for the +** MEM_Blob content contained in register P2. +** +** A pseudo-table created by this opcode is used to hold a single +** row output from the sorter so that the row can be decomposed into +** individual columns using the OP_Column opcode. The OP_Column opcode +** is the only cursor opcode that works with a pseudo-table. +** +** P3 is the number of fields in the records that will be stored by +** the pseudo-table. +*/ +case OP_OpenPseudo: { + VdbeCursor *pCx; + + assert( pOp->p1>=0 ); + assert( pOp->p3>=0 ); + pCx = allocateCursor(p, pOp->p1, pOp->p3, CURTYPE_PSEUDO); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->seekResult = pOp->p2; + pCx->isTable = 1; + /* Give this pseudo-cursor a fake BtCursor pointer so that pCx + ** can be safely passed to sqlite3VdbeCursorMoveto(). This avoids a test + ** for pCx->eCurType==CURTYPE_BTREE inside of sqlite3VdbeCursorMoveto() + ** which is a performance optimization */ + pCx->uc.pCursor = sqlite3BtreeFakeValidCursor(); + assert( pOp->p5==0 ); + break; +} + +/* Opcode: Close P1 * * * * +** +** Close a cursor previously opened as P1. If P1 is not +** currently open, this instruction is a no-op. +*/ +case OP_Close: { + assert( pOp->p1>=0 && pOp->p1nCursor ); + sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]); + p->apCsr[pOp->p1] = 0; + break; +} + +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK +/* Opcode: ColumnsUsed P1 * * P4 * +** +** This opcode (which only exists if SQLite was compiled with +** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the +** table or index for cursor P1 are used. P4 is a 64-bit integer +** (P4_INT64) in which the first 63 bits are one for each of the +** first 63 columns of the table or index that are actually used +** by the cursor. The high-order bit is set if any column after +** the 64th is used. +*/ +case OP_ColumnsUsed: { + VdbeCursor *pC; + pC = p->apCsr[pOp->p1]; + assert( pC->eCurType==CURTYPE_BTREE ); + pC->maskUsed = *(u64*)pOp->p4.pI64; + break; +} +#endif + +/* Opcode: SeekGE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as the key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than or equal to the key value. If there are no records +** greater than or equal to the key and P2 is not zero, then jump to P2. +** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will either land on a record that exactly matches the key, or +** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ, +** this opcode must be followed by an IdxLE opcode with the same arguments. +** The IdxGT opcode will be skipped if this opcode succeeds, but the +** IdxGT opcode will be used on subsequent loop iterations. The +** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this +** is an equality search. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +** +** See also: Found, NotFound, SeekLt, SeekGt, SeekLe +*/ +/* Opcode: SeekGT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the smallest entry that +** is greater than the key value. If there are no records greater than +** the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +** +** See also: Found, NotFound, SeekLt, SeekGe, SeekLe +*/ +/* Opcode: SeekLT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the largest entry that +** is less than the key value. If there are no records less than +** the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +** +** See also: Found, NotFound, SeekGt, SeekGe, SeekLe +*/ +/* Opcode: SeekLE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), +** use the value in register P3 as a key. If cursor P1 refers +** to an SQL index, then P3 is the first in an array of P4 registers +** that are used as an unpacked index key. +** +** Reposition cursor P1 so that it points to the largest entry that +** is less than or equal to the key value. If there are no records +** less than or equal to the key and P2 is not zero, then jump to P2. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will either land on a record that exactly matches the key, or +** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ, +** this opcode must be followed by an IdxLE opcode with the same arguments. +** The IdxGE opcode will be skipped if this opcode succeeds, but the +** IdxGE opcode will be used on subsequent loop iterations. The +** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this +** is an equality search. +** +** See also: Found, NotFound, SeekGt, SeekGe, SeekLt +*/ +case OP_SeekLT: /* jump, in3, group */ +case OP_SeekLE: /* jump, in3, group */ +case OP_SeekGE: /* jump, in3, group */ +case OP_SeekGT: { /* jump, in3, group */ + int res; /* Comparison result */ + int oc; /* Opcode */ + VdbeCursor *pC; /* The cursor to seek */ + UnpackedRecord r; /* The key to seek for */ + int nField; /* Number of columns or fields in the key */ + i64 iKey; /* The rowid we are to seek to */ + int eqOnly; /* Only interested in == results */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p2!=0 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( OP_SeekLE == OP_SeekLT+1 ); + assert( OP_SeekGE == OP_SeekLT+2 ); + assert( OP_SeekGT == OP_SeekLT+3 ); + assert( pC->isOrdered ); + assert( pC->uc.pCursor!=0 ); + oc = pOp->opcode; + eqOnly = 0; + pC->nullRow = 0; +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( pC->isTable ){ + u16 flags3, newType; + /* The OPFLAG_SEEKEQ/BTREE_SEEK_EQ flag is only set on index cursors */ + assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 + || CORRUPT_DB ); + + /* The input value in P3 might be of any type: integer, real, string, + ** blob, or NULL. But it needs to be an integer before we can do + ** the seek, so convert it. */ + pIn3 = &aMem[pOp->p3]; + flags3 = pIn3->flags; + if( (flags3 & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3, 0); + } + iKey = sqlite3VdbeIntValue(pIn3); /* Get the integer key value */ + newType = pIn3->flags; /* Record the type after applying numeric affinity */ + pIn3->flags = flags3; /* But convert the type back to its original */ + + /* If the P3 value could not be converted into an integer without + ** loss of information, then special processing is required... */ + if( (newType & (MEM_Int|MEM_IntReal))==0 ){ + int c; + if( (newType & MEM_Real)==0 ){ + if( (newType & MEM_Null) || oc>=OP_SeekGE ){ + VdbeBranchTaken(1,2); + goto jump_to_p2; + }else{ + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + goto seek_not_found; + } + } + c = sqlite3IntFloatCompare(iKey, pIn3->u.r); + + /* If the approximation iKey is larger than the actual real search + ** term, substitute >= for > and < for <=. e.g. if the search term + ** is 4.9 and the integer approximation 5: + ** + ** (x > 4.9) -> (x >= 5) + ** (x <= 4.9) -> (x < 5) + */ + if( c>0 ){ + assert( OP_SeekGE==(OP_SeekGT-1) ); + assert( OP_SeekLT==(OP_SeekLE-1) ); + assert( (OP_SeekLE & 0x0001)==(OP_SeekGT & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekGT & 0x0001) ) oc--; + } + + /* If the approximation iKey is smaller than the actual real search + ** term, substitute <= for < and > for >=. */ + else if( c<0 ){ + assert( OP_SeekLE==(OP_SeekLT+1) ); + assert( OP_SeekGT==(OP_SeekGE+1) ); + assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) ); + if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; + } + } + rc = sqlite3BtreeTableMoveto(pC->uc.pCursor, (u64)iKey, 0, &res); + pC->movetoTarget = iKey; /* Used by OP_Delete */ + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + }else{ + /* For a cursor with the OPFLAG_SEEKEQ/BTREE_SEEK_EQ hint, only the + ** OP_SeekGE and OP_SeekLE opcodes are allowed, and these must be + ** immediately followed by an OP_IdxGT or OP_IdxLT opcode, respectively, + ** with the same key. + */ + if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){ + eqOnly = 1; + assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE ); + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + assert( pOp->opcode==OP_SeekGE || pOp[1].opcode==OP_IdxLT ); + assert( pOp->opcode==OP_SeekLE || pOp[1].opcode==OP_IdxGT ); + assert( pOp[1].p1==pOp[0].p1 ); + assert( pOp[1].p2==pOp[0].p2 ); + assert( pOp[1].p3==pOp[0].p3 ); + assert( pOp[1].p4.i==pOp[0].p4.i ); + } + + nField = pOp->p4.i; + assert( pOp->p4type==P4_INT32 ); + assert( nField>0 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)nField; + + /* The next line of code computes as follows, only faster: + ** if( oc==OP_SeekGT || oc==OP_SeekLE ){ + ** r.default_rc = -1; + ** }else{ + ** r.default_rc = +1; + ** } + */ + r.default_rc = ((1 & (oc - OP_SeekLT)) ? -1 : +1); + assert( oc!=OP_SeekGT || r.default_rc==-1 ); + assert( oc!=OP_SeekLE || r.default_rc==-1 ); + assert( oc!=OP_SeekGE || r.default_rc==+1 ); + assert( oc!=OP_SeekLT || r.default_rc==+1 ); + + r.aMem = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + { int i; for(i=0; iuc.pCursor, &r, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( eqOnly && r.eqSeen==0 ){ + assert( res!=0 ); + goto seek_not_found; + } + } +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + if( oc>=OP_SeekGE ){ assert( oc==OP_SeekGE || oc==OP_SeekGT ); + if( res<0 || (res==0 && oc==OP_SeekGT) ){ + res = 0; + rc = sqlite3BtreeNext(pC->uc.pCursor, 0); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + res = 1; + }else{ + goto abort_due_to_error; + } + } + }else{ + res = 0; + } + }else{ + assert( oc==OP_SeekLT || oc==OP_SeekLE ); + if( res>0 || (res==0 && oc==OP_SeekLT) ){ + res = 0; + rc = sqlite3BtreePrevious(pC->uc.pCursor, 0); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + res = 1; + }else{ + goto abort_due_to_error; + } + } + }else{ + /* res might be negative because the table is empty. Check to + ** see if this is the case. + */ + res = sqlite3BtreeEof(pC->uc.pCursor); + } + } +seek_not_found: + assert( pOp->p2>0 ); + VdbeBranchTaken(res!=0,2); + if( res ){ + goto jump_to_p2; + }else if( eqOnly ){ + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + pOp++; /* Skip the OP_IdxLt or OP_IdxGT that follows */ + } + break; +} + + +/* Opcode: SeekScan P1 P2 * * * +** Synopsis: Scan-ahead up to P1 rows +** +** This opcode is a prefix opcode to OP_SeekGE. In other words, this +** opcode must be immediately followed by OP_SeekGE. This constraint is +** checked by assert() statements. +** +** This opcode uses the P1 through P4 operands of the subsequent +** OP_SeekGE. In the text that follows, the operands of the subsequent +** OP_SeekGE opcode are denoted as SeekOP.P1 through SeekOP.P4. Only +** the P1 and P2 operands of this opcode are also used, and are called +** This.P1 and This.P2. +** +** This opcode helps to optimize IN operators on a multi-column index +** where the IN operator is on the later terms of the index by avoiding +** unnecessary seeks on the btree, substituting steps to the next row +** of the b-tree instead. A correct answer is obtained if this opcode +** is omitted or is a no-op. +** +** The SeekGE.P3 and SeekGE.P4 operands identify an unpacked key which +** is the desired entry that we want the cursor SeekGE.P1 to be pointing +** to. Call this SeekGE.P4/P5 row the "target". +** +** If the SeekGE.P1 cursor is not currently pointing to a valid row, +** then this opcode is a no-op and control passes through into the OP_SeekGE. +** +** If the SeekGE.P1 cursor is pointing to a valid row, then that row +** might be the target row, or it might be near and slightly before the +** target row. This opcode attempts to position the cursor on the target +** row by, perhaps by invoking sqlite3BtreeStep() on the cursor +** between 0 and This.P1 times. +** +** There are three possible outcomes from this opcode:
          +** +**
        1. If after This.P1 steps, the cursor is still pointing to a place that +** is earlier in the btree than the target row, then fall through +** into the subsquence OP_SeekGE opcode. +** +**
        2. If the cursor is successfully moved to the target row by 0 or more +** sqlite3BtreeNext() calls, then jump to This.P2, which will land just +** past the OP_IdxGT or OP_IdxGE opcode that follows the OP_SeekGE. +** +**
        3. If the cursor ends up past the target row (indicating the the target +** row does not exist in the btree) then jump to SeekOP.P2. +**
        +*/ +case OP_SeekScan: { + VdbeCursor *pC; + int res; + int nStep; + UnpackedRecord r; + + assert( pOp[1].opcode==OP_SeekGE ); + + /* pOp->p2 points to the first instruction past the OP_IdxGT that + ** follows the OP_SeekGE. */ + assert( pOp->p2>=(int)(pOp-aOp)+2 ); + assert( aOp[pOp->p2-1].opcode==OP_IdxGT || aOp[pOp->p2-1].opcode==OP_IdxGE ); + testcase( aOp[pOp->p2-1].opcode==OP_IdxGE ); + assert( pOp[1].p1==aOp[pOp->p2-1].p1 ); + assert( pOp[1].p2==aOp[pOp->p2-1].p2 ); + assert( pOp[1].p3==aOp[pOp->p2-1].p3 ); + + assert( pOp->p1>0 ); + pC = p->apCsr[pOp[1].p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( !pC->isTable ); + if( !sqlite3BtreeCursorIsValidNN(pC->uc.pCursor) ){ +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("... cursor not valid - fall through\n"); + } +#endif + break; + } + nStep = pOp->p1; + assert( nStep>=1 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp[1].p4.i; + r.default_rc = 0; + r.aMem = &aMem[pOp[1].p3]; +#ifdef SQLITE_DEBUG + { + int i; + for(i=0; i0 ){ + seekscan_search_fail: +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("... %d steps and then skip\n", pOp->p1 - nStep); + } +#endif + VdbeBranchTaken(1,3); + pOp++; + goto jump_to_p2; + } + if( res==0 ){ +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("... %d steps and then success\n", pOp->p1 - nStep); + } +#endif + VdbeBranchTaken(2,3); + goto jump_to_p2; + break; + } + if( nStep<=0 ){ +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("... fall through after %d steps\n", pOp->p1); + } +#endif + VdbeBranchTaken(0,3); + break; + } + nStep--; + rc = sqlite3BtreeNext(pC->uc.pCursor, 0); + if( rc ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + goto seekscan_search_fail; + }else{ + goto abort_due_to_error; + } + } + } + + break; +} + + +/* Opcode: SeekHit P1 P2 P3 * * +** Synopsis: set P2<=seekHit<=P3 +** +** Increase or decrease the seekHit value for cursor P1, if necessary, +** so that it is no less than P2 and no greater than P3. +** +** The seekHit integer represents the maximum of terms in an index for which +** there is known to be at least one match. If the seekHit value is smaller +** than the total number of equality terms in an index lookup, then the +** OP_IfNoHope opcode might run to see if the IN loop can be abandoned +** early, thus saving work. This is part of the IN-early-out optimization. +** +** P1 must be a valid b-tree cursor. +*/ +case OP_SeekHit: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pOp->p3>=pOp->p2 ); + if( pC->seekHitp2 ){ +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("seekHit changes from %d to %d\n", pC->seekHit, pOp->p2); + } +#endif + pC->seekHit = pOp->p2; + }else if( pC->seekHit>pOp->p3 ){ +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("seekHit changes from %d to %d\n", pC->seekHit, pOp->p3); + } +#endif + pC->seekHit = pOp->p3; + } + break; +} + +/* Opcode: IfNotOpen P1 P2 * * * +** Synopsis: if( !csr[P1] ) goto P2 +** +** If cursor P1 is not open, jump to instruction P2. Otherwise, fall through. +*/ +case OP_IfNotOpen: { /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + VdbeBranchTaken(p->apCsr[pOp->p1]==0, 2); + if( !p->apCsr[pOp->p1] ){ + goto jump_to_p2_and_check_for_interrupt; + } + break; +} + +/* Opcode: Found P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** is a prefix of any entry in P1 then a jump is made to P2 and +** P1 is left pointing at the matching entry. +** +** This operation leaves the cursor in a state where it can be +** advanced in the forward direction. The Next instruction will work, +** but not the Prev instruction. +** +** See also: NotFound, NoConflict, NotExists. SeekGe +*/ +/* Opcode: NotFound P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** is not the prefix of any entry in P1 then a jump is made to P2. If P1 +** does contain an entry whose prefix matches the P3/P4 record then control +** falls through to the next instruction and P1 is left pointing at the +** matching entry. +** +** This operation leaves the cursor in a state where it cannot be +** advanced in either direction. In other words, the Next and Prev +** opcodes do not work after this operation. +** +** See also: Found, NotExists, NoConflict, IfNoHope +*/ +/* Opcode: IfNoHope P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** Register P3 is the first of P4 registers that form an unpacked +** record. Cursor P1 is an index btree. P2 is a jump destination. +** In other words, the operands to this opcode are the same as the +** operands to OP_NotFound and OP_IdxGT. +** +** This opcode is an optimization attempt only. If this opcode always +** falls through, the correct answer is still obtained, but extra works +** is performed. +** +** A value of N in the seekHit flag of cursor P1 means that there exists +** a key P3:N that will match some record in the index. We want to know +** if it is possible for a record P3:P4 to match some record in the +** index. If it is not possible, we can skips some work. So if seekHit +** is less than P4, attempt to find out if a match is possible by running +** OP_NotFound. +** +** This opcode is used in IN clause processing for a multi-column key. +** If an IN clause is attached to an element of the key other than the +** left-most element, and if there are no matches on the most recent +** seek over the whole key, then it might be that one of the key element +** to the left is prohibiting a match, and hence there is "no hope" of +** any match regardless of how many IN clause elements are checked. +** In such a case, we abandon the IN clause search early, using this +** opcode. The opcode name comes from the fact that the +** jump is taken if there is "no hope" of achieving a match. +** +** See also: NotFound, SeekHit +*/ +/* Opcode: NoConflict P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** If P4==0 then register P3 holds a blob constructed by MakeRecord. If +** P4>0 then register P3 is the first of P4 registers that form an unpacked +** record. +** +** Cursor P1 is on an index btree. If the record identified by P3 and P4 +** contains any NULL value, jump immediately to P2. If all terms of the +** record are not-NULL then a check is done to determine if any row in the +** P1 index btree has a matching key prefix. If there are no matches, jump +** immediately to P2. If there is a match, fall through and leave the P1 +** cursor pointing to the matching row. +** +** This opcode is similar to OP_NotFound with the exceptions that the +** branch is always taken if any part of the search key input is NULL. +** +** This operation leaves the cursor in a state where it cannot be +** advanced in either direction. In other words, the Next and Prev +** opcodes do not work after this operation. +** +** See also: NotFound, Found, NotExists +*/ +case OP_IfNoHope: { /* jump, in3 */ + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + printf("seekHit is %d\n", pC->seekHit); + } +#endif + if( pC->seekHit>=pOp->p4.i ) break; + /* Fall through into OP_NotFound */ + /* no break */ deliberate_fall_through +} +case OP_NoConflict: /* jump, in3 */ +case OP_NotFound: /* jump, in3 */ +case OP_Found: { /* jump, in3 */ + int alreadyExists; + int ii; + VdbeCursor *pC; + UnpackedRecord *pIdxKey; + UnpackedRecord r; + +#ifdef SQLITE_TEST + if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; +#endif + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_INT32 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + r.aMem = &aMem[pOp->p3]; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable==0 ); + r.nField = (u16)pOp->p4.i; + if( r.nField>0 ){ + /* Key values in an array of registers */ + r.pKeyInfo = pC->pKeyInfo; + r.default_rc = 0; +#ifdef SQLITE_DEBUG + for(ii=0; iip3+ii, &r.aMem[ii]); + } +#endif + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &pC->seekResult); + }else{ + /* Composite key generated by OP_MakeRecord */ + assert( r.aMem->flags & MEM_Blob ); + assert( pOp->opcode!=OP_NoConflict ); + rc = ExpandBlob(r.aMem); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc ) goto no_mem; + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); + if( pIdxKey==0 ) goto no_mem; + sqlite3VdbeRecordUnpack(pC->pKeyInfo, r.aMem->n, r.aMem->z, pIdxKey); + pIdxKey->default_rc = 0; + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &pC->seekResult); + sqlite3DbFreeNN(db, pIdxKey); + } + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + alreadyExists = (pC->seekResult==0); + pC->nullRow = 1-alreadyExists; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( pOp->opcode==OP_Found ){ + VdbeBranchTaken(alreadyExists!=0,2); + if( alreadyExists ) goto jump_to_p2; + }else{ + if( !alreadyExists ){ + VdbeBranchTaken(1,2); + goto jump_to_p2; + } + if( pOp->opcode==OP_NoConflict ){ + /* For the OP_NoConflict opcode, take the jump if any of the + ** input fields are NULL, since any key with a NULL will not + ** conflict */ + for(ii=0; iiopcode==OP_IfNoHope ){ + pC->seekHit = pOp->p4.i; + } + } + break; +} + +/* Opcode: SeekRowid P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). If register P3 does not contain an integer or if P1 does not +** contain a record with rowid P3 then jump immediately to P2. +** Or, if P2 is 0, raise an SQLITE_CORRUPT error. If P1 does contain +** a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_NotExists opcode performs the same operation, but with OP_NotExists +** the P3 register must be guaranteed to contain an integer value. With this +** opcode, register P3 might not contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +/* Opcode: NotExists P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). P3 is an integer rowid. If P1 does not contain a record with +** rowid P3 then jump immediately to P2. Or, if P2 is 0, raise an +** SQLITE_CORRUPT error. If P1 does contain a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_SeekRowid opcode performs the same operation but also allows the +** P3 register to contain a non-integer value, in which case the jump is +** always taken. This opcode requires that P3 always contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +case OP_SeekRowid: { /* jump, in3 */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + u64 iKey; + + pIn3 = &aMem[pOp->p3]; + testcase( pIn3->flags & MEM_Int ); + testcase( pIn3->flags & MEM_IntReal ); + testcase( pIn3->flags & MEM_Real ); + testcase( (pIn3->flags & (MEM_Str|MEM_Int))==MEM_Str ); + if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ + /* If pIn3->u.i does not contain an integer, compute iKey as the + ** integer value of pIn3. Jump to P2 if pIn3 cannot be converted + ** into an integer without loss of information. Take care to avoid + ** changing the datatype of pIn3, however, as it is used by other + ** parts of the prepared statement. */ + Mem x = pIn3[0]; + applyAffinity(&x, SQLITE_AFF_NUMERIC, encoding); + if( (x.flags & MEM_Int)==0 ) goto jump_to_p2; + iKey = x.u.i; + goto notExistsWithKey; + } + /* Fall through into OP_NotExists */ + /* no break */ deliberate_fall_through +case OP_NotExists: /* jump, in3 */ + pIn3 = &aMem[pOp->p3]; + assert( (pIn3->flags & MEM_Int)!=0 || pOp->opcode==OP_SeekRowid ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + iKey = pIn3->u.i; +notExistsWithKey: + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); +#ifdef SQLITE_DEBUG + if( pOp->opcode==OP_SeekRowid ) pC->seekOp = OP_SeekRowid; +#endif + assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr!=0 ); + res = 0; + rc = sqlite3BtreeTableMoveto(pCrsr, iKey, 0, &res); + assert( rc==SQLITE_OK || res==0 ); + pC->movetoTarget = iKey; /* Used by OP_Delete */ + pC->nullRow = 0; + pC->cacheStatus = CACHE_STALE; + pC->deferredMoveto = 0; + VdbeBranchTaken(res!=0,2); + pC->seekResult = res; + if( res!=0 ){ + assert( rc==SQLITE_OK ); + if( pOp->p2==0 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + goto jump_to_p2; + } + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: Sequence P1 P2 * * * +** Synopsis: r[P2]=cursor[P1].ctr++ +** +** Find the next available sequence number for cursor P1. +** Write the sequence number into register P2. +** The sequence number on the cursor is incremented after this +** instruction. +*/ +case OP_Sequence: { /* out2 */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( p->apCsr[pOp->p1]!=0 ); + assert( p->apCsr[pOp->p1]->eCurType!=CURTYPE_VTAB ); + pOut = out2Prerelease(p, pOp); + pOut->u.i = p->apCsr[pOp->p1]->seqCount++; + break; +} + + +/* Opcode: NewRowid P1 P2 P3 * * +** Synopsis: r[P2]=rowid +** +** Get a new integer record number (a.k.a "rowid") used as the key to a table. +** The record number is not previously used as a key in the database +** table that cursor P1 points to. The new record number is written +** written to register P2. +** +** If P3>0 then P3 is a register in the root frame of this VDBE that holds +** the largest previously generated record number. No new record numbers are +** allowed to be less than this value. When this value reaches its maximum, +** an SQLITE_FULL error is generated. The P3 register is updated with the ' +** generated record number. This P3 mechanism is used to help implement the +** AUTOINCREMENT feature. +*/ +case OP_NewRowid: { /* out2 */ + i64 v; /* The new rowid */ + VdbeCursor *pC; /* Cursor of table to get the new rowid */ + int res; /* Result of an sqlite3BtreeLast() */ + int cnt; /* Counter to limit the number of searches */ +#ifndef SQLITE_OMIT_AUTOINCREMENT + Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ + VdbeFrame *pFrame; /* Root frame of VDBE */ +#endif + + v = 0; + res = 0; + pOut = out2Prerelease(p, pOp); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + { + /* The next rowid or record number (different terms for the same + ** thing) is obtained in a two-step algorithm. + ** + ** First we attempt to find the largest existing rowid and add one + ** to that. But if the largest existing rowid is already the maximum + ** positive integer, we have to fall through to the second + ** probabilistic algorithm + ** + ** The second algorithm is to select a rowid at random and see if + ** it already exists in the table. If it does not exist, we have + ** succeeded. If the random rowid does exist, we select a new one + ** and try again, up to 100 times. + */ + assert( pC->isTable ); + +#ifdef SQLITE_32BIT_ROWID +# define MAX_ROWID 0x7fffffff +#else + /* Some compilers complain about constants of the form 0x7fffffffffffffff. + ** Others complain about 0x7ffffffffffffffffLL. The following macro seems + ** to provide the constant while making all compilers happy. + */ +# define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff ) +#endif + + if( !pC->useRandomRowid ){ + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( res ){ + v = 1; /* IMP: R-61914-48074 */ + }else{ + assert( sqlite3BtreeCursorIsValid(pC->uc.pCursor) ); + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); + if( v>=MAX_ROWID ){ + pC->useRandomRowid = 1; + }else{ + v++; /* IMP: R-29538-34987 */ + } + } + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( pOp->p3 ){ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3>0 ); + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=pFrame->nMem ); + pMem = &pFrame->aMem[pOp->p3]; + }else{ + /* Assert that P3 is a valid memory cell. */ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pMem = &aMem[pOp->p3]; + memAboutToChange(p, pMem); + } + assert( memIsValid(pMem) ); + + REGISTER_TRACE(pOp->p3, pMem); + sqlite3VdbeMemIntegerify(pMem); + assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ + if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ + rc = SQLITE_FULL; /* IMP: R-17817-00630 */ + goto abort_due_to_error; + } + if( vu.i+1 ){ + v = pMem->u.i + 1; + } + pMem->u.i = v; + } +#endif + if( pC->useRandomRowid ){ + /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the + ** largest possible integer (9223372036854775807) then the database + ** engine starts picking positive candidate ROWIDs at random until + ** it finds one that is not previously used. */ + assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is + ** an AUTOINCREMENT table. */ + cnt = 0; + do{ + sqlite3_randomness(sizeof(v), &v); + v &= (MAX_ROWID>>1); v++; /* Ensure that v is greater than zero */ + }while( ((rc = sqlite3BtreeTableMoveto(pC->uc.pCursor, (u64)v, + 0, &res))==SQLITE_OK) + && (res==0) + && (++cnt<100)); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = SQLITE_FULL; /* IMP: R-38219-53002 */ + goto abort_due_to_error; + } + assert( v>0 ); /* EV: R-40812-03570 */ + } + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + } + pOut->u.i = v; + break; +} + +/* Opcode: Insert P1 P2 P3 P4 P5 +** Synopsis: intkey=r[P3] data=r[P2] +** +** Write an entry into the table of cursor P1. A new entry is +** created if it doesn't already exist or the data for an existing +** entry is overwritten. The data is the value MEM_Blob stored in register +** number P2. The key is stored in register P3. The key must +** be a MEM_Int. +** +** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is +** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set, +** then rowid is stored for subsequent return by the +** sqlite3_last_insert_rowid() function (otherwise it is unmodified). +** +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equal to P3. +** +** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an +** UPDATE operation. Otherwise (if the flag is clear) then this opcode +** is part of an INSERT operation. The difference is only important to +** the update hook. +** +** Parameter P4 may point to a Table structure, or may be NULL. If it is +** not NULL, then the update-hook (sqlite3.xUpdateCallback) is invoked +** following a successful insert. +** +** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically +** allocated, then ownership of P2 is transferred to the pseudo-cursor +** and register P2 becomes ephemeral. If the cursor is changed, the +** value of register P2 will then change. Make sure this does not +** cause any problems.) +** +** This instruction only works on tables. The equivalent instruction +** for indices is OP_IdxInsert. +*/ +case OP_Insert: { + Mem *pData; /* MEM cell holding data for the record to be inserted */ + Mem *pKey; /* MEM cell holding key for the record */ + VdbeCursor *pC; /* Cursor to table into which insert is written */ + int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */ + const char *zDb; /* database name - used by the update hook */ + Table *pTab; /* Table structure - used by update and pre-update hooks */ + BtreePayload x; /* Payload to be inserted */ + + pData = &aMem[pOp->p2]; + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( memIsValid(pData) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->deferredMoveto==0 ); + assert( pC->uc.pCursor!=0 ); + assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable ); + assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC ); + REGISTER_TRACE(pOp->p2, pData); + sqlite3VdbeIncrWriteCounter(p, pC); + + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; + + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) ); + }else{ + pTab = 0; + zDb = 0; + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update hook, if any */ + if( pTab ){ + if( db->xPreUpdateCallback && !(pOp->p5 & OPFLAG_ISUPDATE) ){ + sqlite3VdbePreUpdateHook(p,pC,SQLITE_INSERT,zDb,pTab,x.nKey,pOp->p2,-1); + } + if( db->xUpdateCallback==0 || pTab->aCol==0 ){ + /* Prevent post-update hook from running in cases when it should not */ + pTab = 0; + } + } + if( pOp->p5 & OPFLAG_ISNOOP ) break; +#endif + + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = x.nKey; + assert( (pData->flags & (MEM_Blob|MEM_Str))!=0 || pData->n==0 ); + x.pData = pData->z; + x.nData = pData->n; + seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0); + if( pData->flags & MEM_Zero ){ + x.nZero = pData->u.nZero; + }else{ + x.nZero = 0; + } + x.pKey = 0; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION|OPFLAG_PREFORMAT)), + seekResult + ); + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + + /* Invoke the update-hook if required. */ + if( rc ) goto abort_due_to_error; + if( pTab ){ + assert( db->xUpdateCallback!=0 ); + assert( pTab->aCol!=0 ); + db->xUpdateCallback(db->pUpdateArg, + (pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT, + zDb, pTab->zName, x.nKey); + } + break; +} + +/* Opcode: RowCell P1 P2 P3 * * +** +** P1 and P2 are both open cursors. Both must be opened on the same type +** of table - intkey or index. This opcode is used as part of copying +** the current row from P2 into P1. If the cursors are opened on intkey +** tables, register P3 contains the rowid to use with the new record in +** P1. If they are opened on index tables, P3 is not used. +** +** This opcode must be followed by either an Insert or InsertIdx opcode +** with the OPFLAG_PREFORMAT flag set to complete the insert operation. +*/ +case OP_RowCell: { + VdbeCursor *pDest; /* Cursor to write to */ + VdbeCursor *pSrc; /* Cursor to read from */ + i64 iKey; /* Rowid value to insert with */ + assert( pOp[1].opcode==OP_Insert || pOp[1].opcode==OP_IdxInsert ); + assert( pOp[1].opcode==OP_Insert || pOp->p3==0 ); + assert( pOp[1].opcode==OP_IdxInsert || pOp->p3>0 ); + assert( pOp[1].p5 & OPFLAG_PREFORMAT ); + pDest = p->apCsr[pOp->p1]; + pSrc = p->apCsr[pOp->p2]; + iKey = pOp->p3 ? aMem[pOp->p3].u.i : 0; + rc = sqlite3BtreeTransferRow(pDest->uc.pCursor, pSrc->uc.pCursor, iKey); + if( rc!=SQLITE_OK ) goto abort_due_to_error; + break; +}; + +/* Opcode: Delete P1 P2 P3 P4 P5 +** +** Delete the record at which the P1 cursor is currently pointing. +** +** If the OPFLAG_SAVEPOSITION bit of the P5 parameter is set, then +** the cursor will be left pointing at either the next or the previous +** record in the table. If it is left pointing at the next record, then +** the next Next instruction will be a no-op. As a result, in this case +** it is ok to delete a record from within a Next loop. If +** OPFLAG_SAVEPOSITION bit of P5 is clear, then the cursor will be +** left in an undefined state. +** +** If the OPFLAG_AUXDELETE bit is set on P5, that indicates that this +** delete one of several associated with deleting a table row and all its +** associated index entries. Exactly one of those deletes is the "primary" +** delete. The others are all on OPFLAG_FORDELETE cursors or else are +** marked with the AUXDELETE flag. +** +** If the OPFLAG_NCHANGE flag of P2 (NB: P2 not P5) is set, then the row +** change count is incremented (otherwise not). +** +** P1 must not be pseudo-table. It has to be a real table with +** multiple rows. +** +** If P4 is not NULL then it points to a Table object. In this case either +** the update or pre-update hook, or both, may be invoked. The P1 cursor must +** have been positioned using OP_NotFound prior to invoking this opcode in +** this case. Specifically, if one is configured, the pre-update hook is +** invoked if P4 is not NULL. The update-hook is invoked if one is configured, +** P4 is not NULL, and the OPFLAG_NCHANGE flag is set in P2. +** +** If the OPFLAG_ISUPDATE flag is set in P2, then P3 contains the address +** of the memory cell that contains the value that the rowid of the row will +** be set to by the update. +*/ +case OP_Delete: { + VdbeCursor *pC; + const char *zDb; + Table *pTab; + int opflags; + + opflags = pOp->p2; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( pC->deferredMoveto==0 ); + sqlite3VdbeIncrWriteCounter(p, pC); + +#ifdef SQLITE_DEBUG + if( pOp->p4type==P4_TABLE + && HasRowid(pOp->p4.pTab) + && pOp->p5==0 + && sqlite3BtreeCursorIsValidNN(pC->uc.pCursor) + ){ + /* If p5 is zero, the seek operation that positioned the cursor prior to + ** OP_Delete will have also set the pC->movetoTarget field to the rowid of + ** the row that is being deleted */ + i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor); + assert( CORRUPT_DB || pC->movetoTarget==iKey ); + } +#endif + + /* If the update-hook or pre-update-hook will be invoked, set zDb to + ** the name of the db to pass as to it. Also set local pTab to a copy + ** of p4.pTab. Finally, if p5 is true, indicating that this cursor was + ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set + ** VdbeCursor.movetoTarget to the current rowid. */ + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + assert( pOp->p4.pTab!=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + if( (pOp->p5 & OPFLAG_SAVEPOSITION)!=0 && pC->isTable ){ + pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + }else{ + zDb = 0; + pTab = 0; + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update-hook if required. */ + assert( db->xPreUpdateCallback==0 || pTab==pOp->p4.pTab ); + if( db->xPreUpdateCallback && pTab ){ + assert( !(opflags & OPFLAG_ISUPDATE) + || HasRowid(pTab)==0 + || (aMem[pOp->p3].flags & MEM_Int) + ); + sqlite3VdbePreUpdateHook(p, pC, + (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, + zDb, pTab, pC->movetoTarget, + pOp->p3, -1 + ); + } + if( opflags & OPFLAG_ISNOOP ) break; +#endif + + /* Only flags that can be set are SAVEPOISTION and AUXDELETE */ + assert( (pOp->p5 & ~(OPFLAG_SAVEPOSITION|OPFLAG_AUXDELETE))==0 ); + assert( OPFLAG_SAVEPOSITION==BTREE_SAVEPOSITION ); + assert( OPFLAG_AUXDELETE==BTREE_AUXDELETE ); + +#ifdef SQLITE_DEBUG + if( p->pFrame==0 ){ + if( pC->isEphemeral==0 + && (pOp->p5 & OPFLAG_AUXDELETE)==0 + && (pC->wrFlag & OPFLAG_FORDELETE)==0 + ){ + nExtraDelete++; + } + if( pOp->p2 & OPFLAG_NCHANGE ){ + nExtraDelete--; + } + } +#endif + + rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); + pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; + if( rc ) goto abort_due_to_error; + + /* Invoke the update-hook if required. */ + if( opflags & OPFLAG_NCHANGE ){ + p->nChange++; + if( db->xUpdateCallback && ALWAYS(pTab!=0) && HasRowid(pTab) ){ + db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName, + pC->movetoTarget); + assert( pC->iDb>=0 ); + } + } + + break; +} +/* Opcode: ResetCount * * * * * +** +** The value of the change counter is copied to the database handle +** change counter (returned by subsequent calls to sqlite3_changes()). +** Then the VMs internal change counter resets to 0. +** This is used by trigger programs. +*/ +case OP_ResetCount: { + sqlite3VdbeSetChanges(db, p->nChange); + p->nChange = 0; + break; +} + +/* Opcode: SorterCompare P1 P2 P3 P4 +** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2 +** +** P1 is a sorter cursor. This instruction compares a prefix of the +** record blob in register P3 against a prefix of the entry that +** the sorter cursor currently points to. Only the first P4 fields +** of r[P3] and the sorter record are compared. +** +** If either P3 or the sorter contains a NULL in one of their significant +** fields (not counting the P4 fields at the end which are ignored) then +** the comparison is assumed to be equal. +** +** Fall through to next instruction if the two records compare equal to +** each other. Jump to P2 if they are different. +*/ +case OP_SorterCompare: { + VdbeCursor *pC; + int res; + int nKeyCol; + + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + assert( pOp->p4type==P4_INT32 ); + pIn3 = &aMem[pOp->p3]; + nKeyCol = pOp->p4.i; + res = 0; + rc = sqlite3VdbeSorterCompare(pC, pIn3, nKeyCol, &res); + VdbeBranchTaken(res!=0,2); + if( rc ) goto abort_due_to_error; + if( res ) goto jump_to_p2; + break; +}; + +/* Opcode: SorterData P1 P2 P3 * * +** Synopsis: r[P2]=data +** +** Write into register P2 the current sorter data for sorter cursor P1. +** Then clear the column header cache on cursor P3. +** +** This opcode is normally use to move a record out of the sorter and into +** a register that is the source for a pseudo-table cursor created using +** OpenPseudo. That pseudo-table cursor is the one that is identified by +** parameter P3. Clearing the P3 column cache as part of this opcode saves +** us from having to issue a separate NullRow instruction to clear that cache. +*/ +case OP_SorterData: { + VdbeCursor *pC; + + pOut = &aMem[pOp->p2]; + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + rc = sqlite3VdbeSorterRowkey(pC, pOut); + assert( rc!=SQLITE_OK || (pOut->flags & MEM_Blob) ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + if( rc ) goto abort_due_to_error; + p->apCsr[pOp->p3]->cacheStatus = CACHE_STALE; + break; +} + +/* Opcode: RowData P1 P2 P3 * * +** Synopsis: r[P2]=data +** +** Write into register P2 the complete row content for the row at +** which cursor P1 is currently pointing. +** There is no interpretation of the data. +** It is just copied onto the P2 register exactly as +** it is found in the database file. +** +** If cursor P1 is an index, then the content is the key of the row. +** If cursor P2 is a table, then the content extracted is the data. +** +** If the P1 cursor must be pointing to a valid row (not a NULL row) +** of a real table, not a pseudo-table. +** +** If P3!=0 then this opcode is allowed to make an ephemeral pointer +** into the database page. That means that the content of the output +** register will be invalidated as soon as the cursor moves - including +** moves caused by other cursors that "save" the current cursors +** position in order that they can write to the same table. If P3==0 +** then a copy of the data is made into memory. P3!=0 is faster, but +** P3==0 is safer. +** +** If P3!=0 then the content of the P2 register is unsuitable for use +** in OP_Result and any OP_Result will invalidate the P2 register content. +** The P2 register content is invalidated by opcodes like OP_Function or +** by any use of another cursor pointing to the same table. +*/ +case OP_RowData: { + VdbeCursor *pC; + BtCursor *pCrsr; + u32 n; + + pOut = out2Prerelease(p, pOp); + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( isSorter(pC)==0 ); + assert( pC->nullRow==0 ); + assert( pC->uc.pCursor!=0 ); + pCrsr = pC->uc.pCursor; + + /* The OP_RowData opcodes always follow OP_NotExists or + ** OP_SeekRowid or OP_Rewind/Op_Next with no intervening instructions + ** that might invalidate the cursor. + ** If this where not the case, on of the following assert()s + ** would fail. Should this ever change (because of changes in the code + ** generator) then the fix would be to insert a call to + ** sqlite3VdbeCursorMoveto(). + */ + assert( pC->deferredMoveto==0 ); + assert( sqlite3BtreeCursorIsValid(pCrsr) ); + + n = sqlite3BtreePayloadSize(pCrsr); + if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + testcase( n==0 ); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCrsr, n, pOut); + if( rc ) goto abort_due_to_error; + if( !pOp->p3 ) Deephemeralize(pOut); + UPDATE_MAX_BLOBSIZE(pOut); + REGISTER_TRACE(pOp->p2, pOut); + break; +} + +/* Opcode: Rowid P1 P2 * * * +** Synopsis: r[P2]=PX rowid of P1 +** +** Store in register P2 an integer which is the key of the table entry that +** P1 is currently point to. +** +** P1 can be either an ordinary table or a virtual table. There used to +** be a separate OP_VRowid opcode for use with virtual tables, but this +** one opcode now works for both table types. +*/ +case OP_Rowid: { /* out2 */ + VdbeCursor *pC; + i64 v; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + + pOut = out2Prerelease(p, pOp); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + if( pC->nullRow ){ + pOut->flags = MEM_Null; + break; + }else if( pC->deferredMoveto ){ + v = pC->movetoTarget; +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( pC->eCurType==CURTYPE_VTAB ){ + assert( pC->uc.pVCur!=0 ); + pVtab = pC->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xRowid ); + rc = pModule->xRowid(pC->uc.pVCur, &v); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + rc = sqlite3VdbeCursorRestore(pC); + if( rc ) goto abort_due_to_error; + if( pC->nullRow ){ + pOut->flags = MEM_Null; + break; + } + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + pOut->u.i = v; + break; +} + +/* Opcode: NullRow P1 * * * * +** +** Move the cursor P1 to a null row. Any OP_Column operations +** that occur while the cursor is on the null row will always +** write a NULL. +** +** If cursor P1 is not previously opened, open it now to a special +** pseudo-cursor that always returns NULL for every column. +*/ +case OP_NullRow: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + if( pC==0 ){ + /* If the cursor is not already open, create a special kind of + ** pseudo-cursor that always gives null rows. */ + pC = allocateCursor(p, pOp->p1, 1, CURTYPE_PSEUDO); + if( pC==0 ) goto no_mem; + pC->seekResult = 0; + pC->isTable = 1; + pC->noReuse = 1; + pC->uc.pCursor = sqlite3BtreeFakeValidCursor(); + } + pC->nullRow = 1; + pC->cacheStatus = CACHE_STALE; + if( pC->eCurType==CURTYPE_BTREE ){ + assert( pC->uc.pCursor!=0 ); + sqlite3BtreeClearCursor(pC->uc.pCursor); + } +#ifdef SQLITE_DEBUG + if( pC->seekOp==0 ) pC->seekOp = OP_NullRow; +#endif + break; +} + +/* Opcode: SeekEnd P1 * * * * +** +** Position cursor P1 at the end of the btree for the purpose of +** appending a new entry onto the btree. +** +** It is assumed that the cursor is used only for appending and so +** if the cursor is valid, then the cursor must already be pointing +** at the end of the btree and so no changes are made to +** the cursor. +*/ +/* Opcode: Last P1 P2 * * * +** +** The next use of the Rowid or Column or Prev instruction for P1 +** will refer to the last entry in the database table or index. +** If the table or index is empty and P2>0, then jump immediately to P2. +** If P2 is 0 or if the table or index is not empty, fall through +** to the following instruction. +** +** This opcode leaves the cursor configured to move in reverse order, +** from the end toward the beginning. In other words, the cursor is +** configured to use Prev, not Next. +*/ +case OP_SeekEnd: +case OP_Last: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + res = 0; + assert( pCrsr!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + if( pOp->opcode==OP_SeekEnd ){ + assert( pOp->p2==0 ); + pC->seekResult = -1; + if( sqlite3BtreeCursorIsValidNN(pCrsr) ){ + break; + } + } + rc = sqlite3BtreeLast(pCrsr, &res); + pC->nullRow = (u8)res; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( rc ) goto abort_due_to_error; + if( pOp->p2>0 ){ + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + } + break; +} + +/* Opcode: IfSmaller P1 P2 P3 * * +** +** Estimate the number of rows in the table P1. Jump to P2 if that +** estimate is less than approximately 2**(0.1*P3). +*/ +case OP_IfSmaller: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + i64 sz; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeFirst(pCrsr, &res); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + sz = sqlite3BtreeRowCountEst(pCrsr); + if( ALWAYS(sz>=0) && sqlite3LogEst((u64)sz)p3 ) res = 1; + } + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + + +/* Opcode: SorterSort P1 P2 * * * +** +** After all records have been inserted into the Sorter object +** identified by P1, invoke this opcode to actually do the sorting. +** Jump to P2 if there are no records to be sorted. +** +** This opcode is an alias for OP_Sort and OP_Rewind that is used +** for Sorter objects. +*/ +/* Opcode: Sort P1 P2 * * * +** +** This opcode does exactly the same thing as OP_Rewind except that +** it increments an undocumented global variable used for testing. +** +** Sorting is accomplished by writing records into a sorting index, +** then rewinding that index and playing it back from beginning to +** end. We use the OP_Sort opcode instead of OP_Rewind to do the +** rewinding so that the global variable will be incremented and +** regression tests can determine whether or not the optimizer is +** correctly optimizing out sorts. +*/ +case OP_SorterSort: /* jump */ +case OP_Sort: { /* jump */ +#ifdef SQLITE_TEST + sqlite3_sort_count++; + sqlite3_search_count--; +#endif + p->aCounter[SQLITE_STMTSTATUS_SORT]++; + /* Fall through into OP_Rewind */ + /* no break */ deliberate_fall_through +} +/* Opcode: Rewind P1 P2 * * * +** +** The next use of the Rowid or Column or Next instruction for P1 +** will refer to the first entry in the database table or index. +** If the table or index is empty, jump immediately to P2. +** If the table or index is not empty, fall through to the following +** instruction. +** +** This opcode leaves the cursor configured to move in forward order, +** from the beginning toward the end. In other words, the cursor is +** configured to use Next, not Prev. +*/ +case OP_Rewind: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5==0 ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( isSorter(pC)==(pOp->opcode==OP_SorterSort) ); + res = 1; +#ifdef SQLITE_DEBUG + pC->seekOp = OP_Rewind; +#endif + if( isSorter(pC) ){ + rc = sqlite3VdbeSorterRewind(pC, &res); + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeFirst(pCrsr, &res); + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + } + if( rc ) goto abort_due_to_error; + pC->nullRow = (u8)res; + assert( pOp->p2>0 && pOp->p2nOp ); + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + +/* Opcode: Next P1 P2 P3 * P5 +** +** Advance cursor P1 so that it points to the next key/data pair in its +** table or index. If there are no more key/value pairs then fall through +** to the following instruction. But if the cursor advance was successful, +** jump immediately to P2. +** +** The Next opcode is only valid following an SeekGT, SeekGE, or +** OP_Rewind opcode used to position the cursor. Next is not allowed +** to follow SeekLT, SeekLE, or OP_Last. +** +** The P1 cursor must be for a real table, not a pseudo-table. P1 must have +** been opened prior to this opcode or the program will segfault. +** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** +** If P5 is positive and the jump is taken, then event counter +** number P5-1 in the prepared statement is incremented. +** +** See also: Prev +*/ +/* Opcode: Prev P1 P2 P3 * P5 +** +** Back up cursor P1 so that it points to the previous key/data pair in its +** table or index. If there is no previous key/value pairs then fall through +** to the following instruction. But if the cursor backup was successful, +** jump immediately to P2. +** +** +** The Prev opcode is only valid following an SeekLT, SeekLE, or +** OP_Last opcode used to position the cursor. Prev is not allowed +** to follow SeekGT, SeekGE, or OP_Rewind. +** +** The P1 cursor must be for a real table, not a pseudo-table. If P1 is +** not open then the behavior is undefined. +** +** The P3 value is a hint to the btree implementation. If P3==1, that +** means P1 is an SQL index and that this instruction could have been +** omitted if that index had been unique. P3 is usually 0. P3 is +** always either 0 or 1. +** +** If P5 is positive and the jump is taken, then event counter +** number P5-1 in the prepared statement is incremented. +*/ +/* Opcode: SorterNext P1 P2 * * P5 +** +** This opcode works just like OP_Next except that P1 must be a +** sorter object for which the OP_SorterSort opcode has been +** invoked. This opcode advances the cursor to the next sorted +** record, or jumps to P2 if there are no more sorted records. +*/ +case OP_SorterNext: { /* jump */ + VdbeCursor *pC; + + pC = p->apCsr[pOp->p1]; + assert( isSorter(pC) ); + rc = sqlite3VdbeSorterNext(db, pC); + goto next_tail; + +case OP_Prev: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope + || pC->seekOp==OP_NullRow); + rc = sqlite3BtreePrevious(pC->uc.pCursor, pOp->p3); + goto next_tail; + +case OP_Next: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE + || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid + || pC->seekOp==OP_IfNoHope); + rc = sqlite3BtreeNext(pC->uc.pCursor, pOp->p3); + +next_tail: + pC->cacheStatus = CACHE_STALE; + VdbeBranchTaken(rc==SQLITE_OK,2); + if( rc==SQLITE_OK ){ + pC->nullRow = 0; + p->aCounter[pOp->p5]++; +#ifdef SQLITE_TEST + sqlite3_search_count++; +#endif + goto jump_to_p2_and_check_for_interrupt; + } + if( rc!=SQLITE_DONE ) goto abort_due_to_error; + rc = SQLITE_OK; + pC->nullRow = 1; + goto check_for_interrupt; +} + +/* Opcode: IdxInsert P1 P2 P3 P4 P5 +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the index P1. Data for the entry is nil. +** +** If P4 is not zero, then it is the number of values in the unpacked +** key of reg(P2). In that case, P3 is the index of the first register +** for the unpacked key. The availability of the unpacked key can sometimes +** be an optimization. +** +** If P5 has the OPFLAG_APPEND bit set, that is a hint to the b-tree layer +** that this insert is likely to be an append. +** +** If P5 has the OPFLAG_NCHANGE bit set, then the change counter is +** incremented by this instruction. If the OPFLAG_NCHANGE bit is clear, +** then the change counter is unchanged. +** +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equivalent +** to P2. +** +** This instruction only works for indices. The equivalent instruction +** for tables is OP_Insert. +*/ +case OP_IdxInsert: { /* in2 */ + VdbeCursor *pC; + BtreePayload x; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + sqlite3VdbeIncrWriteCounter(p, pC); + assert( pC!=0 ); + assert( !isSorter(pC) ); + pIn2 = &aMem[pOp->p2]; + assert( (pIn2->flags & MEM_Blob) || (pOp->p5 & OPFLAG_PREFORMAT) ); + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->isTable==0 ); + rc = ExpandBlob(pIn2); + if( rc ) goto abort_due_to_error; + x.nKey = pIn2->n; + x.pKey = pIn2->z; + x.aMem = aMem + pOp->p3; + x.nMem = (u16)pOp->p4.i; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION|OPFLAG_PREFORMAT)), + ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) + ); + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; + if( rc) goto abort_due_to_error; + break; +} + +/* Opcode: SorterInsert P1 P2 * * * +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the sorter P1. Data for the entry is nil. +*/ +case OP_SorterInsert: { /* in2 */ + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + sqlite3VdbeIncrWriteCounter(p, pC); + assert( pC!=0 ); + assert( isSorter(pC) ); + pIn2 = &aMem[pOp->p2]; + assert( pIn2->flags & MEM_Blob ); + assert( pC->isTable==0 ); + rc = ExpandBlob(pIn2); + if( rc ) goto abort_due_to_error; + rc = sqlite3VdbeSorterWrite(pC, pIn2); + if( rc) goto abort_due_to_error; + break; +} + +/* Opcode: IdxDelete P1 P2 P3 * P5 +** Synopsis: key=r[P2@P3] +** +** The content of P3 registers starting at register P2 form +** an unpacked index key. This opcode removes that entry from the +** index opened by cursor P1. +** +** If P5 is not zero, then raise an SQLITE_CORRUPT_INDEX error +** if no matching index entry is found. This happens when running +** an UPDATE or DELETE statement and the index entry to be updated +** or deleted is not found. For some uses of IdxDelete +** (example: the EXCEPT operator) it does not matter that no matching +** entry is found. For those cases, P5 is zero. Also, do not raise +** this (self-correcting and non-critical) error if in writable_schema mode. +*/ +case OP_IdxDelete: { + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + UnpackedRecord r; + + assert( pOp->p3>0 ); + assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem+1 - p->nCursor)+1 ); + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3VdbeIncrWriteCounter(p, pC); + pCrsr = pC->uc.pCursor; + assert( pCrsr!=0 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p3; + r.default_rc = 0; + r.aMem = &aMem[pOp->p2]; + rc = sqlite3BtreeIndexMoveto(pCrsr, &r, &res); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); + if( rc ) goto abort_due_to_error; + }else if( pOp->p5 && !sqlite3WritableSchema(db) ){ + rc = sqlite3ReportError(SQLITE_CORRUPT_INDEX, __LINE__, "index corruption"); + goto abort_due_to_error; + } + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; + break; +} + +/* Opcode: DeferredSeek P1 * P3 P4 * +** Synopsis: Move P3 to P1.rowid if needed +** +** P1 is an open index cursor and P3 is a cursor on the corresponding +** table. This opcode does a deferred seek of the P3 table cursor +** to the row that corresponds to the current row of P1. +** +** This is a deferred seek. Nothing actually happens until +** the cursor is used to read a record. That way, if no reads +** occur, no unnecessary I/O happens. +** +** P4 may be an array of integers (type P4_INTARRAY) containing +** one entry for each column in the P3 table. If array entry a(i) +** is non-zero, then reading column a(i)-1 from cursor P3 is +** equivalent to performing the deferred seek and then reading column i +** from P1. This information is stored in P3 and used to redirect +** reads against P3 over to P1, thus possibly avoiding the need to +** seek and read cursor P3. +*/ +/* Opcode: IdxRowid P1 P2 * * * +** Synopsis: r[P2]=rowid +** +** Write into register P2 an integer which is the last entry in the record at +** the end of the index key pointed to by cursor P1. This integer should be +** the rowid of the table entry to which this index entry points. +** +** See also: Rowid, MakeRecord. +*/ +case OP_DeferredSeek: +case OP_IdxRowid: { /* out2 */ + VdbeCursor *pC; /* The P1 index cursor */ + VdbeCursor *pTabCur; /* The P2 table cursor (OP_DeferredSeek only) */ + i64 rowid; /* Rowid that P1 current points to */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE || IsNullCursor(pC) ); + assert( pC->uc.pCursor!=0 ); + assert( pC->isTable==0 || IsNullCursor(pC) ); + assert( pC->deferredMoveto==0 ); + assert( !pC->nullRow || pOp->opcode==OP_IdxRowid ); + + /* The IdxRowid and Seek opcodes are combined because of the commonality + ** of sqlite3VdbeCursorRestore() and sqlite3VdbeIdxRowid(). */ + rc = sqlite3VdbeCursorRestore(pC); + + /* sqlite3VbeCursorRestore() can only fail if the record has been deleted + ** out from under the cursor. That will never happens for an IdxRowid + ** or Seek opcode */ + if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; + + if( !pC->nullRow ){ + rowid = 0; /* Not needed. Only used to silence a warning. */ + rc = sqlite3VdbeIdxRowid(db, pC->uc.pCursor, &rowid); + if( rc!=SQLITE_OK ){ + goto abort_due_to_error; + } + if( pOp->opcode==OP_DeferredSeek ){ + assert( pOp->p3>=0 && pOp->p3nCursor ); + pTabCur = p->apCsr[pOp->p3]; + assert( pTabCur!=0 ); + assert( pTabCur->eCurType==CURTYPE_BTREE ); + assert( pTabCur->uc.pCursor!=0 ); + assert( pTabCur->isTable ); + pTabCur->nullRow = 0; + pTabCur->movetoTarget = rowid; + pTabCur->deferredMoveto = 1; + pTabCur->cacheStatus = CACHE_STALE; + assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); + assert( !pTabCur->isEphemeral ); + pTabCur->ub.aAltMap = pOp->p4.ai; + assert( !pC->isEphemeral ); + pTabCur->pAltCursor = pC; + }else{ + pOut = out2Prerelease(p, pOp); + pOut->u.i = rowid; + } + }else{ + assert( pOp->opcode==OP_IdxRowid ); + sqlite3VdbeMemSetNull(&aMem[pOp->p2]); + } + break; +} + +/* Opcode: FinishSeek P1 * * * * +** +** If cursor P1 was previously moved via OP_DeferredSeek, complete that +** seek operation now, without further delay. If the cursor seek has +** already occurred, this instruction is a no-op. +*/ +case OP_FinishSeek: { + VdbeCursor *pC; /* The P1 index cursor */ + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + if( pC->deferredMoveto ){ + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + } + break; +} + +/* Opcode: IdxGE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** fields at the end. +** +** If the P1 index entry is greater than or equal to the key value +** then jump to P2. Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxGT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY. Compare this key value against the index +** that P1 is currently pointing to, ignoring the PRIMARY KEY or ROWID +** fields at the end. +** +** If the P1 index entry is greater than the key value +** then jump to P2. Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxLT P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY or ROWID. Compare this key value against +** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or +** ROWID on the P1 index. +** +** If the P1 index entry is less than the key value then jump to P2. +** Otherwise fall through to the next instruction. +*/ +/* Opcode: IdxLE P1 P2 P3 P4 * +** Synopsis: key=r[P3@P4] +** +** The P4 register values beginning with P3 form an unpacked index +** key that omits the PRIMARY KEY or ROWID. Compare this key value against +** the index that P1 is currently pointing to, ignoring the PRIMARY KEY or +** ROWID on the P1 index. +** +** If the P1 index entry is less than or equal to the key value then jump +** to P2. Otherwise fall through to the next instruction. +*/ +case OP_IdxLE: /* jump */ +case OP_IdxGT: /* jump */ +case OP_IdxLT: /* jump */ +case OP_IdxGE: { /* jump */ + VdbeCursor *pC; + int res; + UnpackedRecord r; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->isOrdered ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0); + assert( pC->deferredMoveto==0 ); + assert( pOp->p4type==P4_INT32 ); + r.pKeyInfo = pC->pKeyInfo; + r.nField = (u16)pOp->p4.i; + if( pOp->opcodeopcode==OP_IdxLE || pOp->opcode==OP_IdxGT ); + r.default_rc = -1; + }else{ + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxLT ); + r.default_rc = 0; + } + r.aMem = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + { + int i; + for(i=0; ip3+i, &aMem[pOp->p3+i]); + } + } +#endif + + /* Inlined version of sqlite3VdbeIdxKeyCompare() */ + { + i64 nCellKey = 0; + BtCursor *pCur; + Mem m; + + assert( pC->eCurType==CURTYPE_BTREE ); + pCur = pC->uc.pCursor; + assert( sqlite3BtreeCursorIsValid(pCur) ); + nCellKey = sqlite3BtreePayloadSize(pCur); + /* nCellKey will always be between 0 and 0xffffffff because of the way + ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ + if( nCellKey<=0 || nCellKey>0x7fffffff ){ + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } + sqlite3VdbeMemInit(&m, db, 0); + rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); + if( rc ) goto abort_due_to_error; + res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, &r, 0); + sqlite3VdbeMemReleaseMalloc(&m); + } + /* End of inlined sqlite3VdbeIdxKeyCompare() */ + + assert( (OP_IdxLE&1)==(OP_IdxLT&1) && (OP_IdxGE&1)==(OP_IdxGT&1) ); + if( (pOp->opcode&1)==(OP_IdxLT&1) ){ + assert( pOp->opcode==OP_IdxLE || pOp->opcode==OP_IdxLT ); + res = -res; + }else{ + assert( pOp->opcode==OP_IdxGE || pOp->opcode==OP_IdxGT ); + res++; + } + VdbeBranchTaken(res>0,2); + assert( rc==SQLITE_OK ); + if( res>0 ) goto jump_to_p2; + break; +} + +/* Opcode: Destroy P1 P2 P3 * * +** +** Delete an entire database table or index whose root page in the database +** file is given by P1. +** +** The table being destroyed is in the main database file if P3==0. If +** P3==1 then the table to be clear is in the auxiliary database file +** that is used to store tables create using CREATE TEMPORARY TABLE. +** +** If AUTOVACUUM is enabled then it is possible that another root page +** might be moved into the newly deleted root page in order to keep all +** root pages contiguous at the beginning of the database. The former +** value of the root page that moved - its value before the move occurred - +** is stored in register P2. If no page movement was required (because the +** table being dropped was already the last one in the database) then a +** zero is stored in register P2. If AUTOVACUUM is disabled then a zero +** is stored in register P2. +** +** This opcode throws an error if there are any active reader VMs when +** it is invoked. This is done to avoid the difficulty associated with +** updating existing cursors when a root page is moved in an AUTOVACUUM +** database. This error is thrown even if the database is not an AUTOVACUUM +** db in order to avoid introducing an incompatibility between autovacuum +** and non-autovacuum modes. +** +** See also: Clear +*/ +case OP_Destroy: { /* out2 */ + int iMoved; + int iDb; + + sqlite3VdbeIncrWriteCounter(p, 0); + assert( p->readOnly==0 ); + assert( pOp->p1>1 ); + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Null; + if( db->nVdbeRead > db->nVDestroy+1 ){ + rc = SQLITE_LOCKED; + p->errorAction = OE_Abort; + goto abort_due_to_error; + }else{ + iDb = pOp->p3; + assert( DbMaskTest(p->btreeMask, iDb) ); + iMoved = 0; /* Not needed. Only to silence a warning. */ + rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved); + pOut->flags = MEM_Int; + pOut->u.i = iMoved; + if( rc ) goto abort_due_to_error; +#ifndef SQLITE_OMIT_AUTOVACUUM + if( iMoved!=0 ){ + sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); + /* All OP_Destroy operations occur on the same btree */ + assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); + resetSchemaOnFault = iDb+1; + } +#endif + } + break; +} + +/* Opcode: Clear P1 P2 P3 +** +** Delete all contents of the database table or index whose root page +** in the database file is given by P1. But, unlike Destroy, do not +** remove the table or index from the database file. +** +** The table being clear is in the main database file if P2==0. If +** P2==1 then the table to be clear is in the auxiliary database file +** that is used to store tables create using CREATE TEMPORARY TABLE. +** +** If the P3 value is non-zero, then the row change count is incremented +** by the number of rows in the table being cleared. If P3 is greater +** than zero, then the value stored in register P3 is also incremented +** by the number of rows in the table being cleared. +** +** See also: Destroy +*/ +case OP_Clear: { + i64 nChange; + + sqlite3VdbeIncrWriteCounter(p, 0); + nChange = 0; + assert( p->readOnly==0 ); + assert( DbMaskTest(p->btreeMask, pOp->p2) ); + rc = sqlite3BtreeClearTable(db->aDb[pOp->p2].pBt, (u32)pOp->p1, &nChange); + if( pOp->p3 ){ + p->nChange += nChange; + if( pOp->p3>0 ){ + assert( memIsValid(&aMem[pOp->p3]) ); + memAboutToChange(p, &aMem[pOp->p3]); + aMem[pOp->p3].u.i += nChange; + } + } + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ResetSorter P1 * * * * +** +** Delete all contents from the ephemeral table or sorter +** that is open on cursor P1. +** +** This opcode only works for cursors used for sorting and +** opened with OP_OpenEphemeral or OP_SorterOpen. +*/ +case OP_ResetSorter: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + if( isSorter(pC) ){ + sqlite3VdbeSorterReset(db, pC->uc.pSorter); + }else{ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->isEphemeral ); + rc = sqlite3BtreeClearTableOfCursor(pC->uc.pCursor); + if( rc ) goto abort_due_to_error; + } + break; +} + +/* Opcode: CreateBtree P1 P2 P3 * * +** Synopsis: r[P2]=root iDb=P1 flags=P3 +** +** Allocate a new b-tree in the main database file if P1==0 or in the +** TEMP database file if P1==1 or in an attached database if +** P1>1. The P3 argument must be 1 (BTREE_INTKEY) for a rowid table +** it must be 2 (BTREE_BLOBKEY) for an index or WITHOUT ROWID table. +** The root page number of the new b-tree is stored in register P2. +*/ +case OP_CreateBtree: { /* out2 */ + Pgno pgno; + Db *pDb; + + sqlite3VdbeIncrWriteCounter(p, 0); + pOut = out2Prerelease(p, pOp); + pgno = 0; + assert( pOp->p3==BTREE_INTKEY || pOp->p3==BTREE_BLOBKEY ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pDb = &db->aDb[pOp->p1]; + assert( pDb->pBt!=0 ); + rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, pOp->p3); + if( rc ) goto abort_due_to_error; + pOut->u.i = pgno; + break; +} + +/* Opcode: SqlExec * * * P4 * +** +** Run the SQL statement or statements specified in the P4 string. +*/ +case OP_SqlExec: { + sqlite3VdbeIncrWriteCounter(p, 0); + db->nSqlExec++; + rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0); + db->nSqlExec--; + if( rc ) goto abort_due_to_error; + break; +} + +/* Opcode: ParseSchema P1 * * P4 * +** +** Read and parse all entries from the schema table of database P1 +** that match the WHERE clause P4. If P4 is a NULL pointer, then the +** entire schema for P1 is reparsed. +** +** This opcode invokes the parser to create a new virtual machine, +** then runs the new virtual machine. It is thus a re-entrant opcode. +*/ +case OP_ParseSchema: { + int iDb; + const char *zSchema; + char *zSql; + InitData initData; + + /* Any prepared statement that invokes this opcode will hold mutexes + ** on every btree. This is a prerequisite for invoking + ** sqlite3InitCallback(). + */ +#ifdef SQLITE_DEBUG + for(iDb=0; iDbnDb; iDb++){ + assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + } +#endif + + iDb = pOp->p1; + assert( iDb>=0 && iDbnDb ); + assert( DbHasProperty(db, iDb, DB_SchemaLoaded) + || db->mallocFailed + || (CORRUPT_DB && (db->flags & SQLITE_NoSchemaError)!=0) ); + +#ifndef SQLITE_OMIT_ALTERTABLE + if( pOp->p4.z==0 ){ + sqlite3SchemaClear(db->aDb[iDb].pSchema); + db->mDbFlags &= ~DBFLAG_SchemaKnownOk; + rc = sqlite3InitOne(db, iDb, &p->zErrMsg, pOp->p5); + db->mDbFlags |= DBFLAG_SchemaChange; + p->expired = 0; + }else +#endif + { + zSchema = LEGACY_SCHEMA_TABLE; + initData.db = db; + initData.iDb = iDb; + initData.pzErrMsg = &p->zErrMsg; + initData.mInitFlags = 0; + initData.mxPage = sqlite3BtreeLastPage(db->aDb[iDb].pBt); + zSql = sqlite3MPrintf(db, + "SELECT*FROM\"%w\".%s WHERE %s ORDER BY rowid", + db->aDb[iDb].zDbSName, zSchema, pOp->p4.z); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + assert( db->init.busy==0 ); + db->init.busy = 1; + initData.rc = SQLITE_OK; + initData.nInitRow = 0; + assert( !db->mallocFailed ); + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); + if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_schema table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } + sqlite3DbFreeNN(db, zSql); + db->init.busy = 0; + } + } + if( rc ){ + sqlite3ResetAllSchemasOfConnection(db); + if( rc==SQLITE_NOMEM ){ + goto no_mem; + } + goto abort_due_to_error; + } + break; +} + +#if !defined(SQLITE_OMIT_ANALYZE) +/* Opcode: LoadAnalysis P1 * * * * +** +** Read the sqlite_stat1 table for database P1 and load the content +** of that table into the internal index hash table. This will cause +** the analysis to be used when preparing all subsequent queries. +*/ +case OP_LoadAnalysis: { + assert( pOp->p1>=0 && pOp->p1nDb ); + rc = sqlite3AnalysisLoad(db, pOp->p1); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* !defined(SQLITE_OMIT_ANALYZE) */ + +/* Opcode: DropTable P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the table named P4 in database P1. This is called after a table +** is dropped from disk (using the Destroy opcode) in order to keep +** the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropTable: { + sqlite3VdbeIncrWriteCounter(p, 0); + sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z); + break; +} + +/* Opcode: DropIndex P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the index named P4 in database P1. This is called after an index +** is dropped from disk (using the Destroy opcode) +** in order to keep the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropIndex: { + sqlite3VdbeIncrWriteCounter(p, 0); + sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z); + break; +} + +/* Opcode: DropTrigger P1 * * P4 * +** +** Remove the internal (in-memory) data structures that describe +** the trigger named P4 in database P1. This is called after a trigger +** is dropped from disk (using the Destroy opcode) in order to keep +** the internal representation of the +** schema consistent with what is on disk. +*/ +case OP_DropTrigger: { + sqlite3VdbeIncrWriteCounter(p, 0); + sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z); + break; +} + + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK +/* Opcode: IntegrityCk P1 P2 P3 P4 P5 +** +** Do an analysis of the currently open database. Store in +** register P1 the text of an error message describing any problems. +** If no problems are found, store a NULL in register P1. +** +** The register P3 contains one less than the maximum number of allowed errors. +** At most reg(P3) errors will be reported. +** In other words, the analysis stops as soon as reg(P1) errors are +** seen. Reg(P1) is updated with the number of errors remaining. +** +** The root page numbers of all tables in the database are integers +** stored in P4_INTARRAY argument. +** +** If P5 is not zero, the check is done on the auxiliary database +** file, not the main database file. +** +** This opcode is used to implement the integrity_check pragma. +*/ +case OP_IntegrityCk: { + int nRoot; /* Number of tables to check. (Number of root pages.) */ + Pgno *aRoot; /* Array of rootpage numbers for tables to be checked */ + int nErr; /* Number of errors reported */ + char *z; /* Text of the error report */ + Mem *pnErr; /* Register keeping track of errors remaining */ + + assert( p->bIsReader ); + nRoot = pOp->p2; + aRoot = pOp->p4.ai; + assert( nRoot>0 ); + assert( aRoot[0]==(Pgno)nRoot ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pnErr = &aMem[pOp->p3]; + assert( (pnErr->flags & MEM_Int)!=0 ); + assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); + pIn1 = &aMem[pOp->p1]; + assert( pOp->p5nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p5) ); + z = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, + (int)pnErr->u.i+1, &nErr); + sqlite3VdbeMemSetNull(pIn1); + if( nErr==0 ){ + assert( z==0 ); + }else if( z==0 ){ + goto no_mem; + }else{ + pnErr->u.i -= nErr-1; + sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free); + } + UPDATE_MAX_BLOBSIZE(pIn1); + sqlite3VdbeChangeEncoding(pIn1, encoding); + goto check_for_interrupt; +} +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +/* Opcode: RowSetAdd P1 P2 * * * +** Synopsis: rowset(P1)=r[P2] +** +** Insert the integer value held by register P2 into a RowSet object +** held in register P1. +** +** An assertion fails if P2 is not an integer. +*/ +case OP_RowSetAdd: { /* in1, in2 */ + pIn1 = &aMem[pOp->p1]; + pIn2 = &aMem[pOp->p2]; + assert( (pIn2->flags & MEM_Int)!=0 ); + if( (pIn1->flags & MEM_Blob)==0 ){ + if( sqlite3VdbeMemSetRowSet(pIn1) ) goto no_mem; + } + assert( sqlite3VdbeMemIsRowSet(pIn1) ); + sqlite3RowSetInsert((RowSet*)pIn1->z, pIn2->u.i); + break; +} + +/* Opcode: RowSetRead P1 P2 P3 * * +** Synopsis: r[P3]=rowset(P1) +** +** Extract the smallest value from the RowSet object in P1 +** and put that value into register P3. +** Or, if RowSet object P1 is initially empty, leave P3 +** unchanged and jump to instruction P2. +*/ +case OP_RowSetRead: { /* jump, in1, out3 */ + i64 val; + + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Blob)==0 || sqlite3VdbeMemIsRowSet(pIn1) ); + if( (pIn1->flags & MEM_Blob)==0 + || sqlite3RowSetNext((RowSet*)pIn1->z, &val)==0 + ){ + /* The boolean index is empty */ + sqlite3VdbeMemSetNull(pIn1); + VdbeBranchTaken(1,2); + goto jump_to_p2_and_check_for_interrupt; + }else{ + /* A value was pulled from the index */ + VdbeBranchTaken(0,2); + sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); + } + goto check_for_interrupt; +} + +/* Opcode: RowSetTest P1 P2 P3 P4 +** Synopsis: if r[P3] in rowset(P1) goto P2 +** +** Register P3 is assumed to hold a 64-bit integer value. If register P1 +** contains a RowSet object and that RowSet object contains +** the value held in P3, jump to register P2. Otherwise, insert the +** integer in P3 into the RowSet and continue on to the +** next opcode. +** +** The RowSet object is optimized for the case where sets of integers +** are inserted in distinct phases, which each set contains no duplicates. +** Each set is identified by a unique P4 value. The first set +** must have P4==0, the final set must have P4==-1, and for all other sets +** must have P4>0. +** +** This allows optimizations: (a) when P4==0 there is no need to test +** the RowSet object for P3, as it is guaranteed not to contain it, +** (b) when P4==-1 there is no need to insert the value, as it will +** never be tested for, and (c) when a value that is part of set X is +** inserted, there is no need to search to see if the same value was +** previously inserted as part of set X (only if it was previously +** inserted as part of some other set). +*/ +case OP_RowSetTest: { /* jump, in1, in3 */ + int iSet; + int exists; + + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + iSet = pOp->p4.i; + assert( pIn3->flags&MEM_Int ); + + /* If there is anything other than a rowset object in memory cell P1, + ** delete it now and initialize P1 with an empty rowset + */ + if( (pIn1->flags & MEM_Blob)==0 ){ + if( sqlite3VdbeMemSetRowSet(pIn1) ) goto no_mem; + } + assert( sqlite3VdbeMemIsRowSet(pIn1) ); + assert( pOp->p4type==P4_INT32 ); + assert( iSet==-1 || iSet>=0 ); + if( iSet ){ + exists = sqlite3RowSetTest((RowSet*)pIn1->z, iSet, pIn3->u.i); + VdbeBranchTaken(exists!=0,2); + if( exists ) goto jump_to_p2; + } + if( iSet>=0 ){ + sqlite3RowSetInsert((RowSet*)pIn1->z, pIn3->u.i); + } + break; +} + + +#ifndef SQLITE_OMIT_TRIGGER + +/* Opcode: Program P1 P2 P3 P4 P5 +** +** Execute the trigger program passed as P4 (type P4_SUBPROGRAM). +** +** P1 contains the address of the memory cell that contains the first memory +** cell in an array of values used as arguments to the sub-program. P2 +** contains the address to jump to if the sub-program throws an IGNORE +** exception using the RAISE() function. Register P3 contains the address +** of a memory cell in this (the parent) VM that is used to allocate the +** memory required by the sub-vdbe at runtime. +** +** P4 is a pointer to the VM containing the trigger program. +** +** If P5 is non-zero, then recursive program invocation is enabled. +*/ +case OP_Program: { /* jump */ + int nMem; /* Number of memory registers for sub-program */ + int nByte; /* Bytes of runtime space required for sub-program */ + Mem *pRt; /* Register to allocate runtime space */ + Mem *pMem; /* Used to iterate through memory cells */ + Mem *pEnd; /* Last memory cell in new array */ + VdbeFrame *pFrame; /* New vdbe frame to execute in */ + SubProgram *pProgram; /* Sub-program to execute */ + void *t; /* Token identifying trigger */ + + pProgram = pOp->p4.pProgram; + pRt = &aMem[pOp->p3]; + assert( pProgram->nOp>0 ); + + /* If the p5 flag is clear, then recursive invocation of triggers is + ** disabled for backwards compatibility (p5 is set if this sub-program + ** is really a trigger, not a foreign key action, and the flag set + ** and cleared by the "PRAGMA recursive_triggers" command is clear). + ** + ** It is recursive invocation of triggers, at the SQL level, that is + ** disabled. In some cases a single trigger may generate more than one + ** SubProgram (if the trigger may be executed with more than one different + ** ON CONFLICT algorithm). SubProgram structures associated with a + ** single trigger all have the same value for the SubProgram.token + ** variable. */ + if( pOp->p5 ){ + t = pProgram->token; + for(pFrame=p->pFrame; pFrame && pFrame->token!=t; pFrame=pFrame->pParent); + if( pFrame ) break; + } + + if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, "too many levels of trigger recursion"); + goto abort_due_to_error; + } + + /* Register pRt is used to store the memory required to save the state + ** of the current program, and the memory required at runtime to execute + ** the trigger program. If this trigger has been fired before, then pRt + ** is already allocated. Otherwise, it must be initialized. */ + if( (pRt->flags&MEM_Blob)==0 ){ + /* SubProgram.nMem is set to the number of memory cells used by the + ** program stored in SubProgram.aOp. As well as these, one memory + ** cell is required for each cursor used by the program. Set local + ** variable nMem (and later, VdbeFrame.nChildMem) to this value. + */ + nMem = pProgram->nMem + pProgram->nCsr; + assert( nMem>0 ); + if( pProgram->nCsr==0 ) nMem++; + nByte = ROUND8(sizeof(VdbeFrame)) + + nMem * sizeof(Mem) + + pProgram->nCsr * sizeof(VdbeCursor*) + + (pProgram->nOp + 7)/8; + pFrame = sqlite3DbMallocZero(db, nByte); + if( !pFrame ){ + goto no_mem; + } + sqlite3VdbeMemRelease(pRt); + pRt->flags = MEM_Blob|MEM_Dyn; + pRt->z = (char*)pFrame; + pRt->n = nByte; + pRt->xDel = sqlite3VdbeFrameMemDel; + + pFrame->v = p; + pFrame->nChildMem = nMem; + pFrame->nChildCsr = pProgram->nCsr; + pFrame->pc = (int)(pOp - aOp); + pFrame->aMem = p->aMem; + pFrame->nMem = p->nMem; + pFrame->apCsr = p->apCsr; + pFrame->nCursor = p->nCursor; + pFrame->aOp = p->aOp; + pFrame->nOp = p->nOp; + pFrame->token = pProgram->token; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pFrame->anExec = p->anExec; +#endif +#ifdef SQLITE_DEBUG + pFrame->iFrameMagic = SQLITE_FRAME_MAGIC; +#endif + + pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem]; + for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){ + pMem->flags = MEM_Undefined; + pMem->db = db; + } + }else{ + pFrame = (VdbeFrame*)pRt->z; + assert( pRt->xDel==sqlite3VdbeFrameMemDel ); + assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem + || (pProgram->nCsr==0 && pProgram->nMem+1==pFrame->nChildMem) ); + assert( pProgram->nCsr==pFrame->nChildCsr ); + assert( (int)(pOp - aOp)==pFrame->pc ); + } + + p->nFrame++; + pFrame->pParent = p->pFrame; + pFrame->lastRowid = db->lastRowid; + pFrame->nChange = p->nChange; + pFrame->nDbChange = p->db->nChange; + assert( pFrame->pAuxData==0 ); + pFrame->pAuxData = p->pAuxData; + p->pAuxData = 0; + p->nChange = 0; + p->pFrame = pFrame; + p->aMem = aMem = VdbeFrameMem(pFrame); + p->nMem = pFrame->nChildMem; + p->nCursor = (u16)pFrame->nChildCsr; + p->apCsr = (VdbeCursor **)&aMem[p->nMem]; + pFrame->aOnce = (u8*)&p->apCsr[pProgram->nCsr]; + memset(pFrame->aOnce, 0, (pProgram->nOp + 7)/8); + p->aOp = aOp = pProgram->aOp; + p->nOp = pProgram->nOp; +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + MemSetTypeFlag(&aMem[i], MEM_Undefined); /* Fault if this reg is reused */ + } + } +#endif + pOp = &aOp[-1]; + goto check_for_interrupt; +} + +/* Opcode: Param P1 P2 * * * +** +** This opcode is only ever present in sub-programs called via the +** OP_Program instruction. Copy a value currently stored in a memory +** cell of the calling (parent) frame to cell P2 in the current frames +** address space. This is used by trigger programs to access the new.* +** and old.* values. +** +** The address of the cell in the parent frame is determined by adding +** the value of the P1 argument to the value of the P1 argument to the +** calling OP_Program instruction. +*/ +case OP_Param: { /* out2 */ + VdbeFrame *pFrame; + Mem *pIn; + pOut = out2Prerelease(p, pOp); + pFrame = p->pFrame; + pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; + sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem); + break; +} + +#endif /* #ifndef SQLITE_OMIT_TRIGGER */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +/* Opcode: FkCounter P1 P2 * * * +** Synopsis: fkctr[P1]+=P2 +** +** Increment a "constraint counter" by P2 (P2 may be negative or positive). +** If P1 is non-zero, the database constraint counter is incremented +** (deferred foreign key constraints). Otherwise, if P1 is zero, the +** statement counter is incremented (immediate foreign key constraints). +*/ +case OP_FkCounter: { + if( db->flags & SQLITE_DeferFKs ){ + db->nDeferredImmCons += pOp->p2; + }else if( pOp->p1 ){ + db->nDeferredCons += pOp->p2; + }else{ + p->nFkConstraint += pOp->p2; + } + break; +} + +/* Opcode: FkIfZero P1 P2 * * * +** Synopsis: if fkctr[P1]==0 goto P2 +** +** This opcode tests if a foreign key constraint-counter is currently zero. +** If so, jump to instruction P2. Otherwise, fall through to the next +** instruction. +** +** If P1 is non-zero, then the jump is taken if the database constraint-counter +** is zero (the one that counts deferred constraint violations). If P1 is +** zero, the jump is taken if the statement constraint-counter is zero +** (immediate foreign key constraint violations). +*/ +case OP_FkIfZero: { /* jump */ + if( pOp->p1 ){ + VdbeBranchTaken(db->nDeferredCons==0 && db->nDeferredImmCons==0, 2); + if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; + }else{ + VdbeBranchTaken(p->nFkConstraint==0 && db->nDeferredImmCons==0, 2); + if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; + } + break; +} +#endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */ + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* Opcode: MemMax P1 P2 * * * +** Synopsis: r[P1]=max(r[P1],r[P2]) +** +** P1 is a register in the root frame of this VM (the root frame is +** different from the current frame if this instruction is being executed +** within a sub-program). Set the value of register P1 to the maximum of +** its current value and the value in register P2. +** +** This instruction throws an error if the memory cell is not initially +** an integer. +*/ +case OP_MemMax: { /* in2 */ + VdbeFrame *pFrame; + if( p->pFrame ){ + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + pIn1 = &pFrame->aMem[pOp->p1]; + }else{ + pIn1 = &aMem[pOp->p1]; + } + assert( memIsValid(pIn1) ); + sqlite3VdbeMemIntegerify(pIn1); + pIn2 = &aMem[pOp->p2]; + sqlite3VdbeMemIntegerify(pIn2); + if( pIn1->u.iu.i){ + pIn1->u.i = pIn2->u.i; + } + break; +} +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + +/* Opcode: IfPos P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 +** +** Register P1 must contain an integer. +** If the value of register P1 is 1 or greater, subtract P3 from the +** value in P1 and jump to P2. +** +** If the initial value of register P1 is less than 1, then the +** value is unchanged and control passes through to the next instruction. +*/ +case OP_IfPos: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken( pIn1->u.i>0, 2); + if( pIn1->u.i>0 ){ + pIn1->u.i -= pOp->p3; + goto jump_to_p2; + } + break; +} + +/* Opcode: OffsetLimit P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) +** +** This opcode performs a commonly used computation associated with +** LIMIT and OFFSET process. r[P1] holds the limit counter. r[P3] +** holds the offset counter. The opcode computes the combined value +** of the LIMIT and OFFSET and stores that value in r[P2]. The r[P2] +** value computed is the total number of rows that will need to be +** visited in order to complete the query. +** +** If r[P3] is zero or negative, that means there is no OFFSET +** and r[P2] is set to be the value of the LIMIT, r[P1]. +** +** if r[P1] is zero or negative, that means there is no LIMIT +** and r[P2] is set to -1. +** +** Otherwise, r[P2] is set to the sum of r[P1] and r[P3]. +*/ +case OP_OffsetLimit: { /* in1, out2, in3 */ + i64 x; + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + pOut = out2Prerelease(p, pOp); + assert( pIn1->flags & MEM_Int ); + assert( pIn3->flags & MEM_Int ); + x = pIn1->u.i; + if( x<=0 || sqlite3AddInt64(&x, pIn3->u.i>0?pIn3->u.i:0) ){ + /* If the LIMIT is less than or equal to zero, loop forever. This + ** is documented. But also, if the LIMIT+OFFSET exceeds 2^63 then + ** also loop forever. This is undocumented. In fact, one could argue + ** that the loop should terminate. But assuming 1 billion iterations + ** per second (far exceeding the capabilities of any current hardware) + ** it would take nearly 300 years to actually reach the limit. So + ** looping forever is a reasonable approximation. */ + pOut->u.i = -1; + }else{ + pOut->u.i = x; + } + break; +} + +/* Opcode: IfNotZero P1 P2 * * * +** Synopsis: if r[P1]!=0 then r[P1]--, goto P2 +** +** Register P1 must contain an integer. If the content of register P1 is +** initially greater than zero, then decrement the value in register P1. +** If it is non-zero (negative or positive) and then also jump to P2. +** If register P1 is initially zero, leave it unchanged and fall through. +*/ +case OP_IfNotZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + VdbeBranchTaken(pIn1->u.i<0, 2); + if( pIn1->u.i ){ + if( pIn1->u.i>0 ) pIn1->u.i--; + goto jump_to_p2; + } + break; +} + +/* Opcode: DecrJumpZero P1 P2 * * * +** Synopsis: if (--r[P1])==0 goto P2 +** +** Register P1 must hold an integer. Decrement the value in P1 +** and jump to P2 if the new value is exactly zero. +*/ +case OP_DecrJumpZero: { /* jump, in1 */ + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags&MEM_Int ); + if( pIn1->u.i>SMALLEST_INT64 ) pIn1->u.i--; + VdbeBranchTaken(pIn1->u.i==0, 2); + if( pIn1->u.i==0 ) goto jump_to_p2; + break; +} + + +/* Opcode: AggStep * P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the xStep function for an aggregate. +** The function has P5 arguments. P4 is a pointer to the +** FuncDef structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +*/ +/* Opcode: AggInverse * P2 P3 P4 P5 +** Synopsis: accum=r[P3] inverse(r[P2@P5]) +** +** Execute the xInverse function for an aggregate. +** The function has P5 arguments. P4 is a pointer to the +** FuncDef structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +*/ +/* Opcode: AggStep1 P1 P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the xStep (if P1==0) or xInverse (if P1!=0) function for an +** aggregate. The function has P5 arguments. P4 is a pointer to the +** FuncDef structure that specifies the function. Register P3 is the +** accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +** +** This opcode is initially coded as OP_AggStep0. On first evaluation, +** the FuncDef stored in P4 is converted into an sqlite3_context and +** the opcode is changed. In this way, the initialization of the +** sqlite3_context only happens once, instead of on each call to the +** step function. +*/ +case OP_AggInverse: +case OP_AggStep: { + int n; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCDEF ); + n = pOp->p5; + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); + assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); + pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) + + (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*))); + if( pCtx==0 ) goto no_mem; + pCtx->pMem = 0; + pCtx->pOut = (Mem*)&(pCtx->argv[n]); + sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null); + pCtx->pFunc = pOp->p4.pFunc; + pCtx->iOp = (int)(pOp - aOp); + pCtx->pVdbe = p; + pCtx->skipFlag = 0; + pCtx->isError = 0; + pCtx->enc = encoding; + pCtx->argc = n; + pOp->p4type = P4_FUNCCTX; + pOp->p4.pCtx = pCtx; + + /* OP_AggInverse must have P1==1 and OP_AggStep must have P1==0 */ + assert( pOp->p1==(pOp->opcode==OP_AggInverse) ); + + pOp->opcode = OP_AggStep1; + /* Fall through into OP_AggStep */ + /* no break */ deliberate_fall_through +} +case OP_AggStep1: { + int i; + sqlite3_context *pCtx; + Mem *pMem; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + pMem = &aMem[pOp->p3]; + +#ifdef SQLITE_DEBUG + if( pOp->p1 ){ + /* This is an OP_AggInverse call. Verify that xStep has always + ** been called at least once prior to any xInverse call. */ + assert( pMem->uTemp==0x1122e0e3 ); + }else{ + /* This is an OP_AggStep call. Mark it as such. */ + pMem->uTemp = 0x1122e0e3; + } +#endif + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + if( pCtx->pMem != pMem ){ + pCtx->pMem = pMem; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + +#ifdef SQLITE_DEBUG + for(i=0; iargc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + + pMem->n++; + assert( pCtx->pOut->flags==MEM_Null ); + assert( pCtx->isError==0 ); + assert( pCtx->skipFlag==0 ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pOp->p1 ){ + (pCtx->pFunc->xInverse)(pCtx,pCtx->argc,pCtx->argv); + }else +#endif + (pCtx->pFunc->xSFunc)(pCtx,pCtx->argc,pCtx->argv); /* IMP: R-24505-23230 */ + + if( pCtx->isError ){ + if( pCtx->isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut)); + rc = pCtx->isError; + } + if( pCtx->skipFlag ){ + assert( pOp[-1].opcode==OP_CollSeq ); + i = pOp[-1].p1; + if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1); + pCtx->skipFlag = 0; + } + sqlite3VdbeMemRelease(pCtx->pOut); + pCtx->pOut->flags = MEM_Null; + pCtx->isError = 0; + if( rc ) goto abort_due_to_error; + } + assert( pCtx->pOut->flags==MEM_Null ); + assert( pCtx->skipFlag==0 ); + break; +} + +/* Opcode: AggFinal P1 P2 * P4 * +** Synopsis: accum=r[P1] N=P2 +** +** P1 is the memory location that is the accumulator for an aggregate +** or window function. Execute the finalizer function +** for an aggregate and store the result in P1. +** +** P2 is the number of arguments that the step function takes and +** P4 is a pointer to the FuncDef for this function. The P2 +** argument is not used by this opcode. It is only there to disambiguate +** functions that can take varying numbers of arguments. The +** P4 argument is only needed for the case where +** the step function was not previously called. +*/ +/* Opcode: AggValue * P2 P3 P4 * +** Synopsis: r[P3]=value N=P2 +** +** Invoke the xValue() function and store the result in register P3. +** +** P2 is the number of arguments that the step function takes and +** P4 is a pointer to the FuncDef for this function. The P2 +** argument is not used by this opcode. It is only there to disambiguate +** functions that can take varying numbers of arguments. The +** P4 argument is only needed for the case where +** the step function was not previously called. +*/ +case OP_AggValue: +case OP_AggFinal: { + Mem *pMem; + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( pOp->p3==0 || pOp->opcode==OP_AggValue ); + pMem = &aMem[pOp->p1]; + assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pOp->p3 ){ + memAboutToChange(p, &aMem[pOp->p3]); + rc = sqlite3VdbeMemAggValue(pMem, &aMem[pOp->p3], pOp->p4.pFunc); + pMem = &aMem[pOp->p3]; + }else +#endif + { + rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc); + } + + if( rc ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pMem)); + goto abort_due_to_error; + } + sqlite3VdbeChangeEncoding(pMem, encoding); + UPDATE_MAX_BLOBSIZE(pMem); + break; +} + +#ifndef SQLITE_OMIT_WAL +/* Opcode: Checkpoint P1 P2 P3 * * +** +** Checkpoint database P1. This is a no-op if P1 is not currently in +** WAL mode. Parameter P2 is one of SQLITE_CHECKPOINT_PASSIVE, FULL, +** RESTART, or TRUNCATE. Write 1 or 0 into mem[P3] if the checkpoint returns +** SQLITE_BUSY or not, respectively. Write the number of pages in the +** WAL after the checkpoint into mem[P3+1] and the number of pages +** in the WAL that have been checkpointed after the checkpoint +** completes into mem[P3+2]. However on an error, mem[P3+1] and +** mem[P3+2] are initialized to -1. +*/ +case OP_Checkpoint: { + int i; /* Loop counter */ + int aRes[3]; /* Results */ + Mem *pMem; /* Write results here */ + + assert( p->readOnly==0 ); + aRes[0] = 0; + aRes[1] = aRes[2] = -1; + assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE + || pOp->p2==SQLITE_CHECKPOINT_FULL + || pOp->p2==SQLITE_CHECKPOINT_RESTART + || pOp->p2==SQLITE_CHECKPOINT_TRUNCATE + ); + rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]); + if( rc ){ + if( rc!=SQLITE_BUSY ) goto abort_due_to_error; + rc = SQLITE_OK; + aRes[0] = 1; + } + for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){ + sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]); + } + break; +}; +#endif + +#ifndef SQLITE_OMIT_PRAGMA +/* Opcode: JournalMode P1 P2 P3 * * +** +** Change the journal mode of database P1 to P3. P3 must be one of the +** PAGER_JOURNALMODE_XXX values. If changing between the various rollback +** modes (delete, truncate, persist, off and memory), this is a simple +** operation. No IO is required. +** +** If changing into or out of WAL mode the procedure is more complicated. +** +** Write a string containing the final journal-mode to register P2. +*/ +case OP_JournalMode: { /* out2 */ + Btree *pBt; /* Btree to change journal mode of */ + Pager *pPager; /* Pager associated with pBt */ + int eNew; /* New journal mode */ + int eOld; /* The old journal mode */ +#ifndef SQLITE_OMIT_WAL + const char *zFilename; /* Name of database file for pPager */ +#endif + + pOut = out2Prerelease(p, pOp); + eNew = pOp->p3; + assert( eNew==PAGER_JOURNALMODE_DELETE + || eNew==PAGER_JOURNALMODE_TRUNCATE + || eNew==PAGER_JOURNALMODE_PERSIST + || eNew==PAGER_JOURNALMODE_OFF + || eNew==PAGER_JOURNALMODE_MEMORY + || eNew==PAGER_JOURNALMODE_WAL + || eNew==PAGER_JOURNALMODE_QUERY + ); + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( p->readOnly==0 ); + + pBt = db->aDb[pOp->p1].pBt; + pPager = sqlite3BtreePager(pBt); + eOld = sqlite3PagerGetJournalMode(pPager); + if( eNew==PAGER_JOURNALMODE_QUERY ) eNew = eOld; + assert( sqlite3BtreeHoldsMutex(pBt) ); + if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld; + +#ifndef SQLITE_OMIT_WAL + zFilename = sqlite3PagerFilename(pPager, 1); + + /* Do not allow a transition to journal_mode=WAL for a database + ** in temporary storage or if the VFS does not support shared memory + */ + if( eNew==PAGER_JOURNALMODE_WAL + && (sqlite3Strlen30(zFilename)==0 /* Temp file */ + || !sqlite3PagerWalSupported(pPager)) /* No shared-memory support */ + ){ + eNew = eOld; + } + + if( (eNew!=eOld) + && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL) + ){ + if( !db->autoCommit || db->nVdbeRead>1 ){ + rc = SQLITE_ERROR; + sqlite3VdbeError(p, + "cannot change %s wal mode from within a transaction", + (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") + ); + goto abort_due_to_error; + }else{ + + if( eOld==PAGER_JOURNALMODE_WAL ){ + /* If leaving WAL mode, close the log file. If successful, the call + ** to PagerCloseWal() checkpoints and deletes the write-ahead-log + ** file. An EXCLUSIVE lock may still be held on the database file + ** after a successful return. + */ + rc = sqlite3PagerCloseWal(pPager, db); + if( rc==SQLITE_OK ){ + sqlite3PagerSetJournalMode(pPager, eNew); + } + }else if( eOld==PAGER_JOURNALMODE_MEMORY ){ + /* Cannot transition directly from MEMORY to WAL. Use mode OFF + ** as an intermediate */ + sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF); + } + + /* Open a transaction on the database file. Regardless of the journal + ** mode, this transaction always uses a rollback journal. + */ + assert( sqlite3BtreeTxnState(pBt)!=SQLITE_TXN_WRITE ); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeSetVersion(pBt, (eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); + } + } + } +#endif /* ifndef SQLITE_OMIT_WAL */ + + if( rc ) eNew = eOld; + eNew = sqlite3PagerSetJournalMode(pPager, eNew); + + pOut->flags = MEM_Str|MEM_Static|MEM_Term; + pOut->z = (char *)sqlite3JournalModename(eNew); + pOut->n = sqlite3Strlen30(pOut->z); + pOut->enc = SQLITE_UTF8; + sqlite3VdbeChangeEncoding(pOut, encoding); + if( rc ) goto abort_due_to_error; + break; +}; +#endif /* SQLITE_OMIT_PRAGMA */ + +#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) +/* Opcode: Vacuum P1 P2 * * * +** +** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more +** for an attached database. The "temp" database may not be vacuumed. +** +** If P2 is not zero, then it is a register holding a string which is +** the file into which the result of vacuum should be written. When +** P2 is zero, the vacuum overwrites the original database. +*/ +case OP_Vacuum: { + assert( p->readOnly==0 ); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1, + pOp->p2 ? &aMem[pOp->p2] : 0); + if( rc ) goto abort_due_to_error; + break; +} +#endif + +#if !defined(SQLITE_OMIT_AUTOVACUUM) +/* Opcode: IncrVacuum P1 P2 * * * +** +** Perform a single step of the incremental vacuum procedure on +** the P1 database. If the vacuum has finished, jump to instruction +** P2. Otherwise, fall through to the next instruction. +*/ +case OP_IncrVacuum: { /* jump */ + Btree *pBt; + + assert( pOp->p1>=0 && pOp->p1nDb ); + assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( p->readOnly==0 ); + pBt = db->aDb[pOp->p1].pBt; + rc = sqlite3BtreeIncrVacuum(pBt); + VdbeBranchTaken(rc==SQLITE_DONE,2); + if( rc ){ + if( rc!=SQLITE_DONE ) goto abort_due_to_error; + rc = SQLITE_OK; + goto jump_to_p2; + } + break; +} +#endif + +/* Opcode: Expire P1 P2 * * * +** +** Cause precompiled statements to expire. When an expired statement +** is executed using sqlite3_step() it will either automatically +** reprepare itself (if it was originally created using sqlite3_prepare_v2()) +** or it will fail with SQLITE_SCHEMA. +** +** If P1 is 0, then all SQL statements become expired. If P1 is non-zero, +** then only the currently executing statement is expired. +** +** If P2 is 0, then SQL statements are expired immediately. If P2 is 1, +** then running SQL statements are allowed to continue to run to completion. +** The P2==1 case occurs when a CREATE INDEX or similar schema change happens +** that might help the statement run faster but which does not affect the +** correctness of operation. +*/ +case OP_Expire: { + assert( pOp->p2==0 || pOp->p2==1 ); + if( !pOp->p1 ){ + sqlite3ExpirePreparedStatements(db, pOp->p2); + }else{ + p->expired = pOp->p2+1; + } + break; +} + +/* Opcode: CursorLock P1 * * * * +** +** Lock the btree to which cursor P1 is pointing so that the btree cannot be +** written by an other cursor. +*/ +case OP_CursorLock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorPin(pC->uc.pCursor); + break; +} + +/* Opcode: CursorUnlock P1 * * * * +** +** Unlock the btree to which cursor P1 is pointing so that it can be +** written by other cursors. +*/ +case OP_CursorUnlock: { + VdbeCursor *pC; + assert( pOp->p1>=0 && pOp->p1nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorUnpin(pC->uc.pCursor); + break; +} + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* Opcode: TableLock P1 P2 P3 P4 * +** Synopsis: iDb=P1 root=P2 write=P3 +** +** Obtain a lock on a particular table. This instruction is only used when +** the shared-cache feature is enabled. +** +** P1 is the index of the database in sqlite3.aDb[] of the database +** on which the lock is acquired. A readlock is obtained if P3==0 or +** a write lock if P3==1. +** +** P2 contains the root-page of the table to lock. +** +** P4 contains a pointer to the name of the table being locked. This is only +** used to generate an error message if the lock cannot be obtained. +*/ +case OP_TableLock: { + u8 isWriteLock = (u8)pOp->p3; + if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){ + int p1 = pOp->p1; + assert( p1>=0 && p1nDb ); + assert( DbMaskTest(p->btreeMask, p1) ); + assert( isWriteLock==0 || isWriteLock==1 ); + rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock); + if( rc ){ + if( (rc&0xFF)==SQLITE_LOCKED ){ + const char *z = pOp->p4.z; + sqlite3VdbeError(p, "database table is locked: %s", z); + } + goto abort_due_to_error; + } + } + break; +} +#endif /* SQLITE_OMIT_SHARED_CACHE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VBegin * * * P4 * +** +** P4 may be a pointer to an sqlite3_vtab structure. If so, call the +** xBegin method for that table. +** +** Also, whether or not P4 is set, check that this is not being called from +** within a callback to a virtual table xSync() method. If it is, the error +** code will be set to SQLITE_LOCKED. +*/ +case OP_VBegin: { + VTable *pVTab; + pVTab = pOp->p4.pVtab; + rc = sqlite3VtabBegin(db, pVTab); + if( pVTab ) sqlite3VtabImportErrmsg(p, pVTab->pVtab); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VCreate P1 P2 * * * +** +** P2 is a register that holds the name of a virtual table in database +** P1. Call the xCreate method for that table. +*/ +case OP_VCreate: { + Mem sMem; /* For storing the record being decoded */ + const char *zTab; /* Name of the virtual table */ + + memset(&sMem, 0, sizeof(sMem)); + sMem.db = db; + /* Because P2 is always a static string, it is impossible for the + ** sqlite3VdbeMemCopy() to fail */ + assert( (aMem[pOp->p2].flags & MEM_Str)!=0 ); + assert( (aMem[pOp->p2].flags & MEM_Static)!=0 ); + rc = sqlite3VdbeMemCopy(&sMem, &aMem[pOp->p2]); + assert( rc==SQLITE_OK ); + zTab = (const char*)sqlite3_value_text(&sMem); + assert( zTab || db->mallocFailed ); + if( zTab ){ + rc = sqlite3VtabCallCreate(db, pOp->p1, zTab, &p->zErrMsg); + } + sqlite3VdbeMemRelease(&sMem); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VDestroy P1 * * P4 * +** +** P4 is the name of a virtual table in database P1. Call the xDestroy method +** of that table. +*/ +case OP_VDestroy: { + db->nVDestroy++; + rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); + db->nVDestroy--; + assert( p->errorAction==OE_Abort && p->usesStmtJournal ); + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VOpen P1 * * P4 * +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** P1 is a cursor number. This opcode opens a cursor to the virtual +** table and stores that cursor in P1. +*/ +case OP_VOpen: { + VdbeCursor *pCur; + sqlite3_vtab_cursor *pVCur; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + + assert( p->bIsReader ); + pCur = 0; + pVCur = 0; + pVtab = pOp->p4.pVtab->pVtab; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + rc = pModule->xOpen(pVtab, &pVCur); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + + /* Initialize sqlite3_vtab_cursor base class */ + pVCur->pVtab = pVtab; + + /* Initialize vdbe cursor object */ + pCur = allocateCursor(p, pOp->p1, 0, CURTYPE_VTAB); + if( pCur ){ + pCur->uc.pVCur = pVCur; + pVtab->nRef++; + }else{ + assert( db->mallocFailed ); + pModule->xClose(pVCur); + goto no_mem; + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VInitIn P1 P2 P3 * * +** Synopsis: r[P2]=ValueList(P1,P3) +** +** Set register P2 to be a pointer to a ValueList object for cursor P1 +** with cache register P3 and output register P3+1. This ValueList object +** can be used as the first argument to sqlite3_vtab_in_first() and +** sqlite3_vtab_in_next() to extract all of the values stored in the P1 +** cursor. Register P3 is used to hold the values returned by +** sqlite3_vtab_in_first() and sqlite3_vtab_in_next(). +*/ +case OP_VInitIn: { /* out2 */ + VdbeCursor *pC; /* The cursor containing the RHS values */ + ValueList *pRhs; /* New ValueList object to put in reg[P2] */ + + pC = p->apCsr[pOp->p1]; + pRhs = sqlite3_malloc64( sizeof(*pRhs) ); + if( pRhs==0 ) goto no_mem; + pRhs->pCsr = pC->uc.pCursor; + pRhs->pOut = &aMem[pOp->p3]; + pOut = out2Prerelease(p, pOp); + pOut->flags = MEM_Null; + sqlite3VdbeMemSetPointer(pOut, pRhs, "ValueList", sqlite3_free); + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VFilter P1 P2 P3 P4 * +** Synopsis: iplan=r[P3] zplan='P4' +** +** P1 is a cursor opened using VOpen. P2 is an address to jump to if +** the filtered result set is empty. +** +** P4 is either NULL or a string that was generated by the xBestIndex +** method of the module. The interpretation of the P4 string is left +** to the module implementation. +** +** This opcode invokes the xFilter method on the virtual table specified +** by P1. The integer query plan parameter to xFilter is stored in register +** P3. Register P3+1 stores the argc parameter to be passed to the +** xFilter method. Registers P3+2..P3+1+argc are the argc +** additional parameters which are passed to +** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter. +** +** A jump is made to P2 if the result set after filtering would be empty. +*/ +case OP_VFilter: { /* jump */ + int nArg; + int iQuery; + const sqlite3_module *pModule; + Mem *pQuery; + Mem *pArgc; + sqlite3_vtab_cursor *pVCur; + sqlite3_vtab *pVtab; + VdbeCursor *pCur; + int res; + int i; + Mem **apArg; + + pQuery = &aMem[pOp->p3]; + pArgc = &pQuery[1]; + pCur = p->apCsr[pOp->p1]; + assert( memIsValid(pQuery) ); + REGISTER_TRACE(pOp->p3, pQuery); + assert( pCur!=0 ); + assert( pCur->eCurType==CURTYPE_VTAB ); + pVCur = pCur->uc.pVCur; + pVtab = pVCur->pVtab; + pModule = pVtab->pModule; + + /* Grab the index number and argc parameters */ + assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int ); + nArg = (int)pArgc->u.i; + iQuery = (int)pQuery->u.i; + + /* Invoke the xFilter method */ + apArg = p->apArg; + for(i = 0; ixFilter(pVCur, iQuery, pOp->p4.z, nArg, apArg); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pVCur); + pCur->nullRow = 0; + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VColumn P1 P2 P3 * P5 +** Synopsis: r[P3]=vcolumn(P2) +** +** Store in register P3 the value of the P2-th column of +** the current row of the virtual-table of cursor P1. +** +** If the VColumn opcode is being used to fetch the value of +** an unchanging column during an UPDATE operation, then the P5 +** value is OPFLAG_NOCHNG. This will cause the sqlite3_vtab_nochange() +** function to return true inside the xColumn method of the virtual +** table implementation. The P5 column might also contain other +** bits (OPFLAG_LENGTHARG or OPFLAG_TYPEOFARG) but those bits are +** unused by OP_VColumn. +*/ +case OP_VColumn: { + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + Mem *pDest; + sqlite3_context sContext; + + VdbeCursor *pCur = p->apCsr[pOp->p1]; + assert( pCur!=0 ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); + if( pCur->nullRow ){ + sqlite3VdbeMemSetNull(pDest); + break; + } + assert( pCur->eCurType==CURTYPE_VTAB ); + pVtab = pCur->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xColumn ); + memset(&sContext, 0, sizeof(sContext)); + sContext.pOut = pDest; + sContext.enc = encoding; + assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); + if( pOp->p5 & OPFLAG_NOCHNG ){ + sqlite3VdbeMemSetNull(pDest); + pDest->flags = MEM_Null|MEM_Zero; + pDest->u.nZero = 0; + }else{ + MemSetTypeFlag(pDest, MEM_Null); + } + rc = pModule->xColumn(pCur->uc.pVCur, &sContext, pOp->p2); + sqlite3VtabImportErrmsg(p, pVtab); + if( sContext.isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pDest)); + rc = sContext.isError; + } + sqlite3VdbeChangeEncoding(pDest, encoding); + REGISTER_TRACE(pOp->p3, pDest); + UPDATE_MAX_BLOBSIZE(pDest); + + if( rc ) goto abort_due_to_error; + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VNext P1 P2 * * * +** +** Advance virtual table P1 to the next row in its result set and +** jump to instruction P2. Or, if the virtual table has reached +** the end of its result set, then fall through to the next instruction. +*/ +case OP_VNext: { /* jump */ + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + int res; + VdbeCursor *pCur; + + pCur = p->apCsr[pOp->p1]; + assert( pCur!=0 ); + assert( pCur->eCurType==CURTYPE_VTAB ); + if( pCur->nullRow ){ + break; + } + pVtab = pCur->uc.pVCur->pVtab; + pModule = pVtab->pModule; + assert( pModule->xNext ); + + /* Invoke the xNext() method of the module. There is no way for the + ** underlying implementation to return an error if one occurs during + ** xNext(). Instead, if an error occurs, true is returned (indicating that + ** data is available) and the error code returned when xColumn or + ** some other method is next invoked on the save virtual table cursor. + */ + rc = pModule->xNext(pCur->uc.pVCur); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pCur->uc.pVCur); + VdbeBranchTaken(!res,2); + if( !res ){ + /* If there is data, jump to P2 */ + goto jump_to_p2_and_check_for_interrupt; + } + goto check_for_interrupt; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VRename P1 * * P4 * +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** This opcode invokes the corresponding xRename method. The value +** in register P1 is passed as the zName argument to the xRename method. +*/ +case OP_VRename: { + sqlite3_vtab *pVtab; + Mem *pName; + int isLegacy; + + isLegacy = (db->flags & SQLITE_LegacyAlter); + db->flags |= SQLITE_LegacyAlter; + pVtab = pOp->p4.pVtab->pVtab; + pName = &aMem[pOp->p1]; + assert( pVtab->pModule->xRename ); + assert( memIsValid(pName) ); + assert( p->readOnly==0 ); + REGISTER_TRACE(pOp->p1, pName); + assert( pName->flags & MEM_Str ); + testcase( pName->enc==SQLITE_UTF8 ); + testcase( pName->enc==SQLITE_UTF16BE ); + testcase( pName->enc==SQLITE_UTF16LE ); + rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); + if( rc ) goto abort_due_to_error; + rc = pVtab->pModule->xRename(pVtab, pName->z); + if( isLegacy==0 ) db->flags &= ~(u64)SQLITE_LegacyAlter; + sqlite3VtabImportErrmsg(p, pVtab); + p->expired = 0; + if( rc ) goto abort_due_to_error; + break; +} +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VUpdate P1 P2 P3 P4 P5 +** Synopsis: data=r[P3@P2] +** +** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. +** This opcode invokes the corresponding xUpdate method. P2 values +** are contiguous memory cells starting at P3 to pass to the xUpdate +** invocation. The value in register (P3+P2-1) corresponds to the +** p2th element of the argv array passed to xUpdate. +** +** The xUpdate method will do a DELETE or an INSERT or both. +** The argv[0] element (which corresponds to memory cell P3) +** is the rowid of a row to delete. If argv[0] is NULL then no +** deletion occurs. The argv[1] element is the rowid of the new +** row. This can be NULL to have the virtual table select the new +** rowid for itself. The subsequent elements in the array are +** the values of columns in the new row. +** +** If P2==1 then no insert is performed. argv[0] is the rowid of +** a row to delete. +** +** P1 is a boolean flag. If it is set to true and the xUpdate call +** is successful, then the value returned by sqlite3_last_insert_rowid() +** is set to the value of the rowid for the row just inserted. +** +** P5 is the error actions (OE_Replace, OE_Fail, OE_Ignore, etc) to +** apply in the case of a constraint failure on an insert or update. +*/ +case OP_VUpdate: { + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + int nArg; + int i; + sqlite_int64 rowid = 0; + Mem **apArg; + Mem *pX; + + assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback + || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace + ); + assert( p->readOnly==0 ); + if( db->mallocFailed ) goto no_mem; + sqlite3VdbeIncrWriteCounter(p, 0); + pVtab = pOp->p4.pVtab->pVtab; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + nArg = pOp->p2; + assert( pOp->p4type==P4_VTAB ); + if( ALWAYS(pModule->xUpdate) ){ + u8 vtabOnConflict = db->vtabOnConflict; + apArg = p->apArg; + pX = &aMem[pOp->p3]; + for(i=0; ivtabOnConflict = pOp->p5; + rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); + db->vtabOnConflict = vtabOnConflict; + sqlite3VtabImportErrmsg(p, pVtab); + if( rc==SQLITE_OK && pOp->p1 ){ + assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) ); + db->lastRowid = rowid; + } + if( (rc&0xff)==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ + if( pOp->p5==OE_Ignore ){ + rc = SQLITE_OK; + }else{ + p->errorAction = ((pOp->p5==OE_Replace) ? OE_Abort : pOp->p5); + } + }else{ + p->nChange++; + } + if( rc ) goto abort_due_to_error; + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* Opcode: Pagecount P1 P2 * * * +** +** Write the current number of pages in database P1 to memory cell P2. +*/ +case OP_Pagecount: { /* out2 */ + pOut = out2Prerelease(p, pOp); + pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt); + break; +} +#endif + + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* Opcode: MaxPgcnt P1 P2 P3 * * +** +** Try to set the maximum page count for database P1 to the value in P3. +** Do not let the maximum page count fall below the current page count and +** do not change the maximum page count value if P3==0. +** +** Store the maximum page count after the change in register P2. +*/ +case OP_MaxPgcnt: { /* out2 */ + unsigned int newMax; + Btree *pBt; + + pOut = out2Prerelease(p, pOp); + pBt = db->aDb[pOp->p1].pBt; + newMax = 0; + if( pOp->p3 ){ + newMax = sqlite3BtreeLastPage(pBt); + if( newMax < (unsigned)pOp->p3 ) newMax = (unsigned)pOp->p3; + } + pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax); + break; +} +#endif + +/* Opcode: Function P1 P2 P3 P4 * +** Synopsis: r[P3]=func(r[P2@NP]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** See also: AggStep, AggFinal, PureFunc +*/ +/* Opcode: PureFunc P1 P2 P3 P4 * +** Synopsis: r[P3]=func(r[P2@NP]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** This opcode works exactly like OP_Function. The only difference is in +** its name. This opcode is used in places where the function must be +** purely non-deterministic. Some built-in date/time functions can be +** either determinitic of non-deterministic, depending on their arguments. +** When those function are used in a non-deterministic way, they will check +** to see if they were called using OP_PureFunc instead of OP_Function, and +** if they were, they throw an error. +** +** See also: AggStep, AggFinal, Function +*/ +case OP_PureFunc: /* group */ +case OP_Function: { /* group */ + int i; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + pOut = &aMem[pOp->p3]; + if( pCtx->pOut != pOut ){ + pCtx->pVdbe = p; + pCtx->pOut = pOut; + pCtx->enc = encoding; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + assert( pCtx->pVdbe==p ); + + memAboutToChange(p, pOut); +#ifdef SQLITE_DEBUG + for(i=0; iargc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + MemSetTypeFlag(pOut, MEM_Null); + assert( pCtx->isError==0 ); + (*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */ + + /* If the function returned an error, throw an exception */ + if( pCtx->isError ){ + if( pCtx->isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pOut)); + rc = pCtx->isError; + } + sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1); + pCtx->isError = 0; + if( rc ) goto abort_due_to_error; + } + + assert( (pOut->flags&MEM_Str)==0 + || pOut->enc==encoding + || db->mallocFailed ); + assert( !sqlite3VdbeMemTooBig(pOut) ); + + REGISTER_TRACE(pOp->p3, pOut); + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: ClrSubtype P1 * * * * +** Synopsis: r[P1].subtype = 0 +** +** Clear the subtype from register P1. +*/ +case OP_ClrSubtype: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + pIn1->flags &= ~MEM_Subtype; + break; +} + +/* Opcode: FilterAdd P1 * P3 P4 * +** Synopsis: filter(P1) += key(P3@P4) +** +** Compute a hash on the P4 registers starting with r[P3] and +** add that hash to the bloom filter contained in r[P1]. +*/ +case OP_FilterAdd: { + u64 h; + + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags & MEM_Blob ); + assert( pIn1->n>0 ); + h = filterHash(aMem, pOp); +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + int ii; + for(ii=pOp->p3; iip3+pOp->p4.i; ii++){ + registerTrace(ii, &aMem[ii]); + } + printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n)); + } +#endif + h %= pIn1->n; + pIn1->z[h/8] |= 1<<(h&7); + break; +} + +/* Opcode: Filter P1 P2 P3 P4 * +** Synopsis: if key(P3@P4) not in filter(P1) goto P2 +** +** Compute a hash on the key contained in the P4 registers starting +** with r[P3]. Check to see if that hash is found in the +** bloom filter hosted by register P1. If it is not present then +** maybe jump to P2. Otherwise fall through. +** +** False negatives are harmless. It is always safe to fall through, +** even if the value is in the bloom filter. A false negative causes +** more CPU cycles to be used, but it should still yield the correct +** answer. However, an incorrect answer may well arise from a +** false positive - if the jump is taken when it should fall through. +*/ +case OP_Filter: { /* jump */ + u64 h; + + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Blob)!=0 ); + assert( pIn1->n >= 1 ); + h = filterHash(aMem, pOp); +#ifdef SQLITE_DEBUG + if( db->flags&SQLITE_VdbeTrace ){ + int ii; + for(ii=pOp->p3; iip3+pOp->p4.i; ii++){ + registerTrace(ii, &aMem[ii]); + } + printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n)); + } +#endif + h %= pIn1->n; + if( (pIn1->z[h/8] & (1<<(h&7)))==0 ){ + VdbeBranchTaken(1, 2); + p->aCounter[SQLITE_STMTSTATUS_FILTER_HIT]++; + goto jump_to_p2; + }else{ + p->aCounter[SQLITE_STMTSTATUS_FILTER_MISS]++; + VdbeBranchTaken(0, 2); + } + break; +} + +/* Opcode: Trace P1 P2 * P4 * +** +** Write P4 on the statement trace output if statement tracing is +** enabled. +** +** Operand P1 must be 0x7fffffff and P2 must positive. +*/ +/* Opcode: Init P1 P2 P3 P4 * +** Synopsis: Start at P2 +** +** Programs contain a single instance of this opcode as the very first +** opcode. +** +** If tracing is enabled (by the sqlite3_trace()) interface, then +** the UTF-8 string contained in P4 is emitted on the trace callback. +** Or if P4 is blank, use the string returned by sqlite3_sql(). +** +** If P2 is not zero, jump to instruction P2. +** +** Increment the value of P1 so that OP_Once opcodes will jump the +** first time they are evaluated for this run. +** +** If P3 is not zero, then it is an address to jump to if an SQLITE_CORRUPT +** error is encountered. +*/ +case OP_Trace: +case OP_Init: { /* jump */ + int i; +#ifndef SQLITE_OMIT_TRACE + char *zTrace; +#endif + + /* If the P4 argument is not NULL, then it must be an SQL comment string. + ** The "--" string is broken up to prevent false-positives with srcck1.c. + ** + ** This assert() provides evidence for: + ** EVIDENCE-OF: R-50676-09860 The callback can compute the same text that + ** would have been returned by the legacy sqlite3_trace() interface by + ** using the X argument when X begins with "--" and invoking + ** sqlite3_expanded_sql(P) otherwise. + */ + assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 ); + + /* OP_Init is always instruction 0 */ + assert( pOp==p->aOp || pOp->opcode==OP_Trace ); + +#ifndef SQLITE_OMIT_TRACE + if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0 + && p->minWriteFileFormat!=254 /* tag-20220401a */ + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ +#ifndef SQLITE_OMIT_DEPRECATED + if( db->mTrace & SQLITE_TRACE_LEGACY ){ + char *z = sqlite3VdbeExpandSql(p, zTrace); + db->trace.xLegacy(db->pTraceArg, z); + sqlite3_free(z); + }else +#endif + if( db->nVdbeExec>1 ){ + char *z = sqlite3MPrintf(db, "-- %s", zTrace); + (void)db->trace.xV2(SQLITE_TRACE_STMT, db->pTraceArg, p, z); + sqlite3DbFree(db, z); + }else{ + (void)db->trace.xV2(SQLITE_TRACE_STMT, db->pTraceArg, p, zTrace); + } + } +#ifdef SQLITE_USE_FCNTL_TRACE + zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); + if( zTrace ){ + int j; + for(j=0; jnDb; j++){ + if( DbMaskTest(p->btreeMask, j)==0 ) continue; + sqlite3_file_control(db, db->aDb[j].zDbSName, SQLITE_FCNTL_TRACE, zTrace); + } + } +#endif /* SQLITE_USE_FCNTL_TRACE */ +#ifdef SQLITE_DEBUG + if( (db->flags & SQLITE_SqlTrace)!=0 + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ + sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); + } +#endif /* SQLITE_DEBUG */ +#endif /* SQLITE_OMIT_TRACE */ + assert( pOp->p2>0 ); + if( pOp->p1>=sqlite3GlobalConfig.iOnceResetThreshold ){ + if( pOp->opcode==OP_Trace ) break; + for(i=1; inOp; i++){ + if( p->aOp[i].opcode==OP_Once ) p->aOp[i].p1 = 0; + } + pOp->p1 = 0; + } + pOp->p1++; + p->aCounter[SQLITE_STMTSTATUS_RUN]++; + goto jump_to_p2; +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* Opcode: CursorHint P1 * * P4 * +** +** Provide a hint to cursor P1 that it only needs to return rows that +** satisfy the Expr in P4. TK_REGISTER terms in the P4 expression refer +** to values currently held in registers. TK_COLUMN terms in the P4 +** expression refer to columns in the b-tree to which cursor P1 is pointing. +*/ +case OP_CursorHint: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_EXPR ); + pC = p->apCsr[pOp->p1]; + if( pC ){ + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorHint(pC->uc.pCursor, BTREE_HINT_RANGE, + pOp->p4.pExpr, aMem); + } + break; +} +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +#ifdef SQLITE_DEBUG +/* Opcode: Abortable * * * * * +** +** Verify that an Abort can happen. Assert if an Abort at this point +** might cause database corruption. This opcode only appears in debugging +** builds. +** +** An Abort is safe if either there have been no writes, or if there is +** an active statement journal. +*/ +case OP_Abortable: { + sqlite3VdbeAssertAbortable(p); + break; +} +#endif + +#ifdef SQLITE_DEBUG +/* Opcode: ReleaseReg P1 P2 P3 * P5 +** Synopsis: release r[P1@P2] mask P3 +** +** Release registers from service. Any content that was in the +** the registers is unreliable after this opcode completes. +** +** The registers released will be the P2 registers starting at P1, +** except if bit ii of P3 set, then do not release register P1+ii. +** In other words, P3 is a mask of registers to preserve. +** +** Releasing a register clears the Mem.pScopyFrom pointer. That means +** that if the content of the released register was set using OP_SCopy, +** a change to the value of the source register for the OP_SCopy will no longer +** generate an assertion fault in sqlite3VdbeMemAboutToChange(). +** +** If P5 is set, then all released registers have their type set +** to MEM_Undefined so that any subsequent attempt to read the released +** register (before it is reinitialized) will generate an assertion fault. +** +** P5 ought to be set on every call to this opcode. +** However, there are places in the code generator will release registers +** before their are used, under the (valid) assumption that the registers +** will not be reallocated for some other purpose before they are used and +** hence are safe to release. +** +** This opcode is only available in testing and debugging builds. It is +** not generated for release builds. The purpose of this opcode is to help +** validate the generated bytecode. This opcode does not actually contribute +** to computing an answer. +*/ +case OP_ReleaseReg: { + Mem *pMem; + int i; + u32 constMask; + assert( pOp->p1>0 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); + pMem = &aMem[pOp->p1]; + constMask = pOp->p3; + for(i=0; ip2; i++, pMem++){ + if( i>=32 || (constMask & MASKBIT32(i))==0 ){ + pMem->pScopyFrom = 0; + if( i<32 && pOp->p5 ) MemSetTypeFlag(pMem, MEM_Undefined); + } + } + break; +} +#endif + +/* Opcode: Noop * * * * * +** +** Do nothing. This instruction is often useful as a jump +** destination. +*/ +/* +** The magic Explain opcode are only inserted when explain==2 (which +** is to say when the EXPLAIN QUERY PLAN syntax is used.) +** This opcode records information from the optimizer. It is the +** the same as a no-op. This opcodesnever appears in a real VM program. +*/ +default: { /* This is really OP_Noop, OP_Explain */ + assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain ); + + break; +} + +/***************************************************************************** +** The cases of the switch statement above this line should all be indented +** by 6 spaces. But the left-most 6 spaces have been removed to improve the +** readability. From this point on down, the normal indentation rules are +** restored. +*****************************************************************************/ + } + +#ifdef VDBE_PROFILE + { + u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); + if( endTime>start ) pOrigOp->cycles += endTime - start; + pOrigOp->cnt++; + } +#endif + + /* The following code adds nothing to the actual functionality + ** of the program. It is only here for testing and debugging. + ** On the other hand, it does burn CPU cycles every time through + ** the evaluator loop. So we can leave it out when NDEBUG is defined. + */ +#ifndef NDEBUG + assert( pOp>=&aOp[-1] && pOp<&aOp[p->nOp-1] ); + +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + u8 opProperty = sqlite3OpcodeProperty[pOrigOp->opcode]; + if( rc!=0 ) printf("rc=%d\n",rc); + if( opProperty & (OPFLG_OUT2) ){ + registerTrace(pOrigOp->p2, &aMem[pOrigOp->p2]); + } + if( opProperty & OPFLG_OUT3 ){ + registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); + } + if( opProperty==0xff ){ + /* Never happens. This code exists to avoid a harmless linkage + ** warning aboud sqlite3VdbeRegisterDump() being defined but not + ** used. */ + sqlite3VdbeRegisterDump(p); + } + } +#endif /* SQLITE_DEBUG */ +#endif /* NDEBUG */ + } /* The end of the for(;;) loop the loops through opcodes */ + + /* If we reach this point, it means that execution is finished with + ** an error of some kind. + */ +abort_due_to_error: + if( db->mallocFailed ){ + rc = SQLITE_NOMEM_BKPT; + }else if( rc==SQLITE_IOERR_CORRUPTFS ){ + rc = SQLITE_CORRUPT_BKPT; + } + assert( rc ); +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + const char *zTrace = p->zSql; + if( zTrace==0 ){ + if( aOp[0].opcode==OP_Trace ){ + zTrace = aOp[0].p4.z; + } + if( zTrace==0 ) zTrace = "???"; + } + printf("ABORT-due-to-error (rc=%d): %s\n", rc, zTrace); + } +#endif + if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + } + p->rc = rc; + sqlite3SystemError(db, rc); + testcase( sqlite3GlobalConfig.xLog!=0 ); + sqlite3_log(rc, "statement aborts at %d: [%s] %s", + (int)(pOp - aOp), p->zSql, p->zErrMsg); + if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); + if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); + if( rc==SQLITE_CORRUPT && db->autoCommit==0 ){ + db->flags |= SQLITE_CorruptRdOnly; + } + rc = SQLITE_ERROR; + if( resetSchemaOnFault>0 ){ + sqlite3ResetOneSchema(db, resetSchemaOnFault-1); + } + + /* This is the only way out of this procedure. We have to + ** release the mutexes on btrees that were acquired at the + ** top. */ +vdbe_return: +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + nProgressLimit += db->nProgressOps; + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = LARGEST_UINT64; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif + p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; + sqlite3VdbeLeave(p); + assert( rc!=SQLITE_OK || nExtraDelete==0 + || sqlite3_strlike("DELETE%",p->zSql,0)!=0 + ); + return rc; + + /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH + ** is encountered. + */ +too_big: + sqlite3VdbeError(p, "string or blob too big"); + rc = SQLITE_TOOBIG; + goto abort_due_to_error; + + /* Jump to here if a malloc() fails. + */ +no_mem: + sqlite3OomFault(db); + sqlite3VdbeError(p, "out of memory"); + rc = SQLITE_NOMEM_BKPT; + goto abort_due_to_error; + + /* Jump to here if the sqlite3_interrupt() API sets the interrupt + ** flag. + */ +abort_due_to_interrupt: + assert( AtomicLoad(&db->u1.isInterrupted) ); + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; +} + + +/************** End of vdbe.c ************************************************/ +/************** Begin file vdbeblob.c ****************************************/ +/* +** 2007 May 1 +** +** 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 contains code used to implement incremental BLOB I/O. +*/ + +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#ifndef SQLITE_OMIT_INCRBLOB + +/* +** Valid sqlite3_blob* handles point to Incrblob structures. +*/ +typedef struct Incrblob Incrblob; +struct Incrblob { + int nByte; /* Size of open blob, in bytes */ + int iOffset; /* Byte offset of blob in cursor data */ + u16 iCol; /* Table column this handle is open on */ + BtCursor *pCsr; /* Cursor pointing at blob row */ + sqlite3_stmt *pStmt; /* Statement holding cursor open */ + sqlite3 *db; /* The associated database */ + char *zDb; /* Database name */ + Table *pTab; /* Table object */ +}; + + +/* +** This function is used by both blob_open() and blob_reopen(). It seeks +** the b-tree cursor associated with blob handle p to point to row iRow. +** If successful, SQLITE_OK is returned and subsequent calls to +** sqlite3_blob_read() or sqlite3_blob_write() access the specified row. +** +** If an error occurs, or if the specified row does not exist or does not +** contain a value of type TEXT or BLOB in the column nominated when the +** blob handle was opened, then an error code is returned and *pzErr may +** be set to point to a buffer containing an error message. It is the +** responsibility of the caller to free the error message buffer using +** sqlite3DbFree(). +** +** If an error does occur, then the b-tree cursor is closed. All subsequent +** calls to sqlite3_blob_read(), blob_write() or blob_reopen() will +** immediately return SQLITE_ABORT. +*/ +static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ + int rc; /* Error code */ + char *zErr = 0; /* Error message */ + Vdbe *v = (Vdbe *)p->pStmt; + + /* Set the value of register r[1] in the SQL statement to integer iRow. + ** This is done directly as a performance optimization + */ + v->aMem[1].flags = MEM_Int; + v->aMem[1].u.i = iRow; + + /* If the statement has been run before (and is paused at the OP_ResultRow) + ** then back it up to the point where it does the OP_NotExists. This could + ** have been down with an extra OP_Goto, but simply setting the program + ** counter is faster. */ + if( v->pc>4 ){ + v->pc = 4; + assert( v->aOp[v->pc].opcode==OP_NotExists ); + rc = sqlite3VdbeExec(v); + }else{ + rc = sqlite3_step(p->pStmt); + } + if( rc==SQLITE_ROW ){ + VdbeCursor *pC = v->apCsr[0]; + u32 type; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0; + testcase( pC->nHdrParsed==p->iCol ); + testcase( pC->nHdrParsed==p->iCol+1 ); + if( type<12 ){ + zErr = sqlite3MPrintf(p->db, "cannot open value of type %s", + type==0?"null": type==7?"real": "integer" + ); + rc = SQLITE_ERROR; + sqlite3_finalize(p->pStmt); + p->pStmt = 0; + }else{ + p->iOffset = pC->aType[p->iCol + pC->nField]; + p->nByte = sqlite3VdbeSerialTypeLen(type); + p->pCsr = pC->uc.pCursor; + sqlite3BtreeIncrblobCursor(p->pCsr); + } + } + + if( rc==SQLITE_ROW ){ + rc = SQLITE_OK; + }else if( p->pStmt ){ + rc = sqlite3_finalize(p->pStmt); + p->pStmt = 0; + if( rc==SQLITE_OK ){ + zErr = sqlite3MPrintf(p->db, "no such rowid: %lld", iRow); + rc = SQLITE_ERROR; + }else{ + zErr = sqlite3MPrintf(p->db, "%s", sqlite3_errmsg(p->db)); + } + } + + assert( rc!=SQLITE_OK || zErr==0 ); + assert( rc!=SQLITE_ROW && rc!=SQLITE_DONE ); + + *pzErr = zErr; + return rc; +} + +/* +** Open a blob handle. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3* db, /* The database connection */ + const char *zDb, /* The attached database containing the blob */ + const char *zTable, /* The table containing the blob */ + const char *zColumn, /* The column containing the blob */ + sqlite_int64 iRow, /* The row containing the glob */ + int wrFlag, /* True -> read/write access, false -> read-only */ + sqlite3_blob **ppBlob /* Handle for accessing the blob returned here */ +){ + int nAttempt = 0; + int iCol; /* Index of zColumn in row-record */ + int rc = SQLITE_OK; + char *zErr = 0; + Table *pTab; + Incrblob *pBlob = 0; + Parse sParse; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppBlob==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + *ppBlob = 0; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + wrFlag = !!wrFlag; /* wrFlag = (wrFlag ? 1 : 0); */ + + sqlite3_mutex_enter(db->mutex); + + pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); + while(1){ + sqlite3ParseObjectInit(&sParse,db); + if( !pBlob ) goto blob_open_out; + sqlite3DbFree(db, zErr); + zErr = 0; + + sqlite3BtreeEnterAll(db); + pTab = sqlite3LocateTable(&sParse, 0, zTable, zDb); + if( pTab && IsVirtual(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open virtual table: %s", zTable); + } + if( pTab && !HasRowid(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable); + } +#ifndef SQLITE_OMIT_VIEW + if( pTab && IsView(pTab) ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable); + } +#endif + if( !pTab ){ + if( sParse.zErrMsg ){ + sqlite3DbFree(db, zErr); + zErr = sParse.zErrMsg; + sParse.zErrMsg = 0; + } + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + pBlob->pTab = pTab; + pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName; + + /* Now search pTab for the exact column. */ + for(iCol=0; iColnCol; iCol++) { + if( sqlite3StrICmp(pTab->aCol[iCol].zCnName, zColumn)==0 ){ + break; + } + } + if( iCol==pTab->nCol ){ + sqlite3DbFree(db, zErr); + zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn); + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + + /* If the value is being opened for writing, check that the + ** column is not indexed, and that it is not part of a foreign key. + */ + if( wrFlag ){ + const char *zFault = 0; + Index *pIdx; +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( db->flags&SQLITE_ForeignKeys ){ + /* Check that the column is not part of an FK child key definition. It + ** is not necessary to check if it is part of a parent key, as parent + ** key columns must be indexed. The check below will pick up this + ** case. */ + FKey *pFKey; + assert( IsOrdinaryTable(pTab) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ + int j; + for(j=0; jnCol; j++){ + if( pFKey->aCol[j].iFrom==iCol ){ + zFault = "foreign key"; + } + } + } + } +#endif + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int j; + for(j=0; jnKeyCol; j++){ + /* FIXME: Be smarter about indexes that use expressions */ + if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==XN_EXPR ){ + zFault = "indexed"; + } + } + } + if( zFault ){ + sqlite3DbFree(db, zErr); + zErr = sqlite3MPrintf(db, "cannot open %s column for writing", zFault); + rc = SQLITE_ERROR; + sqlite3BtreeLeaveAll(db); + goto blob_open_out; + } + } + + pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(&sParse); + assert( pBlob->pStmt || db->mallocFailed ); + if( pBlob->pStmt ){ + + /* This VDBE program seeks a btree cursor to the identified + ** db/table/row entry. The reason for using a vdbe program instead + ** of writing code to use the b-tree layer directly is that the + ** vdbe program will take advantage of the various transaction, + ** locking and error handling infrastructure built into the vdbe. + ** + ** After seeking the cursor, the vdbe executes an OP_ResultRow. + ** Code external to the Vdbe then "borrows" the b-tree cursor and + ** uses it to implement the blob_read(), blob_write() and + ** blob_bytes() functions. + ** + ** The sqlite3_blob_close() function finalizes the vdbe program, + ** which closes the b-tree cursor and (possibly) commits the + ** transaction. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList openBlob[] = { + {OP_TableLock, 0, 0, 0}, /* 0: Acquire a read or write lock */ + {OP_OpenRead, 0, 0, 0}, /* 1: Open a cursor */ + /* blobSeekToRow() will initialize r[1] to the desired rowid */ + {OP_NotExists, 0, 5, 1}, /* 2: Seek the cursor to rowid=r[1] */ + {OP_Column, 0, 0, 1}, /* 3 */ + {OP_ResultRow, 1, 0, 0}, /* 4 */ + {OP_Halt, 0, 0, 0}, /* 5 */ + }; + Vdbe *v = (Vdbe *)pBlob->pStmt; + int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + VdbeOp *aOp; + + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, + pTab->pSchema->schema_cookie, + pTab->pSchema->iGeneration); + sqlite3VdbeChangeP5(v, 1); + assert( sqlite3VdbeCurrentAddr(v)==2 || db->mallocFailed ); + aOp = sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); + + /* Make sure a mutex is held on the table to be accessed */ + sqlite3VdbeUsesBtree(v, iDb); + + if( db->mallocFailed==0 ){ + assert( aOp!=0 ); + /* Configure the OP_TableLock instruction */ +#ifdef SQLITE_OMIT_SHARED_CACHE + aOp[0].opcode = OP_Noop; +#else + aOp[0].p1 = iDb; + aOp[0].p2 = pTab->tnum; + aOp[0].p3 = wrFlag; + sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT); + } + if( db->mallocFailed==0 ){ +#endif + + /* Remove either the OP_OpenWrite or OpenRead. Set the P2 + ** parameter of the other to pTab->tnum. */ + if( wrFlag ) aOp[1].opcode = OP_OpenWrite; + aOp[1].p2 = pTab->tnum; + aOp[1].p3 = iDb; + + /* Configure the number of columns. Configure the cursor to + ** think that the table has one more column than it really + ** does. An OP_Column to retrieve this imaginary column will + ** always return an SQL NULL. This is useful because it means + ** we can invoke OP_Column to fill in the vdbe cursors type + ** and offset cache without causing any IO. + */ + aOp[1].p4type = P4_INT32; + aOp[1].p4.i = pTab->nCol+1; + aOp[3].p2 = pTab->nCol; + + sParse.nVar = 0; + sParse.nMem = 1; + sParse.nTab = 1; + sqlite3VdbeMakeReady(v, &sParse); + } + } + + pBlob->iCol = iCol; + pBlob->db = db; + sqlite3BtreeLeaveAll(db); + if( db->mallocFailed ){ + goto blob_open_out; + } + rc = blobSeekToRow(pBlob, iRow, &zErr); + if( (++nAttempt)>=SQLITE_MAX_SCHEMA_RETRY || rc!=SQLITE_SCHEMA ) break; + sqlite3ParseObjectReset(&sParse); + } + +blob_open_out: + if( rc==SQLITE_OK && db->mallocFailed==0 ){ + *ppBlob = (sqlite3_blob *)pBlob; + }else{ + if( pBlob && pBlob->pStmt ) sqlite3VdbeFinalize((Vdbe *)pBlob->pStmt); + sqlite3DbFree(db, pBlob); + } + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + sqlite3ParseObjectReset(&sParse); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Close a blob handle that was previously created using +** sqlite3_blob_open(). +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){ + Incrblob *p = (Incrblob *)pBlob; + int rc; + sqlite3 *db; + + if( p ){ + sqlite3_stmt *pStmt = p->pStmt; + db = p->db; + sqlite3_mutex_enter(db->mutex); + sqlite3DbFree(db, p); + sqlite3_mutex_leave(db->mutex); + rc = sqlite3_finalize(pStmt); + }else{ + rc = SQLITE_OK; + } + return rc; +} + +/* +** Perform a read or write operation on a blob +*/ +static int blobReadWrite( + sqlite3_blob *pBlob, + void *z, + int n, + int iOffset, + int (*xCall)(BtCursor*, u32, u32, void*) +){ + int rc; + Incrblob *p = (Incrblob *)pBlob; + Vdbe *v; + sqlite3 *db; + + if( p==0 ) return SQLITE_MISUSE_BKPT; + db = p->db; + sqlite3_mutex_enter(db->mutex); + v = (Vdbe*)p->pStmt; + + if( n<0 || iOffset<0 || ((sqlite3_int64)iOffset+n)>p->nByte ){ + /* Request is out of range. Return a transient error. */ + rc = SQLITE_ERROR; + }else if( v==0 ){ + /* If there is no statement handle, then the blob-handle has + ** already been invalidated. Return SQLITE_ABORT in this case. + */ + rc = SQLITE_ABORT; + }else{ + /* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is + ** returned, clean-up the statement handle. + */ + assert( db == v->db ); + sqlite3BtreeEnterCursor(p->pCsr); + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( xCall==sqlite3BtreePutData && db->xPreUpdateCallback ){ + /* If a pre-update hook is registered and this is a write cursor, + ** invoke it here. + ** + ** TODO: The preupdate-hook is passed SQLITE_DELETE, even though this + ** operation should really be an SQLITE_UPDATE. This is probably + ** incorrect, but is convenient because at this point the new.* values + ** are not easily obtainable. And for the sessions module, an + ** SQLITE_UPDATE where the PK columns do not change is handled in the + ** same way as an SQLITE_DELETE (the SQLITE_DELETE code is actually + ** slightly more efficient). Since you cannot write to a PK column + ** using the incremental-blob API, this works. For the sessions module + ** anyhow. + */ + sqlite3_int64 iKey; + iKey = sqlite3BtreeIntegerKey(p->pCsr); + assert( v->apCsr[0]!=0 ); + assert( v->apCsr[0]->eCurType==CURTYPE_BTREE ); + sqlite3VdbePreUpdateHook( + v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1, p->iCol + ); + } +#endif + + rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); + sqlite3BtreeLeaveCursor(p->pCsr); + if( rc==SQLITE_ABORT ){ + sqlite3VdbeFinalize(v); + p->pStmt = 0; + }else{ + v->rc = rc; + } + } + sqlite3Error(db, rc); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Read data from a blob handle. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){ + return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreePayloadChecked); +} + +/* +** Write data to a blob handle. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *pBlob, const void *z, int n, int iOffset){ + return blobReadWrite(pBlob, (void *)z, n, iOffset, sqlite3BtreePutData); +} + +/* +** Query a blob handle for the size of the data. +** +** The Incrblob.nByte field is fixed for the lifetime of the Incrblob +** so no mutex is required for access. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ + Incrblob *p = (Incrblob *)pBlob; + return (p && p->pStmt) ? p->nByte : 0; +} + +/* +** Move an existing blob handle to point to a different row of the same +** database table. +** +** If an error occurs, or if the specified row does not exist or does not +** contain a blob or text value, then an error code is returned and the +** database handle error code and message set. If this happens, then all +** subsequent calls to sqlite3_blob_xxx() functions (except blob_close()) +** immediately return SQLITE_ABORT. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ + int rc; + Incrblob *p = (Incrblob *)pBlob; + sqlite3 *db; + + if( p==0 ) return SQLITE_MISUSE_BKPT; + db = p->db; + sqlite3_mutex_enter(db->mutex); + + if( p->pStmt==0 ){ + /* If there is no statement handle, then the blob-handle has + ** already been invalidated. Return SQLITE_ABORT in this case. + */ + rc = SQLITE_ABORT; + }else{ + char *zErr; + ((Vdbe*)p->pStmt)->rc = SQLITE_OK; + rc = blobSeekToRow(p, iRow, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + } + assert( rc!=SQLITE_SCHEMA ); + } + + rc = sqlite3ApiExit(db, rc); + assert( rc==SQLITE_OK || p->pStmt==0 ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#endif /* #ifndef SQLITE_OMIT_INCRBLOB */ + +/************** End of vdbeblob.c ********************************************/ +/************** Begin file vdbesort.c ****************************************/ +/* +** 2011-07-09 +** +** 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 contains code for the VdbeSorter object, used in concert with +** a VdbeCursor to sort large numbers of keys for CREATE INDEX statements +** or by SELECT statements with ORDER BY clauses that cannot be satisfied +** using indexes and without LIMIT clauses. +** +** The VdbeSorter object implements a multi-threaded external merge sort +** algorithm that is efficient even if the number of elements being sorted +** exceeds the available memory. +** +** Here is the (internal, non-API) interface between this module and the +** rest of the SQLite system: +** +** sqlite3VdbeSorterInit() Create a new VdbeSorter object. +** +** sqlite3VdbeSorterWrite() Add a single new row to the VdbeSorter +** object. The row is a binary blob in the +** OP_MakeRecord format that contains both +** the ORDER BY key columns and result columns +** in the case of a SELECT w/ ORDER BY, or +** the complete record for an index entry +** in the case of a CREATE INDEX. +** +** sqlite3VdbeSorterRewind() Sort all content previously added. +** Position the read cursor on the +** first sorted element. +** +** sqlite3VdbeSorterNext() Advance the read cursor to the next sorted +** element. +** +** sqlite3VdbeSorterRowkey() Return the complete binary blob for the +** row currently under the read cursor. +** +** sqlite3VdbeSorterCompare() Compare the binary blob for the row +** currently under the read cursor against +** another binary blob X and report if +** X is strictly less than the read cursor. +** Used to enforce uniqueness in a +** CREATE UNIQUE INDEX statement. +** +** sqlite3VdbeSorterClose() Close the VdbeSorter object and reclaim +** all resources. +** +** sqlite3VdbeSorterReset() Refurbish the VdbeSorter for reuse. This +** is like Close() followed by Init() only +** much faster. +** +** The interfaces above must be called in a particular order. Write() can +** only occur in between Init()/Reset() and Rewind(). Next(), Rowkey(), and +** Compare() can only occur in between Rewind() and Close()/Reset(). i.e. +** +** Init() +** for each record: Write() +** Rewind() +** Rowkey()/Compare() +** Next() +** Close() +** +** Algorithm: +** +** Records passed to the sorter via calls to Write() are initially held +** unsorted in main memory. Assuming the amount of memory used never exceeds +** a threshold, when Rewind() is called the set of records is sorted using +** an in-memory merge sort. In this case, no temporary files are required +** and subsequent calls to Rowkey(), Next() and Compare() read records +** directly from main memory. +** +** If the amount of space used to store records in main memory exceeds the +** threshold, then the set of records currently in memory are sorted and +** written to a temporary file in "Packed Memory Array" (PMA) format. +** A PMA created at this point is known as a "level-0 PMA". Higher levels +** of PMAs may be created by merging existing PMAs together - for example +** merging two or more level-0 PMAs together creates a level-1 PMA. +** +** The threshold for the amount of main memory to use before flushing +** records to a PMA is roughly the same as the limit configured for the +** page-cache of the main database. Specifically, the threshold is set to +** the value returned by "PRAGMA main.page_size" multipled by +** that returned by "PRAGMA main.cache_size", in bytes. +** +** If the sorter is running in single-threaded mode, then all PMAs generated +** are appended to a single temporary file. Or, if the sorter is running in +** multi-threaded mode then up to (N+1) temporary files may be opened, where +** N is the configured number of worker threads. In this case, instead of +** sorting the records and writing the PMA to a temporary file itself, the +** calling thread usually launches a worker thread to do so. Except, if +** there are already N worker threads running, the main thread does the work +** itself. +** +** The sorter is running in multi-threaded mode if (a) the library was built +** with pre-processor symbol SQLITE_MAX_WORKER_THREADS set to a value greater +** than zero, and (b) worker threads have been enabled at runtime by calling +** "PRAGMA threads=N" with some value of N greater than 0. +** +** When Rewind() is called, any data remaining in memory is flushed to a +** final PMA. So at this point the data is stored in some number of sorted +** PMAs within temporary files on disk. +** +** If there are fewer than SORTER_MAX_MERGE_COUNT PMAs in total and the +** sorter is running in single-threaded mode, then these PMAs are merged +** incrementally as keys are retreived from the sorter by the VDBE. The +** MergeEngine object, described in further detail below, performs this +** merge. +** +** Or, if running in multi-threaded mode, then a background thread is +** launched to merge the existing PMAs. Once the background thread has +** merged T bytes of data into a single sorted PMA, the main thread +** begins reading keys from that PMA while the background thread proceeds +** with merging the next T bytes of data. And so on. +** +** Parameter T is set to half the value of the memory threshold used +** by Write() above to determine when to create a new PMA. +** +** If there are more than SORTER_MAX_MERGE_COUNT PMAs in total when +** Rewind() is called, then a hierarchy of incremental-merges is used. +** First, T bytes of data from the first SORTER_MAX_MERGE_COUNT PMAs on +** disk are merged together. Then T bytes of data from the second set, and +** so on, such that no operation ever merges more than SORTER_MAX_MERGE_COUNT +** PMAs at a time. This done is to improve locality. +** +** If running in multi-threaded mode and there are more than +** SORTER_MAX_MERGE_COUNT PMAs on disk when Rewind() is called, then more +** than one background thread may be created. Specifically, there may be +** one background thread for each temporary file on disk, and one background +** thread to merge the output of each of the others to a single PMA for +** the main thread to read from. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +/* +** If SQLITE_DEBUG_SORTER_THREADS is defined, this module outputs various +** messages to stderr that may be helpful in understanding the performance +** characteristics of the sorter in multi-threaded mode. +*/ +#if 0 +# define SQLITE_DEBUG_SORTER_THREADS 1 +#endif + +/* +** Hard-coded maximum amount of data to accumulate in memory before flushing +** to a level 0 PMA. The purpose of this limit is to prevent various integer +** overflows. 512MiB. +*/ +#define SQLITE_MAX_PMASZ (1<<29) + +/* +** Private objects used by the sorter +*/ +typedef struct MergeEngine MergeEngine; /* Merge PMAs together */ +typedef struct PmaReader PmaReader; /* Incrementally read one PMA */ +typedef struct PmaWriter PmaWriter; /* Incrementally write one PMA */ +typedef struct SorterRecord SorterRecord; /* A record being sorted */ +typedef struct SortSubtask SortSubtask; /* A sub-task in the sort process */ +typedef struct SorterFile SorterFile; /* Temporary file object wrapper */ +typedef struct SorterList SorterList; /* In-memory list of records */ +typedef struct IncrMerger IncrMerger; /* Read & merge multiple PMAs */ + +/* +** A container for a temp file handle and the current amount of data +** stored in the file. +*/ +struct SorterFile { + sqlite3_file *pFd; /* File handle */ + i64 iEof; /* Bytes of data stored in pFd */ +}; + +/* +** An in-memory list of objects to be sorted. +** +** If aMemory==0 then each object is allocated separately and the objects +** are connected using SorterRecord.u.pNext. If aMemory!=0 then all objects +** are stored in the aMemory[] bulk memory, one right after the other, and +** are connected using SorterRecord.u.iNext. +*/ +struct SorterList { + SorterRecord *pList; /* Linked list of records */ + u8 *aMemory; /* If non-NULL, bulk memory to hold pList */ + int szPMA; /* Size of pList as PMA in bytes */ +}; + +/* +** The MergeEngine object is used to combine two or more smaller PMAs into +** one big PMA using a merge operation. Separate PMAs all need to be +** combined into one big PMA in order to be able to step through the sorted +** records in order. +** +** The aReadr[] array contains a PmaReader object for each of the PMAs being +** merged. An aReadr[] object either points to a valid key or else is at EOF. +** ("EOF" means "End Of File". When aReadr[] is at EOF there is no more data.) +** For the purposes of the paragraphs below, we assume that the array is +** actually N elements in size, where N is the smallest power of 2 greater +** to or equal to the number of PMAs being merged. The extra aReadr[] elements +** are treated as if they are empty (always at EOF). +** +** The aTree[] array is also N elements in size. The value of N is stored in +** the MergeEngine.nTree variable. +** +** The final (N/2) elements of aTree[] contain the results of comparing +** pairs of PMA keys together. Element i contains the result of +** comparing aReadr[2*i-N] and aReadr[2*i-N+1]. Whichever key is smaller, the +** aTree element is set to the index of it. +** +** For the purposes of this comparison, EOF is considered greater than any +** other key value. If the keys are equal (only possible with two EOF +** values), it doesn't matter which index is stored. +** +** The (N/4) elements of aTree[] that precede the final (N/2) described +** above contains the index of the smallest of each block of 4 PmaReaders +** And so on. So that aTree[1] contains the index of the PmaReader that +** currently points to the smallest key value. aTree[0] is unused. +** +** Example: +** +** aReadr[0] -> Banana +** aReadr[1] -> Feijoa +** aReadr[2] -> Elderberry +** aReadr[3] -> Currant +** aReadr[4] -> Grapefruit +** aReadr[5] -> Apple +** aReadr[6] -> Durian +** aReadr[7] -> EOF +** +** aTree[] = { X, 5 0, 5 0, 3, 5, 6 } +** +** The current element is "Apple" (the value of the key indicated by +** PmaReader 5). When the Next() operation is invoked, PmaReader 5 will +** be advanced to the next key in its segment. Say the next key is +** "Eggplant": +** +** aReadr[5] -> Eggplant +** +** The contents of aTree[] are updated first by comparing the new PmaReader +** 5 key to the current key of PmaReader 4 (still "Grapefruit"). The PmaReader +** 5 value is still smaller, so aTree[6] is set to 5. And so on up the tree. +** The value of PmaReader 6 - "Durian" - is now smaller than that of PmaReader +** 5, so aTree[3] is set to 6. Key 0 is smaller than key 6 (Bananafile2. And instead of using a +** background thread to prepare data for the PmaReader, with a single +** threaded IncrMerger the allocate part of pTask->file2 is "refilled" with +** keys from pMerger by the calling thread whenever the PmaReader runs out +** of data. +*/ +struct IncrMerger { + SortSubtask *pTask; /* Task that owns this merger */ + MergeEngine *pMerger; /* Merge engine thread reads data from */ + i64 iStartOff; /* Offset to start writing file at */ + int mxSz; /* Maximum bytes of data to store */ + int bEof; /* Set to true when merge is finished */ + int bUseThread; /* True to use a bg thread for this object */ + SorterFile aFile[2]; /* aFile[0] for reading, [1] for writing */ +}; + +/* +** An instance of this object is used for writing a PMA. +** +** The PMA is written one record at a time. Each record is of an arbitrary +** size. But I/O is more efficient if it occurs in page-sized blocks where +** each block is aligned on a page boundary. This object caches writes to +** the PMA so that aligned, page-size blocks are written. +*/ +struct PmaWriter { + int eFWErr; /* Non-zero if in an error state */ + u8 *aBuffer; /* Pointer to write buffer */ + int nBuffer; /* Size of write buffer in bytes */ + int iBufStart; /* First byte of buffer to write */ + int iBufEnd; /* Last byte of buffer to write */ + i64 iWriteOff; /* Offset of start of buffer in file */ + sqlite3_file *pFd; /* File handle to write to */ +}; + +/* +** This object is the header on a single record while that record is being +** held in memory and prior to being written out as part of a PMA. +** +** How the linked list is connected depends on how memory is being managed +** by this module. If using a separate allocation for each in-memory record +** (VdbeSorter.list.aMemory==0), then the list is always connected using the +** SorterRecord.u.pNext pointers. +** +** Or, if using the single large allocation method (VdbeSorter.list.aMemory!=0), +** then while records are being accumulated the list is linked using the +** SorterRecord.u.iNext offset. This is because the aMemory[] array may +** be sqlite3Realloc()ed while records are being accumulated. Once the VM +** has finished passing records to the sorter, or when the in-memory buffer +** is full, the list is sorted. As part of the sorting process, it is +** converted to use the SorterRecord.u.pNext pointers. See function +** vdbeSorterSort() for details. +*/ +struct SorterRecord { + int nVal; /* Size of the record in bytes */ + union { + SorterRecord *pNext; /* Pointer to next record in list */ + int iNext; /* Offset within aMemory of next record */ + } u; + /* The data for the record immediately follows this header */ +}; + +/* Return a pointer to the buffer containing the record data for SorterRecord +** object p. Should be used as if: +** +** void *SRVAL(SorterRecord *p) { return (void*)&p[1]; } +*/ +#define SRVAL(p) ((void*)((SorterRecord*)(p) + 1)) + + +/* Maximum number of PMAs that a single MergeEngine can merge */ +#define SORTER_MAX_MERGE_COUNT 16 + +static int vdbeIncrSwap(IncrMerger*); +static void vdbeIncrFree(IncrMerger *); + +/* +** Free all memory belonging to the PmaReader object passed as the +** argument. All structure fields are set to zero before returning. +*/ +static void vdbePmaReaderClear(PmaReader *pReadr){ + sqlite3_free(pReadr->aAlloc); + sqlite3_free(pReadr->aBuffer); + if( pReadr->aMap ) sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + vdbeIncrFree(pReadr->pIncr); + memset(pReadr, 0, sizeof(PmaReader)); +} + +/* +** Read the next nByte bytes of data from the PMA p. +** If successful, set *ppOut to point to a buffer containing the data +** and return SQLITE_OK. Otherwise, if an error occurs, return an SQLite +** error code. +** +** The buffer returned in *ppOut is only valid until the +** next call to this function. +*/ +static int vdbePmaReadBlob( + PmaReader *p, /* PmaReader from which to take the blob */ + int nByte, /* Bytes of data to read */ + u8 **ppOut /* OUT: Pointer to buffer containing data */ +){ + int iBuf; /* Offset within buffer to read from */ + int nAvail; /* Bytes of data available in buffer */ + + if( p->aMap ){ + *ppOut = &p->aMap[p->iReadOff]; + p->iReadOff += nByte; + return SQLITE_OK; + } + + assert( p->aBuffer ); + + /* If there is no more data to be read from the buffer, read the next + ** p->nBuffer bytes of data from the file into it. Or, if there are less + ** than p->nBuffer bytes remaining in the PMA, read all remaining data. */ + iBuf = p->iReadOff % p->nBuffer; + if( iBuf==0 ){ + int nRead; /* Bytes to read from disk */ + int rc; /* sqlite3OsRead() return code */ + + /* Determine how many bytes of data to read. */ + if( (p->iEof - p->iReadOff) > (i64)p->nBuffer ){ + nRead = p->nBuffer; + }else{ + nRead = (int)(p->iEof - p->iReadOff); + } + assert( nRead>0 ); + + /* Readr data from the file. Return early if an error occurs. */ + rc = sqlite3OsRead(p->pFd, p->aBuffer, nRead, p->iReadOff); + assert( rc!=SQLITE_IOERR_SHORT_READ ); + if( rc!=SQLITE_OK ) return rc; + } + nAvail = p->nBuffer - iBuf; + + if( nByte<=nAvail ){ + /* The requested data is available in the in-memory buffer. In this + ** case there is no need to make a copy of the data, just return a + ** pointer into the buffer to the caller. */ + *ppOut = &p->aBuffer[iBuf]; + p->iReadOff += nByte; + }else{ + /* The requested data is not all available in the in-memory buffer. + ** In this case, allocate space at p->aAlloc[] to copy the requested + ** range into. Then return a copy of pointer p->aAlloc to the caller. */ + int nRem; /* Bytes remaining to copy */ + + /* Extend the p->aAlloc[] allocation if required. */ + if( p->nAllocnAlloc); + while( nByte>nNew ) nNew = nNew*2; + aNew = sqlite3Realloc(p->aAlloc, nNew); + if( !aNew ) return SQLITE_NOMEM_BKPT; + p->nAlloc = nNew; + p->aAlloc = aNew; + } + + /* Copy as much data as is available in the buffer into the start of + ** p->aAlloc[]. */ + memcpy(p->aAlloc, &p->aBuffer[iBuf], nAvail); + p->iReadOff += nAvail; + nRem = nByte - nAvail; + + /* The following loop copies up to p->nBuffer bytes per iteration into + ** the p->aAlloc[] buffer. */ + while( nRem>0 ){ + int rc; /* vdbePmaReadBlob() return code */ + int nCopy; /* Number of bytes to copy */ + u8 *aNext; /* Pointer to buffer to copy data from */ + + nCopy = nRem; + if( nRem>p->nBuffer ) nCopy = p->nBuffer; + rc = vdbePmaReadBlob(p, nCopy, &aNext); + if( rc!=SQLITE_OK ) return rc; + assert( aNext!=p->aAlloc ); + memcpy(&p->aAlloc[nByte - nRem], aNext, nCopy); + nRem -= nCopy; + } + + *ppOut = p->aAlloc; + } + + return SQLITE_OK; +} + +/* +** Read a varint from the stream of data accessed by p. Set *pnOut to +** the value read. +*/ +static int vdbePmaReadVarint(PmaReader *p, u64 *pnOut){ + int iBuf; + + if( p->aMap ){ + p->iReadOff += sqlite3GetVarint(&p->aMap[p->iReadOff], pnOut); + }else{ + iBuf = p->iReadOff % p->nBuffer; + if( iBuf && (p->nBuffer-iBuf)>=9 ){ + p->iReadOff += sqlite3GetVarint(&p->aBuffer[iBuf], pnOut); + }else{ + u8 aVarint[16], *a; + int i = 0, rc; + do{ + rc = vdbePmaReadBlob(p, 1, &a); + if( rc ) return rc; + aVarint[(i++)&0xf] = a[0]; + }while( (a[0]&0x80)!=0 ); + sqlite3GetVarint(aVarint, pnOut); + } + } + + return SQLITE_OK; +} + +/* +** Attempt to memory map file pFile. If successful, set *pp to point to the +** new mapping and return SQLITE_OK. If the mapping is not attempted +** (because the file is too large or the VFS layer is configured not to use +** mmap), return SQLITE_OK and set *pp to NULL. +** +** Or, if an error occurs, return an SQLite error code. The final value of +** *pp is undefined in this case. +*/ +static int vdbeSorterMapFile(SortSubtask *pTask, SorterFile *pFile, u8 **pp){ + int rc = SQLITE_OK; + if( pFile->iEof<=(i64)(pTask->pSorter->db->nMaxSorterMmap) ){ + sqlite3_file *pFd = pFile->pFd; + if( pFd->pMethods->iVersion>=3 ){ + rc = sqlite3OsFetch(pFd, 0, (int)pFile->iEof, (void**)pp); + testcase( rc!=SQLITE_OK ); + } + } + return rc; +} + +/* +** Attach PmaReader pReadr to file pFile (if it is not already attached to +** that file) and seek it to offset iOff within the file. Return SQLITE_OK +** if successful, or an SQLite error code if an error occurs. +*/ +static int vdbePmaReaderSeek( + SortSubtask *pTask, /* Task context */ + PmaReader *pReadr, /* Reader whose cursor is to be moved */ + SorterFile *pFile, /* Sorter file to read from */ + i64 iOff /* Offset in pFile */ +){ + int rc = SQLITE_OK; + + assert( pReadr->pIncr==0 || pReadr->pIncr->bEof==0 ); + + if( sqlite3FaultSim(201) ) return SQLITE_IOERR_READ; + if( pReadr->aMap ){ + sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + pReadr->aMap = 0; + } + pReadr->iReadOff = iOff; + pReadr->iEof = pFile->iEof; + pReadr->pFd = pFile->pFd; + + rc = vdbeSorterMapFile(pTask, pFile, &pReadr->aMap); + if( rc==SQLITE_OK && pReadr->aMap==0 ){ + int pgsz = pTask->pSorter->pgsz; + int iBuf = pReadr->iReadOff % pgsz; + if( pReadr->aBuffer==0 ){ + pReadr->aBuffer = (u8*)sqlite3Malloc(pgsz); + if( pReadr->aBuffer==0 ) rc = SQLITE_NOMEM_BKPT; + pReadr->nBuffer = pgsz; + } + if( rc==SQLITE_OK && iBuf ){ + int nRead = pgsz - iBuf; + if( (pReadr->iReadOff + nRead) > pReadr->iEof ){ + nRead = (int)(pReadr->iEof - pReadr->iReadOff); + } + rc = sqlite3OsRead( + pReadr->pFd, &pReadr->aBuffer[iBuf], nRead, pReadr->iReadOff + ); + testcase( rc!=SQLITE_OK ); + } + } + + return rc; +} + +/* +** Advance PmaReader pReadr to the next key in its PMA. Return SQLITE_OK if +** no error occurs, or an SQLite error code if one does. +*/ +static int vdbePmaReaderNext(PmaReader *pReadr){ + int rc = SQLITE_OK; /* Return Code */ + u64 nRec = 0; /* Size of record in bytes */ + + + if( pReadr->iReadOff>=pReadr->iEof ){ + IncrMerger *pIncr = pReadr->pIncr; + int bEof = 1; + if( pIncr ){ + rc = vdbeIncrSwap(pIncr); + if( rc==SQLITE_OK && pIncr->bEof==0 ){ + rc = vdbePmaReaderSeek( + pIncr->pTask, pReadr, &pIncr->aFile[0], pIncr->iStartOff + ); + bEof = 0; + } + } + + if( bEof ){ + /* This is an EOF condition */ + vdbePmaReaderClear(pReadr); + testcase( rc!=SQLITE_OK ); + return rc; + } + } + + if( rc==SQLITE_OK ){ + rc = vdbePmaReadVarint(pReadr, &nRec); + } + if( rc==SQLITE_OK ){ + pReadr->nKey = (int)nRec; + rc = vdbePmaReadBlob(pReadr, (int)nRec, &pReadr->aKey); + testcase( rc!=SQLITE_OK ); + } + + return rc; +} + +/* +** Initialize PmaReader pReadr to scan through the PMA stored in file pFile +** starting at offset iStart and ending at offset iEof-1. This function +** leaves the PmaReader pointing to the first key in the PMA (or EOF if the +** PMA is empty). +** +** If the pnByte parameter is NULL, then it is assumed that the file +** contains a single PMA, and that that PMA omits the initial length varint. +*/ +static int vdbePmaReaderInit( + SortSubtask *pTask, /* Task context */ + SorterFile *pFile, /* Sorter file to read from */ + i64 iStart, /* Start offset in pFile */ + PmaReader *pReadr, /* PmaReader to populate */ + i64 *pnByte /* IN/OUT: Increment this value by PMA size */ +){ + int rc; + + assert( pFile->iEof>iStart ); + assert( pReadr->aAlloc==0 && pReadr->nAlloc==0 ); + assert( pReadr->aBuffer==0 ); + assert( pReadr->aMap==0 ); + + rc = vdbePmaReaderSeek(pTask, pReadr, pFile, iStart); + if( rc==SQLITE_OK ){ + u64 nByte = 0; /* Size of PMA in bytes */ + rc = vdbePmaReadVarint(pReadr, &nByte); + pReadr->iEof = pReadr->iReadOff + nByte; + *pnByte += nByte; + } + + if( rc==SQLITE_OK ){ + rc = vdbePmaReaderNext(pReadr); + } + return rc; +} + +/* +** A version of vdbeSorterCompare() that assumes that it has already been +** determined that the first field of key1 is equal to the first field of +** key2. +*/ +static int vdbeSorterCompareTail( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( *pbKey2Cached==0 ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, r2, 1); +} + +/* +** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2, +** size nKey2 bytes). Use (pTask->pKeyInfo) for the collation sequences +** used by the comparison. Return the result of the comparison. +** +** If IN/OUT parameter *pbKey2Cached is true when this function is called, +** it is assumed that (pTask->pUnpacked) contains the unpacked version +** of key2. If it is false, (pTask->pUnpacked) is populated with the unpacked +** version of key2 and *pbKey2Cached set to true before returning. +** +** If an OOM error is encountered, (pTask->pUnpacked->error_rc) is set +** to SQLITE_NOMEM. +*/ +static int vdbeSorterCompare( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( !*pbKey2Cached ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompare(nKey1, pKey1, r2); +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is a TEXT value and that the collation +** sequence to compare them with is BINARY. +*/ +static int vdbeSorterCompareText( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + + int n1; + int n2; + int res; + + getVarint32NR(&p1[1], n1); + getVarint32NR(&p2[1], n2); + res = memcmp(v1, v2, (MIN(n1, n2) - 13)/2); + if( res==0 ){ + res = n1 - n2; + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else{ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); + if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ + res = res * -1; + } + } + + return res; +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is an INTEGER value. +*/ +static int vdbeSorterCompareInt( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const int s1 = p1[1]; /* Left hand serial type */ + const int s2 = p2[1]; /* Right hand serial type */ + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + int res; /* Return value */ + + assert( (s1>0 && s1<7) || s1==8 || s1==9 ); + assert( (s2>0 && s2<7) || s2==8 || s2==9 ); + + if( s1==s2 ){ + /* The two values have the same sign. Compare using memcmp(). */ + static const u8 aLen[] = {0, 1, 2, 3, 4, 6, 8, 0, 0, 0 }; + const u8 n = aLen[s1]; + int i; + res = 0; + for(i=0; i7 && s2>7 ){ + res = s1 - s2; + }else{ + if( s2>7 ){ + res = +1; + }else if( s1>7 ){ + res = -1; + }else{ + res = s1 - s2; + } + assert( res!=0 ); + + if( res>0 ){ + if( *v1 & 0x80 ) res = -1; + }else{ + if( *v2 & 0x80 ) res = +1; + } + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); + res = res * -1; + } + + return res; +} + +/* +** Initialize the temporary index cursor just opened as a sorter cursor. +** +** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nKeyField) +** to determine the number of fields that should be compared from the +** records being sorted. However, if the value passed as argument nField +** is non-zero and the sorter is able to guarantee a stable sort, nField +** is used instead. This is used when sorting records for a CREATE INDEX +** statement. In this case, keys are always delivered to the sorter in +** order of the primary key, which happens to be make up the final part +** of the records being sorted. So if the sort is stable, there is never +** any reason to compare PK fields and they can be ignored for a small +** performance boost. +** +** The sorter can guarantee a stable sort when running in single-threaded +** mode, but not in multi-threaded mode. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterInit( + sqlite3 *db, /* Database connection (for malloc()) */ + int nField, /* Number of key fields in each record */ + VdbeCursor *pCsr /* Cursor that holds the new sorter */ +){ + int pgsz; /* Page size of main database */ + int i; /* Used to iterate through aTask[] */ + VdbeSorter *pSorter; /* The new sorter */ + KeyInfo *pKeyInfo; /* Copy of pCsr->pKeyInfo with db==0 */ + int szKeyInfo; /* Size of pCsr->pKeyInfo in bytes */ + int sz; /* Size of pSorter in bytes */ + int rc = SQLITE_OK; +#if SQLITE_MAX_WORKER_THREADS==0 +# define nWorker 0 +#else + int nWorker; +#endif + + /* Initialize the upper limit on the number of worker threads */ +#if SQLITE_MAX_WORKER_THREADS>0 + if( sqlite3TempInMemory(db) || sqlite3GlobalConfig.bCoreMutex==0 ){ + nWorker = 0; + }else{ + nWorker = db->aLimit[SQLITE_LIMIT_WORKER_THREADS]; + } +#endif + + /* Do not allow the total number of threads (main thread + all workers) + ** to exceed the maximum merge count */ +#if SQLITE_MAX_WORKER_THREADS>=SORTER_MAX_MERGE_COUNT + if( nWorker>=SORTER_MAX_MERGE_COUNT ){ + nWorker = SORTER_MAX_MERGE_COUNT-1; + } +#endif + + assert( pCsr->pKeyInfo ); + assert( !pCsr->isEphemeral ); + assert( pCsr->eCurType==CURTYPE_SORTER ); + szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*); + sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); + + pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); + pCsr->uc.pSorter = pSorter; + if( pSorter==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + Btree *pBt = db->aDb[0].pBt; + pSorter->pKeyInfo = pKeyInfo = (KeyInfo*)((u8*)pSorter + sz); + memcpy(pKeyInfo, pCsr->pKeyInfo, szKeyInfo); + pKeyInfo->db = 0; + if( nField && nWorker==0 ){ + pKeyInfo->nKeyField = nField; + } + sqlite3BtreeEnter(pBt); + pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(pBt); + sqlite3BtreeLeave(pBt); + pSorter->nTask = nWorker + 1; + pSorter->iPrev = (u8)(nWorker - 1); + pSorter->bUseThreads = (pSorter->nTask>1); + pSorter->db = db; + for(i=0; inTask; i++){ + SortSubtask *pTask = &pSorter->aTask[i]; + pTask->pSorter = pSorter; + } + + if( !sqlite3TempInMemory(db) ){ + i64 mxCache; /* Cache size in bytes*/ + u32 szPma = sqlite3GlobalConfig.szPma; + pSorter->mnPmaSize = szPma * pgsz; + + mxCache = db->aDb[0].pSchema->cache_size; + if( mxCache<0 ){ + /* A negative cache-size value C indicates that the cache is abs(C) + ** KiB in size. */ + mxCache = mxCache * -1024; + }else{ + mxCache = mxCache * pgsz; + } + mxCache = MIN(mxCache, SQLITE_MAX_PMASZ); + pSorter->mxPmaSize = MAX(pSorter->mnPmaSize, (int)mxCache); + + /* Avoid large memory allocations if the application has requested + ** SQLITE_CONFIG_SMALL_MALLOC. */ + if( sqlite3GlobalConfig.bSmallMalloc==0 ){ + assert( pSorter->iMemory==0 ); + pSorter->nMemory = pgsz; + pSorter->list.aMemory = (u8*)sqlite3Malloc(pgsz); + if( !pSorter->list.aMemory ) rc = SQLITE_NOMEM_BKPT; + } + } + + if( pKeyInfo->nAllField<13 + && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) + && (pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)==0 + ){ + pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; + } + } + + return rc; +} +#undef nWorker /* Defined at the top of this function */ + +/* +** Free the list of sorted records starting at pRecord. +*/ +static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ + SorterRecord *p; + SorterRecord *pNext; + for(p=pRecord; p; p=pNext){ + pNext = p->u.pNext; + sqlite3DbFree(db, p); + } +} + +/* +** Free all resources owned by the object indicated by argument pTask. All +** fields of *pTask are zeroed before returning. +*/ +static void vdbeSortSubtaskCleanup(sqlite3 *db, SortSubtask *pTask){ + sqlite3DbFree(db, pTask->pUnpacked); +#if SQLITE_MAX_WORKER_THREADS>0 + /* pTask->list.aMemory can only be non-zero if it was handed memory + ** from the main thread. That only occurs SQLITE_MAX_WORKER_THREADS>0 */ + if( pTask->list.aMemory ){ + sqlite3_free(pTask->list.aMemory); + }else +#endif + { + assert( pTask->list.aMemory==0 ); + vdbeSorterRecordFree(0, pTask->list.pList); + } + if( pTask->file.pFd ){ + sqlite3OsCloseFree(pTask->file.pFd); + } + if( pTask->file2.pFd ){ + sqlite3OsCloseFree(pTask->file2.pFd); + } + memset(pTask, 0, sizeof(SortSubtask)); +} + +#ifdef SQLITE_DEBUG_SORTER_THREADS +static void vdbeSorterWorkDebug(SortSubtask *pTask, const char *zEvent){ + i64 t; + int iTask = (pTask - pTask->pSorter->aTask); + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:%d %s\n", t, iTask, zEvent); +} +static void vdbeSorterRewindDebug(const char *zEvent){ + i64 t = 0; + sqlite3_vfs *pVfs = sqlite3_vfs_find(0); + if( ALWAYS(pVfs) ) sqlite3OsCurrentTimeInt64(pVfs, &t); + fprintf(stderr, "%lld:X %s\n", t, zEvent); +} +static void vdbeSorterPopulateDebug( + SortSubtask *pTask, + const char *zEvent +){ + i64 t; + int iTask = (pTask - pTask->pSorter->aTask); + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:bg%d %s\n", t, iTask, zEvent); +} +static void vdbeSorterBlockDebug( + SortSubtask *pTask, + int bBlocked, + const char *zEvent +){ + if( bBlocked ){ + i64 t; + sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); + fprintf(stderr, "%lld:main %s\n", t, zEvent); + } +} +#else +# define vdbeSorterWorkDebug(x,y) +# define vdbeSorterRewindDebug(y) +# define vdbeSorterPopulateDebug(x,y) +# define vdbeSorterBlockDebug(x,y,z) +#endif + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** Join thread pTask->thread. +*/ +static int vdbeSorterJoinThread(SortSubtask *pTask){ + int rc = SQLITE_OK; + if( pTask->pThread ){ +#ifdef SQLITE_DEBUG_SORTER_THREADS + int bDone = pTask->bDone; +#endif + void *pRet = SQLITE_INT_TO_PTR(SQLITE_ERROR); + vdbeSorterBlockDebug(pTask, !bDone, "enter"); + (void)sqlite3ThreadJoin(pTask->pThread, &pRet); + vdbeSorterBlockDebug(pTask, !bDone, "exit"); + rc = SQLITE_PTR_TO_INT(pRet); + assert( pTask->bDone==1 ); + pTask->bDone = 0; + pTask->pThread = 0; + } + return rc; +} + +/* +** Launch a background thread to run xTask(pIn). +*/ +static int vdbeSorterCreateThread( + SortSubtask *pTask, /* Thread will use this task object */ + void *(*xTask)(void*), /* Routine to run in a separate thread */ + void *pIn /* Argument passed into xTask() */ +){ + assert( pTask->pThread==0 && pTask->bDone==0 ); + return sqlite3ThreadCreate(&pTask->pThread, xTask, pIn); +} + +/* +** Join all outstanding threads launched by SorterWrite() to create +** level-0 PMAs. +*/ +static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ + int rc = rcin; + int i; + + /* This function is always called by the main user thread. + ** + ** If this function is being called after SorterRewind() has been called, + ** it is possible that thread pSorter->aTask[pSorter->nTask-1].pThread + ** is currently attempt to join one of the other threads. To avoid a race + ** condition where this thread also attempts to join the same object, join + ** thread pSorter->aTask[pSorter->nTask-1].pThread first. */ + for(i=pSorter->nTask-1; i>=0; i--){ + SortSubtask *pTask = &pSorter->aTask[i]; + int rc2 = vdbeSorterJoinThread(pTask); + if( rc==SQLITE_OK ) rc = rc2; + } + return rc; +} +#else +# define vdbeSorterJoinAll(x,rcin) (rcin) +# define vdbeSorterJoinThread(pTask) SQLITE_OK +#endif + +/* +** Allocate a new MergeEngine object capable of handling up to +** nReader PmaReader inputs. +** +** nReader is automatically rounded up to the next power of two. +** nReader may not exceed SORTER_MAX_MERGE_COUNT even after rounding up. +*/ +static MergeEngine *vdbeMergeEngineNew(int nReader){ + int N = 2; /* Smallest power of two >= nReader */ + int nByte; /* Total bytes of space to allocate */ + MergeEngine *pNew; /* Pointer to allocated object to return */ + + assert( nReader<=SORTER_MAX_MERGE_COUNT ); + + while( NnTree = N; + pNew->pTask = 0; + pNew->aReadr = (PmaReader*)&pNew[1]; + pNew->aTree = (int*)&pNew->aReadr[N]; + } + return pNew; +} + +/* +** Free the MergeEngine object passed as the only argument. +*/ +static void vdbeMergeEngineFree(MergeEngine *pMerger){ + int i; + if( pMerger ){ + for(i=0; inTree; i++){ + vdbePmaReaderClear(&pMerger->aReadr[i]); + } + } + sqlite3_free(pMerger); +} + +/* +** Free all resources associated with the IncrMerger object indicated by +** the first argument. +*/ +static void vdbeIncrFree(IncrMerger *pIncr){ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + vdbeSorterJoinThread(pIncr->pTask); + if( pIncr->aFile[0].pFd ) sqlite3OsCloseFree(pIncr->aFile[0].pFd); + if( pIncr->aFile[1].pFd ) sqlite3OsCloseFree(pIncr->aFile[1].pFd); + } +#endif + vdbeMergeEngineFree(pIncr->pMerger); + sqlite3_free(pIncr); + } +} + +/* +** Reset a sorting cursor back to its original empty state. +*/ +SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ + int i; + (void)vdbeSorterJoinAll(pSorter, SQLITE_OK); + assert( pSorter->bUseThreads || pSorter->pReader==0 ); +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->pReader ){ + vdbePmaReaderClear(pSorter->pReader); + sqlite3DbFree(db, pSorter->pReader); + pSorter->pReader = 0; + } +#endif + vdbeMergeEngineFree(pSorter->pMerger); + pSorter->pMerger = 0; + for(i=0; inTask; i++){ + SortSubtask *pTask = &pSorter->aTask[i]; + vdbeSortSubtaskCleanup(db, pTask); + pTask->pSorter = pSorter; + } + if( pSorter->list.aMemory==0 ){ + vdbeSorterRecordFree(0, pSorter->list.pList); + } + pSorter->list.pList = 0; + pSorter->list.szPMA = 0; + pSorter->bUsePMA = 0; + pSorter->iMemory = 0; + pSorter->mxKeysize = 0; + sqlite3DbFree(db, pSorter->pUnpacked); + pSorter->pUnpacked = 0; +} + +/* +** Free any cursor components allocated by sqlite3VdbeSorterXXX routines. +*/ +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ + VdbeSorter *pSorter; + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + if( pSorter ){ + sqlite3VdbeSorterReset(db, pSorter); + sqlite3_free(pSorter->list.aMemory); + sqlite3DbFree(db, pSorter); + pCsr->uc.pSorter = 0; + } +} + +#if SQLITE_MAX_MMAP_SIZE>0 +/* +** The first argument is a file-handle open on a temporary file. The file +** is guaranteed to be nByte bytes or smaller in size. This function +** attempts to extend the file to nByte bytes in size and to ensure that +** the VFS has memory mapped it. +** +** Whether or not the file does end up memory mapped of course depends on +** the specific VFS implementation. +*/ +static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){ + if( nByte<=(i64)(db->nMaxSorterMmap) && pFd->pMethods->iVersion>=3 ){ + void *p = 0; + int chunksize = 4*1024; + sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_CHUNK_SIZE, &chunksize); + sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_SIZE_HINT, &nByte); + sqlite3OsFetch(pFd, 0, (int)nByte, &p); + if( p ) sqlite3OsUnfetch(pFd, 0, p); + } +} +#else +# define vdbeSorterExtendFile(x,y,z) +#endif + +/* +** Allocate space for a file-handle and open a temporary file. If successful, +** set *ppFd to point to the malloc'd file-handle and return SQLITE_OK. +** Otherwise, set *ppFd to 0 and return an SQLite error code. +*/ +static int vdbeSorterOpenTempFile( + sqlite3 *db, /* Database handle doing sort */ + i64 nExtend, /* Attempt to extend file to this size */ + sqlite3_file **ppFd +){ + int rc; + if( sqlite3FaultSim(202) ) return SQLITE_IOERR_ACCESS; + rc = sqlite3OsOpenMalloc(db->pVfs, 0, ppFd, + SQLITE_OPEN_TEMP_JOURNAL | + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE, &rc + ); + if( rc==SQLITE_OK ){ + i64 max = SQLITE_MAX_MMAP_SIZE; + sqlite3OsFileControlHint(*ppFd, SQLITE_FCNTL_MMAP_SIZE, (void*)&max); + if( nExtend>0 ){ + vdbeSorterExtendFile(db, *ppFd, nExtend); + } + } + return rc; +} + +/* +** If it has not already been allocated, allocate the UnpackedRecord +** structure at pTask->pUnpacked. Return SQLITE_OK if successful (or +** if no allocation was required), or SQLITE_NOMEM otherwise. +*/ +static int vdbeSortAllocUnpacked(SortSubtask *pTask){ + if( pTask->pUnpacked==0 ){ + pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); + if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT; + pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nKeyField; + pTask->pUnpacked->errCode = 0; + } + return SQLITE_OK; +} + + +/* +** Merge the two sorted lists p1 and p2 into a single list. +*/ +static SorterRecord *vdbeSorterMerge( + SortSubtask *pTask, /* Calling thread context */ + SorterRecord *p1, /* First list to merge */ + SorterRecord *p2 /* Second list to merge */ +){ + SorterRecord *pFinal = 0; + SorterRecord **pp = &pFinal; + int bCached = 0; + + assert( p1!=0 && p2!=0 ); + for(;;){ + int res; + res = pTask->xCompare( + pTask, &bCached, SRVAL(p1), p1->nVal, SRVAL(p2), p2->nVal + ); + + if( res<=0 ){ + *pp = p1; + pp = &p1->u.pNext; + p1 = p1->u.pNext; + if( p1==0 ){ + *pp = p2; + break; + } + }else{ + *pp = p2; + pp = &p2->u.pNext; + p2 = p2->u.pNext; + bCached = 0; + if( p2==0 ){ + *pp = p1; + break; + } + } + } + return pFinal; +} + +/* +** Return the SorterCompare function to compare values collected by the +** sorter object passed as the only argument. +*/ +static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ + if( p->typeMask==SORTER_TYPE_INTEGER ){ + return vdbeSorterCompareInt; + }else if( p->typeMask==SORTER_TYPE_TEXT ){ + return vdbeSorterCompareText; + } + return vdbeSorterCompare; +} + +/* +** Sort the linked list of records headed at pTask->pList. Return +** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if +** an error occurs. +*/ +static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ + int i; + SorterRecord *p; + int rc; + SorterRecord *aSlot[64]; + + rc = vdbeSortAllocUnpacked(pTask); + if( rc!=SQLITE_OK ) return rc; + + p = pList->pList; + pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); + memset(aSlot, 0, sizeof(aSlot)); + + while( p ){ + SorterRecord *pNext; + if( pList->aMemory ){ + if( (u8*)p==pList->aMemory ){ + pNext = 0; + }else{ + assert( p->u.iNextaMemory) ); + pNext = (SorterRecord*)&pList->aMemory[p->u.iNext]; + } + }else{ + pNext = p->u.pNext; + } + + p->u.pNext = 0; + for(i=0; aSlot[i]; i++){ + p = vdbeSorterMerge(pTask, p, aSlot[i]); + aSlot[i] = 0; + } + aSlot[i] = p; + p = pNext; + } + + p = 0; + for(i=0; ipList = p; + + assert( pTask->pUnpacked->errCode==SQLITE_OK + || pTask->pUnpacked->errCode==SQLITE_NOMEM + ); + return pTask->pUnpacked->errCode; +} + +/* +** Initialize a PMA-writer object. +*/ +static void vdbePmaWriterInit( + sqlite3_file *pFd, /* File handle to write to */ + PmaWriter *p, /* Object to populate */ + int nBuf, /* Buffer size */ + i64 iStart /* Offset of pFd to begin writing at */ +){ + memset(p, 0, sizeof(PmaWriter)); + p->aBuffer = (u8*)sqlite3Malloc(nBuf); + if( !p->aBuffer ){ + p->eFWErr = SQLITE_NOMEM_BKPT; + }else{ + p->iBufEnd = p->iBufStart = (iStart % nBuf); + p->iWriteOff = iStart - p->iBufStart; + p->nBuffer = nBuf; + p->pFd = pFd; + } +} + +/* +** Write nData bytes of data to the PMA. Return SQLITE_OK +** if successful, or an SQLite error code if an error occurs. +*/ +static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ + int nRem = nData; + while( nRem>0 && p->eFWErr==0 ){ + int nCopy = nRem; + if( nCopy>(p->nBuffer - p->iBufEnd) ){ + nCopy = p->nBuffer - p->iBufEnd; + } + + memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy); + p->iBufEnd += nCopy; + if( p->iBufEnd==p->nBuffer ){ + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->iWriteOff + p->iBufStart + ); + p->iBufStart = p->iBufEnd = 0; + p->iWriteOff += p->nBuffer; + } + assert( p->iBufEndnBuffer ); + + nRem -= nCopy; + } +} + +/* +** Flush any buffered data to disk and clean up the PMA-writer object. +** The results of using the PMA-writer after this call are undefined. +** Return SQLITE_OK if flushing the buffered data succeeds or is not +** required. Otherwise, return an SQLite error code. +** +** Before returning, set *piEof to the offset immediately following the +** last byte written to the file. +*/ +static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ + int rc; + if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){ + p->eFWErr = sqlite3OsWrite(p->pFd, + &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, + p->iWriteOff + p->iBufStart + ); + } + *piEof = (p->iWriteOff + p->iBufEnd); + sqlite3_free(p->aBuffer); + rc = p->eFWErr; + memset(p, 0, sizeof(PmaWriter)); + return rc; +} + +/* +** Write value iVal encoded as a varint to the PMA. Return +** SQLITE_OK if successful, or an SQLite error code if an error occurs. +*/ +static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ + int nByte; + u8 aByte[10]; + nByte = sqlite3PutVarint(aByte, iVal); + vdbePmaWriteBlob(p, aByte, nByte); +} + +/* +** Write the current contents of in-memory linked-list pList to a level-0 +** PMA in the temp file belonging to sub-task pTask. Return SQLITE_OK if +** successful, or an SQLite error code otherwise. +** +** The format of a PMA is: +** +** * A varint. This varint contains the total number of bytes of content +** in the PMA (not including the varint itself). +** +** * One or more records packed end-to-end in order of ascending keys. +** Each record consists of a varint followed by a blob of data (the +** key). The varint is the number of bytes in the blob of data. +*/ +static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ + sqlite3 *db = pTask->pSorter->db; + int rc = SQLITE_OK; /* Return code */ + PmaWriter writer; /* Object used to write to the file */ + +#ifdef SQLITE_DEBUG + /* Set iSz to the expected size of file pTask->file after writing the PMA. + ** This is used by an assert() statement at the end of this function. */ + i64 iSz = pList->szPMA + sqlite3VarintLen(pList->szPMA) + pTask->file.iEof; +#endif + + vdbeSorterWorkDebug(pTask, "enter"); + memset(&writer, 0, sizeof(PmaWriter)); + assert( pList->szPMA>0 ); + + /* If the first temporary PMA file has not been opened, open it now. */ + if( pTask->file.pFd==0 ){ + rc = vdbeSorterOpenTempFile(db, 0, &pTask->file.pFd); + assert( rc!=SQLITE_OK || pTask->file.pFd ); + assert( pTask->file.iEof==0 ); + assert( pTask->nPMA==0 ); + } + + /* Try to get the file to memory map */ + if( rc==SQLITE_OK ){ + vdbeSorterExtendFile(db, pTask->file.pFd, pTask->file.iEof+pList->szPMA+9); + } + + /* Sort the list */ + if( rc==SQLITE_OK ){ + rc = vdbeSorterSort(pTask, pList); + } + + if( rc==SQLITE_OK ){ + SorterRecord *p; + SorterRecord *pNext = 0; + + vdbePmaWriterInit(pTask->file.pFd, &writer, pTask->pSorter->pgsz, + pTask->file.iEof); + pTask->nPMA++; + vdbePmaWriteVarint(&writer, pList->szPMA); + for(p=pList->pList; p; p=pNext){ + pNext = p->u.pNext; + vdbePmaWriteVarint(&writer, p->nVal); + vdbePmaWriteBlob(&writer, SRVAL(p), p->nVal); + if( pList->aMemory==0 ) sqlite3_free(p); + } + pList->pList = p; + rc = vdbePmaWriterFinish(&writer, &pTask->file.iEof); + } + + vdbeSorterWorkDebug(pTask, "exit"); + assert( rc!=SQLITE_OK || pList->pList==0 ); + assert( rc!=SQLITE_OK || pTask->file.iEof==iSz ); + return rc; +} + +/* +** Advance the MergeEngine to its next entry. +** Set *pbEof to true there is no next entry because +** the MergeEngine has reached the end of all its inputs. +** +** Return SQLITE_OK if successful or an error code if an error occurs. +*/ +static int vdbeMergeEngineStep( + MergeEngine *pMerger, /* The merge engine to advance to the next row */ + int *pbEof /* Set TRUE at EOF. Set false for more content */ +){ + int rc; + int iPrev = pMerger->aTree[1];/* Index of PmaReader to advance */ + SortSubtask *pTask = pMerger->pTask; + + /* Advance the current PmaReader */ + rc = vdbePmaReaderNext(&pMerger->aReadr[iPrev]); + + /* Update contents of aTree[] */ + if( rc==SQLITE_OK ){ + int i; /* Index of aTree[] to recalculate */ + PmaReader *pReadr1; /* First PmaReader to compare */ + PmaReader *pReadr2; /* Second PmaReader to compare */ + int bCached = 0; + + /* Find the first two PmaReaders to compare. The one that was just + ** advanced (iPrev) and the one next to it in the array. */ + pReadr1 = &pMerger->aReadr[(iPrev & 0xFFFE)]; + pReadr2 = &pMerger->aReadr[(iPrev | 0x0001)]; + + for(i=(pMerger->nTree+iPrev)/2; i>0; i=i/2){ + /* Compare pReadr1 and pReadr2. Store the result in variable iRes. */ + int iRes; + if( pReadr1->pFd==0 ){ + iRes = +1; + }else if( pReadr2->pFd==0 ){ + iRes = -1; + }else{ + iRes = pTask->xCompare(pTask, &bCached, + pReadr1->aKey, pReadr1->nKey, pReadr2->aKey, pReadr2->nKey + ); + } + + /* If pReadr1 contained the smaller value, set aTree[i] to its index. + ** Then set pReadr2 to the next PmaReader to compare to pReadr1. In this + ** case there is no cache of pReadr2 in pTask->pUnpacked, so set + ** pKey2 to point to the record belonging to pReadr2. + ** + ** Alternatively, if pReadr2 contains the smaller of the two values, + ** set aTree[i] to its index and update pReadr1. If vdbeSorterCompare() + ** was actually called above, then pTask->pUnpacked now contains + ** a value equivalent to pReadr2. So set pKey2 to NULL to prevent + ** vdbeSorterCompare() from decoding pReadr2 again. + ** + ** If the two values were equal, then the value from the oldest + ** PMA should be considered smaller. The VdbeSorter.aReadr[] array + ** is sorted from oldest to newest, so pReadr1 contains older values + ** than pReadr2 iff (pReadr1aTree[i] = (int)(pReadr1 - pMerger->aReadr); + pReadr2 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + bCached = 0; + }else{ + if( pReadr1->pFd ) bCached = 0; + pMerger->aTree[i] = (int)(pReadr2 - pMerger->aReadr); + pReadr1 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + } + } + *pbEof = (pMerger->aReadr[pMerger->aTree[1]].pFd==0); + } + + return (rc==SQLITE_OK ? pTask->pUnpacked->errCode : rc); +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for background threads that write level-0 PMAs. +*/ +static void *vdbeSorterFlushThread(void *pCtx){ + SortSubtask *pTask = (SortSubtask*)pCtx; + int rc; /* Return code */ + assert( pTask->bDone==0 ); + rc = vdbeSorterListToPMA(pTask, &pTask->list); + pTask->bDone = 1; + return SQLITE_INT_TO_PTR(rc); +} +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + +/* +** Flush the current contents of VdbeSorter.list to a new PMA, possibly +** using a background thread. +*/ +static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ +#if SQLITE_MAX_WORKER_THREADS==0 + pSorter->bUsePMA = 1; + return vdbeSorterListToPMA(&pSorter->aTask[0], &pSorter->list); +#else + int rc = SQLITE_OK; + int i; + SortSubtask *pTask = 0; /* Thread context used to create new PMA */ + int nWorker = (pSorter->nTask-1); + + /* Set the flag to indicate that at least one PMA has been written. + ** Or will be, anyhow. */ + pSorter->bUsePMA = 1; + + /* Select a sub-task to sort and flush the current list of in-memory + ** records to disk. If the sorter is running in multi-threaded mode, + ** round-robin between the first (pSorter->nTask-1) tasks. Except, if + ** the background thread from a sub-tasks previous turn is still running, + ** skip it. If the first (pSorter->nTask-1) sub-tasks are all still busy, + ** fall back to using the final sub-task. The first (pSorter->nTask-1) + ** sub-tasks are prefered as they use background threads - the final + ** sub-task uses the main thread. */ + for(i=0; iiPrev + i + 1) % nWorker; + pTask = &pSorter->aTask[iTest]; + if( pTask->bDone ){ + rc = vdbeSorterJoinThread(pTask); + } + if( rc!=SQLITE_OK || pTask->pThread==0 ) break; + } + + if( rc==SQLITE_OK ){ + if( i==nWorker ){ + /* Use the foreground thread for this operation */ + rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); + }else{ + /* Launch a background thread for this operation */ + u8 *aMem; + void *pCtx; + + assert( pTask!=0 ); + assert( pTask->pThread==0 && pTask->bDone==0 ); + assert( pTask->list.pList==0 ); + assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); + + aMem = pTask->list.aMemory; + pCtx = (void*)pTask; + pSorter->iPrev = (u8)(pTask - pSorter->aTask); + pTask->list = pSorter->list; + pSorter->list.pList = 0; + pSorter->list.szPMA = 0; + if( aMem ){ + pSorter->list.aMemory = aMem; + pSorter->nMemory = sqlite3MallocSize(aMem); + }else if( pSorter->list.aMemory ){ + pSorter->list.aMemory = sqlite3Malloc(pSorter->nMemory); + if( !pSorter->list.aMemory ) return SQLITE_NOMEM_BKPT; + } + + rc = vdbeSorterCreateThread(pTask, vdbeSorterFlushThread, pCtx); + } + } + + return rc; +#endif /* SQLITE_MAX_WORKER_THREADS!=0 */ +} + +/* +** Add a record to the sorter. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterWrite( + const VdbeCursor *pCsr, /* Sorter cursor */ + Mem *pVal /* Memory cell containing record */ +){ + VdbeSorter *pSorter; + int rc = SQLITE_OK; /* Return Code */ + SorterRecord *pNew; /* New list element */ + int bFlush; /* True to flush contents of memory to PMA */ + int nReq; /* Bytes of memory required */ + int nPMA; /* Bytes of PMA space required */ + int t; /* serial type of first record field */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + getVarint32NR((const u8*)&pVal->z[1], t); + if( t>0 && t<10 && t!=7 ){ + pSorter->typeMask &= SORTER_TYPE_INTEGER; + }else if( t>10 && (t & 0x01) ){ + pSorter->typeMask &= SORTER_TYPE_TEXT; + }else{ + pSorter->typeMask = 0; + } + + assert( pSorter ); + + /* Figure out whether or not the current contents of memory should be + ** flushed to a PMA before continuing. If so, do so. + ** + ** If using the single large allocation mode (pSorter->aMemory!=0), then + ** flush the contents of memory to a new PMA if (a) at least one value is + ** already in memory and (b) the new value will not fit in memory. + ** + ** Or, if using separate allocations for each record, flush the contents + ** of memory to a PMA if either of the following are true: + ** + ** * The total memory allocated for the in-memory list is greater + ** than (page-size * cache-size), or + ** + ** * The total memory allocated for the in-memory list is greater + ** than (page-size * 10) and sqlite3HeapNearlyFull() returns true. + */ + nReq = pVal->n + sizeof(SorterRecord); + nPMA = pVal->n + sqlite3VarintLen(pVal->n); + if( pSorter->mxPmaSize ){ + if( pSorter->list.aMemory ){ + bFlush = pSorter->iMemory && (pSorter->iMemory+nReq) > pSorter->mxPmaSize; + }else{ + bFlush = ( + (pSorter->list.szPMA > pSorter->mxPmaSize) + || (pSorter->list.szPMA > pSorter->mnPmaSize && sqlite3HeapNearlyFull()) + ); + } + if( bFlush ){ + rc = vdbeSorterFlushPMA(pSorter); + pSorter->list.szPMA = 0; + pSorter->iMemory = 0; + assert( rc!=SQLITE_OK || pSorter->list.pList==0 ); + } + } + + pSorter->list.szPMA += nPMA; + if( nPMA>pSorter->mxKeysize ){ + pSorter->mxKeysize = nPMA; + } + + if( pSorter->list.aMemory ){ + int nMin = pSorter->iMemory + nReq; + + if( nMin>pSorter->nMemory ){ + u8 *aNew; + sqlite3_int64 nNew = 2 * (sqlite3_int64)pSorter->nMemory; + int iListOff = -1; + if( pSorter->list.pList ){ + iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; + } + while( nNew < nMin ) nNew = nNew*2; + if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; + if( nNew < nMin ) nNew = nMin; + aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); + if( !aNew ) return SQLITE_NOMEM_BKPT; + if( iListOff>=0 ){ + pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; + } + pSorter->list.aMemory = aNew; + pSorter->nMemory = nNew; + } + + pNew = (SorterRecord*)&pSorter->list.aMemory[pSorter->iMemory]; + pSorter->iMemory += ROUND8(nReq); + if( pSorter->list.pList ){ + pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); + } + }else{ + pNew = (SorterRecord *)sqlite3Malloc(nReq); + if( pNew==0 ){ + return SQLITE_NOMEM_BKPT; + } + pNew->u.pNext = pSorter->list.pList; + } + + memcpy(SRVAL(pNew), pVal->z, pVal->n); + pNew->nVal = pVal->n; + pSorter->list.pList = pNew; + + return rc; +} + +/* +** Read keys from pIncr->pMerger and populate pIncr->aFile[1]. The format +** of the data stored in aFile[1] is the same as that used by regular PMAs, +** except that the number-of-bytes varint is omitted from the start. +*/ +static int vdbeIncrPopulate(IncrMerger *pIncr){ + int rc = SQLITE_OK; + int rc2; + i64 iStart = pIncr->iStartOff; + SorterFile *pOut = &pIncr->aFile[1]; + SortSubtask *pTask = pIncr->pTask; + MergeEngine *pMerger = pIncr->pMerger; + PmaWriter writer; + assert( pIncr->bEof==0 ); + + vdbeSorterPopulateDebug(pTask, "enter"); + + vdbePmaWriterInit(pOut->pFd, &writer, pTask->pSorter->pgsz, iStart); + while( rc==SQLITE_OK ){ + int dummy; + PmaReader *pReader = &pMerger->aReadr[ pMerger->aTree[1] ]; + int nKey = pReader->nKey; + i64 iEof = writer.iWriteOff + writer.iBufEnd; + + /* Check if the output file is full or if the input has been exhausted. + ** In either case exit the loop. */ + if( pReader->pFd==0 ) break; + if( (iEof + nKey + sqlite3VarintLen(nKey))>(iStart + pIncr->mxSz) ) break; + + /* Write the next key to the output. */ + vdbePmaWriteVarint(&writer, nKey); + vdbePmaWriteBlob(&writer, pReader->aKey, nKey); + assert( pIncr->pMerger->pTask==pTask ); + rc = vdbeMergeEngineStep(pIncr->pMerger, &dummy); + } + + rc2 = vdbePmaWriterFinish(&writer, &pOut->iEof); + if( rc==SQLITE_OK ) rc = rc2; + vdbeSorterPopulateDebug(pTask, "exit"); + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for background threads that populate aFile[1] of +** multi-threaded IncrMerger objects. +*/ +static void *vdbeIncrPopulateThread(void *pCtx){ + IncrMerger *pIncr = (IncrMerger*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( vdbeIncrPopulate(pIncr) ); + pIncr->pTask->bDone = 1; + return pRet; +} + +/* +** Launch a background thread to populate aFile[1] of pIncr. +*/ +static int vdbeIncrBgPopulate(IncrMerger *pIncr){ + void *p = (void*)pIncr; + assert( pIncr->bUseThread ); + return vdbeSorterCreateThread(pIncr->pTask, vdbeIncrPopulateThread, p); +} +#endif + +/* +** This function is called when the PmaReader corresponding to pIncr has +** finished reading the contents of aFile[0]. Its purpose is to "refill" +** aFile[0] such that the PmaReader should start rereading it from the +** beginning. +** +** For single-threaded objects, this is accomplished by literally reading +** keys from pIncr->pMerger and repopulating aFile[0]. +** +** For multi-threaded objects, all that is required is to wait until the +** background thread is finished (if it is not already) and then swap +** aFile[0] and aFile[1] in place. If the contents of pMerger have not +** been exhausted, this function also launches a new background thread +** to populate the new aFile[1]. +** +** SQLITE_OK is returned on success, or an SQLite error code otherwise. +*/ +static int vdbeIncrSwap(IncrMerger *pIncr){ + int rc = SQLITE_OK; + +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + rc = vdbeSorterJoinThread(pIncr->pTask); + + if( rc==SQLITE_OK ){ + SorterFile f0 = pIncr->aFile[0]; + pIncr->aFile[0] = pIncr->aFile[1]; + pIncr->aFile[1] = f0; + } + + if( rc==SQLITE_OK ){ + if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + pIncr->bEof = 1; + }else{ + rc = vdbeIncrBgPopulate(pIncr); + } + } + }else +#endif + { + rc = vdbeIncrPopulate(pIncr); + pIncr->aFile[0] = pIncr->aFile[1]; + if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + pIncr->bEof = 1; + } + } + + return rc; +} + +/* +** Allocate and return a new IncrMerger object to read data from pMerger. +** +** If an OOM condition is encountered, return NULL. In this case free the +** pMerger argument before returning. +*/ +static int vdbeIncrMergerNew( + SortSubtask *pTask, /* The thread that will be using the new IncrMerger */ + MergeEngine *pMerger, /* The MergeEngine that the IncrMerger will control */ + IncrMerger **ppOut /* Write the new IncrMerger here */ +){ + int rc = SQLITE_OK; + IncrMerger *pIncr = *ppOut = (IncrMerger*) + (sqlite3FaultSim(100) ? 0 : sqlite3MallocZero(sizeof(*pIncr))); + if( pIncr ){ + pIncr->pMerger = pMerger; + pIncr->pTask = pTask; + pIncr->mxSz = MAX(pTask->pSorter->mxKeysize+9,pTask->pSorter->mxPmaSize/2); + pTask->file2.iEof += pIncr->mxSz; + }else{ + vdbeMergeEngineFree(pMerger); + rc = SQLITE_NOMEM_BKPT; + } + assert( *ppOut!=0 || rc!=SQLITE_OK ); + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** Set the "use-threads" flag on object pIncr. +*/ +static void vdbeIncrMergerSetThreads(IncrMerger *pIncr){ + pIncr->bUseThread = 1; + pIncr->pTask->file2.iEof -= pIncr->mxSz; +} +#endif /* SQLITE_MAX_WORKER_THREADS>0 */ + + + +/* +** Recompute pMerger->aTree[iOut] by comparing the next keys on the +** two PmaReaders that feed that entry. Neither of the PmaReaders +** are advanced. This routine merely does the comparison. +*/ +static void vdbeMergeEngineCompare( + MergeEngine *pMerger, /* Merge engine containing PmaReaders to compare */ + int iOut /* Store the result in pMerger->aTree[iOut] */ +){ + int i1; + int i2; + int iRes; + PmaReader *p1; + PmaReader *p2; + + assert( iOutnTree && iOut>0 ); + + if( iOut>=(pMerger->nTree/2) ){ + i1 = (iOut - pMerger->nTree/2) * 2; + i2 = i1 + 1; + }else{ + i1 = pMerger->aTree[iOut*2]; + i2 = pMerger->aTree[iOut*2+1]; + } + + p1 = &pMerger->aReadr[i1]; + p2 = &pMerger->aReadr[i2]; + + if( p1->pFd==0 ){ + iRes = i2; + }else if( p2->pFd==0 ){ + iRes = i1; + }else{ + SortSubtask *pTask = pMerger->pTask; + int bCached = 0; + int res; + assert( pTask->pUnpacked!=0 ); /* from vdbeSortSubtaskMain() */ + res = pTask->xCompare( + pTask, &bCached, p1->aKey, p1->nKey, p2->aKey, p2->nKey + ); + if( res<=0 ){ + iRes = i1; + }else{ + iRes = i2; + } + } + + pMerger->aTree[iOut] = iRes; +} + +/* +** Allowed values for the eMode parameter to vdbeMergeEngineInit() +** and vdbePmaReaderIncrMergeInit(). +** +** Only INCRINIT_NORMAL is valid in single-threaded builds (when +** SQLITE_MAX_WORKER_THREADS==0). The other values are only used +** when there exists one or more separate worker threads. +*/ +#define INCRINIT_NORMAL 0 +#define INCRINIT_TASK 1 +#define INCRINIT_ROOT 2 + +/* +** Forward reference required as the vdbeIncrMergeInit() and +** vdbePmaReaderIncrInit() routines are called mutually recursively when +** building a merge tree. +*/ +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); + +/* +** Initialize the MergeEngine object passed as the second argument. Once this +** function returns, the first key of merged data may be read from the +** MergeEngine object in the usual fashion. +** +** If argument eMode is INCRINIT_ROOT, then it is assumed that any IncrMerge +** objects attached to the PmaReader objects that the merger reads from have +** already been populated, but that they have not yet populated aFile[0] and +** set the PmaReader objects up to read from it. In this case all that is +** required is to call vdbePmaReaderNext() on each PmaReader to point it at +** its first key. +** +** Otherwise, if eMode is any value other than INCRINIT_ROOT, then use +** vdbePmaReaderIncrMergeInit() to initialize each PmaReader that feeds data +** to pMerger. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbeMergeEngineInit( + SortSubtask *pTask, /* Thread that will run pMerger */ + MergeEngine *pMerger, /* MergeEngine to initialize */ + int eMode /* One of the INCRINIT_XXX constants */ +){ + int rc = SQLITE_OK; /* Return code */ + int i; /* For looping over PmaReader objects */ + int nTree; /* Number of subtrees to merge */ + + /* Failure to allocate the merge would have been detected prior to + ** invoking this routine */ + assert( pMerger!=0 ); + + /* eMode is always INCRINIT_NORMAL in single-threaded mode */ + assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + + /* Verify that the MergeEngine is assigned to a single thread */ + assert( pMerger->pTask==0 ); + pMerger->pTask = pTask; + + nTree = pMerger->nTree; + for(i=0; i0 && eMode==INCRINIT_ROOT ){ + /* PmaReaders should be normally initialized in order, as if they are + ** reading from the same temp file this makes for more linear file IO. + ** However, in the INCRINIT_ROOT case, if PmaReader aReadr[nTask-1] is + ** in use it will block the vdbePmaReaderNext() call while it uses + ** the main thread to fill its buffer. So calling PmaReaderNext() + ** on this PmaReader before any of the multi-threaded PmaReaders takes + ** better advantage of multi-processor hardware. */ + rc = vdbePmaReaderNext(&pMerger->aReadr[nTree-i-1]); + }else{ + rc = vdbePmaReaderIncrInit(&pMerger->aReadr[i], INCRINIT_NORMAL); + } + if( rc!=SQLITE_OK ) return rc; + } + + for(i=pMerger->nTree-1; i>0; i--){ + vdbeMergeEngineCompare(pMerger, i); + } + return pTask->pUnpacked->errCode; +} + +/* +** The PmaReader passed as the first argument is guaranteed to be an +** incremental-reader (pReadr->pIncr!=0). This function serves to open +** and/or initialize the temp file related fields of the IncrMerge +** object at (pReadr->pIncr). +** +** If argument eMode is set to INCRINIT_NORMAL, then all PmaReaders +** in the sub-tree headed by pReadr are also initialized. Data is then +** loaded into the buffers belonging to pReadr and it is set to point to +** the first key in its range. +** +** If argument eMode is set to INCRINIT_TASK, then pReadr is guaranteed +** to be a multi-threaded PmaReader and this function is being called in a +** background thread. In this case all PmaReaders in the sub-tree are +** initialized as for INCRINIT_NORMAL and the aFile[1] buffer belonging to +** pReadr is populated. However, pReadr itself is not set up to point +** to its first key. A call to vdbePmaReaderNext() is still required to do +** that. +** +** The reason this function does not call vdbePmaReaderNext() immediately +** in the INCRINIT_TASK case is that vdbePmaReaderNext() assumes that it has +** to block on thread (pTask->thread) before accessing aFile[1]. But, since +** this entire function is being run by thread (pTask->thread), that will +** lead to the current background thread attempting to join itself. +** +** Finally, if argument eMode is set to INCRINIT_ROOT, it may be assumed +** that pReadr->pIncr is a multi-threaded IncrMerge objects, and that all +** child-trees have already been initialized using IncrInit(INCRINIT_TASK). +** In this case vdbePmaReaderNext() is called on all child PmaReaders and +** the current PmaReader set to point to the first key in its range. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ + int rc = SQLITE_OK; + IncrMerger *pIncr = pReadr->pIncr; + SortSubtask *pTask = pIncr->pTask; + sqlite3 *db = pTask->pSorter->db; + + /* eMode is always INCRINIT_NORMAL in single-threaded mode */ + assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + + rc = vdbeMergeEngineInit(pTask, pIncr->pMerger, eMode); + + /* Set up the required files for pIncr. A multi-theaded IncrMerge object + ** requires two temp files to itself, whereas a single-threaded object + ** only requires a region of pTask->file2. */ + if( rc==SQLITE_OK ){ + int mxSz = pIncr->mxSz; +#if SQLITE_MAX_WORKER_THREADS>0 + if( pIncr->bUseThread ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[0].pFd); + if( rc==SQLITE_OK ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[1].pFd); + } + }else +#endif + /*if( !pIncr->bUseThread )*/{ + if( pTask->file2.pFd==0 ){ + assert( pTask->file2.iEof>0 ); + rc = vdbeSorterOpenTempFile(db, pTask->file2.iEof, &pTask->file2.pFd); + pTask->file2.iEof = 0; + } + if( rc==SQLITE_OK ){ + pIncr->aFile[1].pFd = pTask->file2.pFd; + pIncr->iStartOff = pTask->file2.iEof; + pTask->file2.iEof += mxSz; + } + } + } + +#if SQLITE_MAX_WORKER_THREADS>0 + if( rc==SQLITE_OK && pIncr->bUseThread ){ + /* Use the current thread to populate aFile[1], even though this + ** PmaReader is multi-threaded. If this is an INCRINIT_TASK object, + ** then this function is already running in background thread + ** pIncr->pTask->thread. + ** + ** If this is the INCRINIT_ROOT object, then it is running in the + ** main VDBE thread. But that is Ok, as that thread cannot return + ** control to the VDBE or proceed with anything useful until the + ** first results are ready from this merger object anyway. + */ + assert( eMode==INCRINIT_ROOT || eMode==INCRINIT_TASK ); + rc = vdbeIncrPopulate(pIncr); + } +#endif + + if( rc==SQLITE_OK && (SQLITE_MAX_WORKER_THREADS==0 || eMode!=INCRINIT_TASK) ){ + rc = vdbePmaReaderNext(pReadr); + } + + return rc; +} + +#if SQLITE_MAX_WORKER_THREADS>0 +/* +** The main routine for vdbePmaReaderIncrMergeInit() operations run in +** background threads. +*/ +static void *vdbePmaReaderBgIncrInit(void *pCtx){ + PmaReader *pReader = (PmaReader*)pCtx; + void *pRet = SQLITE_INT_TO_PTR( + vdbePmaReaderIncrMergeInit(pReader,INCRINIT_TASK) + ); + pReader->pIncr->pTask->bDone = 1; + return pRet; +} +#endif + +/* +** If the PmaReader passed as the first argument is not an incremental-reader +** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it invokes +** the vdbePmaReaderIncrMergeInit() function with the parameters passed to +** this routine to initialize the incremental merge. +** +** If the IncrMerger object is multi-threaded (IncrMerger.bUseThread==1), +** then a background thread is launched to call vdbePmaReaderIncrMergeInit(). +** Or, if the IncrMerger is single threaded, the same function is called +** using the current thread. +*/ +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){ + IncrMerger *pIncr = pReadr->pIncr; /* Incremental merger */ + int rc = SQLITE_OK; /* Return code */ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + assert( pIncr->bUseThread==0 || eMode==INCRINIT_TASK ); + if( pIncr->bUseThread ){ + void *pCtx = (void*)pReadr; + rc = vdbeSorterCreateThread(pIncr->pTask, vdbePmaReaderBgIncrInit, pCtx); + }else +#endif + { + rc = vdbePmaReaderIncrMergeInit(pReadr, eMode); + } + } + return rc; +} + +/* +** Allocate a new MergeEngine object to merge the contents of nPMA level-0 +** PMAs from pTask->file. If no error occurs, set *ppOut to point to +** the new object and return SQLITE_OK. Or, if an error does occur, set *ppOut +** to NULL and return an SQLite error code. +** +** When this function is called, *piOffset is set to the offset of the +** first PMA to read from pTask->file. Assuming no error occurs, it is +** set to the offset immediately following the last byte of the last +** PMA before returning. If an error does occur, then the final value of +** *piOffset is undefined. +*/ +static int vdbeMergeEngineLevel0( + SortSubtask *pTask, /* Sorter task to read from */ + int nPMA, /* Number of PMAs to read */ + i64 *piOffset, /* IN/OUT: Readr offset in pTask->file */ + MergeEngine **ppOut /* OUT: New merge-engine */ +){ + MergeEngine *pNew; /* Merge engine to return */ + i64 iOff = *piOffset; + int i; + int rc = SQLITE_OK; + + *ppOut = pNew = vdbeMergeEngineNew(nPMA); + if( pNew==0 ) rc = SQLITE_NOMEM_BKPT; + + for(i=0; iaReadr[i]; + rc = vdbePmaReaderInit(pTask, &pTask->file, iOff, pReadr, &nDummy); + iOff = pReadr->iEof; + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pNew); + *ppOut = 0; + } + *piOffset = iOff; + return rc; +} + +/* +** Return the depth of a tree comprising nPMA PMAs, assuming a fanout of +** SORTER_MAX_MERGE_COUNT. The returned value does not include leaf nodes. +** +** i.e. +** +** nPMA<=16 -> TreeDepth() == 0 +** nPMA<=256 -> TreeDepth() == 1 +** nPMA<=65536 -> TreeDepth() == 2 +*/ +static int vdbeSorterTreeDepth(int nPMA){ + int nDepth = 0; + i64 nDiv = SORTER_MAX_MERGE_COUNT; + while( nDiv < (i64)nPMA ){ + nDiv = nDiv * SORTER_MAX_MERGE_COUNT; + nDepth++; + } + return nDepth; +} + +/* +** pRoot is the root of an incremental merge-tree with depth nDepth (according +** to vdbeSorterTreeDepth()). pLeaf is the iSeq'th leaf to be added to the +** tree, counting from zero. This function adds pLeaf to the tree. +** +** If successful, SQLITE_OK is returned. If an error occurs, an SQLite error +** code is returned and pLeaf is freed. +*/ +static int vdbeSorterAddToTree( + SortSubtask *pTask, /* Task context */ + int nDepth, /* Depth of tree according to TreeDepth() */ + int iSeq, /* Sequence number of leaf within tree */ + MergeEngine *pRoot, /* Root of tree */ + MergeEngine *pLeaf /* Leaf to add to tree */ +){ + int rc = SQLITE_OK; + int nDiv = 1; + int i; + MergeEngine *p = pRoot; + IncrMerger *pIncr; + + rc = vdbeIncrMergerNew(pTask, pLeaf, &pIncr); + + for(i=1; iaReadr[iIter]; + + if( pReadr->pIncr==0 ){ + MergeEngine *pNew = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if( pNew==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = vdbeIncrMergerNew(pTask, pNew, &pReadr->pIncr); + } + } + if( rc==SQLITE_OK ){ + p = pReadr->pIncr->pMerger; + nDiv = nDiv / SORTER_MAX_MERGE_COUNT; + } + } + + if( rc==SQLITE_OK ){ + p->aReadr[iSeq % SORTER_MAX_MERGE_COUNT].pIncr = pIncr; + }else{ + vdbeIncrFree(pIncr); + } + return rc; +} + +/* +** This function is called as part of a SorterRewind() operation on a sorter +** that has already written two or more level-0 PMAs to one or more temp +** files. It builds a tree of MergeEngine/IncrMerger/PmaReader objects that +** can be used to incrementally merge all PMAs on disk. +** +** If successful, SQLITE_OK is returned and *ppOut set to point to the +** MergeEngine object at the root of the tree before returning. Or, if an +** error occurs, an SQLite error code is returned and the final value +** of *ppOut is undefined. +*/ +static int vdbeSorterMergeTreeBuild( + VdbeSorter *pSorter, /* The VDBE cursor that implements the sort */ + MergeEngine **ppOut /* Write the MergeEngine here */ +){ + MergeEngine *pMain = 0; + int rc = SQLITE_OK; + int iTask; + +#if SQLITE_MAX_WORKER_THREADS>0 + /* If the sorter uses more than one task, then create the top-level + ** MergeEngine here. This MergeEngine will read data from exactly + ** one PmaReader per sub-task. */ + assert( pSorter->bUseThreads || pSorter->nTask==1 ); + if( pSorter->nTask>1 ){ + pMain = vdbeMergeEngineNew(pSorter->nTask); + if( pMain==0 ) rc = SQLITE_NOMEM_BKPT; + } +#endif + + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + SortSubtask *pTask = &pSorter->aTask[iTask]; + assert( pTask->nPMA>0 || SQLITE_MAX_WORKER_THREADS>0 ); + if( SQLITE_MAX_WORKER_THREADS==0 || pTask->nPMA ){ + MergeEngine *pRoot = 0; /* Root node of tree for this task */ + int nDepth = vdbeSorterTreeDepth(pTask->nPMA); + i64 iReadOff = 0; + + if( pTask->nPMA<=SORTER_MAX_MERGE_COUNT ){ + rc = vdbeMergeEngineLevel0(pTask, pTask->nPMA, &iReadOff, &pRoot); + }else{ + int i; + int iSeq = 0; + pRoot = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if( pRoot==0 ) rc = SQLITE_NOMEM_BKPT; + for(i=0; inPMA && rc==SQLITE_OK; i += SORTER_MAX_MERGE_COUNT){ + MergeEngine *pMerger = 0; /* New level-0 PMA merger */ + int nReader; /* Number of level-0 PMAs to merge */ + + nReader = MIN(pTask->nPMA - i, SORTER_MAX_MERGE_COUNT); + rc = vdbeMergeEngineLevel0(pTask, nReader, &iReadOff, &pMerger); + if( rc==SQLITE_OK ){ + rc = vdbeSorterAddToTree(pTask, nDepth, iSeq++, pRoot, pMerger); + } + } + } + + if( rc==SQLITE_OK ){ +#if SQLITE_MAX_WORKER_THREADS>0 + if( pMain!=0 ){ + rc = vdbeIncrMergerNew(pTask, pRoot, &pMain->aReadr[iTask].pIncr); + }else +#endif + { + assert( pMain==0 ); + pMain = pRoot; + } + }else{ + vdbeMergeEngineFree(pRoot); + } + } + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pMain); + pMain = 0; + } + *ppOut = pMain; + return rc; +} + +/* +** This function is called as part of an sqlite3VdbeSorterRewind() operation +** on a sorter that has written two or more PMAs to temporary files. It sets +** up either VdbeSorter.pMerger (for single threaded sorters) or pReader +** (for multi-threaded sorters) so that it can be used to iterate through +** all records stored in the sorter. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ + int rc; /* Return code */ + SortSubtask *pTask0 = &pSorter->aTask[0]; + MergeEngine *pMain = 0; +#if SQLITE_MAX_WORKER_THREADS + sqlite3 *db = pTask0->pSorter->db; + int i; + SorterCompare xCompare = vdbeSorterGetCompare(pSorter); + for(i=0; inTask; i++){ + pSorter->aTask[i].xCompare = xCompare; + } +#endif + + rc = vdbeSorterMergeTreeBuild(pSorter, &pMain); + if( rc==SQLITE_OK ){ +#if SQLITE_MAX_WORKER_THREADS + assert( pSorter->bUseThreads==0 || pSorter->nTask>1 ); + if( pSorter->bUseThreads ){ + int iTask; + PmaReader *pReadr = 0; + SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1]; + rc = vdbeSortAllocUnpacked(pLast); + if( rc==SQLITE_OK ){ + pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); + pSorter->pReader = pReadr; + if( pReadr==0 ) rc = SQLITE_NOMEM_BKPT; + } + if( rc==SQLITE_OK ){ + rc = vdbeIncrMergerNew(pLast, pMain, &pReadr->pIncr); + if( rc==SQLITE_OK ){ + vdbeIncrMergerSetThreads(pReadr->pIncr); + for(iTask=0; iTask<(pSorter->nTask-1); iTask++){ + IncrMerger *pIncr; + if( (pIncr = pMain->aReadr[iTask].pIncr) ){ + vdbeIncrMergerSetThreads(pIncr); + assert( pIncr->pTask!=pLast ); + } + } + for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + /* Check that: + ** + ** a) The incremental merge object is configured to use the + ** right task, and + ** b) If it is using task (nTask-1), it is configured to run + ** in single-threaded mode. This is important, as the + ** root merge (INCRINIT_ROOT) will be using the same task + ** object. + */ + PmaReader *p = &pMain->aReadr[iTask]; + assert( p->pIncr==0 || ( + (p->pIncr->pTask==&pSorter->aTask[iTask]) /* a */ + && (iTask!=pSorter->nTask-1 || p->pIncr->bUseThread==0) /* b */ + )); + rc = vdbePmaReaderIncrInit(p, INCRINIT_TASK); + } + } + pMain = 0; + } + if( rc==SQLITE_OK ){ + rc = vdbePmaReaderIncrMergeInit(pReadr, INCRINIT_ROOT); + } + }else +#endif + { + rc = vdbeMergeEngineInit(pTask0, pMain, INCRINIT_NORMAL); + pSorter->pMerger = pMain; + pMain = 0; + } + } + + if( rc!=SQLITE_OK ){ + vdbeMergeEngineFree(pMain); + } + return rc; +} + + +/* +** Once the sorter has been populated by calls to sqlite3VdbeSorterWrite, +** this function is called to prepare for iterating through the records +** in sorted order. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ + VdbeSorter *pSorter; + int rc = SQLITE_OK; /* Return code */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + assert( pSorter ); + + /* If no data has been written to disk, then do not do so now. Instead, + ** sort the VdbeSorter.pRecord list. The vdbe layer will read data directly + ** from the in-memory list. */ + if( pSorter->bUsePMA==0 ){ + if( pSorter->list.pList ){ + *pbEof = 0; + rc = vdbeSorterSort(&pSorter->aTask[0], &pSorter->list); + }else{ + *pbEof = 1; + } + return rc; + } + + /* Write the current in-memory list to a PMA. When the VdbeSorterWrite() + ** function flushes the contents of memory to disk, it immediately always + ** creates a new list consisting of a single key immediately afterwards. + ** So the list is never empty at this point. */ + assert( pSorter->list.pList ); + rc = vdbeSorterFlushPMA(pSorter); + + /* Join all threads */ + rc = vdbeSorterJoinAll(pSorter, rc); + + vdbeSorterRewindDebug("rewind"); + + /* Assuming no errors have occurred, set up a merger structure to + ** incrementally read and merge all remaining PMAs. */ + assert( pSorter->pReader==0 ); + if( rc==SQLITE_OK ){ + rc = vdbeSorterSetupMerge(pSorter); + *pbEof = 0; + } + + vdbeSorterRewindDebug("rewinddone"); + return rc; +} + +/* +** Advance to the next element in the sorter. Return value: +** +** SQLITE_OK success +** SQLITE_DONE end of data +** otherwise some kind of error. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr){ + VdbeSorter *pSorter; + int rc; /* Return code */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + assert( pSorter->bUsePMA || (pSorter->pReader==0 && pSorter->pMerger==0) ); + if( pSorter->bUsePMA ){ + assert( pSorter->pReader==0 || pSorter->pMerger==0 ); + assert( pSorter->bUseThreads==0 || pSorter->pReader ); + assert( pSorter->bUseThreads==1 || pSorter->pMerger ); +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->bUseThreads ){ + rc = vdbePmaReaderNext(pSorter->pReader); + if( rc==SQLITE_OK && pSorter->pReader->pFd==0 ) rc = SQLITE_DONE; + }else +#endif + /*if( !pSorter->bUseThreads )*/ { + int res = 0; + assert( pSorter->pMerger!=0 ); + assert( pSorter->pMerger->pTask==(&pSorter->aTask[0]) ); + rc = vdbeMergeEngineStep(pSorter->pMerger, &res); + if( rc==SQLITE_OK && res ) rc = SQLITE_DONE; + } + }else{ + SorterRecord *pFree = pSorter->list.pList; + pSorter->list.pList = pFree->u.pNext; + pFree->u.pNext = 0; + if( pSorter->list.aMemory==0 ) vdbeSorterRecordFree(db, pFree); + rc = pSorter->list.pList ? SQLITE_OK : SQLITE_DONE; + } + return rc; +} + +/* +** Return a pointer to a buffer owned by the sorter that contains the +** current key. +*/ +static void *vdbeSorterRowkey( + const VdbeSorter *pSorter, /* Sorter object */ + int *pnKey /* OUT: Size of current key in bytes */ +){ + void *pKey; + if( pSorter->bUsePMA ){ + PmaReader *pReader; +#if SQLITE_MAX_WORKER_THREADS>0 + if( pSorter->bUseThreads ){ + pReader = pSorter->pReader; + }else +#endif + /*if( !pSorter->bUseThreads )*/{ + pReader = &pSorter->pMerger->aReadr[pSorter->pMerger->aTree[1]]; + } + *pnKey = pReader->nKey; + pKey = pReader->aKey; + }else{ + *pnKey = pSorter->list.pList->nVal; + pKey = SRVAL(pSorter->list.pList); + } + return pKey; +} + +/* +** Copy the current sorter key into the memory cell pOut. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){ + VdbeSorter *pSorter; + void *pKey; int nKey; /* Sorter key to copy into pOut */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + pKey = vdbeSorterRowkey(pSorter, &nKey); + if( sqlite3VdbeMemClearAndResize(pOut, nKey) ){ + return SQLITE_NOMEM_BKPT; + } + pOut->n = nKey; + MemSetTypeFlag(pOut, MEM_Blob); + memcpy(pOut->z, pKey, nKey); + + return SQLITE_OK; +} + +/* +** Compare the key in memory cell pVal with the key that the sorter cursor +** passed as the first argument currently points to. For the purposes of +** the comparison, ignore the rowid field at the end of each record. +** +** If the sorter cursor key contains any NULL values, consider it to be +** less than pVal. Even if pVal also contains NULL values. +** +** If an error occurs, return an SQLite error code (i.e. SQLITE_NOMEM). +** Otherwise, set *pRes to a negative, zero or positive value if the +** key in pVal is smaller than, equal to or larger than the current sorter +** key. +** +** This routine forms the core of the OP_SorterCompare opcode, which in +** turn is used to verify uniqueness when constructing a UNIQUE INDEX. +*/ +SQLITE_PRIVATE int sqlite3VdbeSorterCompare( + const VdbeCursor *pCsr, /* Sorter cursor */ + Mem *pVal, /* Value to compare to current sorter key */ + int nKeyCol, /* Compare this many columns */ + int *pRes /* OUT: Result of comparison */ +){ + VdbeSorter *pSorter; + UnpackedRecord *r2; + KeyInfo *pKeyInfo; + int i; + void *pKey; int nKey; /* Sorter key to compare pVal with */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + r2 = pSorter->pUnpacked; + pKeyInfo = pCsr->pKeyInfo; + if( r2==0 ){ + r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( r2==0 ) return SQLITE_NOMEM_BKPT; + r2->nField = nKeyCol; + } + assert( r2->nField==nKeyCol ); + + pKey = vdbeSorterRowkey(pSorter, &nKey); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2); + for(i=0; iaMem[i].flags & MEM_Null ){ + *pRes = -1; + return SQLITE_OK; + } + } + + *pRes = sqlite3VdbeRecordCompare(pVal->n, pVal->z, r2); + return SQLITE_OK; +} + +/************** End of vdbesort.c ********************************************/ +/************** Begin file vdbevtab.c ****************************************/ +/* +** 2020-03-23 +** +** 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 virtual-tables for examining the bytecode content +** of a prepared statement. +*/ +/* #include "sqliteInt.h" */ +#if defined(SQLITE_ENABLE_BYTECODE_VTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) +/* #include "vdbeInt.h" */ + +/* An instance of the bytecode() table-valued function. +*/ +typedef struct bytecodevtab bytecodevtab; +struct bytecodevtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection */ + int bTablesUsed; /* 2 for tables_used(). 0 for bytecode(). */ +}; + +/* A cursor for scanning through the bytecode +*/ +typedef struct bytecodevtab_cursor bytecodevtab_cursor; +struct bytecodevtab_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_stmt *pStmt; /* The statement whose bytecode is displayed */ + int iRowid; /* The rowid of the output table */ + int iAddr; /* Address */ + int needFinalize; /* Cursors owns pStmt and must finalize it */ + int showSubprograms; /* Provide a listing of subprograms */ + Op *aOp; /* Operand array */ + char *zP4; /* Rendered P4 value */ + const char *zType; /* tables_used.type */ + const char *zSchema; /* tables_used.schema */ + const char *zName; /* tables_used.name */ + Mem sub; /* Subprograms */ +}; + +/* +** Create a new bytecode() table-valued function. +*/ +static int bytecodevtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + bytecodevtab *pNew; + int rc; + int isTabUsed = pAux!=0; + const char *azSchema[2] = { + /* bytecode() schema */ + "CREATE TABLE x(" + "addr INT," + "opcode TEXT," + "p1 INT," + "p2 INT," + "p3 INT," + "p4 TEXT," + "p5 INT," + "comment TEXT," + "subprog TEXT," + "stmt HIDDEN" + ");", + + /* Tables_used() schema */ + "CREATE TABLE x(" + "type TEXT," + "schema TEXT," + "name TEXT," + "wr INT," + "subprog TEXT," + "stmt HIDDEN" + ");" + }; + + rc = sqlite3_declare_vtab(db, azSchema[isTabUsed]); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; + pNew->bTablesUsed = isTabUsed*2; + } + return rc; +} + +/* +** This method is the destructor for bytecodevtab objects. +*/ +static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ + bytecodevtab *p = (bytecodevtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new bytecodevtab_cursor object. +*/ +static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + bytecodevtab *pVTab = (bytecodevtab*)p; + bytecodevtab_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + sqlite3VdbeMemInit(&pCur->sub, pVTab->db, 1); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Clear all internal content from a bytecodevtab cursor. +*/ +static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ + sqlite3_free(pCur->zP4); + pCur->zP4 = 0; + sqlite3VdbeMemRelease(&pCur->sub); + sqlite3VdbeMemSetNull(&pCur->sub); + if( pCur->needFinalize ){ + sqlite3_finalize(pCur->pStmt); + } + pCur->pStmt = 0; + pCur->needFinalize = 0; + pCur->zType = 0; + pCur->zSchema = 0; + pCur->zName = 0; +} + +/* +** Destructor for a bytecodevtab_cursor. +*/ +static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtabCursorClear(pCur); + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a bytecodevtab_cursor to its next row of output. +*/ +static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtab *pTab = (bytecodevtab*)cur->pVtab; + int rc; + if( pCur->zP4 ){ + sqlite3_free(pCur->zP4); + pCur->zP4 = 0; + } + if( pCur->zName ){ + pCur->zName = 0; + pCur->zType = 0; + pCur->zSchema = 0; + } + rc = sqlite3VdbeNextOpcode( + (Vdbe*)pCur->pStmt, + pCur->showSubprograms ? &pCur->sub : 0, + pTab->bTablesUsed, + &pCur->iRowid, + &pCur->iAddr, + &pCur->aOp); + if( rc!=SQLITE_OK ){ + sqlite3VdbeMemSetNull(&pCur->sub); + pCur->aOp = 0; + } + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int bytecodevtabEof(sqlite3_vtab_cursor *cur){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + return pCur->aOp==0; +} + +/* +** Return values of columns for the row at which the bytecodevtab_cursor +** is currently pointing. +*/ +static int bytecodevtabColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + bytecodevtab *pVTab = (bytecodevtab*)cur->pVtab; + Op *pOp = pCur->aOp + pCur->iAddr; + if( pVTab->bTablesUsed ){ + if( i==4 ){ + i = 8; + }else{ + if( i<=2 && pCur->zType==0 ){ + Schema *pSchema; + HashElem *k; + int iDb = pOp->p3; + Pgno iRoot = (Pgno)pOp->p2; + sqlite3 *db = pVTab->db; + pSchema = db->aDb[iDb].pSchema; + pCur->zSchema = db->aDb[iDb].zDbSName; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + if( !IsVirtual(pTab) && pTab->tnum==iRoot ){ + pCur->zName = pTab->zName; + pCur->zType = "table"; + break; + } + } + if( pCur->zName==0 ){ + for(k=sqliteHashFirst(&pSchema->idxHash); k; k=sqliteHashNext(k)){ + Index *pIdx = (Index*)sqliteHashData(k); + if( pIdx->tnum==iRoot ){ + pCur->zName = pIdx->zName; + pCur->zType = "index"; + } + } + } + } + i += 10; + } + } + switch( i ){ + case 0: /* addr */ + sqlite3_result_int(ctx, pCur->iAddr); + break; + case 1: /* opcode */ + sqlite3_result_text(ctx, (char*)sqlite3OpcodeName(pOp->opcode), + -1, SQLITE_STATIC); + break; + case 2: /* p1 */ + sqlite3_result_int(ctx, pOp->p1); + break; + case 3: /* p2 */ + sqlite3_result_int(ctx, pOp->p2); + break; + case 4: /* p3 */ + sqlite3_result_int(ctx, pOp->p3); + break; + case 5: /* p4 */ + case 7: /* comment */ + if( pCur->zP4==0 ){ + pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); + } + if( i==5 ){ + sqlite3_result_text(ctx, pCur->zP4, -1, SQLITE_STATIC); + }else{ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + char *zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); + sqlite3_result_text(ctx, zCom, -1, sqlite3_free); +#endif + } + break; + case 6: /* p5 */ + sqlite3_result_int(ctx, pOp->p5); + break; + case 8: { /* subprog */ + Op *aOp = pCur->aOp; + assert( aOp[0].opcode==OP_Init ); + assert( aOp[0].p4.z==0 || strncmp(aOp[0].p4.z,"-" "- ",3)==0 ); + if( pCur->iRowid==pCur->iAddr+1 ){ + break; /* Result is NULL for the main program */ + }else if( aOp[0].p4.z!=0 ){ + sqlite3_result_text(ctx, aOp[0].p4.z+3, -1, SQLITE_STATIC); + }else{ + sqlite3_result_text(ctx, "(FK)", 4, SQLITE_STATIC); + } + break; + } + case 10: /* tables_used.type */ + sqlite3_result_text(ctx, pCur->zType, -1, SQLITE_STATIC); + break; + case 11: /* tables_used.schema */ + sqlite3_result_text(ctx, pCur->zSchema, -1, SQLITE_STATIC); + break; + case 12: /* tables_used.name */ + sqlite3_result_text(ctx, pCur->zName, -1, SQLITE_STATIC); + break; + case 13: /* tables_used.wr */ + sqlite3_result_int(ctx, pOp->opcode==OP_OpenWrite); + break; + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Initialize a cursor. +** +** idxNum==0 means show all subprograms +** idxNum==1 means show only the main bytecode and omit subprograms. +*/ +static int bytecodevtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + bytecodevtab_cursor *pCur = (bytecodevtab_cursor *)pVtabCursor; + bytecodevtab *pVTab = (bytecodevtab *)pVtabCursor->pVtab; + int rc = SQLITE_OK; + + bytecodevtabCursorClear(pCur); + pCur->iRowid = 0; + pCur->iAddr = 0; + pCur->showSubprograms = idxNum==0; + assert( argc==1 ); + if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){ + const char *zSql = (const char*)sqlite3_value_text(argv[0]); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(pVTab->db, zSql, -1, &pCur->pStmt, 0); + pCur->needFinalize = 1; + } + }else{ + pCur->pStmt = (sqlite3_stmt*)sqlite3_value_pointer(argv[0],"stmt-pointer"); + } + if( pCur->pStmt==0 ){ + pVTab->base.zErrMsg = sqlite3_mprintf( + "argument to %s() is not a valid SQL statement", + pVTab->bTablesUsed ? "tables_used" : "bytecode" + ); + rc = SQLITE_ERROR; + }else{ + bytecodevtabNext(pVtabCursor); + } + return rc; +} + +/* +** We must have a single stmt=? constraint that will be passed through +** into the xFilter method. If there is no valid stmt=? constraint, +** then return an SQLITE_CONSTRAINT error. +*/ +static int bytecodevtabBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; + int rc = SQLITE_CONSTRAINT; + struct sqlite3_index_constraint *p; + bytecodevtab *pVTab = (bytecodevtab*)tab; + int iBaseCol = pVTab->bTablesUsed ? 4 : 8; + pIdxInfo->estimatedCost = (double)100; + pIdxInfo->estimatedRows = 100; + pIdxInfo->idxNum = 0; + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->usable==0 ) continue; + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==iBaseCol+1 ){ + rc = SQLITE_OK; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + } + if( p->op==SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn==iBaseCol ){ + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 1; + } + } + return rc; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module bytecodevtabModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ bytecodevtabConnect, + /* xBestIndex */ bytecodevtabBestIndex, + /* xDisconnect */ bytecodevtabDisconnect, + /* xDestroy */ 0, + /* xOpen */ bytecodevtabOpen, + /* xClose */ bytecodevtabClose, + /* xFilter */ bytecodevtabFilter, + /* xNext */ bytecodevtabNext, + /* xEof */ bytecodevtabEof, + /* xColumn */ bytecodevtabColumn, + /* xRowid */ bytecodevtabRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + + +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ + int rc; + rc = sqlite3_create_module(db, "bytecode", &bytecodevtabModule, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module(db, "tables_used", &bytecodevtabModule, &db); + } + return rc; +} +#elif defined(SQLITE_ENABLE_BYTECODE_VTAB) +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3 *db){ return SQLITE_OK; } +#endif /* SQLITE_ENABLE_BYTECODE_VTAB */ + +/************** End of vdbevtab.c ********************************************/ +/************** Begin file memjournal.c **************************************/ +/* +** 2008 October 7 +** +** 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 contains code use to implement an in-memory rollback journal. +** The in-memory rollback journal is used to journal transactions for +** ":memory:" databases and when the journal_mode=MEMORY pragma is used. +** +** Update: The in-memory journal is also used to temporarily cache +** smaller journals that are not critical for power-loss recovery. +** For example, statement journals that are not too big will be held +** entirely in memory, thus reducing the number of file I/O calls, and +** more importantly, reducing temporary file creation events. If these +** journals become too large for memory, they are spilled to disk. But +** in the common case, they are usually small and no file I/O needs to +** occur. +*/ +/* #include "sqliteInt.h" */ + +/* Forward references to internal structures */ +typedef struct MemJournal MemJournal; +typedef struct FilePoint FilePoint; +typedef struct FileChunk FileChunk; + +/* +** The rollback journal is composed of a linked list of these structures. +** +** The zChunk array is always at least 8 bytes in size - usually much more. +** Its actual size is stored in the MemJournal.nChunkSize variable. +*/ +struct FileChunk { + FileChunk *pNext; /* Next chunk in the journal */ + u8 zChunk[8]; /* Content of this chunk */ +}; + +/* +** By default, allocate this many bytes of memory for each FileChunk object. +*/ +#define MEMJOURNAL_DFLT_FILECHUNKSIZE 1024 + +/* +** For chunk size nChunkSize, return the number of bytes that should +** be allocated for each FileChunk structure. +*/ +#define fileChunkSize(nChunkSize) (sizeof(FileChunk) + ((nChunkSize)-8)) + +/* +** An instance of this object serves as a cursor into the rollback journal. +** The cursor can be either for reading or writing. +*/ +struct FilePoint { + sqlite3_int64 iOffset; /* Offset from the beginning of the file */ + FileChunk *pChunk; /* Specific chunk into which cursor points */ +}; + +/* +** This structure is a subclass of sqlite3_file. Each open memory-journal +** is an instance of this class. +*/ +struct MemJournal { + const sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */ + int nChunkSize; /* In-memory chunk-size */ + + int nSpill; /* Bytes of data before flushing */ + FileChunk *pFirst; /* Head of in-memory chunk-list */ + FilePoint endpoint; /* Pointer to the end of the file */ + FilePoint readpoint; /* Pointer to the end of the last xRead() */ + + int flags; /* xOpen flags */ + sqlite3_vfs *pVfs; /* The "real" underlying VFS */ + const char *zJournal; /* Name of the journal file */ +}; + +/* +** Read data from the in-memory journal file. This is the implementation +** of the sqlite3_vfs.xRead method. +*/ +static int memjrnlRead( + sqlite3_file *pJfd, /* The journal file from which to read */ + void *zBuf, /* Put the results here */ + int iAmt, /* Number of bytes to read */ + sqlite_int64 iOfst /* Begin reading at this offset */ +){ + MemJournal *p = (MemJournal *)pJfd; + u8 *zOut = zBuf; + int nRead = iAmt; + int iChunkOffset; + FileChunk *pChunk; + + if( (iAmt+iOfst)>p->endpoint.iOffset ){ + return SQLITE_IOERR_SHORT_READ; + } + assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); + if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ + sqlite3_int64 iOff = 0; + for(pChunk=p->pFirst; + ALWAYS(pChunk) && (iOff+p->nChunkSize)<=iOfst; + pChunk=pChunk->pNext + ){ + iOff += p->nChunkSize; + } + }else{ + pChunk = p->readpoint.pChunk; + assert( pChunk!=0 ); + } + + iChunkOffset = (int)(iOfst%p->nChunkSize); + do { + int iSpace = p->nChunkSize - iChunkOffset; + int nCopy = MIN(nRead, (p->nChunkSize - iChunkOffset)); + memcpy(zOut, (u8*)pChunk->zChunk + iChunkOffset, nCopy); + zOut += nCopy; + nRead -= iSpace; + iChunkOffset = 0; + } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 ); + p->readpoint.iOffset = pChunk ? iOfst+iAmt : 0; + p->readpoint.pChunk = pChunk; + + return SQLITE_OK; +} + +/* +** Free the list of FileChunk structures headed at MemJournal.pFirst. +*/ +static void memjrnlFreeChunks(FileChunk *pFirst){ + FileChunk *pIter; + FileChunk *pNext; + for(pIter=pFirst; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_free(pIter); + } +} + +/* +** Flush the contents of memory to a real file on disk. +*/ +static int memjrnlCreateFile(MemJournal *p){ + int rc; + sqlite3_file *pReal = (sqlite3_file*)p; + MemJournal copy = *p; + + memset(p, 0, sizeof(MemJournal)); + rc = sqlite3OsOpen(copy.pVfs, copy.zJournal, pReal, copy.flags, 0); + if( rc==SQLITE_OK ){ + int nChunk = copy.nChunkSize; + i64 iOff = 0; + FileChunk *pIter; + for(pIter=copy.pFirst; pIter; pIter=pIter->pNext){ + if( iOff + nChunk > copy.endpoint.iOffset ){ + nChunk = copy.endpoint.iOffset - iOff; + } + rc = sqlite3OsWrite(pReal, (u8*)pIter->zChunk, nChunk, iOff); + if( rc ) break; + iOff += nChunk; + } + if( rc==SQLITE_OK ){ + /* No error has occurred. Free the in-memory buffers. */ + memjrnlFreeChunks(copy.pFirst); + } + } + if( rc!=SQLITE_OK ){ + /* If an error occurred while creating or writing to the file, restore + ** the original before returning. This way, SQLite uses the in-memory + ** journal data to roll back changes made to the internal page-cache + ** before this function was called. */ + sqlite3OsClose(pReal); + *p = copy; + } + return rc; +} + + +/* Forward reference */ +static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size); + +/* +** Write data to the file. +*/ +static int memjrnlWrite( + sqlite3_file *pJfd, /* The journal file into which to write */ + const void *zBuf, /* Take data to be written from here */ + int iAmt, /* Number of bytes to write */ + sqlite_int64 iOfst /* Begin writing at this offset into the file */ +){ + MemJournal *p = (MemJournal *)pJfd; + int nWrite = iAmt; + u8 *zWrite = (u8 *)zBuf; + + /* If the file should be created now, create it and write the new data + ** into the file on disk. */ + if( p->nSpill>0 && (iAmt+iOfst)>p->nSpill ){ + int rc = memjrnlCreateFile(p); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pJfd, zBuf, iAmt, iOfst); + } + return rc; + } + + /* If the contents of this write should be stored in memory */ + else{ + /* An in-memory journal file should only ever be appended to. Random + ** access writes are not required. The only exception to this is when + ** the in-memory journal is being used by a connection using the + ** atomic-write optimization. In this case the first 28 bytes of the + ** journal file may be written as part of committing the transaction. */ + assert( iOfst<=p->endpoint.iOffset ); + if( iOfst>0 && iOfst!=p->endpoint.iOffset ){ + memjrnlTruncate(pJfd, iOfst); + } + if( iOfst==0 && p->pFirst ){ + assert( p->nChunkSize>iAmt ); + memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt); + }else{ + while( nWrite>0 ){ + FileChunk *pChunk = p->endpoint.pChunk; + int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); + int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset); + + assert( pChunk!=0 || iChunkOffset==0 ); + if( iChunkOffset==0 ){ + /* New chunk is required to extend the file. */ + FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); + if( !pNew ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->pNext = 0; + if( pChunk ){ + assert( p->pFirst ); + pChunk->pNext = pNew; + }else{ + assert( !p->pFirst ); + p->pFirst = pNew; + } + pChunk = p->endpoint.pChunk = pNew; + } + + assert( pChunk!=0 ); + memcpy((u8*)pChunk->zChunk + iChunkOffset, zWrite, iSpace); + zWrite += iSpace; + nWrite -= iSpace; + p->endpoint.iOffset += iSpace; + } + } + } + + return SQLITE_OK; +} + +/* +** Truncate the in-memory file. +*/ +static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ + MemJournal *p = (MemJournal *)pJfd; + assert( p->endpoint.pChunk==0 || p->endpoint.pChunk->pNext==0 ); + if( sizeendpoint.iOffset ){ + FileChunk *pIter = 0; + if( size==0 ){ + memjrnlFreeChunks(p->pFirst); + p->pFirst = 0; + }else{ + i64 iOff = p->nChunkSize; + for(pIter=p->pFirst; ALWAYS(pIter) && iOffpNext){ + iOff += p->nChunkSize; + } + if( ALWAYS(pIter) ){ + memjrnlFreeChunks(pIter->pNext); + pIter->pNext = 0; + } + } + + p->endpoint.pChunk = pIter; + p->endpoint.iOffset = size; + p->readpoint.pChunk = 0; + p->readpoint.iOffset = 0; + } + return SQLITE_OK; +} + +/* +** Close the file. +*/ +static int memjrnlClose(sqlite3_file *pJfd){ + MemJournal *p = (MemJournal *)pJfd; + memjrnlFreeChunks(p->pFirst); + return SQLITE_OK; +} + +/* +** Sync the file. +** +** If the real file has been created, call its xSync method. Otherwise, +** syncing an in-memory journal is a no-op. +*/ +static int memjrnlSync(sqlite3_file *pJfd, int flags){ + UNUSED_PARAMETER2(pJfd, flags); + return SQLITE_OK; +} + +/* +** Query the size of the file in bytes. +*/ +static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ + MemJournal *p = (MemJournal *)pJfd; + *pSize = (sqlite_int64) p->endpoint.iOffset; + return SQLITE_OK; +} + +/* +** Table of methods for MemJournal sqlite3_file object. +*/ +static const struct sqlite3_io_methods MemJournalMethods = { + 1, /* iVersion */ + memjrnlClose, /* xClose */ + memjrnlRead, /* xRead */ + memjrnlWrite, /* xWrite */ + memjrnlTruncate, /* xTruncate */ + memjrnlSync, /* xSync */ + memjrnlFileSize, /* xFileSize */ + 0, /* xLock */ + 0, /* xUnlock */ + 0, /* xCheckReservedLock */ + 0, /* xFileControl */ + 0, /* xSectorSize */ + 0, /* xDeviceCharacteristics */ + 0, /* xShmMap */ + 0, /* xShmLock */ + 0, /* xShmBarrier */ + 0, /* xShmUnmap */ + 0, /* xFetch */ + 0 /* xUnfetch */ +}; + +/* +** Open a journal file. +** +** The behaviour of the journal file depends on the value of parameter +** nSpill. If nSpill is 0, then the journal file is always create and +** accessed using the underlying VFS. If nSpill is less than zero, then +** all content is always stored in main-memory. Finally, if nSpill is a +** positive value, then the journal file is initially created in-memory +** but may be flushed to disk later on. In this case the journal file is +** flushed to disk either when it grows larger than nSpill bytes in size, +** or when sqlite3JournalCreate() is called. +*/ +SQLITE_PRIVATE int sqlite3JournalOpen( + sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ + const char *zName, /* Name of the journal file */ + sqlite3_file *pJfd, /* Preallocated, blank file handle */ + int flags, /* Opening flags */ + int nSpill /* Bytes buffered before opening the file */ +){ + MemJournal *p = (MemJournal*)pJfd; + + /* Zero the file-handle object. If nSpill was passed zero, initialize + ** it using the sqlite3OsOpen() function of the underlying VFS. In this + ** case none of the code in this module is executed as a result of calls + ** made on the journal file-handle. */ + memset(p, 0, sizeof(MemJournal)); + if( nSpill==0 ){ + return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); + } + + if( nSpill>0 ){ + p->nChunkSize = nSpill; + }else{ + p->nChunkSize = 8 + MEMJOURNAL_DFLT_FILECHUNKSIZE - sizeof(FileChunk); + assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) ); + } + + pJfd->pMethods = (const sqlite3_io_methods*)&MemJournalMethods; + p->nSpill = nSpill; + p->flags = flags; + p->zJournal = zName; + p->pVfs = pVfs; + return SQLITE_OK; +} + +/* +** Open an in-memory journal file. +*/ +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ + sqlite3JournalOpen(0, 0, pJfd, 0, -1); +} + +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +/* +** If the argument p points to a MemJournal structure that is not an +** in-memory-only journal file (i.e. is one that was opened with a +ve +** nSpill parameter or as SQLITE_OPEN_MAIN_JOURNAL), and the underlying +** file has not yet been created, create it now. +*/ +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *pJfd){ + int rc = SQLITE_OK; + MemJournal *p = (MemJournal*)pJfd; + if( pJfd->pMethods==&MemJournalMethods && ( +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + p->nSpill>0 +#else + /* While this appears to not be possible without ATOMIC_WRITE, the + ** paths are complex, so it seems prudent to leave the test in as + ** a NEVER(), in case our analysis is subtly flawed. */ + NEVER(p->nSpill>0) +#endif +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + || (p->flags & SQLITE_OPEN_MAIN_JOURNAL) +#endif + )){ + rc = memjrnlCreateFile(p); + } + return rc; +} +#endif + +/* +** The file-handle passed as the only argument is open on a journal file. +** Return true if this "journal file" is currently stored in heap memory, +** or false otherwise. +*/ +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p){ + return p->pMethods==&MemJournalMethods; +} + +/* +** Return the number of bytes required to store a JournalFile that uses vfs +** pVfs to create the underlying on-disk files. +*/ +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ + return MAX(pVfs->szOsFile, (int)sizeof(MemJournal)); +} + +/************** End of memjournal.c ******************************************/ +/************** Begin file crypto.c ******************************************/ +/* +** SQLCipher +** http://sqlcipher.net +** +** Copyright (c) 2008 - 2013, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + +/* #include */ +/************** Include sqlcipher.h in the middle of crypto.c ****************/ +/************** Begin file sqlcipher.h ***************************************/ +/* +** SQLCipher +** sqlcipher.h developed by Stephen Lombardo (Zetetic LLC) +** sjlombardo at zetetic dot net +** http://zetetic.net +** +** Copyright (c) 2008, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +#ifndef SQLCIPHER_H +#define SQLCIPHER_H + +/* #include "sqlite3.h" */ + +#define SQLCIPHER_HMAC_SHA1 0 +#define SQLCIPHER_HMAC_SHA1_LABEL "HMAC_SHA1" +#define SQLCIPHER_HMAC_SHA256 1 +#define SQLCIPHER_HMAC_SHA256_LABEL "HMAC_SHA256" +#define SQLCIPHER_HMAC_SHA512 2 +#define SQLCIPHER_HMAC_SHA512_LABEL "HMAC_SHA512" + + +#define SQLCIPHER_PBKDF2_HMAC_SHA1 0 +#define SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL "PBKDF2_HMAC_SHA1" +#define SQLCIPHER_PBKDF2_HMAC_SHA256 1 +#define SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL "PBKDF2_HMAC_SHA256" +#define SQLCIPHER_PBKDF2_HMAC_SHA512 2 +#define SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL "PBKDF2_HMAC_SHA512" + + +typedef struct { + int (*activate)(void *ctx); + int (*deactivate)(void *ctx); + const char* (*get_provider_name)(void *ctx); + int (*add_random)(void *ctx, void *buffer, int length); + int (*random)(void *ctx, void *buffer, int length); + int (*hmac)(void *ctx, int algorithm, unsigned char *hmac_key, int key_sz, unsigned char *in, int in_sz, unsigned char *in2, int in2_sz, unsigned char *out); + int (*kdf)(void *ctx, int algorithm, const unsigned char *pass, int pass_sz, unsigned char* salt, int salt_sz, int workfactor, int key_sz, unsigned char *key); + int (*cipher)(void *ctx, int mode, unsigned char *key, int key_sz, unsigned char *iv, unsigned char *in, int in_sz, unsigned char *out); + const char* (*get_cipher)(void *ctx); + int (*get_key_sz)(void *ctx); + int (*get_iv_sz)(void *ctx); + int (*get_block_sz)(void *ctx); + int (*get_hmac_sz)(void *ctx, int algorithm); + int (*ctx_init)(void **ctx); + int (*ctx_free)(void **ctx); + int (*fips_status)(void *ctx); + const char* (*get_provider_version)(void *ctx); +} sqlcipher_provider; + +/* utility functions */ +void* sqlcipher_malloc(sqlite_uint64); +void sqlcipher_mlock(void *, sqlite_uint64); +void sqlcipher_munlock(void *, sqlite_uint64); +void* sqlcipher_memset(void *, unsigned char, sqlite_uint64); +int sqlcipher_ismemset(const void *, unsigned char, sqlite_uint64); +int sqlcipher_memcmp(const void *, const void *, int); +void sqlcipher_free(void *, sqlite_uint64); +char* sqlcipher_version(); + +/* provider interfaces */ +int sqlcipher_register_provider(sqlcipher_provider *); +sqlcipher_provider* sqlcipher_get_provider(void); + +#define SQLCIPHER_MUTEX_PROVIDER 0 +#define SQLCIPHER_MUTEX_PROVIDER_ACTIVATE 1 +#define SQLCIPHER_MUTEX_PROVIDER_RAND 2 +#define SQLCIPHER_MUTEX_RESERVED1 3 +#define SQLCIPHER_MUTEX_RESERVED2 4 +#define SQLCIPHER_MUTEX_RESERVED3 5 +#define SQLCIPHER_MUTEX_COUNT 6 + +sqlite3_mutex* sqlcipher_mutex(int); + +#endif +#endif +/* END SQLCIPHER */ + + +/************** End of sqlcipher.h *******************************************/ +/************** Continuing where we left off in crypto.c *********************/ +/************** Include crypto.h in the middle of crypto.c *******************/ +/************** Begin file crypto.h ******************************************/ +/* +** SQLCipher +** crypto.h developed by Stephen Lombardo (Zetetic LLC) +** sjlombardo at zetetic dot net +** http://zetetic.net +** +** Copyright (c) 2008, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +#ifndef CRYPTO_H +#define CRYPTO_H + +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ +/* #include "pager.h" */ +/* #include "vdbeInt.h" */ + +#ifdef __ANDROID__ +#include +#endif + +/* #include */ + +#if defined(_WIN32) || defined(SQLITE_OS_WINRT) +/* #include ** amalgamator: dontcache ** */ +#else +/* #include ** amalgamator: dontcache ** */ +#endif + +#ifndef OMIT_MEMLOCK +#if defined(__unix__) || defined(__APPLE__) || defined(_AIX) +/* #include ** amalgamator: dontcache ** */ +/* #include ** amalgamator: dontcache ** */ +#include /* amalgamator: dontcache */ +/* #include ** amalgamator: dontcache ** */ +#endif +#endif + +/* #include "sqlcipher.h" */ + +/* extensions defined in pager.c */ +void *sqlcipherPagerGetCodec(Pager*); +void sqlcipherPagerSetCodec(Pager*, void *(*)(void*,void*,Pgno,int), void (*)(void*,int,int), void (*)(void*), void *); +SQLITE_API int sqlite3pager_is_sj_pgno(Pager*, Pgno); +SQLITE_API void sqlite3pager_error(Pager*, int); +SQLITE_API void sqlite3pager_reset(Pager *pPager); +/* end extensions defined in pager.c */ + +#if !defined (SQLCIPHER_CRYPTO_CC) \ + && !defined (SQLCIPHER_CRYPTO_LIBTOMCRYPT) \ + && !defined (SQLCIPHER_CRYPTO_NSS) \ + && !defined (SQLCIPHER_CRYPTO_OPENSSL) +#define SQLCIPHER_CRYPTO_OPENSSL +#endif + +#define FILE_HEADER_SZ 16 + +#define CIPHER_XSTR(s) CIPHER_STR(s) +#define CIPHER_STR(s) #s + +#ifndef CIPHER_VERSION_NUMBER +#define CIPHER_VERSION_NUMBER 4.5.2 +#endif + +#ifndef CIPHER_VERSION_BUILD +#define CIPHER_VERSION_BUILD community +#endif + +#define CIPHER_DECRYPT 0 +#define CIPHER_ENCRYPT 1 + +#define CIPHER_READ_CTX 0 +#define CIPHER_WRITE_CTX 1 +#define CIPHER_READWRITE_CTX 2 + +#ifndef PBKDF2_ITER +#define PBKDF2_ITER 256000 +#endif + +/* possible flags for cipher_ctx->flags */ +#define CIPHER_FLAG_HMAC 0x01 +#define CIPHER_FLAG_LE_PGNO 0x02 +#define CIPHER_FLAG_BE_PGNO 0x04 + +#ifndef DEFAULT_CIPHER_FLAGS +#define DEFAULT_CIPHER_FLAGS CIPHER_FLAG_HMAC | CIPHER_FLAG_LE_PGNO +#endif + + +/* by default, sqlcipher will use a reduced number of iterations to generate + the HMAC key / or transform a raw cipher key + */ +#ifndef FAST_PBKDF2_ITER +#define FAST_PBKDF2_ITER 2 +#endif + +/* this if a fixed random array that will be xor'd with the database salt to ensure that the + salt passed to the HMAC key derivation function is not the same as that used to derive + the encryption key. This can be overridden at compile time but it will make the resulting + binary incompatible with the default builds when using HMAC. A future version of SQLcipher + will likely allow this to be defined at runtime via pragma */ +#ifndef HMAC_SALT_MASK +#define HMAC_SALT_MASK 0x3a +#endif + +#ifndef CIPHER_MAX_IV_SZ +#define CIPHER_MAX_IV_SZ 16 +#endif + +#ifndef CIPHER_MAX_KEY_SZ +#define CIPHER_MAX_KEY_SZ 64 +#endif + + +/* +** Simple shared routines for converting hex char strings to binary data + */ +static int cipher_hex2int(char c) { + return (c>='0' && c<='9') ? (c)-'0' : + (c>='A' && c<='F') ? (c)-'A'+10 : + (c>='a' && c<='f') ? (c)-'a'+10 : 0; +} + +static void cipher_hex2bin(const unsigned char *hex, int sz, unsigned char *out){ + int i; + for(i = 0; i < sz; i += 2){ + out[i/2] = (cipher_hex2int(hex[i])<<4) | cipher_hex2int(hex[i+1]); + } +} + +static void cipher_bin2hex(const unsigned char* in, int sz, char *out) { + int i; + for(i=0; i < sz; i++) { + sqlite3_snprintf(3, out + (i*2), "%02x ", in[i]); + } +} + +static int cipher_isHex(const unsigned char *hex, int sz){ + int i; + for(i = 0; i < sz; i++) { + unsigned char c = hex[i]; + if ((c < '0' || c > '9') && + (c < 'A' || c > 'F') && + (c < 'a' || c > 'f')) { + return 0; + } + } + return 1; +} + +/* possible flags for simulating specific test conditions */ +#ifdef SQLCIPHER_TEST +#define TEST_FAIL_ENCRYPT 0x01 +#define TEST_FAIL_DECRYPT 0x02 +#define TEST_FAIL_MIGRATE 0x04 +unsigned int sqlcipher_get_test_flags(void); +void sqlcipher_set_test_flags(unsigned int); +int sqlcipher_get_test_rand(void); +void sqlcipher_set_test_rand(int); +int sqlcipher_get_test_fail(void); +#endif + +/* extensions defined in crypto_impl.c */ +/* the default implementation of SQLCipher uses a cipher_ctx + to keep track of read / write state separately. The following + struct and associated functions are defined here */ +typedef struct { + int derive_key; + int pass_sz; + unsigned char *key; + unsigned char *hmac_key; + unsigned char *pass; + char *keyspec; +} cipher_ctx; + + +typedef struct { + int store_pass; + int kdf_iter; + int fast_kdf_iter; + int kdf_salt_sz; + int key_sz; + int iv_sz; + int block_sz; + int page_sz; + int keyspec_sz; + int reserve_sz; + int hmac_sz; + int plaintext_header_sz; + int hmac_algorithm; + int kdf_algorithm; + unsigned int skip_read_hmac; + unsigned int need_kdf_salt; + unsigned int flags; + unsigned char *kdf_salt; + unsigned char *hmac_kdf_salt; + unsigned char *buffer; + Btree *pBt; + cipher_ctx *read_ctx; + cipher_ctx *write_ctx; + sqlcipher_provider *provider; + void *provider_ctx; +} codec_ctx ; + +/* crypto.c functions */ +int sqlcipher_codec_pragma(sqlite3*, int, Parse*, const char *, const char*); +int sqlcipherCodecAttach(sqlite3*, int, const void *, int); +void sqlcipherCodecGetKey(sqlite3*, int, void**, int*); +void sqlcipher_exportFunc(sqlite3_context *, int, sqlite3_value **); + +/* crypto_impl.c functions */ + +void sqlcipher_init_memmethods(void); + +/* activation and initialization */ +void sqlcipher_activate(void); +void sqlcipher_deactivate(void); + +int sqlcipher_codec_ctx_init(codec_ctx **, Db *, Pager *, const void *, int); +void sqlcipher_codec_ctx_free(codec_ctx **); +int sqlcipher_codec_key_derive(codec_ctx *); +int sqlcipher_codec_key_copy(codec_ctx *, int); + +/* page cipher implementation */ +int sqlcipher_page_cipher(codec_ctx *, int, Pgno, int, int, unsigned char *, unsigned char *); + +/* context setters & getters */ +void sqlcipher_codec_ctx_set_error(codec_ctx *, int); + +void sqlcipher_codec_get_pass(codec_ctx *, void **, int *); +int sqlcipher_codec_ctx_set_pass(codec_ctx *, const void *, int, int); +void sqlcipher_codec_get_keyspec(codec_ctx *, void **zKey, int *nKey); + +int sqlcipher_codec_ctx_set_pagesize(codec_ctx *, int); +int sqlcipher_codec_ctx_get_pagesize(codec_ctx *); +int sqlcipher_codec_ctx_get_reservesize(codec_ctx *); + +void sqlcipher_set_default_pagesize(int page_size); +int sqlcipher_get_default_pagesize(void); + +void sqlcipher_set_default_kdf_iter(int iter); +int sqlcipher_get_default_kdf_iter(void); +int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *, int); +int sqlcipher_codec_ctx_get_kdf_iter(codec_ctx *ctx); + +int sqlcipher_codec_ctx_set_kdf_salt(codec_ctx *ctx, unsigned char *salt, int sz); +int sqlcipher_codec_ctx_get_kdf_salt(codec_ctx *ctx, void **salt); + +int sqlcipher_codec_ctx_set_fast_kdf_iter(codec_ctx *, int); +int sqlcipher_codec_ctx_get_fast_kdf_iter(codec_ctx *); + +const char* sqlcipher_codec_ctx_get_cipher(codec_ctx *ctx); + +void* sqlcipher_codec_ctx_get_data(codec_ctx *); + +void sqlcipher_set_default_use_hmac(int use); +int sqlcipher_get_default_use_hmac(void); + +void sqlcipher_set_hmac_salt_mask(unsigned char mask); +unsigned char sqlcipher_get_hmac_salt_mask(void); + +int sqlcipher_codec_ctx_set_use_hmac(codec_ctx *ctx, int use); +int sqlcipher_codec_ctx_get_use_hmac(codec_ctx *ctx); + +int sqlcipher_codec_ctx_set_flag(codec_ctx *ctx, unsigned int flag); +int sqlcipher_codec_ctx_unset_flag(codec_ctx *ctx, unsigned int flag); +int sqlcipher_codec_ctx_get_flag(codec_ctx *ctx, unsigned int flag); + +const char* sqlcipher_codec_get_cipher_provider(codec_ctx *ctx); +int sqlcipher_codec_ctx_migrate(codec_ctx *ctx); +int sqlcipher_codec_add_random(codec_ctx *ctx, const char *data, int random_sz); +int sqlcipher_cipher_profile(sqlite3 *db, const char *destination); +int sqlcipher_codec_get_store_pass(codec_ctx *ctx); +void sqlcipher_codec_get_pass(codec_ctx *ctx, void **zKey, int *nKey); +void sqlcipher_codec_set_store_pass(codec_ctx *ctx, int value); +int sqlcipher_codec_fips_status(codec_ctx *ctx); +const char* sqlcipher_codec_get_provider_version(codec_ctx *ctx); + +int sqlcipher_set_default_plaintext_header_size(int size); +int sqlcipher_get_default_plaintext_header_size(void); +int sqlcipher_codec_ctx_set_plaintext_header_size(codec_ctx *ctx, int size); +int sqlcipher_codec_ctx_get_plaintext_header_size(codec_ctx *ctx); + +int sqlcipher_set_default_hmac_algorithm(int algorithm); +int sqlcipher_get_default_hmac_algorithm(void); +int sqlcipher_codec_ctx_set_hmac_algorithm(codec_ctx *ctx, int algorithm); +int sqlcipher_codec_ctx_get_hmac_algorithm(codec_ctx *ctx); + +int sqlcipher_set_default_kdf_algorithm(int algorithm); +int sqlcipher_get_default_kdf_algorithm(void); +int sqlcipher_codec_ctx_set_kdf_algorithm(codec_ctx *ctx, int algorithm); +int sqlcipher_codec_ctx_get_kdf_algorithm(codec_ctx *ctx); + +void sqlcipher_set_mem_security(int); +int sqlcipher_get_mem_security(void); + +int sqlcipher_find_db_index(sqlite3 *db, const char *zDb); + +int sqlcipher_codec_ctx_integrity_check(codec_ctx *, Parse *, char *); + +int sqlcipher_set_log(const char *destination); +void sqlcipher_set_log_level(unsigned int level); +void sqlcipher_log(unsigned int tag, const char *message, ...); + +#define SQLCIPHER_LOG_NONE 0x00 +#define SQLCIPHER_LOG_ERROR 0x01 +#define SQLCIPHER_LOG_WARN 0x02 +#define SQLCIPHER_LOG_INFO 0x04 +#define SQLCIPHER_LOG_DEBUG 0x08 +#define SQLCIPHER_LOG_TRACE 0x10 +#define SQLCIPHER_LOG_ALL 0xffffffff + +void sqlcipher_vdbe_return_string(Parse*, const char*, const char*, int); + +#ifdef CODEC_DEBUG_PAGEDATA +#define CODEC_HEXDUMP(DESC,BUFFER,LEN) \ + { \ + int __pctr; \ + printf(DESC); \ + for(__pctr=0; __pctr < LEN; __pctr++) { \ + if(__pctr % 16 == 0) printf("\n%05x: ",__pctr); \ + printf("%02x ",((unsigned char*) BUFFER)[__pctr]); \ + } \ + printf("\n"); \ + fflush(stdout); \ + } +#else +#define CODEC_HEXDUMP(DESC,BUFFER,LEN) +#endif + +#endif +#endif +/* END SQLCIPHER */ + +/************** End of crypto.h **********************************************/ +/************** Continuing where we left off in crypto.c *********************/ + +#ifdef SQLCIPHER_EXT +#include "sqlcipher_ext.h" +#endif + +void sqlcipher_vdbe_return_string(Parse *pParse, const char *zLabel, const char *value, int value_type){ + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC); + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, value, value_type); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); +} + +static int codec_set_btree_to_codec_pagesize(sqlite3 *db, Db *pDb, codec_ctx *ctx) { + int rc, page_sz, reserve_sz; + + page_sz = sqlcipher_codec_ctx_get_pagesize(ctx); + reserve_sz = sqlcipher_codec_ctx_get_reservesize(ctx); + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "codec_set_btree_to_codec_pagesize: sqlite3BtreeSetPageSize() size=%d reserve=%d", page_sz, reserve_sz); + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "codec_set_btree_to_codec_pagesize: entering database mutex %p", db->mutex); + sqlite3_mutex_enter(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "codec_set_btree_to_codec_pagesize: entered database mutex %p", db->mutex); + db->nextPagesize = page_sz; + + /* before forcing the page size we need to unset the BTS_PAGESIZE_FIXED flag, else + sqliteBtreeSetPageSize will block the change */ + pDb->pBt->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; + rc = sqlite3BtreeSetPageSize(pDb->pBt, page_sz, reserve_sz, 0); + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "codec_set_btree_to_codec_pagesize: sqlite3BtreeSetPageSize returned %d", rc); + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "codec_set_btree_to_codec_pagesize: leaving database mutex %p", db->mutex); + sqlite3_mutex_leave(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "codec_set_btree_to_codec_pagesize: left database mutex %p", db->mutex); + + return rc; +} + +static int codec_set_pass_key(sqlite3* db, int nDb, const void *zKey, int nKey, int for_ctx) { + struct Db *pDb = &db->aDb[nDb]; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "codec_set_pass_key: db=%p nDb=%d for_ctx=%d", db, nDb, for_ctx); + if(pDb->pBt) { + codec_ctx *ctx = (codec_ctx*) sqlcipherPagerGetCodec(pDb->pBt->pBt->pPager); + + if(ctx) { + return sqlcipher_codec_ctx_set_pass(ctx, zKey, nKey, for_ctx); + } else { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "codec_set_pass_key: error ocurred fetching codec from pager on db %d", nDb); + return SQLITE_ERROR; + } + } + sqlcipher_log(SQLCIPHER_LOG_ERROR, "codec_set_pass_key: no btree present on db %d", nDb); + return SQLITE_ERROR; +} + +int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLeft, const char *zRight) { + struct Db *pDb = &db->aDb[iDb]; + codec_ctx *ctx = NULL; + int rc; + + if(pDb->pBt) { + ctx = (codec_ctx*) sqlcipherPagerGetCodec(pDb->pBt->pBt->pPager); + } + + if(sqlite3_stricmp(zLeft, "key") !=0 && sqlite3_stricmp(zLeft, "rekey") != 0) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_pragma: db=%p iDb=%d pParse=%p zLeft=%s zRight=%s ctx=%p", db, iDb, pParse, zLeft, zRight, ctx); + } + +#ifdef SQLCIPHER_EXT + if(sqlcipher_ext_pragma(db, iDb, pParse, zLeft, zRight)) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_pragma: PRAGMA handled by sqlcipher_ext_pragma"); + } else +#endif +#ifdef SQLCIPHER_TEST + if( sqlite3_stricmp(zLeft,"cipher_test_on")==0 ){ + if( zRight ) { + unsigned int flags = sqlcipher_get_test_flags(); + if(sqlite3_stricmp(zRight, "fail_encrypt")==0) { + flags |= TEST_FAIL_ENCRYPT; + } else + if(sqlite3_stricmp(zRight, "fail_decrypt")==0) { + flags |= TEST_FAIL_DECRYPT; + } else + if(sqlite3_stricmp(zRight, "fail_migrate")==0) { + flags |= TEST_FAIL_MIGRATE; + } + sqlcipher_set_test_flags(flags); + } + } else + if( sqlite3_stricmp(zLeft,"cipher_test_off")==0 ){ + if( zRight ) { + unsigned int flags = sqlcipher_get_test_flags(); + if(sqlite3_stricmp(zRight, "fail_encrypt")==0) { + flags &= ~TEST_FAIL_ENCRYPT; + } else + if(sqlite3_stricmp(zRight, "fail_decrypt")==0) { + flags &= ~TEST_FAIL_DECRYPT; + } else + if(sqlite3_stricmp(zRight, "fail_migrate")==0) { + flags &= ~TEST_FAIL_MIGRATE; + } + sqlcipher_set_test_flags(flags); + } + } else + if( sqlite3_stricmp(zLeft,"cipher_test")==0 ){ + char *flags = sqlite3_mprintf("%u", sqlcipher_get_test_flags()); + sqlcipher_vdbe_return_string(pParse, "cipher_test", flags, P4_DYNAMIC); + }else + if( sqlite3_stricmp(zLeft,"cipher_test_rand")==0 ){ + if( zRight ) { + int rand = atoi(zRight); + sqlcipher_set_test_rand(rand); + } else { + char *rand = sqlite3_mprintf("%d", sqlcipher_get_test_rand()); + sqlcipher_vdbe_return_string(pParse, "cipher_test_rand", rand, P4_DYNAMIC); + } + } else +#endif + if( sqlite3_stricmp(zLeft, "cipher_fips_status")== 0 && !zRight ){ + if(ctx) { + char *fips_mode_status = sqlite3_mprintf("%d", sqlcipher_codec_fips_status(ctx)); + sqlcipher_vdbe_return_string(pParse, "cipher_fips_status", fips_mode_status, P4_DYNAMIC); + } + } else + if( sqlite3_stricmp(zLeft, "cipher_store_pass")==0 && zRight ) { + if(ctx) { + char *deprecation = "PRAGMA cipher_store_pass is deprecated, please remove from use"; + sqlcipher_codec_set_store_pass(ctx, sqlite3GetBoolean(zRight, 1)); + sqlcipher_vdbe_return_string(pParse, "cipher_store_pass", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); + } + } else + if( sqlite3_stricmp(zLeft, "cipher_store_pass")==0 && !zRight ) { + if(ctx){ + char *store_pass_value = sqlite3_mprintf("%d", sqlcipher_codec_get_store_pass(ctx)); + sqlcipher_vdbe_return_string(pParse, "cipher_store_pass", store_pass_value, P4_DYNAMIC); + } + } + if( sqlite3_stricmp(zLeft, "cipher_profile")== 0 && zRight ){ + char *profile_status = sqlite3_mprintf("%d", sqlcipher_cipher_profile(db, zRight)); + sqlcipher_vdbe_return_string(pParse, "cipher_profile", profile_status, P4_DYNAMIC); + } else + if( sqlite3_stricmp(zLeft, "cipher_add_random")==0 && zRight ){ + if(ctx) { + char *add_random_status = sqlite3_mprintf("%d", sqlcipher_codec_add_random(ctx, zRight, sqlite3Strlen30(zRight))); + sqlcipher_vdbe_return_string(pParse, "cipher_add_random", add_random_status, P4_DYNAMIC); + } + } else + if( sqlite3_stricmp(zLeft, "cipher_migrate")==0 && !zRight ){ + if(ctx){ + int status = sqlcipher_codec_ctx_migrate(ctx); + char *migrate_status = sqlite3_mprintf("%d", status); + sqlcipher_vdbe_return_string(pParse, "cipher_migrate", migrate_status, P4_DYNAMIC); + if(status != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_pragma: error occurred during cipher_migrate: %d", status); + sqlcipher_codec_ctx_set_error(ctx, status); + } + } + } else + if( sqlite3_stricmp(zLeft, "cipher_provider")==0 && !zRight ){ + if(ctx) { sqlcipher_vdbe_return_string(pParse, "cipher_provider", + sqlcipher_codec_get_cipher_provider(ctx), P4_TRANSIENT); + } + } else + if( sqlite3_stricmp(zLeft, "cipher_provider_version")==0 && !zRight){ + if(ctx) { sqlcipher_vdbe_return_string(pParse, "cipher_provider_version", + sqlcipher_codec_get_provider_version(ctx), P4_TRANSIENT); + } + } else + if( sqlite3_stricmp(zLeft, "cipher_version")==0 && !zRight ){ + sqlcipher_vdbe_return_string(pParse, "cipher_version", sqlcipher_version(), P4_DYNAMIC); + }else + if( sqlite3_stricmp(zLeft, "cipher")==0 ){ + if(ctx) { + if( zRight ) { + const char* message = "PRAGMA cipher is no longer supported."; + sqlcipher_vdbe_return_string(pParse, "cipher", message, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, message); + }else { + sqlcipher_vdbe_return_string(pParse, "cipher", sqlcipher_codec_ctx_get_cipher(ctx), P4_TRANSIENT); + } + } + }else + if( sqlite3_stricmp(zLeft, "rekey_cipher")==0 && zRight ){ + const char* message = "PRAGMA rekey_cipher is no longer supported."; + sqlcipher_vdbe_return_string(pParse, "rekey_cipher", message, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, message); + }else + if( sqlite3_stricmp(zLeft,"cipher_default_kdf_iter")==0 ){ + if( zRight ) { + sqlcipher_set_default_kdf_iter(atoi(zRight)); /* change default KDF iterations */ + } else { + char *kdf_iter = sqlite3_mprintf("%d", sqlcipher_get_default_kdf_iter()); + sqlcipher_vdbe_return_string(pParse, "cipher_default_kdf_iter", kdf_iter, P4_DYNAMIC); + } + }else + if( sqlite3_stricmp(zLeft, "kdf_iter")==0 ){ + if(ctx) { + if( zRight ) { + sqlcipher_codec_ctx_set_kdf_iter(ctx, atoi(zRight)); /* change of RW PBKDF2 iteration */ + } else { + char *kdf_iter = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_kdf_iter(ctx)); + sqlcipher_vdbe_return_string(pParse, "kdf_iter", kdf_iter, P4_DYNAMIC); + } + } + }else + if( sqlite3_stricmp(zLeft, "fast_kdf_iter")==0){ + if(ctx) { + if( zRight ) { + char *deprecation = "PRAGMA fast_kdf_iter is deprecated, please remove from use"; + sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, atoi(zRight)); /* change of RW PBKDF2 iteration */ + sqlcipher_vdbe_return_string(pParse, "fast_kdf_iter", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); + } else { + char *fast_kdf_iter = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_fast_kdf_iter(ctx)); + sqlcipher_vdbe_return_string(pParse, "fast_kdf_iter", fast_kdf_iter, P4_DYNAMIC); + } + } + }else + if( sqlite3_stricmp(zLeft, "rekey_kdf_iter")==0 && zRight ){ + const char* message = "PRAGMA rekey_kdf_iter is no longer supported."; + sqlcipher_vdbe_return_string(pParse, "rekey_kdf_iter", message, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, message); + }else + if( sqlite3_stricmp(zLeft,"cipher_page_size")==0 ){ + if(ctx) { + if( zRight ) { + int size = atoi(zRight); + rc = sqlcipher_codec_ctx_set_pagesize(ctx, size); + if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); + rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx); + if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); + } else { + char * page_size = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_pagesize(ctx)); + sqlcipher_vdbe_return_string(pParse, "cipher_page_size", page_size, P4_DYNAMIC); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_page_size")==0 ){ + if( zRight ) { + sqlcipher_set_default_pagesize(atoi(zRight)); + } else { + char *default_page_size = sqlite3_mprintf("%d", sqlcipher_get_default_pagesize()); + sqlcipher_vdbe_return_string(pParse, "cipher_default_page_size", default_page_size, P4_DYNAMIC); + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_use_hmac")==0 ){ + if( zRight ) { + sqlcipher_set_default_use_hmac(sqlite3GetBoolean(zRight,1)); + } else { + char *default_use_hmac = sqlite3_mprintf("%d", sqlcipher_get_default_use_hmac()); + sqlcipher_vdbe_return_string(pParse, "cipher_default_use_hmac", default_use_hmac, P4_DYNAMIC); + } + }else + if( sqlite3_stricmp(zLeft,"cipher_use_hmac")==0 ){ + if(ctx) { + if( zRight ) { + rc = sqlcipher_codec_ctx_set_use_hmac(ctx, sqlite3GetBoolean(zRight,1)); + if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); + /* since the use of hmac has changed, the page size may also change */ + rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx); + if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); + } else { + char *hmac_flag = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_use_hmac(ctx)); + sqlcipher_vdbe_return_string(pParse, "cipher_use_hmac", hmac_flag, P4_DYNAMIC); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_hmac_pgno")==0 ){ + if(ctx) { + if(zRight) { + char *deprecation = "PRAGMA cipher_hmac_pgno is deprecated, please remove from use"; + /* clear both pgno endian flags */ + if(sqlite3_stricmp(zRight, "le") == 0) { + sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_BE_PGNO); + sqlcipher_codec_ctx_set_flag(ctx, CIPHER_FLAG_LE_PGNO); + } else if(sqlite3_stricmp(zRight, "be") == 0) { + sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_LE_PGNO); + sqlcipher_codec_ctx_set_flag(ctx, CIPHER_FLAG_BE_PGNO); + } else if(sqlite3_stricmp(zRight, "native") == 0) { + sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_LE_PGNO); + sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_BE_PGNO); + } + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_pgno", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); + + } else { + if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_LE_PGNO)) { + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_pgno", "le", P4_TRANSIENT); + } else if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_BE_PGNO)) { + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_pgno", "be", P4_TRANSIENT); + } else { + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_pgno", "native", P4_TRANSIENT); + } + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_hmac_salt_mask")==0 ){ + if(ctx) { + if(zRight) { + char *deprecation = "PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use"; + if (sqlite3StrNICmp(zRight ,"x'", 2) == 0 && sqlite3Strlen30(zRight) == 5) { + unsigned char mask = 0; + const unsigned char *hex = (const unsigned char *)zRight+2; + cipher_hex2bin(hex,2,&mask); + sqlcipher_set_hmac_salt_mask(mask); + } + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_salt_mask", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); + } else { + char *hmac_salt_mask = sqlite3_mprintf("%02x", sqlcipher_get_hmac_salt_mask()); + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_salt_mask", hmac_salt_mask, P4_DYNAMIC); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_plaintext_header_size")==0 ){ + if(ctx) { + if( zRight ) { + int size = atoi(zRight); + /* deliberately ignore result code, if size is invalid it will be set to -1 + and trip the error later in the codec */ + sqlcipher_codec_ctx_set_plaintext_header_size(ctx, size); + } else { + char *size = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_plaintext_header_size(ctx)); + sqlcipher_vdbe_return_string(pParse, "cipher_plaintext_header_size", size, P4_DYNAMIC); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_plaintext_header_size")==0 ){ + if( zRight ) { + sqlcipher_set_default_plaintext_header_size(atoi(zRight)); + } else { + char *size = sqlite3_mprintf("%d", sqlcipher_get_default_plaintext_header_size()); + sqlcipher_vdbe_return_string(pParse, "cipher_default_plaintext_header_size", size, P4_DYNAMIC); + } + }else + if( sqlite3_stricmp(zLeft,"cipher_salt")==0 ){ + if(ctx) { + if(zRight) { + if (sqlite3StrNICmp(zRight ,"x'", 2) == 0 && sqlite3Strlen30(zRight) == (FILE_HEADER_SZ*2)+3) { + unsigned char *salt = (unsigned char*) sqlite3_malloc(FILE_HEADER_SZ); + const unsigned char *hex = (const unsigned char *)zRight+2; + cipher_hex2bin(hex,FILE_HEADER_SZ*2,salt); + sqlcipher_codec_ctx_set_kdf_salt(ctx, salt, FILE_HEADER_SZ); + sqlite3_free(salt); + } + } else { + void *salt; + char *hexsalt = (char*) sqlite3_malloc((FILE_HEADER_SZ*2)+1); + if((rc = sqlcipher_codec_ctx_get_kdf_salt(ctx, &salt)) == SQLITE_OK) { + cipher_bin2hex(salt, FILE_HEADER_SZ, hexsalt); + sqlcipher_vdbe_return_string(pParse, "cipher_salt", hexsalt, P4_DYNAMIC); + } else { + sqlite3_free(hexsalt); + sqlcipher_codec_ctx_set_error(ctx, rc); + } + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_hmac_algorithm")==0 ){ + if(ctx) { + if(zRight) { + rc = SQLITE_ERROR; + if(sqlite3_stricmp(zRight, SQLCIPHER_HMAC_SHA1_LABEL) == 0) { + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA1); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_HMAC_SHA256_LABEL) == 0) { + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA256); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_HMAC_SHA512_LABEL) == 0) { + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA512); + } + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + } else { + int algorithm = sqlcipher_codec_ctx_get_hmac_algorithm(ctx); + if(algorithm == SQLCIPHER_HMAC_SHA1) { + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_algorithm", SQLCIPHER_HMAC_SHA1_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_HMAC_SHA256) { + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_algorithm", SQLCIPHER_HMAC_SHA256_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_HMAC_SHA512) { + sqlcipher_vdbe_return_string(pParse, "cipher_hmac_algorithm", SQLCIPHER_HMAC_SHA512_LABEL, P4_TRANSIENT); + } + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_hmac_algorithm")==0 ){ + if(zRight) { + rc = SQLITE_ERROR; + if(sqlite3_stricmp(zRight, SQLCIPHER_HMAC_SHA1_LABEL) == 0) { + rc = sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA1); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_HMAC_SHA256_LABEL) == 0) { + rc = sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA256); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_HMAC_SHA512_LABEL) == 0) { + rc = sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA512); + } + } else { + int algorithm = sqlcipher_get_default_hmac_algorithm(); + if(algorithm == SQLCIPHER_HMAC_SHA1) { + sqlcipher_vdbe_return_string(pParse, "cipher_default_hmac_algorithm", SQLCIPHER_HMAC_SHA1_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_HMAC_SHA256) { + sqlcipher_vdbe_return_string(pParse, "cipher_default_hmac_algorithm", SQLCIPHER_HMAC_SHA256_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_HMAC_SHA512) { + sqlcipher_vdbe_return_string(pParse, "cipher_default_hmac_algorithm", SQLCIPHER_HMAC_SHA512_LABEL, P4_TRANSIENT); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_kdf_algorithm")==0 ){ + if(ctx) { + if(zRight) { + rc = SQLITE_ERROR; + if(sqlite3_stricmp(zRight, SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL) == 0) { + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA1); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL) == 0) { + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA256); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL) == 0) { + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA512); + } + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + } else { + int algorithm = sqlcipher_codec_ctx_get_kdf_algorithm(ctx); + if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA1) { + sqlcipher_vdbe_return_string(pParse, "cipher_kdf_algorithm", SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA256) { + sqlcipher_vdbe_return_string(pParse, "cipher_kdf_algorithm", SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA512) { + sqlcipher_vdbe_return_string(pParse, "cipher_kdf_algorithm", SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL, P4_TRANSIENT); + } + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_kdf_algorithm")==0 ){ + if(zRight) { + rc = SQLITE_ERROR; + if(sqlite3_stricmp(zRight, SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL) == 0) { + rc = sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA1); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL) == 0) { + rc = sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA256); + } else if(sqlite3_stricmp(zRight, SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL) == 0) { + rc = sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA512); + } + } else { + int algorithm = sqlcipher_get_default_kdf_algorithm(); + if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA1) { + sqlcipher_vdbe_return_string(pParse, "cipher_default_kdf_algorithm", SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA256) { + sqlcipher_vdbe_return_string(pParse, "cipher_default_kdf_algorithm", SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL, P4_TRANSIENT); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA512) { + sqlcipher_vdbe_return_string(pParse, "cipher_default_kdf_algorithm", SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL, P4_TRANSIENT); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_compatibility")==0 ){ + if(ctx) { + if(zRight) { + int version = atoi(zRight); + + switch(version) { + case 1: + rc = sqlcipher_codec_ctx_set_pagesize(ctx, 1024); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, 4000); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_use_hmac(ctx, 0); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + break; + + case 2: + rc = sqlcipher_codec_ctx_set_pagesize(ctx, 1024); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, 4000); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_use_hmac(ctx, 1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + break; + + case 3: + rc = sqlcipher_codec_ctx_set_pagesize(ctx, 1024); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, 64000); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_use_hmac(ctx, 1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + break; + + default: + rc = sqlcipher_codec_ctx_set_pagesize(ctx, 4096); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, SQLCIPHER_HMAC_SHA512); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, SQLCIPHER_PBKDF2_HMAC_SHA512); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, 256000); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + rc = sqlcipher_codec_ctx_set_use_hmac(ctx, 1); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + break; + } + + rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx); + if (rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_compatibility")==0 ){ + if(zRight) { + int version = atoi(zRight); + switch(version) { + case 1: + sqlcipher_set_default_pagesize(1024); + sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA1); + sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA1); + sqlcipher_set_default_kdf_iter(4000); + sqlcipher_set_default_use_hmac(0); + break; + + case 2: + sqlcipher_set_default_pagesize(1024); + sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA1); + sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA1); + sqlcipher_set_default_kdf_iter(4000); + sqlcipher_set_default_use_hmac(1); + break; + + case 3: + sqlcipher_set_default_pagesize(1024); + sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA1); + sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA1); + sqlcipher_set_default_kdf_iter(64000); + sqlcipher_set_default_use_hmac(1); + break; + + default: + sqlcipher_set_default_pagesize(4096); + sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA512); + sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA512); + sqlcipher_set_default_kdf_iter(256000); + sqlcipher_set_default_use_hmac(1); + break; + } + } + }else + if( sqlite3_stricmp(zLeft,"cipher_memory_security")==0 ){ + if( zRight ) { + sqlcipher_set_mem_security(sqlite3GetBoolean(zRight,1)); + } else { + char *on = sqlite3_mprintf("%d", sqlcipher_get_mem_security()); + sqlcipher_vdbe_return_string(pParse, "cipher_memory_security", on, P4_DYNAMIC); + } + }else + if( sqlite3_stricmp(zLeft,"cipher_settings")==0 ){ + if(ctx) { + int algorithm; + char *pragma; + + pragma = sqlite3_mprintf("PRAGMA kdf_iter = %d;", sqlcipher_codec_ctx_get_kdf_iter(ctx)); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_page_size = %d;", sqlcipher_codec_ctx_get_pagesize(ctx)); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_use_hmac = %d;", sqlcipher_codec_ctx_get_use_hmac(ctx)); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_plaintext_header_size = %d;", sqlcipher_codec_ctx_get_plaintext_header_size(ctx)); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_codec_ctx_get_hmac_algorithm(ctx); + pragma = NULL; + if(algorithm == SQLCIPHER_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA512_LABEL); + } + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_codec_ctx_get_kdf_algorithm(ctx); + pragma = NULL; + if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL); + } + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + } + }else + if( sqlite3_stricmp(zLeft,"cipher_default_settings")==0 ){ + int algorithm; + char *pragma; + + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_iter = %d;", sqlcipher_get_default_kdf_iter()); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_default_page_size = %d;", sqlcipher_get_default_pagesize()); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_default_use_hmac = %d;", sqlcipher_get_default_use_hmac()); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_default_plaintext_header_size = %d;", sqlcipher_get_default_plaintext_header_size()); + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_get_default_hmac_algorithm(); + pragma = NULL; + if(algorithm == SQLCIPHER_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA512_LABEL); + } + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_get_default_kdf_algorithm(); + pragma = NULL; + if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL); + } + sqlcipher_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + }else + if( sqlite3_stricmp(zLeft,"cipher_integrity_check")==0 ){ + if(ctx) { + sqlcipher_codec_ctx_integrity_check(ctx, pParse, "cipher_integrity_check"); + } + } else + if( sqlite3_stricmp(zLeft, "cipher_log_level")==0 && zRight){ + unsigned int level = SQLCIPHER_LOG_NONE; + if(sqlite3_stricmp(zRight, "ERROR")==0) level = SQLCIPHER_LOG_ERROR; + else if(sqlite3_stricmp(zRight, "WARN" )==0) level = SQLCIPHER_LOG_WARN; + else if(sqlite3_stricmp(zRight, "INFO" )==0) level = SQLCIPHER_LOG_INFO; + else if(sqlite3_stricmp(zRight, "DEBUG")==0) level = SQLCIPHER_LOG_DEBUG; + else if(sqlite3_stricmp(zRight, "TRACE")==0) level = SQLCIPHER_LOG_TRACE; + sqlcipher_set_log_level(level); + sqlcipher_vdbe_return_string(pParse, "cipher_log_level", sqlite3_mprintf("%u", level), P4_DYNAMIC); + } else + if( sqlite3_stricmp(zLeft, "cipher_log")== 0 && zRight ){ + char *status = sqlite3_mprintf("%d", sqlcipher_set_log(zRight)); + sqlcipher_vdbe_return_string(pParse, "cipher_log", status, P4_DYNAMIC); + }else { + return 0; + } + return 1; +} + +/* these constants are used internally within SQLite's pager.c to differentiate between + operations on the main database or journal pages. This is important in the context + of a rekey operations, where the journal must be written using the original key + material (to allow a transactional rollback), while the new database pages are being + written with the new key material*/ +#define CODEC_READ_OP 3 +#define CODEC_WRITE_OP 6 +#define CODEC_JOURNAL_OP 7 + +/* + * sqlite3Codec can be called in multiple modes. + * encrypt mode - expected to return a pointer to the + * encrypted data without altering pData. + * decrypt mode - expected to return a pointer to pData, with + * the data decrypted in the input buffer + */ +static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { + codec_ctx *ctx = (codec_ctx *) iCtx; + int offset = 0, rc = 0; + int page_sz = sqlcipher_codec_ctx_get_pagesize(ctx); + unsigned char *pData = (unsigned char *) data; + void *buffer = sqlcipher_codec_ctx_get_data(ctx); + int plaintext_header_sz = sqlcipher_codec_ctx_get_plaintext_header_size(ctx); + int cctx = CIPHER_READ_CTX; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3Codec: pgno=%d, mode=%d, page_sz=%d", pgno, mode, page_sz); + +#ifdef SQLCIPHER_EXT + if(sqlcipher_license_check(ctx) != SQLITE_OK) return NULL; +#endif + + /* call to derive keys if not present yet */ + if((rc = sqlcipher_codec_key_derive(ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3Codec: error occurred during key derivation: %d", rc); + sqlcipher_codec_ctx_set_error(ctx, rc); + return NULL; + } + + /* if the plaintext_header_size is negative that means an invalid size was set via + PRAGMA. We can't set the error state on the pager at that point because the pager + may not be open yet. However, this is a fatal error state, so abort the codec */ + if(plaintext_header_sz < 0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3Codec: error invalid plaintext_header_sz: %d", plaintext_header_sz); + sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); + return NULL; + } + + if(pgno == 1) /* adjust starting pointers in data page for header offset on first page*/ + offset = plaintext_header_sz ? plaintext_header_sz : FILE_HEADER_SZ; + + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3Codec: switch mode=%d offset=%d", mode, offset); + switch(mode) { + case CODEC_READ_OP: /* decrypt */ + if(pgno == 1) /* copy initial part of file header or SQLite magic to buffer */ + memcpy(buffer, plaintext_header_sz ? pData : (void *) SQLITE_FILE_HEADER, offset); + + rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_DECRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); +#ifdef SQLCIPHER_TEST + if((sqlcipher_get_test_flags() & TEST_FAIL_DECRYPT) > 0 && sqlcipher_get_test_fail()) { + rc = SQLITE_ERROR; + sqlcipher_log(SQLCIPHER_LOG_ERROR, "simulating decryption failure for pgno=%d, mode=%d, page_sz=%d\n", pgno, mode, page_sz); + } +#endif + if(rc != SQLITE_OK) { + /* failure to decrypt a page is considered a permanent error and will render the pager unusable + in order to prevent inconsistent data being loaded into page cache */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3Codec: error decrypting page %d data: %d", pgno, rc); + sqlcipher_memset((unsigned char*) buffer+offset, 0, page_sz-offset); + sqlcipher_codec_ctx_set_error(ctx, rc); + } + memcpy(pData, buffer, page_sz); /* copy buffer data back to pData and return */ + return pData; + break; + + case CODEC_WRITE_OP: /* encrypt database page, operate on write context and fall through to case 7, so the write context is used*/ + cctx = CIPHER_WRITE_CTX; + + case CODEC_JOURNAL_OP: /* encrypt journal page, operate on read context use to get the original page data from the database */ + if(pgno == 1) { /* copy initial part of file header or salt to buffer */ + void *kdf_salt = NULL; + /* retrieve the kdf salt */ + if((rc = sqlcipher_codec_ctx_get_kdf_salt(ctx, &kdf_salt)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3Codec: error retrieving salt: %d", rc); + sqlcipher_codec_ctx_set_error(ctx, rc); + return NULL; + } + memcpy(buffer, plaintext_header_sz ? pData : kdf_salt, offset); + } + rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_ENCRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); +#ifdef SQLCIPHER_TEST + if((sqlcipher_get_test_flags() & TEST_FAIL_ENCRYPT) > 0 && sqlcipher_get_test_fail()) { + rc = SQLITE_ERROR; + sqlcipher_log(SQLCIPHER_LOG_ERROR, "simulating encryption failure for pgno=%d, mode=%d, page_sz=%d\n", pgno, mode, page_sz); + } +#endif + if(rc != SQLITE_OK) { + /* failure to encrypt a page is considered a permanent error and will render the pager unusable + in order to prevent corrupted pages from being written to the main databased when using WAL */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3Codec: error encrypting page %d data: %d", pgno, rc); + sqlcipher_memset((unsigned char*)buffer+offset, 0, page_sz-offset); + sqlcipher_codec_ctx_set_error(ctx, rc); + return NULL; + } + return buffer; /* return persistent buffer data, pData remains intact */ + break; + + default: + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3Codec: error unsupported codec mode %d", mode); + sqlcipher_codec_ctx_set_error(ctx, SQLITE_ERROR); /* unsupported mode, set error */ + return pData; + break; + } +} + +static void sqlite3FreeCodecArg(void *pCodecArg) { + codec_ctx *ctx = (codec_ctx *) pCodecArg; + if(pCodecArg == NULL) return; + sqlcipher_codec_ctx_free(&ctx); /* wipe and free allocated memory for the context */ + sqlcipher_deactivate(); /* cleanup related structures, OpenSSL etc, when codec is detatched */ +} + +int sqlcipherCodecAttach(sqlite3* db, int nDb, const void *zKey, int nKey) { + struct Db *pDb = &db->aDb[nDb]; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: db=%p, nDb=%d", db, nDb); + + if(nKey && zKey && pDb->pBt) { + int rc; + Pager *pPager = pDb->pBt->pBt->pPager; + sqlite3_file *fd; + codec_ctx *ctx; + + /* check if the sqlite3_file is open, and if not force handle to NULL */ + if((fd = sqlite3PagerFile(pPager))->pMethods == 0) fd = NULL; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: calling sqlcipher_activate()"); + sqlcipher_activate(); /* perform internal initialization for sqlcipher */ + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipherCodecAttach: entering database mutex %p", db->mutex); + sqlite3_mutex_enter(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipherCodecAttach: entered database mutex %p", db->mutex); + +#ifdef SQLCIPHER_EXT + if((rc = sqlite3_set_authorizer(db, sqlcipher_license_authorizer, db)) != SQLITE_OK) { + sqlite3_mutex_leave(db->mutex); + return rc; + } +#endif + + /* point the internal codec argument against the contet to be prepared */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: calling sqlcipher_codec_ctx_init()"); + rc = sqlcipher_codec_ctx_init(&ctx, pDb, pDb->pBt->pBt->pPager, zKey, nKey); + + if(rc != SQLITE_OK) { + /* initialization failed, do not attach potentially corrupted context */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipherCodecAttach: context initialization failed forcing error state with rc=%d", rc); + /* force an error at the pager level, such that even the upstream caller ignores the return code + the pager will be in an error state and will process no further operations */ + sqlite3pager_error(pPager, rc); + pDb->pBt->pBt->db->errCode = rc; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipherCodecAttach: leaving database mutex %p (early return on rc=%d)", db->mutex, rc); + sqlite3_mutex_leave(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipherCodecAttach: left database mutex %p (early return on rc=%d)", db->mutex, rc); + return rc; + } + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: calling sqlcipherPagerSetCodec()"); + sqlcipherPagerSetCodec(sqlite3BtreePager(pDb->pBt), sqlite3Codec, NULL, sqlite3FreeCodecArg, (void *) ctx); + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: calling codec_set_btree_to_codec_pagesize()"); + codec_set_btree_to_codec_pagesize(db, pDb, ctx); + + /* force secure delete. This has the benefit of wiping internal data when deleted + and also ensures that all pages are written to disk (i.e. not skipped by + sqlite3PagerDontWrite optimizations) */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: calling sqlite3BtreeSecureDelete()"); + sqlite3BtreeSecureDelete(pDb->pBt, 1); + + /* if fd is null, then this is an in-memory database and + we dont' want to overwrite the AutoVacuum settings + if not null, then set to the default */ + if(fd != NULL) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecAttach: calling sqlite3BtreeSetAutoVacuum()"); + sqlite3BtreeSetAutoVacuum(pDb->pBt, SQLITE_DEFAULT_AUTOVACUUM); + } + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipherCodecAttach: leaving database mutex %p", db->mutex); + sqlite3_mutex_leave(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipherCodecAttach: left database mutex %p", db->mutex); + } + return SQLITE_OK; +} + +int sqlcipher_find_db_index(sqlite3 *db, const char *zDb) { + int db_index; + if(zDb == NULL){ + return 0; + } + for(db_index = 0; db_index < db->nDb; db_index++) { + struct Db *pDb = &db->aDb[db_index]; + if(strcmp(pDb->zDbSName, zDb) == 0) { + return db_index; + } + } + return 0; +} + +SQLITE_API void sqlite3_activate_see(const char* in) { + /* do nothing, security enhancements are always active */ +} + +SQLITE_API int sqlite3_key(sqlite3 *db, const void *pKey, int nKey) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_key: db=%p", db); + return sqlite3_key_v2(db, "main", pKey, nKey); +} + +SQLITE_API int sqlite3_key_v2(sqlite3 *db, const char *zDb, const void *pKey, int nKey) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_key_v2: db=%p zDb=%s", db, zDb); + /* attach key if db and pKey are not null and nKey is > 0 */ + if(db && pKey && nKey) { + int db_index = sqlcipher_find_db_index(db, zDb); + return sqlcipherCodecAttach(db, db_index, pKey, nKey); + } + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3_key_v2: no key provided"); + return SQLITE_ERROR; +} + +SQLITE_API int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_rekey: db=%p", db); + return sqlite3_rekey_v2(db, "main", pKey, nKey); +} + +/* sqlite3_rekey_v2 +** Given a database, this will reencrypt the database using a new key. +** There is only one possible modes of operation - to encrypt a database +** that is already encrpyted. If the database is not already encrypted +** this should do nothing +** The proposed logic for this function follows: +** 1. Determine if the database is already encryptped +** 2. If there is NOT already a key present do nothing +** 3. If there is a key present, re-encrypt the database with the new key +*/ +SQLITE_API int sqlite3_rekey_v2(sqlite3 *db, const char *zDb, const void *pKey, int nKey) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_rekey_v2: db=%p zDb=%s", db, zDb); + if(db && pKey && nKey) { + int db_index = sqlcipher_find_db_index(db, zDb); + struct Db *pDb = &db->aDb[db_index]; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_rekey_v2: database zDb=%p db_index:%d", zDb, db_index); + if(pDb->pBt) { + codec_ctx *ctx; + int rc, page_count; + Pgno pgno; + PgHdr *page; + Pager *pPager = pDb->pBt->pBt->pPager; + + ctx = (codec_ctx*) sqlcipherPagerGetCodec(pDb->pBt->pBt->pPager); + + if(ctx == NULL) { + /* there was no codec attached to this database, so this should do nothing! */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3_rekey_v2: no codec attached to db, exiting"); + return SQLITE_OK; + } + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlite3_rekey_v2: entering database mutex %p", db->mutex); + sqlite3_mutex_enter(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlite3_rekey_v2: entered database mutex %p", db->mutex); + + codec_set_pass_key(db, db_index, pKey, nKey, CIPHER_WRITE_CTX); + + /* do stuff here to rewrite the database + ** 1. Create a transaction on the database + ** 2. Iterate through each page, reading it and then writing it. + ** 3. If that goes ok then commit and put ctx->rekey into ctx->key + ** note: don't deallocate rekey since it may be used in a subsequent iteration + */ + rc = sqlite3BtreeBeginTrans(pDb->pBt, 1, 0); /* begin write transaction */ + sqlite3PagerPagecount(pPager, &page_count); + for(pgno = 1; rc == SQLITE_OK && pgno <= (unsigned int)page_count; pgno++) { /* pgno's start at 1 see pager.c:pagerAcquire */ + if(!sqlite3pager_is_sj_pgno(pPager, pgno)) { /* skip this page (see pager.c:pagerAcquire for reasoning) */ + rc = sqlite3PagerGet(pPager, pgno, &page, 0); + if(rc == SQLITE_OK) { /* write page see pager_incr_changecounter for example */ + rc = sqlite3PagerWrite(page); + if(rc == SQLITE_OK) { + sqlite3PagerUnref(page); + } else { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3_rekey_v2: error %d occurred writing page %d", rc, pgno); + } + } else { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3_rekey_v2: error %d occurred getting page %d", rc, pgno); + } + } + } + + /* if commit was successful commit and copy the rekey data to current key, else rollback to release locks */ + if(rc == SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_rekey_v2: committing"); + rc = sqlite3BtreeCommit(pDb->pBt); + sqlcipher_codec_key_copy(ctx, CIPHER_WRITE_CTX); + } else { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlite3_rekey_v2: rollback"); + sqlite3BtreeRollback(pDb->pBt, SQLITE_ABORT_ROLLBACK, 0); + } + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlite3_rekey_v2: leaving database mutex %p", db->mutex); + sqlite3_mutex_leave(db->mutex); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlite3_rekey_v2: left database mutex %p", db->mutex); + } + return SQLITE_OK; + } + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlite3_rekey_v2: no key provided"); + return SQLITE_ERROR; +} + +void sqlcipherCodecGetKey(sqlite3* db, int nDb, void **zKey, int *nKey) { + struct Db *pDb = &db->aDb[nDb]; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipherCodecGetKey:db=%p, nDb=%d", db, nDb); + if( pDb->pBt ) { + codec_ctx *ctx = (codec_ctx*) sqlcipherPagerGetCodec(pDb->pBt->pBt->pPager); + + if(ctx) { + /* pass back the keyspec from the codec, unless PRAGMA cipher_store_pass + is set or keyspec has not yet been derived, in which case pass + back the password key material */ + sqlcipher_codec_get_keyspec(ctx, zKey, nKey); + if(sqlcipher_codec_get_store_pass(ctx) == 1 || *zKey == NULL) { + sqlcipher_codec_get_pass(ctx, zKey, nKey); + } + } else { + *zKey = NULL; + *nKey = 0; + } + } +} + +/* + * Implementation of an "export" function that allows a caller + * to duplicate the main database to an attached database. This is intended + * as a conveneince for users who need to: + * + * 1. migrate from an non-encrypted database to an encrypted database + * 2. move from an encrypted database to a non-encrypted database + * 3. convert beween the various flavors of encrypted databases. + * + * This implementation is based heavily on the procedure and code used + * in vacuum.c, but is exposed as a function that allows export to any + * named attached database. + */ + +/* +** Finalize a prepared statement. If there was an error, store the +** text of the error message in *pzErrMsg. Return the result code. +** +** Based on vacuumFinalize from vacuum.c +*/ +static int sqlcipher_finalize(sqlite3 *db, sqlite3_stmt *pStmt, char **pzErrMsg){ + int rc; + rc = sqlite3VdbeFinalize((Vdbe*)pStmt); + if( rc ){ + sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); + } + return rc; +} + +/* +** Execute zSql on database db. Return an error code. +** +** Based on execSql from vacuum.c +*/ +static int sqlcipher_execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ + sqlite3_stmt *pStmt; + VVA_ONLY( int rc; ) + if( !zSql ){ + return SQLITE_NOMEM; + } + if( SQLITE_OK!=sqlite3_prepare(db, zSql, -1, &pStmt, 0) ){ + sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); + return sqlite3_errcode(db); + } + VVA_ONLY( rc = ) sqlite3_step(pStmt); + assert( rc!=SQLITE_ROW ); + return sqlcipher_finalize(db, pStmt, pzErrMsg); +} + +/* +** Execute zSql on database db. The statement returns exactly +** one column. Execute this as SQL on the same database. +** +** Based on execExecSql from vacuum.c +*/ +static int sqlcipher_execExecSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ + sqlite3_stmt *pStmt; + int rc; + + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + rc = sqlcipher_execSql(db, pzErrMsg, (char*)sqlite3_column_text(pStmt, 0)); + if( rc!=SQLITE_OK ){ + sqlcipher_finalize(db, pStmt, pzErrMsg); + return rc; + } + } + + return sqlcipher_finalize(db, pStmt, pzErrMsg); +} + +/* + * copy database and schema from the main database to an attached database + * + * Based on sqlite3RunVacuum from vacuum.c +*/ +void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **argv) { + sqlite3 *db = sqlite3_context_db_handle(context); + const char* targetDb, *sourceDb; + int targetDb_idx = 0; + u64 saved_flags = db->flags; /* Saved value of the db->flags */ + u32 saved_mDbFlags = db->mDbFlags; /* Saved value of the db->mDbFlags */ + int saved_nChange = db->nChange; /* Saved value of db->nChange */ + int saved_nTotalChange = db->nTotalChange; /* Saved value of db->nTotalChange */ + u8 saved_mTrace = db->mTrace; /* Saved value of db->mTrace */ + int rc = SQLITE_OK; /* Return code from service routines */ + char *zSql = NULL; /* SQL statements */ + char *pzErrMsg = NULL; + + if(argc != 1 && argc != 2) { + rc = SQLITE_ERROR; + pzErrMsg = sqlite3_mprintf("invalid number of arguments (%d) passed to sqlcipher_export", argc); + goto end_of_export; + } + + if(sqlite3_value_type(argv[0]) == SQLITE_NULL) { + rc = SQLITE_ERROR; + pzErrMsg = sqlite3_mprintf("target database can't be NULL"); + goto end_of_export; + } + + targetDb = (const char*) sqlite3_value_text(argv[0]); + sourceDb = "main"; + + if(argc == 2) { + if(sqlite3_value_type(argv[1]) == SQLITE_NULL) { + rc = SQLITE_ERROR; + pzErrMsg = sqlite3_mprintf("target database can't be NULL"); + goto end_of_export; + } + sourceDb = (char *) sqlite3_value_text(argv[1]); + } + + + /* if the name of the target is not main, but the index returned is zero + there is a mismatch and we should not proceed */ + targetDb_idx = sqlcipher_find_db_index(db, targetDb); + if(targetDb_idx == 0 && targetDb != NULL && sqlite3_stricmp("main", targetDb) != 0) { + rc = SQLITE_ERROR; + pzErrMsg = sqlite3_mprintf("unknown database %s", targetDb); + goto end_of_export; + } + db->init.iDb = targetDb_idx; + + db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; + db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); + db->mTrace = 0; + + /* Query the schema of the main database. Create a mirror schema + ** in the temporary database. + */ + zSql = sqlite3_mprintf( + "SELECT sql " + " FROM %s.sqlite_schema WHERE type='table' AND name!='sqlite_sequence'" + " AND rootpage>0" + , sourceDb); + rc = (zSql == NULL) ? SQLITE_NOMEM : sqlcipher_execExecSql(db, &pzErrMsg, zSql); + if( rc!=SQLITE_OK ) goto end_of_export; + sqlite3_free(zSql); + + zSql = sqlite3_mprintf( + "SELECT sql " + " FROM %s.sqlite_schema WHERE sql LIKE 'CREATE INDEX %%' " + , sourceDb); + rc = (zSql == NULL) ? SQLITE_NOMEM : sqlcipher_execExecSql(db, &pzErrMsg, zSql); + if( rc!=SQLITE_OK ) goto end_of_export; + sqlite3_free(zSql); + + zSql = sqlite3_mprintf( + "SELECT sql " + " FROM %s.sqlite_schema WHERE sql LIKE 'CREATE UNIQUE INDEX %%'" + , sourceDb); + rc = (zSql == NULL) ? SQLITE_NOMEM : sqlcipher_execExecSql(db, &pzErrMsg, zSql); + if( rc!=SQLITE_OK ) goto end_of_export; + sqlite3_free(zSql); + + /* Loop through the tables in the main database. For each, do + ** an "INSERT INTO rekey_db.xxx SELECT * FROM main.xxx;" to copy + ** the contents to the temporary database. + */ + zSql = sqlite3_mprintf( + "SELECT 'INSERT INTO %s.' || quote(name) " + "|| ' SELECT * FROM %s.' || quote(name) || ';'" + "FROM %s.sqlite_schema " + "WHERE type = 'table' AND name!='sqlite_sequence' " + " AND rootpage>0" + , targetDb, sourceDb, sourceDb); + rc = (zSql == NULL) ? SQLITE_NOMEM : sqlcipher_execExecSql(db, &pzErrMsg, zSql); + if( rc!=SQLITE_OK ) goto end_of_export; + sqlite3_free(zSql); + + /* Copy over the contents of the sequence table + */ + zSql = sqlite3_mprintf( + "SELECT 'INSERT INTO %s.' || quote(name) " + "|| ' SELECT * FROM %s.' || quote(name) || ';' " + "FROM %s.sqlite_schema WHERE name=='sqlite_sequence';" + , targetDb, sourceDb, targetDb); + rc = (zSql == NULL) ? SQLITE_NOMEM : sqlcipher_execExecSql(db, &pzErrMsg, zSql); + if( rc!=SQLITE_OK ) goto end_of_export; + sqlite3_free(zSql); + + /* Copy the triggers, views, and virtual tables from the main database + ** over to the temporary database. None of these objects has any + ** associated storage, so all we have to do is copy their entries + ** from the SQLITE_MASTER table. + */ + zSql = sqlite3_mprintf( + "INSERT INTO %s.sqlite_schema " + " SELECT type, name, tbl_name, rootpage, sql" + " FROM %s.sqlite_schema" + " WHERE type='view' OR type='trigger'" + " OR (type='table' AND rootpage=0)" + , targetDb, sourceDb); + rc = (zSql == NULL) ? SQLITE_NOMEM : sqlcipher_execSql(db, &pzErrMsg, zSql); + if( rc!=SQLITE_OK ) goto end_of_export; + sqlite3_free(zSql); + + zSql = NULL; +end_of_export: + db->init.iDb = 0; + db->flags = saved_flags; + db->mDbFlags = saved_mDbFlags; + db->nChange = saved_nChange; + db->nTotalChange = saved_nTotalChange; + db->mTrace = saved_mTrace; + + if(zSql) sqlite3_free(zSql); + + if(rc) { + if(pzErrMsg != NULL) { + sqlite3_result_error(context, pzErrMsg, -1); + sqlite3DbFree(db, pzErrMsg); + } else { + sqlite3_result_error(context, sqlite3ErrStr(rc), -1); + } + } +} +#endif +/* END SQLCIPHER */ + +/************** End of crypto.c **********************************************/ +/************** Begin file crypto_impl.c *************************************/ +/* +** SQLCipher +** http://sqlcipher.net +** +** Copyright (c) 2008 - 2013, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + +/* #include "sqlcipher.h" */ +/* #include "crypto.h" */ + +#ifdef SQLCIPHER_TEST +static volatile unsigned int cipher_test_flags = 0; +unsigned int sqlcipher_get_test_flags() { + return cipher_test_flags; +} +void sqlcipher_set_test_flags(unsigned int flags) { + cipher_test_flags = flags; +} + +static volatile int cipher_test_rand = 0; +int sqlcipher_get_test_rand() { + return cipher_test_rand; +} +void sqlcipher_set_test_rand(int rand) { + cipher_test_rand = rand; +} +int sqlcipher_get_test_fail() { + int x; + + /* if cipher_test_rand is not set to a non-zero value always fail (return true) */ + if (cipher_test_rand == 0) return 1; + + sqlite3_randomness(sizeof(x), &x); + return ((x % cipher_test_rand) == 0); +} +#endif + +/* Generate code to return a string value */ + +static volatile unsigned int default_flags = DEFAULT_CIPHER_FLAGS; +static volatile unsigned char hmac_salt_mask = HMAC_SALT_MASK; +static volatile int default_kdf_iter = PBKDF2_ITER; +static volatile int default_page_size = 4096; +static volatile int default_plaintext_header_sz = 0; +static volatile int default_hmac_algorithm = SQLCIPHER_HMAC_SHA512; +static volatile int default_kdf_algorithm = SQLCIPHER_PBKDF2_HMAC_SHA512; +static volatile int sqlcipher_mem_security_on = 0; +static volatile int sqlcipher_mem_executed = 0; +static volatile int sqlcipher_mem_initialized = 0; +static volatile unsigned int sqlcipher_activate_count = 0; +static volatile sqlite3_mem_methods default_mem_methods; +static sqlcipher_provider *default_provider = NULL; + +static sqlite3_mutex* sqlcipher_static_mutex[SQLCIPHER_MUTEX_COUNT]; +static FILE* sqlcipher_log_file = NULL; +static volatile int sqlcipher_log_logcat = 0; +static volatile unsigned int sqlcipher_log_level = SQLCIPHER_LOG_NONE; + +sqlite3_mutex* sqlcipher_mutex(int mutex) { + if(mutex < 0 || mutex >= SQLCIPHER_MUTEX_COUNT) return NULL; + return sqlcipher_static_mutex[mutex]; +} + +static int sqlcipher_mem_init(void *pAppData) { + return default_mem_methods.xInit(pAppData); +} +static void sqlcipher_mem_shutdown(void *pAppData) { + default_mem_methods.xShutdown(pAppData); +} +static void *sqlcipher_mem_malloc(int n) { + void *ptr = default_mem_methods.xMalloc(n); + if(!sqlcipher_mem_executed) sqlcipher_mem_executed = 1; + if(sqlcipher_mem_security_on) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_mem_malloc: calling sqlcipher_mlock(%p,%d)", ptr, n); + sqlcipher_mlock(ptr, n); + } + return ptr; +} +static int sqlcipher_mem_size(void *p) { + return default_mem_methods.xSize(p); +} +static void sqlcipher_mem_free(void *p) { + int sz; + if(!sqlcipher_mem_executed) sqlcipher_mem_executed = 1; + if(sqlcipher_mem_security_on) { + sz = sqlcipher_mem_size(p); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_mem_free: calling sqlcipher_memset(%p,0,%d) and sqlcipher_munlock(%p, %d)", p, sz, p, sz); + sqlcipher_memset(p, 0, sz); + sqlcipher_munlock(p, sz); + } + default_mem_methods.xFree(p); +} +static void *sqlcipher_mem_realloc(void *p, int n) { + void *new = NULL; + int orig_sz = 0; + if(sqlcipher_mem_security_on) { + orig_sz = sqlcipher_mem_size(p); + if (n==0) { + sqlcipher_mem_free(p); + return NULL; + } else if (!p) { + return sqlcipher_mem_malloc(n); + } else if(n <= orig_sz) { + return p; + } else { + new = sqlcipher_mem_malloc(n); + if(new) { + memcpy(new, p, orig_sz); + sqlcipher_mem_free(p); + } + return new; + } + } else { + return default_mem_methods.xRealloc(p, n); + } +} + +static int sqlcipher_mem_roundup(int n) { + return default_mem_methods.xRoundup(n); +} + +static sqlite3_mem_methods sqlcipher_mem_methods = { + sqlcipher_mem_malloc, + sqlcipher_mem_free, + sqlcipher_mem_realloc, + sqlcipher_mem_size, + sqlcipher_mem_roundup, + sqlcipher_mem_init, + sqlcipher_mem_shutdown, + 0 +}; + +void sqlcipher_init_memmethods() { + if(sqlcipher_mem_initialized) return; + if(sqlite3_config(SQLITE_CONFIG_GETMALLOC, &default_mem_methods) != SQLITE_OK || + sqlite3_config(SQLITE_CONFIG_MALLOC, &sqlcipher_mem_methods) != SQLITE_OK) { + sqlcipher_mem_security_on = sqlcipher_mem_executed = sqlcipher_mem_initialized = 0; + } else { + sqlcipher_mem_initialized = 1; + } +} + +int sqlcipher_register_provider(sqlcipher_provider *p) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_register_provider: entering SQLCIPHER_MUTEX_PROVIDER"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_register_provider: entered SQLCIPHER_MUTEX_PROVIDER"); + + if(default_provider != NULL && default_provider != p) { + /* only free the current registerd provider if it has been initialized + and it isn't a pointer to the same provider passed to the function + (i.e. protect against a caller calling register twice for the same provider) */ + sqlcipher_free(default_provider, sizeof(sqlcipher_provider)); + } + default_provider = p; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_register_provider: leaving SQLCIPHER_MUTEX_PROVIDER"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_register_provider: left SQLCIPHER_MUTEX_PROVIDER"); + + return SQLITE_OK; +} + +/* return a pointer to the currently registered provider. This will + allow an application to fetch the current registered provider and + make minor changes to it */ +sqlcipher_provider* sqlcipher_get_provider() { + return default_provider; +} + +void sqlcipher_activate() { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_activate: entering static master mutex"); + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_activate: entered static master mutex"); + + /* allocate new mutexes */ + if(sqlcipher_activate_count == 0) { + int i; + for(i = 0; i < SQLCIPHER_MUTEX_COUNT; i++) { + sqlcipher_static_mutex[i] = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + } + } + + /* check to see if there is a provider registered at this point + if there no provider registered at this point, register the + default provider */ + if(sqlcipher_get_provider() == NULL) { + sqlcipher_provider *p = sqlcipher_malloc(sizeof(sqlcipher_provider)); +#if defined (SQLCIPHER_CRYPTO_CC) + extern int sqlcipher_cc_setup(sqlcipher_provider *p); + sqlcipher_cc_setup(p); +#elif defined (SQLCIPHER_CRYPTO_LIBTOMCRYPT) + extern int sqlcipher_ltc_setup(sqlcipher_provider *p); + sqlcipher_ltc_setup(p); +#elif defined (SQLCIPHER_CRYPTO_NSS) + extern int sqlcipher_nss_setup(sqlcipher_provider *p); + sqlcipher_nss_setup(p); +#elif defined (SQLCIPHER_CRYPTO_OPENSSL) + extern int sqlcipher_openssl_setup(sqlcipher_provider *p); + sqlcipher_openssl_setup(p); +#else +#error "NO DEFAULT SQLCIPHER CRYPTO PROVIDER DEFINED" +#endif + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_activate: calling sqlcipher_register_provider(%p)", p); +#ifdef SQLCIPHER_EXT + sqlcipher_ext_provider_setup(p); +#endif + sqlcipher_register_provider(p); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_activate: called sqlcipher_register_provider(%p)",p); + } + + sqlcipher_activate_count++; /* increment activation count */ + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_activate: leaving static master mutex"); + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_activate: left static master mutex"); +} + +void sqlcipher_deactivate() { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: entering static master mutex"); + sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: entered static master mutex"); + + sqlcipher_activate_count--; + /* if no connections are using sqlcipher, cleanup globals */ + if(sqlcipher_activate_count < 1) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: entering SQLCIPHER_MUTEX_PROVIDER"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: entered SQLCIPHER_MUTEX_PROVIDER"); + + if(default_provider != NULL) { + sqlcipher_free(default_provider, sizeof(sqlcipher_provider)); + default_provider = NULL; + } + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: leaving SQLCIPHER_MUTEX_PROVIDER"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: left SQLCIPHER_MUTEX_PROVIDER"); + +#ifdef SQLCIPHER_EXT + sqlcipher_ext_provider_destroy(); +#endif + + /* last connection closed, free mutexes */ + if(sqlcipher_activate_count == 0) { + int i; + for(i = 0; i < SQLCIPHER_MUTEX_COUNT; i++) { + sqlite3_mutex_free(sqlcipher_static_mutex[i]); + } + } + sqlcipher_activate_count = 0; /* reset activation count */ + } + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: leaving static master mutex"); + sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_deactivate: left static master mutex"); +} + +/* constant time memset using volitile to avoid having the memset + optimized out by the compiler. + Note: As suggested by Joachim Schipper (joachim.schipper@fox-it.com) +*/ +void* sqlcipher_memset(void *v, unsigned char value, sqlite_uint64 len) { + sqlite_uint64 i = 0; + volatile unsigned char *a = v; + + if (v == NULL) return v; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_memset: setting %p[0-%llu]=%d)", a, len, value); + for(i = 0; i < len; i++) { + a[i] = value; + } + + return v; +} + +/* constant time memory check tests every position of a memory segement + matches a single value (i.e. the memory is all zeros) + returns 0 if match, 1 of no match */ +int sqlcipher_ismemset(const void *v, unsigned char value, sqlite_uint64 len) { + const unsigned char *a = v; + sqlite_uint64 i = 0, result = 0; + + for(i = 0; i < len; i++) { + result |= a[i] ^ value; + } + + return (result != 0); +} + +/* constant time memory comparison routine. + returns 0 if match, 1 if no match */ +int sqlcipher_memcmp(const void *v0, const void *v1, int len) { + const unsigned char *a0 = v0, *a1 = v1; + int i = 0, result = 0; + + for(i = 0; i < len; i++) { + result |= a0[i] ^ a1[i]; + } + + return (result != 0); +} + +void sqlcipher_mlock(void *ptr, sqlite_uint64 sz) { +#ifndef OMIT_MEMLOCK +#if defined(__unix__) || defined(__APPLE__) + int rc; + unsigned long pagesize = sysconf(_SC_PAGESIZE); + unsigned long offset = (unsigned long) ptr % pagesize; + + if(ptr == NULL || sz == 0) return; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_mem_lock: calling mlock(%p,%lu); _SC_PAGESIZE=%lu", ptr - offset, sz + offset, pagesize); + rc = mlock(ptr - offset, sz + offset); + if(rc!=0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_mem_lock: mlock(%p,%lu) returned %d errno=%d", ptr - offset, sz + offset, rc, errno); + } +#elif defined(_WIN32) +#if !(defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP)) + int rc; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_mem_lock: calling VirtualLock(%p,%d)", ptr, sz); + rc = VirtualLock(ptr, sz); + if(rc==0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_mem_lock: VirtualLock(%p,%d) returned %d LastError=%d", ptr, sz, rc, GetLastError()); + } +#endif +#endif +#endif +} + +void sqlcipher_munlock(void *ptr, sqlite_uint64 sz) { +#ifndef OMIT_MEMLOCK +#if defined(__unix__) || defined(__APPLE__) + int rc; + unsigned long pagesize = sysconf(_SC_PAGESIZE); + unsigned long offset = (unsigned long) ptr % pagesize; + + if(ptr == NULL || sz == 0) return; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_mem_unlock: calling munlock(%p,%lu)", ptr - offset, sz + offset); + rc = munlock(ptr - offset, sz + offset); + if(rc!=0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_mem_unlock: munlock(%p,%lu) returned %d errno=%d", ptr - offset, sz + offset, rc, errno); + } +#elif defined(_WIN32) +#if !(defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP)) + int rc; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_mem_lock: calling VirtualUnlock(%p,%d)", ptr, sz); + rc = VirtualUnlock(ptr, sz); + if(!rc) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_mem_unlock: VirtualUnlock(%p,%d) returned %d LastError=%d", ptr, sz, rc, GetLastError()); + } +#endif +#endif +#endif +} + +/** + * Free and wipe memory. Uses SQLites internal sqlite3_free so that memory + * can be countend and memory leak detection works in the test suite. + * If ptr is not null memory will be freed. + * If sz is greater than zero, the memory will be overwritten with zero before it is freed + * If sz is > 0, and not compiled with OMIT_MEMLOCK, system will attempt to unlock the + * memory segment so it can be paged + */ +void sqlcipher_free(void *ptr, sqlite_uint64 sz) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_free: calling sqlcipher_memset(%p,0,%llu)", ptr, sz); + sqlcipher_memset(ptr, 0, sz); + sqlcipher_munlock(ptr, sz); + sqlite3_free(ptr); +} + +/** + * allocate memory. Uses sqlite's internall malloc wrapper so memory can be + * reference counted and leak detection works. Unless compiled with OMIT_MEMLOCK + * attempts to lock the memory pages so sensitive information won't be swapped + */ +void* sqlcipher_malloc(sqlite_uint64 sz) { + void *ptr; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_malloc: calling sqlite3Malloc(%llu)", sz); + ptr = sqlite3Malloc(sz); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_malloc: calling sqlcipher_memset(%p,0,%llu)", ptr, sz); + sqlcipher_memset(ptr, 0, sz); + sqlcipher_mlock(ptr, sz); + return ptr; +} + +char* sqlcipher_version() { +#ifdef CIPHER_VERSION_QUALIFIER + char *version = sqlite3_mprintf("%s %s %s", CIPHER_XSTR(CIPHER_VERSION_NUMBER), CIPHER_XSTR(CIPHER_VERSION_QUALIFIER), CIPHER_XSTR(CIPHER_VERSION_BUILD)); +#else + char *version = sqlite3_mprintf("%s %s", CIPHER_XSTR(CIPHER_VERSION_NUMBER), CIPHER_XSTR(CIPHER_VERSION_BUILD)); +#endif + return version; +} + +/** + * Initialize new cipher_ctx struct. This function will allocate memory + * for the cipher context and for the key + * + * returns SQLITE_OK if initialization was successful + * returns SQLITE_NOMEM if an error occured allocating memory + */ +static int sqlcipher_cipher_ctx_init(codec_ctx *ctx, cipher_ctx **iCtx) { + cipher_ctx *c_ctx; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_cipher_ctx_init: allocating context"); + *iCtx = (cipher_ctx *) sqlcipher_malloc(sizeof(cipher_ctx)); + c_ctx = *iCtx; + if(c_ctx == NULL) return SQLITE_NOMEM; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_cipher_ctx_init: allocating key"); + c_ctx->key = (unsigned char *) sqlcipher_malloc(ctx->key_sz); + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_cipher_ctx_init: allocating hmac_key"); + c_ctx->hmac_key = (unsigned char *) sqlcipher_malloc(ctx->key_sz); + + if(c_ctx->key == NULL) return SQLITE_NOMEM; + if(c_ctx->hmac_key == NULL) return SQLITE_NOMEM; + + return SQLITE_OK; +} + +/** + * Free and wipe memory associated with a cipher_ctx + */ +static void sqlcipher_cipher_ctx_free(codec_ctx* ctx, cipher_ctx **iCtx) { + cipher_ctx *c_ctx = *iCtx; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "cipher_ctx_free: iCtx=%p", iCtx); + sqlcipher_free(c_ctx->key, ctx->key_sz); + sqlcipher_free(c_ctx->hmac_key, ctx->key_sz); + sqlcipher_free(c_ctx->pass, c_ctx->pass_sz); + sqlcipher_free(c_ctx->keyspec, ctx->keyspec_sz); + sqlcipher_free(c_ctx, sizeof(cipher_ctx)); +} + +static int sqlcipher_codec_ctx_reserve_setup(codec_ctx *ctx) { + int base_reserve = ctx->iv_sz; /* base reserve size will be IV only */ + int reserve = base_reserve; + + ctx->hmac_sz = ctx->provider->get_hmac_sz(ctx->provider_ctx, ctx->hmac_algorithm); + + if(sqlcipher_codec_ctx_get_use_hmac(ctx)) + reserve += ctx->hmac_sz; /* if reserve will include hmac, update that size */ + + /* calculate the amount of reserve needed in even increments of the cipher block size */ + reserve = ((reserve % ctx->block_sz) == 0) ? reserve : + ((reserve / ctx->block_sz) + 1) * ctx->block_sz; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_reserve_setup: base_reserve=%d block_sz=%d md_size=%d reserve=%d", + base_reserve, ctx->block_sz, ctx->hmac_sz, reserve); + + ctx->reserve_sz = reserve; + + return SQLITE_OK; +} + +/** + * Compare one cipher_ctx to another. + * + * returns 0 if all the parameters (except the derived key data) are the same + * returns 1 otherwise + */ +static int sqlcipher_cipher_ctx_cmp(cipher_ctx *c1, cipher_ctx *c2) { + int are_equal = ( + c1->pass_sz == c2->pass_sz + && ( + c1->pass == c2->pass + || !sqlcipher_memcmp((const unsigned char*)c1->pass, + (const unsigned char*)c2->pass, + c1->pass_sz) + )); + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_cipher_ctx_cmp: c1=%p c2=%p sqlcipher_memcmp(c1->pass, c2_pass)=%d are_equal=%d", + c1, c2, + (c1->pass == NULL || c2->pass == NULL) ? + -1 : + sqlcipher_memcmp( + (const unsigned char*)c1->pass, + (const unsigned char*)c2->pass, + c1->pass_sz + ), + are_equal + ); + + return !are_equal; /* return 0 if they are the same, 1 otherwise */ +} + +/** + * Copy one cipher_ctx to another. For instance, assuming that read_ctx is a + * fully initialized context, you could copy it to write_ctx and all yet data + * and pass information across + * + * returns SQLITE_OK if initialization was successful + * returns SQLITE_NOMEM if an error occured allocating memory + */ +static int sqlcipher_cipher_ctx_copy(codec_ctx *ctx, cipher_ctx *target, cipher_ctx *source) { + void *key = target->key; + void *hmac_key = target->hmac_key; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_cipher_ctx_copy: target=%p, source=%p", target, source); + sqlcipher_free(target->pass, target->pass_sz); + sqlcipher_free(target->keyspec, ctx->keyspec_sz); + memcpy(target, source, sizeof(cipher_ctx)); + + target->key = key; /* restore pointer to previously allocated key data */ + memcpy(target->key, source->key, ctx->key_sz); + + target->hmac_key = hmac_key; /* restore pointer to previously allocated hmac key data */ + memcpy(target->hmac_key, source->hmac_key, ctx->key_sz); + + if(source->pass && source->pass_sz) { + target->pass = sqlcipher_malloc(source->pass_sz); + if(target->pass == NULL) return SQLITE_NOMEM; + memcpy(target->pass, source->pass, source->pass_sz); + } + if(source->keyspec) { + target->keyspec = sqlcipher_malloc(ctx->keyspec_sz); + if(target->keyspec == NULL) return SQLITE_NOMEM; + memcpy(target->keyspec, source->keyspec, ctx->keyspec_sz); + } + return SQLITE_OK; +} + +/** + * Set the keyspec for the cipher_ctx + * + * returns SQLITE_OK if assignment was successfull + * returns SQLITE_NOMEM if an error occured allocating memory + */ +static int sqlcipher_cipher_ctx_set_keyspec(codec_ctx *ctx, cipher_ctx *c_ctx, const unsigned char *key) { + /* free, zero existing pointers and size */ + sqlcipher_free(c_ctx->keyspec, ctx->keyspec_sz); + c_ctx->keyspec = NULL; + + c_ctx->keyspec = sqlcipher_malloc(ctx->keyspec_sz); + if(c_ctx->keyspec == NULL) return SQLITE_NOMEM; + + c_ctx->keyspec[0] = 'x'; + c_ctx->keyspec[1] = '\''; + cipher_bin2hex(key, ctx->key_sz, c_ctx->keyspec + 2); + cipher_bin2hex(ctx->kdf_salt, ctx->kdf_salt_sz, c_ctx->keyspec + (ctx->key_sz * 2) + 2); + c_ctx->keyspec[ctx->keyspec_sz - 1] = '\''; + return SQLITE_OK; +} + +int sqlcipher_codec_get_store_pass(codec_ctx *ctx) { + return ctx->store_pass; +} + +void sqlcipher_codec_set_store_pass(codec_ctx *ctx, int value) { + ctx->store_pass = value; +} + +void sqlcipher_codec_get_pass(codec_ctx *ctx, void **zKey, int *nKey) { + *zKey = ctx->read_ctx->pass; + *nKey = ctx->read_ctx->pass_sz; +} + +static void sqlcipher_set_derive_key(codec_ctx *ctx, int derive) { + if(ctx->read_ctx != NULL) ctx->read_ctx->derive_key = 1; + if(ctx->write_ctx != NULL) ctx->write_ctx->derive_key = 1; +} + +/** + * Set the passphrase for the cipher_ctx + * + * returns SQLITE_OK if assignment was successfull + * returns SQLITE_NOMEM if an error occured allocating memory + */ +static int sqlcipher_cipher_ctx_set_pass(cipher_ctx *ctx, const void *zKey, int nKey) { + /* free, zero existing pointers and size */ + sqlcipher_free(ctx->pass, ctx->pass_sz); + ctx->pass = NULL; + ctx->pass_sz = 0; + + if(zKey && nKey) { /* if new password is provided, copy it */ + ctx->pass_sz = nKey; + ctx->pass = sqlcipher_malloc(nKey); + if(ctx->pass == NULL) return SQLITE_NOMEM; + memcpy(ctx->pass, zKey, nKey); + } + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_set_pass(codec_ctx *ctx, const void *zKey, int nKey, int for_ctx) { + cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx; + int rc; + + if((rc = sqlcipher_cipher_ctx_set_pass(c_ctx, zKey, nKey)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_set_pass: error %d from sqlcipher_cipher_ctx_set_pass", rc); + return rc; + } + + c_ctx->derive_key = 1; + + if(for_ctx == 2) { + if((rc = sqlcipher_cipher_ctx_copy(ctx, for_ctx ? ctx->read_ctx : ctx->write_ctx, c_ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_set_pass: error %d from sqlcipher_cipher_ctx_copy", rc); + return rc; + } + } + + return SQLITE_OK; +} + +const char* sqlcipher_codec_ctx_get_cipher(codec_ctx *ctx) { + return ctx->provider->get_cipher(ctx->provider_ctx); +} + +/* set the global default KDF iteration */ +void sqlcipher_set_default_kdf_iter(int iter) { + default_kdf_iter = iter; +} + +int sqlcipher_get_default_kdf_iter() { + return default_kdf_iter; +} + +int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *ctx, int kdf_iter) { + ctx->kdf_iter = kdf_iter; + sqlcipher_set_derive_key(ctx, 1); + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_get_kdf_iter(codec_ctx *ctx) { + return ctx->kdf_iter; +} + +int sqlcipher_codec_ctx_set_fast_kdf_iter(codec_ctx *ctx, int fast_kdf_iter) { + ctx->fast_kdf_iter = fast_kdf_iter; + sqlcipher_set_derive_key(ctx, 1); + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_get_fast_kdf_iter(codec_ctx *ctx) { + return ctx->fast_kdf_iter; +} + +/* set the global default flag for HMAC */ +void sqlcipher_set_default_use_hmac(int use) { + if(use) default_flags |= CIPHER_FLAG_HMAC; + else default_flags &= ~CIPHER_FLAG_HMAC; +} + +int sqlcipher_get_default_use_hmac() { + return (default_flags & CIPHER_FLAG_HMAC) != 0; +} + +void sqlcipher_set_hmac_salt_mask(unsigned char mask) { + hmac_salt_mask = mask; +} + +unsigned char sqlcipher_get_hmac_salt_mask() { + return hmac_salt_mask; +} + +/* set the codec flag for whether this individual database should be using hmac */ +int sqlcipher_codec_ctx_set_use_hmac(codec_ctx *ctx, int use) { + if(use) { + sqlcipher_codec_ctx_set_flag(ctx, CIPHER_FLAG_HMAC); + } else { + sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_HMAC); + } + + return sqlcipher_codec_ctx_reserve_setup(ctx); +} + +int sqlcipher_codec_ctx_get_use_hmac(codec_ctx *ctx) { + return (ctx->flags & CIPHER_FLAG_HMAC) != 0; +} + +/* the length of plaintext header size must be: + * 1. greater than or equal to zero + * 2. a multiple of the cipher block size + * 3. less than the usable size of the first database page + */ +int sqlcipher_set_default_plaintext_header_size(int size) { + default_plaintext_header_sz = size; + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_set_plaintext_header_size(codec_ctx *ctx, int size) { + if(size >= 0 && (size % ctx->block_sz) == 0 && size < (ctx->page_sz - ctx->reserve_sz)) { + ctx->plaintext_header_sz = size; + return SQLITE_OK; + } + ctx->plaintext_header_sz = -1; + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_set_plaintext_header_size: attempt to set invalid plantext_header_size %d", size); + return SQLITE_ERROR; +} + +int sqlcipher_get_default_plaintext_header_size() { + return default_plaintext_header_sz; +} + +int sqlcipher_codec_ctx_get_plaintext_header_size(codec_ctx *ctx) { + return ctx->plaintext_header_sz; +} + +/* manipulate HMAC algorithm */ +int sqlcipher_set_default_hmac_algorithm(int algorithm) { + default_hmac_algorithm = algorithm; + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_set_hmac_algorithm(codec_ctx *ctx, int algorithm) { + ctx->hmac_algorithm = algorithm; + return sqlcipher_codec_ctx_reserve_setup(ctx); +} + +int sqlcipher_get_default_hmac_algorithm() { + return default_hmac_algorithm; +} + +int sqlcipher_codec_ctx_get_hmac_algorithm(codec_ctx *ctx) { + return ctx->hmac_algorithm; +} + +/* manipulate KDF algorithm */ +int sqlcipher_set_default_kdf_algorithm(int algorithm) { + default_kdf_algorithm = algorithm; + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_set_kdf_algorithm(codec_ctx *ctx, int algorithm) { + ctx->kdf_algorithm = algorithm; + return SQLITE_OK; +} + +int sqlcipher_get_default_kdf_algorithm() { + return default_kdf_algorithm; +} + +int sqlcipher_codec_ctx_get_kdf_algorithm(codec_ctx *ctx) { + return ctx->kdf_algorithm; +} + +int sqlcipher_codec_ctx_set_flag(codec_ctx *ctx, unsigned int flag) { + ctx->flags |= flag; + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_unset_flag(codec_ctx *ctx, unsigned int flag) { + ctx->flags &= ~flag; + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_get_flag(codec_ctx *ctx, unsigned int flag) { + return (ctx->flags & flag) != 0; +} + +void sqlcipher_codec_ctx_set_error(codec_ctx *ctx, int error) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_set_error: ctx=%p, error=%d", ctx, error); + sqlite3pager_error(ctx->pBt->pBt->pPager, error); + ctx->pBt->pBt->db->errCode = error; +} + +int sqlcipher_codec_ctx_get_reservesize(codec_ctx *ctx) { + return ctx->reserve_sz; +} + +void* sqlcipher_codec_ctx_get_data(codec_ctx *ctx) { + return ctx->buffer; +} + +static int sqlcipher_codec_ctx_init_kdf_salt(codec_ctx *ctx) { + sqlite3_file *fd = sqlite3PagerFile(ctx->pBt->pBt->pPager); + + if(!ctx->need_kdf_salt) { + return SQLITE_OK; /* don't reload salt when not needed */ + } + + /* read salt from header, if present, otherwise generate a new random salt */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_init_kdf_salt: obtaining salt"); + if(fd == NULL || fd->pMethods == 0 || sqlite3OsRead(fd, ctx->kdf_salt, ctx->kdf_salt_sz, 0) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_init_kdf_salt: unable to read salt from file header, generating random"); + if(ctx->provider->random(ctx->provider_ctx, ctx->kdf_salt, ctx->kdf_salt_sz) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init_kdf_salt: error retrieving random bytes from provider"); + return SQLITE_ERROR; + } + } + ctx->need_kdf_salt = 0; + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_set_kdf_salt(codec_ctx *ctx, unsigned char *salt, int size) { + if(size >= ctx->kdf_salt_sz) { + memcpy(ctx->kdf_salt, salt, ctx->kdf_salt_sz); + ctx->need_kdf_salt = 0; + return SQLITE_OK; + } + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_set_kdf_salt: attempt to set salt of incorrect size %d", size); + return SQLITE_ERROR; +} + +int sqlcipher_codec_ctx_get_kdf_salt(codec_ctx *ctx, void** salt) { + int rc = SQLITE_OK; + if(ctx->need_kdf_salt) { + if((rc = sqlcipher_codec_ctx_init_kdf_salt(ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_get_kdf_salt: error %d from sqlcipher_codec_ctx_init_kdf_salt", rc); + } + } + *salt = ctx->kdf_salt; + + return rc; +} + +void sqlcipher_codec_get_keyspec(codec_ctx *ctx, void **zKey, int *nKey) { + *zKey = ctx->read_ctx->keyspec; + *nKey = ctx->keyspec_sz; +} + +int sqlcipher_codec_ctx_set_pagesize(codec_ctx *ctx, int size) { + if(!((size != 0) && ((size & (size - 1)) == 0)) || size < 512 || size > 65536) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "cipher_page_size not a power of 2 and between 512 and 65536 inclusive"); + return SQLITE_ERROR; + } + /* attempt to free the existing page buffer */ + sqlcipher_free(ctx->buffer,ctx->page_sz); + ctx->page_sz = size; + + /* pre-allocate a page buffer of PageSize bytes. This will + be used as a persistent buffer for encryption and decryption + operations to avoid overhead of multiple memory allocations*/ + ctx->buffer = sqlcipher_malloc(size); + if(ctx->buffer == NULL) return SQLITE_NOMEM; + + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_get_pagesize(codec_ctx *ctx) { + return ctx->page_sz; +} + +void sqlcipher_set_default_pagesize(int page_size) { + default_page_size = page_size; +} + +int sqlcipher_get_default_pagesize() { + return default_page_size; +} + +void sqlcipher_set_mem_security(int on) { + /* memory security can only be enabled, not disabled */ + if(on) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_set_mem_security: on"); + sqlcipher_mem_security_on = on; + } +} + +int sqlcipher_get_mem_security() { + /* only report that memory security is enabled if pragma cipher_memory_security is ON and + SQLCipher's allocator/deallocator was run at least one timecurrently used */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_get_mem_security: sqlcipher_mem_security_on = %d, sqlcipher_mem_executed = %d", sqlcipher_mem_security_on, sqlcipher_mem_executed); + return sqlcipher_mem_security_on && sqlcipher_mem_executed; +} + + +int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, const void *zKey, int nKey) { + int rc; + codec_ctx *ctx; + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_init: allocating context"); + + *iCtx = sqlcipher_malloc(sizeof(codec_ctx)); + ctx = *iCtx; + + if(ctx == NULL) return SQLITE_NOMEM; + + ctx->pBt = pDb->pBt; /* assign pointer to database btree structure */ + + /* allocate space for salt data. Then read the first 16 bytes + directly off the database file. This is the salt for the + key derivation function. If we get a short read allocate + a new random salt value */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_init: allocating kdf_salt"); + ctx->kdf_salt_sz = FILE_HEADER_SZ; + ctx->kdf_salt = sqlcipher_malloc(ctx->kdf_salt_sz); + if(ctx->kdf_salt == NULL) return SQLITE_NOMEM; + + /* allocate space for separate hmac salt data. We want the + HMAC derivation salt to be different than the encryption + key derivation salt */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_init: allocating hmac_kdf_salt"); + ctx->hmac_kdf_salt = sqlcipher_malloc(ctx->kdf_salt_sz); + if(ctx->hmac_kdf_salt == NULL) return SQLITE_NOMEM; + + /* setup default flags */ + ctx->flags = default_flags; + + /* defer attempt to read KDF salt until first use */ + ctx->need_kdf_salt = 1; + + /* setup the crypto provider */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_ctx_init: allocating provider"); + ctx->provider = (sqlcipher_provider *) sqlcipher_malloc(sizeof(sqlcipher_provider)); + if(ctx->provider == NULL) return SQLITE_NOMEM; + + /* make a copy of the provider to be used for the duration of the context */ + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_codec_ctx_init: entering SQLCIPHER_MUTEX_PROVIDER"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_codec_ctx_init: entered SQLCIPHER_MUTEX_PROVIDER"); + + memcpy(ctx->provider, default_provider, sizeof(sqlcipher_provider)); + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_codec_ctx_init: leaving SQLCIPHER_MUTEX_PROVIDER"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_codec_ctx_init: left SQLCIPHER_MUTEX_PROVIDER"); + + if((rc = ctx->provider->ctx_init(&ctx->provider_ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d returned from ctx_init", rc); + return rc; + } + + ctx->key_sz = ctx->provider->get_key_sz(ctx->provider_ctx); + ctx->iv_sz = ctx->provider->get_iv_sz(ctx->provider_ctx); + ctx->block_sz = ctx->provider->get_block_sz(ctx->provider_ctx); + + /* establic the size for a hex-formated key specification, containing the + raw encryption key and the salt used to generate it format. will be x'hexkey...hexsalt' + so oversize by 3 bytes */ + ctx->keyspec_sz = ((ctx->key_sz + ctx->kdf_salt_sz) * 2) + 3; + + /* + Always overwrite page size and set to the default because the first page of the database + in encrypted and thus sqlite can't effectively determine the pagesize. this causes an issue in + cases where bytes 16 & 17 of the page header are a power of 2 as reported by John Lehman + */ + if((rc = sqlcipher_codec_ctx_set_pagesize(ctx, default_page_size)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d returned from sqlcipher_codec_ctx_set_pagesize with %d", rc, default_page_size); + return rc; + } + + /* establish settings for the KDF iterations and fast (HMAC) KDF iterations */ + if((rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, default_kdf_iter)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting default_kdf_iter %d", rc, default_kdf_iter); + return rc; + } + + if((rc = sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, FAST_PBKDF2_ITER)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting fast_kdf_iter to %d", rc, FAST_PBKDF2_ITER); + return rc; + } + + /* set the default HMAC and KDF algorithms which will determine the reserve size */ + if((rc = sqlcipher_codec_ctx_set_hmac_algorithm(ctx, default_hmac_algorithm)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting sqlcipher_codec_ctx_set_hmac_algorithm with %d", rc, default_hmac_algorithm); + return rc; + } + + /* Note that use_hmac is a special case that requires recalculation of page size + so we call set_use_hmac to perform setup */ + if((rc = sqlcipher_codec_ctx_set_use_hmac(ctx, default_flags & CIPHER_FLAG_HMAC)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting use_hmac %d", rc, default_flags & CIPHER_FLAG_HMAC); + return rc; + } + + if((rc = sqlcipher_codec_ctx_set_kdf_algorithm(ctx, default_kdf_algorithm)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting sqlcipher_codec_ctx_set_kdf_algorithm with %d", rc, default_kdf_algorithm); + return rc; + } + + /* setup the default plaintext header size */ + if((rc = sqlcipher_codec_ctx_set_plaintext_header_size(ctx, default_plaintext_header_sz)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting sqlcipher_codec_ctx_set_plaintext_header_size with %d", rc, default_plaintext_header_sz); + return rc; + } + + /* initialize the read and write sub-contexts. this must happen after key_sz is established */ + if((rc = sqlcipher_cipher_ctx_init(ctx, &ctx->read_ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d initializing read_ctx", rc); + return rc; + } + + if((rc = sqlcipher_cipher_ctx_init(ctx, &ctx->write_ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d initializing write_ctx", rc); + return rc; + } + + /* set the key material on one of the sub cipher contexts and sync them up */ + if((rc = sqlcipher_codec_ctx_set_pass(ctx, zKey, nKey, 0)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d setting pass key", rc); + return rc; + } + + if((rc = sqlcipher_cipher_ctx_copy(ctx, ctx->write_ctx, ctx->read_ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_ctx_init: error %d copying write_ctx to read_ctx", rc); + return rc; + } + + return SQLITE_OK; +} + +/** + * Free and wipe memory associated with a cipher_ctx, including the allocated + * read_ctx and write_ctx. + */ +void sqlcipher_codec_ctx_free(codec_ctx **iCtx) { + codec_ctx *ctx = *iCtx; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "codec_ctx_free: iCtx=%p", iCtx); + sqlcipher_free(ctx->kdf_salt, ctx->kdf_salt_sz); + sqlcipher_free(ctx->hmac_kdf_salt, ctx->kdf_salt_sz); + sqlcipher_free(ctx->buffer, ctx->page_sz); + + ctx->provider->ctx_free(&ctx->provider_ctx); + sqlcipher_free(ctx->provider, sizeof(sqlcipher_provider)); + + sqlcipher_cipher_ctx_free(ctx, &ctx->read_ctx); + sqlcipher_cipher_ctx_free(ctx, &ctx->write_ctx); + sqlcipher_free(ctx, sizeof(codec_ctx)); +} + +/** convert a 32bit unsigned integer to little endian byte ordering */ +static void sqlcipher_put4byte_le(unsigned char *p, u32 v) { + p[0] = (u8)v; + p[1] = (u8)(v>>8); + p[2] = (u8)(v>>16); + p[3] = (u8)(v>>24); +} + +static int sqlcipher_page_hmac(codec_ctx *ctx, cipher_ctx *c_ctx, Pgno pgno, unsigned char *in, int in_sz, unsigned char *out) { + unsigned char pgno_raw[sizeof(pgno)]; + /* we may convert page number to consistent representation before calculating MAC for + compatibility across big-endian and little-endian platforms. + + Note: The public release of sqlcipher 2.0.0 to 2.0.6 had a bug where the bytes of pgno + were used directly in the MAC. SQLCipher convert's to little endian by default to preserve + backwards compatibility on the most popular platforms, but can optionally be configured + to use either big endian or native byte ordering via pragma. */ + + if(ctx->flags & CIPHER_FLAG_LE_PGNO) { /* compute hmac using little endian pgno*/ + sqlcipher_put4byte_le(pgno_raw, pgno); + } else if(ctx->flags & CIPHER_FLAG_BE_PGNO) { /* compute hmac using big endian pgno */ + sqlite3Put4byte(pgno_raw, pgno); /* sqlite3Put4byte converts 32bit uint to big endian */ + } else { /* use native byte ordering */ + memcpy(pgno_raw, &pgno, sizeof(pgno)); + } + + /* include the encrypted page data, initialization vector, and page number in HMAC. This will + prevent both tampering with the ciphertext, manipulation of the IV, or resequencing otherwise + valid pages out of order in a database */ + return ctx->provider->hmac( + ctx->provider_ctx, ctx->hmac_algorithm, c_ctx->hmac_key, + ctx->key_sz, in, + in_sz, (unsigned char*) &pgno_raw, + sizeof(pgno), out); +} + +/* + * ctx - codec context + * pgno - page number in database + * size - size in bytes of input and output buffers + * mode - 1 to encrypt, 0 to decrypt + * in - pointer to input bytes + * out - pouter to output bytes + */ +int sqlcipher_page_cipher(codec_ctx *ctx, int for_ctx, Pgno pgno, int mode, int page_sz, unsigned char *in, unsigned char *out) { + cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx; + unsigned char *iv_in, *iv_out, *hmac_in, *hmac_out, *out_start; + int size; + + /* calculate some required positions into various buffers */ + size = page_sz - ctx->reserve_sz; /* adjust size to useable size and memset reserve at end of page */ + iv_out = out + size; + iv_in = in + size; + + /* hmac will be written immediately after the initialization vector. the remainder of the page reserve will contain + random bytes. note, these pointers are only valid when using hmac */ + hmac_in = in + size + ctx->iv_sz; + hmac_out = out + size + ctx->iv_sz; + out_start = out; /* note the original position of the output buffer pointer, as out will be rewritten during encryption */ + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_page_cipher: pgno=%d, mode=%d, size=%d", pgno, mode, size); + CODEC_HEXDUMP("sqlcipher_page_cipher: input page data", in, page_sz); + + /* the key size should never be zero. If it is, error out. */ + if(ctx->key_sz == 0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_page_cipher: error possible context corruption, key_sz is zero for pgno=%d", pgno); + goto error; + } + + if(mode == CIPHER_ENCRYPT) { + /* start at front of the reserve block, write random data to the end */ + if(ctx->provider->random(ctx->provider_ctx, iv_out, ctx->reserve_sz) != SQLITE_OK) goto error; + } else { /* CIPHER_DECRYPT */ + memcpy(iv_out, iv_in, ctx->iv_sz); /* copy the iv from the input to output buffer */ + } + + if((ctx->flags & CIPHER_FLAG_HMAC) && (mode == CIPHER_DECRYPT) && !ctx->skip_read_hmac) { + if(sqlcipher_page_hmac(ctx, c_ctx, pgno, in, size + ctx->iv_sz, hmac_out) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_page_cipher: hmac operation on decrypt failed for pgno=%d", pgno); + goto error; + } + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_page_cipher: comparing hmac on in=%p out=%p hmac_sz=%d", hmac_in, hmac_out, ctx->hmac_sz); + if(sqlcipher_memcmp(hmac_in, hmac_out, ctx->hmac_sz) != 0) { /* the hmac check failed */ + if(sqlite3BtreeGetAutoVacuum(ctx->pBt) != BTREE_AUTOVACUUM_NONE && sqlcipher_ismemset(in, 0, page_sz) == 0) { + /* first check if the entire contents of the page is zeros. If so, this page + resulted from a short read (i.e. sqlite attempted to pull a page after the end of the file. these + short read failures must be ignored for autovaccum mode to work so wipe the output buffer + and return SQLITE_OK to skip the decryption step. */ + sqlcipher_log(SQLCIPHER_LOG_WARN, "sqlcipher_page_cipher: zeroed page (short read) for pgno %d, encryption but returning SQLITE_OK", pgno); + sqlcipher_memset(out, 0, page_sz); + return SQLITE_OK; + } else { + /* if the page memory is not all zeros, it means the there was data and a hmac on the page. + since the check failed, the page was either tampered with or corrupted. wipe the output buffer, + and return SQLITE_ERROR to the caller */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_page_cipher: hmac check failed for pgno=%d returning SQLITE_ERROR", pgno); + goto error; + } + } + } + + if(ctx->provider->cipher(ctx->provider_ctx, mode, c_ctx->key, ctx->key_sz, iv_out, in, size, out) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_page_cipher: cipher operation mode=%d failed for pgno=%d returning SQLITE_ERROR", mode, pgno); + goto error; + }; + + if((ctx->flags & CIPHER_FLAG_HMAC) && (mode == CIPHER_ENCRYPT)) { + if(sqlcipher_page_hmac(ctx, c_ctx, pgno, out_start, size + ctx->iv_sz, hmac_out) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_page_cipher: hmac operation on encrypt failed for pgno=%d", pgno); + goto error; + }; + } + + CODEC_HEXDUMP("sqlcipher_page_cipher: output page data", out_start, page_sz); + + return SQLITE_OK; +error: + sqlcipher_memset(out, 0, page_sz); + return SQLITE_ERROR; +} + +/** + * Derive an encryption key for a cipher contex key based on the raw password. + * + * If the raw key data is formated as x'hex' and there are exactly enough hex chars to fill + * the key (i.e 64 hex chars for a 256 bit key) then the key data will be used directly. + + * Else, if the raw key data is formated as x'hex' and there are exactly enough hex chars to fill + * the key and the salt (i.e 92 hex chars for a 256 bit key and 16 byte salt) then it will be unpacked + * as the key followed by the salt. + * + * Otherwise, a key data will be derived using PBKDF2 + * + * returns SQLITE_OK if initialization was successful + * returns SQLITE_ERROR if the key could't be derived (for instance if pass is NULL or pass_sz is 0) + */ +static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { + int rc; + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_cipher_ctx_key_derive: ctx->kdf_salt_sz=%d ctx->kdf_iter=%d ctx->fast_kdf_iter=%d ctx->key_sz=%d", + ctx->kdf_salt_sz, ctx->kdf_iter, ctx->fast_kdf_iter, ctx->key_sz); + + if(c_ctx->pass && c_ctx->pass_sz) { /* if key material is present on the context for derivation */ + + /* if necessary, initialize the salt from the header or random source */ + if(ctx->need_kdf_salt) { + if((rc = sqlcipher_codec_ctx_init_kdf_salt(ctx)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_cipher_ctx_key_derive: error %d from sqlcipher_codec_ctx_init_kdf_salt", rc); + return rc; + } + } + + if (c_ctx->pass_sz == ((ctx->key_sz * 2) + 3) && sqlite3StrNICmp((const char *)c_ctx->pass ,"x'", 2) == 0 && cipher_isHex(c_ctx->pass + 2, ctx->key_sz * 2)) { + int n = c_ctx->pass_sz - 3; /* adjust for leading x' and tailing ' */ + const unsigned char *z = c_ctx->pass + 2; /* adjust lead offset of x' */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "cipher_ctx_key_derive: using raw key from hex"); + cipher_hex2bin(z, n, c_ctx->key); + } else if (c_ctx->pass_sz == (((ctx->key_sz + ctx->kdf_salt_sz) * 2) + 3) && sqlite3StrNICmp((const char *)c_ctx->pass ,"x'", 2) == 0 && cipher_isHex(c_ctx->pass + 2, (ctx->key_sz + ctx->kdf_salt_sz) * 2)) { + const unsigned char *z = c_ctx->pass + 2; /* adjust lead offset of x' */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "cipher_ctx_key_derive: using raw key from hex"); + cipher_hex2bin(z, (ctx->key_sz * 2), c_ctx->key); + cipher_hex2bin(z + (ctx->key_sz * 2), (ctx->kdf_salt_sz * 2), ctx->kdf_salt); + } else { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "cipher_ctx_key_derive: deriving key using full PBKDF2 with %d iterations", ctx->kdf_iter); + if(ctx->provider->kdf(ctx->provider_ctx, ctx->kdf_algorithm, c_ctx->pass, c_ctx->pass_sz, + ctx->kdf_salt, ctx->kdf_salt_sz, ctx->kdf_iter, + ctx->key_sz, c_ctx->key) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "cipher_ctx_key_derive: error occurred from provider kdf generating encryption key"); + return SQLITE_ERROR; + } + } + + /* set the context "keyspec" containing the hex-formatted key and salt to be used when attaching databases */ + if((rc = sqlcipher_cipher_ctx_set_keyspec(ctx, c_ctx, c_ctx->key)) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_cipher_ctx_key_derive: error %d from sqlcipher_cipher_ctx_set_keyspec", rc); + return rc; + } + + /* if this context is setup to use hmac checks, generate a seperate and different + key for HMAC. In this case, we use the output of the previous KDF as the input to + this KDF run. This ensures a distinct but predictable HMAC key. */ + if(ctx->flags & CIPHER_FLAG_HMAC) { + int i; + + /* start by copying the kdf key into the hmac salt slot + then XOR it with the fixed hmac salt defined at compile time + this ensures that the salt passed in to derive the hmac key, while + easy to derive and publically known, is not the same as the salt used + to generate the encryption key */ + memcpy(ctx->hmac_kdf_salt, ctx->kdf_salt, ctx->kdf_salt_sz); + for(i = 0; i < ctx->kdf_salt_sz; i++) { + ctx->hmac_kdf_salt[i] ^= hmac_salt_mask; + } + + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "cipher_ctx_key_derive: deriving hmac key from encryption key using PBKDF2 with %d iterations", + ctx->fast_kdf_iter); + + + if(ctx->provider->kdf(ctx->provider_ctx, ctx->kdf_algorithm, c_ctx->key, ctx->key_sz, + ctx->hmac_kdf_salt, ctx->kdf_salt_sz, ctx->fast_kdf_iter, + ctx->key_sz, c_ctx->hmac_key) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "cipher_ctx_key_derive: error occurred from provider kdf generating HMAC key"); + return SQLITE_ERROR; + } + } + + c_ctx->derive_key = 0; + return SQLITE_OK; + } + sqlcipher_log(SQLCIPHER_LOG_ERROR, "cipher_ctx_key_derive: key material is not present on the context for key derivation"); + return SQLITE_ERROR; +} + +int sqlcipher_codec_key_derive(codec_ctx *ctx) { + /* derive key on first use if necessary */ + if(ctx->read_ctx->derive_key) { + if(sqlcipher_cipher_ctx_key_derive(ctx, ctx->read_ctx) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_key_derive: error occurred deriving read_ctx key"); + return SQLITE_ERROR; + } + } + + if(ctx->write_ctx->derive_key) { + if(sqlcipher_cipher_ctx_cmp(ctx->write_ctx, ctx->read_ctx) == 0) { + /* the relevant parameters are the same, just copy read key */ + if(sqlcipher_cipher_ctx_copy(ctx, ctx->write_ctx, ctx->read_ctx) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_key_derive: error occurred copying read_ctx to write_ctx"); + return SQLITE_ERROR; + } + } else { + if(sqlcipher_cipher_ctx_key_derive(ctx, ctx->write_ctx) != SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_key_derive: error occurred deriving write_ctx key"); + return SQLITE_ERROR; + } + } + } + + /* TODO: wipe and free passphrase after key derivation */ + if(ctx->store_pass != 1) { + sqlcipher_cipher_ctx_set_pass(ctx->read_ctx, NULL, 0); + sqlcipher_cipher_ctx_set_pass(ctx->write_ctx, NULL, 0); + } + + return SQLITE_OK; +} + +int sqlcipher_codec_key_copy(codec_ctx *ctx, int source) { + if(source == CIPHER_READ_CTX) { + return sqlcipher_cipher_ctx_copy(ctx, ctx->write_ctx, ctx->read_ctx); + } else { + return sqlcipher_cipher_ctx_copy(ctx, ctx->read_ctx, ctx->write_ctx); + } +} + +const char* sqlcipher_codec_get_cipher_provider(codec_ctx *ctx) { + return ctx->provider->get_provider_name(ctx->provider_ctx); +} + + +static int sqlcipher_check_connection(const char *filename, char *key, int key_sz, char *sql, int *user_version, char** journal_mode) { + int rc; + sqlite3 *db = NULL; + sqlite3_stmt *statement = NULL; + char *query_journal_mode = "PRAGMA journal_mode;"; + char *query_user_version = "PRAGMA user_version;"; + + rc = sqlite3_open(filename, &db); + if(rc != SQLITE_OK) goto cleanup; + + rc = sqlite3_key(db, key, key_sz); + if(rc != SQLITE_OK) goto cleanup; + + rc = sqlite3_exec(db, sql, NULL, NULL, NULL); + if(rc != SQLITE_OK) goto cleanup; + + /* start by querying the user version. + this will fail if the key is incorrect */ + rc = sqlite3_prepare(db, query_user_version, -1, &statement, NULL); + if(rc != SQLITE_OK) goto cleanup; + + rc = sqlite3_step(statement); + if(rc == SQLITE_ROW) { + *user_version = sqlite3_column_int(statement, 0); + } else { + goto cleanup; + } + sqlite3_finalize(statement); + + rc = sqlite3_prepare(db, query_journal_mode, -1, &statement, NULL); + if(rc != SQLITE_OK) goto cleanup; + + rc = sqlite3_step(statement); + if(rc == SQLITE_ROW) { + *journal_mode = sqlite3_mprintf("%s", sqlite3_column_text(statement, 0)); + } else { + goto cleanup; + } + rc = SQLITE_OK; + /* cleanup will finalize open statement */ + +cleanup: + if(statement) sqlite3_finalize(statement); + if(db) sqlite3_close(db); + return rc; +} + +int sqlcipher_codec_ctx_integrity_check(codec_ctx *ctx, Parse *pParse, char *column) { + Pgno page = 1; + int rc = 0; + char *result; + unsigned char *hmac_out = NULL; + sqlite3_file *fd = sqlite3PagerFile(ctx->pBt->pBt->pPager); + i64 file_sz; + + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, column, SQLITE_STATIC); + + if(fd == NULL || fd->pMethods == 0) { + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, "database file is undefined", P4_TRANSIENT); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + goto cleanup; + } + + if(!(ctx->flags & CIPHER_FLAG_HMAC)) { + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, "HMAC is not enabled, unable to integrity check", P4_TRANSIENT); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + goto cleanup; + } + + if((rc = sqlcipher_codec_key_derive(ctx)) != SQLITE_OK) { + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, "unable to derive keys", P4_TRANSIENT); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + goto cleanup; + } + + sqlite3OsFileSize(fd, &file_sz); + hmac_out = sqlcipher_malloc(ctx->hmac_sz); + + for(page = 1; page <= file_sz / ctx->page_sz; page++) { + i64 offset = (page - 1) * ctx->page_sz; + int payload_sz = ctx->page_sz - ctx->reserve_sz + ctx->iv_sz; + int read_sz = ctx->page_sz; + + /* skip integrity check on PAGER_SJ_PGNO since it will have no valid content */ + if(sqlite3pager_is_sj_pgno(ctx->pBt->pBt->pPager, page)) continue; + + if(page==1) { + int page1_offset = ctx->plaintext_header_sz ? ctx->plaintext_header_sz : FILE_HEADER_SZ; + read_sz = read_sz - page1_offset; + payload_sz = payload_sz - page1_offset; + offset += page1_offset; + } + + sqlcipher_memset(ctx->buffer, 0, ctx->page_sz); + sqlcipher_memset(hmac_out, 0, ctx->hmac_sz); + if(sqlite3OsRead(fd, ctx->buffer, read_sz, offset) != SQLITE_OK) { + result = sqlite3_mprintf("error reading %d bytes from file page %d at offset %d", read_sz, page, offset); + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, result, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } else if(sqlcipher_page_hmac(ctx, ctx->read_ctx, page, ctx->buffer, payload_sz, hmac_out) != SQLITE_OK) { + result = sqlite3_mprintf("HMAC operation failed for page %d", page); + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, result, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } else if(sqlcipher_memcmp(ctx->buffer + payload_sz, hmac_out, ctx->hmac_sz) != 0) { + result = sqlite3_mprintf("HMAC verification failed for page %d", page); + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, result, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } + } + + if(file_sz % ctx->page_sz != 0) { + result = sqlite3_mprintf("page %d has an invalid size of %lld bytes", page, file_sz - ((file_sz / ctx->page_sz) * ctx->page_sz)); + sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, result, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } + +cleanup: + if(hmac_out != NULL) sqlcipher_free(hmac_out, ctx->hmac_sz); + return SQLITE_OK; +} + +int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) { + int i, pass_sz, keyspec_sz, nRes, user_version, rc, oflags; + Db *pDb = 0; + sqlite3 *db = ctx->pBt->db; + const char *db_filename = sqlite3_db_filename(db, "main"); + char *set_user_version = NULL, *pass = NULL, *attach_command = NULL, *migrated_db_filename = NULL, *keyspec = NULL, *temp = NULL, *journal_mode = NULL, *set_journal_mode = NULL, *pragma_compat = NULL; + Btree *pDest = NULL, *pSrc = NULL; + sqlite3_file *srcfile, *destfile; +#if defined(_WIN32) || defined(SQLITE_OS_WINRT) + LPWSTR w_db_filename = NULL, w_migrated_db_filename = NULL; + int w_db_filename_sz = 0, w_migrated_db_filename_sz = 0; +#endif + pass_sz = keyspec_sz = rc = user_version = 0; + + if(!db_filename || sqlite3Strlen30(db_filename) < 1) + goto cleanup; /* exit immediately if this is an in memory database */ + + /* pull the provided password / key material off the current codec context */ + pass_sz = ctx->read_ctx->pass_sz; + pass = sqlcipher_malloc(pass_sz+1); + memset(pass, 0, pass_sz+1); + memcpy(pass, ctx->read_ctx->pass, pass_sz); + + /* Version 4 - current, no upgrade required, so exit immediately */ + rc = sqlcipher_check_connection(db_filename, pass, pass_sz, "", &user_version, &journal_mode); + if(rc == SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "No upgrade required - exiting"); + goto cleanup; + } + + for(i = 3; i > 0; i--) { + pragma_compat = sqlite3_mprintf("PRAGMA cipher_compatibility = %d;", i); + rc = sqlcipher_check_connection(db_filename, pass, pass_sz, pragma_compat, &user_version, &journal_mode); + if(rc == SQLITE_OK) { + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "Version %d format found", i); + goto migrate; + } + if(pragma_compat) sqlcipher_free(pragma_compat, sqlite3Strlen30(pragma_compat)); + pragma_compat = NULL; + } + + /* if we exit the loop normally we failed to determine the version, this is an error */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "Upgrade format not determined"); + goto handle_error; + +migrate: + + temp = sqlite3_mprintf("%s-migrated", db_filename); + /* overallocate migrated_db_filename, because sqlite3OsOpen will read past the null terminator + * to determine whether the filename was URI formatted */ + migrated_db_filename = sqlcipher_malloc(sqlite3Strlen30(temp)+2); + memcpy(migrated_db_filename, temp, sqlite3Strlen30(temp)); + sqlcipher_free(temp, sqlite3Strlen30(temp)); + + attach_command = sqlite3_mprintf("ATTACH DATABASE '%s' as migrate;", migrated_db_filename, pass); + set_user_version = sqlite3_mprintf("PRAGMA migrate.user_version = %d;", user_version); + + rc = sqlite3_exec(db, pragma_compat, NULL, NULL, NULL); + if(rc != SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "set compatibility mode failed, error code %d", rc); + goto handle_error; + } + + /* force journal mode to DELETE, we will set it back later if different */ + rc = sqlite3_exec(db, "PRAGMA journal_mode = delete;", NULL, NULL, NULL); + if(rc != SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "force journal mode DELETE failed, error code %d", rc); + goto handle_error; + } + + rc = sqlite3_exec(db, attach_command, NULL, NULL, NULL); + if(rc != SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "attach failed, error code %d", rc); + goto handle_error; + } + + rc = sqlite3_key_v2(db, "migrate", pass, pass_sz); + if(rc != SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "keying attached database failed, error code %d", rc); + goto handle_error; + } + + rc = sqlite3_exec(db, "SELECT sqlcipher_export('migrate');", NULL, NULL, NULL); + if(rc != SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_export failed, error code %d", rc); + goto handle_error; + } + +#ifdef SQLCIPHER_TEST + if((sqlcipher_get_test_flags() & TEST_FAIL_MIGRATE) > 0) { + rc = SQLITE_ERROR; + sqlcipher_log(SQLCIPHER_LOG_ERROR, "simulated migrate failure, error code %d", rc); + goto handle_error; + } +#endif + + rc = sqlite3_exec(db, set_user_version, NULL, NULL, NULL); + if(rc != SQLITE_OK){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "set user version failed, error code %d", rc); + goto handle_error; + } + + if( !db->autoCommit ){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "cannot migrate from within a transaction"); + goto handle_error; + } + if( db->nVdbeActive>1 ){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "cannot migrate - SQL statements in progress"); + goto handle_error; + } + + pDest = db->aDb[0].pBt; + pDb = &(db->aDb[db->nDb-1]); + pSrc = pDb->pBt; + + nRes = sqlite3BtreeGetRequestedReserve(pSrc); + /* unset the BTS_PAGESIZE_FIXED flag to avoid SQLITE_READONLY */ + pDest->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; + rc = sqlite3BtreeSetPageSize(pDest, default_page_size, nRes, 0); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "set btree page size to %d res %d rc %d", default_page_size, nRes, rc); + if( rc!=SQLITE_OK ) goto handle_error; + + sqlcipherCodecGetKey(db, db->nDb - 1, (void**)&keyspec, &keyspec_sz); + sqlcipherCodecAttach(db, 0, keyspec, keyspec_sz); + + srcfile = sqlite3PagerFile(pSrc->pBt->pPager); + destfile = sqlite3PagerFile(pDest->pBt->pPager); + + sqlite3OsClose(srcfile); + sqlite3OsClose(destfile); + +#if defined(_WIN32) || defined(SQLITE_OS_WINRT) + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "performing windows MoveFileExA"); + + w_db_filename_sz = MultiByteToWideChar(CP_UTF8, 0, (LPCCH) db_filename, -1, NULL, 0); + w_db_filename = sqlcipher_malloc(w_db_filename_sz * sizeof(wchar_t)); + w_db_filename_sz = MultiByteToWideChar(CP_UTF8, 0, (LPCCH) db_filename, -1, (const LPWSTR) w_db_filename, w_db_filename_sz); + + w_migrated_db_filename_sz = MultiByteToWideChar(CP_UTF8, 0, (LPCCH) migrated_db_filename, -1, NULL, 0); + w_migrated_db_filename = sqlcipher_malloc(w_migrated_db_filename_sz * sizeof(wchar_t)); + w_migrated_db_filename_sz = MultiByteToWideChar(CP_UTF8, 0, (LPCCH) migrated_db_filename, -1, (const LPWSTR) w_migrated_db_filename, w_migrated_db_filename_sz); + + if(!MoveFileExW(w_migrated_db_filename, w_db_filename, MOVEFILE_REPLACE_EXISTING)) { + rc = SQLITE_ERROR; + sqlcipher_log(SQLCIPHER_LOG_ERROR, "error occurred while renaming %d", rc); + goto handle_error; + } +#else + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "performing POSIX rename"); + if ((rc = rename(migrated_db_filename, db_filename)) != 0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "error occurred while renaming %d", rc); + goto handle_error; + } +#endif + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "renamed migration database %s to main database %s: %d", migrated_db_filename, db_filename, rc); + + rc = sqlite3OsOpen(db->pVfs, migrated_db_filename, srcfile, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_MAIN_DB, &oflags); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "reopened migration database: %d", rc); + if( rc!=SQLITE_OK ) goto handle_error; + + rc = sqlite3OsOpen(db->pVfs, db_filename, destfile, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_MAIN_DB, &oflags); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "reopened main database: %d", rc); + if( rc!=SQLITE_OK ) goto handle_error; + + sqlite3pager_reset(pDest->pBt->pPager); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "reset pager"); + + rc = sqlite3_exec(db, "DETACH DATABASE migrate;", NULL, NULL, NULL); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "DETACH DATABASE called %d", rc); + if(rc != SQLITE_OK) goto cleanup; + + sqlite3ResetAllSchemasOfConnection(db); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "reset all schemas"); + + set_journal_mode = sqlite3_mprintf("PRAGMA journal_mode = %s;", journal_mode); + rc = sqlite3_exec(db, set_journal_mode, NULL, NULL, NULL); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "%s: %d", set_journal_mode, rc); + if( rc!=SQLITE_OK ) goto handle_error; + + goto cleanup; + +handle_error: + sqlcipher_log(SQLCIPHER_LOG_ERROR, "An error occurred attempting to migrate the database - last error %d", rc); + +cleanup: + if(migrated_db_filename) { + int del_rc = sqlite3OsDelete(db->pVfs, migrated_db_filename, 0); + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "deleted migration database: %d", del_rc); + } + + if(pass) sqlcipher_free(pass, pass_sz); + if(attach_command) sqlcipher_free(attach_command, sqlite3Strlen30(attach_command)); + if(migrated_db_filename) sqlcipher_free(migrated_db_filename, sqlite3Strlen30(migrated_db_filename)); + if(set_user_version) sqlcipher_free(set_user_version, sqlite3Strlen30(set_user_version)); + if(set_journal_mode) sqlcipher_free(set_journal_mode, sqlite3Strlen30(set_journal_mode)); + if(journal_mode) sqlcipher_free(journal_mode, sqlite3Strlen30(journal_mode)); + if(pragma_compat) sqlcipher_free(pragma_compat, sqlite3Strlen30(pragma_compat)); +#if defined(_WIN32) || defined(SQLITE_OS_WINRT) + if(w_db_filename) sqlcipher_free(w_db_filename, w_db_filename_sz); + if(w_migrated_db_filename) sqlcipher_free(w_migrated_db_filename, w_migrated_db_filename_sz); +#endif + return rc; +} + +int sqlcipher_codec_add_random(codec_ctx *ctx, const char *zRight, int random_sz){ + const char *suffix = &zRight[random_sz-1]; + int n = random_sz - 3; /* adjust for leading x' and tailing ' */ + if (n > 0 && + sqlite3StrNICmp((const char *)zRight ,"x'", 2) == 0 && + sqlite3StrNICmp(suffix, "'", 1) == 0 && + n % 2 == 0) { + int rc = 0; + int buffer_sz = n / 2; + unsigned char *random; + const unsigned char *z = (const unsigned char *)zRight + 2; /* adjust lead offset of x' */ + sqlcipher_log(SQLCIPHER_LOG_DEBUG, "sqlcipher_codec_add_random: using raw random blob from hex"); + random = sqlcipher_malloc(buffer_sz); + memset(random, 0, buffer_sz); + cipher_hex2bin(z, n, random); + rc = ctx->provider->add_random(ctx->provider_ctx, random, buffer_sz); + sqlcipher_free(random, buffer_sz); + return rc; + } + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_codec_add_random: attemt to add random with invalid format"); + return SQLITE_ERROR; +} + +#if !defined(SQLITE_OMIT_TRACE) +static int sqlcipher_profile_callback(unsigned int trace, void *file, void *stmt, void *run_time){ + FILE *f = (FILE*) file; + char *fmt = "Elapsed time:%.3f ms - %s\n"; + double elapsed = (*((sqlite3_uint64*)run_time))/1000000.0; +#ifdef __ANDROID__ + if(f == NULL) { + __android_log_print(ANDROID_LOG_DEBUG, "sqlcipher", fmt, elapsed, sqlite3_sql((sqlite3_stmt*)stmt)); + } +#endif + if(f) fprintf(f, fmt, elapsed, sqlite3_sql((sqlite3_stmt*)stmt)); + return SQLITE_OK; +} +#endif + +int sqlcipher_cipher_profile(sqlite3 *db, const char *destination){ +#if defined(SQLITE_OMIT_TRACE) + return SQLITE_ERROR; +#else + FILE *f = NULL; + if(sqlite3_stricmp(destination, "off") == 0){ + sqlite3_trace_v2(db, 0, NULL, NULL); /* disable tracing */ + } else { + if(sqlite3_stricmp(destination, "stdout") == 0){ + f = stdout; + }else if(sqlite3_stricmp(destination, "stderr") == 0){ + f = stderr; + }else if(sqlite3_stricmp(destination, "logcat") == 0){ + f = NULL; /* file pointer will be NULL indicating logcat on android */ + }else{ +#if !defined(SQLCIPHER_PROFILE_USE_FOPEN) && (defined(_WIN32) && (__STDC_VERSION__ > 199901L) || defined(SQLITE_OS_WINRT)) + if(fopen_s(&f, destination, "a") != 0) return SQLITE_ERROR; +#else + if((f = fopen(destination, "a")) == 0) return SQLITE_ERROR; +#endif + } + sqlite3_trace_v2(db, SQLITE_TRACE_PROFILE, sqlcipher_profile_callback, f); + } + return SQLITE_OK; +#endif +} + +int sqlcipher_codec_fips_status(codec_ctx *ctx) { + return ctx->provider->fips_status(ctx->provider_ctx); +} + +const char* sqlcipher_codec_get_provider_version(codec_ctx *ctx) { + return ctx->provider->get_provider_version(ctx->provider_ctx); +} + +#ifndef SQLCIPHER_OMIT_LOG +/* constants from https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/misc/gettimeofday.c */ +#define FILETIME_1970 116444736000000000ull /* seconds between 1/1/1601 and 1/1/1970 */ +#define HECTONANOSEC_PER_SEC 10000000ull +void sqlcipher_log(unsigned int level, const char *message, ...) { + va_list params; + va_start(params, message); + +#ifdef CODEC_DEBUG +#ifdef __ANDROID__ + __android_log_vprint(ANDROID_LOG_DEBUG, "sqlcipher", message, params); +#else + vfprintf(stderr, message, params); + fprintf(stderr, "\n"); +#endif +#endif + + if(level > sqlcipher_log_level || (sqlcipher_log_logcat == 0 && sqlcipher_log_file == NULL)) { + /* no log target or tag not in included filters */ + goto end; + } + if(sqlcipher_log_file != NULL){ + char buffer[24]; + struct tm tt; + int ms; + time_t sec; +#ifdef _WIN32 + SYSTEMTIME st; + FILETIME ft; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + sec = (time_t) ((*((sqlite_int64*)&ft) - FILETIME_1970) / HECTONANOSEC_PER_SEC); + ms = st.wMilliseconds; + localtime_s(&tt, &sec); +#else + struct timeval tv; + gettimeofday(&tv, NULL); + sec = tv.tv_sec; + ms = tv.tv_usec/1000.0; + localtime_r(&sec, &tt); +#endif + if(strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tt)) { + fprintf((FILE*)sqlcipher_log_file, "%s.%03d: ", buffer, ms); + vfprintf((FILE*)sqlcipher_log_file, message, params); + fprintf((FILE*)sqlcipher_log_file, "\n"); + } + } +#ifdef __ANDROID__ + if(sqlcipher_log_logcat) { + __android_log_vprint(ANDROID_LOG_DEBUG, "sqlcipher", message, params); + } +#endif +end: + va_end(params); +} +#endif + +void sqlcipher_set_log_level(unsigned int level) { + sqlcipher_log_level = level; +} + +int sqlcipher_set_log(const char *destination){ +#ifdef SQLCIPHER_OMIT_LOG + return SQLITE_ERROR; +#else + /* close open trace file if it is not stdout or stderr, then + reset trace settings */ + if(sqlcipher_log_file != NULL && sqlcipher_log_file != stdout && sqlcipher_log_file != stderr) { + fclose((FILE*)sqlcipher_log_file); + } + sqlcipher_log_file = NULL; + sqlcipher_log_logcat = 0; + + if(sqlite3_stricmp(destination, "logcat") == 0){ + sqlcipher_log_logcat = 1; + } else if(sqlite3_stricmp(destination, "stdout") == 0){ + sqlcipher_log_file = stdout; + }else if(sqlite3_stricmp(destination, "stderr") == 0){ + sqlcipher_log_file = stderr; + }else if(sqlite3_stricmp(destination, "off") != 0){ +#if !defined(SQLCIPHER_PROFILE_USE_FOPEN) && (defined(_WIN32) && (__STDC_VERSION__ > 199901L) || defined(SQLITE_OS_WINRT)) + if(fopen_s(&sqlcipher_log_file, destination, "a") != 0) return SQLITE_ERROR; +#else + if((sqlcipher_log_file = fopen(destination, "a")) == 0) return SQLITE_ERROR; +#endif + } + sqlcipher_log(SQLCIPHER_LOG_INFO, "sqlcipher_set_log: set log to %s", destination); + return SQLITE_OK; +#endif +} + +#endif +/* END SQLCIPHER */ + +/************** End of crypto_impl.c *****************************************/ +/************** Begin file crypto_libtomcrypt.c ******************************/ +/* +** SQLCipher +** http://sqlcipher.net +** +** Copyright (c) 2008 - 2013, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +#ifdef SQLCIPHER_CRYPTO_LIBTOMCRYPT +/* #include "sqliteInt.h" */ +/* #include "sqlcipher.h" */ +#include + +#define FORTUNA_MAX_SZ 32 +static prng_state prng; +static volatile unsigned int ltc_init = 0; +static volatile unsigned int ltc_ref_count = 0; + +#define LTC_CIPHER "rijndael" + +static int sqlcipher_ltc_add_random(void *ctx, void *buffer, int length) { + int rc = 0; + int data_to_read = length; + int block_sz = data_to_read < FORTUNA_MAX_SZ ? data_to_read : FORTUNA_MAX_SZ; + const unsigned char * data = (const unsigned char *)buffer; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_add_random: entering SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_add_random: entered SQLCIPHER_MUTEX_PROVIDER_RAND"); + + while(data_to_read > 0){ + rc = fortuna_add_entropy(data, block_sz, &prng); + rc = rc != CRYPT_OK ? SQLITE_ERROR : SQLITE_OK; + if(rc != SQLITE_OK){ + break; + } + data_to_read -= block_sz; + data += block_sz; + block_sz = data_to_read < FORTUNA_MAX_SZ ? data_to_read : FORTUNA_MAX_SZ; + } + fortuna_ready(&prng); + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_add_random: leaving SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_add_random: left SQLCIPHER_MUTEX_PROVIDER_RAND"); + + return rc; +} + +static int sqlcipher_ltc_activate(void *ctx) { + unsigned char random_buffer[FORTUNA_MAX_SZ]; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_activate: entering SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_activate: entered SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + + sqlcipher_memset(random_buffer, 0, FORTUNA_MAX_SZ); + if(ltc_init == 0) { + if(register_prng(&fortuna_desc) < 0) return SQLITE_ERROR; + if(register_cipher(&rijndael_desc) < 0) return SQLITE_ERROR; + if(register_hash(&sha512_desc) < 0) return SQLITE_ERROR; + if(register_hash(&sha256_desc) < 0) return SQLITE_ERROR; + if(register_hash(&sha1_desc) < 0) return SQLITE_ERROR; + if(fortuna_start(&prng) != CRYPT_OK) { + return SQLITE_ERROR; + } + + ltc_init = 1; + } + ltc_ref_count++; + +#ifndef SQLCIPHER_TEST + sqlite3_randomness(FORTUNA_MAX_SZ, random_buffer); +#endif + + if(sqlcipher_ltc_add_random(ctx, random_buffer, FORTUNA_MAX_SZ) != SQLITE_OK) { + return SQLITE_ERROR; + } + sqlcipher_memset(random_buffer, 0, FORTUNA_MAX_SZ); + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_activate: leaving SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_activate: left SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + + return SQLITE_OK; +} + +static int sqlcipher_ltc_deactivate(void *ctx) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_deactivate: entering SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_deactivate: entered SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + + ltc_ref_count--; + if(ltc_ref_count == 0){ + fortuna_done(&prng); + sqlcipher_memset((void *)&prng, 0, sizeof(prng)); + } + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_deactivate: leaving SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_deactivate: left SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + + return SQLITE_OK; +} + +static const char* sqlcipher_ltc_get_provider_name(void *ctx) { + return "libtomcrypt"; +} + +static const char* sqlcipher_ltc_get_provider_version(void *ctx) { + return SCRYPT; +} + +static int sqlcipher_ltc_random(void *ctx, void *buffer, int length) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_random: entering SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_random: entered SQLCIPHER_MUTEX_PROVIDER_RAND"); + + fortuna_read(buffer, length, &prng); + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_random: leaving SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_ltc_random: left SQLCIPHER_MUTEX_PROVIDER_RAND"); + + return SQLITE_OK; +} + +static int sqlcipher_ltc_hmac(void *ctx, int algorithm, unsigned char *hmac_key, int key_sz, unsigned char *in, int in_sz, unsigned char *in2, int in2_sz, unsigned char *out) { + int rc, hash_idx; + hmac_state hmac; + unsigned long outlen; + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + hash_idx = find_hash("sha1"); + break; + case SQLCIPHER_HMAC_SHA256: + hash_idx = find_hash("sha256"); + break; + case SQLCIPHER_HMAC_SHA512: + hash_idx = find_hash("sha512"); + break; + default: + return SQLITE_ERROR; + } + + if(hash_idx < 0) return SQLITE_ERROR; + outlen = hash_descriptor[hash_idx].hashsize; + + if(in == NULL) return SQLITE_ERROR; + if((rc = hmac_init(&hmac, hash_idx, hmac_key, key_sz)) != CRYPT_OK) return SQLITE_ERROR; + if((rc = hmac_process(&hmac, in, in_sz)) != CRYPT_OK) return SQLITE_ERROR; + if(in2 != NULL && (rc = hmac_process(&hmac, in2, in2_sz)) != CRYPT_OK) return SQLITE_ERROR; + if((rc = hmac_done(&hmac, out, &outlen)) != CRYPT_OK) return SQLITE_ERROR; + return SQLITE_OK; +} + +static int sqlcipher_ltc_kdf(void *ctx, int algorithm, const unsigned char *pass, int pass_sz, unsigned char* salt, int salt_sz, int workfactor, int key_sz, unsigned char *key) { + int rc, hash_idx; + unsigned long outlen = key_sz; + + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + hash_idx = find_hash("sha1"); + break; + case SQLCIPHER_HMAC_SHA256: + hash_idx = find_hash("sha256"); + break; + case SQLCIPHER_HMAC_SHA512: + hash_idx = find_hash("sha512"); + break; + default: + return SQLITE_ERROR; + } + if(hash_idx < 0) return SQLITE_ERROR; + + if((rc = pkcs_5_alg2(pass, pass_sz, salt, salt_sz, + workfactor, hash_idx, key, &outlen)) != CRYPT_OK) { + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +static const char* sqlcipher_ltc_get_cipher(void *ctx) { + return "aes-256-cbc"; +} + +static int sqlcipher_ltc_cipher(void *ctx, int mode, unsigned char *key, int key_sz, unsigned char *iv, unsigned char *in, int in_sz, unsigned char *out) { + int rc, cipher_idx; + symmetric_CBC cbc; + + if((cipher_idx = find_cipher(LTC_CIPHER)) == -1) return SQLITE_ERROR; + if((rc = cbc_start(cipher_idx, iv, key, key_sz, 0, &cbc)) != CRYPT_OK) return SQLITE_ERROR; + rc = mode == 1 ? cbc_encrypt(in, out, in_sz, &cbc) : cbc_decrypt(in, out, in_sz, &cbc); + if(rc != CRYPT_OK) return SQLITE_ERROR; + cbc_done(&cbc); + return SQLITE_OK; +} + +static int sqlcipher_ltc_get_key_sz(void *ctx) { + int cipher_idx = find_cipher(LTC_CIPHER); + return cipher_descriptor[cipher_idx].max_key_length; +} + +static int sqlcipher_ltc_get_iv_sz(void *ctx) { + int cipher_idx = find_cipher(LTC_CIPHER); + return cipher_descriptor[cipher_idx].block_length; +} + +static int sqlcipher_ltc_get_block_sz(void *ctx) { + int cipher_idx = find_cipher(LTC_CIPHER); + return cipher_descriptor[cipher_idx].block_length; +} + +static int sqlcipher_ltc_get_hmac_sz(void *ctx, int algorithm) { + int hash_idx; + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + hash_idx = find_hash("sha1"); + break; + case SQLCIPHER_HMAC_SHA256: + hash_idx = find_hash("sha256"); + break; + case SQLCIPHER_HMAC_SHA512: + hash_idx = find_hash("sha512"); + break; + default: + return 0; + } + + if(hash_idx < 0) return 0; + + return hash_descriptor[hash_idx].hashsize; +} + +static int sqlcipher_ltc_ctx_init(void **ctx) { + sqlcipher_ltc_activate(NULL); + return SQLITE_OK; +} + +static int sqlcipher_ltc_ctx_free(void **ctx) { + sqlcipher_ltc_deactivate(&ctx); + return SQLITE_OK; +} + +static int sqlcipher_ltc_fips_status(void *ctx) { + return 0; +} + +int sqlcipher_ltc_setup(sqlcipher_provider *p) { + p->activate = sqlcipher_ltc_activate; + p->deactivate = sqlcipher_ltc_deactivate; + p->get_provider_name = sqlcipher_ltc_get_provider_name; + p->random = sqlcipher_ltc_random; + p->hmac = sqlcipher_ltc_hmac; + p->kdf = sqlcipher_ltc_kdf; + p->cipher = sqlcipher_ltc_cipher; + p->get_cipher = sqlcipher_ltc_get_cipher; + p->get_key_sz = sqlcipher_ltc_get_key_sz; + p->get_iv_sz = sqlcipher_ltc_get_iv_sz; + p->get_block_sz = sqlcipher_ltc_get_block_sz; + p->get_hmac_sz = sqlcipher_ltc_get_hmac_sz; + p->ctx_init = sqlcipher_ltc_ctx_init; + p->ctx_free = sqlcipher_ltc_ctx_free; + p->add_random = sqlcipher_ltc_add_random; + p->fips_status = sqlcipher_ltc_fips_status; + p->get_provider_version = sqlcipher_ltc_get_provider_version; + return SQLITE_OK; +} + +#endif +#endif +/* END SQLCIPHER */ + +/************** End of crypto_libtomcrypt.c **********************************/ +/************** Begin file crypto_nss.c **************************************/ +/* +** SQLCipher +** http://sqlcipher.net +** +** Copyright (c) 2008 - 2013, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +#ifdef SQLCIPHER_CRYPTO_NSS +/* #include "crypto.h" */ +/* #include "sqlcipher.h" */ +#include +#include +#include + +static NSSInitContext* nss_init_context = NULL; +static unsigned int nss_init_count = 0; + +int sqlcipher_nss_setup(sqlcipher_provider *p); + +static int sqlcipher_nss_activate(void *ctx) { + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: entering SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: entered SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + if (nss_init_context == NULL) { + nss_init_context = NSS_InitContext("", "", "", "", NULL, + NSS_INIT_READONLY | NSS_INIT_NOCERTDB | NSS_INIT_NOMODDB | + NSS_INIT_FORCEOPEN | NSS_INIT_OPTIMIZESPACE | NSS_INIT_NOROOTINIT); + } + nss_init_count++; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: leaving SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: left SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + return SQLITE_OK; +} + +static int sqlcipher_nss_deactivate(void *ctx) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: entering SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: entered SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + + nss_init_count--; + if (nss_init_count == 0 && nss_init_context != NULL) { + NSS_ShutdownContext(nss_init_context); + nss_init_context = NULL; + } + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: leaving SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_nss_activate: left SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + return SQLITE_OK; +} + +static int sqlcipher_nss_add_random(void *ctx, void *buffer, int length) { + return SQLITE_OK; +} + +/* generate a defined number of random bytes */ +static int sqlcipher_nss_random (void *ctx, void *buffer, int length) { + // PK11_GenerateRandom should be thread-safe. + return (PK11_GenerateRandom((unsigned char *)buffer, length) == SECSuccess) ? SQLITE_OK : SQLITE_ERROR; +} + +static const char* sqlcipher_nss_get_provider_name(void *ctx) { + return "nss"; +} + +static const char* sqlcipher_nss_get_provider_version(void *ctx) { + return NSS_GetVersion(); +} + +static const char* sqlcipher_nss_get_cipher(void *ctx) { + return "aes-256-cbc"; +} + +static int sqlcipher_nss_get_key_sz(void *ctx) { + return AES_256_KEY_LENGTH; +} + +static int sqlcipher_nss_get_iv_sz(void *ctx) { + return AES_BLOCK_SIZE; +} + +static int sqlcipher_nss_get_block_sz(void *ctx) { + return AES_BLOCK_SIZE; +} + +static int sqlcipher_nss_get_hmac_sz(void *ctx, int algorithm) { + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + return SHA1_LENGTH; + break; + case SQLCIPHER_HMAC_SHA256: + return SHA256_LENGTH; + break; + case SQLCIPHER_HMAC_SHA512: + return SHA512_LENGTH; + break; + default: + return 0; + } +} + +static int sqlcipher_nss_hmac(void *ctx, int algorithm, unsigned char *hmac_key, int key_sz, unsigned char *in, int in_sz, unsigned char *in2, int in2_sz, unsigned char *out) { + int rc = SQLITE_OK; + unsigned int length; + unsigned int outLen; + PK11Context* context = NULL; + PK11SlotInfo * slot = NULL; + PK11SymKey* symKey = NULL; + if(in == NULL) goto error; + CK_MECHANISM_TYPE mech; + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + mech = CKM_SHA_1_HMAC; + break; + case SQLCIPHER_HMAC_SHA256: + mech = CKM_SHA256_HMAC; + break; + case SQLCIPHER_HMAC_SHA512: + mech = CKM_SHA512_HMAC; + break; + default: + goto error; + } + length = sqlcipher_nss_get_hmac_sz(ctx, algorithm); + slot = PK11_GetInternalSlot(); + if (slot == NULL) goto error; + SECItem keyItem; + keyItem.data = hmac_key; + keyItem.len = key_sz; + symKey = PK11_ImportSymKey(slot, mech, PK11_OriginUnwrap, + CKA_SIGN, &keyItem, NULL); + if (symKey == NULL) goto error; + SECItem noParams; + noParams.data = 0; + noParams.len = 0; + context = PK11_CreateContextBySymKey(mech, CKA_SIGN, symKey, &noParams); + if (context == NULL) goto error; + if (PK11_DigestBegin(context) != SECSuccess) goto error; + if (PK11_DigestOp(context, in, in_sz) != SECSuccess) goto error; + if (in2 != NULL) { + if (PK11_DigestOp(context, in2, in2_sz) != SECSuccess) goto error; + } + if (PK11_DigestFinal(context, out, &outLen, length) != SECSuccess) goto error; + + goto cleanup; + error: + rc = SQLITE_ERROR; + cleanup: + if (context) PK11_DestroyContext(context, PR_TRUE); + if (symKey) PK11_FreeSymKey(symKey); + if (slot) PK11_FreeSlot(slot); + return rc; +} + +static int sqlcipher_nss_kdf(void *ctx, int algorithm, const unsigned char *pass, int pass_sz, unsigned char* salt, int salt_sz, int workfactor, int key_sz, unsigned char *key) { + int rc = SQLITE_OK; + PK11SlotInfo * slot = NULL; + SECAlgorithmID * algid = NULL; + PK11SymKey* symKey = NULL; + SECOidTag oidtag; + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + oidtag = SEC_OID_HMAC_SHA1; + break; + case SQLCIPHER_HMAC_SHA256: + oidtag = SEC_OID_HMAC_SHA256; + break; + case SQLCIPHER_HMAC_SHA512: + oidtag = SEC_OID_HMAC_SHA512; + break; + default: + goto error; + } + SECItem secSalt; + secSalt.data = salt; + secSalt.len = salt_sz; + // Always pass SEC_OID_HMAC_SHA1 (i.e. PBMAC1) as this parameter + // is unused for key generation. It is currently only used + // for PBKDF2 authentication or key (un)wrapping when specifying an + // encryption algorithm (PBES2). + algid = PK11_CreatePBEV2AlgorithmID(SEC_OID_PKCS5_PBKDF2, SEC_OID_HMAC_SHA1, + oidtag, key_sz, workfactor, &secSalt); + if (algid == NULL) goto error; + slot = PK11_GetInternalSlot(); + if (slot == NULL) goto error; + SECItem pwItem; + pwItem.data = (unsigned char *) pass; // PK11_PBEKeyGen doesn't modify the key. + pwItem.len = pass_sz; + symKey = PK11_PBEKeyGen(slot, algid, &pwItem, PR_FALSE, NULL); + if (symKey == NULL) goto error; + if (PK11_ExtractKeyValue(symKey) != SECSuccess) goto error; + // No need to free keyData as it is a buffer managed by symKey. + SECItem* keyData = PK11_GetKeyData(symKey); + if (keyData == NULL) goto error; + memcpy(key, keyData->data, key_sz); + + goto cleanup; + error: + rc = SQLITE_ERROR; + cleanup: + if (slot) PK11_FreeSlot(slot); + if (algid) SECOID_DestroyAlgorithmID(algid, PR_TRUE); + if (symKey) PK11_FreeSymKey(symKey); + return rc; +} + +static int sqlcipher_nss_cipher(void *ctx, int mode, unsigned char *key, int key_sz, unsigned char *iv, unsigned char *in, int in_sz, unsigned char *out) { + int rc = SQLITE_OK; + PK11SlotInfo * slot = NULL; + PK11SymKey* symKey = NULL; + unsigned int outLen; + SECItem params; + params.data = iv; + params.len = sqlcipher_nss_get_iv_sz(ctx); + slot = PK11_GetInternalSlot(); + if (slot == NULL) goto error; + SECItem keyItem; + keyItem.data = key; + keyItem.len = key_sz; + symKey = PK11_ImportSymKey(slot, CKM_AES_CBC, PK11_OriginUnwrap, + CKA_ENCRYPT, &keyItem, NULL); + if (symKey == NULL) goto error; + SECStatus rv; + if (mode == CIPHER_ENCRYPT) { + rv = PK11_Encrypt(symKey, CKM_AES_CBC, ¶ms, out, &outLen, + in_sz + 16, in, in_sz); + } else { + rv = PK11_Decrypt(symKey, CKM_AES_CBC, ¶ms, out, &outLen, + in_sz + 16, in, in_sz); + } + if (rv != SECSuccess) goto error; + + goto cleanup; + error: + rc = SQLITE_ERROR; + cleanup: + if (slot) PK11_FreeSlot(slot); + if (symKey) PK11_FreeSymKey(symKey); + return rc; +} + +static int sqlcipher_nss_ctx_init(void **ctx) { + sqlcipher_nss_activate(NULL); + return SQLITE_OK; +} + +static int sqlcipher_nss_ctx_free(void **ctx) { + sqlcipher_nss_deactivate(NULL); + return SQLITE_OK; +} + +static int sqlcipher_nss_fips_status(void *ctx) { + return 0; +} + +int sqlcipher_nss_setup(sqlcipher_provider *p) { + p->activate = sqlcipher_nss_activate; + p->deactivate = sqlcipher_nss_deactivate; + p->random = sqlcipher_nss_random; + p->get_provider_name = sqlcipher_nss_get_provider_name; + p->hmac = sqlcipher_nss_hmac; + p->kdf = sqlcipher_nss_kdf; + p->cipher = sqlcipher_nss_cipher; + p->get_cipher = sqlcipher_nss_get_cipher; + p->get_key_sz = sqlcipher_nss_get_key_sz; + p->get_iv_sz = sqlcipher_nss_get_iv_sz; + p->get_block_sz = sqlcipher_nss_get_block_sz; + p->get_hmac_sz = sqlcipher_nss_get_hmac_sz; + p->ctx_init = sqlcipher_nss_ctx_init; + p->ctx_free = sqlcipher_nss_ctx_free; + p->add_random = sqlcipher_nss_add_random; + p->fips_status = sqlcipher_nss_fips_status; + p->get_provider_version = sqlcipher_nss_get_provider_version; + return SQLITE_OK; +} + +#endif +#endif +/* END SQLCIPHER */ + +/************** End of crypto_nss.c ******************************************/ +/************** Begin file crypto_openssl.c **********************************/ +/* +** SQLCipher +** http://sqlcipher.net +** +** Copyright (c) 2008 - 2013, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +#ifdef SQLCIPHER_CRYPTO_OPENSSL +/* #include "sqliteInt.h" */ +/* #include "crypto.h" */ +/* #include "sqlcipher.h" */ +#include +#include +#include +#include +#include +#include + +static unsigned int openssl_init_count = 0; + +static void sqlcipher_openssl_log_errors() { + unsigned long err = 0; + while((err = ERR_get_error()) != 0) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_log_errors: ERR_get_error() returned %lx: %s", err, ERR_error_string(err, NULL)); + } +} + +#if (defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x10100000L) || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L) +static HMAC_CTX *HMAC_CTX_new(void) +{ + HMAC_CTX *ctx = OPENSSL_malloc(sizeof(*ctx)); + if (ctx != NULL) { + HMAC_CTX_init(ctx); + } + return ctx; +} + +/* Per 1.1.0 (https://wiki.openssl.org/index.php/1.1_API_Changes) + HMAC_CTX_free should call HMAC_CTX_cleanup, then EVP_MD_CTX_Cleanup. + HMAC_CTX_cleanup internally calls EVP_MD_CTX_cleanup so these + calls are not needed. */ +static void HMAC_CTX_free(HMAC_CTX *ctx) +{ + if (ctx != NULL) { + HMAC_CTX_cleanup(ctx); + OPENSSL_free(ctx); + } +} +#endif + +static int sqlcipher_openssl_add_random(void *ctx, void *buffer, int length) { +#ifndef SQLCIPHER_OPENSSL_NO_MUTEX_RAND + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_add_random: entering SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_add_random: entered SQLCIPHER_MUTEX_PROVIDER_RAND"); +#endif + RAND_add(buffer, length, 0); +#ifndef SQLCIPHER_OPENSSL_NO_MUTEX_RAND + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_add_random: leaving SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_add_random: left SQLCIPHER_MUTEX_PROVIDER_RAND"); +#endif + return SQLITE_OK; +} + +#define OPENSSL_CIPHER EVP_aes_256_cbc() + +/* activate and initialize sqlcipher. Most importantly, this will automatically + intialize OpenSSL's EVP system if it hasn't already be externally. Note that + this function may be called multiple times as new codecs are intiialized. + Thus it performs some basic counting to ensure that only the last and final + sqlcipher_openssl_deactivate() will free the EVP structures. +*/ +static int sqlcipher_openssl_activate(void *ctx) { + /* initialize openssl and increment the internal init counter + but only if it hasn't been initalized outside of SQLCipher by this program + e.g. on startup */ + int rc = 0; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_activate: entering SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_activate: entered SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + +#if (defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x10100000L) + ERR_load_crypto_strings(); +#endif + +#ifdef SQLCIPHER_FIPS + if(!FIPS_mode()){ + if(!(rc = FIPS_mode_set(1))){ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_activate: FIPS_mode_set() returned %d", rc); + sqlcipher_openssl_log_errors(); + } + } +#endif + + openssl_init_count++; + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_activate: leaving SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_activate: left SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + return SQLITE_OK; +} + +/* deactivate SQLCipher, most imporantly decremeting the activation count and + freeing the EVP structures on the final deactivation to ensure that + OpenSSL memory is cleaned up */ +static int sqlcipher_openssl_deactivate(void *ctx) { + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_deactivate: entering SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_deactivate: entered SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + + openssl_init_count--; + + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_deactivate: leaving SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_ACTIVATE)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_deactivate: left SQLCIPHER_MUTEX_PROVIDER_ACTIVATE"); + return SQLITE_OK; +} + +static const char* sqlcipher_openssl_get_provider_name(void *ctx) { + return "openssl"; +} + +static const char* sqlcipher_openssl_get_provider_version(void *ctx) { + return OPENSSL_VERSION_TEXT; +} + +/* generate a defined number of random bytes */ +static int sqlcipher_openssl_random (void *ctx, void *buffer, int length) { + int rc = 0; + /* concurrent calls to RAND_bytes can cause a crash under some openssl versions when a + naive application doesn't use CRYPTO_set_locking_callback and + CRYPTO_THREADID_set_callback to ensure openssl thread safety. + This is simple workaround to prevent this common crash + but a more proper solution is that applications setup platform-appropriate + thread saftey in openssl externally */ +#ifndef SQLCIPHER_OPENSSL_NO_MUTEX_RAND + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_random: entering SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_enter(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_random: entered SQLCIPHER_MUTEX_PROVIDER_RAND"); +#endif + rc = RAND_bytes((unsigned char *)buffer, length); +#ifndef SQLCIPHER_OPENSSL_NO_MUTEX_RAND + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_random: leaving SQLCIPHER_MUTEX_PROVIDER_RAND"); + sqlite3_mutex_leave(sqlcipher_mutex(SQLCIPHER_MUTEX_PROVIDER_RAND)); + sqlcipher_log(SQLCIPHER_LOG_TRACE, "sqlcipher_openssl_random: left SQLCIPHER_MUTEX_PROVIDER_RAND"); +#endif + if(!rc) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_random: RAND_bytes() returned %d", rc); + sqlcipher_openssl_log_errors(); + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +static int sqlcipher_openssl_hmac(void *ctx, int algorithm, unsigned char *hmac_key, int key_sz, unsigned char *in, int in_sz, unsigned char *in2, int in2_sz, unsigned char *out) { + int rc = 0; + +#if (defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x30000000L) + unsigned int outlen; + HMAC_CTX* hctx = NULL; + + if(in == NULL) goto error; + + hctx = HMAC_CTX_new(); + if(hctx == NULL) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_CTX_new() failed"); + sqlcipher_openssl_log_errors(); + goto error; + } + + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + if(!(rc = HMAC_Init_ex(hctx, hmac_key, key_sz, EVP_sha1(), NULL))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_Init_ex() with key size %d and EVP_sha1() returned %d", key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + case SQLCIPHER_HMAC_SHA256: + if(!(rc = HMAC_Init_ex(hctx, hmac_key, key_sz, EVP_sha256(), NULL))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_Init_ex() with key size %d and EVP_sha256() returned %d", key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + case SQLCIPHER_HMAC_SHA512: + if(!(rc = HMAC_Init_ex(hctx, hmac_key, key_sz, EVP_sha512(), NULL))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_Init_ex() with key size %d and EVP_sha512() returned %d", key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + default: + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: invalid algorithm %d", algorithm); + goto error; + } + + if(!(rc = HMAC_Update(hctx, in, in_sz))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_Update() on 1st input buffer of %d bytes using algorithm %d returned %d", in_sz, algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(in2 != NULL) { + if(!(rc = HMAC_Update(hctx, in2, in2_sz))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_Update() on 2nd input buffer of %d bytes using algorithm %d returned %d", in2_sz, algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + } + + if(!(rc = HMAC_Final(hctx, out, &outlen))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: HMAC_Final() using algorithm %d returned %d", algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + rc = SQLITE_OK; + goto cleanup; + +error: + rc = SQLITE_ERROR; + +cleanup: + if(hctx) HMAC_CTX_free(hctx); + +#else + size_t outlen; + EVP_MAC *mac = NULL; + EVP_MAC_CTX *hctx = NULL; + OSSL_PARAM sha1[] = { { "digest", OSSL_PARAM_UTF8_STRING, "sha1", 4, 0 }, OSSL_PARAM_END }; + OSSL_PARAM sha256[] = { { "digest", OSSL_PARAM_UTF8_STRING, "sha256", 6, 0 }, OSSL_PARAM_END }; + OSSL_PARAM sha512[] = { { "digest", OSSL_PARAM_UTF8_STRING, "sha512", 6, 0 }, OSSL_PARAM_END }; + + if(in == NULL) goto error; + + mac = EVP_MAC_fetch(NULL, "HMAC", NULL); + if(mac == NULL) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_fetch for HMAC failed"); + sqlcipher_openssl_log_errors(); + goto error; + } + + hctx = EVP_MAC_CTX_new(mac); + if(hctx == NULL) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_CTX_new() failed"); + sqlcipher_openssl_log_errors(); + goto error; + } + + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + if(!(rc = EVP_MAC_init(hctx, hmac_key, key_sz, sha1))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_init() with key size %d and sha1 returned %d", key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + case SQLCIPHER_HMAC_SHA256: + if(!(rc = EVP_MAC_init(hctx, hmac_key, key_sz, sha256))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_init() with key size %d and sha256 returned %d", key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + case SQLCIPHER_HMAC_SHA512: + if(!(rc = EVP_MAC_init(hctx, hmac_key, key_sz, sha512))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_init() with key size %d and sha512 returned %d", key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + default: + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: invalid algorithm %d", algorithm); + goto error; + } + + if(!(rc = EVP_MAC_update(hctx, in, in_sz))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_update() on 1st input buffer of %d bytes using algorithm %d returned %d", in_sz, algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(in2 != NULL) { + if(!(rc = EVP_MAC_update(hctx, in2, in2_sz))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: EVP_MAC_update() on 2nd input buffer of %d bytes using algorithm %d returned %d", in_sz, algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + } + + if(!(rc = EVP_MAC_final(hctx, NULL, &outlen, 0))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: 1st EVP_MAC_final() for output length calculation using algorithm %d returned %d", algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(!(rc = EVP_MAC_final(hctx, out, &outlen, outlen))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_hmac: 2nd EVP_MAC_final() using algorithm %d returned %d", algorithm, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + rc = SQLITE_OK; + goto cleanup; + +error: + rc = SQLITE_ERROR; + +cleanup: + if(hctx) EVP_MAC_CTX_free(hctx); + if(mac) EVP_MAC_free(mac); + +#endif + + return rc; +} + +static int sqlcipher_openssl_kdf(void *ctx, int algorithm, const unsigned char *pass, int pass_sz, unsigned char* salt, int salt_sz, int workfactor, int key_sz, unsigned char *key) { + int rc = 0; + + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + if(!(rc = PKCS5_PBKDF2_HMAC((const char *)pass, pass_sz, salt, salt_sz, workfactor, EVP_sha1(), key_sz, key))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_kdf: PKCS5_PBKDF2_HMAC() for EVP_sha1() workfactor %d and key size %d returned %d", workfactor, key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + case SQLCIPHER_HMAC_SHA256: + if(!(rc = PKCS5_PBKDF2_HMAC((const char *)pass, pass_sz, salt, salt_sz, workfactor, EVP_sha256(), key_sz, key))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_kdf: PKCS5_PBKDF2_HMAC() for EVP_sha256() workfactor %d and key size %d returned %d", workfactor, key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + case SQLCIPHER_HMAC_SHA512: + if(!(rc = PKCS5_PBKDF2_HMAC((const char *)pass, pass_sz, salt, salt_sz, workfactor, EVP_sha512(), key_sz, key))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_kdf: PKCS5_PBKDF2_HMAC() for EVP_sha512() workfactor %d and key size %d returned %d", workfactor, key_sz, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + break; + default: + return SQLITE_ERROR; + } + + rc = SQLITE_OK; + goto cleanup; +error: + rc = SQLITE_ERROR; +cleanup: + return rc; +} + +static int sqlcipher_openssl_cipher(void *ctx, int mode, unsigned char *key, int key_sz, unsigned char *iv, unsigned char *in, int in_sz, unsigned char *out) { + int tmp_csz, csz, rc = 0; + EVP_CIPHER_CTX* ectx = EVP_CIPHER_CTX_new(); + if(ectx == NULL) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_cipher: EVP_CIPHER_CTX_new failed"); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(!(rc = EVP_CipherInit_ex(ectx, OPENSSL_CIPHER, NULL, NULL, NULL, mode))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_cipher: EVP_CipherInit_ex for mode %d returned %d", mode, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(!(rc = EVP_CIPHER_CTX_set_padding(ectx, 0))) { /* no padding */ + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_cipher: EVP_CIPHER_CTX_set_padding 0 returned %d", rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(!(rc = EVP_CipherInit_ex(ectx, NULL, NULL, key, iv, mode))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_cipher: EVP_CipherInit_ex for mode %d returned %d", mode, rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + if(!(rc = EVP_CipherUpdate(ectx, out, &tmp_csz, in, in_sz))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_cipher: EVP_CipherUpdate returned %d", rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + csz = tmp_csz; + out += tmp_csz; + if(!(rc = EVP_CipherFinal_ex(ectx, out, &tmp_csz))) { + sqlcipher_log(SQLCIPHER_LOG_ERROR, "sqlcipher_openssl_cipher: EVP_CipherFinal_ex returned %d", rc); + sqlcipher_openssl_log_errors(); + goto error; + } + + csz += tmp_csz; + assert(in_sz == csz); + + rc = SQLITE_OK; + goto cleanup; +error: + rc = SQLITE_ERROR; +cleanup: + if(ectx) EVP_CIPHER_CTX_free(ectx); + return rc; +} + +static const char* sqlcipher_openssl_get_cipher(void *ctx) { + return OBJ_nid2sn(EVP_CIPHER_nid(OPENSSL_CIPHER)); +} + +static int sqlcipher_openssl_get_key_sz(void *ctx) { + return EVP_CIPHER_key_length(OPENSSL_CIPHER); +} + +static int sqlcipher_openssl_get_iv_sz(void *ctx) { + return EVP_CIPHER_iv_length(OPENSSL_CIPHER); +} + +static int sqlcipher_openssl_get_block_sz(void *ctx) { + return EVP_CIPHER_block_size(OPENSSL_CIPHER); +} + +static int sqlcipher_openssl_get_hmac_sz(void *ctx, int algorithm) { + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + return EVP_MD_size(EVP_sha1()); + break; + case SQLCIPHER_HMAC_SHA256: + return EVP_MD_size(EVP_sha256()); + break; + case SQLCIPHER_HMAC_SHA512: + return EVP_MD_size(EVP_sha512()); + break; + default: + return 0; + } +} + +static int sqlcipher_openssl_ctx_init(void **ctx) { + return sqlcipher_openssl_activate(*ctx); +} + +static int sqlcipher_openssl_ctx_free(void **ctx) { + return sqlcipher_openssl_deactivate(NULL); +} + +static int sqlcipher_openssl_fips_status(void *ctx) { +#ifdef SQLCIPHER_FIPS + return FIPS_mode(); +#else + return 0; +#endif +} + +int sqlcipher_openssl_setup(sqlcipher_provider *p) { + p->activate = sqlcipher_openssl_activate; + p->deactivate = sqlcipher_openssl_deactivate; + p->get_provider_name = sqlcipher_openssl_get_provider_name; + p->random = sqlcipher_openssl_random; + p->hmac = sqlcipher_openssl_hmac; + p->kdf = sqlcipher_openssl_kdf; + p->cipher = sqlcipher_openssl_cipher; + p->get_cipher = sqlcipher_openssl_get_cipher; + p->get_key_sz = sqlcipher_openssl_get_key_sz; + p->get_iv_sz = sqlcipher_openssl_get_iv_sz; + p->get_block_sz = sqlcipher_openssl_get_block_sz; + p->get_hmac_sz = sqlcipher_openssl_get_hmac_sz; + p->ctx_init = sqlcipher_openssl_ctx_init; + p->ctx_free = sqlcipher_openssl_ctx_free; + p->add_random = sqlcipher_openssl_add_random; + p->fips_status = sqlcipher_openssl_fips_status; + p->get_provider_version = sqlcipher_openssl_get_provider_version; + return SQLITE_OK; +} + +#endif +#endif +/* END SQLCIPHER */ + +/************** End of crypto_openssl.c **************************************/ +/************** Begin file crypto_cc.c ***************************************/ +/* +** SQLCipher +** http://sqlcipher.net +** +** Copyright (c) 2008 - 2013, ZETETIC LLC +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the ZETETIC LLC nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY +** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL ZETETIC LLC BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +*/ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC +#ifdef SQLCIPHER_CRYPTO_CC +/* #include "crypto.h" */ +/* #include "sqlcipher.h" */ +#include +#include +#include + +int sqlcipher_cc_setup(sqlcipher_provider *p); + +static int sqlcipher_cc_add_random(void *ctx, void *buffer, int length) { + return SQLITE_OK; +} + +/* generate a defined number of random bytes */ +static int sqlcipher_cc_random (void *ctx, void *buffer, int length) { + return (SecRandomCopyBytes(kSecRandomDefault, length, (uint8_t *)buffer) == kCCSuccess) ? SQLITE_OK : SQLITE_ERROR; +} + +static const char* sqlcipher_cc_get_provider_name(void *ctx) { + return "commoncrypto"; +} + +static const char* sqlcipher_cc_get_provider_version(void *ctx) { +#if TARGET_OS_MAC + CFTypeRef version; + CFBundleRef bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.security")); + if(bundle == NULL) { + return "unknown"; + } + version = CFBundleGetValueForInfoDictionaryKey(bundle, CFSTR("CFBundleShortVersionString")); + return CFStringGetCStringPtr(version, kCFStringEncodingUTF8); +#else + return "unknown"; +#endif +} + +static int sqlcipher_cc_hmac(void *ctx, int algorithm, unsigned char *hmac_key, int key_sz, unsigned char *in, int in_sz, unsigned char *in2, int in2_sz, unsigned char *out) { + CCHmacContext hmac_context; + if(in == NULL) return SQLITE_ERROR; + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + CCHmacInit(&hmac_context, kCCHmacAlgSHA1, hmac_key, key_sz); + break; + case SQLCIPHER_HMAC_SHA256: + CCHmacInit(&hmac_context, kCCHmacAlgSHA256, hmac_key, key_sz); + break; + case SQLCIPHER_HMAC_SHA512: + CCHmacInit(&hmac_context, kCCHmacAlgSHA512, hmac_key, key_sz); + break; + default: + return SQLITE_ERROR; + } + CCHmacUpdate(&hmac_context, in, in_sz); + if(in2 != NULL) CCHmacUpdate(&hmac_context, in2, in2_sz); + CCHmacFinal(&hmac_context, out); + return SQLITE_OK; +} + +static int sqlcipher_cc_kdf(void *ctx, int algorithm, const unsigned char *pass, int pass_sz, unsigned char* salt, int salt_sz, int workfactor, int key_sz, unsigned char *key) { + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + if(CCKeyDerivationPBKDF(kCCPBKDF2, (const char *)pass, pass_sz, salt, salt_sz, kCCPRFHmacAlgSHA1, workfactor, key, key_sz) != kCCSuccess) return SQLITE_ERROR; + break; + case SQLCIPHER_HMAC_SHA256: + if(CCKeyDerivationPBKDF(kCCPBKDF2, (const char *)pass, pass_sz, salt, salt_sz, kCCPRFHmacAlgSHA256, workfactor, key, key_sz) != kCCSuccess) return SQLITE_ERROR; + break; + case SQLCIPHER_HMAC_SHA512: + if(CCKeyDerivationPBKDF(kCCPBKDF2, (const char *)pass, pass_sz, salt, salt_sz, kCCPRFHmacAlgSHA512, workfactor, key, key_sz) != kCCSuccess) return SQLITE_ERROR; + break; + default: + return SQLITE_ERROR; + } + return SQLITE_OK; +} + +static int sqlcipher_cc_cipher(void *ctx, int mode, unsigned char *key, int key_sz, unsigned char *iv, unsigned char *in, int in_sz, unsigned char *out) { + CCCryptorRef cryptor; + size_t tmp_csz, csz; + CCOperation op = mode == CIPHER_ENCRYPT ? kCCEncrypt : kCCDecrypt; + + if(CCCryptorCreate(op, kCCAlgorithmAES128, 0, key, kCCKeySizeAES256, iv, &cryptor) != kCCSuccess) return SQLITE_ERROR; + if(CCCryptorUpdate(cryptor, in, in_sz, out, in_sz, &tmp_csz) != kCCSuccess) return SQLITE_ERROR; + csz = tmp_csz; + out += tmp_csz; + if(CCCryptorFinal(cryptor, out, in_sz - csz, &tmp_csz) != kCCSuccess) return SQLITE_ERROR; + csz += tmp_csz; + if(CCCryptorRelease(cryptor) != kCCSuccess) return SQLITE_ERROR; + assert(in_sz == csz); + + return SQLITE_OK; +} + +static const char* sqlcipher_cc_get_cipher(void *ctx) { + return "aes-256-cbc"; +} + +static int sqlcipher_cc_get_key_sz(void *ctx) { + return kCCKeySizeAES256; +} + +static int sqlcipher_cc_get_iv_sz(void *ctx) { + return kCCBlockSizeAES128; +} + +static int sqlcipher_cc_get_block_sz(void *ctx) { + return kCCBlockSizeAES128; +} + +static int sqlcipher_cc_get_hmac_sz(void *ctx, int algorithm) { + switch(algorithm) { + case SQLCIPHER_HMAC_SHA1: + return CC_SHA1_DIGEST_LENGTH; + break; + case SQLCIPHER_HMAC_SHA256: + return CC_SHA256_DIGEST_LENGTH; + break; + case SQLCIPHER_HMAC_SHA512: + return CC_SHA512_DIGEST_LENGTH; + break; + default: + return 0; + } +} + +static int sqlcipher_cc_ctx_init(void **ctx) { + return SQLITE_OK; +} + +static int sqlcipher_cc_ctx_free(void **ctx) { + return SQLITE_OK; +} + +static int sqlcipher_cc_fips_status(void *ctx) { + return 0; +} + +int sqlcipher_cc_setup(sqlcipher_provider *p) { + p->random = sqlcipher_cc_random; + p->get_provider_name = sqlcipher_cc_get_provider_name; + p->hmac = sqlcipher_cc_hmac; + p->kdf = sqlcipher_cc_kdf; + p->cipher = sqlcipher_cc_cipher; + p->get_cipher = sqlcipher_cc_get_cipher; + p->get_key_sz = sqlcipher_cc_get_key_sz; + p->get_iv_sz = sqlcipher_cc_get_iv_sz; + p->get_block_sz = sqlcipher_cc_get_block_sz; + p->get_hmac_sz = sqlcipher_cc_get_hmac_sz; + p->ctx_init = sqlcipher_cc_ctx_init; + p->ctx_free = sqlcipher_cc_ctx_free; + p->add_random = sqlcipher_cc_add_random; + p->fips_status = sqlcipher_cc_fips_status; + p->get_provider_version = sqlcipher_cc_get_provider_version; + return SQLITE_OK; +} + +#endif +#endif +/* END SQLCIPHER */ + +/************** End of crypto_cc.c *******************************************/ +/************** Begin file walker.c ******************************************/ +/* +** 2008 August 16 +** +** 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 contains routines used for walking the parser tree for +** an SQL statement. +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ + + +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList, int bOneOnly){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + int rc; + rc = sqlite3WalkExprList(pWalker, pWin->pOrderBy); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExprList(pWalker, pWin->pPartition); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pFilter); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pStart); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pEnd); + if( rc ) return WRC_Abort; + if( bOneOnly ) break; + } + return WRC_Continue; +} +#endif + +/* +** Walk an expression tree. Invoke the callback once for each node +** of the expression, while descending. (In other words, the callback +** is invoked before visiting children.) +** +** The return value from the callback should be one of the WRC_* +** constants to specify how to proceed with the walk. +** +** WRC_Continue Continue descending down the tree. +** +** WRC_Prune Do not descend into child nodes, but allow +** the walk to continue with sibling nodes. +** +** WRC_Abort Do no more callbacks. Unwind the stack and +** return from the top-level walk call. +** +** The return value from this routine is WRC_Abort to abandon the tree walk +** and WRC_Continue to continue. +*/ +static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ + int rc; + testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); + testcase( ExprHasProperty(pExpr, EP_Reduced) ); + while(1){ + rc = pWalker->xExprCallback(pWalker, pExpr); + if( rc ) return rc & WRC_Abort; + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + assert( pExpr->x.pList==0 || pExpr->pRight==0 ); + if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; + if( pExpr->pRight ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); + pExpr = pExpr->pRight; + continue; + }else if( ExprUseXSelect(pExpr) ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); + if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; + }else{ + if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( walkWindowList(pWalker, pExpr->y.pWin, 1) ) return WRC_Abort; + } +#endif + } + } + break; + } + return WRC_Continue; +} +SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ + return pExpr ? walkExpr(pWalker,pExpr) : WRC_Continue; +} + +/* +** Call sqlite3WalkExpr() for every expression in list p or until +** an abort request is seen. +*/ +SQLITE_PRIVATE int sqlite3WalkExprList(Walker *pWalker, ExprList *p){ + int i; + struct ExprList_item *pItem; + if( p ){ + for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){ + if( sqlite3WalkExpr(pWalker, pItem->pExpr) ) return WRC_Abort; + } + } + return WRC_Continue; +} + +/* +** This is a no-op callback for Walker->xSelectCallback2. If this +** callback is set, then the Select->pWinDefn list is traversed. +*/ +SQLITE_PRIVATE void sqlite3WalkWinDefnDummyCallback(Walker *pWalker, Select *p){ + UNUSED_PARAMETER(pWalker); + UNUSED_PARAMETER(p); + /* No-op */ +} + +/* +** Walk all expressions associated with SELECT statement p. Do +** not invoke the SELECT callback on p, but do (of course) invoke +** any expr callbacks and SELECT callbacks that come from subqueries. +** Return WRC_Abort or WRC_Continue. +*/ +SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ + if( sqlite3WalkExprList(pWalker, p->pEList) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pWhere) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, p->pGroupBy) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) + if( p->pWinDefn ){ + Parse *pParse; + if( pWalker->xSelectCallback2==sqlite3WalkWinDefnDummyCallback + || ((pParse = pWalker->pParse)!=0 && IN_RENAME_OBJECT) +#ifndef SQLITE_OMIT_CTE + || pWalker->xSelectCallback2==sqlite3SelectPopWith +#endif + ){ + /* The following may return WRC_Abort if there are unresolvable + ** symbols (e.g. a table that does not exist) in a window definition. */ + int rc = walkWindowList(pWalker, p->pWinDefn, 0); + return rc; + } + } +#endif + return WRC_Continue; +} + +/* +** Walk the parse trees associated with all subqueries in the +** FROM clause of SELECT statement p. Do not invoke the select +** callback on p, but do invoke it on each FROM clause subquery +** and on any subqueries further down in the tree. Return +** WRC_Abort or WRC_Continue; +*/ +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ + SrcList *pSrc; + int i; + SrcItem *pItem; + + pSrc = p->pSrc; + if( ALWAYS(pSrc) ){ + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){ + return WRC_Abort; + } + if( pItem->fg.isTabFunc + && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + } + return WRC_Continue; +} + +/* +** Call sqlite3WalkExpr() for every expression in Select statement p. +** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and +** on the compound select chain, p->pPrior. +** +** If it is not NULL, the xSelectCallback() callback is invoked before +** the walk of the expressions and FROM clause. The xSelectCallback2() +** method is invoked following the walk of the expressions and FROM clause, +** but only if both xSelectCallback and xSelectCallback2 are both non-NULL +** and if the expressions and FROM clause both return WRC_Continue; +** +** Return WRC_Continue under normal conditions. Return WRC_Abort if +** there is an abort request. +** +** If the Walker does not have an xSelectCallback() then this routine +** is a no-op returning WRC_Continue. +*/ +SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ + int rc; + if( p==0 ) return WRC_Continue; + if( pWalker->xSelectCallback==0 ) return WRC_Continue; + do{ + rc = pWalker->xSelectCallback(pWalker, p); + if( rc ) return rc & WRC_Abort; + if( sqlite3WalkSelectExpr(pWalker, p) + || sqlite3WalkSelectFrom(pWalker, p) + ){ + return WRC_Abort; + } + if( pWalker->xSelectCallback2 ){ + pWalker->xSelectCallback2(pWalker, p); + } + p = p->pPrior; + }while( p!=0 ); + return WRC_Continue; +} + +/* Increase the walkerDepth when entering a subquery, and +** descrease when leaving the subquery. +*/ +SQLITE_PRIVATE int sqlite3WalkerDepthIncrease(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth++; + return WRC_Continue; +} +SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth--; +} + + +/* +** No-op routine for the parse-tree walker. +** +** When this routine is the Walker.xExprCallback then expression trees +** are walked without any actions being taken at each node. Presumably, +** when this routine is used for Walker.xExprCallback then +** Walker.xSelectCallback is set to do something useful for every +** subquery in the parser tree. +*/ +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +/* +** No-op routine for the parse-tree walker for SELECT statements. +** subquery in the parser tree. +*/ +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +/************** End of walker.c **********************************************/ +/************** Begin file resolve.c *****************************************/ +/* +** 2008 August 18 +** +** 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 contains routines used for walking the parser tree and +** resolve all identifiers by associating them with a particular +** table and column. +*/ +/* #include "sqliteInt.h" */ + +/* +** Magic table number to mean the EXCLUDED table in an UPSERT statement. +*/ +#define EXCLUDED_TABLE_NUMBER 2 + +/* +** Walk the expression tree pExpr and increase the aggregate function +** depth (the Expr.op2 field) by N on every TK_AGG_FUNCTION node. +** This needs to occur when copying a TK_AGG_FUNCTION node from an +** outer query into an inner subquery. +** +** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..) +** is a helper function - a callback for the tree walker. +** +** See also the sqlite3WindowExtraAggFuncDepth() routine in window.c +*/ +static int incrAggDepth(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.n; + return WRC_Continue; +} +static void incrAggFunctionDepth(Expr *pExpr, int N){ + if( N>0 ){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = incrAggDepth; + w.u.n = N; + sqlite3WalkExpr(&w, pExpr); + } +} + +/* +** Turn the pExpr expression into an alias for the iCol-th column of the +** result set in pEList. +** +** If the reference is followed by a COLLATE operator, then make sure +** the COLLATE operator is preserved. For example: +** +** SELECT a+b, c+d FROM t1 ORDER BY 1 COLLATE nocase; +** +** Should be transformed into: +** +** SELECT a+b, c+d FROM t1 ORDER BY (a+b) COLLATE nocase; +** +** The nSubquery parameter specifies how many levels of subquery the +** alias is removed from the original expression. The usual value is +** zero but it might be more if the alias is contained within a subquery +** of the original expression. The Expr.op2 field of TK_AGG_FUNCTION +** structures must be increased by the nSubquery amount. +*/ +static void resolveAlias( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* A result set */ + int iCol, /* A column in the result set. 0..pEList->nExpr-1 */ + Expr *pExpr, /* Transform this into an alias to the result set */ + int nSubquery /* Number of subqueries that the label is moving */ +){ + Expr *pOrig; /* The iCol-th column of the result set */ + Expr *pDup; /* Copy of pOrig */ + sqlite3 *db; /* The database connection */ + + assert( iCol>=0 && iColnExpr ); + pOrig = pEList->a[iCol].pExpr; + assert( pOrig!=0 ); + db = pParse->db; + pDup = sqlite3ExprDup(db, pOrig, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDup); + pDup = 0; + }else{ + Expr temp; + incrAggFunctionDepth(pDup, nSubquery); + if( pExpr->op==TK_COLLATE ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); + } + memcpy(&temp, pDup, sizeof(Expr)); + memcpy(pDup, pExpr, sizeof(Expr)); + memcpy(pExpr, &temp, sizeof(Expr)); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( ALWAYS(pExpr->y.pWin!=0) ){ + pExpr->y.pWin->pOwner = pExpr; + } + } + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprDelete, + pDup); + } +} + +/* +** Subqueries stores the original database, table and column names for their +** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". +** Check to see if the zSpan given to this routine matches the zDb, zTab, +** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will +** match anything. +*/ +SQLITE_PRIVATE int sqlite3MatchEName( + const struct ExprList_item *pItem, + const char *zCol, + const char *zTab, + const char *zDb +){ + int n; + const char *zSpan; + if( pItem->fg.eEName!=ENAME_TAB ) return 0; + zSpan = pItem->zEName; + for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} + if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ + return 0; + } + zSpan += n+1; + for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} + if( zTab && (sqlite3StrNICmp(zSpan, zTab, n)!=0 || zTab[n]!=0) ){ + return 0; + } + zSpan += n+1; + if( zCol && sqlite3StrICmp(zSpan, zCol)!=0 ){ + return 0; + } + return 1; +} + +/* +** Return TRUE if the double-quoted string mis-feature should be supported. +*/ +static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ + if( db->init.busy ) return 1; /* Always support for legacy schemas */ + if( pTopNC->ncFlags & NC_IsDDL ){ + /* Currently parsing a DDL statement */ + if( sqlite3WritableSchema(db) && (db->flags & SQLITE_DqsDML)!=0 ){ + return 1; + } + return (db->flags & SQLITE_DqsDDL)!=0; + }else{ + /* Currently parsing a DML statement */ + return (db->flags & SQLITE_DqsDML)!=0; + } +} + +/* +** The argument is guaranteed to be a non-NULL Expr node of type TK_COLUMN. +** return the appropriate colUsed mask. +*/ +SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ + int n; + Table *pExTab; + + n = pExpr->iColumn; + assert( ExprUseYTab(pExpr) ); + pExTab = pExpr->y.pTab; + assert( pExTab!=0 ); + if( (pExTab->tabFlags & TF_HasGenerated)!=0 + && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pExTab->nCol==BMS-1 ); + testcase( pExTab->nCol==BMS ); + return pExTab->nCol>=BMS ? ALLBITS : MASKBIT(pExTab->nCol)-1; + }else{ + testcase( n==BMS-1 ); + testcase( n==BMS ); + if( n>=BMS ) n = BMS-1; + return ((Bitmask)1)<db, TK_COLUMN, 0, 0); + if( pNew ){ + pNew->iTable = pMatch->iCursor; + pNew->iColumn = iColumn; + pNew->y.pTab = pMatch->pTab; + assert( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ); + ExprSetProperty(pNew, EP_CanBeNull); + *ppList = sqlite3ExprListAppend(pParse, *ppList, pNew); + } +} + +/* +** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up +** that name in the set of source tables in pSrcList and make the pExpr +** expression node refer back to that source column. The following changes +** are made to pExpr: +** +** pExpr->iDb Set the index in db->aDb[] of the database X +** (even if X is implied). +** pExpr->iTable Set to the cursor number for the table obtained +** from pSrcList. +** pExpr->y.pTab Points to the Table structure of X.Y (even if +** X and/or Y are implied.) +** pExpr->iColumn Set to the column number within the table. +** pExpr->op Set to TK_COLUMN. +** pExpr->pLeft Any expression this points to is deleted +** pExpr->pRight Any expression this points to is deleted. +** +** The zDb variable is the name of the database (the "X"). This value may be +** NULL meaning that name is of the form Y.Z or Z. Any available database +** can be used. The zTable variable is the name of the table (the "Y"). This +** value can be NULL if zDb is also NULL. If zTable is NULL it +** means that the form of the name is Z and that columns from any table +** can be used. +** +** If the name cannot be resolved unambiguously, leave an error message +** in pParse and return WRC_Abort. Return WRC_Prune on success. +*/ +static int lookupName( + Parse *pParse, /* The parsing context */ + const char *zDb, /* Name of the database containing table, or NULL */ + const char *zTab, /* Name of table containing column, or NULL */ + const char *zCol, /* Name of the column. */ + NameContext *pNC, /* The name context used to resolve the name */ + Expr *pExpr /* Make this EXPR node point to the selected column */ +){ + int i, j; /* Loop counters */ + int cnt = 0; /* Number of matching column names */ + int cntTab = 0; /* Number of matching table names */ + int nSubquery = 0; /* How many levels of subquery */ + sqlite3 *db = pParse->db; /* The database connection */ + SrcItem *pItem; /* Use for looping over pSrcList items */ + SrcItem *pMatch = 0; /* The matching pSrcList item */ + NameContext *pTopNC = pNC; /* First namecontext in the list */ + Schema *pSchema = 0; /* Schema of the expression */ + int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */ + Table *pTab = 0; /* Table holding the row */ + Column *pCol; /* A column of pTab */ + ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */ + + assert( pNC ); /* the name context cannot be NULL. */ + assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ + assert( zDb==0 || zTab!=0 ); + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + + /* Initialize the node to no-match */ + pExpr->iTable = -1; + ExprSetVVAProperty(pExpr, EP_NoReduce); + + /* Translate the schema name in zDb into a pointer to the corresponding + ** schema. If not found, pSchema will remain NULL and nothing will match + ** resulting in an appropriate error message toward the end of this routine + */ + if( zDb ){ + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IsCheck ); + if( (pNC->ncFlags & (NC_PartIdx|NC_IsCheck))!=0 ){ + /* Silently ignore database qualifiers inside CHECK constraints and + ** partial indices. Do not raise errors because that might break + ** legacy and because it does not hurt anything to just ignore the + ** database name. */ + zDb = 0; + }else{ + for(i=0; inDb; i++){ + assert( db->aDb[i].zDbSName ); + if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ + pSchema = db->aDb[i].pSchema; + break; + } + } + if( i==db->nDb && sqlite3StrICmp("main", zDb)==0 ){ + /* This branch is taken when the main database has been renamed + ** using SQLITE_DBCONFIG_MAINDBNAME. */ + pSchema = db->aDb[0].pSchema; + zDb = db->aDb[0].zDbSName; + } + } + } + + /* Start at the inner-most context and move outward until a match is found */ + assert( pNC && cnt==0 ); + do{ + ExprList *pEList; + SrcList *pSrcList = pNC->pSrcList; + + if( pSrcList ){ + for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ + u8 hCol; + pTab = pItem->pTab; + assert( pTab!=0 && pTab->zName!=0 ); + assert( pTab->nCol>0 || pParse->nErr ); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + if( pItem->fg.isNestedFrom ){ + /* In this case, pItem is a subquery that has been formed from a + ** parenthesized subset of the FROM clause terms. Example: + ** .... FROM t1 LEFT JOIN (t2 RIGHT JOIN t3 USING(x)) USING(y) ... + ** \_________________________/ + ** This pItem -------------^ + */ + int hit = 0; + assert( pItem->pSelect!=0 ); + pEList = pItem->pSelect->pEList; + assert( pEList!=0 ); + assert( pEList->nExpr==pTab->nCol ); + for(j=0; jnExpr; j++){ + if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ + continue; + } + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } + } + cnt++; + cntTab = 2; + pMatch = pItem; + pExpr->iColumn = j; + pEList->a[j].fg.bUsed = 1; + hit = 1; + if( pEList->a[j].fg.bUsingTerm ) break; + } + if( hit || zTab==0 ) continue; + } + assert( zDb==0 || zTab!=0 ); + if( zTab ){ + const char *zTabName; + if( zDb ){ + if( pTab->pSchema!=pSchema ) continue; + if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; + } + zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; + assert( zTabName!=0 ); + if( sqlite3StrICmp(zTabName, zTab)!=0 ){ + continue; + } + assert( ExprUseYTab(pExpr) ); + if( IN_RENAME_OBJECT && pItem->zAlias ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); + } + } + hCol = sqlite3StrIHash(zCol); + for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ + if( pCol->hName==hCol + && sqlite3StrICmp(pCol->zCnName, zCol)==0 + ){ + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } + } + cnt++; + pMatch = pItem; + /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ + pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; + if( pItem->fg.isNestedFrom ){ + sqlite3SrcItemColumnUsed(pItem, j); + } + break; + } + } + if( 0==cnt && VisibleRowid(pTab) ){ + cntTab++; + pMatch = pItem; + } + } + if( pMatch ){ + pExpr->iTable = pMatch->iCursor; + assert( ExprUseYTab(pExpr) ); + pExpr->y.pTab = pMatch->pTab; + if( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ){ + ExprSetProperty(pExpr, EP_CanBeNull); + } + pSchema = pExpr->y.pTab->pSchema; + } + } /* if( pSrcList ) */ + +#if !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) + /* If we have not already resolved the name, then maybe + ** it is a new.* or old.* trigger argument reference. Or + ** maybe it is an excluded.* from an upsert. Or maybe it is + ** a reference in the RETURNING clause to a table being modified. + */ + if( cnt==0 && zDb==0 ){ + pTab = 0; +#ifndef SQLITE_OMIT_TRIGGER + if( pParse->pTriggerTab!=0 ){ + int op = pParse->eTriggerOp; + assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); + if( pParse->bReturning ){ + if( (pNC->ncFlags & NC_UBaseReg)!=0 + && (zTab==0 || sqlite3StrICmp(zTab,pParse->pTriggerTab->zName)==0) + ){ + pExpr->iTable = op!=TK_DELETE; + pTab = pParse->pTriggerTab; + } + }else if( op!=TK_DELETE && zTab && sqlite3StrICmp("new",zTab) == 0 ){ + pExpr->iTable = 1; + pTab = pParse->pTriggerTab; + }else if( op!=TK_INSERT && zTab && sqlite3StrICmp("old",zTab)==0 ){ + pExpr->iTable = 0; + pTab = pParse->pTriggerTab; + } + } +#endif /* SQLITE_OMIT_TRIGGER */ +#ifndef SQLITE_OMIT_UPSERT + if( (pNC->ncFlags & NC_UUpsert)!=0 && zTab!=0 ){ + Upsert *pUpsert = pNC->uNC.pUpsert; + if( pUpsert && sqlite3StrICmp("excluded",zTab)==0 ){ + pTab = pUpsert->pUpsertSrc->a[0].pTab; + pExpr->iTable = EXCLUDED_TABLE_NUMBER; + } + } +#endif /* SQLITE_OMIT_UPSERT */ + + if( pTab ){ + int iCol; + u8 hCol = sqlite3StrIHash(zCol); + pSchema = pTab->pSchema; + cntTab++; + for(iCol=0, pCol=pTab->aCol; iColnCol; iCol++, pCol++){ + if( pCol->hName==hCol + && sqlite3StrICmp(pCol->zCnName, zCol)==0 + ){ + if( iCol==pTab->iPKey ){ + iCol = -1; + } + break; + } + } + if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ + /* IMP: R-51414-32910 */ + iCol = -1; + } + if( iColnCol ){ + cnt++; + pMatch = 0; +#ifndef SQLITE_OMIT_UPSERT + if( pExpr->iTable==EXCLUDED_TABLE_NUMBER ){ + testcase( iCol==(-1) ); + assert( ExprUseYTab(pExpr) ); + if( IN_RENAME_OBJECT ){ + pExpr->iColumn = iCol; + pExpr->y.pTab = pTab; + eNewExprOp = TK_COLUMN; + }else{ + pExpr->iTable = pNC->uNC.pUpsert->regData + + sqlite3TableColumnToStorage(pTab, iCol); + eNewExprOp = TK_REGISTER; + } + }else +#endif /* SQLITE_OMIT_UPSERT */ + { + assert( ExprUseYTab(pExpr) ); + pExpr->y.pTab = pTab; + if( pParse->bReturning ){ + eNewExprOp = TK_REGISTER; + pExpr->op2 = TK_COLUMN; + pExpr->iTable = pNC->uNC.iBaseReg + (pTab->nCol+1)*pExpr->iTable + + sqlite3TableColumnToStorage(pTab, iCol) + 1; + }else{ + pExpr->iColumn = (i16)iCol; + eNewExprOp = TK_TRIGGER; +#ifndef SQLITE_OMIT_TRIGGER + if( iCol<0 ){ + pExpr->affExpr = SQLITE_AFF_INTEGER; + }else if( pExpr->iTable==0 ){ + testcase( iCol==31 ); + testcase( iCol==32 ); + pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<ncFlags & (NC_IdxExpr|NC_GenCol))==0 + && sqlite3IsRowid(zCol) + && ALWAYS(VisibleRowid(pMatch->pTab)) + ){ + cnt = 1; + pExpr->iColumn = -1; + pExpr->affExpr = SQLITE_AFF_INTEGER; + } + + /* + ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z + ** might refer to an result-set alias. This happens, for example, when + ** we are resolving names in the WHERE clause of the following command: + ** + ** SELECT a+b AS x FROM table WHERE x<10; + ** + ** In cases like this, replace pExpr with a copy of the expression that + ** forms the result set entry ("a+b" in the example) and return immediately. + ** Note that the expression in the result set should have already been + ** resolved by the time the WHERE clause is resolved. + ** + ** The ability to use an output result-set column in the WHERE, GROUP BY, + ** or HAVING clauses, or as part of a larger expression in the ORDER BY + ** clause is not standard SQL. This is a (goofy) SQLite extension, that + ** is supported for backwards compatibility only. Hence, we issue a warning + ** on sqlite3_log() whenever the capability is used. + */ + if( cnt==0 + && (pNC->ncFlags & NC_UEList)!=0 + && zTab==0 + ){ + pEList = pNC->uNC.pEList; + assert( pEList!=0 ); + for(j=0; jnExpr; j++){ + char *zAs = pEList->a[j].zEName; + if( pEList->a[j].fg.eEName==ENAME_NAME + && sqlite3_stricmp(zAs, zCol)==0 + ){ + Expr *pOrig; + assert( pExpr->pLeft==0 && pExpr->pRight==0 ); + assert( ExprUseXList(pExpr)==0 || pExpr->x.pList==0 ); + assert( ExprUseXSelect(pExpr)==0 || pExpr->x.pSelect==0 ); + pOrig = pEList->a[j].pExpr; + if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); + return WRC_Abort; + } + if( ExprHasProperty(pOrig, EP_Win) + && ((pNC->ncFlags&NC_AllowWin)==0 || pNC!=pTopNC ) + ){ + sqlite3ErrorMsg(pParse, "misuse of aliased window function %s",zAs); + return WRC_Abort; + } + if( sqlite3ExprVectorSize(pOrig)!=1 ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return WRC_Abort; + } + resolveAlias(pParse, pEList, j, pExpr, nSubquery); + cnt = 1; + pMatch = 0; + assert( zTab==0 && zDb==0 ); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr); + } + goto lookupname_end; + } + } + } + + /* Advance to the next name context. The loop will exit when either + ** we have a match (cnt>0) or when we run out of name contexts. + */ + if( cnt ) break; + pNC = pNC->pNext; + nSubquery++; + }while( pNC ); + + + /* + ** If X and Y are NULL (in other words if only the column name Z is + ** supplied) and the value of Z is enclosed in double-quotes, then + ** Z is a string literal if it doesn't match any column names. In that + ** case, we need to return right away and not make any changes to + ** pExpr. + ** + ** Because no reference was made to outer contexts, the pNC->nRef + ** fields are not changed in any context. + */ + if( cnt==0 && zTab==0 ){ + assert( pExpr->op==TK_ID ); + if( ExprHasProperty(pExpr,EP_DblQuoted) + && areDoubleQuotedStringsEnabled(db, pTopNC) + ){ + /* If a double-quoted identifier does not match any known column name, + ** then treat it as a string. + ** + ** This hack was added in the early days of SQLite in a misguided attempt + ** to be compatible with MySQL 3.x, which used double-quotes for strings. + ** I now sorely regret putting in this hack. The effect of this hack is + ** that misspelled identifier names are silently converted into strings + ** rather than causing an error, to the frustration of countless + ** programmers. To all those frustrated programmers, my apologies. + ** + ** Someday, I hope to get rid of this hack. Unfortunately there is + ** a huge amount of legacy SQL that uses it. So for now, we just + ** issue a warning. + */ + sqlite3_log(SQLITE_WARNING, + "double-quoted string literal: \"%w\"", zCol); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); +#endif + pExpr->op = TK_STRING; + memset(&pExpr->y, 0, sizeof(pExpr->y)); + return WRC_Prune; + } + if( sqlite3ExprIdToTrueFalse(pExpr) ){ + return WRC_Prune; + } + } + + /* + ** cnt==0 means there was not match. + ** cnt>1 means there were two or more matches. + ** + ** cnt==0 is always an error. cnt>1 is often an error, but might + ** be multiple matches for a NATURAL LEFT JOIN or a LEFT JOIN USING. + */ + assert( pFJMatch==0 || cnt>0 ); + assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); + if( cnt!=1 ){ + const char *zErr; + if( pFJMatch ){ + if( pFJMatch->nExpr==cnt-1 ){ + if( ExprHasProperty(pExpr,EP_Leaf) ){ + ExprClearProperty(pExpr,EP_Leaf); + }else{ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + } + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + pExpr->op = TK_FUNCTION; + pExpr->u.zToken = "coalesce"; + pExpr->x.pList = pFJMatch; + cnt = 1; + goto lookupname_end; + }else{ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + } + } + zErr = cnt==0 ? "no such column" : "ambiguous column name"; + if( zDb ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); + }else if( zTab ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); + } + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); + pParse->checkSchema = 1; + pTopNC->nNcErr++; + } + assert( pFJMatch==0 ); + + /* Remove all substructure from pExpr */ + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + ExprSetProperty(pExpr, EP_Leaf); + } + + /* If a column from a table in pSrcList is referenced, then record + ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes + ** bit 0 to be set. Column 1 sets bit 1. And so forth. Bit 63 is + ** set if the 63rd or any subsequent column is used. + ** + ** The colUsed mask is an optimization used to help determine if an + ** index is a covering index. The correct answer is still obtained + ** if the mask contains extra set bits. However, it is important to + ** avoid setting bits beyond the maximum column number of the table. + ** (See ticket [b92e5e8ec2cdbaa1]). + ** + ** If a generated column is referenced, set bits for every column + ** of the table. + */ + if( pExpr->iColumn>=0 && pMatch!=0 ){ + pMatch->colUsed |= sqlite3ExprColUsed(pExpr); + } + + pExpr->op = eNewExprOp; +lookupname_end: + if( cnt==1 ){ + assert( pNC!=0 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( pParse->db->xAuth + && (pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER) + ){ + sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); + } +#endif + /* Increment the nRef value on all name contexts from TopNC up to + ** the point where the name matched. */ + for(;;){ + assert( pTopNC!=0 ); + pTopNC->nRef++; + if( pTopNC==pNC ) break; + pTopNC = pTopNC->pNext; + } + return WRC_Prune; + } else { + return WRC_Abort; + } +} + +/* +** Allocate and return a pointer to an expression to load the column iCol +** from datasource iSrc in SrcList pSrc. +*/ +SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ + Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); + if( p ){ + SrcItem *pItem = &pSrc->a[iSrc]; + Table *pTab; + assert( ExprUseYTab(p) ); + pTab = p->y.pTab = pItem->pTab; + p->iTable = pItem->iCursor; + if( p->y.pTab->iPKey==iCol ){ + p->iColumn = -1; + }else{ + p->iColumn = (ynVar)iCol; + if( (pTab->tabFlags & TF_HasGenerated)!=0 + && (pTab->aCol[iCol].colFlags & COLFLAG_GENERATED)!=0 + ){ + testcase( pTab->nCol==63 ); + testcase( pTab->nCol==64 ); + pItem->colUsed = pTab->nCol>=64 ? ALLBITS : MASKBIT(pTab->nCol)-1; + }else{ + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } + } + } + return p; +} + +/* +** Report an error that an expression is not valid for some set of +** pNC->ncFlags values determined by validMask. +** +** static void notValid( +** Parse *pParse, // Leave error message here +** NameContext *pNC, // The name context +** const char *zMsg, // Type of error +** int validMask, // Set of contexts for which prohibited +** Expr *pExpr // Invalidate this expression on error +** ){...} +** +** As an optimization, since the conditional is almost always false +** (because errors are rare), the conditional is moved outside of the +** function call using a macro. +*/ +static void notValidImpl( + Parse *pParse, /* Leave error message here */ + NameContext *pNC, /* The name context */ + const char *zMsg, /* Type of error */ + Expr *pExpr, /* Invalidate this expression on error */ + Expr *pError /* Associate error with this expression */ +){ + const char *zIn = "partial index WHERE clauses"; + if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; +#ifndef SQLITE_OMIT_CHECK + else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; +#endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pNC->ncFlags & NC_GenCol ) zIn = "generated columns"; +#endif + sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); + if( pExpr ) pExpr->op = TK_NULL; + sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); +} +#define sqlite3ResolveNotValid(P,N,M,X,E,R) \ + assert( ((X)&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); \ + if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E,R); + +/* +** Expression p should encode a floating point value between 1.0 and 0.0. +** Return 1024 times this value. Or return -1 if p is not a floating point +** value between 1.0 and 0.0. +*/ +static int exprProbability(Expr *p){ + double r = -1.0; + if( p->op!=TK_FLOAT ) return -1; + assert( !ExprHasProperty(p, EP_IntValue) ); + sqlite3AtoF(p->u.zToken, &r, sqlite3Strlen30(p->u.zToken), SQLITE_UTF8); + assert( r>=0.0 ); + if( r>1.0 ) return -1; + return (int)(r*134217728.0); +} + +/* +** This routine is callback for sqlite3WalkExpr(). +** +** Resolve symbolic names into TK_COLUMN operators for the current +** node in the expression tree. Return 0 to continue the search down +** the tree or 2 to abort the tree walk. +** +** This routine also does error checking and name resolution for +** function names. The operator for aggregate functions is changed +** to TK_AGG_FUNCTION. +*/ +static int resolveExprStep(Walker *pWalker, Expr *pExpr){ + NameContext *pNC; + Parse *pParse; + + pNC = pWalker->u.pNC; + assert( pNC!=0 ); + pParse = pNC->pParse; + assert( pParse==pWalker->pParse ); + +#ifndef NDEBUG + if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ + SrcList *pSrcList = pNC->pSrcList; + int i; + for(i=0; ipSrcList->nSrc; i++){ + assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursornTab); + } + } +#endif + switch( pExpr->op ){ + + /* The special operator TK_ROW means use the rowid for the first + ** column in the FROM clause. This is used by the LIMIT and ORDER BY + ** clause processing on UPDATE and DELETE statements, and by + ** UPDATE ... FROM statement processing. + */ + case TK_ROW: { + SrcList *pSrcList = pNC->pSrcList; + SrcItem *pItem; + assert( pSrcList && pSrcList->nSrc>=1 ); + pItem = pSrcList->a; + pExpr->op = TK_COLUMN; + assert( ExprUseYTab(pExpr) ); + pExpr->y.pTab = pItem->pTab; + pExpr->iTable = pItem->iCursor; + pExpr->iColumn--; + pExpr->affExpr = SQLITE_AFF_INTEGER; + break; + } + + /* An optimization: Attempt to convert + ** + ** "expr IS NOT NULL" --> "TRUE" + ** "expr IS NULL" --> "FALSE" + ** + ** if we can prove that "expr" is never NULL. Call this the + ** "NOT NULL strength reduction optimization". + ** + ** If this optimization occurs, also restore the NameContext ref-counts + ** to the state they where in before the "column" LHS expression was + ** resolved. This prevents "column" from being counted as having been + ** referenced, which might prevent a SELECT from being erroneously + ** marked as correlated. + */ + case TK_NOTNULL: + case TK_ISNULL: { + int anRef[8]; + NameContext *p; + int i; + for(i=0, p=pNC; p && ipNext, i++){ + anRef[i] = p->nRef; + } + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){ + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + if( pExpr->op==TK_NOTNULL ){ + pExpr->u.zToken = "true"; + ExprSetProperty(pExpr, EP_IsTrue); + }else{ + pExpr->u.zToken = "false"; + ExprSetProperty(pExpr, EP_IsFalse); + } + pExpr->op = TK_TRUEFALSE; + for(i=0, p=pNC; p && ipNext, i++){ + p->nRef = anRef[i]; + } + sqlite3ExprDelete(pParse->db, pExpr->pLeft); + pExpr->pLeft = 0; + } + return WRC_Prune; + } + + /* A column name: ID + ** Or table name and column name: ID.ID + ** Or a database, table and column: ID.ID.ID + ** + ** The TK_ID and TK_OUT cases are combined so that there will only + ** be one call to lookupName(). Then the compiler will in-line + ** lookupName() for a size reduction and performance increase. + */ + case TK_ID: + case TK_DOT: { + const char *zColumn; + const char *zTable; + const char *zDb; + Expr *pRight; + + if( pExpr->op==TK_ID ){ + zDb = 0; + zTable = 0; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + zColumn = pExpr->u.zToken; + }else{ + Expr *pLeft = pExpr->pLeft; + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "the \".\" operator", + NC_IdxExpr|NC_GenCol, 0, pExpr); + pRight = pExpr->pRight; + if( pRight->op==TK_ID ){ + zDb = 0; + }else{ + assert( pRight->op==TK_DOT ); + assert( !ExprHasProperty(pRight, EP_IntValue) ); + zDb = pLeft->u.zToken; + pLeft = pRight->pLeft; + pRight = pRight->pRight; + } + assert( ExprUseUToken(pLeft) && ExprUseUToken(pRight) ); + zTable = pLeft->u.zToken; + zColumn = pRight->u.zToken; + assert( ExprUseYTab(pExpr) ); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); + sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); + } + } + return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); + } + + /* Resolve function names + */ + case TK_FUNCTION: { + ExprList *pList = pExpr->x.pList; /* The argument list */ + int n = pList ? pList->nExpr : 0; /* Number of arguments */ + int no_such_func = 0; /* True if no such function exists */ + int wrong_num_args = 0; /* True if wrong number of arguments */ + int is_agg = 0; /* True if is an aggregate function */ + const char *zId; /* The function name. */ + FuncDef *pDef; /* Information about the function */ + u8 enc = ENC(pParse->db); /* The database encoding */ + int savedAllowFlags = (pNC->ncFlags & (NC_AllowAgg | NC_AllowWin)); +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); +#endif + assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); + zId = pExpr->u.zToken; + pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); + if( pDef==0 ){ + pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); + if( pDef==0 ){ + no_such_func = 1; + }else{ + wrong_num_args = 1; + } + }else{ + is_agg = pDef->xFinalize!=0; + if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ + ExprSetProperty(pExpr, EP_Unlikely); + if( n==2 ){ + pExpr->iTable = exprProbability(pList->a[1].pExpr); + if( pExpr->iTable<0 ){ + sqlite3ErrorMsg(pParse, + "second argument to %#T() must be a " + "constant between 0.0 and 1.0", pExpr); + pNC->nNcErr++; + } + }else{ + /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is + ** equivalent to likelihood(X, 0.0625). + ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is + ** short-hand for likelihood(X,0.0625). + ** EVIDENCE-OF: R-36850-34127 The likely(X) function is short-hand + ** for likelihood(X,0.9375). + ** EVIDENCE-OF: R-53436-40973 The likely(X) function is equivalent + ** to likelihood(X,0.9375). */ + /* TUNING: unlikely() probability is 0.0625. likely() is 0.9375 */ + pExpr->iTable = pDef->zName[0]=='u' ? 8388608 : 125829120; + } + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); + if( auth!=SQLITE_OK ){ + if( auth==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized to use function: %#T", + pExpr); + pNC->nNcErr++; + } + pExpr->op = TK_NULL; + return WRC_Prune; + } + } +#endif + if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ + /* For the purposes of the EP_ConstFunc flag, date and time + ** functions and other functions that change slowly are considered + ** constant because they are constant for the duration of one query. + ** This allows them to be factored out of inner loops. */ + ExprSetProperty(pExpr,EP_ConstFunc); + } + if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ + /* Clearly non-deterministic functions like random(), but also + ** date/time functions that use 'now', and other functions like + ** sqlite_version() that might change over time cannot be used + ** in an index or generated column. Curiously, they can be used + ** in a CHECK constraint. SQLServer, MySQL, and PostgreSQL all + ** all this. */ + sqlite3ResolveNotValid(pParse, pNC, "non-deterministic functions", + NC_IdxExpr|NC_PartIdx|NC_GenCol, 0, pExpr); + }else{ + assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ + pExpr->op2 = pNC->ncFlags & NC_SelfRef; + if( pNC->ncFlags & NC_FromDDL ) ExprSetProperty(pExpr, EP_FromDDL); + } + if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && pParse->nested==0 + && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 + ){ + /* Internal-use-only functions are disallowed unless the + ** SQL is being compiled using sqlite3NestedParse() or + ** the SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control has be + ** used to activate internal functions for testing purposes */ + no_such_func = 1; + pDef = 0; + }else + if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 + && !IN_RENAME_OBJECT + ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); + } + } + + if( 0==IN_RENAME_OBJECT ){ +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX) + || (pDef->xValue==0 && pDef->xInverse==0) + || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) + ); + if( pDef && pDef->xValue==0 && pWin ){ + sqlite3ErrorMsg(pParse, + "%#T() may not be used as a window function", pExpr + ); + pNC->nNcErr++; + }else if( + (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pWin) + || (is_agg && pWin && (pNC->ncFlags & NC_AllowWin)==0) + ){ + const char *zType; + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pWin ){ + zType = "window"; + }else{ + zType = "aggregate"; + } + sqlite3ErrorMsg(pParse, "misuse of %s function %#T()",zType,pExpr); + pNC->nNcErr++; + is_agg = 0; + } +#else + if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){ + sqlite3ErrorMsg(pParse,"misuse of aggregate function %#T()",pExpr); + pNC->nNcErr++; + is_agg = 0; + } +#endif + else if( no_such_func && pParse->db->init.busy==0 +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + && pParse->explain==0 +#endif + ){ + sqlite3ErrorMsg(pParse, "no such function: %#T", pExpr); + pNC->nNcErr++; + }else if( wrong_num_args ){ + sqlite3ErrorMsg(pParse,"wrong number of arguments to function %#T()", + pExpr); + pNC->nNcErr++; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ErrorMsg(pParse, + "FILTER may not be used with non-aggregate %#T()", + pExpr + ); + pNC->nNcErr++; + } +#endif + if( is_agg ){ + /* Window functions may not be arguments of aggregate functions. + ** Or arguments of other window functions. But aggregate functions + ** may be arguments for window functions. */ +#ifndef SQLITE_OMIT_WINDOWFUNC + pNC->ncFlags &= ~(NC_AllowWin | (!pWin ? NC_AllowAgg : 0)); +#else + pNC->ncFlags &= ~NC_AllowAgg; +#endif + } + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( ExprHasProperty(pExpr, EP_WinFunc) ){ + is_agg = 1; + } +#endif + sqlite3WalkExprList(pWalker, pList); + if( is_agg ){ +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pWin ){ + Select *pSel = pNC->pWinSelect; + assert( pWin==0 || (ExprUseYWin(pExpr) && pWin==pExpr->y.pWin) ); + if( IN_RENAME_OBJECT==0 ){ + sqlite3WindowUpdate(pParse, pSel ? pSel->pWinDefn : 0, pWin, pDef); + if( pParse->db->mallocFailed ) break; + } + sqlite3WalkExprList(pWalker, pWin->pPartition); + sqlite3WalkExprList(pWalker, pWin->pOrderBy); + sqlite3WalkExpr(pWalker, pWin->pFilter); + sqlite3WindowLink(pSel, pWin); + pNC->ncFlags |= NC_HasWin; + }else +#endif /* SQLITE_OMIT_WINDOWFUNC */ + { + NameContext *pNC2; /* For looping up thru outer contexts */ + pExpr->op = TK_AGG_FUNCTION; + pExpr->op2 = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); + } +#endif + pNC2 = pNC; + while( pNC2 + && sqlite3ReferencesSrcList(pParse, pExpr, pNC2->pSrcList)==0 + ){ + pExpr->op2++; + pNC2 = pNC2->pNext; + } + assert( pDef!=0 || IN_RENAME_OBJECT ); + if( pNC2 && pDef ){ + assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); + assert( SQLITE_FUNC_ANYORDER==NC_OrderAgg ); + testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); + testcase( (pDef->funcFlags & SQLITE_FUNC_ANYORDER)!=0 ); + pNC2->ncFlags |= NC_HasAgg + | ((pDef->funcFlags^SQLITE_FUNC_ANYORDER) + & (SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER)); + } + } + pNC->ncFlags |= savedAllowFlags; + } + /* FIX ME: Compute pExpr->affinity based on the expected return + ** type of the function + */ + return WRC_Prune; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: + case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); +#endif + case TK_IN: { + testcase( pExpr->op==TK_IN ); + if( ExprUseXSelect(pExpr) ){ + int nRef = pNC->nRef; + testcase( pNC->ncFlags & NC_IsCheck ); + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + if( pNC->ncFlags & NC_SelfRef ){ + notValidImpl(pParse, pNC, "subqueries", pExpr, pExpr); + }else{ + sqlite3WalkSelect(pWalker, pExpr->x.pSelect); + } + assert( pNC->nRef>=nRef ); + if( nRef!=pNC->nRef ){ + ExprSetProperty(pExpr, EP_VarSelect); + pNC->ncFlags |= NC_VarSelect; + } + } + break; + } + case TK_VARIABLE: { + testcase( pNC->ncFlags & NC_IsCheck ); + testcase( pNC->ncFlags & NC_PartIdx ); + testcase( pNC->ncFlags & NC_IdxExpr ); + testcase( pNC->ncFlags & NC_GenCol ); + sqlite3ResolveNotValid(pParse, pNC, "parameters", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr, pExpr); + break; + } + case TK_IS: + case TK_ISNOT: { + Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); + assert( !ExprHasProperty(pExpr, EP_Reduced) ); + /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", + ** and "x IS NOT FALSE". */ + if( ALWAYS(pRight) && (pRight->op==TK_ID || pRight->op==TK_TRUEFALSE) ){ + int rc = resolveExprStep(pWalker, pRight); + if( rc==WRC_Abort ) return WRC_Abort; + if( pRight->op==TK_TRUEFALSE ){ + pExpr->op2 = pExpr->op; + pExpr->op = TK_TRUTH; + return WRC_Continue; + } + } + /* no break */ deliberate_fall_through + } + case TK_BETWEEN: + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: { + int nLeft, nRight; + if( pParse->db->mallocFailed ) break; + assert( pExpr->pLeft!=0 ); + nLeft = sqlite3ExprVectorSize(pExpr->pLeft); + if( pExpr->op==TK_BETWEEN ){ + assert( ExprUseXList(pExpr) ); + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); + if( nRight==nLeft ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); + } + }else{ + assert( pExpr->pRight!=0 ); + nRight = sqlite3ExprVectorSize(pExpr->pRight); + } + if( nLeft!=nRight ){ + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_BETWEEN ); + sqlite3ErrorMsg(pParse, "row value misused"); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); + } + break; + } + } + assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 ); + return pParse->nErr ? WRC_Abort : WRC_Continue; +} + +/* +** pEList is a list of expressions which are really the result set of the +** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause. +** This routine checks to see if pE is a simple identifier which corresponds +** to the AS-name of one of the terms of the expression list. If it is, +** this routine return an integer between 1 and N where N is the number of +** elements in pEList, corresponding to the matching entry. If there is +** no match, or if pE is not a simple identifier, then this routine +** return 0. +** +** pEList has been resolved. pE has not. +*/ +static int resolveAsName( + Parse *pParse, /* Parsing context for error messages */ + ExprList *pEList, /* List of expressions to scan */ + Expr *pE /* Expression we are trying to match */ +){ + int i; /* Loop counter */ + + UNUSED_PARAMETER(pParse); + + if( pE->op==TK_ID ){ + const char *zCol; + assert( !ExprHasProperty(pE, EP_IntValue) ); + zCol = pE->u.zToken; + for(i=0; inExpr; i++){ + if( pEList->a[i].fg.eEName==ENAME_NAME + && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 + ){ + return i+1; + } + } + } + return 0; +} + +/* +** pE is a pointer to an expression which is a single term in the +** ORDER BY of a compound SELECT. The expression has not been +** name resolved. +** +** At the point this routine is called, we already know that the +** ORDER BY term is not an integer index into the result set. That +** case is handled by the calling routine. +** +** Attempt to match pE against result set columns in the left-most +** SELECT statement. Return the index i of the matching column, +** as an indication to the caller that it should sort by the i-th column. +** The left-most column is 1. In other words, the value returned is the +** same integer value that would be used in the SQL statement to indicate +** the column. +** +** If there is no match, return 0. Return -1 if an error occurs. +*/ +static int resolveOrderByTermToExprList( + Parse *pParse, /* Parsing context for error messages */ + Select *pSelect, /* The SELECT statement with the ORDER BY clause */ + Expr *pE /* The specific ORDER BY term */ +){ + int i; /* Loop counter */ + ExprList *pEList; /* The columns of the result set */ + NameContext nc; /* Name context for resolving pE */ + sqlite3 *db; /* Database connection */ + int rc; /* Return code from subprocedures */ + u8 savedSuppErr; /* Saved value of db->suppressErr */ + + assert( sqlite3ExprIsInteger(pE, &i)==0 ); + pEList = pSelect->pEList; + + /* Resolve all names in the ORDER BY term expression + */ + memset(&nc, 0, sizeof(nc)); + nc.pParse = pParse; + nc.pSrcList = pSelect->pSrc; + nc.uNC.pEList = pEList; + nc.ncFlags = NC_AllowAgg|NC_UEList|NC_NoSelect; + nc.nNcErr = 0; + db = pParse->db; + savedSuppErr = db->suppressErr; + db->suppressErr = 1; + rc = sqlite3ResolveExprNames(&nc, pE); + db->suppressErr = savedSuppErr; + if( rc ) return 0; + + /* Try to match the ORDER BY expression against an expression + ** in the result set. Return an 1-based index of the matching + ** result-set entry. + */ + for(i=0; inExpr; i++){ + if( sqlite3ExprCompare(0, pEList->a[i].pExpr, pE, -1)<2 ){ + return i+1; + } + } + + /* If no match, return 0. */ + return 0; +} + +/* +** Generate an ORDER BY or GROUP BY term out-of-range error. +*/ +static void resolveOutOfRangeError( + Parse *pParse, /* The error context into which to write the error */ + const char *zType, /* "ORDER" or "GROUP" */ + int i, /* The index (1-based) of the term out of range */ + int mx, /* Largest permissible value of i */ + Expr *pError /* Associate the error with the expression */ +){ + sqlite3ErrorMsg(pParse, + "%r %s BY term out of range - should be " + "between 1 and %d", i, zType, mx); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); +} + +/* +** Analyze the ORDER BY clause in a compound SELECT statement. Modify +** each term of the ORDER BY clause is a constant integer between 1 +** and N where N is the number of columns in the compound SELECT. +** +** ORDER BY terms that are already an integer between 1 and N are +** unmodified. ORDER BY terms that are integers outside the range of +** 1 through N generate an error. ORDER BY terms that are expressions +** are matched against result set expressions of compound SELECT +** beginning with the left-most SELECT and working toward the right. +** At the first match, the ORDER BY expression is transformed into +** the integer column number. +** +** Return the number of errors seen. +*/ +static int resolveCompoundOrderBy( + Parse *pParse, /* Parsing context. Leave error messages here */ + Select *pSelect /* The SELECT statement containing the ORDER BY */ +){ + int i; + ExprList *pOrderBy; + ExprList *pEList; + sqlite3 *db; + int moreToDo = 1; + + pOrderBy = pSelect->pOrderBy; + if( pOrderBy==0 ) return 0; + db = pParse->db; + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); + return 1; + } + for(i=0; inExpr; i++){ + pOrderBy->a[i].fg.done = 0; + } + pSelect->pNext = 0; + while( pSelect->pPrior ){ + pSelect->pPrior->pNext = pSelect; + pSelect = pSelect->pPrior; + } + while( pSelect && moreToDo ){ + struct ExprList_item *pItem; + moreToDo = 0; + pEList = pSelect->pEList; + assert( pEList!=0 ); + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + int iCol = -1; + Expr *pE, *pDup; + if( pItem->fg.done ) continue; + pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); + if( NEVER(pE==0) ) continue; + if( sqlite3ExprIsInteger(pE, &iCol) ){ + if( iCol<=0 || iCol>pEList->nExpr ){ + resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr, pE); + return 1; + } + }else{ + iCol = resolveAsName(pParse, pEList, pE); + if( iCol==0 ){ + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** Once the comparisons are finished, the duplicate expression + ** is deleted. + ** + ** If this is running as part of an ALTER TABLE operation and + ** the symbols resolve successfully, also resolve the symbols in the + ** actual expression. This allows the code in alter.c to modify + ** column references within the ORDER BY expression as required. */ + pDup = sqlite3ExprDup(db, pE, 0); + if( !db->mallocFailed ){ + assert(pDup); + iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); + if( IN_RENAME_OBJECT && iCol>0 ){ + resolveOrderByTermToExprList(pParse, pSelect, pE); + } + } + sqlite3ExprDelete(db, pDup); + } + } + if( iCol>0 ){ + /* Convert the ORDER BY term into an integer column number iCol, + ** taking care to preserve the COLLATE clause if it exists. */ + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; + } + pItem->fg.done = 1; + }else{ + moreToDo = 1; + } + } + pSelect = pSelect->pNext; + } + for(i=0; inExpr; i++){ + if( pOrderBy->a[i].fg.done==0 ){ + sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " + "column in the result set", i+1); + return 1; + } + } + return 0; +} + +/* +** Check every term in the ORDER BY or GROUP BY clause pOrderBy of +** the SELECT statement pSelect. If any term is reference to a +** result set expression (as determined by the ExprList.a.u.x.iOrderByCol +** field) then convert that term into a copy of the corresponding result set +** column. +** +** If any errors are detected, add an error message to pParse and +** return non-zero. Return zero if no errors are seen. +*/ +SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( + Parse *pParse, /* Parsing context. Leave error messages here */ + Select *pSelect, /* The SELECT statement containing the clause */ + ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ + const char *zType /* "ORDER" or "GROUP" */ +){ + int i; + sqlite3 *db = pParse->db; + ExprList *pEList; + struct ExprList_item *pItem; + + if( pOrderBy==0 || pParse->db->mallocFailed || IN_RENAME_OBJECT ) return 0; + if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); + return 1; + } + pEList = pSelect->pEList; + assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + if( pItem->u.x.iOrderByCol ){ + if( pItem->u.x.iOrderByCol>pEList->nExpr ){ + resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr, 0); + return 1; + } + resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr,0); + } + } + return 0; +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for windowRemoveExprFromSelect(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + UNUSED_PARAMETER(pWalker); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + sqlite3WindowUnlinkFromSelect(pWin); + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ + if( pSelect->pWin ){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); + } +} +#else +# define windowRemoveExprFromSelect(a, b) +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. +** The Name context of the SELECT statement is pNC. zType is either +** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. +** +** This routine resolves each term of the clause into an expression. +** If the order-by term is an integer I between 1 and N (where N is the +** number of columns in the result set of the SELECT) then the expression +** in the resolution is a copy of the I-th result-set expression. If +** the order-by term is an identifier that corresponds to the AS-name of +** a result-set expression, then the term resolves to a copy of the +** result-set expression. Otherwise, the expression is resolved in +** the usual way - using sqlite3ResolveExprNames(). +** +** This routine returns the number of errors. If errors occur, then +** an appropriate error message might be left in pParse. (OOM errors +** excepted.) +*/ +static int resolveOrderGroupBy( + NameContext *pNC, /* The name context of the SELECT statement */ + Select *pSelect, /* The SELECT statement holding pOrderBy */ + ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */ + const char *zType /* Either "ORDER" or "GROUP", as appropriate */ +){ + int i, j; /* Loop counters */ + int iCol; /* Column number */ + struct ExprList_item *pItem; /* A term of the ORDER BY clause */ + Parse *pParse; /* Parsing context */ + int nResult; /* Number of terms in the result set */ + + assert( pOrderBy!=0 ); + nResult = pSelect->pEList->nExpr; + pParse = pNC->pParse; + for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + Expr *pE = pItem->pExpr; + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE); + if( NEVER(pE2==0) ) continue; + if( zType[0]!='G' ){ + iCol = resolveAsName(pParse, pSelect->pEList, pE2); + if( iCol>0 ){ + /* If an AS-name match is found, mark this ORDER BY column as being + ** a copy of the iCol-th result-set column. The subsequent call to + ** sqlite3ResolveOrderGroupBy() will convert the expression to a + ** copy of the iCol-th result-set expression. */ + pItem->u.x.iOrderByCol = (u16)iCol; + continue; + } + } + if( sqlite3ExprIsInteger(pE2, &iCol) ){ + /* The ORDER BY term is an integer constant. Again, set the column + ** number so that sqlite3ResolveOrderGroupBy() will convert the + ** order-by term to a copy of the result-set expression */ + if( iCol<1 || iCol>0xffff ){ + resolveOutOfRangeError(pParse, zType, i+1, nResult, pE2); + return 1; + } + pItem->u.x.iOrderByCol = (u16)iCol; + continue; + } + + /* Otherwise, treat the ORDER BY term as an ordinary expression */ + pItem->u.x.iOrderByCol = 0; + if( sqlite3ResolveExprNames(pNC, pE) ){ + return 1; + } + for(j=0; jpEList->nExpr; j++){ + if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + windowRemoveExprFromSelect(pSelect, pE); + pItem->u.x.iOrderByCol = j+1; + } + } + } + return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); +} + +/* +** Resolve names in the SELECT statement p and all of its descendants. +*/ +static int resolveSelectStep(Walker *pWalker, Select *p){ + NameContext *pOuterNC; /* Context that contains this SELECT */ + NameContext sNC; /* Name context of this SELECT */ + int isCompound; /* True if p is a compound select */ + int nCompound; /* Number of compound terms processed so far */ + Parse *pParse; /* Parsing context */ + int i; /* Loop counter */ + ExprList *pGroupBy; /* The GROUP BY clause */ + Select *pLeftmost; /* Left-most of SELECT of a compound */ + sqlite3 *db; /* Database connection */ + + + assert( p!=0 ); + if( p->selFlags & SF_Resolved ){ + return WRC_Prune; + } + pOuterNC = pWalker->u.pNC; + pParse = pWalker->pParse; + db = pParse->db; + + /* Normally sqlite3SelectExpand() will be called first and will have + ** already expanded this SELECT. However, if this is a subquery within + ** an expression, sqlite3ResolveExprNames() will be called without a + ** prior call to sqlite3SelectExpand(). When that happens, let + ** sqlite3SelectPrep() do all of the processing for this SELECT. + ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and + ** this routine in the correct order. + */ + if( (p->selFlags & SF_Expanded)==0 ){ + sqlite3SelectPrep(pParse, p, pOuterNC); + return pParse->nErr ? WRC_Abort : WRC_Prune; + } + + isCompound = p->pPrior!=0; + nCompound = 0; + pLeftmost = p; + while( p ){ + assert( (p->selFlags & SF_Expanded)!=0 ); + assert( (p->selFlags & SF_Resolved)==0 ); + assert( db->suppressErr==0 ); /* SF_Resolved not set if errors suppressed */ + p->selFlags |= SF_Resolved; + + + /* Resolve the expressions in the LIMIT and OFFSET clauses. These + ** are not allowed to refer to any names, so pass an empty NameContext. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pWinSelect = p; + if( sqlite3ResolveExprNames(&sNC, p->pLimit) ){ + return WRC_Abort; + } + + /* If the SF_Converted flags is set, then this Select object was + ** was created by the convertCompoundSelectToSubquery() function. + ** In this case the ORDER BY clause (p->pOrderBy) should be resolved + ** as if it were part of the sub-query, not the parent. This block + ** moves the pOrderBy down to the sub-query. It will be moved back + ** after the names have been resolved. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + assert( p->pSrc->nSrc==1 && p->pOrderBy ); + assert( pSub->pPrior && pSub->pOrderBy==0 ); + pSub->pOrderBy = p->pOrderBy; + p->pOrderBy = 0; + } + + /* Recursively resolve names in all subqueries in the FROM clause + */ + for(i=0; ipSrc->nSrc; i++){ + SrcItem *pItem = &p->pSrc->a[i]; + if( pItem->pSelect && (pItem->pSelect->selFlags & SF_Resolved)==0 ){ + int nRef = pOuterNC ? pOuterNC->nRef : 0; + const char *zSavedContext = pParse->zAuthContext; + + if( pItem->zName ) pParse->zAuthContext = pItem->zName; + sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); + pParse->zAuthContext = zSavedContext; + if( pParse->nErr ) return WRC_Abort; + assert( db->mallocFailed==0 ); + + /* If the number of references to the outer context changed when + ** expressions in the sub-select were resolved, the sub-select + ** is correlated. It is not required to check the refcount on any + ** but the innermost outer context object, as lookupName() increments + ** the refcount on all contexts between the current one and the + ** context containing the column when it resolves a name. */ + if( pOuterNC ){ + assert( pItem->fg.isCorrelated==0 && pOuterNC->nRef>=nRef ); + pItem->fg.isCorrelated = (pOuterNC->nRef>nRef); + } + } + } + + /* Set up the local name-context to pass to sqlite3ResolveExprNames() to + ** resolve the result-set expression list. + */ + sNC.ncFlags = NC_AllowAgg|NC_AllowWin; + sNC.pSrcList = p->pSrc; + sNC.pNext = pOuterNC; + + /* Resolve names in the result set. */ + if( sqlite3ResolveExprListNames(&sNC, p->pEList) ) return WRC_Abort; + sNC.ncFlags &= ~NC_AllowWin; + + /* If there are no aggregate functions in the result-set, and no GROUP BY + ** expression, do not allow aggregates in any of the other expressions. + */ + assert( (p->selFlags & SF_Aggregate)==0 ); + pGroupBy = p->pGroupBy; + if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){ + assert( NC_MinMaxAgg==SF_MinMaxAgg ); + assert( NC_OrderAgg==SF_OrderByReqd ); + p->selFlags |= SF_Aggregate | (sNC.ncFlags&(NC_MinMaxAgg|NC_OrderAgg)); + }else{ + sNC.ncFlags &= ~NC_AllowAgg; + } + + /* Add the output column list to the name-context before parsing the + ** other expressions in the SELECT statement. This is so that + ** expressions in the WHERE clause (etc.) can refer to expressions by + ** aliases in the result set. + ** + ** Minor point: If this is the case, then the expression will be + ** re-evaluated for each reference to it. + */ + assert( (sNC.ncFlags & (NC_UAggInfo|NC_UUpsert|NC_UBaseReg))==0 ); + sNC.uNC.pEList = p->pEList; + sNC.ncFlags |= NC_UEList; + if( p->pHaving ){ + if( (p->selFlags & SF_Aggregate)==0 ){ + sqlite3ErrorMsg(pParse, "HAVING clause on a non-aggregate query"); + return WRC_Abort; + } + if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; + } + if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort; + + /* Resolve names in table-valued-function arguments */ + for(i=0; ipSrc->nSrc; i++){ + SrcItem *pItem = &p->pSrc->a[i]; + if( pItem->fg.isTabFunc + && sqlite3ResolveExprListNames(&sNC, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } +#endif + + /* The ORDER BY and GROUP BY clauses may not refer to terms in + ** outer queries + */ + sNC.pNext = 0; + sNC.ncFlags |= NC_AllowAgg|NC_AllowWin; + + /* If this is a converted compound query, move the ORDER BY clause from + ** the sub-query back to the parent query. At this point each term + ** within the ORDER BY clause has been transformed to an integer value. + ** These integers will be replaced by copies of the corresponding result + ** set expressions by the call to resolveOrderGroupBy() below. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + p->pOrderBy = pSub->pOrderBy; + pSub->pOrderBy = 0; + } + + /* Process the ORDER BY clause for singleton SELECT statements. + ** The ORDER BY clause for compounds SELECT statements is handled + ** below, after all of the result-sets for all of the elements of + ** the compound have been resolved. + ** + ** If there is an ORDER BY clause on a term of a compound-select other + ** than the right-most term, then that is a syntax error. But the error + ** is not detected until much later, and so we need to go ahead and + ** resolve those symbols on the incorrect ORDER BY for consistency. + */ + if( p->pOrderBy!=0 + && isCompound<=nCompound /* Defer right-most ORDER BY of a compound */ + && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") + ){ + return WRC_Abort; + } + if( db->mallocFailed ){ + return WRC_Abort; + } + sNC.ncFlags &= ~NC_AllowWin; + + /* Resolve the GROUP BY clause. At the same time, make sure + ** the GROUP BY clause does not contain aggregate functions. + */ + if( pGroupBy ){ + struct ExprList_item *pItem; + + if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){ + return WRC_Abort; + } + for(i=0, pItem=pGroupBy->a; inExpr; i++, pItem++){ + if( ExprHasProperty(pItem->pExpr, EP_Agg) ){ + sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " + "the GROUP BY clause"); + return WRC_Abort; + } + } + } + + /* If this is part of a compound SELECT, check that it has the right + ** number of expressions in the select list. */ + if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ + sqlite3SelectWrongNumTermsError(pParse, p->pNext); + return WRC_Abort; + } + + /* Advance to the next term of the compound + */ + p = p->pPrior; + nCompound++; + } + + /* Resolve the ORDER BY on a compound SELECT after all terms of + ** the compound have been resolved. + */ + if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){ + return WRC_Abort; + } + + return WRC_Prune; +} + +/* +** This routine walks an expression tree and resolves references to +** table columns and result-set columns. At the same time, do error +** checking on function usage and set a flag if any aggregate functions +** are seen. +** +** To resolve table columns references we look for nodes (or subtrees) of the +** form X.Y.Z or Y.Z or just Z where +** +** X: The name of a database. Ex: "main" or "temp" or +** the symbolic name assigned to an ATTACH-ed database. +** +** Y: The name of a table in a FROM clause. Or in a trigger +** one of the special names "old" or "new". +** +** Z: The name of a column in table Y. +** +** The node at the root of the subtree is modified as follows: +** +** Expr.op Changed to TK_COLUMN +** Expr.pTab Points to the Table object for X.Y +** Expr.iColumn The column index in X.Y. -1 for the rowid. +** Expr.iTable The VDBE cursor number for X.Y +** +** +** To resolve result-set references, look for expression nodes of the +** form Z (with no X and Y prefix) where the Z matches the right-hand +** size of an AS clause in the result-set of a SELECT. The Z expression +** is replaced by a copy of the left-hand side of the result-set expression. +** Table-name and function resolution occurs on the substituted expression +** tree. For example, in: +** +** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; +** +** The "x" term of the order by is replaced by "a+b" to render: +** +** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; +** +** Function calls are checked to make sure that the function is +** defined and that the correct number of arguments are specified. +** If the function is an aggregate function, then the NC_HasAgg flag is +** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. +** If an expression contains aggregate functions then the EP_Agg +** property on the expression is set. +** +** An error message is left in pParse if anything is amiss. The number +** if errors is returned. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + Expr *pExpr /* The expression to be analyzed. */ +){ + int savedHasAgg; + Walker w; + + if( pExpr==0 ) return SQLITE_OK; + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + w.pParse = pNC->pParse; + w.xExprCallback = resolveExprStep; + w.xSelectCallback = (pNC->ncFlags & NC_NoSelect) ? 0 : resolveSelectStep; + w.xSelectCallback2 = 0; + w.u.pNC = pNC; +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight += pExpr->nHeight; + if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + return SQLITE_ERROR; + } +#endif + sqlite3WalkExpr(&w, pExpr); +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight -= pExpr->nHeight; +#endif + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); + pNC->ncFlags |= savedHasAgg; + return pNC->nNcErr>0 || w.pParse->nErr>0; +} + +/* +** Resolve all names for all expression in an expression list. This is +** just like sqlite3ResolveExprNames() except that it works for an expression +** list rather than a single expression. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprListNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + ExprList *pList /* The expression list to be analyzed. */ +){ + int i; + int savedHasAgg = 0; + Walker w; + if( pList==0 ) return WRC_Continue; + w.pParse = pNC->pParse; + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.u.pNC = pNC; + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + if( pExpr==0 ) continue; +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight += pExpr->nHeight; + if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + return WRC_Abort; + } +#endif + sqlite3WalkExpr(&w, pExpr); +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight -= pExpr->nHeight; +#endif + assert( EP_Agg==NC_HasAgg ); + assert( EP_Win==NC_HasWin ); + testcase( pNC->ncFlags & NC_HasAgg ); + testcase( pNC->ncFlags & NC_HasWin ); + if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg) ){ + ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); + savedHasAgg |= pNC->ncFlags & + (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + } + if( w.pParse->nErr>0 ) return WRC_Abort; + } + pNC->ncFlags |= savedHasAgg; + return WRC_Continue; +} + +/* +** Resolve all names in all expressions of a SELECT and in all +** decendents of the SELECT, including compounds off of p->pPrior, +** subqueries in expressions, and subqueries used as FROM clause +** terms. +** +** See sqlite3ResolveExprNames() for a description of the kinds of +** transformations that occur. +** +** All SELECT statements should have been expanded using +** sqlite3SelectExpand() prior to invoking this routine. +*/ +SQLITE_PRIVATE void sqlite3ResolveSelectNames( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* Name context for parent SELECT statement */ +){ + Walker w; + + assert( p!=0 ); + w.xExprCallback = resolveExprStep; + w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; + w.pParse = pParse; + w.u.pNC = pOuterNC; + sqlite3WalkSelect(&w, p); +} + +/* +** Resolve names in expressions that can only reference a single table +** or which cannot reference any tables at all. Examples: +** +** "type" flag +** ------------ +** (1) CHECK constraints NC_IsCheck +** (2) WHERE clauses on partial indices NC_PartIdx +** (3) Expressions in indexes on expressions NC_IdxExpr +** (4) Expression arguments to VACUUM INTO. 0 +** (5) GENERATED ALWAYS as expressions NC_GenCol +** +** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN +** nodes of the expression is set to -1 and the Expr.iColumn value is +** set to the column number. In case (4), TK_COLUMN nodes cause an error. +** +** Any errors cause an error message to be set in pParse. +*/ +SQLITE_PRIVATE int sqlite3ResolveSelfReference( + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck, NC_PartIdx, NC_IdxExpr, NC_GenCol, or 0 */ + Expr *pExpr, /* Expression to resolve. May be NULL. */ + ExprList *pList /* Expression list to resolve. May be NULL. */ +){ + SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ + NameContext sNC; /* Name context for pParse->pNewTable */ + int rc; + + assert( type==0 || pTab!=0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr + || type==NC_GenCol || pTab==0 ); + memset(&sNC, 0, sizeof(sNC)); + memset(&sSrc, 0, sizeof(sSrc)); + if( pTab ){ + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){ + /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP + ** schema elements */ + type |= NC_FromDDL; + } + } + sNC.pParse = pParse; + sNC.pSrcList = &sSrc; + sNC.ncFlags = type | NC_IsDDL; + if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; + if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); + return rc; +} + +/************** End of resolve.c *********************************************/ +/************** Begin file expr.c ********************************************/ +/* +** 2001 September 15 +** +** 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 contains routines used for analyzing expressions and +** for generating VDBE code that evaluates expressions in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* Forward declarations */ +static void exprCodeBetween(Parse*,Expr*,int,void(*)(Parse*,Expr*,int,int),int); +static int exprCodeVector(Parse *pParse, Expr *p, int *piToFree); + +/* +** Return the affinity character for a single column of a table. +*/ +SQLITE_PRIVATE char sqlite3TableColumnAffinity(const Table *pTab, int iCol){ + if( iCol<0 || NEVER(iCol>=pTab->nCol) ) return SQLITE_AFF_INTEGER; + return pTab->aCol[iCol].affinity; +} + +/* +** Return the 'affinity' of the expression pExpr if any. +** +** If pExpr is a column, a reference to a column via an 'AS' alias, +** or a sub-select with a column as the return value, then the +** affinity of that column is returned. Otherwise, 0x00 is returned, +** indicating no affinity for the expression. +** +** i.e. the WHERE clause expressions in the following statements all +** have an affinity: +** +** CREATE TABLE t1(a); +** SELECT * FROM t1 WHERE a; +** SELECT a AS b FROM t1 WHERE b; +** SELECT * FROM t1 WHERE (select a from t1); +*/ +SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ + int op; + while( ExprHasProperty(pExpr, EP_Skip|EP_IfNullRow) ){ + assert( pExpr->op==TK_COLLATE + || pExpr->op==TK_IF_NULL_ROW + || (pExpr->op==TK_REGISTER && pExpr->op2==TK_IF_NULL_ROW) ); + pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + } + op = pExpr->op; + if( op==TK_REGISTER ) op = pExpr->op2; + if( op==TK_COLUMN || op==TK_AGG_COLUMN ){ + assert( ExprUseYTab(pExpr) ); + if( pExpr->y.pTab ){ + return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + } + } + if( op==TK_SELECT ){ + assert( ExprUseXSelect(pExpr) ); + assert( pExpr->x.pSelect!=0 ); + assert( pExpr->x.pSelect->pEList!=0 ); + assert( pExpr->x.pSelect->pEList->a[0].pExpr!=0 ); + return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + } +#ifndef SQLITE_OMIT_CAST + if( op==TK_CAST ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + return sqlite3AffinityType(pExpr->u.zToken, 0); + } +#endif + if( op==TK_SELECT_COLUMN ){ + assert( pExpr->pLeft!=0 && ExprUseXSelect(pExpr->pLeft) ); + assert( pExpr->iColumn < pExpr->iTable ); + assert( pExpr->iTable==pExpr->pLeft->x.pSelect->pEList->nExpr ); + return sqlite3ExprAffinity( + pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr + ); + } + if( op==TK_VECTOR ){ + assert( ExprUseXList(pExpr) ); + return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr); + } + return pExpr->affExpr; +} + +/* +** Set the collating sequence for expression pExpr to be the collating +** sequence named by pToken. Return a pointer to a new Expr node that +** implements the COLLATE operator. +** +** If a memory allocation error occurs, that fact is recorded in pParse->db +** and the pExpr parameter is returned unchanged. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken( + const Parse *pParse, /* Parsing context */ + Expr *pExpr, /* Add the "COLLATE" clause to this expression */ + const Token *pCollName, /* Name of collating sequence */ + int dequote /* True to dequote pCollName */ +){ + if( pCollName->n>0 ){ + Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, dequote); + if( pNew ){ + pNew->pLeft = pExpr; + pNew->flags |= EP_Collate|EP_Skip; + pExpr = pNew; + } + } + return pExpr; +} +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString( + const Parse *pParse, /* Parsing context */ + Expr *pExpr, /* Add the "COLLATE" clause to this expression */ + const char *zC /* The collating sequence name */ +){ + Token s; + assert( zC!=0 ); + sqlite3TokenInit(&s, (char*)zC); + return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); +} + +/* +** Skip over any TK_COLLATE operators. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + } + return pExpr; +} + +/* +** Skip over any TK_COLLATE operators and/or any unlikely() +** or likelihood() or likely() functions at the root of an +** expression. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ + if( ExprHasProperty(pExpr, EP_Unlikely) ){ + assert( ExprUseXList(pExpr) ); + assert( pExpr->x.pList->nExpr>0 ); + assert( pExpr->op==TK_FUNCTION ); + pExpr = pExpr->x.pList->a[0].pExpr; + }else{ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + } + } + return pExpr; +} + +/* +** Return the collation sequence for the expression pExpr. If +** there is no defined collating sequence, return NULL. +** +** See also: sqlite3ExprNNCollSeq() +** +** The sqlite3ExprNNCollSeq() works the same exact that it returns the +** default collation if pExpr has no defined collation. +** +** The collating sequence might be determined by a COLLATE operator +** or by the presence of a column with a defined collating sequence. +** COLLATE operators take first precedence. Left operands take +** precedence over right operands. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ + sqlite3 *db = pParse->db; + CollSeq *pColl = 0; + const Expr *p = pExpr; + while( p ){ + int op = p->op; + if( op==TK_REGISTER ) op = p->op2; + if( op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER ){ + assert( ExprUseYTab(p) ); + if( p->y.pTab!=0 ){ + /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally + ** a TK_COLUMN but was previously evaluated and cached in a register */ + int j = p->iColumn; + if( j>=0 ){ + const char *zColl = sqlite3ColumnColl(&p->y.pTab->aCol[j]); + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + } + break; + } + } + if( op==TK_CAST || op==TK_UPLUS ){ + p = p->pLeft; + continue; + } + if( op==TK_VECTOR ){ + assert( ExprUseXList(p) ); + p = p->x.pList->a[0].pExpr; + continue; + } + if( op==TK_COLLATE ){ + assert( !ExprHasProperty(p, EP_IntValue) ); + pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); + break; + } + if( p->flags & EP_Collate ){ + if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ + p = p->pLeft; + }else{ + Expr *pNext = p->pRight; + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( ExprUseXList(p) ); + assert( p->x.pList==0 || p->pRight==0 ); + if( p->x.pList!=0 && !db->mallocFailed ){ + int i; + for(i=0; ALWAYS(ix.pList->nExpr); i++){ + if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ + pNext = p->x.pList->a[i].pExpr; + break; + } + } + } + p = pNext; + } + }else{ + break; + } + } + if( sqlite3CheckCollSeq(pParse, pColl) ){ + pColl = 0; + } + return pColl; +} + +/* +** Return the collation sequence for the expression pExpr. If +** there is no defined collating sequence, return a pointer to the +** defautl collation sequence. +** +** See also: sqlite3ExprCollSeq() +** +** The sqlite3ExprCollSeq() routine works the same except that it +** returns NULL if there is no defined collation. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr){ + CollSeq *p = sqlite3ExprCollSeq(pParse, pExpr); + if( p==0 ) p = pParse->db->pDfltColl; + assert( p!=0 ); + return p; +} + +/* +** Return TRUE if the two expressions have equivalent collating sequences. +*/ +SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse *pParse, const Expr *pE1, const Expr *pE2){ + CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pE1); + CollSeq *pColl2 = sqlite3ExprNNCollSeq(pParse, pE2); + return sqlite3StrICmp(pColl1->zName, pColl2->zName)==0; +} + +/* +** pExpr is an operand of a comparison operator. aff2 is the +** type affinity of the other operand. This routine returns the +** type affinity that should be used for the comparison operator. +*/ +SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2){ + char aff1 = sqlite3ExprAffinity(pExpr); + if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ + /* Both sides of the comparison are columns. If one has numeric + ** affinity, use that. Otherwise use no affinity. + */ + if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ + return SQLITE_AFF_NUMERIC; + }else{ + return SQLITE_AFF_BLOB; + } + }else{ + /* One side is a column, the other is not. Use the columns affinity. */ + assert( aff1<=SQLITE_AFF_NONE || aff2<=SQLITE_AFF_NONE ); + return (aff1<=SQLITE_AFF_NONE ? aff2 : aff1) | SQLITE_AFF_NONE; + } +} + +/* +** pExpr is a comparison operator. Return the type affinity that should +** be applied to both operands prior to doing the comparison. +*/ +static char comparisonAffinity(const Expr *pExpr){ + char aff; + assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || + pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || + pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); + assert( pExpr->pLeft ); + aff = sqlite3ExprAffinity(pExpr->pLeft); + if( pExpr->pRight ){ + aff = sqlite3CompareAffinity(pExpr->pRight, aff); + }else if( ExprUseXSelect(pExpr) ){ + aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); + }else if( aff==0 ){ + aff = SQLITE_AFF_BLOB; + } + return aff; +} + +/* +** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. +** idx_affinity is the affinity of an indexed column. Return true +** if the index with affinity idx_affinity may be used to implement +** the comparison in pExpr. +*/ +SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity){ + char aff = comparisonAffinity(pExpr); + if( affflags & EP_Collate ){ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + }else if( pRight && (pRight->flags & EP_Collate)!=0 ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + }else{ + pColl = sqlite3ExprCollSeq(pParse, pLeft); + if( !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pRight); + } + } + return pColl; +} + +/* Expresssion p is a comparison operator. Return a collation sequence +** appropriate for the comparison operator. +** +** This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). +** However, if the OP_Commuted flag is set, then the order of the operands +** is reversed in the sqlite3BinaryCompareCollSeq() call so that the +** correct collating sequence is found. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse *pParse, const Expr *p){ + if( ExprHasProperty(p, EP_Commuted) ){ + return sqlite3BinaryCompareCollSeq(pParse, p->pRight, p->pLeft); + }else{ + return sqlite3BinaryCompareCollSeq(pParse, p->pLeft, p->pRight); + } +} + +/* +** Generate code for a comparison operator. +*/ +static int codeCompare( + Parse *pParse, /* The parsing (and code generating) context */ + Expr *pLeft, /* The left operand */ + Expr *pRight, /* The right operand */ + int opcode, /* The comparison opcode */ + int in1, int in2, /* Register holding operands */ + int dest, /* Jump here if true. */ + int jumpIfNull, /* If true, jump if either operand is NULL */ + int isCommuted /* The comparison has been commuted */ +){ + int p5; + int addr; + CollSeq *p4; + + if( pParse->nErr ) return 0; + if( isCommuted ){ + p4 = sqlite3BinaryCompareCollSeq(pParse, pRight, pLeft); + }else{ + p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + } + p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); + addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, + (void*)p4, P4_COLLSEQ); + sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5); + return addr; +} + +/* +** Return true if expression pExpr is a vector, or false otherwise. +** +** A vector is defined as any expression that results in two or more +** columns of result. Every TK_VECTOR node is an vector because the +** parser will not generate a TK_VECTOR with fewer than two entries. +** But a TK_SELECT might be either a vector or a scalar. It is only +** considered a vector if it has two or more result columns. +*/ +SQLITE_PRIVATE int sqlite3ExprIsVector(const Expr *pExpr){ + return sqlite3ExprVectorSize(pExpr)>1; +} + +/* +** If the expression passed as the only argument is of type TK_VECTOR +** return the number of expressions in the vector. Or, if the expression +** is a sub-select, return the number of columns in the sub-select. For +** any other type of expression, return 1. +*/ +SQLITE_PRIVATE int sqlite3ExprVectorSize(const Expr *pExpr){ + u8 op = pExpr->op; + if( op==TK_REGISTER ) op = pExpr->op2; + if( op==TK_VECTOR ){ + assert( ExprUseXList(pExpr) ); + return pExpr->x.pList->nExpr; + }else if( op==TK_SELECT ){ + assert( ExprUseXSelect(pExpr) ); + return pExpr->x.pSelect->pEList->nExpr; + }else{ + return 1; + } +} + +/* +** Return a pointer to a subexpression of pVector that is the i-th +** column of the vector (numbered starting with 0). The caller must +** ensure that i is within range. +** +** If pVector is really a scalar (and "scalar" here includes subqueries +** that return a single column!) then return pVector unmodified. +** +** pVector retains ownership of the returned subexpression. +** +** If the vector is a (SELECT ...) then the expression returned is +** just the expression for the i-th term of the result set, and may +** not be ready for evaluation because the table cursor has not yet +** been positioned. +*/ +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ + assert( iop==TK_ERROR ); + if( sqlite3ExprIsVector(pVector) ){ + assert( pVector->op2==0 || pVector->op==TK_REGISTER ); + if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){ + assert( ExprUseXSelect(pVector) ); + return pVector->x.pSelect->pEList->a[i].pExpr; + }else{ + assert( ExprUseXList(pVector) ); + return pVector->x.pList->a[i].pExpr; + } + } + return pVector; +} + +/* +** Compute and return a new Expr object which when passed to +** sqlite3ExprCode() will generate all necessary code to compute +** the iField-th column of the vector expression pVector. +** +** It is ok for pVector to be a scalar (as long as iField==0). +** In that case, this routine works like sqlite3ExprDup(). +** +** The caller owns the returned Expr object and is responsible for +** ensuring that the returned value eventually gets freed. +** +** The caller retains ownership of pVector. If pVector is a TK_SELECT, +** then the returned object will reference pVector and so pVector must remain +** valid for the life of the returned object. If pVector is a TK_VECTOR +** or a scalar expression, then it can be deleted as soon as this routine +** returns. +** +** A trick to cause a TK_SELECT pVector to be deleted together with +** the returned Expr object is to attach the pVector to the pRight field +** of the returned TK_SELECT_COLUMN Expr object. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( + Parse *pParse, /* Parsing context */ + Expr *pVector, /* The vector. List of expressions or a sub-SELECT */ + int iField, /* Which column of the vector to return */ + int nField /* Total number of columns in the vector */ +){ + Expr *pRet; + if( pVector->op==TK_SELECT ){ + assert( ExprUseXSelect(pVector) ); + /* The TK_SELECT_COLUMN Expr node: + ** + ** pLeft: pVector containing TK_SELECT. Not deleted. + ** pRight: not used. But recursively deleted. + ** iColumn: Index of a column in pVector + ** iTable: 0 or the number of columns on the LHS of an assignment + ** pLeft->iTable: First in an array of register holding result, or 0 + ** if the result is not yet computed. + ** + ** sqlite3ExprDelete() specifically skips the recursive delete of + ** pLeft on TK_SELECT_COLUMN nodes. But pRight is followed, so pVector + ** can be attached to pRight to cause this node to take ownership of + ** pVector. Typically there will be multiple TK_SELECT_COLUMN nodes + ** with the same pLeft pointer to the pVector, but only one of them + ** will own the pVector. + */ + pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); + if( pRet ){ + pRet->iTable = nField; + pRet->iColumn = iField; + pRet->pLeft = pVector; + } + }else{ + if( pVector->op==TK_VECTOR ){ + Expr **ppVector; + assert( ExprUseXList(pVector) ); + ppVector = &pVector->x.pList->a[iField].pExpr; + pVector = *ppVector; + if( IN_RENAME_OBJECT ){ + /* This must be a vector UPDATE inside a trigger */ + *ppVector = 0; + return pVector; + } + } + pRet = sqlite3ExprDup(pParse->db, pVector, 0); + } + return pRet; +} + +/* +** If expression pExpr is of type TK_SELECT, generate code to evaluate +** it. Return the register in which the result is stored (or, if the +** sub-select returns more than one column, the first in an array +** of registers in which the result is stored). +** +** If pExpr is not a TK_SELECT expression, return 0. +*/ +static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ + int reg = 0; +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->op==TK_SELECT ){ + reg = sqlite3CodeSubselect(pParse, pExpr); + } +#endif + return reg; +} + +/* +** Argument pVector points to a vector expression - either a TK_VECTOR +** or TK_SELECT that returns more than one column. This function returns +** the register number of a register that contains the value of +** element iField of the vector. +** +** If pVector is a TK_SELECT expression, then code for it must have +** already been generated using the exprCodeSubselect() routine. In this +** case parameter regSelect should be the first in an array of registers +** containing the results of the sub-select. +** +** If pVector is of type TK_VECTOR, then code for the requested field +** is generated. In this case (*pRegFree) may be set to the number of +** a temporary register to be freed by the caller before returning. +** +** Before returning, output parameter (*ppExpr) is set to point to the +** Expr object corresponding to element iElem of the vector. +*/ +static int exprVectorRegister( + Parse *pParse, /* Parse context */ + Expr *pVector, /* Vector to extract element from */ + int iField, /* Field to extract from pVector */ + int regSelect, /* First in array of registers */ + Expr **ppExpr, /* OUT: Expression element */ + int *pRegFree /* OUT: Temp register to free */ +){ + u8 op = pVector->op; + assert( op==TK_VECTOR || op==TK_REGISTER || op==TK_SELECT || op==TK_ERROR ); + if( op==TK_REGISTER ){ + *ppExpr = sqlite3VectorFieldSubexpr(pVector, iField); + return pVector->iTable+iField; + } + if( op==TK_SELECT ){ + assert( ExprUseXSelect(pVector) ); + *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; + return regSelect+iField; + } + if( op==TK_VECTOR ){ + assert( ExprUseXList(pVector) ); + *ppExpr = pVector->x.pList->a[iField].pExpr; + return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); + } + return 0; +} + +/* +** Expression pExpr is a comparison between two vector values. Compute +** the result of the comparison (1, 0, or NULL) and write that +** result into register dest. +** +** The caller must satisfy the following preconditions: +** +** if pExpr->op==TK_IS: op==TK_EQ and p5==SQLITE_NULLEQ +** if pExpr->op==TK_ISNOT: op==TK_NE and p5==SQLITE_NULLEQ +** otherwise: op==pExpr->op and p5==0 +*/ +static void codeVectorCompare( + Parse *pParse, /* Code generator context */ + Expr *pExpr, /* The comparison operation */ + int dest, /* Write results into this register */ + u8 op, /* Comparison operator */ + u8 p5 /* SQLITE_NULLEQ or zero */ +){ + Vdbe *v = pParse->pVdbe; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + int nLeft = sqlite3ExprVectorSize(pLeft); + int i; + int regLeft = 0; + int regRight = 0; + u8 opx = op; + int addrCmp = 0; + int addrDone = sqlite3VdbeMakeLabel(pParse); + int isCommuted = ExprHasProperty(pExpr,EP_Commuted); + + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + if( pParse->nErr ) return; + if( nLeft!=sqlite3ExprVectorSize(pRight) ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return; + } + assert( pExpr->op==TK_EQ || pExpr->op==TK_NE + || pExpr->op==TK_IS || pExpr->op==TK_ISNOT + || pExpr->op==TK_LT || pExpr->op==TK_GT + || pExpr->op==TK_LE || pExpr->op==TK_GE + ); + assert( pExpr->op==op || (pExpr->op==TK_IS && op==TK_EQ) + || (pExpr->op==TK_ISNOT && op==TK_NE) ); + assert( p5==0 || pExpr->op!=op ); + assert( p5==SQLITE_NULLEQ || pExpr->op==op ); + + if( op==TK_LE ) opx = TK_LT; + if( op==TK_GE ) opx = TK_GT; + if( op==TK_NE ) opx = TK_EQ; + + regLeft = exprCodeSubselect(pParse, pLeft); + regRight = exprCodeSubselect(pParse, pRight); + + sqlite3VdbeAddOp2(v, OP_Integer, 1, dest); + for(i=0; 1 /*Loop exits by "break"*/; i++){ + int regFree1 = 0, regFree2 = 0; + Expr *pL = 0, *pR = 0; + int r1, r2; + assert( i>=0 && i0 +/* +** Check that argument nHeight is less than or equal to the maximum +** expression depth allowed. If it is not, leave an error message in +** pParse. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){ + int rc = SQLITE_OK; + int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH]; + if( nHeight>mxHeight ){ + sqlite3ErrorMsg(pParse, + "Expression tree is too large (maximum depth %d)", mxHeight + ); + rc = SQLITE_ERROR; + } + return rc; +} + +/* The following three functions, heightOfExpr(), heightOfExprList() +** and heightOfSelect(), are used to determine the maximum height +** of any expression tree referenced by the structure passed as the +** first argument. +** +** If this maximum height is greater than the current value pointed +** to by pnHeight, the second parameter, then set *pnHeight to that +** value. +*/ +static void heightOfExpr(const Expr *p, int *pnHeight){ + if( p ){ + if( p->nHeight>*pnHeight ){ + *pnHeight = p->nHeight; + } + } +} +static void heightOfExprList(const ExprList *p, int *pnHeight){ + if( p ){ + int i; + for(i=0; inExpr; i++){ + heightOfExpr(p->a[i].pExpr, pnHeight); + } + } +} +static void heightOfSelect(const Select *pSelect, int *pnHeight){ + const Select *p; + for(p=pSelect; p; p=p->pPrior){ + heightOfExpr(p->pWhere, pnHeight); + heightOfExpr(p->pHaving, pnHeight); + heightOfExpr(p->pLimit, pnHeight); + heightOfExprList(p->pEList, pnHeight); + heightOfExprList(p->pGroupBy, pnHeight); + heightOfExprList(p->pOrderBy, pnHeight); + } +} + +/* +** Set the Expr.nHeight variable in the structure passed as an +** argument. An expression with no children, Expr.pList or +** Expr.pSelect member has a height of 1. Any other expression +** has a height equal to the maximum height of any other +** referenced Expr plus one. +** +** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, +** if appropriate. +*/ +static void exprSetHeight(Expr *p){ + int nHeight = p->pLeft ? p->pLeft->nHeight : 0; + if( p->pRight && p->pRight->nHeight>nHeight ) nHeight = p->pRight->nHeight; + if( ExprUseXSelect(p) ){ + heightOfSelect(p->x.pSelect, &nHeight); + }else if( p->x.pList ){ + heightOfExprList(p->x.pList, &nHeight); + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } + p->nHeight = nHeight + 1; +} + +/* +** Set the Expr.nHeight variable using the exprSetHeight() function. If +** the height is greater than the maximum allowed expression depth, +** leave an error in pParse. +** +** Also propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( pParse->nErr ) return; + exprSetHeight(p); + sqlite3ExprCheckHeight(pParse, p->nHeight); +} + +/* +** Return the maximum height of any expression tree referenced +** by the select statement passed as an argument. +*/ +SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select *p){ + int nHeight = 0; + heightOfSelect(p, &nHeight); + return nHeight; +} +#else /* ABOVE: Height enforcement enabled. BELOW: Height enforcement off */ +/* +** Propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( pParse->nErr ) return; + if( p && ExprUseXList(p) && p->x.pList ){ + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } +} +#define exprSetHeight(y) +#endif /* SQLITE_MAX_EXPR_DEPTH>0 */ + +/* +** This routine is the core allocator for Expr nodes. +** +** Construct a new expression node and return a pointer to it. Memory +** for this node and for the pToken argument is a single allocation +** obtained from sqlite3DbMalloc(). The calling function +** is responsible for making sure the node eventually gets freed. +** +** If dequote is true, then the token (if it exists) is dequoted. +** If dequote is false, no dequoting is performed. The deQuote +** parameter is ignored if pToken is NULL or if the token does not +** appear to be quoted. If the quotes were of the form "..." (double-quotes) +** then the EP_DblQuoted flag is set on the expression node. +** +** Special case: If op==TK_INTEGER and pToken points to a string that +** can be translated into a 32-bit integer, then the token is not +** stored in u.zToken. Instead, the integer values is written +** into u.iValue and the EP_IntValue flag is set. No extra storage +** is allocated to hold the integer text and the dequote flag is ignored. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAlloc( + sqlite3 *db, /* Handle for sqlite3DbMallocRawNN() */ + int op, /* Expression opcode */ + const Token *pToken, /* Token argument. Might be NULL */ + int dequote /* True to dequote */ +){ + Expr *pNew; + int nExtra = 0; + int iValue = 0; + + assert( db!=0 ); + if( pToken ){ + if( op!=TK_INTEGER || pToken->z==0 + || sqlite3GetInt32(pToken->z, &iValue)==0 ){ + nExtra = pToken->n+1; + assert( iValue>=0 ); + } + } + pNew = sqlite3DbMallocRawNN(db, sizeof(Expr)+nExtra); + if( pNew ){ + memset(pNew, 0, sizeof(Expr)); + pNew->op = (u8)op; + pNew->iAgg = -1; + if( pToken ){ + if( nExtra==0 ){ + pNew->flags |= EP_IntValue|EP_Leaf|(iValue?EP_IsTrue:EP_IsFalse); + pNew->u.iValue = iValue; + }else{ + pNew->u.zToken = (char*)&pNew[1]; + assert( pToken->z!=0 || pToken->n==0 ); + if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); + pNew->u.zToken[pToken->n] = 0; + if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ + sqlite3DequoteExpr(pNew); + } + } + } +#if SQLITE_MAX_EXPR_DEPTH>0 + pNew->nHeight = 1; +#endif + } + return pNew; +} + +/* +** Allocate a new expression node from a zero-terminated token that has +** already been dequoted. +*/ +SQLITE_PRIVATE Expr *sqlite3Expr( + sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ + int op, /* Expression opcode */ + const char *zToken /* Token argument. Might be NULL */ +){ + Token x; + x.z = zToken; + x.n = sqlite3Strlen30(zToken); + return sqlite3ExprAlloc(db, op, &x, 0); +} + +/* +** Attach subtrees pLeft and pRight to the Expr node pRoot. +** +** If pRoot==NULL that means that a memory allocation error has occurred. +** In that case, delete the subtrees pLeft and pRight. +*/ +SQLITE_PRIVATE void sqlite3ExprAttachSubtrees( + sqlite3 *db, + Expr *pRoot, + Expr *pLeft, + Expr *pRight +){ + if( pRoot==0 ){ + assert( db->mallocFailed ); + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); + }else{ + if( pRight ){ + pRoot->pRight = pRight; + pRoot->flags |= EP_Propagate & pRight->flags; + } + if( pLeft ){ + pRoot->pLeft = pLeft; + pRoot->flags |= EP_Propagate & pLeft->flags; + } + exprSetHeight(pRoot); + } +} + +/* +** Allocate an Expr node which joins as many as two subtrees. +** +** One or both of the subtrees can be NULL. Return a pointer to the new +** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, +** free the subtrees and return NULL. +*/ +SQLITE_PRIVATE Expr *sqlite3PExpr( + Parse *pParse, /* Parsing context */ + int op, /* Expression opcode */ + Expr *pLeft, /* Left operand */ + Expr *pRight /* Right operand */ +){ + Expr *p; + p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = op & 0xff; + p->iAgg = -1; + sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); + sqlite3ExprCheckHeight(pParse, p->nHeight); + }else{ + sqlite3ExprDelete(pParse->db, pLeft); + sqlite3ExprDelete(pParse->db, pRight); + } + return p; +} + +/* +** Add pSelect to the Expr.x.pSelect field. Or, if pExpr is NULL (due +** do a memory allocation failure) then delete the pSelect object. +*/ +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ + if( pExpr ){ + pExpr->x.pSelect = pSelect; + ExprSetProperty(pExpr, EP_xIsSelect|EP_Subquery); + sqlite3ExprSetHeightAndFlags(pParse, pExpr); + }else{ + assert( pParse->db->mallocFailed ); + sqlite3SelectDelete(pParse->db, pSelect); + } +} + +/* +** Expression list pEList is a list of vector values. This function +** converts the contents of pEList to a VALUES(...) Select statement +** returning 1 row for each element of the list. For example, the +** expression list: +** +** ( (1,2), (3,4) (5,6) ) +** +** is translated to the equivalent of: +** +** VALUES(1,2), (3,4), (5,6) +** +** Each of the vector values in pEList must contain exactly nElem terms. +** If a list element that is not a vector or does not contain nElem terms, +** an error message is left in pParse. +** +** This is used as part of processing IN(...) expressions with a list +** of vectors on the RHS. e.g. "... IN ((1,2), (3,4), (5,6))". +*/ +SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprList *pEList){ + int ii; + Select *pRet = 0; + assert( nElem>1 ); + for(ii=0; iinExpr; ii++){ + Select *pSel; + Expr *pExpr = pEList->a[ii].pExpr; + int nExprElem; + if( pExpr->op==TK_VECTOR ){ + assert( ExprUseXList(pExpr) ); + nExprElem = pExpr->x.pList->nExpr; + }else{ + nExprElem = 1; + } + if( nExprElem!=nElem ){ + sqlite3ErrorMsg(pParse, "IN(...) element has %d term%s - expected %d", + nExprElem, nExprElem>1?"s":"", nElem + ); + break; + } + assert( ExprUseXList(pExpr) ); + pSel = sqlite3SelectNew(pParse, pExpr->x.pList, 0, 0, 0, 0, 0, SF_Values,0); + pExpr->x.pList = 0; + if( pSel ){ + if( pRet ){ + pSel->op = TK_ALL; + pSel->pPrior = pRet; + } + pRet = pSel; + } + } + + if( pRet && pRet->pPrior ){ + pRet->selFlags |= SF_MultiValue; + } + sqlite3ExprListDelete(pParse->db, pEList); + return pRet; +} + +/* +** Join two expressions using an AND operator. If either expression is +** NULL, then just return the other expression. +** +** If one side or the other of the AND is known to be false, then instead +** of returning an AND expression, just return a constant expression with +** a value of false. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ + sqlite3 *db = pParse->db; + if( pLeft==0 ){ + return pRight; + }else if( pRight==0 ){ + return pLeft; + }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) + && !IN_RENAME_OBJECT + ){ + sqlite3ExprDeferredDelete(pParse, pLeft); + sqlite3ExprDeferredDelete(pParse, pRight); + return sqlite3Expr(db, TK_INTEGER, "0"); + }else{ + return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); + } +} + +/* +** Construct a new expression node for a function with multiple +** arguments. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprFunction( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* Argument list */ + const Token *pToken, /* Name of the function */ + int eDistinct /* SF_Distinct or SF_ALL or 0 */ +){ + Expr *pNew; + sqlite3 *db = pParse->db; + assert( pToken ); + pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ + return 0; + } + assert( !ExprHasProperty(pNew, EP_InnerON|EP_OuterON) ); + pNew->w.iOfst = (int)(pToken->z - pParse->zTail); + if( pList + && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] + && !pParse->nested + ){ + sqlite3ErrorMsg(pParse, "too many arguments on function %T", pToken); + } + pNew->x.pList = pList; + ExprSetProperty(pNew, EP_HasFunc); + assert( ExprUseXList(pNew) ); + sqlite3ExprSetHeightAndFlags(pParse, pNew); + if( eDistinct==SF_Distinct ) ExprSetProperty(pNew, EP_Distinct); + return pNew; +} + +/* +** Check to see if a function is usable according to current access +** rules: +** +** SQLITE_FUNC_DIRECT - Only usable from top-level SQL +** +** SQLITE_FUNC_UNSAFE - Usable if TRUSTED_SCHEMA or from +** top-level SQL +** +** If the function is not usable, create an error. +*/ +SQLITE_PRIVATE void sqlite3ExprFunctionUsable( + Parse *pParse, /* Parsing and code generating context */ + const Expr *pExpr, /* The function invocation */ + const FuncDef *pDef /* The function being invoked */ +){ + assert( !IN_RENAME_OBJECT ); + assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 ); + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 + || (pParse->db->flags & SQLITE_TrustedSchema)==0 + ){ + /* Functions prohibited in triggers and views if: + ** (1) tagged with SQLITE_DIRECTONLY + ** (2) not tagged with SQLITE_INNOCUOUS (which means it + ** is tagged with SQLITE_FUNC_UNSAFE) and + ** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning + ** that the schema is possibly tainted). + */ + sqlite3ErrorMsg(pParse, "unsafe use of %#T()", pExpr); + } + } +} + +/* +** Assign a variable number to an expression that encodes a wildcard +** in the original SQL statement. +** +** Wildcards consisting of a single "?" are assigned the next sequential +** variable number. +** +** Wildcards of the form "?nnn" are assigned the number "nnn". We make +** sure "nnn" is not too big to avoid a denial of service attack when +** the SQL statement comes from an external source. +** +** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number +** as the previous instance of the same wildcard. Or if this is the first +** instance of the wildcard, the next sequential variable number is +** assigned. +*/ +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ + sqlite3 *db = pParse->db; + const char *z; + ynVar x; + + if( pExpr==0 ) return; + assert( !ExprHasProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); + z = pExpr->u.zToken; + assert( z!=0 ); + assert( z[0]!=0 ); + assert( n==(u32)sqlite3Strlen30(z) ); + if( z[1]==0 ){ + /* Wildcard of the form "?". Assign the next variable number */ + assert( z[0]=='?' ); + x = (ynVar)(++pParse->nVar); + }else{ + int doAdd = 0; + if( z[0]=='?' ){ + /* Wildcard of the form "?nnn". Convert "nnn" to an integer and + ** use it as the variable number */ + i64 i; + int bOk; + if( n==2 ){ /*OPTIMIZATION-IF-TRUE*/ + i = z[1]-'0'; /* The common case of ?N for a single digit N */ + bOk = 1; + }else{ + bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8); + } + testcase( i==0 ); + testcase( i==1 ); + testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 ); + testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ); + if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", + db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); + return; + } + x = (ynVar)i; + if( x>pParse->nVar ){ + pParse->nVar = (int)x; + doAdd = 1; + }else if( sqlite3VListNumToName(pParse->pVList, x)==0 ){ + doAdd = 1; + } + }else{ + /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable + ** number as the prior appearance of the same name, or if the name + ** has never appeared before, reuse the same variable number + */ + x = (ynVar)sqlite3VListNameToNum(pParse->pVList, z, n); + if( x==0 ){ + x = (ynVar)(++pParse->nVar); + doAdd = 1; + } + } + if( doAdd ){ + pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); + } + } + pExpr->iColumn = x; + if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + sqlite3ErrorMsg(pParse, "too many SQL variables"); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); + } +} + +/* +** Recursively delete an expression tree. +*/ +static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ + assert( p!=0 ); + assert( !ExprUseUValue(p) || p->u.iValue>=0 ); + assert( !ExprUseYWin(p) || !ExprUseYSub(p) ); + assert( !ExprUseYWin(p) || p->y.pWin!=0 || db->mallocFailed ); + assert( p->op!=TK_FUNCTION || !ExprUseYSub(p) ); +#ifdef SQLITE_DEBUG + if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ + assert( p->pLeft==0 ); + assert( p->pRight==0 ); + assert( !ExprUseXSelect(p) || p->x.pSelect==0 ); + assert( !ExprUseXList(p) || p->x.pList==0 ); + } +#endif + if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( (ExprUseXList(p) && p->x.pList==0) || p->pRight==0 ); + if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); + if( p->pRight ){ + assert( !ExprHasProperty(p, EP_WinFunc) ); + sqlite3ExprDeleteNN(db, p->pRight); + }else if( ExprUseXSelect(p) ){ + assert( !ExprHasProperty(p, EP_WinFunc) ); + sqlite3SelectDelete(db, p->x.pSelect); + }else{ + sqlite3ExprListDelete(db, p->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(p, EP_WinFunc) ){ + sqlite3WindowDelete(db, p->y.pWin); + } +#endif + } + } + if( ExprHasProperty(p, EP_MemToken) ){ + assert( !ExprHasProperty(p, EP_IntValue) ); + sqlite3DbFree(db, p->u.zToken); + } + if( !ExprHasProperty(p, EP_Static) ){ + sqlite3DbFreeNN(db, p); + } +} +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ + if( p ) sqlite3ExprDeleteNN(db, p); +} + +/* +** Clear both elements of an OnOrUsing object +*/ +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){ + if( p==0 ){ + /* Nothing to clear */ + }else if( p->pOn ){ + sqlite3ExprDeleteNN(db, p->pOn); + }else if( p->pUsing ){ + sqlite3IdListDelete(db, p->pUsing); + } +} + +/* +** Arrange to cause pExpr to be deleted when the pParse is deleted. +** This is similar to sqlite3ExprDelete() except that the delete is +** deferred untilthe pParse is deleted. +** +** The pExpr might be deleted immediately on an OOM error. +** +** The deferred delete is (currently) implemented by adding the +** pExpr to the pParse->pConstExpr list with a register number of 0. +*/ +SQLITE_PRIVATE void sqlite3ExprDeferredDelete(Parse *pParse, Expr *pExpr){ + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); +} + +/* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the +** expression. +*/ +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ + if( p ){ + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, p); + } + sqlite3ExprDeleteNN(pParse->db, p); + } +} + +/* +** Return the number of bytes allocated for the expression structure +** passed as the first argument. This is always one of EXPR_FULLSIZE, +** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. +*/ +static int exprStructSize(const Expr *p){ + if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; + if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; + return EXPR_FULLSIZE; +} + +/* +** The dupedExpr*Size() routines each return the number of bytes required +** to store a copy of an expression or expression tree. They differ in +** how much of the tree is measured. +** +** dupedExprStructSize() Size of only the Expr structure +** dupedExprNodeSize() Size of Expr + space for token +** dupedExprSize() Expr + token + subtree components +** +*************************************************************************** +** +** The dupedExprStructSize() function returns two values OR-ed together: +** (1) the space required for a copy of the Expr structure only and +** (2) the EP_xxx flags that indicate what the structure size should be. +** The return values is always one of: +** +** EXPR_FULLSIZE +** EXPR_REDUCEDSIZE | EP_Reduced +** EXPR_TOKENONLYSIZE | EP_TokenOnly +** +** The size of the structure can be found by masking the return value +** of this routine with 0xfff. The flags can be found by masking the +** return value with EP_Reduced|EP_TokenOnly. +** +** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size +** (unreduced) Expr objects as they or originally constructed by the parser. +** During expression analysis, extra information is computed and moved into +** later parts of the Expr object and that extra information might get chopped +** off if the expression is reduced. Note also that it does not work to +** make an EXPRDUP_REDUCE copy of a reduced expression. It is only legal +** to reduce a pristine expression tree from the parser. The implementation +** of dupedExprStructSize() contain multiple assert() statements that attempt +** to enforce this constraint. +*/ +static int dupedExprStructSize(const Expr *p, int flags){ + int nSize; + assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ + assert( EXPR_FULLSIZE<=0xfff ); + assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); + if( 0==flags || p->op==TK_SELECT_COLUMN +#ifndef SQLITE_OMIT_WINDOWFUNC + || ExprHasProperty(p, EP_WinFunc) +#endif + ){ + nSize = EXPR_FULLSIZE; + }else{ + assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); + assert( !ExprHasProperty(p, EP_OuterON) ); + assert( !ExprHasProperty(p, EP_MemToken) ); + assert( !ExprHasVVAProperty(p, EP_NoReduce) ); + if( p->pLeft || p->x.pList ){ + nSize = EXPR_REDUCEDSIZE | EP_Reduced; + }else{ + assert( p->pRight==0 ); + nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly; + } + } + return nSize; +} + +/* +** This function returns the space in bytes required to store the copy +** of the Expr structure and a copy of the Expr.u.zToken string (if that +** string is defined.) +*/ +static int dupedExprNodeSize(const Expr *p, int flags){ + int nByte = dupedExprStructSize(p, flags) & 0xfff; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nByte += sqlite3Strlen30NN(p->u.zToken)+1; + } + return ROUND8(nByte); +} + +/* +** Return the number of bytes required to create a duplicate of the +** expression passed as the first argument. The second argument is a +** mask containing EXPRDUP_XXX flags. +** +** The value returned includes space to create a copy of the Expr struct +** itself and the buffer referred to by Expr.u.zToken, if any. +** +** If the EXPRDUP_REDUCE flag is set, then the return value includes +** space to duplicate all Expr nodes in the tree formed by Expr.pLeft +** and Expr.pRight variables (but not for any structures pointed to or +** descended from the Expr.x.pList or Expr.x.pSelect variables). +*/ +static int dupedExprSize(const Expr *p, int flags){ + int nByte = 0; + if( p ){ + nByte = dupedExprNodeSize(p, flags); + if( flags&EXPRDUP_REDUCE ){ + nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags); + } + } + return nByte; +} + +/* +** This function is similar to sqlite3ExprDup(), except that if pzBuffer +** is not NULL then *pzBuffer is assumed to point to a buffer large enough +** to store the copy of expression p, the copies of p->u.zToken +** (if applicable), and the copies of the p->pLeft and p->pRight expressions, +** if any. Before returning, *pzBuffer is set to the first byte past the +** portion of the buffer copied into by this function. +*/ +static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ + Expr *pNew; /* Value to return */ + u8 *zAlloc; /* Memory space from which to build Expr object */ + u32 staticFlag; /* EP_Static if space not obtained from malloc */ + + assert( db!=0 ); + assert( p ); + assert( dupFlags==0 || dupFlags==EXPRDUP_REDUCE ); + assert( pzBuffer==0 || dupFlags==EXPRDUP_REDUCE ); + + /* Figure out where to write the new Expr structure. */ + if( pzBuffer ){ + zAlloc = *pzBuffer; + staticFlag = EP_Static; + assert( zAlloc!=0 ); + }else{ + zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)); + staticFlag = 0; + } + pNew = (Expr *)zAlloc; + + if( pNew ){ + /* Set nNewSize to the size allocated for the structure pointed to + ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or + ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed + ** by the copy of the p->u.zToken string (if any). + */ + const unsigned nStructSize = dupedExprStructSize(p, dupFlags); + const int nNewSize = nStructSize & 0xfff; + int nToken; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30(p->u.zToken) + 1; + }else{ + nToken = 0; + } + if( dupFlags ){ + assert( ExprHasProperty(p, EP_Reduced)==0 ); + memcpy(zAlloc, p, nNewSize); + }else{ + u32 nSize = (u32)exprStructSize(p); + memcpy(zAlloc, p, nSize); + if( nSizeflags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); + pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); + pNew->flags |= staticFlag; + ExprClearVVAProperties(pNew); + if( dupFlags ){ + ExprSetVVAProperty(pNew, EP_Immutable); + } + + /* Copy the p->u.zToken string, if any. */ + if( nToken ){ + char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; + memcpy(zToken, p->u.zToken, nToken); + } + + if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){ + /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ + if( ExprUseXSelect(p) ){ + pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); + }else{ + pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags); + } + } + + /* Fill in pNew->pLeft and pNew->pRight. */ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ + zAlloc += dupedExprNodeSize(p, dupFlags); + if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ + pNew->pLeft = p->pLeft ? + exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; + pNew->pRight = p->pRight ? + exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(p, EP_WinFunc) ){ + pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); + assert( ExprHasProperty(pNew, EP_WinFunc) ); + } +#endif /* SQLITE_OMIT_WINDOWFUNC */ + if( pzBuffer ){ + *pzBuffer = zAlloc; + } + }else{ + if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + if( pNew->op==TK_SELECT_COLUMN ){ + pNew->pLeft = p->pLeft; + assert( p->pRight==0 || p->pRight==p->pLeft + || ExprHasProperty(p->pLeft, EP_Subquery) ); + }else{ + pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); + } + pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); + } + } + } + return pNew; +} + +/* +** Create and return a deep copy of the object passed as the second +** argument. If an OOM condition is encountered, NULL is returned +** and the db->mallocFailed flag set. +*/ +#ifndef SQLITE_OMIT_CTE +SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p){ + With *pRet = 0; + if( p ){ + sqlite3_int64 nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); + pRet = sqlite3DbMallocZero(db, nByte); + if( pRet ){ + int i; + pRet->nCte = p->nCte; + for(i=0; inCte; i++){ + pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0); + pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0); + pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName); + pRet->a[i].eM10d = p->a[i].eM10d; + } + } + } + return pRet; +} +#else +# define sqlite3WithDup(x,y) 0 +#endif + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ + Select *pSelect = pWalker->u.pSelect; + Window *pWin = pExpr->y.pWin; + assert( pWin ); + assert( IsWindowFunc(pExpr) ); + assert( pWin->ppThis==0 ); + sqlite3WindowLink(pSelect, pWin); + } + return WRC_Continue; +} +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; + w.pParse = 0; + w.u.pSelect = p; + sqlite3WalkSelect(&w, p); +} +#endif + + +/* +** The following group of routines make deep copies of expressions, +** expression lists, ID lists, and select statements. The copies can +** be deleted (by being passed to their respective ...Delete() routines) +** without effecting the originals. +** +** The expression list, ID, and source lists return by sqlite3ExprListDup(), +** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded +** by subsequent calls to sqlite*ListAppend() routines. +** +** Any tables that the SrcList might point to are not duplicated. +** +** The flags parameter contains a combination of the EXPRDUP_XXX flags. +** If the EXPRDUP_REDUCE flag is set, then the structure returned is a +** truncated version of the usual Expr structure that will be stored as +** part of the in-memory representation of the database schema. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, const Expr *p, int flags){ + assert( flags==0 || flags==EXPRDUP_REDUCE ); + return p ? exprDup(db, p, flags, 0) : 0; +} +SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){ + ExprList *pNew; + struct ExprList_item *pItem; + const struct ExprList_item *pOldItem; + int i; + Expr *pPriorSelectColOld = 0; + Expr *pPriorSelectColNew = 0; + assert( db!=0 ); + if( p==0 ) return 0; + pNew = sqlite3DbMallocRawNN(db, sqlite3DbMallocSize(db, p)); + if( pNew==0 ) return 0; + pNew->nExpr = p->nExpr; + pNew->nAlloc = p->nAlloc; + pItem = pNew->a; + pOldItem = p->a; + for(i=0; inExpr; i++, pItem++, pOldItem++){ + Expr *pOldExpr = pOldItem->pExpr; + Expr *pNewExpr; + pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); + if( pOldExpr + && pOldExpr->op==TK_SELECT_COLUMN + && (pNewExpr = pItem->pExpr)!=0 + ){ + if( pNewExpr->pRight ){ + pPriorSelectColOld = pOldExpr->pRight; + pPriorSelectColNew = pNewExpr->pRight; + pNewExpr->pLeft = pNewExpr->pRight; + }else{ + if( pOldExpr->pLeft!=pPriorSelectColOld ){ + pPriorSelectColOld = pOldExpr->pLeft; + pPriorSelectColNew = sqlite3ExprDup(db, pPriorSelectColOld, flags); + pNewExpr->pRight = pPriorSelectColNew; + } + pNewExpr->pLeft = pPriorSelectColNew; + } + } + pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); + pItem->fg = pOldItem->fg; + pItem->fg.done = 0; + pItem->u = pOldItem->u; + } + return pNew; +} + +/* +** If cursors, triggers, views and subqueries are all omitted from +** the build, then none of the following routines, except for +** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes +** called with a NULL argument. +*/ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ + || !defined(SQLITE_OMIT_SUBQUERY) +SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int flags){ + SrcList *pNew; + int i; + int nByte; + assert( db!=0 ); + if( p==0 ) return 0; + nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); + pNew = sqlite3DbMallocRawNN(db, nByte ); + if( pNew==0 ) return 0; + pNew->nSrc = pNew->nAlloc = p->nSrc; + for(i=0; inSrc; i++){ + SrcItem *pNewItem = &pNew->a[i]; + const SrcItem *pOldItem = &p->a[i]; + Table *pTab; + pNewItem->pSchema = pOldItem->pSchema; + pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); + pNewItem->fg = pOldItem->fg; + pNewItem->iCursor = pOldItem->iCursor; + pNewItem->addrFillSub = pOldItem->addrFillSub; + pNewItem->regReturn = pOldItem->regReturn; + if( pNewItem->fg.isIndexedBy ){ + pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); + } + pNewItem->u2 = pOldItem->u2; + if( pNewItem->fg.isCte ){ + pNewItem->u2.pCteUse->nUse++; + } + if( pNewItem->fg.isTabFunc ){ + pNewItem->u1.pFuncArg = + sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); + } + pTab = pNewItem->pTab = pOldItem->pTab; + if( pTab ){ + pTab->nTabRef++; + } + pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); + if( pOldItem->fg.isUsing ){ + assert( pNewItem->fg.isUsing ); + pNewItem->u3.pUsing = sqlite3IdListDup(db, pOldItem->u3.pUsing); + }else{ + pNewItem->u3.pOn = sqlite3ExprDup(db, pOldItem->u3.pOn, flags); + } + pNewItem->colUsed = pOldItem->colUsed; + } + return pNew; +} +SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){ + IdList *pNew; + int i; + assert( db!=0 ); + if( p==0 ) return 0; + assert( p->eU4!=EU4_EXPR ); + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew)+(p->nId-1)*sizeof(p->a[0]) ); + if( pNew==0 ) return 0; + pNew->nId = p->nId; + pNew->eU4 = p->eU4; + for(i=0; inId; i++){ + struct IdList_item *pNewItem = &pNew->a[i]; + const struct IdList_item *pOldItem = &p->a[i]; + pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pNewItem->u4 = pOldItem->u4; + } + return pNew; +} +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int flags){ + Select *pRet = 0; + Select *pNext = 0; + Select **pp = &pRet; + const Select *p; + + assert( db!=0 ); + for(p=pDup; p; p=p->pPrior){ + Select *pNew = sqlite3DbMallocRawNN(db, sizeof(*p) ); + if( pNew==0 ) break; + pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); + pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); + pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); + pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); + pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); + pNew->op = p->op; + pNew->pNext = pNext; + pNew->pPrior = 0; + pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); + pNew->iLimit = 0; + pNew->iOffset = 0; + pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = p->nSelectRow; + pNew->pWith = sqlite3WithDup(db, p->pWith); +#ifndef SQLITE_OMIT_WINDOWFUNC + pNew->pWin = 0; + pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); +#endif + pNew->selId = p->selId; + if( db->mallocFailed ){ + /* Any prior OOM might have left the Select object incomplete. + ** Delete the whole thing rather than allow an incomplete Select + ** to be used by the code generator. */ + pNew->pNext = 0; + sqlite3SelectDelete(db, pNew); + break; + } + *pp = pNew; + pp = &pNew->pPrior; + pNext = pNew; + } + + return pRet; +} +#else +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags){ + assert( p==0 ); + return 0; +} +#endif + + +/* +** Add a new element to the end of an expression list. If pList is +** initially NULL, then create a new expression list. +** +** The pList argument must be either NULL or a pointer to an ExprList +** obtained from a prior call to sqlite3ExprListAppend(). This routine +** may not be used with an ExprList obtained from sqlite3ExprListDup(). +** Reason: This routine assumes that the number of slots in pList->a[] +** is a power of two. That is true for sqlite3ExprListAppend() returns +** but is not necessarily true from the return value of sqlite3ExprListDup(). +** +** If a memory allocation error occurs, the entire list is freed and +** NULL is returned. If non-NULL is returned, then it is guaranteed +** that the new entry was successfully appended. +*/ +static const struct ExprList_item zeroItem = {0}; +SQLITE_PRIVATE SQLITE_NOINLINE ExprList *sqlite3ExprListAppendNew( + sqlite3 *db, /* Database handle. Used for memory allocation */ + Expr *pExpr /* Expression to be appended. Might be NULL */ +){ + struct ExprList_item *pItem; + ExprList *pList; + + pList = sqlite3DbMallocRawNN(db, sizeof(ExprList)+sizeof(pList->a[0])*4 ); + if( pList==0 ){ + sqlite3ExprDelete(db, pExpr); + return 0; + } + pList->nAlloc = 4; + pList->nExpr = 1; + pItem = &pList->a[0]; + *pItem = zeroItem; + pItem->pExpr = pExpr; + return pList; +} +SQLITE_PRIVATE SQLITE_NOINLINE ExprList *sqlite3ExprListAppendGrow( + sqlite3 *db, /* Database handle. Used for memory allocation */ + ExprList *pList, /* List to which to append. Might be NULL */ + Expr *pExpr /* Expression to be appended. Might be NULL */ +){ + struct ExprList_item *pItem; + ExprList *pNew; + pList->nAlloc *= 2; + pNew = sqlite3DbRealloc(db, pList, + sizeof(*pList)+(pList->nAlloc-1)*sizeof(pList->a[0])); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pList); + sqlite3ExprDelete(db, pExpr); + return 0; + }else{ + pList = pNew; + } + pItem = &pList->a[pList->nExpr++]; + *pItem = zeroItem; + pItem->pExpr = pExpr; + return pList; +} +SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + Expr *pExpr /* Expression to be appended. Might be NULL */ +){ + struct ExprList_item *pItem; + if( pList==0 ){ + return sqlite3ExprListAppendNew(pParse->db,pExpr); + } + if( pList->nAllocnExpr+1 ){ + return sqlite3ExprListAppendGrow(pParse->db,pList,pExpr); + } + pItem = &pList->a[pList->nExpr++]; + *pItem = zeroItem; + pItem->pExpr = pExpr; + return pList; +} + +/* +** pColumns and pExpr form a vector assignment which is part of the SET +** clause of an UPDATE statement. Like this: +** +** (a,b,c) = (expr1,expr2,expr3) +** Or: (a,b,c) = (SELECT x,y,z FROM ....) +** +** For each term of the vector assignment, append new entries to the +** expression list pList. In the case of a subquery on the RHS, append +** TK_SELECT_COLUMN expressions. +*/ +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + IdList *pColumns, /* List of names of LHS of the assignment */ + Expr *pExpr /* Vector expression to be appended. Might be NULL */ +){ + sqlite3 *db = pParse->db; + int n; + int i; + int iFirst = pList ? pList->nExpr : 0; + /* pColumns can only be NULL due to an OOM but an OOM will cause an + ** exit prior to this routine being invoked */ + if( NEVER(pColumns==0) ) goto vector_append_error; + if( pExpr==0 ) goto vector_append_error; + + /* If the RHS is a vector, then we can immediately check to see that + ** the size of the RHS and LHS match. But if the RHS is a SELECT, + ** wildcards ("*") in the result set of the SELECT must be expanded before + ** we can do the size check, so defer the size check until code generation. + */ + if( pExpr->op!=TK_SELECT && pColumns->nId!=(n=sqlite3ExprVectorSize(pExpr)) ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pColumns->nId, n); + goto vector_append_error; + } + + for(i=0; inId; i++){ + Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i, pColumns->nId); + assert( pSubExpr!=0 || db->mallocFailed ); + if( pSubExpr==0 ) continue; + pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); + if( pList ){ + assert( pList->nExpr==iFirst+i+1 ); + pList->a[pList->nExpr-1].zEName = pColumns->a[i].zName; + pColumns->a[i].zName = 0; + } + } + + if( !db->mallocFailed && pExpr->op==TK_SELECT && ALWAYS(pList!=0) ){ + Expr *pFirst = pList->a[iFirst].pExpr; + assert( pFirst!=0 ); + assert( pFirst->op==TK_SELECT_COLUMN ); + + /* Store the SELECT statement in pRight so it will be deleted when + ** sqlite3ExprListDelete() is called */ + pFirst->pRight = pExpr; + pExpr = 0; + + /* Remember the size of the LHS in iTable so that we can check that + ** the RHS and LHS sizes match during code generation. */ + pFirst->iTable = pColumns->nId; + } + +vector_append_error: + sqlite3ExprUnmapAndDelete(pParse, pExpr); + sqlite3IdListDelete(db, pColumns); + return pList; +} + +/* +** Set the sort order for the last element on the given ExprList. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ + struct ExprList_item *pItem; + if( p==0 ) return; + assert( p->nExpr>0 ); + + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC==0 && SQLITE_SO_DESC>0 ); + assert( iSortOrder==SQLITE_SO_UNDEFINED + || iSortOrder==SQLITE_SO_ASC + || iSortOrder==SQLITE_SO_DESC + ); + assert( eNulls==SQLITE_SO_UNDEFINED + || eNulls==SQLITE_SO_ASC + || eNulls==SQLITE_SO_DESC + ); + + pItem = &p->a[p->nExpr-1]; + assert( pItem->fg.bNulls==0 ); + if( iSortOrder==SQLITE_SO_UNDEFINED ){ + iSortOrder = SQLITE_SO_ASC; + } + pItem->fg.sortFlags = (u8)iSortOrder; + + if( eNulls!=SQLITE_SO_UNDEFINED ){ + pItem->fg.bNulls = 1; + if( iSortOrder!=eNulls ){ + pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL; + } + } +} + +/* +** Set the ExprList.a[].zEName element of the most recently added item +** on the expression list. +** +** pList might be NULL following an OOM error. But pName should never be +** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag +** is set. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetName( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to add the span. */ + const Token *pName, /* Name to be added */ + int dequote /* True to cause the name to be dequoted */ +){ + assert( pList!=0 || pParse->db->mallocFailed!=0 ); + assert( pParse->eParseMode!=PARSE_MODE_UNMAP || dequote==0 ); + if( pList ){ + struct ExprList_item *pItem; + assert( pList->nExpr>0 ); + pItem = &pList->a[pList->nExpr-1]; + assert( pItem->zEName==0 ); + assert( pItem->fg.eEName==ENAME_NAME ); + pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); + if( dequote ){ + /* If dequote==0, then pName->z does not point to part of a DDL + ** statement handled by the parser. And so no token need be added + ** to the token-map. */ + sqlite3Dequote(pItem->zEName); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (const void*)pItem->zEName, pName); + } + } + } +} + +/* +** Set the ExprList.a[].zSpan element of the most recently added item +** on the expression list. +** +** pList might be NULL following an OOM error. But pSpan should never be +** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag +** is set. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSpan( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to add the span. */ + const char *zStart, /* Start of the span */ + const char *zEnd /* End of the span */ +){ + sqlite3 *db = pParse->db; + assert( pList!=0 || db->mallocFailed!=0 ); + if( pList ){ + struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; + assert( pList->nExpr>0 ); + if( pItem->zEName==0 ){ + pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); + pItem->fg.eEName = ENAME_SPAN; + } + } +} + +/* +** If the expression list pEList contains more than iLimit elements, +** leave an error message in pParse. +*/ +SQLITE_PRIVATE void sqlite3ExprListCheckLength( + Parse *pParse, + ExprList *pEList, + const char *zObject +){ + int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN]; + testcase( pEList && pEList->nExpr==mx ); + testcase( pEList && pEList->nExpr==mx+1 ); + if( pEList && pEList->nExpr>mx ){ + sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); + } +} + +/* +** Delete an entire expression list. +*/ +static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ + int i = pList->nExpr; + struct ExprList_item *pItem = pList->a; + assert( pList->nExpr>0 ); + do{ + sqlite3ExprDelete(db, pItem->pExpr); + sqlite3DbFree(db, pItem->zEName); + pItem++; + }while( --i>0 ); + sqlite3DbFreeNN(db, pList); +} +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ + if( pList ) exprListDeleteNN(db, pList); +} + +/* +** Return the bitwise-OR of all Expr.flags fields in the given +** ExprList. +*/ +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList *pList){ + int i; + u32 m = 0; + assert( pList!=0 ); + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + m |= pExpr->flags; + } + return m; +} + +/* +** This is a SELECT-node callback for the expression walker that +** always "fails". By "fail" in this case, we mean set +** pWalker->eCode to zero and abort. +** +** This callback is used by multiple expression walkers. +*/ +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ + UNUSED_PARAMETER(NotUsed); + pWalker->eCode = 0; + return WRC_Abort; +} + +/* +** Check the input string to see if it is "true" or "false" (in any case). +** +** If the string is.... Return +** "true" EP_IsTrue +** "false" EP_IsFalse +** anything else 0 +*/ +SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char *zIn){ + if( sqlite3StrICmp(zIn, "true")==0 ) return EP_IsTrue; + if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse; + return 0; +} + + +/* +** If the input expression is an ID with the name "true" or "false" +** then convert it into an TK_TRUEFALSE term. Return non-zero if +** the conversion happened, and zero if the expression is unaltered. +*/ +SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ + u32 v; + assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); + if( !ExprHasProperty(pExpr, EP_Quoted|EP_IntValue) + && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0 + ){ + pExpr->op = TK_TRUEFALSE; + ExprSetProperty(pExpr, v); + return 1; + } + return 0; +} + +/* +** The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE +** and 0 if it is FALSE. +*/ +SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ + pExpr = sqlite3ExprSkipCollate((Expr*)pExpr); + assert( pExpr->op==TK_TRUEFALSE ); + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 + || sqlite3StrICmp(pExpr->u.zToken,"false")==0 ); + return pExpr->u.zToken[4]==0; +} + +/* +** If pExpr is an AND or OR expression, try to simplify it by eliminating +** terms that are always true or false. Return the simplified expression. +** Or return the original expression if no simplification is possible. +** +** Examples: +** +** (x<10) AND true => (x<10) +** (x<10) AND false => false +** (x<10) AND (y=22 OR false) => (x<10) AND (y=22) +** (x<10) AND (y=22 OR true) => (x<10) +** (y=22) OR true => true +*/ +SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ + assert( pExpr!=0 ); + if( pExpr->op==TK_AND || pExpr->op==TK_OR ){ + Expr *pRight = sqlite3ExprSimplifiedAndOr(pExpr->pRight); + Expr *pLeft = sqlite3ExprSimplifiedAndOr(pExpr->pLeft); + if( ExprAlwaysTrue(pLeft) || ExprAlwaysFalse(pRight) ){ + pExpr = pExpr->op==TK_AND ? pRight : pLeft; + }else if( ExprAlwaysTrue(pRight) || ExprAlwaysFalse(pLeft) ){ + pExpr = pExpr->op==TK_AND ? pLeft : pRight; + } + } + return pExpr; +} + + +/* +** These routines are Walker callbacks used to check expressions to +** see if they are "constant" for some definition of constant. The +** Walker.eCode value determines the type of "constant" we are looking +** for. +** +** These callback routines are used to implement the following: +** +** sqlite3ExprIsConstant() pWalker->eCode==1 +** sqlite3ExprIsConstantNotJoin() pWalker->eCode==2 +** sqlite3ExprIsTableConstant() pWalker->eCode==3 +** sqlite3ExprIsConstantOrFunction() pWalker->eCode==4 or 5 +** +** In all cases, the callbacks set Walker.eCode=0 and abort if the expression +** is found to not be a constant. +** +** The sqlite3ExprIsConstantOrFunction() is used for evaluating DEFAULT +** expressions in a CREATE TABLE statement. The Walker.eCode value is 5 +** when parsing an existing schema out of the sqlite_schema table and 4 +** when processing a new CREATE TABLE statement. A bound parameter raises +** an error for new statements, but is silently converted +** to NULL for existing schemas. This allows sqlite_schema tables that +** contain a bound parameter because they were generated by older versions +** of SQLite to be parsed by newer versions of SQLite without raising a +** malformed schema error. +*/ +static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ + + /* If pWalker->eCode is 2 then any term of the expression that comes from + ** the ON or USING clauses of an outer join disqualifies the expression + ** from being considered constant. */ + if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_OuterON) ){ + pWalker->eCode = 0; + return WRC_Abort; + } + + switch( pExpr->op ){ + /* Consider functions to be constant if all their arguments are constant + ** and either pWalker->eCode==4 or 5 or the function has the + ** SQLITE_FUNC_CONST flag. */ + case TK_FUNCTION: + if( (pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc)) + && !ExprHasProperty(pExpr, EP_WinFunc) + ){ + if( pWalker->eCode==5 ) ExprSetProperty(pExpr, EP_FromDDL); + return WRC_Continue; + }else{ + pWalker->eCode = 0; + return WRC_Abort; + } + case TK_ID: + /* Convert "true" or "false" in a DEFAULT clause into the + ** appropriate TK_TRUEFALSE operator */ + if( sqlite3ExprIdToTrueFalse(pExpr) ){ + return WRC_Prune; + } + /* no break */ deliberate_fall_through + case TK_COLUMN: + case TK_AGG_FUNCTION: + case TK_AGG_COLUMN: + testcase( pExpr->op==TK_ID ); + testcase( pExpr->op==TK_COLUMN ); + testcase( pExpr->op==TK_AGG_FUNCTION ); + testcase( pExpr->op==TK_AGG_COLUMN ); + if( ExprHasProperty(pExpr, EP_FixedCol) && pWalker->eCode!=2 ){ + return WRC_Continue; + } + if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){ + return WRC_Continue; + } + /* no break */ deliberate_fall_through + case TK_IF_NULL_ROW: + case TK_REGISTER: + case TK_DOT: + testcase( pExpr->op==TK_REGISTER ); + testcase( pExpr->op==TK_IF_NULL_ROW ); + testcase( pExpr->op==TK_DOT ); + pWalker->eCode = 0; + return WRC_Abort; + case TK_VARIABLE: + if( pWalker->eCode==5 ){ + /* Silently convert bound parameters that appear inside of CREATE + ** statements into a NULL when parsing the CREATE statement text out + ** of the sqlite_schema table */ + pExpr->op = TK_NULL; + }else if( pWalker->eCode==4 ){ + /* A bound parameter in a CREATE statement that originates from + ** sqlite3_prepare() causes an error */ + pWalker->eCode = 0; + return WRC_Abort; + } + /* no break */ deliberate_fall_through + default: + testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail() disallows */ + testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail() disallows */ + return WRC_Continue; + } +} +static int exprIsConst(Expr *p, int initFlag, int iCur){ + Walker w; + w.eCode = initFlag; + w.xExprCallback = exprNodeIsConstant; + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif + w.u.iCur = iCur; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** and 0 if it involves variables or function calls. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ + return exprIsConst(p, 1, 0); +} + +/* +** Walk an expression tree. Return non-zero if +** +** (1) the expression is constant, and +** (2) the expression does originate in the ON or USING clause +** of a LEFT JOIN, and +** (3) the expression does not contain any EP_FixedCol TK_COLUMN +** operands created by the constant propagation optimization. +** +** When this routine returns true, it indicates that the expression +** can be added to the pParse->pConstExpr list and evaluated once when +** the prepared statement starts up. See sqlite3ExprCodeRunJustOnce(). +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ + return exprIsConst(p, 2, 0); +} + +/* +** Walk an expression tree. Return non-zero if the expression is constant +** for any single row of the table with cursor iCur. In other words, the +** expression must not refer to any non-deterministic function nor any +** table other than iCur. +*/ +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ + return exprIsConst(p, 3, iCur); +} + +/* +** Check pExpr to see if it is an invariant constraint on data source pSrc. +** This is an optimization. False negatives will perhaps cause slower +** queries, but false positives will yield incorrect answers. So when in +** doubt, return 0. +** +** To be an invariant constraint, the following must be true: +** +** (1) pExpr cannot refer to any table other than pSrc->iCursor. +** +** (2) pExpr cannot use subqueries or non-deterministic functions. +** +** (3) pSrc cannot be part of the left operand for a RIGHT JOIN. +** (Is there some way to relax this constraint?) +** +** (4) If pSrc is the right operand of a LEFT JOIN, then... +** (4a) pExpr must come from an ON clause.. + (4b) and specifically the ON clause associated with the LEFT JOIN. +** +** (5) If pSrc is not the right operand of a LEFT JOIN or the left +** operand of a RIGHT JOIN, then pExpr must be from the WHERE +** clause, not an ON clause. +*/ +SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){ + if( pSrc->fg.jointype & JT_LTORJ ){ + return 0; /* rule (3) */ + } + if( pSrc->fg.jointype & JT_LEFT ){ + if( !ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (4a) */ + if( pExpr->w.iJoin!=pSrc->iCursor ) return 0; /* rule (4b) */ + }else{ + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (5) */ + } + return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ +} + + +/* +** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy(). +*/ +static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){ + ExprList *pGroupBy = pWalker->u.pGroupBy; + int i; + + /* Check if pExpr is identical to any GROUP BY term. If so, consider + ** it constant. */ + for(i=0; inExpr; i++){ + Expr *p = pGroupBy->a[i].pExpr; + if( sqlite3ExprCompare(0, pExpr, p, -1)<2 ){ + CollSeq *pColl = sqlite3ExprNNCollSeq(pWalker->pParse, p); + if( sqlite3IsBinary(pColl) ){ + return WRC_Prune; + } + } + } + + /* Check if pExpr is a sub-select. If so, consider it variable. */ + if( ExprUseXSelect(pExpr) ){ + pWalker->eCode = 0; + return WRC_Abort; + } + + return exprNodeIsConstant(pWalker, pExpr); +} + +/* +** Walk the expression tree passed as the first argument. Return non-zero +** if the expression consists entirely of constants or copies of terms +** in pGroupBy that sort with the BINARY collation sequence. +** +** This routine is used to determine if a term of the HAVING clause can +** be promoted into the WHERE clause. In order for such a promotion to work, +** the value of the HAVING clause term must be the same for all members of +** a "group". The requirement that the GROUP BY term must be BINARY +** assumes that no other collating sequence will have a finer-grained +** grouping than binary. In other words (A=B COLLATE binary) implies +** A=B in every other collating sequence. The requirement that the +** GROUP BY be BINARY is stricter than necessary. It would also work +** to promote HAVING clauses that use the same alternative collating +** sequence as the GROUP BY term, but that is much harder to check, +** alternative collating sequences are uncommon, and this is only an +** optimization, so we take the easy way out and simply require the +** GROUP BY to use the BINARY collating sequence. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprList *pGroupBy){ + Walker w; + w.eCode = 1; + w.xExprCallback = exprNodeIsConstantOrGroupBy; + w.xSelectCallback = 0; + w.u.pGroupBy = pGroupBy; + w.pParse = pParse; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** Walk an expression tree for the DEFAULT field of a column definition +** in a CREATE TABLE statement. Return non-zero if the expression is +** acceptable for use as a DEFAULT. That is to say, return non-zero if +** the expression is constant or a function call with constant arguments. +** Return and 0 if there are any variables. +** +** isInit is true when parsing from sqlite_schema. isInit is false when +** processing a new CREATE TABLE statement. When isInit is true, parameters +** (such as ? or $abc) in the expression are converted into NULL. When +** isInit is false, parameters raise an error. Parameters should not be +** allowed in a CREATE TABLE statement, but some legacy versions of SQLite +** allowed it, so we need to support it when reading sqlite_schema for +** backwards compatibility. +** +** If isInit is true, set EP_FromDDL on every TK_FUNCTION node. +** +** For the purposes of this function, a double-quoted string (ex: "abc") +** is considered a variable but a single-quoted string (ex: 'abc') is +** a constant. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ + assert( isInit==0 || isInit==1 ); + return exprIsConst(p, 4+isInit, 0); +} + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Walk an expression tree. Return 1 if the expression contains a +** subquery of some kind. Return 0 if there are no subqueries. +*/ +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ + Walker w; + w.eCode = 1; + w.xExprCallback = sqlite3ExprWalkNoop; + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif + sqlite3WalkExpr(&w, p); + return w.eCode==0; +} +#endif + +/* +** If the expression p codes a constant integer that is small enough +** to fit in a 32-bit integer, return 1 and put the value of the integer +** in *pValue. If the expression is not an integer or if it is too big +** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. +*/ +SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr *p, int *pValue){ + int rc = 0; + if( NEVER(p==0) ) return 0; /* Used to only happen following on OOM */ + + /* If an expression is an integer literal that fits in a signed 32-bit + ** integer, then the EP_IntValue flag will have already been set */ + assert( p->op!=TK_INTEGER || (p->flags & EP_IntValue)!=0 + || sqlite3GetInt32(p->u.zToken, &rc)==0 ); + + if( p->flags & EP_IntValue ){ + *pValue = p->u.iValue; + return 1; + } + switch( p->op ){ + case TK_UPLUS: { + rc = sqlite3ExprIsInteger(p->pLeft, pValue); + break; + } + case TK_UMINUS: { + int v = 0; + if( sqlite3ExprIsInteger(p->pLeft, &v) ){ + assert( ((unsigned int)v)!=0x80000000 ); + *pValue = -v; + rc = 1; + } + break; + } + default: break; + } + return rc; +} + +/* +** Return FALSE if there is no chance that the expression can be NULL. +** +** If the expression might be NULL or if the expression is too complex +** to tell return TRUE. +** +** This routine is used as an optimization, to skip OP_IsNull opcodes +** when we know that a value cannot be NULL. Hence, a false positive +** (returning TRUE when in fact the expression can never be NULL) might +** be a small performance hit but is otherwise harmless. On the other +** hand, a false negative (returning FALSE when the result could be NULL) +** will likely result in an incorrect answer. So when in doubt, return +** TRUE. +*/ +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ + u8 op; + assert( p!=0 ); + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + p = p->pLeft; + assert( p!=0 ); + } + op = p->op; + if( op==TK_REGISTER ) op = p->op2; + switch( op ){ + case TK_INTEGER: + case TK_STRING: + case TK_FLOAT: + case TK_BLOB: + return 0; + case TK_COLUMN: + assert( ExprUseYTab(p) ); + return ExprHasProperty(p, EP_CanBeNull) || + p->y.pTab==0 || /* Reference to column of index on expression */ + (p->iColumn>=0 + && p->y.pTab->aCol!=0 /* Possible due to prior error */ + && p->y.pTab->aCol[p->iColumn].notNull==0); + default: + return 1; + } +} + +/* +** Return TRUE if the given expression is a constant which would be +** unchanged by OP_Affinity with the affinity given in the second +** argument. +** +** This routine is used to determine if the OP_Affinity operation +** can be omitted. When in doubt return FALSE. A false negative +** is harmless. A false positive, however, can result in the wrong +** answer. +*/ +SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ + u8 op; + int unaryMinus = 0; + if( aff==SQLITE_AFF_BLOB ) return 1; + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + if( p->op==TK_UMINUS ) unaryMinus = 1; + p = p->pLeft; + } + op = p->op; + if( op==TK_REGISTER ) op = p->op2; + switch( op ){ + case TK_INTEGER: { + return aff>=SQLITE_AFF_NUMERIC; + } + case TK_FLOAT: { + return aff>=SQLITE_AFF_NUMERIC; + } + case TK_STRING: { + return !unaryMinus && aff==SQLITE_AFF_TEXT; + } + case TK_BLOB: { + return !unaryMinus; + } + case TK_COLUMN: { + assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ + return aff>=SQLITE_AFF_NUMERIC && p->iColumn<0; + } + default: { + return 0; + } + } +} + +/* +** Return TRUE if the given string is a row-id column name. +*/ +SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ + if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; + if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; + if( sqlite3StrICmp(z, "OID")==0 ) return 1; + return 0; +} + +/* +** pX is the RHS of an IN operator. If pX is a SELECT statement +** that can be simplified to a direct table access, then return +** a pointer to the SELECT statement. If pX is not a SELECT statement, +** or if the SELECT statement needs to be manifested into a transient +** table, then return NULL. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +static Select *isCandidateForInOpt(const Expr *pX){ + Select *p; + SrcList *pSrc; + ExprList *pEList; + Table *pTab; + int i; + if( !ExprUseXSelect(pX) ) return 0; /* Not a subquery */ + if( ExprHasProperty(pX, EP_VarSelect) ) return 0; /* Correlated subq */ + p = pX->x.pSelect; + if( p->pPrior ) return 0; /* Not a compound SELECT */ + if( p->selFlags & (SF_Distinct|SF_Aggregate) ){ + testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); + testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); + return 0; /* No DISTINCT keyword and no aggregate functions */ + } + assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */ + if( p->pLimit ) return 0; /* Has no LIMIT clause */ + if( p->pWhere ) return 0; /* Has no WHERE clause */ + pSrc = p->pSrc; + assert( pSrc!=0 ); + if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */ + if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ + pTab = pSrc->a[0].pTab; + assert( pTab!=0 ); + assert( !IsView(pTab) ); /* FROM clause is not a view */ + if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ + pEList = p->pEList; + assert( pEList!=0 ); + /* All SELECT results must be columns. */ + for(i=0; inExpr; i++){ + Expr *pRes = pEList->a[i].pExpr; + if( pRes->op!=TK_COLUMN ) return 0; + assert( pRes->iTable==pSrc->a[0].iCursor ); /* Not a correlated subquery */ + } + return p; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code that checks the left-most column of index table iCur to see if +** it contains any NULL entries. Cause the register at regHasNull to be set +** to a non-NULL value if iCur contains no NULLs. Cause register regHasNull +** to be set to NULL if iCur contains one or more NULL values. +*/ +static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ + int addr1; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); + addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + VdbeComment((v, "first_entry_in(%d)", iCur)); + sqlite3VdbeJumpHere(v, addr1); +} +#endif + + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** The argument is an IN operator with a list (not a subquery) on the +** right-hand side. Return TRUE if that list is constant. +*/ +static int sqlite3InRhsIsConstant(Expr *pIn){ + Expr *pLHS; + int res; + assert( !ExprHasProperty(pIn, EP_xIsSelect) ); + pLHS = pIn->pLeft; + pIn->pLeft = 0; + res = sqlite3ExprIsConstant(pIn); + pIn->pLeft = pLHS; + return res; +} +#endif + +/* +** This function is used by the implementation of the IN (...) operator. +** The pX parameter is the expression on the RHS of the IN operator, which +** might be either a list of expressions or a subquery. +** +** The job of this routine is to find or create a b-tree object that can +** be used either to test for membership in the RHS set or to iterate through +** all members of the RHS set, skipping duplicates. +** +** A cursor is opened on the b-tree object that is the RHS of the IN operator +** and the *piTab parameter is set to the index of that cursor. +** +** The returned value of this function indicates the b-tree type, as follows: +** +** IN_INDEX_ROWID - The cursor was opened on a database table. +** IN_INDEX_INDEX_ASC - The cursor was opened on an ascending index. +** IN_INDEX_INDEX_DESC - The cursor was opened on a descending index. +** IN_INDEX_EPH - The cursor was opened on a specially created and +** populated epheremal table. +** IN_INDEX_NOOP - No cursor was allocated. The IN operator must be +** implemented as a sequence of comparisons. +** +** An existing b-tree might be used if the RHS expression pX is a simple +** subquery such as: +** +** SELECT , ... FROM +** +** If the RHS of the IN operator is a list or a more complex subquery, then +** an ephemeral table might need to be generated from the RHS and then +** pX->iTable made to point to the ephemeral table instead of an +** existing table. In this case, the creation and initialization of the +** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag +** will be set on pX and the pX->y.sub fields will be set to show where +** the subroutine is coded. +** +** The inFlags parameter must contain, at a minimum, one of the bits +** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains +** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast +** membership test. When the IN_INDEX_LOOP bit is set, the IN index will +** be used to loop over all values of the RHS of the IN operator. +** +** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate +** through the set members) then the b-tree must not contain duplicates. +** An epheremal table will be created unless the selected columns are guaranteed +** to be unique - either because it is an INTEGER PRIMARY KEY or due to +** a UNIQUE constraint or index. +** +** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used +** for fast set membership tests) then an epheremal table must +** be used unless is a single INTEGER PRIMARY KEY column or an +** index can be found with the specified as its left-most. +** +** If the IN_INDEX_NOOP_OK and IN_INDEX_MEMBERSHIP are both set and +** if the RHS of the IN operator is a list (not a subquery) then this +** routine might decide that creating an ephemeral b-tree for membership +** testing is too expensive and return IN_INDEX_NOOP. In that case, the +** calling routine should implement the IN operator using a sequence +** of Eq or Ne comparison operations. +** +** When the b-tree is being used for membership tests, the calling function +** might need to know whether or not the RHS side of the IN operator +** contains a NULL. If prRhsHasNull is not a NULL pointer and +** if there is any chance that the (...) might contain a NULL value at +** runtime, then a register is allocated and the register number written +** to *prRhsHasNull. If there is no chance that the (...) contains a +** NULL value, then *prRhsHasNull is left unchanged. +** +** If a register is allocated and its location stored in *prRhsHasNull, then +** the value in that register will be NULL if the b-tree contains one or more +** NULL values, and it will be some non-NULL value if the b-tree contains no +** NULL values. +** +** If the aiMap parameter is not NULL, it must point to an array containing +** one element for each column returned by the SELECT statement on the RHS +** of the IN(...) operator. The i'th entry of the array is populated with the +** offset of the index column that matches the i'th column returned by the +** SELECT. For example, if the expression and selected index are: +** +** (?,?,?) IN (SELECT a, b, c FROM t1) +** CREATE INDEX i1 ON t1(b, c, a); +** +** then aiMap[] is populated with {2, 0, 1}. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3FindInIndex( + Parse *pParse, /* Parsing context */ + Expr *pX, /* The IN expression */ + u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ + int *prRhsHasNull, /* Register holding NULL status. See notes */ + int *aiMap, /* Mapping from Index fields to RHS fields */ + int *piTab /* OUT: index to use */ +){ + Select *p; /* SELECT to the right of IN operator */ + int eType = 0; /* Type of RHS table. IN_INDEX_* */ + int iTab; /* Cursor of the RHS table */ + int mustBeUnique; /* True if RHS must be unique */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ + + assert( pX->op==TK_IN ); + mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + iTab = pParse->nTab++; + + /* If the RHS of this IN(...) operator is a SELECT, and if it matters + ** whether or not the SELECT result contains NULL values, check whether + ** or not NULL is actually possible (it may not be, for example, due + ** to NOT NULL constraints in the schema). If no NULL values are possible, + ** set prRhsHasNull to 0 before continuing. */ + if( prRhsHasNull && ExprUseXSelect(pX) ){ + int i; + ExprList *pEList = pX->x.pSelect->pEList; + for(i=0; inExpr; i++){ + if( sqlite3ExprCanBeNull(pEList->a[i].pExpr) ) break; + } + if( i==pEList->nExpr ){ + prRhsHasNull = 0; + } + } + + /* Check to see if an existing table or index can be used to + ** satisfy the query. This is preferable to generating a new + ** ephemeral table. */ + if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ + sqlite3 *db = pParse->db; /* Database connection */ + Table *pTab; /* Table
        . */ + int iDb; /* Database idx for pTab */ + ExprList *pEList = p->pEList; + int nExpr = pEList->nExpr; + + assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ + assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ + assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ + pTab = p->pSrc->a[0].pTab; + + /* Code an OP_Transaction and OP_TableLock for
        . */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbtnum, 0, pTab->zName); + + assert(v); /* sqlite3GetVdbe() has always been previously called */ + if( nExpr==1 && pEList->a[0].pExpr->iColumn<0 ){ + /* The "x IN (SELECT rowid FROM table)" case */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); + VdbeCoverage(v); + + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + eType = IN_INDEX_ROWID; + ExplainQueryPlan((pParse, 0, + "USING ROWID SEARCH ON TABLE %s FOR IN-OPERATOR",pTab->zName)); + sqlite3VdbeJumpHere(v, iAddr); + }else{ + Index *pIdx; /* Iterator variable */ + int affinity_ok = 1; + int i; + + /* Check that the affinity that will be used to perform each + ** comparison is the same as the affinity of each column in table + ** on the RHS of the IN operator. If it not, it is not possible to + ** use any index of the RHS table. */ + for(i=0; ipLeft, i); + int iCol = pEList->a[i].pExpr->iColumn; + char idxaff = sqlite3TableColumnAffinity(pTab,iCol); /* RHS table */ + char cmpaff = sqlite3CompareAffinity(pLhs, idxaff); + testcase( cmpaff==SQLITE_AFF_BLOB ); + testcase( cmpaff==SQLITE_AFF_TEXT ); + switch( cmpaff ){ + case SQLITE_AFF_BLOB: + break; + case SQLITE_AFF_TEXT: + /* sqlite3CompareAffinity() only returns TEXT if one side or the + ** other has no affinity and the other side is TEXT. Hence, + ** the only way for cmpaff to be TEXT is for idxaff to be TEXT + ** and for the term on the LHS of the IN to have no affinity. */ + assert( idxaff==SQLITE_AFF_TEXT ); + break; + default: + affinity_ok = sqlite3IsNumericAffinity(idxaff); + } + } + + if( affinity_ok ){ + /* Search for an existing index that will work for this IN operator */ + for(pIdx=pTab->pIndex; pIdx && eType==0; pIdx=pIdx->pNext){ + Bitmask colUsed; /* Columns of the index used */ + Bitmask mCol; /* Mask for the current column */ + if( pIdx->nColumnpPartIdxWhere!=0 ) continue; + /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute + ** BITMASK(nExpr) without overflowing */ + testcase( pIdx->nColumn==BMS-2 ); + testcase( pIdx->nColumn==BMS-1 ); + if( pIdx->nColumn>=BMS-1 ) continue; + if( mustBeUnique ){ + if( pIdx->nKeyCol>nExpr + ||(pIdx->nColumn>nExpr && !IsUniqueIndex(pIdx)) + ){ + continue; /* This index is not unique over the IN RHS columns */ + } + } + + colUsed = 0; /* Columns of index used so far */ + for(i=0; ipLeft, i); + Expr *pRhs = pEList->a[i].pExpr; + CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + int j; + + assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); + for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; + assert( pIdx->azColl[j] ); + if( pReq!=0 && sqlite3StrICmp(pReq->zName, pIdx->azColl[j])!=0 ){ + continue; + } + break; + } + if( j==nExpr ) break; + mCol = MASKBIT(j); + if( mCol & colUsed ) break; /* Each column used only once */ + colUsed |= mCol; + if( aiMap ) aiMap[i] = j; + } + + assert( i==nExpr || colUsed!=(MASKBIT(nExpr)-1) ); + if( colUsed==(MASKBIT(nExpr)-1) ){ + /* If we reach this point, that means the index pIdx is usable */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + ExplainQueryPlan((pParse, 0, + "USING INDEX %s FOR IN-OPERATOR",pIdx->zName)); + sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); + eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; + + if( prRhsHasNull ){ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + i64 mask = (1<nMem; + if( nExpr==1 ){ + sqlite3SetHasNullFlag(v, iTab, *prRhsHasNull); + } + } + sqlite3VdbeJumpHere(v, iAddr); + } + } /* End loop over indexes */ + } /* End if( affinity_ok ) */ + } /* End if not an rowid index */ + } /* End attempt to optimize using an index */ + + /* If no preexisting index is available for the IN clause + ** and IN_INDEX_NOOP is an allowed reply + ** and the RHS of the IN operator is a list, not a subquery + ** and the RHS is not constant or has two or fewer terms, + ** then it is not worth creating an ephemeral table to evaluate + ** the IN operator so return IN_INDEX_NOOP. + */ + if( eType==0 + && (inFlags & IN_INDEX_NOOP_OK) + && ExprUseXList(pX) + && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) + ){ + pParse->nTab--; /* Back out the allocation of the unused cursor */ + iTab = -1; /* Cursor is not allocated */ + eType = IN_INDEX_NOOP; + } + + if( eType==0 ){ + /* Could not find an existing table or index to use as the RHS b-tree. + ** We will have to generate an ephemeral table to do the job. + */ + u32 savedNQueryLoop = pParse->nQueryLoop; + int rMayHaveNull = 0; + eType = IN_INDEX_EPH; + if( inFlags & IN_INDEX_LOOP ){ + pParse->nQueryLoop = 0; + }else if( prRhsHasNull ){ + *prRhsHasNull = rMayHaveNull = ++pParse->nMem; + } + assert( pX->op==TK_IN ); + sqlite3CodeRhsOfIN(pParse, pX, iTab); + if( rMayHaveNull ){ + sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); + } + pParse->nQueryLoop = savedNQueryLoop; + } + + if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ + int i, n; + n = sqlite3ExprVectorSize(pX->pLeft); + for(i=0; ipLeft; + int nVal = sqlite3ExprVectorSize(pLeft); + Select *pSelect = ExprUseXSelect(pExpr) ? pExpr->x.pSelect : 0; + char *zRet; + + assert( pExpr->op==TK_IN ); + zRet = sqlite3DbMallocRaw(pParse->db, nVal+1); + if( zRet ){ + int i; + for(i=0; ipEList->a[i].pExpr, a); + }else{ + zRet[i] = a; + } + } + zRet[nVal] = '\0'; + } + return zRet; +} +#endif + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Load the Parse object passed as the first argument with an error +** message of the form: +** +** "sub-select returns N columns - expected M" +*/ +SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ + if( pParse->nErr==0 ){ + const char *zFmt = "sub-select returns %d columns - expected %d"; + sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); + } +} +#endif + +/* +** Expression pExpr is a vector that has been used in a context where +** it is not permitted. If pExpr is a sub-select vector, this routine +** loads the Parse object with a message of the form: +** +** "sub-select returns N columns - expected 1" +** +** Or, if it is a regular scalar vector: +** +** "row value misused" +*/ +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ +#ifndef SQLITE_OMIT_SUBQUERY + if( ExprUseXSelect(pExpr) ){ + sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); + }else +#endif + { + sqlite3ErrorMsg(pParse, "row value misused"); + } +} + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code that will construct an ephemeral table containing all terms +** in the RHS of an IN operator. The IN operator can be in either of two +** forms: +** +** x IN (4,5,11) -- IN operator with list on right-hand side +** x IN (SELECT a FROM b) -- IN operator with subquery on the right +** +** The pExpr parameter is the IN operator. The cursor number for the +** constructed ephermeral table is returned. The first time the ephemeral +** table is computed, the cursor number is also stored in pExpr->iTable, +** however the cursor number returned might not be the same, as it might +** have been duplicated using OP_OpenDup. +** +** If the LHS expression ("x" in the examples) is a column value, or +** the SELECT statement returns a column value, then the affinity of that +** column is used to build the index keys. If both 'x' and the +** SELECT... statement are columns, then numeric affinity is used +** if either column has NUMERIC or INTEGER affinity. If neither +** 'x' nor the SELECT... statement are columns, then numeric affinity +** is used. +*/ +SQLITE_PRIVATE void sqlite3CodeRhsOfIN( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The IN operator */ + int iTab /* Use this cursor number */ +){ + int addrOnce = 0; /* Address of the OP_Once instruction at top */ + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + Vdbe *v; /* The prepared statement under construction */ + + v = pParse->pVdbe; + assert( v!=0 ); + + /* The evaluation of the IN must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can compute the RHS just once + ** and reuse it many names. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ + /* Reuse of the RHS is allowed */ + /* If this routine has already been coded, but the previous code + ** might not have been invoked yet, so invoke it now as a subroutine. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + if( ExprUseXSelect(pExpr) ){ + ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", + pExpr->x.pSelect->selId)); + } + assert( ExprUseYSub(pExpr) ); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + assert( iTab!=pExpr->iTable ); + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + sqlite3VdbeJumpHere(v, addrOnce); + return; + } + + /* Begin coding the subroutine */ + assert( !ExprUseYWin(pExpr) ); + ExprSetProperty(pExpr, EP_Subrtn); + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* Check to see if this is a vector IN operator */ + pLeft = pExpr->pLeft; + nVal = sqlite3ExprVectorSize(pLeft); + + /* Construct the ephemeral table that will contain the content of + ** RHS of the IN operator. + */ + pExpr->iTable = iTab; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( ExprUseXSelect(pExpr) ){ + VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); + }else{ + VdbeComment((v, "RHS of IN operator")); + } +#endif + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + + if( ExprUseXSelect(pExpr) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSelect->selId + )); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + Select *pCopy; + SelectDest dest; + int i; + int rc; + sqlite3SelectDestInit(&dest, SRT_Set, iTab); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + pCopy = sqlite3SelectDup(pParse->db, pSelect, 0); + rc = pParse->db->mallocFailed ? 1 :sqlite3Select(pParse, pCopy, &dest); + sqlite3SelectDelete(pParse->db, pCopy); + sqlite3DbFree(pParse->db, dest.zAffSdst); + if( rc ){ + sqlite3KeyInfoUnref(pKeyInfo); + return; + } + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); + } + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2; + affinity = sqlite3ExprAffinity(pLeft); + if( affinity<=SQLITE_AFF_NONE ){ + affinity = SQLITE_AFF_BLOB; + }else if( affinity==SQLITE_AFF_REAL ){ + affinity = SQLITE_AFF_NUMERIC; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + } + + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. + */ + if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce-1); + sqlite3VdbeChangeToNoop(v, addrOnce); + ExprClearProperty(pExpr, EP_Subrtn); + addrOnce = 0; + } + + /* Evaluate the expression and insert it into the temp table */ + sqlite3ExprCode(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r1, 1); + } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + } + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + /* Subroutine return */ + assert( ExprUseYSub(pExpr) ); + assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn + || pParse->nErr ); + sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr, 1); + VdbeCoverage(v); + sqlite3ClearTempRegCache(pParse); + } +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate code for scalar subqueries used as a subquery expression +** or EXISTS operator: +** +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** +** The pExpr parameter is the SELECT or EXISTS operator to be coded. +** +** Return the register that holds the result. For a multi-column SELECT, +** the result is stored in a contiguous array of registers and the +** return value is the register of the left-most result column. +** Return 0 if an error occurs. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int addrOnce = 0; /* Address of OP_Once at top of subroutine */ + int rReg = 0; /* Register storing resulting */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ + + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + if( pParse->nErr ) return 0; + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprUseXSelect(pExpr) ); + pSel = pExpr->x.pSelect; + + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + assert( ExprUseYSub(pExpr) ); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; + } + + /* Begin coding the subroutine */ + assert( !ExprUseYWin(pExpr) ); + assert( !ExprHasProperty(pExpr, EP_Reduced|EP_TokenOnly) ); + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; + + /* The evaluation of the EXISTS/SELECT must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can run this code just once + ** save the results, and reuse the same result on subsequent invocations. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSel->selId)); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); + } + if( pSel->pLimit ){ + /* The subquery already has a limit. If the pre-existing limit is X + ** then make the new limit X<>0 so that the new limit is either 1 or 0 */ + sqlite3 *db = pParse->db; + pLimit = sqlite3Expr(db, TK_INTEGER, "0"); + if( pLimit ){ + pLimit->affExpr = SQLITE_AFF_NUMERIC; + pLimit = sqlite3PExpr(pParse, TK_NE, + sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); + } + sqlite3ExprDelete(db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + /* If there is no pre-existing limit add a limit of 1 */ + pLimit = sqlite3Expr(pParse->db, TK_INTEGER, "1"); + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } + pSel->iLimit = 0; + if( sqlite3Select(pParse, pSel, &dest) ){ + pExpr->op2 = pExpr->op; + pExpr->op = TK_ERROR; + return 0; + } + pExpr->iTable = rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + } + + /* Subroutine return */ + assert( ExprUseYSub(pExpr) ); + assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn + || pParse->nErr ); + sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr, 1); + VdbeCoverage(v); + sqlite3ClearTempRegCache(pParse); + return rReg; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Expr pIn is an IN(...) expression. This function checks that the +** sub-select on the RHS of the IN() operator has the same number of +** columns as the vector on the LHS. Or, if the RHS of the IN() is not +** a sub-query, that the LHS is a vector of size 1. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ + int nVector = sqlite3ExprVectorSize(pIn->pLeft); + if( ExprUseXSelect(pIn) && !pParse->db->mallocFailed ){ + if( nVector!=pIn->x.pSelect->pEList->nExpr ){ + sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); + return 1; + } + }else if( nVector!=1 ){ + sqlite3VectorErrorMsg(pParse, pIn->pLeft); + return 1; + } + return 0; +} +#endif + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code for an IN expression. +** +** x IN (SELECT ...) +** x IN (value, value, ...) +** +** The left-hand side (LHS) is a scalar or vector expression. The +** right-hand side (RHS) is an array of zero or more scalar values, or a +** subquery. If the RHS is a subquery, the number of result columns must +** match the number of columns in the vector on the LHS. If the RHS is +** a list of values, the LHS must be a scalar. +** +** The IN operator is true if the LHS value is contained within the RHS. +** The result is false if the LHS is definitely not in the RHS. The +** result is NULL if the presence of the LHS in the RHS cannot be +** determined due to NULLs. +** +** This routine generates code that jumps to destIfFalse if the LHS is not +** contained within the RHS. If due to NULLs we cannot determine if the LHS +** is contained in the RHS then jump to destIfNull. If the LHS is contained +** within the RHS then fall through. +** +** See the separate in-operator.md documentation file in the canonical +** SQLite source tree for additional information. +*/ +static void sqlite3ExprCodeIN( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The IN expression */ + int destIfFalse, /* Jump here if LHS is not contained in the RHS */ + int destIfNull /* Jump here if the results are unknown due to NULLs */ +){ + int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */ + int eType; /* Type of the RHS */ + int rLhs; /* Register(s) holding the LHS values */ + int rLhsOrig; /* LHS values prior to reordering by aiMap[] */ + Vdbe *v; /* Statement under construction */ + int *aiMap = 0; /* Map from vector field to index column */ + char *zAff = 0; /* Affinity string for comparisons */ + int nVector; /* Size of vectors for this IN operator */ + int iDummy; /* Dummy parameter to exprCodeVector() */ + Expr *pLeft; /* The LHS of the IN operator */ + int i; /* loop counter */ + int destStep2; /* Where to jump when NULLs seen in step 2 */ + int destStep6 = 0; /* Start of code for Step 6 */ + int addrTruthOp; /* Address of opcode that determines the IN is true */ + int destNotNull; /* Jump here if a comparison is not true in step 6 */ + int addrTop; /* Top of the step-6 loop */ + int iTab = 0; /* Index to use */ + u8 okConstFactor = pParse->okConstFactor; + + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + pLeft = pExpr->pLeft; + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + zAff = exprINAffinity(pParse, pExpr); + nVector = sqlite3ExprVectorSize(pExpr->pLeft); + aiMap = (int*)sqlite3DbMallocZero( + pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 + ); + if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; + + /* Attempt to compute the RHS. After this step, if anything other than + ** IN_INDEX_NOOP is returned, the table opened with cursor iTab + ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, + ** the RHS has not yet been coded. */ + v = pParse->pVdbe; + assert( v!=0 ); /* OOM detected prior to this routine */ + VdbeNoopComment((v, "begin IN expr")); + eType = sqlite3FindInIndex(pParse, pExpr, + IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, + destIfFalse==destIfNull ? 0 : &rRhsHasNull, + aiMap, &iTab); + + assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH + || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC + ); +#ifdef SQLITE_DEBUG + /* Confirm that aiMap[] contains nVector integer values between 0 and + ** nVector-1. */ + for(i=0; i from " IN (...)". If the LHS is a + ** vector, then it is stored in an array of nVector registers starting + ** at r1. + ** + ** sqlite3FindInIndex() might have reordered the fields of the LHS vector + ** so that the fields are in the same order as an existing index. The + ** aiMap[] array contains a mapping from the original LHS field order to + ** the field order that matches the RHS index. + ** + ** Avoid factoring the LHS of the IN(...) expression out of the loop, + ** even if it is constant, as OP_Affinity may be used on the register + ** by code generated below. */ + assert( pParse->okConstFactor==okConstFactor ); + pParse->okConstFactor = 0; + rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy); + pParse->okConstFactor = okConstFactor; + for(i=0; ix.pList; + pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + if( destIfNull!=destIfFalse ){ + regCkNull = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); + } + for(ii=0; iinExpr; ii++){ + r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); + if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ + sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); + } + sqlite3ReleaseTempReg(pParse, regToFree); + if( iinExpr-1 || destIfNull!=destIfFalse ){ + int op = rLhs!=r2 ? OP_Eq : OP_NotNull; + sqlite3VdbeAddOp4(v, op, rLhs, labelOk, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, iinExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_Eq); + VdbeCoverageIf(v, iinExpr-1 && op==OP_NotNull); + VdbeCoverageIf(v, ii==pList->nExpr-1 && op==OP_NotNull); + sqlite3VdbeChangeP5(v, zAff[0]); + }else{ + int op = rLhs!=r2 ? OP_Ne : OP_IsNull; + assert( destIfNull==destIfFalse ); + sqlite3VdbeAddOp4(v, op, rLhs, destIfFalse, r2, + (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, op==OP_Ne); + VdbeCoverageIf(v, op==OP_IsNull); + sqlite3VdbeChangeP5(v, zAff[0] | SQLITE_JUMPIFNULL); + } + } + if( regCkNull ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); + sqlite3VdbeGoto(v, destIfFalse); + } + sqlite3VdbeResolveLabel(v, labelOk); + sqlite3ReleaseTempReg(pParse, regCkNull); + goto sqlite3ExprCodeIN_finished; + } + + /* Step 2: Check to see if the LHS contains any NULL columns. If the + ** LHS does contain NULLs then the result must be either FALSE or NULL. + ** We will then skip the binary search of the RHS. + */ + if( destIfNull==destIfFalse ){ + destStep2 = destIfFalse; + }else{ + destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); + } + for(i=0; ipLeft, i); + if( pParse->nErr ) goto sqlite3ExprCodeIN_oom_error; + if( sqlite3ExprCanBeNull(p) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2); + VdbeCoverage(v); + } + } + + /* Step 3. The LHS is now known to be non-NULL. Do the binary search + ** of the RHS using the LHS as a probe. If found, the result is + ** true. + */ + if( eType==IN_INDEX_ROWID ){ + /* In this case, the RHS is the ROWID of table b-tree and so we also + ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 + ** into a single opcode. */ + sqlite3VdbeAddOp3(v, OP_SeekRowid, iTab, destIfFalse, rLhs); + VdbeCoverage(v); + addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ + }else{ + sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); + if( destIfFalse==destIfNull ){ + /* Combine Step 3 and Step 5 into a single opcode */ + sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, + rLhs, nVector); VdbeCoverage(v); + goto sqlite3ExprCodeIN_finished; + } + /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, iTab, 0, + rLhs, nVector); VdbeCoverage(v); + } + + /* Step 4. If the RHS is known to be non-NULL and we did not find + ** an match on the search above, then the result must be FALSE. + */ + if( rRhsHasNull && nVector==1 ){ + sqlite3VdbeAddOp2(v, OP_NotNull, rRhsHasNull, destIfFalse); + VdbeCoverage(v); + } + + /* Step 5. If we do not care about the difference between NULL and + ** FALSE, then just return false. + */ + if( destIfFalse==destIfNull ) sqlite3VdbeGoto(v, destIfFalse); + + /* Step 6: Loop through rows of the RHS. Compare each row to the LHS. + ** If any comparison is NULL, then the result is NULL. If all + ** comparisons are FALSE then the final result is FALSE. + ** + ** For a scalar LHS, it is sufficient to check just the first row + ** of the RHS. + */ + if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); + VdbeCoverage(v); + if( nVector>1 ){ + destNotNull = sqlite3VdbeMakeLabel(pParse); + }else{ + /* For nVector==1, combine steps 6 and 7 by immediately returning + ** FALSE if the first comparison is not NULL */ + destNotNull = destIfFalse; + } + for(i=0; i1 ){ + sqlite3VdbeResolveLabel(v, destNotNull); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); + VdbeCoverage(v); + + /* Step 7: If we reach this point, we know that the result must + ** be false. */ + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + } + + /* Jumps here in order to return true. */ + sqlite3VdbeJumpHere(v, addrTruthOp); + +sqlite3ExprCodeIN_finished: + if( rLhs!=rLhsOrig ) sqlite3ReleaseTempReg(pParse, rLhs); + VdbeComment((v, "end IN expr")); +sqlite3ExprCodeIN_oom_error: + sqlite3DbFree(pParse->db, aiMap); + sqlite3DbFree(pParse->db, zAff); +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Generate an instruction that will put the floating point +** value described by z[0..n-1] into register iMem. +** +** The z[] string will probably not be zero-terminated. But the +** z[n] character is guaranteed to be something that does not look +** like the continuation of the number. +*/ +static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ + if( ALWAYS(z!=0) ){ + double value; + sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); + assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ + if( negateFlag ) value = -value; + sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL); + } +} +#endif + + +/* +** Generate an instruction that will put the integer describe by +** text z[0..n-1] into register iMem. +** +** Expr.u.zToken is always UTF8 and zero-terminated. +*/ +static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ + Vdbe *v = pParse->pVdbe; + if( pExpr->flags & EP_IntValue ){ + int i = pExpr->u.iValue; + assert( i>=0 ); + if( negFlag ) i = -i; + sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); + }else{ + int c; + i64 value; + const char *z = pExpr->u.zToken; + assert( z!=0 ); + c = sqlite3DecOrHexToI64(z, &value); + if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){ +#ifdef SQLITE_OMIT_FLOATING_POINT + sqlite3ErrorMsg(pParse, "oversized integer: %s%#T", negFlag?"-":"",pExpr); +#else +#ifndef SQLITE_OMIT_HEX_INTEGER + if( sqlite3_strnicmp(z,"0x",2)==0 ){ + sqlite3ErrorMsg(pParse, "hex literal too big: %s%#T", + negFlag?"-":"",pExpr); + }else +#endif + { + codeReal(v, z, negFlag, iMem); + } +#endif + }else{ + if( negFlag ){ value = c==3 ? SMALLEST_INT64 : -value; } + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); + } + } +} + + +/* Generate code that will load into register regOut a value that is +** appropriate for the iIdxCol-th column of index pIdx. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn( + Parse *pParse, /* The parsing context */ + Index *pIdx, /* The index whose column is to be loaded */ + int iTabCur, /* Cursor pointing to a table row */ + int iIdxCol, /* The column of the index to be loaded */ + int regOut /* Store the index column value in this register */ +){ + i16 iTabCol = pIdx->aiColumn[iIdxCol]; + if( iTabCol==XN_EXPR ){ + assert( pIdx->aColExpr ); + assert( pIdx->aColExpr->nExpr>iIdxCol ); + pParse->iSelfTab = iTabCur + 1; + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); + pParse->iSelfTab = 0; + }else{ + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, + iTabCol, regOut); + } +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** Generate code that will compute the value of generated column pCol +** and store the result in register regOut +*/ +SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table containing the generated column */ + Column *pCol, /* The generated column */ + int regOut /* Put the result in this register */ +){ + int iAddr; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pParse->iSelfTab!=0 ); + if( pParse->iSelfTab>0 ){ + iAddr = sqlite3VdbeAddOp3(v, OP_IfNullRow, pParse->iSelfTab-1, 0, regOut); + }else{ + iAddr = 0; + } + sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut); + if( pCol->affinity>=SQLITE_AFF_TEXT ){ + sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1); + } + if( iAddr ) sqlite3VdbeJumpHere(v, iAddr); +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + +/* +** Generate code to extract the value of the iCol-th column of a table. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( + Vdbe *v, /* Parsing context */ + Table *pTab, /* The table containing the value */ + int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ + int iCol, /* Index of the column to extract */ + int regOut /* Extract the value into this register */ +){ + Column *pCol; + assert( v!=0 ); + if( pTab==0 ){ + sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut); + return; + } + if( iCol<0 || iCol==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); + VdbeComment((v, "%s.rowid", pTab->zName)); + }else{ + int op; + int x; + if( IsVirtual(pTab) ){ + op = OP_VColumn; + x = iCol; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){ + Parse *pParse = sqlite3VdbeParser(v); + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zCnName); + }else{ + int savedSelfTab = pParse->iSelfTab; + pCol->colFlags |= COLFLAG_BUSY; + pParse->iSelfTab = iTabCur+1; + sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, regOut); + pParse->iSelfTab = savedSelfTab; + pCol->colFlags &= ~COLFLAG_BUSY; + } + return; +#endif + }else if( !HasRowid(pTab) ){ + testcase( iCol!=sqlite3TableColumnToStorage(pTab, iCol) ); + x = sqlite3TableColumnToIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + op = OP_Column; + }else{ + x = sqlite3TableColumnToStorage(pTab,iCol); + testcase( x!=iCol ); + op = OP_Column; + } + sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); + sqlite3ColumnDefault(v, pTab, iCol, regOut); + } +} + +/* +** Generate code that will extract the iColumn-th column from +** table pTab and store the column value in register iReg. +** +** There must be an open cursor to pTab in iTable when this routine +** is called. If iColumn<0 then code is generated that extracts the rowid. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* Description of the table we are reading from */ + int iColumn, /* Index of the table column */ + int iTable, /* The cursor pointing to the table */ + int iReg, /* Store results here */ + u8 p5 /* P5 value for OP_Column + FLAGS */ +){ + assert( pParse->pVdbe!=0 ); + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); + if( p5 ){ + VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + if( pOp->opcode==OP_Column ) pOp->p5 = p5; + } + return iReg; +} + +/* +** Generate code to move content from registers iFrom...iFrom+nReg-1 +** over to iTo..iTo+nReg-1. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ + sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); +} + +/* +** Convert a scalar expression node to a TK_REGISTER referencing +** register iReg. The caller must ensure that iReg already contains +** the correct value for the expression. +*/ +static void exprToRegister(Expr *pExpr, int iReg){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr); + if( NEVER(p==0) ) return; + p->op2 = p->op; + p->op = TK_REGISTER; + p->iTable = iReg; + ExprClearProperty(p, EP_Skip); +} + +/* +** Evaluate an expression (either a vector or a scalar expression) and store +** the result in continguous temporary registers. Return the index of +** the first register used to store the result. +** +** If the returned result register is a temporary scalar, then also write +** that register number into *piFreeable. If the returned result register +** is not a temporary or if the expression is a vector set *piFreeable +** to 0. +*/ +static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ + int iResult; + int nResult = sqlite3ExprVectorSize(p); + if( nResult==1 ){ + iResult = sqlite3ExprCodeTemp(pParse, p, piFreeable); + }else{ + *piFreeable = 0; + if( p->op==TK_SELECT ){ +#if SQLITE_OMIT_SUBQUERY + iResult = 0; +#else + iResult = sqlite3CodeSubselect(pParse, p); +#endif + }else{ + int i; + iResult = pParse->nMem+1; + pParse->nMem += nResult; + assert( ExprUseXList(p) ); + for(i=0; ix.pList->a[i].pExpr, i+iResult); + } + } + } + return iResult; +} + +/* +** If the last opcode is a OP_Copy, then set the do-not-merge flag (p5) +** so that a subsequent copy will not be merged into this one. +*/ +static void setDoNotMergeFlagOnCopy(Vdbe *v){ + if( sqlite3VdbeGetOp(v, -1)->opcode==OP_Copy ){ + sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ + } +} + +/* +** Generate code to implement special SQL functions that are implemented +** in-line rather than by using the usual callbacks. +*/ +static int exprCodeInlineFunction( + Parse *pParse, /* Parsing context */ + ExprList *pFarg, /* List of function arguments */ + int iFuncId, /* Function ID. One of the INTFUNC_... values */ + int target /* Store function result in this register */ +){ + int nFarg; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pFarg!=0 ); + nFarg = pFarg->nExpr; + assert( nFarg>0 ); /* All in-line functions have at least one argument */ + switch( iFuncId ){ + case INLINEFUNC_coalesce: { + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evaluation of + ** arguments past the first non-NULL argument. + */ + int endCoalesce = sqlite3VdbeMakeLabel(pParse); + int i; + assert( nFarg>=2 ); + sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + for(i=1; ia[i].pExpr, target); + } + setDoNotMergeFlagOnCopy(v); + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + case INLINEFUNC_iif: { + Expr caseExpr; + memset(&caseExpr, 0, sizeof(caseExpr)); + caseExpr.op = TK_CASE; + caseExpr.x.pList = pFarg; + return sqlite3ExprCodeTarget(pParse, &caseExpr, target); + } +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + case INLINEFUNC_sqlite_offset: { + Expr *pArg = pFarg->a[0].pExpr; + if( pArg->op==TK_COLUMN && pArg->iTable>=0 ){ + sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } +#endif + default: { + /* The UNLIKELY() function is a no-op. The result is the value + ** of the first argument. + */ + assert( nFarg==1 || nFarg==2 ); + target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); + break; + } + + /*********************************************************************** + ** Test-only SQL functions that are only usable if enabled + ** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS + */ +#if !defined(SQLITE_UNTESTABLE) + case INLINEFUNC_expr_compare: { + /* Compare two expressions using sqlite3ExprCompare() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprCompare(0,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_expr_implies_expr: { + /* Compare two expressions using sqlite3ExprImpliesExpr() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesExpr(pParse,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_implies_nonnull_row: { + /* REsult of sqlite3ExprImpliesNonNullRow() */ + Expr *pA1; + assert( nFarg==2 ); + pA1 = pFarg->a[1].pExpr; + if( pA1->op==TK_COLUMN ){ + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable), + target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } + + case INLINEFUNC_affinity: { + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); + break; + } +#endif /* !defined(SQLITE_UNTESTABLE) */ + } + return target; +} + + +/* +** Generate code into the current Vdbe to evaluate the given +** expression. Attempt to store the results in register "target". +** Return the register where results are stored. +** +** With this routine, there is no guarantee that results will +** be stored in target. The result might be stored in some other +** register if it is convenient to do so. The calling function +** must check the return code and move the results to the desired +** register. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ + Vdbe *v = pParse->pVdbe; /* The VM under construction */ + int op; /* The opcode being coded */ + int inReg = target; /* Results stored in register inReg */ + int regFree1 = 0; /* If non-zero free this temporary register */ + int regFree2 = 0; /* If non-zero free this temporary register */ + int r1, r2; /* Various register numbers */ + Expr tempX; /* Temporary expression node */ + int p5 = 0; + + assert( target>0 && target<=pParse->nMem ); + assert( v!=0 ); + +expr_code_doover: + if( pExpr==0 ){ + op = TK_NULL; + }else{ + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + op = pExpr->op; + } + switch( op ){ + case TK_AGG_COLUMN: { + AggInfo *pAggInfo = pExpr->pAggInfo; + struct AggInfo_col *pCol; + assert( pAggInfo!=0 ); + assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + pCol = &pAggInfo->aCol[pExpr->iAgg]; + if( !pAggInfo->directMode ){ + assert( pCol->iMem>0 ); + return pCol->iMem; + }else if( pAggInfo->useSortingIdx ){ + Table *pTab = pCol->pTab; + sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, + pCol->iSorterColumn, target); + if( pCol->iColumn<0 ){ + VdbeComment((v,"%s.rowid",pTab->zName)); + }else{ + VdbeComment((v,"%s.%s", + pTab->zName, pTab->aCol[pCol->iColumn].zCnName)); + if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + } + } + return target; + } + /* Otherwise, fall thru into the TK_COLUMN case */ + /* no break */ deliberate_fall_through + } + case TK_COLUMN: { + int iTab = pExpr->iTable; + int iReg; + if( ExprHasProperty(pExpr, EP_FixedCol) ){ + /* This COLUMN expression is really a constant due to WHERE clause + ** constraints, and that constant is coded by the pExpr->pLeft + ** expresssion. However, make sure the constant has the correct + ** datatype by applying the Affinity of the table column to the + ** constant. + */ + int aff; + iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); + assert( ExprUseYTab(pExpr) ); + if( pExpr->y.pTab ){ + aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + }else{ + aff = pExpr->affExpr; + } + if( aff>SQLITE_AFF_BLOB ){ + static const char zAff[] = "B\000C\000D\000E"; + assert( SQLITE_AFF_BLOB=='A' ); + assert( SQLITE_AFF_TEXT=='B' ); + sqlite3VdbeAddOp4(v, OP_Affinity, iReg, 1, 0, + &zAff[(aff-'B')*2], P4_STATIC); + } + return iReg; + } + if( iTab<0 ){ + if( pParse->iSelfTab<0 ){ + /* Other columns in the same row for CHECK constraints or + ** generated columns or for inserting into partial index. + ** The row is unpacked into registers beginning at + ** 0-(pParse->iSelfTab). The rowid (if any) is in a register + ** immediately prior to the first column. + */ + Column *pCol; + Table *pTab; + int iSrc; + int iCol = pExpr->iColumn; + assert( ExprUseYTab(pExpr) ); + pTab = pExpr->y.pTab; + assert( pTab!=0 ); + assert( iCol>=XN_ROWID ); + assert( iColnCol ); + if( iCol<0 ){ + return -1-pParse->iSelfTab; + } + pCol = pTab->aCol + iCol; + testcase( iCol!=sqlite3TableColumnToStorage(pTab,iCol) ); + iSrc = sqlite3TableColumnToStorage(pTab, iCol) - pParse->iSelfTab; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zCnName); + return 0; + } + pCol->colFlags |= COLFLAG_BUSY; + if( pCol->colFlags & COLFLAG_NOTAVAIL ){ + sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, iSrc); + } + pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); + return iSrc; + }else +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + if( pCol->affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp2(v, OP_SCopy, iSrc, target); + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + return target; + }else{ + return iSrc; + } + }else{ + /* Coding an expression that is part of an index where column names + ** in the index refer to the table to which the index belongs */ + iTab = pParse->iSelfTab - 1; + } + } + assert( ExprUseYTab(pExpr) ); + iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, + pExpr->iColumn, iTab, target, + pExpr->op2); + if( pExpr->y.pTab==0 && pExpr->affExpr==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } + return iReg; + } + case TK_INTEGER: { + codeInteger(pParse, pExpr, 0, target); + return target; + } + case TK_TRUEFALSE: { + sqlite3VdbeAddOp2(v, OP_Integer, sqlite3ExprTruthValue(pExpr), target); + return target; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + codeReal(v, pExpr->u.zToken, 0, target); + return target; + } +#endif + case TK_STRING: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3VdbeLoadString(v, target, pExpr->u.zToken); + return target; + } + default: { + /* Make NULL the default case so that if a bug causes an illegal + ** Expr node to be passed into this function, it will be handled + ** sanely and not crash. But keep the assert() to bring the problem + ** to the attention of the developers. */ + assert( op==TK_NULL || op==TK_ERROR || pParse->db->mallocFailed ); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + return target; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + int n; + const char *z; + char *zBlob; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); + assert( pExpr->u.zToken[1]=='\'' ); + z = &pExpr->u.zToken[2]; + n = sqlite3Strlen30(z) - 1; + assert( z[n]=='\'' ); + zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n); + sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC); + return target; + } +#endif + case TK_VARIABLE: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken!=0 ); + assert( pExpr->u.zToken[0]!=0 ); + sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); + if( pExpr->u.zToken[1]!=0 ){ + const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); + assert( pExpr->u.zToken[0]=='?' || (z && !strcmp(pExpr->u.zToken, z)) ); + pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ + sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); + } + return target; + } + case TK_REGISTER: { + return pExpr->iTable; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( inReg!=target ){ + sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); + inReg = target; + } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3VdbeAddOp2(v, OP_Cast, target, + sqlite3AffinityType(pExpr->u.zToken, 0)); + return inReg; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_IS: + case TK_ISNOT: + op = (op==TK_IS) ? TK_EQ : TK_NE; + p5 = SQLITE_NULLEQ; + /* fall-through */ + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + Expr *pLeft = pExpr->pLeft; + if( sqlite3ExprIsVector(pLeft) ){ + codeVectorCompare(pParse, pExpr, target, op, p5); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + sqlite3VdbeAddOp2(v, OP_Integer, 1, inReg); + codeCompare(pParse, pLeft, pExpr->pRight, op, r1, r2, + sqlite3VdbeCurrentAddr(v)+2, p5, + ExprHasProperty(pExpr,EP_Commuted)); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + if( p5==SQLITE_NULLEQ ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, inReg); + }else{ + sqlite3VdbeAddOp3(v, OP_ZeroOrNull, r1, inReg, r2); + } + testcase( regFree1==0 ); + testcase( regFree2==0 ); + } + break; + } + case TK_AND: + case TK_OR: + case TK_PLUS: + case TK_STAR: + case TK_MINUS: + case TK_REM: + case TK_BITAND: + case TK_BITOR: + case TK_SLASH: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: { + assert( TK_AND==OP_And ); testcase( op==TK_AND ); + assert( TK_OR==OP_Or ); testcase( op==TK_OR ); + assert( TK_PLUS==OP_Add ); testcase( op==TK_PLUS ); + assert( TK_MINUS==OP_Subtract ); testcase( op==TK_MINUS ); + assert( TK_REM==OP_Remainder ); testcase( op==TK_REM ); + assert( TK_BITAND==OP_BitAnd ); testcase( op==TK_BITAND ); + assert( TK_BITOR==OP_BitOr ); testcase( op==TK_BITOR ); + assert( TK_SLASH==OP_Divide ); testcase( op==TK_SLASH ); + assert( TK_LSHIFT==OP_ShiftLeft ); testcase( op==TK_LSHIFT ); + assert( TK_RSHIFT==OP_ShiftRight ); testcase( op==TK_RSHIFT ); + assert( TK_CONCAT==OP_Concat ); testcase( op==TK_CONCAT ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + sqlite3VdbeAddOp3(v, op, r2, r1, target); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_UMINUS: { + Expr *pLeft = pExpr->pLeft; + assert( pLeft ); + if( pLeft->op==TK_INTEGER ){ + codeInteger(pParse, pLeft, 1, target); + return target; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( pLeft->op==TK_FLOAT ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + codeReal(v, pLeft->u.zToken, 1, target); + return target; +#endif + }else{ + tempX.op = TK_INTEGER; + tempX.flags = EP_IntValue|EP_TokenOnly; + tempX.u.iValue = 0; + ExprClearVVAProperties(&tempX); + r1 = sqlite3ExprCodeTemp(pParse, &tempX, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2); + sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); + testcase( regFree2==0 ); + } + break; + } + case TK_BITNOT: + case TK_NOT: { + assert( TK_BITNOT==OP_BitNot ); testcase( op==TK_BITNOT ); + assert( TK_NOT==OP_Not ); testcase( op==TK_NOT ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + sqlite3VdbeAddOp2(v, op, r1, inReg); + break; + } + case TK_TRUTH: { + int isTrue; /* IS TRUE or IS NOT TRUE */ + int bNormal; /* IS TRUE or IS FALSE */ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + bNormal = pExpr->op2==TK_IS; + testcase( isTrue && bNormal); + testcase( !isTrue && bNormal); + sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !isTrue, isTrue ^ bNormal); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + int addr; + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); + sqlite3VdbeAddOp2(v, OP_Integer, 1, target); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + addr = sqlite3VdbeAddOp1(v, op, r1); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); + sqlite3VdbeAddOp2(v, OP_Integer, 0, target); + sqlite3VdbeJumpHere(v, addr); + break; + } + case TK_AGG_FUNCTION: { + AggInfo *pInfo = pExpr->pAggInfo; + if( pInfo==0 + || NEVER(pExpr->iAgg<0) + || NEVER(pExpr->iAgg>=pInfo->nFunc) + ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3ErrorMsg(pParse, "misuse of aggregate: %#T()", pExpr); + }else{ + return pInfo->aFunc[pExpr->iAgg].iMem; + } + break; + } + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + int nFarg; /* Number of function arguments */ + FuncDef *pDef; /* The function definition object */ + const char *zId; /* The function name */ + u32 constMask = 0; /* Mask of function arguments that are constant */ + int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* The database connection */ + u8 enc = ENC(db); /* The text encoding used by this database */ + CollSeq *pColl = 0; /* A collating sequence */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + return pExpr->y.pWin->regResult; + } +#endif + + if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ + /* SQL functions can be expensive. So try to avoid running them + ** multiple times if we know they always give the same result */ + return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); + } + assert( !ExprHasProperty(pExpr, EP_TokenOnly) ); + assert( ExprUseXList(pExpr) ); + pFarg = pExpr->x.pList; + nFarg = pFarg ? pFarg->nExpr : 0; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + zId = pExpr->u.zToken; + pDef = sqlite3FindFunction(db, zId, nFarg, enc, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 && pParse->explain ){ + pDef = sqlite3FindFunction(db, "unknown", nFarg, enc, 0); + } +#endif + if( pDef==0 || pDef->xFinalize!=0 ){ + sqlite3ErrorMsg(pParse, "unknown function: %#T()", pExpr); + break; + } + if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + assert( (pDef->funcFlags & SQLITE_FUNC_UNSAFE)==0 ); + assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); + return exprCodeInlineFunction(pParse, pFarg, + SQLITE_PTR_TO_INT(pDef->pUserData), target); + }else if( pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); + } + + for(i=0; ia[i].pExpr) ){ + testcase( i==31 ); + constMask |= MASKBIT32(i); + } + if( (pDef->funcFlags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ + pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); + } + } + if( pFarg ){ + if( constMask ){ + r1 = pParse->nMem+1; + pParse->nMem += nFarg; + }else{ + r1 = sqlite3GetTempRange(pParse, nFarg); + } + + /* For length() and typeof() functions with a column argument, + ** set the P5 parameter to the OP_Column opcode to OPFLAG_LENGTHARG + ** or OPFLAG_TYPEOFARG respectively, to avoid unnecessary data + ** loading. + */ + if( (pDef->funcFlags & (SQLITE_FUNC_LENGTH|SQLITE_FUNC_TYPEOF))!=0 ){ + u8 exprOp; + assert( nFarg==1 ); + assert( pFarg->a[0].pExpr!=0 ); + exprOp = pFarg->a[0].pExpr->op; + if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){ + assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); + assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); + testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); + pFarg->a[0].pExpr->op2 = + pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); + } + } + + sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, + SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); + }else{ + r1 = 0; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Possibly overload the function if the first argument is + ** a virtual table column. + ** + ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the + ** second argument, not the first, as the argument to test to + ** see if it is a column in a virtual table. This is done because + ** the left operand of infix functions (the operand we want to + ** control overloading) ends up as the second argument to the + ** function. The expression "A glob B" is equivalent to + ** "glob(B,A). We want to use the A in "A glob B" to test + ** for function overloading. But we use the B term in "glob(B,A)". + */ + if( nFarg>=2 && ExprHasProperty(pExpr, EP_InfixFunc) ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); + }else if( nFarg>0 ){ + pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); + } +#endif + if( pDef->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + if( !pColl ) pColl = db->pDfltColl; + sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, + pDef, pExpr->op2); + if( nFarg ){ + if( constMask==0 ){ + sqlite3ReleaseTempRange(pParse, r1, nFarg); + }else{ + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); + } + } + return target; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: + case TK_SELECT: { + int nCol; + testcase( op==TK_EXISTS ); + testcase( op==TK_SELECT ); + if( pParse->db->mallocFailed ){ + return 0; + }else if( op==TK_SELECT + && ALWAYS( ExprUseXSelect(pExpr) ) + && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 + ){ + sqlite3SubselectError(pParse, nCol, 1); + }else{ + return sqlite3CodeSubselect(pParse, pExpr); + } + break; + } + case TK_SELECT_COLUMN: { + int n; + Expr *pLeft = pExpr->pLeft; + if( pLeft->iTable==0 || pParse->withinRJSubrtn > pLeft->op2 ){ + pLeft->iTable = sqlite3CodeSubselect(pParse, pLeft); + pLeft->op2 = pParse->withinRJSubrtn; + } + assert( pLeft->op==TK_SELECT || pLeft->op==TK_ERROR ); + n = sqlite3ExprVectorSize(pLeft); + if( pExpr->iTable!=n ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pExpr->iTable, n); + } + return pLeft->iTable + pExpr->iColumn; + } + case TK_IN: { + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeAddOp2(v, OP_Integer, 1, target); + sqlite3VdbeResolveLabel(v, destIfFalse); + sqlite3VdbeAddOp2(v, OP_AddImm, target, 0); + sqlite3VdbeResolveLabel(v, destIfNull); + return target; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + exprCodeBetween(pParse, pExpr, target, 0, 0); + return target; + } + case TK_COLLATE: { + if( !ExprHasProperty(pExpr, EP_Collate) + && ALWAYS(pExpr->pLeft) + && pExpr->pLeft->op==TK_FUNCTION + ){ + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( inReg!=target ){ + sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); + inReg = target; + } + sqlite3VdbeAddOp1(v, OP_ClrSubtype, inReg); + return inReg; + }else{ + pExpr = pExpr->pLeft; + goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */ + } + } + case TK_SPAN: + case TK_UPLUS: { + pExpr = pExpr->pLeft; + goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */ + } + + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + ** + ** The expression is implemented using an OP_Param opcode. The p1 + ** parameter is set to 0 for an old.rowid reference, or to (i+1) + ** to reference another column of the old.* pseudo-table, where + ** i is the index of the column. For a new.rowid reference, p1 is + ** set to (n+1), where n is the number of columns in each pseudo-table. + ** For a reference to any other column in the new.* pseudo-table, p1 + ** is set to (n+2+i), where n and i are as defined previously. For + ** example, if the table on which triggers are being fired is + ** declared as: + ** + ** CREATE TABLE t1(a, b); + ** + ** Then p1 is interpreted as follows: + ** + ** p1==0 -> old.rowid p1==3 -> new.rowid + ** p1==1 -> old.a p1==4 -> new.a + ** p1==2 -> old.b p1==5 -> new.b + */ + Table *pTab; + int iCol; + int p1; + + assert( ExprUseYTab(pExpr) ); + pTab = pExpr->y.pTab; + iCol = pExpr->iColumn; + p1 = pExpr->iTable * (pTab->nCol+1) + 1 + + sqlite3TableColumnToStorage(pTab, iCol); + + assert( pExpr->iTable==0 || pExpr->iTable==1 ); + assert( iCol>=-1 && iColnCol ); + assert( pTab->iPKey<0 || iCol!=pTab->iPKey ); + assert( p1>=0 && p1<(pTab->nCol*2+2) ); + + sqlite3VdbeAddOp2(v, OP_Param, p1, target); + VdbeComment((v, "r[%d]=%s.%s", target, + (pExpr->iTable ? "new" : "old"), + (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zCnName) + )); + +#ifndef SQLITE_OMIT_FLOATING_POINT + /* If the column has REAL affinity, it may currently be stored as an + ** integer. Use OP_RealAffinity to make sure it is really real. + ** + ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to + ** floating point when extracting it from the record. */ + if( iCol>=0 && pTab->aCol[iCol].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + } +#endif + break; + } + + case TK_VECTOR: { + sqlite3ErrorMsg(pParse, "row value misused"); + break; + } + + /* TK_IF_NULL_ROW Expr nodes are inserted ahead of expressions + ** that derive from the right-hand table of a LEFT JOIN. The + ** Expr.iTable value is the table number for the right-hand table. + ** The expression is only evaluated if that table is not currently + ** on a LEFT JOIN NULL row. + */ + case TK_IF_NULL_ROW: { + int addrINR; + u8 okConstFactor = pParse->okConstFactor; + addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); + /* Temporarily disable factoring of constant expressions, since + ** even though expressions may appear to be constant, they are not + ** really constant because they originate from the right-hand side + ** of a LEFT JOIN. */ + pParse->okConstFactor = 0; + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + pParse->okConstFactor = okConstFactor; + sqlite3VdbeJumpHere(v, addrINR); + sqlite3VdbeChangeP3(v, addrINR, inReg); + break; + } + + /* + ** Form A: + ** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END + ** + ** Form B: + ** CASE WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END + ** + ** Form A is can be transformed into the equivalent form B as follows: + ** CASE WHEN x=e1 THEN r1 WHEN x=e2 THEN r2 ... + ** WHEN x=eN THEN rN ELSE y END + ** + ** X (if it exists) is in pExpr->pLeft. + ** Y is in the last element of pExpr->x.pList if pExpr->x.pList->nExpr is + ** odd. The Y is also optional. If the number of elements in x.pList + ** is even, then Y is omitted and the "otherwise" result is NULL. + ** Ei is in pExpr->pList->a[i*2] and Ri is pExpr->pList->a[i*2+1]. + ** + ** The result of the expression is the Ri for the first matching Ei, + ** or if there is no matching Ei, the ELSE term Y, or if there is + ** no ELSE term, NULL. + */ + case TK_CASE: { + int endLabel; /* GOTO label for end of CASE stmt */ + int nextCase; /* GOTO label for next WHEN clause */ + int nExpr; /* 2x number of WHEN terms */ + int i; /* Loop counter */ + ExprList *pEList; /* List of WHEN terms */ + struct ExprList_item *aListelem; /* Array of WHEN terms */ + Expr opCompare; /* The X==Ei expression */ + Expr *pX; /* The X expression */ + Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; + + assert( ExprUseXList(pExpr) && pExpr->x.pList!=0 ); + assert(pExpr->x.pList->nExpr > 0); + pEList = pExpr->x.pList; + aListelem = pEList->a; + nExpr = pEList->nExpr; + endLabel = sqlite3VdbeMakeLabel(pParse); + if( (pX = pExpr->pLeft)!=0 ){ + pDel = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDel); + break; + } + testcase( pX->op==TK_COLUMN ); + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + testcase( regFree1==0 ); + memset(&opCompare, 0, sizeof(opCompare)); + opCompare.op = TK_EQ; + opCompare.pLeft = pDel; + pTest = &opCompare; + /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: + ** The value in regFree1 might get SCopy-ed into the file result. + ** So make sure that the regFree1 register is not reused for other + ** purposes and possibly overwritten. */ + regFree1 = 0; + } + for(i=0; iop==TK_COLUMN ); + sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); + testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); + sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); + sqlite3VdbeGoto(v, endLabel); + sqlite3VdbeResolveLabel(v, nextCase); + } + if( (nExpr&1)!=0 ){ + sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + sqlite3ExprDelete(db, pDel); + setDoNotMergeFlagOnCopy(v); + sqlite3VdbeResolveLabel(v, endLabel); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + assert( pExpr->affExpr==OE_Rollback + || pExpr->affExpr==OE_Abort + || pExpr->affExpr==OE_Fail + || pExpr->affExpr==OE_Ignore + ); + if( !pParse->pTriggerTab && !pParse->nested ){ + sqlite3ErrorMsg(pParse, + "RAISE() may only be used within a trigger-program"); + return 0; + } + if( pExpr->affExpr==OE_Abort ){ + sqlite3MayAbort(pParse); + } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + if( pExpr->affExpr==OE_Ignore ){ + sqlite3VdbeAddOp4( + v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); + VdbeCoverage(v); + }else{ + sqlite3HaltConstraint(pParse, + pParse->pTriggerTab ? SQLITE_CONSTRAINT_TRIGGER : SQLITE_ERROR, + pExpr->affExpr, pExpr->u.zToken, 0, 0); + } + + break; + } +#endif + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); + return inReg; +} + +/* +** Generate code that will evaluate expression pExpr just one time +** per prepared statement execution. +** +** If the expression uses functions (that might throw an exception) then +** guard them with an OP_Once opcode to ensure that the code is only executed +** once. If no functions are involved, then factor the code out and put it at +** the end of the prepared statement in the initialization section. +** +** If regDest>=0 then the result is always stored in that register and the +** result is not reusable. If regDest<0 then this routine is free to +** store the value whereever it wants. The register where the expression +** is stored is returned. When regDest<0, two identical expressions might +** code to the same register, if they do not contain function calls and hence +** are factored out into the initialization section at the end of the +** prepared statement. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The expression to code when the VDBE initializes */ + int regDest /* Store the value in this register */ +){ + ExprList *p; + assert( ConstFactorOk(pParse) ); + p = pParse->pConstExpr; + if( regDest<0 && p ){ + struct ExprList_item *pItem; + int i; + for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ + if( pItem->fg.reusable + && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 + ){ + return pItem->u.iConstExprReg; + } + } + } + pExpr = sqlite3ExprDup(pParse->db, pExpr, 0); + if( pExpr!=0 && ExprHasProperty(pExpr, EP_HasFunc) ){ + Vdbe *v = pParse->pVdbe; + int addr; + assert( v ); + addr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + pParse->okConstFactor = 0; + if( !pParse->db->mallocFailed ){ + if( regDest<0 ) regDest = ++pParse->nMem; + sqlite3ExprCode(pParse, pExpr, regDest); + } + pParse->okConstFactor = 1; + sqlite3ExprDelete(pParse->db, pExpr); + sqlite3VdbeJumpHere(v, addr); + }else{ + p = sqlite3ExprListAppend(pParse, p, pExpr); + if( p ){ + struct ExprList_item *pItem = &p->a[p->nExpr-1]; + pItem->fg.reusable = regDest<0; + if( regDest<0 ) regDest = ++pParse->nMem; + pItem->u.iConstExprReg = regDest; + } + pParse->pConstExpr = p; + } + return regDest; +} + +/* +** Generate code to evaluate an expression and store the results +** into a register. Return the register number where the results +** are stored. +** +** If the register is a temporary register that can be deallocated, +** then write its number into *pReg. If the result register is not +** a temporary, then set *pReg to zero. +** +** If pExpr is a constant, then this routine might generate this +** code to fill the register in the initialization section of the +** VDBE program, in order to factor it out of the evaluation loop. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ + int r2; + pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); + if( ConstFactorOk(pParse) + && ALWAYS(pExpr!=0) + && pExpr->op!=TK_REGISTER + && sqlite3ExprIsConstantNotJoin(pExpr) + ){ + *pReg = 0; + r2 = sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); + }else{ + int r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); + if( r2==r1 ){ + *pReg = r1; + }else{ + sqlite3ReleaseTempReg(pParse, r1); + *pReg = 0; + } + } + return r2; +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. +*/ +SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ + int inReg; + + assert( pExpr==0 || !ExprHasVVAProperty(pExpr,EP_Immutable) ); + assert( target>0 && target<=pParse->nMem ); + assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); + if( pParse->pVdbe==0 ) return; + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + if( inReg!=target ){ + u8 op; + if( ALWAYS(pExpr) && ExprHasProperty(pExpr,EP_Subquery) ){ + op = OP_Copy; + }else{ + op = OP_SCopy; + } + sqlite3VdbeAddOp2(pParse->pVdbe, op, inReg, target); + } +} + +/* +** Make a transient copy of expression pExpr and then code it using +** sqlite3ExprCode(). This routine works just like sqlite3ExprCode() +** except that the input expression is guaranteed to be unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ + sqlite3 *db = pParse->db; + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( !db->mallocFailed ) sqlite3ExprCode(pParse, pExpr, target); + sqlite3ExprDelete(db, pExpr); +} + +/* +** Generate code that will evaluate expression pExpr and store the +** results in register target. The results are guaranteed to appear +** in register target. If the expression is constant, then this routine +** might choose to code the expression at initialization time. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ + if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){ + sqlite3ExprCodeRunJustOnce(pParse, pExpr, target); + }else{ + sqlite3ExprCodeCopy(pParse, pExpr, target); + } +} + +/* +** Generate code that pushes the value of every element of the given +** expression list into a sequence of registers beginning at target. +** +** Return the number of elements evaluated. The number returned will +** usually be pList->nExpr but might be reduced if SQLITE_ECEL_OMITREF +** is defined. +** +** The SQLITE_ECEL_DUP flag prevents the arguments from being +** filled using OP_SCopy. OP_Copy must be used instead. +** +** The SQLITE_ECEL_FACTOR argument allows constant arguments to be +** factored out into initialization code. +** +** The SQLITE_ECEL_REF flag means that expressions in the list with +** ExprList.a[].u.x.iOrderByCol>0 have already been evaluated and stored +** in registers at srcReg, and so the value can be copied from there. +** If SQLITE_ECEL_OMITREF is also set, then the values with u.x.iOrderByCol>0 +** are simply omitted rather than being copied from srcReg. +*/ +SQLITE_PRIVATE int sqlite3ExprCodeExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* The expression list to be coded */ + int target, /* Where to write results */ + int srcReg, /* Source registers if SQLITE_ECEL_REF */ + u8 flags /* SQLITE_ECEL_* flags */ +){ + struct ExprList_item *pItem; + int i, j, n; + u8 copyOp = (flags & SQLITE_ECEL_DUP) ? OP_Copy : OP_SCopy; + Vdbe *v = pParse->pVdbe; + assert( pList!=0 ); + assert( target>0 ); + assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ + n = pList->nExpr; + if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; + for(pItem=pList->a, i=0; ipExpr; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pItem->fg.bSorterRef ){ + i--; + n--; + }else +#endif + if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){ + if( flags & SQLITE_ECEL_OMITREF ){ + i--; + n--; + }else{ + sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); + } + }else if( (flags & SQLITE_ECEL_FACTOR)!=0 + && sqlite3ExprIsConstantNotJoin(pExpr) + ){ + sqlite3ExprCodeRunJustOnce(pParse, pExpr, target+i); + }else{ + int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); + if( inReg!=target+i ){ + VdbeOp *pOp; + 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->p5==0 /* The do-not-merge flag must be clear */ + ){ + pOp->p3++; + }else{ + sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); + } + } + } + } + return n; +} + +/* +** Generate code for a BETWEEN operator. +** +** x BETWEEN y AND z +** +** The above is equivalent to +** +** x>=y AND x<=z +** +** Code it as such, taking care to do the common subexpression +** elimination of x. +** +** The xJumpIf parameter determines details: +** +** NULL: Store the boolean result in reg[dest] +** sqlite3ExprIfTrue: Jump to dest if true +** sqlite3ExprIfFalse: Jump to dest if false +** +** The jumpIfNull parameter is ignored if xJumpIf is NULL. +*/ +static void exprCodeBetween( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The BETWEEN expression */ + int dest, /* Jump destination or storage location */ + void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ + int jumpIfNull /* Take the jump if the BETWEEN is NULL */ +){ + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ + Expr compLeft; /* The x>=y term */ + Expr compRight; /* The x<=z term */ + int regFree1 = 0; /* Temporary use register */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; + + memset(&compLeft, 0, sizeof(Expr)); + memset(&compRight, 0, sizeof(Expr)); + memset(&exprAnd, 0, sizeof(Expr)); + + assert( ExprUseXList(pExpr) ); + pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); + if( db->mallocFailed==0 ){ + exprAnd.op = TK_AND; + exprAnd.pLeft = &compLeft; + exprAnd.pRight = &compRight; + compLeft.op = TK_GE; + compLeft.pLeft = pDel; + compLeft.pRight = pExpr->x.pList->a[0].pExpr; + compRight.op = TK_LE; + compRight.pLeft = pDel; + compRight.pRight = pExpr->x.pList->a[1].pExpr; + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + if( xJump ){ + xJump(pParse, &exprAnd, dest, jumpIfNull); + }else{ + /* Mark the expression is being from the ON or USING clause of a join + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move + ** it into the Parse.pConstExpr list. We should use a new bit for this, + ** for clarity, but we are out of bits in the Expr.flags field so we + ** have to reuse the EP_OuterON bit. Bummer. */ + pDel->flags |= EP_OuterON; + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + } + sqlite3ReleaseTempReg(pParse, regFree1); + } + sqlite3ExprDelete(db, pDel); + + /* Ensure adequate test coverage */ + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==0 ); +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is true but execution +** continues straight thru if the expression is false. +** +** If the expression evaluates to NULL (neither true nor false), then +** take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL. +** +** This code depends on the fact that certain token values (ex: TK_EQ) +** are the same as opcode values (ex: OP_Eq) that implement the corresponding +** operation. Special comments in vdbe.c and the mkopcodeh.awk script in +** the make process cause these values to align. Assert()s in the code +** below verify that the numbers are aligned correctly. +*/ +SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int regFree1 = 0; + int regFree2 = 0; + int r1, r2; + + assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); + if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ + if( NEVER(pExpr==0) ) return; /* No way this can happen */ + assert( !ExprHasVVAProperty(pExpr, EP_Immutable) ); + op = pExpr->op; + switch( op ){ + case TK_AND: + case TK_OR: { + Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); + }else if( op==TK_AND ){ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + }else{ + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); + } + break; + } + case TK_NOT: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_TRUTH: { + int isNot; /* IS NOT TRUE or IS NOT FALSE */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + testcase( jumpIfNull==0 ); + isNot = pExpr->op2==TK_ISNOT; + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + testcase( isTrue && isNot ); + testcase( !isTrue && isNot ); + if( isTrue ^ isNot ){ + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, + isNot ? SQLITE_JUMPIFNULL : 0); + }else{ + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, + isNot ? SQLITE_JUMPIFNULL : 0); + } + break; + } + case TK_IS: + case TK_ISNOT: + testcase( op==TK_IS ); + testcase( op==TK_ISNOT ); + op = (op==TK_IS) ? TK_EQ : TK_NE; + jumpIfNull = SQLITE_NULLEQ; + /* no break */ deliberate_fall_through + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; + testcase( jumpIfNull==0 ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, + r1, r2, dest, jumpIfNull, ExprHasProperty(pExpr,EP_Commuted)); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + assert( TK_ISNULL==OP_IsNull ); testcase( op==TK_ISNULL ); + assert( TK_NOTNULL==OP_NotNull ); testcase( op==TK_NOTNULL ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp2(v, op, r1, dest); + VdbeCoverageIf(v, op==TK_ISNULL); + VdbeCoverageIf(v, op==TK_NOTNULL); + testcase( regFree1==0 ); + break; + } + case TK_BETWEEN: { + testcase( jumpIfNull==0 ); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfTrue, jumpIfNull); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_IN: { + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = jumpIfNull ? dest : destIfFalse; + sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); + sqlite3VdbeGoto(v, dest); + sqlite3VdbeResolveLabel(v, destIfFalse); + break; + } +#endif + default: { + default_expr: + if( ExprAlwaysTrue(pExpr) ){ + sqlite3VdbeGoto(v, dest); + }else if( ExprAlwaysFalse(pExpr) ){ + /* No-op */ + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); + sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); + testcase( regFree1==0 ); + testcase( jumpIfNull==0 ); + } + break; + } + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); +} + +/* +** Generate code for a boolean expression such that a jump is made +** to the label "dest" if the expression is false but execution +** continues straight thru if the expression is true. +** +** If the expression evaluates to NULL (neither true nor false) then +** jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull +** is 0. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ + Vdbe *v = pParse->pVdbe; + int op = 0; + int regFree1 = 0; + int regFree2 = 0; + int r1, r2; + + assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); + if( NEVER(v==0) ) return; /* Existence of VDBE checked by caller */ + if( pExpr==0 ) return; + assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + + /* The value of pExpr->op and op are related as follows: + ** + ** pExpr->op op + ** --------- ---------- + ** TK_ISNULL OP_NotNull + ** TK_NOTNULL OP_IsNull + ** TK_NE OP_Eq + ** TK_EQ OP_Ne + ** TK_GT OP_Le + ** TK_LE OP_Gt + ** TK_GE OP_Lt + ** TK_LT OP_Ge + ** + ** For other values of pExpr->op, op is undefined and unused. + ** The value of TK_ and OP_ constants are arranged such that we + ** can compute the mapping above using the following expression. + ** Assert()s verify that the computation is correct. + */ + op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1); + + /* Verify correct alignment of TK_ and OP_ constants + */ + assert( pExpr->op!=TK_ISNULL || op==OP_NotNull ); + assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull ); + assert( pExpr->op!=TK_NE || op==OP_Eq ); + assert( pExpr->op!=TK_EQ || op==OP_Ne ); + assert( pExpr->op!=TK_LT || op==OP_Ge ); + assert( pExpr->op!=TK_LE || op==OP_Gt ); + assert( pExpr->op!=TK_GT || op==OP_Le ); + assert( pExpr->op!=TK_GE || op==OP_Lt ); + + switch( pExpr->op ){ + case TK_AND: + case TK_OR: { + Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if( pAlt!=pExpr ){ + sqlite3ExprIfFalse(pParse, pAlt, dest, jumpIfNull); + }else if( pExpr->op==TK_AND ){ + testcase( jumpIfNull==0 ); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + }else{ + int d2 = sqlite3VdbeMakeLabel(pParse); + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, + jumpIfNull^SQLITE_JUMPIFNULL); + sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); + sqlite3VdbeResolveLabel(v, d2); + } + break; + } + case TK_NOT: { + testcase( jumpIfNull==0 ); + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); + break; + } + case TK_TRUTH: { + int isNot; /* IS NOT TRUE or IS NOT FALSE */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + testcase( jumpIfNull==0 ); + isNot = pExpr->op2==TK_ISNOT; + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + testcase( isTrue && isNot ); + testcase( !isTrue && isNot ); + if( isTrue ^ isNot ){ + /* IS TRUE and IS NOT FALSE */ + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, + isNot ? 0 : SQLITE_JUMPIFNULL); + + }else{ + /* IS FALSE and IS NOT TRUE */ + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, + isNot ? 0 : SQLITE_JUMPIFNULL); + } + break; + } + case TK_IS: + case TK_ISNOT: + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; + jumpIfNull = SQLITE_NULLEQ; + /* no break */ deliberate_fall_through + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_NE: + case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; + testcase( jumpIfNull==0 ); + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, + r1, r2, dest, jumpIfNull,ExprHasProperty(pExpr,EP_Commuted)); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + break; + } + case TK_ISNULL: + case TK_NOTNULL: { + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp2(v, op, r1, dest); + testcase( op==TK_ISNULL ); VdbeCoverageIf(v, op==TK_ISNULL); + testcase( op==TK_NOTNULL ); VdbeCoverageIf(v, op==TK_NOTNULL); + testcase( regFree1==0 ); + break; + } + case TK_BETWEEN: { + testcase( jumpIfNull==0 ); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfFalse, jumpIfNull); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_IN: { + if( jumpIfNull ){ + sqlite3ExprCodeIN(pParse, pExpr, dest, dest); + }else{ + int destIfNull = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); + sqlite3VdbeResolveLabel(v, destIfNull); + } + break; + } +#endif + default: { + default_expr: + if( ExprAlwaysFalse(pExpr) ){ + sqlite3VdbeGoto(v, dest); + }else if( ExprAlwaysTrue(pExpr) ){ + /* no-op */ + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); + sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); + VdbeCoverage(v); + testcase( regFree1==0 ); + testcase( jumpIfNull==0 ); + } + break; + } + } + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); +} + +/* +** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before +** code generation, and that copy is deleted after code generation. This +** ensures that the original pExpr is unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ + sqlite3 *db = pParse->db; + Expr *pCopy = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed==0 ){ + sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull); + } + sqlite3ExprDelete(db, pCopy); +} + +/* +** Expression pVar is guaranteed to be an SQL variable. pExpr may be any +** type of expression. +** +** If pExpr is a simple SQL value - an integer, real, string, blob +** or NULL value - then the VDBE currently being prepared is configured +** to re-prepare each time a new value is bound to variable pVar. +** +** Additionally, if pExpr is a simple SQL value and the value is the +** same as that currently bound to variable pVar, non-zero is returned. +** Otherwise, if the values are not the same or if pExpr is not a simple +** SQL value, zero is returned. +*/ +static int exprCompareVariable( + const Parse *pParse, + const Expr *pVar, + const Expr *pExpr +){ + int res = 0; + int iVar; + sqlite3_value *pL, *pR = 0; + + sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR); + if( pR ){ + iVar = pVar->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iVar); + pL = sqlite3VdbeGetBoundValue(pParse->pReprepare, iVar, SQLITE_AFF_BLOB); + if( pL ){ + if( sqlite3_value_type(pL)==SQLITE_TEXT ){ + sqlite3_value_text(pL); /* Make sure the encoding is UTF-8 */ + } + res = 0==sqlite3MemCompare(pL, pR, 0); + } + sqlite3ValueFree(pR); + sqlite3ValueFree(pL); + } + + return res; +} + +/* +** Do a deep comparison of two expression trees. Return 0 if the two +** expressions are completely identical. Return 1 if they differ only +** by a COLLATE operator at the top level. Return 2 if there are differences +** other than the top-level COLLATE operator. +** +** If any subelement of pB has Expr.iTable==(-1) then it is allowed +** to compare equal to an equivalent element in pA with Expr.iTable==iTab. +** +** The pA side might be using TK_REGISTER. If that is the case and pB is +** not using TK_REGISTER but is otherwise equivalent, then still return 0. +** +** Sometimes this routine will return 2 even if the two expressions +** really are equivalent. If we cannot prove that the expressions are +** identical, we return 2 just to be safe. So if this routine +** returns 2, then you do not really know for certain if the two +** expressions are the same. But if you get a 0 or 1 return, then you +** can be sure the expressions are the same. In the places where +** this routine is used, it does not hurt to get an extra 2 - that +** just might result in some slightly slower code. But returning +** an incorrect 0 or 1 could lead to a malfunction. +** +** If pParse is not NULL then TK_VARIABLE terms in pA with bindings in +** pParse->pReprepare can be matched against literals in pB. The +** pParse->pVdbe->expmask bitmask is updated for each variable referenced. +** If pParse is NULL (the normal case) then any TK_VARIABLE term in +** Argument pParse should normally be NULL. If it is not NULL and pA or +** pB causes a return value of 2. +*/ +SQLITE_PRIVATE int sqlite3ExprCompare( + const Parse *pParse, + const Expr *pA, + const Expr *pB, + int iTab +){ + u32 combinedFlags; + if( pA==0 || pB==0 ){ + return pB==pA ? 0 : 2; + } + if( pParse && pA->op==TK_VARIABLE && exprCompareVariable(pParse, pA, pB) ){ + return 0; + } + combinedFlags = pA->flags | pB->flags; + if( combinedFlags & EP_IntValue ){ + if( (pA->flags&pB->flags&EP_IntValue)!=0 && pA->u.iValue==pB->u.iValue ){ + return 0; + } + return 2; + } + if( pA->op!=pB->op || pA->op==TK_RAISE ){ + if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ + return 1; + } + if( pB->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA,pB->pLeft,iTab)<2 ){ + return 1; + } + return 2; + } + assert( !ExprHasProperty(pA, EP_IntValue) ); + assert( !ExprHasProperty(pB, EP_IntValue) ); + if( pA->u.zToken ){ + if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ + if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( pA->op==pB->op ); + if( ExprHasProperty(pA,EP_WinFunc)!=ExprHasProperty(pB,EP_WinFunc) ){ + return 2; + } + if( ExprHasProperty(pA,EP_WinFunc) ){ + if( sqlite3WindowCompare(pParse, pA->y.pWin, pB->y.pWin, 1)!=0 ){ + return 2; + } + } +#endif + }else if( pA->op==TK_NULL ){ + return 0; + }else if( pA->op==TK_COLLATE ){ + if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; + }else + if( pB->u.zToken!=0 + && pA->op!=TK_COLUMN + && pA->op!=TK_AGG_COLUMN + && strcmp(pA->u.zToken,pB->u.zToken)!=0 + ){ + return 2; + } + } + if( (pA->flags & (EP_Distinct|EP_Commuted)) + != (pB->flags & (EP_Distinct|EP_Commuted)) ) return 2; + if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( combinedFlags & EP_xIsSelect ) return 2; + if( (combinedFlags & EP_FixedCol)==0 + && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; + if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; + if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; + if( pA->op!=TK_STRING + && pA->op!=TK_TRUEFALSE + && ALWAYS((combinedFlags & EP_Reduced)==0) + ){ + if( pA->iColumn!=pB->iColumn ) return 2; + if( pA->op2!=pB->op2 && pA->op==TK_TRUTH ) return 2; + if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ + return 2; + } + } + } + return 0; +} + +/* +** Compare two ExprList objects. Return 0 if they are identical, 1 +** if they are certainly different, or 2 if it is not possible to +** determine if they are identical or not. +** +** If any subelement of pB has Expr.iTable==(-1) then it is allowed +** to compare equal to an equivalent element in pA with Expr.iTable==iTab. +** +** This routine might return non-zero for equivalent ExprLists. The +** only consequence will be disabled optimizations. But this routine +** must never return 0 if the two ExprList objects are different, or +** a malfunction will result. +** +** Two NULL pointers are considered to be the same. But a NULL pointer +** always differs from a non-NULL pointer. +*/ +SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB, int iTab){ + int i; + if( pA==0 && pB==0 ) return 0; + if( pA==0 || pB==0 ) return 1; + if( pA->nExpr!=pB->nExpr ) return 1; + for(i=0; inExpr; i++){ + int res; + Expr *pExprA = pA->a[i].pExpr; + Expr *pExprB = pB->a[i].pExpr; + if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1; + if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; + } + return 0; +} + +/* +** Like sqlite3ExprCompare() except COLLATE operators at the top-level +** are ignored. +*/ +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){ + return sqlite3ExprCompare(0, + sqlite3ExprSkipCollateAndLikely(pA), + sqlite3ExprSkipCollateAndLikely(pB), + iTab); +} + +/* +** Return non-zero if Expr p can only be true if pNN is not NULL. +** +** Or if seenNot is true, return non-zero if Expr p can only be +** non-NULL if pNN is not NULL +*/ +static int exprImpliesNotNull( + const Parse *pParse,/* Parsing context */ + const Expr *p, /* The expression to be checked */ + const Expr *pNN, /* The expression that is NOT NULL */ + int iTab, /* Table being evaluated */ + int seenNot /* Return true only if p can be any non-NULL value */ +){ + assert( p ); + assert( pNN ); + if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ){ + return pNN->op!=TK_NULL; + } + switch( p->op ){ + case TK_IN: { + if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; + assert( ExprUseXSelect(p) || (p->x.pList!=0 && p->x.pList->nExpr>0) ); + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_BETWEEN: { + ExprList *pList; + assert( ExprUseXList(p) ); + pList = p->x.pList; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + if( seenNot ) return 0; + if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1) + || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1) + ){ + return 1; + } + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_PLUS: + case TK_MINUS: + case TK_BITOR: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: + seenNot = 1; + /* no break */ deliberate_fall_through + case TK_STAR: + case TK_REM: + case TK_BITAND: + case TK_SLASH: { + if( exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot) ) return 1; + /* no break */ deliberate_fall_through + } + case TK_SPAN: + case TK_COLLATE: + case TK_UPLUS: + case TK_UMINUS: { + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); + } + case TK_TRUTH: { + if( seenNot ) return 0; + if( p->op2!=TK_IS ) return 0; + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + case TK_BITNOT: + case TK_NOT: { + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); + } + } + return 0; +} + +/* +** Return true if we can prove the pE2 will always be true if pE1 is +** true. Return false if we cannot complete the proof or if pE2 might +** be false. Examples: +** +** pE1: x==5 pE2: x==5 Result: true +** pE1: x>0 pE2: x==5 Result: false +** pE1: x=21 pE2: x=21 OR y=43 Result: true +** pE1: x!=123 pE2: x IS NOT NULL Result: true +** pE1: x!=?1 pE2: x IS NOT NULL Result: true +** pE1: x IS NULL pE2: x IS NOT NULL Result: false +** pE1: x IS ?2 pE2: x IS NOT NULL Reuslt: false +** +** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has +** Expr.iTable<0 then assume a table number given by iTab. +** +** If pParse is not NULL, then the values of bound variables in pE1 are +** compared against literal values in pE2 and pParse->pVdbe->expmask is +** modified to record which bound variables are referenced. If pParse +** is NULL, then false will be returned if pE1 contains any bound variables. +** +** When in doubt, return false. Returning true might give a performance +** improvement. Returning false might cause a performance reduction, but +** it will always give the correct answer and is hence always safe. +*/ +SQLITE_PRIVATE int sqlite3ExprImpliesExpr( + const Parse *pParse, + const Expr *pE1, + const Expr *pE2, + int iTab +){ + if( sqlite3ExprCompare(pParse, pE1, pE2, iTab)==0 ){ + return 1; + } + if( pE2->op==TK_OR + && (sqlite3ExprImpliesExpr(pParse, pE1, pE2->pLeft, iTab) + || sqlite3ExprImpliesExpr(pParse, pE1, pE2->pRight, iTab) ) + ){ + return 1; + } + if( pE2->op==TK_NOTNULL + && exprImpliesNotNull(pParse, pE1, pE2->pLeft, iTab, 0) + ){ + return 1; + } + return 0; +} + +/* +** This is the Expr node callback for sqlite3ExprImpliesNonNullRow(). +** If the expression node requires that the table at pWalker->iCur +** have one or more non-NULL column, then set pWalker->eCode to 1 and abort. +** +** This routine controls an optimization. False positives (setting +** pWalker->eCode to 1 when it should not be) are deadly, but false-negatives +** (never setting pWalker->eCode) is a harmless missed optimization. +*/ +static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ + testcase( pExpr->op==TK_AGG_COLUMN ); + testcase( pExpr->op==TK_AGG_FUNCTION ); + if( ExprHasProperty(pExpr, EP_OuterON) ) return WRC_Prune; + switch( pExpr->op ){ + case TK_ISNOT: + case TK_ISNULL: + case TK_NOTNULL: + case TK_IS: + case TK_OR: + case TK_VECTOR: + case TK_CASE: + case TK_IN: + case TK_FUNCTION: + case TK_TRUTH: + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_OR ); + testcase( pExpr->op==TK_VECTOR ); + testcase( pExpr->op==TK_CASE ); + testcase( pExpr->op==TK_IN ); + testcase( pExpr->op==TK_FUNCTION ); + testcase( pExpr->op==TK_TRUTH ); + return WRC_Prune; + case TK_COLUMN: + if( pWalker->u.iCur==pExpr->iTable ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Prune; + + case TK_AND: + if( pWalker->eCode==0 ){ + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pExpr->pRight); + } + } + return WRC_Prune; + + case TK_BETWEEN: + if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){ + assert( pWalker->eCode ); + return WRC_Abort; + } + return WRC_Prune; + + /* Virtual tables are allowed to use constraints like x=NULL. So + ** a term of the form x=y does not prove that y is not null if x + ** is the column of a virtual table */ + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: { + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + /* The y.pTab=0 assignment in wherecode.c always happens after the + ** impliesNotNullRow() test */ + assert( pLeft->op!=TK_COLUMN || ExprUseYTab(pLeft) ); + assert( pRight->op!=TK_COLUMN || ExprUseYTab(pRight) ); + if( (pLeft->op==TK_COLUMN + && pLeft->y.pTab!=0 + && IsVirtual(pLeft->y.pTab)) + || (pRight->op==TK_COLUMN + && pRight->y.pTab!=0 + && IsVirtual(pRight->y.pTab)) + ){ + return WRC_Prune; + } + /* no break */ deliberate_fall_through + } + default: + return WRC_Continue; + } +} + +/* +** Return true (non-zero) if expression p can only be true if at least +** one column of table iTab is non-null. In other words, return true +** if expression p will always be NULL or false if every column of iTab +** is NULL. +** +** False negatives are acceptable. In other words, it is ok to return +** zero even if expression p will never be true of every column of iTab +** is NULL. A false negative is merely a missed optimization opportunity. +** +** False positives are not allowed, however. A false positive may result +** in an incorrect answer. +** +** Terms of p that are marked with EP_OuterON (and hence that come from +** the ON or USING clauses of OUTER JOINS) are excluded from the analysis. +** +** This routine is used to check if a LEFT JOIN can be converted into +** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE +** clause requires that some column of the right table of the LEFT JOIN +** be non-NULL, then the LEFT JOIN can be safely converted into an +** ordinary join. +*/ +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ + Walker w; + p = sqlite3ExprSkipCollateAndLikely(p); + if( p==0 ) return 0; + if( p->op==TK_NOTNULL ){ + p = p->pLeft; + }else{ + while( p->op==TK_AND ){ + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + p = p->pRight; + } + } + w.xExprCallback = impliesNotNullRow; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + w.eCode = 0; + w.u.iCur = iTab; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** An instance of the following structure is used by the tree walker +** to determine if an expression can be evaluated by reference to the +** index only, without having to do a search for the corresponding +** table entry. The IdxCover.pIdx field is the index. IdxCover.iCur +** is the cursor for the table. +*/ +struct IdxCover { + Index *pIdx; /* The index to be tested for coverage */ + int iCur; /* Cursor number for the table corresponding to the index */ +}; + +/* +** Check to see if there are references to columns in table +** pWalker->u.pIdxCover->iCur can be satisfied using the index +** pWalker->u.pIdxCover->pIdx. +*/ +static int exprIdxCover(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pWalker->u.pIdxCover->iCur + && sqlite3TableColumnToIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Determine if an index pIdx on table with cursor iCur contains will +** the expression pExpr. Return true if the index does cover the +** expression and false if the pExpr expression references table columns +** that are not found in the index pIdx. +** +** An index covering an expression means that the expression can be +** evaluated using only the index and without having to lookup the +** corresponding table entry. +*/ +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( + Expr *pExpr, /* The index to be tested */ + int iCur, /* The cursor number for the corresponding table */ + Index *pIdx /* The index that might be used for coverage */ +){ + Walker w; + struct IdxCover xcov; + memset(&w, 0, sizeof(w)); + xcov.iCur = iCur; + xcov.pIdx = pIdx; + w.xExprCallback = exprIdxCover; + w.u.pIdxCover = &xcov; + sqlite3WalkExpr(&w, pExpr); + return !w.eCode; +} + + +/* Structure used to pass information throught the Walker in order to +** implement sqlite3ReferencesSrcList(). +*/ +struct RefSrcList { + sqlite3 *db; /* Database connection used for sqlite3DbRealloc() */ + SrcList *pRef; /* Looking for references to these tables */ + i64 nExclude; /* Number of tables to exclude from the search */ + int *aiExclude; /* Cursor IDs for tables to exclude from the search */ +}; + +/* +** Walker SELECT callbacks for sqlite3ReferencesSrcList(). +** +** When entering a new subquery on the pExpr argument, add all FROM clause +** entries for that subquery to the exclude list. +** +** When leaving the subquery, remove those entries from the exclude list. +*/ +static int selectRefEnter(Walker *pWalker, Select *pSelect){ + struct RefSrcList *p = pWalker->u.pRefSrcList; + SrcList *pSrc = pSelect->pSrc; + i64 i, j; + int *piNew; + if( pSrc->nSrc==0 ) return WRC_Continue; + j = p->nExclude; + p->nExclude += pSrc->nSrc; + piNew = sqlite3DbRealloc(p->db, p->aiExclude, p->nExclude*sizeof(int)); + if( piNew==0 ){ + p->nExclude = 0; + return WRC_Abort; + }else{ + p->aiExclude = piNew; + } + for(i=0; inSrc; i++, j++){ + p->aiExclude[j] = pSrc->a[i].iCursor; + } + return WRC_Continue; +} +static void selectRefLeave(Walker *pWalker, Select *pSelect){ + struct RefSrcList *p = pWalker->u.pRefSrcList; + SrcList *pSrc = pSelect->pSrc; + if( p->nExclude ){ + assert( p->nExclude>=pSrc->nSrc ); + p->nExclude -= pSrc->nSrc; + } +} + +/* This is the Walker EXPR callback for sqlite3ReferencesSrcList(). +** +** Set the 0x01 bit of pWalker->eCode if there is a reference to any +** of the tables shown in RefSrcList.pRef. +** +** Set the 0x02 bit of pWalker->eCode if there is a reference to a +** table is in neither RefSrcList.pRef nor RefSrcList.aiExclude. +*/ +static int exprRefToSrcList(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN + || pExpr->op==TK_AGG_COLUMN + ){ + int i; + struct RefSrcList *p = pWalker->u.pRefSrcList; + SrcList *pSrc = p->pRef; + int nSrc = pSrc ? pSrc->nSrc : 0; + for(i=0; iiTable==pSrc->a[i].iCursor ){ + pWalker->eCode |= 1; + return WRC_Continue; + } + } + for(i=0; inExclude && p->aiExclude[i]!=pExpr->iTable; i++){} + if( i>=p->nExclude ){ + pWalker->eCode |= 2; + } + } + return WRC_Continue; +} + +/* +** Check to see if pExpr references any tables in pSrcList. +** Possible return values: +** +** 1 pExpr does references a table in pSrcList. +** +** 0 pExpr references some table that is not defined in either +** pSrcList or in subqueries of pExpr itself. +** +** -1 pExpr only references no tables at all, or it only +** references tables defined in subqueries of pExpr itself. +** +** As currently used, pExpr is always an aggregate function call. That +** fact is exploited for efficiency. +*/ +SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList *pSrcList){ + Walker w; + struct RefSrcList x; + memset(&w, 0, sizeof(w)); + memset(&x, 0, sizeof(x)); + w.xExprCallback = exprRefToSrcList; + w.xSelectCallback = selectRefEnter; + w.xSelectCallback2 = selectRefLeave; + w.u.pRefSrcList = &x; + x.db = pParse->db; + x.pRef = pSrcList; + assert( pExpr->op==TK_AGG_FUNCTION ); + assert( ExprUseXList(pExpr) ); + sqlite3WalkExprList(&w, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); + } +#endif + sqlite3DbFree(pParse->db, x.aiExclude); + if( w.eCode & 0x01 ){ + return 1; + }else if( w.eCode ){ + return 0; + }else{ + return -1; + } +} + +/* +** This is a Walker expression node callback. +** +** For Expr nodes that contain pAggInfo pointers, make sure the AggInfo +** object that is referenced does not refer directly to the Expr. If +** it does, make a copy. This is done because the pExpr argument is +** subject to change. +** +** The copy is stored on pParse->pConstExpr with a register number of 0. +** This will cause the expression to be deleted automatically when the +** Parse object is destroyed, but the zero register number means that it +** will not generate any code in the preamble. +*/ +static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ + if( ALWAYS(!ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced)) + && pExpr->pAggInfo!=0 + ){ + AggInfo *pAggInfo = pExpr->pAggInfo; + int iAgg = pExpr->iAgg; + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_AGG_COLUMN ){ + assert( iAgg>=0 && iAggnColumn ); + if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aCol[iAgg].pCExpr = pExpr; + sqlite3ExprDeferredDelete(pParse, pExpr); + } + } + }else{ + assert( iAgg>=0 && iAggnFunc ); + if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aFunc[iAgg].pFExpr = pExpr; + sqlite3ExprDeferredDelete(pParse, pExpr); + } + } + } + } + return WRC_Continue; +} + +/* +** Initialize a Walker object so that will persist AggInfo entries referenced +** by the tree that is walked. +*/ +SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker *pWalker, Parse *pParse){ + memset(pWalker, 0, sizeof(*pWalker)); + pWalker->pParse = pParse; + pWalker->xExprCallback = agginfoPersistExprCb; + pWalker->xSelectCallback = sqlite3SelectWalkNoop; +} + +/* +** Add a new element to the pAggInfo->aCol[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aCol = sqlite3ArrayAllocate( + db, + pInfo->aCol, + sizeof(pInfo->aCol[0]), + &pInfo->nColumn, + &i + ); + return i; +} + +/* +** Add a new element to the pAggInfo->aFunc[] array. Return the index of +** the new element. Return a negative number if malloc fails. +*/ +static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ + int i; + pInfo->aFunc = sqlite3ArrayAllocate( + db, + pInfo->aFunc, + sizeof(pInfo->aFunc[0]), + &pInfo->nFunc, + &i + ); + return i; +} + +/* +** This is the xExprCallback for a tree walker. It is used to +** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates +** for additional information. +*/ +static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ + int i; + NameContext *pNC = pWalker->u.pNC; + Parse *pParse = pNC->pParse; + SrcList *pSrcList = pNC->pSrcList; + AggInfo *pAggInfo = pNC->uNC.pAggInfo; + + assert( pNC->ncFlags & NC_UAggInfo ); + switch( pExpr->op ){ + case TK_AGG_COLUMN: + case TK_COLUMN: { + testcase( pExpr->op==TK_AGG_COLUMN ); + testcase( pExpr->op==TK_COLUMN ); + /* Check to see if the column is in one of the tables in the FROM + ** clause of the aggregate query */ + if( ALWAYS(pSrcList!=0) ){ + SrcItem *pItem = pSrcList->a; + for(i=0; inSrc; i++, pItem++){ + struct AggInfo_col *pCol; + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + if( pExpr->iTable==pItem->iCursor ){ + /* If we reach this point, it means that pExpr refers to a table + ** that is in the FROM clause of the aggregate query. + ** + ** Make an entry for the column in pAggInfo->aCol[] if there + ** is not an entry there already. + */ + int k; + pCol = pAggInfo->aCol; + for(k=0; knColumn; k++, pCol++){ + if( pCol->iTable==pExpr->iTable && + pCol->iColumn==pExpr->iColumn ){ + break; + } + } + if( (k>=pAggInfo->nColumn) + && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 + ){ + pCol = &pAggInfo->aCol[k]; + assert( ExprUseYTab(pExpr) ); + pCol->pTab = pExpr->y.pTab; + pCol->iTable = pExpr->iTable; + pCol->iColumn = pExpr->iColumn; + pCol->iMem = ++pParse->nMem; + pCol->iSorterColumn = -1; + pCol->pCExpr = pExpr; + if( pAggInfo->pGroupBy ){ + int j, n; + ExprList *pGB = pAggInfo->pGroupBy; + struct ExprList_item *pTerm = pGB->a; + n = pGB->nExpr; + for(j=0; jpExpr; + if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && + pE->iColumn==pExpr->iColumn ){ + pCol->iSorterColumn = j; + break; + } + } + } + if( pCol->iSorterColumn<0 ){ + pCol->iSorterColumn = pAggInfo->nSortingColumn++; + } + } + /* There is now an entry for pExpr in pAggInfo->aCol[] (either + ** because it was there before or because we just created it). + ** Convert the pExpr to be a TK_AGG_COLUMN referring to that + ** pAggInfo->aCol[] entry. + */ + ExprSetVVAProperty(pExpr, EP_NoReduce); + pExpr->pAggInfo = pAggInfo; + pExpr->op = TK_AGG_COLUMN; + pExpr->iAgg = (i16)k; + break; + } /* endif pExpr->iTable==pItem->iCursor */ + } /* end loop over pSrcList */ + } + return WRC_Prune; + } + case TK_AGG_FUNCTION: { + if( (pNC->ncFlags & NC_InAggFunc)==0 + && pWalker->walkerDepth==pExpr->op2 + ){ + /* Check to see if pExpr is a duplicate of another aggregate + ** function that is already in the pAggInfo structure + */ + struct AggInfo_func *pItem = pAggInfo->aFunc; + for(i=0; inFunc; i++, pItem++){ + if( pItem->pFExpr==pExpr ) break; + if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){ + break; + } + } + if( i>=pAggInfo->nFunc ){ + /* pExpr is original. Make a new entry in pAggInfo->aFunc[] + */ + u8 enc = ENC(pParse->db); + i = addAggInfoFunc(pParse->db, pAggInfo); + if( i>=0 ){ + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + pItem = &pAggInfo->aFunc[i]; + pItem->pFExpr = pExpr; + pItem->iMem = ++pParse->nMem; + assert( ExprUseUToken(pExpr) ); + pItem->pFunc = sqlite3FindFunction(pParse->db, + pExpr->u.zToken, + pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); + if( pExpr->flags & EP_Distinct ){ + pItem->iDistinct = pParse->nTab++; + }else{ + pItem->iDistinct = -1; + } + } + } + /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry + */ + assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pExpr, EP_NoReduce); + pExpr->iAgg = (i16)i; + pExpr->pAggInfo = pAggInfo; + return WRC_Prune; + }else{ + return WRC_Continue; + } + } + } + return WRC_Continue; +} + +/* +** Analyze the pExpr expression looking for aggregate functions and +** for variables that need to be added to AggInfo object that pNC->pAggInfo +** points to. Additional entries are made on the AggInfo object as +** necessary. +** +** This routine should only be called after the expression has been +** analyzed by sqlite3ResolveExprNames(). +*/ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ + Walker w; + w.xExprCallback = analyzeAggregate; + w.xSelectCallback = sqlite3WalkerDepthIncrease; + w.xSelectCallback2 = sqlite3WalkerDepthDecrease; + w.walkerDepth = 0; + w.u.pNC = pNC; + w.pParse = 0; + assert( pNC->pSrcList!=0 ); + sqlite3WalkExpr(&w, pExpr); +} + +/* +** Call sqlite3ExprAnalyzeAggregates() for every expression in an +** expression list. Return the number of errors. +** +** If an error is found, the analysis is cut short. +*/ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ + struct ExprList_item *pItem; + int i; + if( pList ){ + for(pItem=pList->a, i=0; inExpr; i++, pItem++){ + sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); + } + } +} + +/* +** Allocate a single new register for use to hold some intermediate result. +*/ +SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){ + if( pParse->nTempReg==0 ){ + return ++pParse->nMem; + } + return pParse->aTempReg[--pParse->nTempReg]; +} + +/* +** Deallocate a register, making available for reuse for some other +** purpose. +*/ +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ + if( iReg ){ + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); + if( pParse->nTempRegaTempReg) ){ + pParse->aTempReg[pParse->nTempReg++] = iReg; + } + } +} + +/* +** Allocate or deallocate a block of nReg consecutive registers. +*/ +SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ + int i, n; + if( nReg==1 ) return sqlite3GetTempReg(pParse); + i = pParse->iRangeReg; + n = pParse->nRangeReg; + if( nReg<=n ){ + pParse->iRangeReg += nReg; + pParse->nRangeReg -= nReg; + }else{ + i = pParse->nMem+1; + pParse->nMem += nReg; + } + return i; +} +SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, iReg); + return; + } + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0, 0); + if( nReg>pParse->nRangeReg ){ + pParse->nRangeReg = nReg; + pParse->iRangeReg = iReg; + } +} + +/* +** Mark all temporary registers as being unavailable for reuse. +** +** Always invoke this procedure after coding a subroutine or co-routine +** that might be invoked from other parts of the code, to ensure that +** the sub/co-routine does not use registers in common with the code that +** invokes the sub/co-routine. +*/ +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ + pParse->nTempReg = 0; + pParse->nRangeReg = 0; +} + +/* +** Validate that no temporary register falls within the range of +** iFirst..iLast, inclusive. This routine is only call from within assert() +** statements. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ + int i; + if( pParse->nRangeReg>0 + && pParse->iRangeReg+pParse->nRangeReg > iFirst + && pParse->iRangeReg <= iLast + ){ + return 0; + } + for(i=0; inTempReg; i++){ + if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){ + return 0; + } + } + return 1; +} +#endif /* SQLITE_DEBUG */ + +/************** End of expr.c ************************************************/ +/************** Begin file alter.c *******************************************/ +/* +** 2005 February 15 +** +** 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 contains C code routines that used to generate VDBE code +** that implements the ALTER TABLE command. +*/ +/* #include "sqliteInt.h" */ + +/* +** The code in this file only exists if we are not omitting the +** ALTER TABLE logic from the build. +*/ +#ifndef SQLITE_OMIT_ALTERTABLE + +/* +** Parameter zName is the name of a table that is about to be altered +** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN). +** If the table is a system table, this function leaves an error message +** in pParse->zErr (system tables may not be altered) and returns non-zero. +** +** Or, if zName is not a system table, zero is returned. +*/ +static int isAlterableTable(Parse *pParse, Table *pTab){ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || (pTab->tabFlags & TF_Eponymous)!=0 + || ( (pTab->tabFlags & TF_Shadow)!=0 + && sqlite3ReadOnlyShadowTables(pParse->db) + ) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); + return 1; + } + return 0; +} + +/* +** Generate code to verify that the schemas of database zDb and, if +** bTemp is not true, database "temp", can still be parsed. This is +** called at the end of the generation of an ALTER TABLE ... RENAME ... +** statement to ensure that the operation has not rendered any schema +** objects unusable. +*/ +static void renameTestSchema( + Parse *pParse, /* Parse context */ + const char *zDb, /* Name of db to verify schema of */ + int bTemp, /* True if this is the temp db */ + const char *zWhen, /* "when" part of error message */ + int bNoDQS /* Do not allow DQS in the schema */ +){ + pParse->colNamesSet = 1; + sqlite3NestedParse(pParse, + "SELECT 1 " + "FROM \"%w\"." LEGACY_SCHEMA_TABLE " " + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + " AND sql NOT LIKE 'create virtual%%'" + " AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL ", + zDb, + zDb, bTemp, zWhen, bNoDQS + ); + + if( bTemp==0 ){ + sqlite3NestedParse(pParse, + "SELECT 1 " + "FROM temp." LEGACY_SCHEMA_TABLE " " + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + " AND sql NOT LIKE 'create virtual%%'" + " AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL ", + zDb, zWhen, bNoDQS + ); + } +} + +/* +** Generate VM code to replace any double-quoted strings (but not double-quoted +** identifiers) within the "sql" column of the sqlite_schema table in +** database zDb with their single-quoted equivalents. If argument bTemp is +** not true, similarly update all SQL statements in the sqlite_schema table +** of the temp db. +*/ +static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){ + sqlite3NestedParse(pParse, + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE + " SET sql = sqlite_rename_quotefix(%Q, sql)" + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + " AND sql NOT LIKE 'create virtual%%'" , zDb, zDb + ); + if( bTemp==0 ){ + sqlite3NestedParse(pParse, + "UPDATE temp." LEGACY_SCHEMA_TABLE + " SET sql = sqlite_rename_quotefix('temp', sql)" + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + " AND sql NOT LIKE 'create virtual%%'" + ); + } +} + +/* +** Generate code to reload the schema for database iDb. And, if iDb!=1, for +** the temp database as well. +*/ +static void renameReloadSchema(Parse *pParse, int iDb, u16 p5){ + Vdbe *v = pParse->pVdbe; + if( v ){ + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, iDb, 0, p5); + if( iDb!=1 ) sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, 1, 0, p5); + } +} + +/* +** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" +** command. +*/ +SQLITE_PRIVATE void sqlite3AlterRenameTable( + Parse *pParse, /* Parser context. */ + SrcList *pSrc, /* The table to rename. */ + Token *pName /* The new table name. */ +){ + int iDb; /* Database that contains the table */ + char *zDb; /* Name of database iDb */ + Table *pTab; /* Table being renamed */ + char *zName = 0; /* NULL-terminated version of pName */ + sqlite3 *db = pParse->db; /* Database connection */ + int nTabName; /* Number of UTF-8 characters in zTabName */ + const char *zTabName; /* Original name of the table */ + Vdbe *v; + VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */ + + if( NEVER(db->mallocFailed) ) goto exit_rename_table; + assert( pSrc->nSrc==1 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_rename_table; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + + /* Get a NULL terminated version of the new table name. */ + zName = sqlite3NameFromToken(db, pName); + if( !zName ) goto exit_rename_table; + + /* Check that a table or index named 'zName' does not already exist + ** in database iDb. If so, this is an error. + */ + if( sqlite3FindTable(db, zName, zDb) + || sqlite3FindIndex(db, zName, zDb) + || sqlite3IsShadowTableOf(db, pTab, zName) + ){ + sqlite3ErrorMsg(pParse, + "there is already another table or index with this name: %s", zName); + goto exit_rename_table; + } + + /* Make sure it is not a system table being altered, or a reserved name + ** that the table is being renamed to. + */ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ + goto exit_rename_table; + } + if( SQLITE_OK!=sqlite3CheckObjectName(pParse,zName,"table",zName) ){ + goto exit_rename_table; + } + +#ifndef SQLITE_OMIT_VIEW + if( IsView(pTab) ){ + sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName); + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + goto exit_rename_table; + } +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_rename_table; + } + if( IsVirtual(pTab) ){ + pVTab = sqlite3GetVTable(db, pTab); + if( pVTab->pVtab->pModule->xRename==0 ){ + pVTab = 0; + } + } +#endif + + /* Begin a transaction for database iDb. Then modify the schema cookie + ** (since the ALTER TABLE modifies the schema). Call sqlite3MayAbort(), + ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the + ** nested SQL may raise an exception. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto exit_rename_table; + } + sqlite3MayAbort(pParse); + + /* figure out how many UTF-8 characters are in zName */ + zTabName = pTab->zName; + nTabName = sqlite3Utf8CharLen(zTabName, -1); + + /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in + ** the schema to use the new table name. */ + sqlite3NestedParse(pParse, + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " + "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " + "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" + "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" + , zDb, zDb, zTabName, zName, (iDb==1), zTabName + ); + + /* Update the tbl_name and name columns of the sqlite_schema table + ** as required. */ + sqlite3NestedParse(pParse, + "UPDATE %Q." LEGACY_SCHEMA_TABLE " SET " + "tbl_name = %Q, " + "name = CASE " + "WHEN type='table' THEN %Q " + "WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' " + " AND type='index' THEN " + "'sqlite_autoindex_' || %Q || substr(name,%d+18) " + "ELSE name END " + "WHERE tbl_name=%Q COLLATE nocase AND " + "(type='table' OR type='index' OR type='trigger');", + zDb, + zName, zName, zName, + nTabName, zTabName + ); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* If the sqlite_sequence table exists in this database, then update + ** it with the new table name. + */ + if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){ + sqlite3NestedParse(pParse, + "UPDATE \"%w\".sqlite_sequence set name = %Q WHERE name = %Q", + zDb, zName, pTab->zName); + } +#endif + + /* If the table being renamed is not itself part of the temp database, + ** edit view and trigger definitions within the temp database + ** as required. */ + if( iDb!=1 ){ + sqlite3NestedParse(pParse, + "UPDATE sqlite_temp_schema SET " + "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), " + "tbl_name = " + "CASE WHEN tbl_name=%Q COLLATE nocase AND " + " sqlite_rename_test(%Q, sql, type, name, 1, 'after rename', 0) " + "THEN %Q ELSE tbl_name END " + "WHERE type IN ('view', 'trigger')" + , zDb, zTabName, zName, zTabName, zDb, zName); + } + + /* If this is a virtual table, invoke the xRename() function if + ** one is defined. The xRename() callback will modify the names + ** of any resources used by the v-table implementation (including other + ** SQLite tables) that are identified by the name of the virtual table. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pVTab ){ + int i = ++pParse->nMem; + sqlite3VdbeLoadString(v, i, zName); + sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); + } +#endif + + renameReloadSchema(pParse, iDb, INITFLAG_AlterRename); + renameTestSchema(pParse, zDb, iDb==1, "after rename", 0); + +exit_rename_table: + sqlite3SrcListDelete(db, pSrc); + sqlite3DbFree(db, zName); +} + +/* +** Write code that will raise an error if the table described by +** zDb and zTab is not empty. +*/ +static void sqlite3ErrorIfNotEmpty( + Parse *pParse, /* Parsing context */ + const char *zDb, /* Schema holding the table */ + const char *zTab, /* Table to check for empty */ + const char *zErr /* Error message text */ +){ + sqlite3NestedParse(pParse, + "SELECT raise(ABORT,%Q) FROM \"%w\".\"%w\"", + zErr, zDb, zTab + ); +} + +/* +** This function is called after an "ALTER TABLE ... ADD" statement +** has been parsed. Argument pColDef contains the text of the new +** column definition. +** +** The Table structure pParse->pNewTable was extended to include +** the new column during parsing. +*/ +SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ + Table *pNew; /* Copy of pParse->pNewTable */ + Table *pTab; /* Table being altered */ + int iDb; /* Database number */ + const char *zDb; /* Database name */ + const char *zTab; /* Table name */ + char *zCol; /* Null-terminated column definition */ + Column *pCol; /* The new column */ + Expr *pDflt; /* Default value for the new column */ + sqlite3 *db; /* The database connection; */ + Vdbe *v; /* The prepared statement under construction */ + int r1; /* Temporary registers */ + + db = pParse->db; + assert( db->pParse==pParse ); + if( pParse->nErr ) return; + assert( db->mallocFailed==0 ); + pNew = pParse->pNewTable; + assert( pNew ); + + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pNew->pSchema); + zDb = db->aDb[iDb].zDbSName; + zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ + pCol = &pNew->aCol[pNew->nCol-1]; + pDflt = sqlite3ColumnExpr(pNew, pCol); + pTab = sqlite3FindTable(db, zTab, zDb); + assert( pTab ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + return; + } +#endif + + + /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. + ** If there is a NOT NULL constraint, then the default value for the + ** column must not be NULL. + */ + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); + return; + } + if( pNew->pIndex ){ + sqlite3ErrorMsg(pParse, + "Cannot add a UNIQUE column"); + return; + } + if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ + /* If the default value for the new column was specified with a + ** literal NULL, then set pDflt to 0. This simplifies checking + ** for an SQL NULL default below. + */ + assert( pDflt==0 || pDflt->op==TK_SPAN ); + if( pDflt && pDflt->pLeft->op==TK_NULL ){ + pDflt = 0; + } + assert( IsOrdinaryTable(pNew) ); + if( (db->flags&SQLITE_ForeignKeys) && pNew->u.tab.pFKey && pDflt ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a REFERENCES column with non-NULL default value"); + } + if( pCol->notNull && !pDflt ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a NOT NULL column with default value NULL"); + } + + + /* Ensure the default expression is something that sqlite3ValueFromExpr() + ** can handle (i.e. not CURRENT_TIME etc.) + */ + if( pDflt ){ + sqlite3_value *pVal = 0; + int rc; + rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc!=SQLITE_OK ){ + assert( db->mallocFailed == 1 ); + return; + } + if( !pVal ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, + "Cannot add a column with non-constant default"); + } + sqlite3ValueFree(pVal); + } + }else if( pCol->colFlags & COLFLAG_STORED ){ + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "cannot add a STORED column"); + } + + + /* Modify the CREATE TABLE statement. */ + zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); + if( zCol ){ + char *zEnd = &zCol[pColDef->n-1]; + while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){ + *zEnd-- = '\0'; + } + /* substr() operations on characters, but addColOffset is in bytes. So we + ** have to use printf() to translate between these units: */ + assert( IsOrdinaryTable(pTab) ); + assert( IsOrdinaryTable(pNew) ); + sqlite3NestedParse(pParse, + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " + "sql = printf('%%.%ds, ',sql) || %Q" + " || substr(sql,1+length(printf('%%.%ds',sql))) " + "WHERE type = 'table' AND name = %Q", + zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset, + zTab + ); + sqlite3DbFree(db, zCol); + } + + v = sqlite3GetVdbe(pParse); + if( v ){ + /* Make sure the schema version is at least 3. But do not upgrade + ** from less than 3 to 4, as that will corrupt any preexisting DESC + ** index. + */ + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2); + sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); + sqlite3ReleaseTempReg(pParse, r1); + + /* Reload the table definition */ + renameReloadSchema(pParse, iDb, INITFLAG_AlterAdd); + + /* Verify that constraints are still satisfied */ + if( pNew->pCheck!=0 + || (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0) + ){ + sqlite3NestedParse(pParse, + "SELECT CASE WHEN quick_check GLOB 'CHECK*'" + " THEN raise(ABORT,'CHECK constraint failed')" + " ELSE raise(ABORT,'NOT NULL constraint failed')" + " END" + " FROM pragma_quick_check(%Q,%Q)" + " WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'", + zTab, zDb + ); + } + } +} + +/* +** This function is called by the parser after the table-name in +** an "ALTER TABLE ADD" statement is parsed. Argument +** pSrc is the full-name of the table being altered. +** +** This routine makes a (partial) copy of the Table structure +** for the table being altered and sets Parse.pNewTable to point +** to it. Routines called by the parser as the column definition +** is parsed (i.e. sqlite3AddColumn()) add the new Column data to +** the copy. The copy of the Table structure is deleted by tokenize.c +** after parsing is finished. +** +** Routine sqlite3AlterFinishAddColumn() will be called to complete +** coding the "ALTER TABLE ... ADD" statement. +*/ +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ + Table *pNew; + Table *pTab; + int iDb; + int i; + int nAlloc; + sqlite3 *db = pParse->db; + + /* Look up the table being altered. */ + assert( pParse->pNewTable==0 ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + if( db->mallocFailed ) goto exit_begin_add_column; + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_begin_add_column; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be altered"); + goto exit_begin_add_column; + } +#endif + + /* Make sure this is not an attempt to ALTER a view. */ + if( IsView(pTab) ){ + sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); + goto exit_begin_add_column; + } + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ + goto exit_begin_add_column; + } + + sqlite3MayAbort(pParse); + assert( IsOrdinaryTable(pTab) ); + assert( pTab->u.tab.addColOffset>0 ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + + /* Put a copy of the Table struct in Parse.pNewTable for the + ** sqlite3AddColumn() function and friends to modify. But modify + ** the name by adding an "sqlite_altertab_" prefix. By adding this + ** prefix, we insure that the name will not collide with an existing + ** table because user table are not allowed to have the "sqlite_" + ** prefix on their name. + */ + pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); + if( !pNew ) goto exit_begin_add_column; + pParse->pNewTable = pNew; + pNew->nTabRef = 1; + pNew->nCol = pTab->nCol; + assert( pNew->nCol>0 ); + nAlloc = (((pNew->nCol-1)/8)*8)+8; + assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 ); + pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); + pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName); + if( !pNew->aCol || !pNew->zName ){ + assert( db->mallocFailed ); + goto exit_begin_add_column; + } + memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); + for(i=0; inCol; i++){ + Column *pCol = &pNew->aCol[i]; + pCol->zCnName = sqlite3DbStrDup(db, pCol->zCnName); + pCol->hName = sqlite3StrIHash(pCol->zCnName); + } + assert( IsOrdinaryTable(pNew) ); + pNew->u.tab.pDfltList = sqlite3ExprListDup(db, pTab->u.tab.pDfltList, 0); + pNew->pSchema = db->aDb[iDb].pSchema; + pNew->u.tab.addColOffset = pTab->u.tab.addColOffset; + pNew->nTabRef = 1; + +exit_begin_add_column: + sqlite3SrcListDelete(db, pSrc); + return; +} + +/* +** Parameter pTab is the subject of an ALTER TABLE ... RENAME COLUMN +** command. This function checks if the table is a view or virtual +** table (columns of views or virtual tables may not be renamed). If so, +** it loads an error message into pParse and returns non-zero. +** +** Or, if pTab is not a view or virtual table, zero is returned. +*/ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +static int isRealTable(Parse *pParse, Table *pTab, int bDrop){ + const char *zType = 0; +#ifndef SQLITE_OMIT_VIEW + if( IsView(pTab) ){ + zType = "view"; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + zType = "virtual table"; + } +#endif + if( zType ){ + sqlite3ErrorMsg(pParse, "cannot %s %s \"%s\"", + (bDrop ? "drop column from" : "rename columns of"), + zType, pTab->zName + ); + return 1; + } + return 0; +} +#else /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ +# define isRealTable(x,y,z) (0) +#endif + +/* +** Handles the following parser reduction: +** +** cmd ::= ALTER TABLE pSrc RENAME COLUMN pOld TO pNew +*/ +SQLITE_PRIVATE void sqlite3AlterRenameColumn( + Parse *pParse, /* Parsing context */ + SrcList *pSrc, /* Table being altered. pSrc->nSrc==1 */ + Token *pOld, /* Name of column being changed */ + Token *pNew /* New column name */ +){ + sqlite3 *db = pParse->db; /* Database connection */ + Table *pTab; /* Table being updated */ + int iCol; /* Index of column being renamed */ + char *zOld = 0; /* Old column name */ + char *zNew = 0; /* New column name */ + const char *zDb; /* Name of schema containing the table */ + int iSchema; /* Index of the schema */ + int bQuote; /* True to quote the new name */ + + /* Locate the table to be altered */ + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_rename_column; + + /* Cannot alter a system table */ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; + if( SQLITE_OK!=isRealTable(pParse, pTab, 0) ) goto exit_rename_column; + + /* Which schema holds the table to be altered */ + iSchema = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iSchema>=0 ); + zDb = db->aDb[iSchema].zDbSName; + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + goto exit_rename_column; + } +#endif + + /* Make sure the old name really is a column name in the table to be + ** altered. Set iCol to be the index of the column being renamed */ + zOld = sqlite3NameFromToken(db, pOld); + if( !zOld ) goto exit_rename_column; + for(iCol=0; iColnCol; iCol++){ + if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break; + } + if( iCol==pTab->nCol ){ + sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld); + goto exit_rename_column; + } + + /* Ensure the schema contains no double-quoted strings */ + renameTestSchema(pParse, zDb, iSchema==1, "", 0); + renameFixQuotes(pParse, zDb, iSchema==1); + + /* Do the rename operation using a recursive UPDATE statement that + ** uses the sqlite_rename_column() SQL function to compute the new + ** CREATE statement text for the sqlite_schema table. + */ + sqlite3MayAbort(pParse); + zNew = sqlite3NameFromToken(db, pNew); + if( !zNew ) goto exit_rename_column; + assert( pNew->n>0 ); + bQuote = sqlite3Isquote(pNew->z[0]); + sqlite3NestedParse(pParse, + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " + "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " + "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " + " AND (type != 'index' OR tbl_name = %Q)", + zDb, + zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, + pTab->zName + ); + + sqlite3NestedParse(pParse, + "UPDATE temp." LEGACY_SCHEMA_TABLE " SET " + "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " + "WHERE type IN ('trigger', 'view')", + zDb, pTab->zName, iCol, zNew, bQuote + ); + + /* Drop and reload the database schema. */ + renameReloadSchema(pParse, iSchema, INITFLAG_AlterRename); + renameTestSchema(pParse, zDb, iSchema==1, "after rename", 1); + + exit_rename_column: + sqlite3SrcListDelete(db, pSrc); + sqlite3DbFree(db, zOld); + sqlite3DbFree(db, zNew); + return; +} + +/* +** Each RenameToken object maps an element of the parse tree into +** the token that generated that element. The parse tree element +** might be one of: +** +** * A pointer to an Expr that represents an ID +** * The name of a table column in Column.zName +** +** A list of RenameToken objects can be constructed during parsing. +** Each new object is created by sqlite3RenameTokenMap(). +** As the parse tree is transformed, the sqlite3RenameTokenRemap() +** routine is used to keep the mapping current. +** +** After the parse finishes, renameTokenFind() routine can be used +** to look up the actual token value that created some element in +** the parse tree. +*/ +struct RenameToken { + const void *p; /* Parse tree element created by token t */ + Token t; /* The token that created parse tree element p */ + RenameToken *pNext; /* Next is a list of all RenameToken objects */ +}; + +/* +** The context of an ALTER TABLE RENAME COLUMN operation that gets passed +** down into the Walker. +*/ +typedef struct RenameCtx RenameCtx; +struct RenameCtx { + RenameToken *pList; /* List of tokens to overwrite */ + int nList; /* Number of tokens in pList */ + int iCol; /* Index of column being renamed */ + Table *pTab; /* Table being ALTERed */ + const char *zOld; /* Old column name */ +}; + +#ifdef SQLITE_DEBUG +/* +** This function is only for debugging. It performs two tasks: +** +** 1. Checks that pointer pPtr does not already appear in the +** rename-token list. +** +** 2. Dereferences each pointer in the rename-token list. +** +** The second is most effective when debugging under valgrind or +** address-sanitizer or similar. If any of these pointers no longer +** point to valid objects, an exception is raised by the memory-checking +** tool. +** +** The point of this is to prevent comparisons of invalid pointer values. +** Even though this always seems to work, it is undefined according to the +** C standard. Example of undefined comparison: +** +** sqlite3_free(x); +** if( x==y ) ... +** +** Technically, as x no longer points into a valid object or to the byte +** following a valid object, it may not be used in comparison operations. +*/ +static void renameTokenCheckAll(Parse *pParse, const void *pPtr){ + assert( pParse==pParse->db->pParse ); + assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 ); + if( pParse->nErr==0 ){ + const RenameToken *p; + u8 i = 0; + for(p=pParse->pRename; p; p=p->pNext){ + if( p->p ){ + assert( p->p!=pPtr ); + i += *(u8*)(p->p); + } + } + } +} +#else +# define renameTokenCheckAll(x,y) +#endif + +/* +** Remember that the parser tree element pPtr was created using +** the token pToken. +** +** In other words, construct a new RenameToken object and add it +** to the list of RenameToken objects currently being built up +** in pParse->pRename. +** +** The pPtr argument is returned so that this routine can be used +** with tail recursion in tokenExpr() routine, for a small performance +** improvement. +*/ +SQLITE_PRIVATE const void *sqlite3RenameTokenMap( + Parse *pParse, + const void *pPtr, + const Token *pToken +){ + RenameToken *pNew; + assert( pPtr || pParse->db->mallocFailed ); + renameTokenCheckAll(pParse, pPtr); + if( ALWAYS(pParse->eParseMode!=PARSE_MODE_UNMAP) ){ + pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken)); + if( pNew ){ + pNew->p = pPtr; + pNew->t = *pToken; + pNew->pNext = pParse->pRename; + pParse->pRename = pNew; + } + } + + return pPtr; +} + +/* +** It is assumed that there is already a RenameToken object associated +** with parse tree element pFrom. This function remaps the associated token +** to parse tree element pTo. +*/ +SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, const void *pFrom){ + RenameToken *p; + renameTokenCheckAll(pParse, pTo); + for(p=pParse->pRename; p; p=p->pNext){ + if( p->p==pFrom ){ + p->p = pTo; + break; + } + } +} + +/* +** Walker callback used by sqlite3RenameExprUnmap(). +*/ +static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ + Parse *pParse = pWalker->pParse; + sqlite3RenameTokenRemap(pParse, 0, (const void*)pExpr); + if( ExprUseYTab(pExpr) ){ + sqlite3RenameTokenRemap(pParse, 0, (const void*)&pExpr->y.pTab); + } + return WRC_Continue; +} + +/* +** Iterate through the Select objects that are part of WITH clauses attached +** to select statement pSelect. +*/ +static void renameWalkWith(Walker *pWalker, Select *pSelect){ + With *pWith = pSelect->pWith; + if( pWith ){ + Parse *pParse = pWalker->pParse; + int i; + With *pCopy = 0; + assert( pWith->nCte>0 ); + if( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ){ + /* Push a copy of the With object onto the with-stack. We use a copy + ** here as the original will be expanded and resolved (flags SF_Expanded + ** and SF_Resolved) below. And the parser code that uses the with-stack + ** fails if the Select objects on it have already been expanded and + ** resolved. */ + pCopy = sqlite3WithDup(pParse->db, pWith); + pCopy = sqlite3WithPush(pParse, pCopy, 1); + } + for(i=0; inCte; i++){ + Select *p = pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + if( pCopy ) sqlite3SelectPrep(sNC.pParse, p, &sNC); + if( sNC.pParse->db->mallocFailed ) return; + sqlite3WalkSelect(pWalker, p); + sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); + } + if( pCopy && pParse->pWith==pCopy ){ + pParse->pWith = pCopy->pOuter; + } + } +} + +/* +** Unmap all tokens in the IdList object passed as the second argument. +*/ +static void unmapColumnIdlistNames( + Parse *pParse, + const IdList *pIdList +){ + int ii; + assert( pIdList!=0 ); + for(ii=0; iinId; ii++){ + sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); + } +} + +/* +** Walker callback used by sqlite3RenameExprUnmap(). +*/ +static int renameUnmapSelectCb(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i; + if( pParse->nErr ) return WRC_Abort; + testcase( p->selFlags & SF_View ); + testcase( p->selFlags & SF_CopyCte ); + if( p->selFlags & (SF_View|SF_CopyCte) ){ + return WRC_Prune; + } + if( ALWAYS(p->pEList) ){ + ExprList *pList = p->pEList; + for(i=0; inExpr; i++){ + if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); + } + } + } + if( ALWAYS(p->pSrc) ){ /* Every Select as a SrcList, even if it is empty */ + SrcList *pSrc = p->pSrc; + for(i=0; inSrc; i++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); + if( pSrc->a[i].fg.isUsing==0 ){ + sqlite3WalkExpr(pWalker, pSrc->a[i].u3.pOn); + }else{ + unmapColumnIdlistNames(pParse, pSrc->a[i].u3.pUsing); + } + } + } + + renameWalkWith(pWalker, p); + return WRC_Continue; +} + +/* +** Remove all nodes that are part of expression pExpr from the rename list. +*/ +SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ + u8 eMode = pParse->eParseMode; + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = renameUnmapExprCb; + sWalker.xSelectCallback = renameUnmapSelectCb; + pParse->eParseMode = PARSE_MODE_UNMAP; + sqlite3WalkExpr(&sWalker, pExpr); + pParse->eParseMode = eMode; +} + +/* +** Remove all nodes that are part of expression-list pEList from the +** rename list. +*/ +SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ + if( pEList ){ + int i; + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = renameUnmapExprCb; + sqlite3WalkExprList(&sWalker, pEList); + for(i=0; inExpr; i++){ + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); + } + } + } +} + +/* +** Free the list of RenameToken objects given in the second argument +*/ +static void renameTokenFree(sqlite3 *db, RenameToken *pToken){ + RenameToken *pNext; + RenameToken *p; + for(p=pToken; p; p=pNext){ + pNext = p->pNext; + sqlite3DbFree(db, p); + } +} + +/* +** Search the Parse object passed as the first argument for a RenameToken +** object associated with parse tree element pPtr. If found, return a pointer +** to it. Otherwise, return NULL. +** +** If the second argument passed to this function is not NULL and a matching +** RenameToken object is found, remove it from the Parse object and add it to +** the list maintained by the RenameCtx object. +*/ +static RenameToken *renameTokenFind( + Parse *pParse, + struct RenameCtx *pCtx, + const void *pPtr +){ + RenameToken **pp; + if( NEVER(pPtr==0) ){ + return 0; + } + for(pp=&pParse->pRename; (*pp); pp=&(*pp)->pNext){ + if( (*pp)->p==pPtr ){ + RenameToken *pToken = *pp; + if( pCtx ){ + *pp = pToken->pNext; + pToken->pNext = pCtx->pList; + pCtx->pList = pToken; + pCtx->nList++; + } + return pToken; + } + } + return 0; +} + +/* +** This is a Walker select callback. It does nothing. It is only required +** because without a dummy callback, sqlite3WalkExpr() and similar do not +** descend into sub-select statements. +*/ +static int renameColumnSelectCb(Walker *pWalker, Select *p){ + if( p->selFlags & (SF_View|SF_CopyCte) ){ + testcase( p->selFlags & SF_View ); + testcase( p->selFlags & SF_CopyCte ); + return WRC_Prune; + } + renameWalkWith(pWalker, p); + return WRC_Continue; +} + +/* +** This is a Walker expression callback. +** +** For every TK_COLUMN node in the expression tree, search to see +** if the column being references is the column being renamed by an +** ALTER TABLE statement. If it is, then attach its associated +** RenameToken object to the list of RenameToken objects being +** constructed in RenameCtx object at pWalker->u.pRename. +*/ +static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ + RenameCtx *p = pWalker->u.pRename; + if( pExpr->op==TK_TRIGGER + && pExpr->iColumn==p->iCol + && pWalker->pParse->pTriggerTab==p->pTab + ){ + renameTokenFind(pWalker->pParse, p, (void*)pExpr); + }else if( pExpr->op==TK_COLUMN + && pExpr->iColumn==p->iCol + && ALWAYS(ExprUseYTab(pExpr)) + && p->pTab==pExpr->y.pTab + ){ + renameTokenFind(pWalker->pParse, p, (void*)pExpr); + } + return WRC_Continue; +} + +/* +** The RenameCtx contains a list of tokens that reference a column that +** is being renamed by an ALTER TABLE statement. Return the "last" +** RenameToken in the RenameCtx and remove that RenameToken from the +** RenameContext. "Last" means the last RenameToken encountered when +** the input SQL is parsed from left to right. Repeated calls to this routine +** return all column name tokens in the order that they are encountered +** in the SQL statement. +*/ +static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){ + RenameToken *pBest = pCtx->pList; + RenameToken *pToken; + RenameToken **pp; + + for(pToken=pBest->pNext; pToken; pToken=pToken->pNext){ + if( pToken->t.z>pBest->t.z ) pBest = pToken; + } + for(pp=&pCtx->pList; *pp!=pBest; pp=&(*pp)->pNext); + *pp = pBest->pNext; + + return pBest; +} + +/* +** An error occured while parsing or otherwise processing a database +** object (either pParse->pNewTable, pNewIndex or pNewTrigger) as part of an +** ALTER TABLE RENAME COLUMN program. The error message emitted by the +** sub-routine is currently stored in pParse->zErrMsg. This function +** adds context to the error message and then stores it in pCtx. +*/ +static void renameColumnParseError( + sqlite3_context *pCtx, + const char *zWhen, + sqlite3_value *pType, + sqlite3_value *pObject, + Parse *pParse +){ + const char *zT = (const char*)sqlite3_value_text(pType); + const char *zN = (const char*)sqlite3_value_text(pObject); + char *zErr; + + zErr = sqlite3MPrintf(pParse->db, "error in %s %s%s%s: %s", + zT, zN, (zWhen[0] ? " " : ""), zWhen, + pParse->zErrMsg + ); + sqlite3_result_error(pCtx, zErr, -1); + sqlite3DbFree(pParse->db, zErr); +} + +/* +** For each name in the the expression-list pEList (i.e. each +** pEList->a[i].zName) that matches the string in zOld, extract the +** corresponding rename-token from Parse object pParse and add it +** to the RenameCtx pCtx. +*/ +static void renameColumnElistNames( + Parse *pParse, + RenameCtx *pCtx, + const ExprList *pEList, + const char *zOld +){ + if( pEList ){ + int i; + for(i=0; inExpr; i++){ + const char *zName = pEList->a[i].zEName; + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) + && ALWAYS(zName!=0) + && 0==sqlite3_stricmp(zName, zOld) + ){ + renameTokenFind(pParse, pCtx, (const void*)zName); + } + } + } +} + +/* +** For each name in the the id-list pIdList (i.e. each pIdList->a[i].zName) +** that matches the string in zOld, extract the corresponding rename-token +** from Parse object pParse and add it to the RenameCtx pCtx. +*/ +static void renameColumnIdlistNames( + Parse *pParse, + RenameCtx *pCtx, + const IdList *pIdList, + const char *zOld +){ + if( pIdList ){ + int i; + for(i=0; inId; i++){ + const char *zName = pIdList->a[i].zName; + if( 0==sqlite3_stricmp(zName, zOld) ){ + renameTokenFind(pParse, pCtx, (const void*)zName); + } + } + } +} + + +/* +** Parse the SQL statement zSql using Parse object (*p). The Parse object +** is initialized by this function before it is used. +*/ +static int renameParseSql( + Parse *p, /* Memory to use for Parse object */ + const char *zDb, /* Name of schema SQL belongs to */ + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL to parse */ + int bTemp /* True if SQL is from temp schema */ +){ + int rc; + + sqlite3ParseObjectInit(p, db); + if( zSql==0 ){ + return SQLITE_NOMEM; + } + if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){ + return SQLITE_CORRUPT_BKPT; + } + db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb); + p->eParseMode = PARSE_MODE_RENAME; + p->db = db; + p->nQueryLoop = 1; + rc = sqlite3RunParser(p, zSql); + if( db->mallocFailed ) rc = SQLITE_NOMEM; + if( rc==SQLITE_OK + && NEVER(p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0) + ){ + rc = SQLITE_CORRUPT_BKPT; + } + +#ifdef SQLITE_DEBUG + /* Ensure that all mappings in the Parse.pRename list really do map to + ** a part of the input string. */ + if( rc==SQLITE_OK ){ + int nSql = sqlite3Strlen30(zSql); + RenameToken *pToken; + for(pToken=p->pRename; pToken; pToken=pToken->pNext){ + assert( pToken->t.z>=zSql && &pToken->t.z[pToken->t.n]<=&zSql[nSql] ); + } + } +#endif + + db->init.iDb = 0; + return rc; +} + +/* +** This function edits SQL statement zSql, replacing each token identified +** by the linked list pRename with the text of zNew. If argument bQuote is +** true, then zNew is always quoted first. If no error occurs, the result +** is loaded into context object pCtx as the result. +** +** Or, if an error occurs (i.e. an OOM condition), an error is left in +** pCtx and an SQLite error code returned. +*/ +static int renameEditSql( + sqlite3_context *pCtx, /* Return result here */ + RenameCtx *pRename, /* Rename context */ + const char *zSql, /* SQL statement to edit */ + const char *zNew, /* New token text */ + int bQuote /* True to always quote token */ +){ + i64 nNew = sqlite3Strlen30(zNew); + i64 nSql = sqlite3Strlen30(zSql); + sqlite3 *db = sqlite3_context_db_handle(pCtx); + int rc = SQLITE_OK; + char *zQuot = 0; + char *zOut; + i64 nQuot = 0; + char *zBuf1 = 0; + char *zBuf2 = 0; + + if( zNew ){ + /* Set zQuot to point to a buffer containing a quoted copy of the + ** identifier zNew. If the corresponding identifier in the original + ** ALTER TABLE statement was quoted (bQuote==1), then set zNew to + ** point to zQuot so that all substitutions are made using the + ** quoted version of the new column name. */ + zQuot = sqlite3MPrintf(db, "\"%w\" ", zNew); + if( zQuot==0 ){ + return SQLITE_NOMEM; + }else{ + nQuot = sqlite3Strlen30(zQuot)-1; + } + + assert( nQuot>=nNew ); + zOut = sqlite3DbMallocZero(db, nSql + pRename->nList*nQuot + 1); + }else{ + zOut = (char*)sqlite3DbMallocZero(db, (nSql*2+1) * 3); + if( zOut ){ + zBuf1 = &zOut[nSql*2+1]; + zBuf2 = &zOut[nSql*4+2]; + } + } + + /* At this point pRename->pList contains a list of RenameToken objects + ** corresponding to all tokens in the input SQL that must be replaced + ** with the new column name, or with single-quoted versions of themselves. + ** All that remains is to construct and return the edited SQL string. */ + if( zOut ){ + int nOut = nSql; + memcpy(zOut, zSql, nSql); + while( pRename->pList ){ + int iOff; /* Offset of token to replace in zOut */ + u32 nReplace; + const char *zReplace; + RenameToken *pBest = renameColumnTokenNext(pRename); + + if( zNew ){ + if( bQuote==0 && sqlite3IsIdChar(*pBest->t.z) ){ + nReplace = nNew; + zReplace = zNew; + }else{ + nReplace = nQuot; + zReplace = zQuot; + if( pBest->t.z[pBest->t.n]=='"' ) nReplace++; + } + }else{ + /* Dequote the double-quoted token. Then requote it again, this time + ** using single quotes. If the character immediately following the + ** original token within the input SQL was a single quote ('), then + ** add another space after the new, single-quoted version of the + ** token. This is so that (SELECT "string"'alias') maps to + ** (SELECT 'string' 'alias'), and not (SELECT 'string''alias'). */ + memcpy(zBuf1, pBest->t.z, pBest->t.n); + zBuf1[pBest->t.n] = 0; + sqlite3Dequote(zBuf1); + sqlite3_snprintf(nSql*2, zBuf2, "%Q%s", zBuf1, + pBest->t.z[pBest->t.n]=='\'' ? " " : "" + ); + zReplace = zBuf2; + nReplace = sqlite3Strlen30(zReplace); + } + + iOff = pBest->t.z - zSql; + if( pBest->t.n!=nReplace ){ + memmove(&zOut[iOff + nReplace], &zOut[iOff + pBest->t.n], + nOut - (iOff + pBest->t.n) + ); + nOut += nReplace - pBest->t.n; + zOut[nOut] = '\0'; + } + memcpy(&zOut[iOff], zReplace, nReplace); + sqlite3DbFree(db, pBest); + } + + sqlite3_result_text(pCtx, zOut, -1, SQLITE_TRANSIENT); + sqlite3DbFree(db, zOut); + }else{ + rc = SQLITE_NOMEM; + } + + sqlite3_free(zQuot); + return rc; +} + +/* +** Resolve all symbols in the trigger at pParse->pNewTrigger, assuming +** it was read from the schema of database zDb. Return SQLITE_OK if +** successful. Otherwise, return an SQLite error code and leave an error +** message in the Parse object. +*/ +static int renameResolveTrigger(Parse *pParse){ + sqlite3 *db = pParse->db; + Trigger *pNew = pParse->pNewTrigger; + TriggerStep *pStep; + NameContext sNC; + int rc = SQLITE_OK; + + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + assert( pNew->pTabSchema ); + pParse->pTriggerTab = sqlite3FindTable(db, pNew->table, + db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName + ); + pParse->eTriggerOp = pNew->op; + /* ALWAYS() because if the table of the trigger does not exist, the + ** error would have been hit before this point */ + if( ALWAYS(pParse->pTriggerTab) ){ + rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); + } + + /* Resolve symbols in WHEN clause */ + if( rc==SQLITE_OK && pNew->pWhen ){ + rc = sqlite3ResolveExprNames(&sNC, pNew->pWhen); + } + + for(pStep=pNew->step_list; rc==SQLITE_OK && pStep; pStep=pStep->pNext){ + if( pStep->pSelect ){ + sqlite3SelectPrep(pParse, pStep->pSelect, &sNC); + if( pParse->nErr ) rc = pParse->rc; + } + if( rc==SQLITE_OK && pStep->zTarget ){ + SrcList *pSrc = sqlite3TriggerStepSrc(pParse, pStep); + if( pSrc ){ + Select *pSel = sqlite3SelectNew( + pParse, pStep->pExprList, pSrc, 0, 0, 0, 0, 0, 0 + ); + if( pSel==0 ){ + pStep->pExprList = 0; + pSrc = 0; + rc = SQLITE_NOMEM; + }else{ + sqlite3SelectPrep(pParse, pSel, 0); + rc = pParse->nErr ? SQLITE_ERROR : SQLITE_OK; + assert( pStep->pExprList==0 || pStep->pExprList==pSel->pEList ); + assert( pSrc==pSel->pSrc ); + if( pStep->pExprList ) pSel->pEList = 0; + pSel->pSrc = 0; + sqlite3SelectDelete(db, pSel); + } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc && rc==SQLITE_OK; i++){ + SrcItem *p = &pStep->pFrom->a[i]; + if( p->pSelect ){ + sqlite3SelectPrep(pParse, p->pSelect, 0); + } + } + } + + if( db->mallocFailed ){ + rc = SQLITE_NOMEM; + } + sNC.pSrcList = pSrc; + if( rc==SQLITE_OK && pStep->pWhere ){ + rc = sqlite3ResolveExprNames(&sNC, pStep->pWhere); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprListNames(&sNC, pStep->pExprList); + } + assert( !pStep->pUpsert || (!pStep->pWhere && !pStep->pExprList) ); + if( pStep->pUpsert && rc==SQLITE_OK ){ + Upsert *pUpsert = pStep->pUpsert; + pUpsert->pUpsertSrc = pSrc; + sNC.uNC.pUpsert = pUpsert; + sNC.ncFlags = NC_UUpsert; + rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); + if( rc==SQLITE_OK ){ + ExprList *pUpsertSet = pUpsert->pUpsertSet; + rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertWhere); + } + if( rc==SQLITE_OK ){ + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); + } + sNC.ncFlags = 0; + } + sNC.pSrcList = 0; + sqlite3SrcListDelete(db, pSrc); + }else{ + rc = SQLITE_NOMEM; + } + } + } + return rc; +} + +/* +** Invoke sqlite3WalkExpr() or sqlite3WalkSelect() on all Select or Expr +** objects that are part of the trigger passed as the second argument. +*/ +static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ + TriggerStep *pStep; + + /* Find tokens to edit in WHEN clause */ + sqlite3WalkExpr(pWalker, pTrigger->pWhen); + + /* Find tokens to edit in trigger steps */ + for(pStep=pTrigger->step_list; pStep; pStep=pStep->pNext){ + sqlite3WalkSelect(pWalker, pStep->pSelect); + sqlite3WalkExpr(pWalker, pStep->pWhere); + sqlite3WalkExprList(pWalker, pStep->pExprList); + if( pStep->pUpsert ){ + Upsert *pUpsert = pStep->pUpsert; + sqlite3WalkExprList(pWalker, pUpsert->pUpsertTarget); + sqlite3WalkExprList(pWalker, pUpsert->pUpsertSet); + sqlite3WalkExpr(pWalker, pUpsert->pUpsertWhere); + sqlite3WalkExpr(pWalker, pUpsert->pUpsertTargetWhere); + } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc; i++){ + sqlite3WalkSelect(pWalker, pStep->pFrom->a[i].pSelect); + } + } + } +} + +/* +** Free the contents of Parse object (*pParse). Do not free the memory +** occupied by the Parse object itself. +*/ +static void renameParseCleanup(Parse *pParse){ + sqlite3 *db = pParse->db; + Index *pIdx; + if( pParse->pVdbe ){ + sqlite3VdbeFinalize(pParse->pVdbe); + } + sqlite3DeleteTable(db, pParse->pNewTable); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } + sqlite3DeleteTrigger(db, pParse->pNewTrigger); + sqlite3DbFree(db, pParse->zErrMsg); + renameTokenFree(db, pParse->pRename); + sqlite3ParseObjectReset(pParse); +} + +/* +** SQL function: +** +** sqlite_rename_column(SQL,TYPE,OBJ,DB,TABLE,COL,NEWNAME,QUOTE,TEMP) +** +** 0. zSql: SQL statement to rewrite +** 1. type: Type of object ("table", "view" etc.) +** 2. object: Name of object +** 3. Database: Database name (e.g. "main") +** 4. Table: Table name +** 5. iCol: Index of column to rename +** 6. zNew: New column name +** 7. bQuote: Non-zero if the new column name should be quoted. +** 8. bTemp: True if zSql comes from temp schema +** +** Do a column rename operation on the CREATE statement given in zSql. +** The iCol-th column (left-most is 0) of table zTable is renamed from zCol +** into zNew. The name should be quoted if bQuote is true. +** +** This function is used internally by the ALTER TABLE RENAME COLUMN command. +** It is only accessible to SQL created using sqlite3NestedParse(). It is +** not reachable from ordinary SQL passed into sqlite3_prepare() unless the +** SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test setting is enabled. +*/ +static void renameColumnFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + RenameCtx sCtx; + const char *zSql = (const char*)sqlite3_value_text(argv[0]); + const char *zDb = (const char*)sqlite3_value_text(argv[3]); + const char *zTable = (const char*)sqlite3_value_text(argv[4]); + int iCol = sqlite3_value_int(argv[5]); + const char *zNew = (const char*)sqlite3_value_text(argv[6]); + int bQuote = sqlite3_value_int(argv[7]); + int bTemp = sqlite3_value_int(argv[8]); + const char *zOld; + int rc; + Parse sParse; + Walker sWalker; + Index *pIdx; + int i; + Table *pTab; +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; +#endif + + UNUSED_PARAMETER(NotUsed); + if( zSql==0 ) return; + if( zTable==0 ) return; + if( zNew==0 ) return; + if( iCol<0 ) return; + sqlite3BtreeEnterAll(db); + pTab = sqlite3FindTable(db, zTable, zDb); + if( pTab==0 || iCol>=pTab->nCol ){ + sqlite3BtreeLeaveAll(db); + return; + } + zOld = pTab->aCol[iCol].zCnName; + memset(&sCtx, 0, sizeof(sCtx)); + sCtx.iCol = ((iCol==pTab->iPKey) ? -1 : iCol); + +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = 0; +#endif + rc = renameParseSql(&sParse, zDb, db, zSql, bTemp); + + /* Find tokens that need to be replaced. */ + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = &sParse; + sWalker.xExprCallback = renameColumnExprCb; + sWalker.xSelectCallback = renameColumnSelectCb; + sWalker.u.pRename = &sCtx; + + sCtx.pTab = pTab; + if( rc!=SQLITE_OK ) goto renameColumnFunc_done; + if( sParse.pNewTable ){ + if( IsView(sParse.pNewTable) ){ + Select *pSelect = sParse.pNewTable->u.view.pSelect; + pSelect->selFlags &= ~SF_View; + sParse.rc = SQLITE_OK; + sqlite3SelectPrep(&sParse, pSelect, 0); + rc = (db->mallocFailed ? SQLITE_NOMEM : sParse.rc); + if( rc==SQLITE_OK ){ + sqlite3WalkSelect(&sWalker, pSelect); + } + if( rc!=SQLITE_OK ) goto renameColumnFunc_done; + }else if( IsOrdinaryTable(sParse.pNewTable) ){ + /* A regular table */ + int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName); + FKey *pFKey; + sCtx.pTab = sParse.pNewTable; + if( bFKOnly==0 ){ + if( iColnCol ){ + renameTokenFind( + &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zCnName + ); + } + if( sCtx.iCol<0 ){ + renameTokenFind(&sParse, &sCtx, (void*)&sParse.pNewTable->iPKey); + } + sqlite3WalkExprList(&sWalker, sParse.pNewTable->pCheck); + for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + for(i=0; inCol; i++){ + Expr *pExpr = sqlite3ColumnExpr(sParse.pNewTable, + &sParse.pNewTable->aCol[i]); + sqlite3WalkExpr(&sWalker, pExpr); + } +#endif + } + + assert( IsOrdinaryTable(sParse.pNewTable) ); + for(pFKey=sParse.pNewTable->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ + for(i=0; inCol; i++){ + if( bFKOnly==0 && pFKey->aCol[i].iFrom==iCol ){ + renameTokenFind(&sParse, &sCtx, (void*)&pFKey->aCol[i]); + } + if( 0==sqlite3_stricmp(pFKey->zTo, zTable) + && 0==sqlite3_stricmp(pFKey->aCol[i].zCol, zOld) + ){ + renameTokenFind(&sParse, &sCtx, (void*)pFKey->aCol[i].zCol); + } + } + } + } + }else if( sParse.pNewIndex ){ + sqlite3WalkExprList(&sWalker, sParse.pNewIndex->aColExpr); + sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); + }else{ + /* A trigger */ + TriggerStep *pStep; + rc = renameResolveTrigger(&sParse); + if( rc!=SQLITE_OK ) goto renameColumnFunc_done; + + for(pStep=sParse.pNewTrigger->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget ){ + Table *pTarget = sqlite3LocateTable(&sParse, 0, pStep->zTarget, zDb); + if( pTarget==pTab ){ + if( pStep->pUpsert ){ + ExprList *pUpsertSet = pStep->pUpsert->pUpsertSet; + renameColumnElistNames(&sParse, &sCtx, pUpsertSet, zOld); + } + renameColumnIdlistNames(&sParse, &sCtx, pStep->pIdList, zOld); + renameColumnElistNames(&sParse, &sCtx, pStep->pExprList, zOld); + } + } + } + + + /* Find tokens to edit in UPDATE OF clause */ + if( sParse.pTriggerTab==pTab ){ + renameColumnIdlistNames(&sParse, &sCtx,sParse.pNewTrigger->pColumns,zOld); + } + + /* Find tokens to edit in various expressions and selects */ + renameWalkTrigger(&sWalker, sParse.pNewTrigger); + } + + assert( rc==SQLITE_OK ); + rc = renameEditSql(context, &sCtx, zSql, zNew, bQuote); + +renameColumnFunc_done: + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[0]); + }else if( sParse.zErrMsg ){ + renameColumnParseError(context, "", argv[1], argv[2], &sParse); + }else{ + sqlite3_result_error_code(context, rc); + } + } + + renameParseCleanup(&sParse); + renameTokenFree(db, sCtx.pList); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + sqlite3BtreeLeaveAll(db); +} + +/* +** Walker expression callback used by "RENAME TABLE". +*/ +static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ + RenameCtx *p = pWalker->u.pRename; + if( pExpr->op==TK_COLUMN + && ALWAYS(ExprUseYTab(pExpr)) + && p->pTab==pExpr->y.pTab + ){ + renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab); + } + return WRC_Continue; +} + +/* +** Walker select callback used by "RENAME TABLE". +*/ +static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ + int i; + RenameCtx *p = pWalker->u.pRename; + SrcList *pSrc = pSelect->pSrc; + if( pSelect->selFlags & (SF_View|SF_CopyCte) ){ + testcase( pSelect->selFlags & SF_View ); + testcase( pSelect->selFlags & SF_CopyCte ); + return WRC_Prune; + } + if( NEVER(pSrc==0) ){ + assert( pWalker->pParse->db->mallocFailed ); + return WRC_Abort; + } + for(i=0; inSrc; i++){ + SrcItem *pItem = &pSrc->a[i]; + if( pItem->pTab==p->pTab ){ + renameTokenFind(pWalker->pParse, p, pItem->zName); + } + } + renameWalkWith(pWalker, pSelect); + + return WRC_Continue; +} + + +/* +** This C function implements an SQL user function that is used by SQL code +** generated by the ALTER TABLE ... RENAME command to modify the definition +** of any foreign key constraints that use the table being renamed as the +** parent table. It is passed three arguments: +** +** 0: The database containing the table being renamed. +** 1. type: Type of object ("table", "view" etc.) +** 2. object: Name of object +** 3: The complete text of the schema statement being modified, +** 4: The old name of the table being renamed, and +** 5: The new name of the table being renamed. +** 6: True if the schema statement comes from the temp db. +** +** It returns the new schema statement. For example: +** +** sqlite_rename_table('main', 'CREATE TABLE t1(a REFERENCES t2)','t2','t3',0) +** -> 'CREATE TABLE t1(a REFERENCES t3)' +*/ +static void renameTableFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zDb = (const char*)sqlite3_value_text(argv[0]); + const char *zInput = (const char*)sqlite3_value_text(argv[3]); + const char *zOld = (const char*)sqlite3_value_text(argv[4]); + const char *zNew = (const char*)sqlite3_value_text(argv[5]); + int bTemp = sqlite3_value_int(argv[6]); + UNUSED_PARAMETER(NotUsed); + + if( zInput && zOld && zNew ){ + Parse sParse; + int rc; + int bQuote = 1; + RenameCtx sCtx; + Walker sWalker; + +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif + + sqlite3BtreeEnterAll(db); + + memset(&sCtx, 0, sizeof(RenameCtx)); + sCtx.pTab = sqlite3FindTable(db, zOld, zDb); + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = &sParse; + sWalker.xExprCallback = renameTableExprCb; + sWalker.xSelectCallback = renameTableSelectCb; + sWalker.u.pRename = &sCtx; + + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); + + if( rc==SQLITE_OK ){ + int isLegacy = (db->flags & SQLITE_LegacyAlter); + if( sParse.pNewTable ){ + Table *pTab = sParse.pNewTable; + + if( IsView(pTab) ){ + if( isLegacy==0 ){ + Select *pSelect = pTab->u.view.pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = &sParse; + + assert( pSelect->selFlags & SF_View ); + pSelect->selFlags &= ~SF_View; + sqlite3SelectPrep(&sParse, pTab->u.view.pSelect, &sNC); + if( sParse.nErr ){ + rc = sParse.rc; + }else{ + sqlite3WalkSelect(&sWalker, pTab->u.view.pSelect); + } + } + }else{ + /* Modify any FK definitions to point to the new table. */ +#ifndef SQLITE_OMIT_FOREIGN_KEY + if( (isLegacy==0 || (db->flags & SQLITE_ForeignKeys)) + && !IsVirtual(pTab) + ){ + FKey *pFKey; + assert( IsOrdinaryTable(pTab) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ + if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ + renameTokenFind(&sParse, &sCtx, (void*)pFKey->zTo); + } + } + } +#endif + + /* If this is the table being altered, fix any table refs in CHECK + ** expressions. Also update the name that appears right after the + ** "CREATE [VIRTUAL] TABLE" bit. */ + if( sqlite3_stricmp(zOld, pTab->zName)==0 ){ + sCtx.pTab = pTab; + if( isLegacy==0 ){ + sqlite3WalkExprList(&sWalker, pTab->pCheck); + } + renameTokenFind(&sParse, &sCtx, pTab->zName); + } + } + } + + else if( sParse.pNewIndex ){ + renameTokenFind(&sParse, &sCtx, sParse.pNewIndex->zName); + if( isLegacy==0 ){ + sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); + } + } + +#ifndef SQLITE_OMIT_TRIGGER + else{ + Trigger *pTrigger = sParse.pNewTrigger; + TriggerStep *pStep; + if( 0==sqlite3_stricmp(sParse.pNewTrigger->table, zOld) + && sCtx.pTab->pSchema==pTrigger->pTabSchema + ){ + renameTokenFind(&sParse, &sCtx, sParse.pNewTrigger->table); + } + + if( isLegacy==0 ){ + rc = renameResolveTrigger(&sParse); + if( rc==SQLITE_OK ){ + renameWalkTrigger(&sWalker, pTrigger); + for(pStep=pTrigger->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){ + renameTokenFind(&sParse, &sCtx, pStep->zTarget); + } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc; i++){ + SrcItem *pItem = &pStep->pFrom->a[i]; + if( 0==sqlite3_stricmp(pItem->zName, zOld) ){ + renameTokenFind(&sParse, &sCtx, pItem->zName); + } + } + } + } + } + } + } +#endif + } + + if( rc==SQLITE_OK ){ + rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote); + } + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[3]); + }else if( sParse.zErrMsg ){ + renameColumnParseError(context, "", argv[1], argv[2], &sParse); + }else{ + sqlite3_result_error_code(context, rc); + } + } + + renameParseCleanup(&sParse); + renameTokenFree(db, sCtx.pList); + sqlite3BtreeLeaveAll(db); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + } + + return; +} + +static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_STRING && (pExpr->flags & EP_DblQuoted) ){ + renameTokenFind(pWalker->pParse, pWalker->u.pRename, (const void*)pExpr); + } + return WRC_Continue; +} + +/* SQL function: sqlite_rename_quotefix(DB,SQL) +** +** Rewrite the DDL statement "SQL" so that any string literals that use +** double-quotes use single quotes instead. +** +** Two arguments must be passed: +** +** 0: Database name ("main", "temp" etc.). +** 1: SQL statement to edit. +** +** The returned value is the modified SQL statement. For example, given +** the database schema: +** +** CREATE TABLE t1(a, b, c); +** +** SELECT sqlite_rename_quotefix('main', +** 'CREATE VIEW v1 AS SELECT "a", "string" FROM t1' +** ); +** +** returns the string: +** +** CREATE VIEW v1 AS SELECT "a", 'string' FROM t1 +** +** If there is a error in the input SQL, then raise an error, except +** if PRAGMA writable_schema=ON, then just return the input string +** unmodified following an error. +*/ +static void renameQuotefixFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + char const *zDb = (const char*)sqlite3_value_text(argv[0]); + char const *zInput = (const char*)sqlite3_value_text(argv[1]); + +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif + + sqlite3BtreeEnterAll(db); + + UNUSED_PARAMETER(NotUsed); + if( zDb && zInput ){ + int rc; + Parse sParse; + rc = renameParseSql(&sParse, zDb, db, zInput, 0); + + if( rc==SQLITE_OK ){ + RenameCtx sCtx; + Walker sWalker; + + /* Walker to find tokens that need to be replaced. */ + memset(&sCtx, 0, sizeof(RenameCtx)); + memset(&sWalker, 0, sizeof(Walker)); + sWalker.pParse = &sParse; + sWalker.xExprCallback = renameQuotefixExprCb; + sWalker.xSelectCallback = renameColumnSelectCb; + sWalker.u.pRename = &sCtx; + + if( sParse.pNewTable ){ + if( IsView(sParse.pNewTable) ){ + Select *pSelect = sParse.pNewTable->u.view.pSelect; + pSelect->selFlags &= ~SF_View; + sParse.rc = SQLITE_OK; + sqlite3SelectPrep(&sParse, pSelect, 0); + rc = (db->mallocFailed ? SQLITE_NOMEM : sParse.rc); + if( rc==SQLITE_OK ){ + sqlite3WalkSelect(&sWalker, pSelect); + } + }else{ + int i; + sqlite3WalkExprList(&sWalker, sParse.pNewTable->pCheck); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + for(i=0; inCol; i++){ + sqlite3WalkExpr(&sWalker, + sqlite3ColumnExpr(sParse.pNewTable, + &sParse.pNewTable->aCol[i])); + } +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + } + }else if( sParse.pNewIndex ){ + sqlite3WalkExprList(&sWalker, sParse.pNewIndex->aColExpr); + sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); + }else{ +#ifndef SQLITE_OMIT_TRIGGER + rc = renameResolveTrigger(&sParse); + if( rc==SQLITE_OK ){ + renameWalkTrigger(&sWalker, sParse.pNewTrigger); + } +#endif /* SQLITE_OMIT_TRIGGER */ + } + + if( rc==SQLITE_OK ){ + rc = renameEditSql(context, &sCtx, zInput, 0, 0); + } + renameTokenFree(db, sCtx.pList); + } + if( rc!=SQLITE_OK ){ + if( sqlite3WritableSchema(db) && rc==SQLITE_ERROR ){ + sqlite3_result_value(context, argv[1]); + }else{ + sqlite3_result_error_code(context, rc); + } + } + renameParseCleanup(&sParse); + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + + sqlite3BtreeLeaveAll(db); +} + +/* Function: sqlite_rename_test(DB,SQL,TYPE,NAME,ISTEMP,WHEN,DQS) +** +** An SQL user function that checks that there are no parse or symbol +** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement. +** After an ALTER TABLE .. RENAME operation is performed and the schema +** reloaded, this function is called on each SQL statement in the schema +** to ensure that it is still usable. +** +** 0: Database name ("main", "temp" etc.). +** 1: SQL statement. +** 2: Object type ("view", "table", "trigger" or "index"). +** 3: Object name. +** 4: True if object is from temp schema. +** 5: "when" part of error message. +** 6: True to disable the DQS quirk when parsing SQL. +** +** The return value is computed as follows: +** +** A. If an error is seen and not in PRAGMA writable_schema=ON mode, +** then raise the error. +** B. Else if a trigger is created and the the table that the trigger is +** attached to is in database zDb, then return 1. +** C. Otherwise return NULL. +*/ +static void renameTableTest( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + char const *zDb = (const char*)sqlite3_value_text(argv[0]); + char const *zInput = (const char*)sqlite3_value_text(argv[1]); + int bTemp = sqlite3_value_int(argv[4]); + int isLegacy = (db->flags & SQLITE_LegacyAlter); + char const *zWhen = (const char*)sqlite3_value_text(argv[5]); + int bNoDQS = sqlite3_value_int(argv[6]); + +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif + + UNUSED_PARAMETER(NotUsed); + + if( zDb && zInput ){ + int rc; + Parse sParse; + int flags = db->flags; + if( bNoDQS ) db->flags &= ~(SQLITE_DqsDML|SQLITE_DqsDDL); + rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); + db->flags |= (flags & (SQLITE_DqsDML|SQLITE_DqsDDL)); + if( rc==SQLITE_OK ){ + if( isLegacy==0 && sParse.pNewTable && IsView(sParse.pNewTable) ){ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = &sParse; + sqlite3SelectPrep(&sParse, sParse.pNewTable->u.view.pSelect, &sNC); + if( sParse.nErr ) rc = sParse.rc; + } + + else if( sParse.pNewTrigger ){ + if( isLegacy==0 ){ + rc = renameResolveTrigger(&sParse); + } + if( rc==SQLITE_OK ){ + int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema); + int i2 = sqlite3FindDbName(db, zDb); + if( i1==i2 ){ + /* Handle output case B */ + sqlite3_result_int(context, 1); + } + } + } + } + + if( rc!=SQLITE_OK && zWhen && !sqlite3WritableSchema(db) ){ + /* Output case A */ + renameColumnParseError(context, zWhen, argv[2], argv[3],&sParse); + } + renameParseCleanup(&sParse); + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif +} + +/* +** The implementation of internal UDF sqlite_drop_column(). +** +** Arguments: +** +** argv[0]: An integer - the index of the schema containing the table +** argv[1]: CREATE TABLE statement to modify. +** argv[2]: An integer - the index of the column to remove. +** +** The value returned is a string containing the CREATE TABLE statement +** with column argv[2] removed. +*/ +static void dropColumnFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + sqlite3 *db = sqlite3_context_db_handle(context); + int iSchema = sqlite3_value_int(argv[0]); + const char *zSql = (const char*)sqlite3_value_text(argv[1]); + int iCol = sqlite3_value_int(argv[2]); + const char *zDb = db->aDb[iSchema].zDbSName; + int rc; + Parse sParse; + RenameToken *pCol; + Table *pTab; + const char *zEnd; + char *zNew = 0; + +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth = db->xAuth; + db->xAuth = 0; +#endif + + UNUSED_PARAMETER(NotUsed); + rc = renameParseSql(&sParse, zDb, db, zSql, iSchema==1); + if( rc!=SQLITE_OK ) goto drop_column_done; + pTab = sParse.pNewTable; + if( pTab==0 || pTab->nCol==1 || iCol>=pTab->nCol ){ + /* This can happen if the sqlite_schema table is corrupt */ + rc = SQLITE_CORRUPT_BKPT; + goto drop_column_done; + } + + pCol = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol].zCnName); + if( iColnCol-1 ){ + RenameToken *pEnd; + pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zCnName); + zEnd = (const char*)pEnd->t.z; + }else{ + assert( IsOrdinaryTable(pTab) ); + zEnd = (const char*)&zSql[pTab->u.tab.addColOffset]; + while( ALWAYS(pCol->t.z[0]!=0) && pCol->t.z[0]!=',' ) pCol->t.z--; + } + + zNew = sqlite3MPrintf(db, "%.*s%s", pCol->t.z-zSql, zSql, zEnd); + sqlite3_result_text(context, zNew, -1, SQLITE_TRANSIENT); + sqlite3_free(zNew); + +drop_column_done: + renameParseCleanup(&sParse); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(context, rc); + } +} + +/* +** This function is called by the parser upon parsing an +** +** ALTER TABLE pSrc DROP COLUMN pName +** +** statement. Argument pSrc contains the possibly qualified name of the +** table being edited, and token pName the name of the column to drop. +*/ +SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const Token *pName){ + sqlite3 *db = pParse->db; /* Database handle */ + Table *pTab; /* Table to modify */ + int iDb; /* Index of db containing pTab in aDb[] */ + const char *zDb; /* Database containing pTab ("main" etc.) */ + char *zCol = 0; /* Name of column to drop */ + int iCol; /* Index of column zCol in pTab->aCol[] */ + + /* Look up the table being altered. */ + assert( pParse->pNewTable==0 ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + if( NEVER(db->mallocFailed) ) goto exit_drop_column; + pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); + if( !pTab ) goto exit_drop_column; + + /* Make sure this is not an attempt to ALTER a view, virtual table or + ** system table. */ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_drop_column; + if( SQLITE_OK!=isRealTable(pParse, pTab, 1) ) goto exit_drop_column; + + /* Find the index of the column being dropped. */ + zCol = sqlite3NameFromToken(db, pName); + if( zCol==0 ){ + assert( db->mallocFailed ); + goto exit_drop_column; + } + iCol = sqlite3ColumnIndex(pTab, zCol); + if( iCol<0 ){ + sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pName); + goto exit_drop_column; + } + + /* Do not allow the user to drop a PRIMARY KEY column or a column + ** constrained by a UNIQUE constraint. */ + if( pTab->aCol[iCol].colFlags & (COLFLAG_PRIMKEY|COLFLAG_UNIQUE) ){ + sqlite3ErrorMsg(pParse, "cannot drop %s column: \"%s\"", + (pTab->aCol[iCol].colFlags&COLFLAG_PRIMKEY) ? "PRIMARY KEY" : "UNIQUE", + zCol + ); + goto exit_drop_column; + } + + /* Do not allow the number of columns to go to zero */ + if( pTab->nCol<=1 ){ + sqlite3ErrorMsg(pParse, "cannot drop column \"%s\": no other columns exist",zCol); + goto exit_drop_column; + } + + /* Edit the sqlite_schema table */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 ); + zDb = db->aDb[iDb].zDbSName; +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Invoke the authorization callback. */ + if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, zCol) ){ + goto exit_drop_column; + } +#endif + renameTestSchema(pParse, zDb, iDb==1, "", 0); + renameFixQuotes(pParse, zDb, iDb==1); + sqlite3NestedParse(pParse, + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " + "sql = sqlite_drop_column(%d, sql, %d) " + "WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)" + , zDb, iDb, iCol, pTab->zName + ); + + /* Drop and reload the database schema. */ + renameReloadSchema(pParse, iDb, INITFLAG_AlterDrop); + renameTestSchema(pParse, zDb, iDb==1, "after drop column", 1); + + /* Edit rows of table on disk */ + if( pParse->nErr==0 && (pTab->aCol[iCol].colFlags & COLFLAG_VIRTUAL)==0 ){ + int i; + int addr; + int reg; + int regRec; + Index *pPk = 0; + int nField = 0; /* Number of non-virtual columns after drop */ + int iCur; + Vdbe *v = sqlite3GetVdbe(pParse); + iCur = pParse->nTab++; + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenWrite); + addr = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + reg = ++pParse->nMem; + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, reg); + pParse->nMem += pTab->nCol; + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + pParse->nMem += pPk->nColumn; + for(i=0; inKeyCol; i++){ + sqlite3VdbeAddOp3(v, OP_Column, iCur, i, reg+i+1); + } + nField = pPk->nKeyCol; + } + regRec = ++pParse->nMem; + for(i=0; inCol; i++){ + if( i!=iCol && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ + int regOut; + if( pPk ){ + int iPos = sqlite3TableColumnToIndex(pPk, i); + int iColPos = sqlite3TableColumnToIndex(pPk, iCol); + if( iPosnKeyCol ) continue; + regOut = reg+1+iPos-(iPos>iColPos); + }else{ + regOut = reg+1+nField; + } + if( i==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regOut); + }else{ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOut); + } + nField++; + } + } + if( nField==0 ){ + /* dbsqlfuzz 5f09e7bcc78b4954d06bf9f2400d7715f48d1fef */ + pParse->nMem++; + sqlite3VdbeAddOp2(v, OP_Null, 0, reg+1); + nField = 1; + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, reg+1, nField, regRec); + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iCur, regRec, reg+1, pPk->nKeyCol); + }else{ + sqlite3VdbeAddOp3(v, OP_Insert, iCur, regRec, reg); + } + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + + sqlite3VdbeAddOp2(v, OP_Next, iCur, addr+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr); + } + +exit_drop_column: + sqlite3DbFree(db, zCol); + sqlite3SrcListDelete(db, pSrc); +} + +/* +** Register built-in functions used to help implement ALTER TABLE +*/ +SQLITE_PRIVATE void sqlite3AlterFunctions(void){ + static FuncDef aAlterTableFuncs[] = { + INTERNAL_FUNCTION(sqlite_rename_column, 9, renameColumnFunc), + INTERNAL_FUNCTION(sqlite_rename_table, 7, renameTableFunc), + INTERNAL_FUNCTION(sqlite_rename_test, 7, renameTableTest), + INTERNAL_FUNCTION(sqlite_drop_column, 3, dropColumnFunc), + INTERNAL_FUNCTION(sqlite_rename_quotefix,2, renameQuotefixFunc), + }; + sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); +} +#endif /* SQLITE_ALTER_TABLE */ + +/************** End of alter.c ***********************************************/ +/************** Begin file analyze.c *****************************************/ +/* +** 2005-07-08 +** +** 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 contains code associated with the ANALYZE command. +** +** The ANALYZE command gather statistics about the content of tables +** and indices. These statistics are made available to the query planner +** to help it make better decisions about how to perform queries. +** +** The following system tables are or have been supported: +** +** CREATE TABLE sqlite_stat1(tbl, idx, stat); +** CREATE TABLE sqlite_stat2(tbl, idx, sampleno, sample); +** CREATE TABLE sqlite_stat3(tbl, idx, nEq, nLt, nDLt, sample); +** CREATE TABLE sqlite_stat4(tbl, idx, nEq, nLt, nDLt, sample); +** +** Additional tables might be added in future releases of SQLite. +** The sqlite_stat2 table is not created or used unless the SQLite version +** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled +** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated. +** The sqlite_stat2 table is superseded by sqlite_stat3, which is only +** created and used by SQLite versions 3.7.9 through 3.29.0 when +** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 +** is a superset of sqlite_stat2 and is also now deprecated. The +** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only +** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite +** versions 3.8.1 and later. STAT4 is the only variant that is still +** supported. +** +** For most applications, sqlite_stat1 provides all the statistics required +** for the query planner to make good choices. +** +** Format of sqlite_stat1: +** +** There is normally one row per index, with the index identified by the +** name in the idx column. The tbl column is the name of the table to +** which the index belongs. In each such row, the stat column will be +** a string consisting of a list of integers. The first integer in this +** list is the number of rows in the index. (This is the same as the +** number of rows in the table, except for partial indices.) The second +** integer is the average number of rows in the index that have the same +** value in the first column of the index. The third integer is the average +** number of rows in the index that have the same value for the first two +** columns. The N-th integer (for N>1) is the average number of rows in +** the index which have the same value for the first N-1 columns. For +** a K-column index, there will be K+1 integers in the stat column. If +** the index is unique, then the last integer will be 1. +** +** The list of integers in the stat column can optionally be followed +** by the keyword "unordered". The "unordered" keyword, if it is present, +** must be separated from the last integer by a single space. If the +** "unordered" keyword is present, then the query planner assumes that +** the index is unordered and will not use the index for a range query. +** +** If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat +** column contains a single integer which is the (estimated) number of +** rows in the table identified by sqlite_stat1.tbl. +** +** Format of sqlite_stat2: +** +** The sqlite_stat2 is only created and is only used if SQLite is compiled +** with SQLITE_ENABLE_STAT2 and if the SQLite version number is between +** 3.6.18 and 3.7.8. The "stat2" table contains additional information +** about the distribution of keys within an index. The index is identified by +** the "idx" column and the "tbl" column is the name of the table to which +** the index belongs. There are usually 10 rows in the sqlite_stat2 +** table for each index. +** +** The sqlite_stat2 entries for an index that have sampleno between 0 and 9 +** inclusive are samples of the left-most key value in the index taken at +** evenly spaced points along the index. Let the number of samples be S +** (10 in the standard build) and let C be the number of rows in the index. +** Then the sampled rows are given by: +** +** rownumber = (i*C*2 + C)/(S*2) +** +** For i between 0 and S-1. Conceptually, the index space is divided into +** S uniform buckets and the samples are the middle row from each bucket. +** +** The format for sqlite_stat2 is recorded here for legacy reference. This +** version of SQLite does not support sqlite_stat2. It neither reads nor +** writes the sqlite_stat2 table. This version of SQLite only supports +** sqlite_stat3. +** +** Format for sqlite_stat3: +** +** The sqlite_stat3 format is a subset of sqlite_stat4. Hence, the +** sqlite_stat4 format will be described first. Further information +** about sqlite_stat3 follows the sqlite_stat4 description. +** +** Format for sqlite_stat4: +** +** As with sqlite_stat2, the sqlite_stat4 table contains histogram data +** to aid the query planner in choosing good indices based on the values +** that indexed columns are compared against in the WHERE clauses of +** queries. +** +** The sqlite_stat4 table contains multiple entries for each index. +** The idx column names the index and the tbl column is the table of the +** index. If the idx and tbl columns are the same, then the sample is +** of the INTEGER PRIMARY KEY. The sample column is a blob which is the +** binary encoding of a key from the index. The nEq column is a +** list of integers. The first integer is the approximate number +** of entries in the index whose left-most column exactly matches +** the left-most column of the sample. The second integer in nEq +** is the approximate number of entries in the index where the +** first two columns match the first two columns of the sample. +** And so forth. nLt is another list of integers that show the approximate +** number of entries that are strictly less than the sample. The first +** integer in nLt contains the number of entries in the index where the +** left-most column is less than the left-most column of the sample. +** The K-th integer in the nLt entry is the number of index entries +** where the first K columns are less than the first K columns of the +** sample. The nDLt column is like nLt except that it contains the +** number of distinct entries in the index that are less than the +** sample. +** +** There can be an arbitrary number of sqlite_stat4 entries per index. +** The ANALYZE command will typically generate sqlite_stat4 tables +** that contain between 10 and 40 samples which are distributed across +** the key space, though not uniformly, and which include samples with +** large nEq values. +** +** Format for sqlite_stat3 redux: +** +** The sqlite_stat3 table is like sqlite_stat4 except that it only +** looks at the left-most column of the index. The sqlite_stat3.sample +** column contains the actual value of the left-most column instead +** of a blob encoding of the complete index key as is found in +** sqlite_stat4.sample. The nEq, nLt, and nDLt entries of sqlite_stat3 +** all contain just a single integer which is the same as the first +** integer in the equivalent columns in sqlite_stat4. +*/ +#ifndef SQLITE_OMIT_ANALYZE +/* #include "sqliteInt.h" */ + +#if defined(SQLITE_ENABLE_STAT4) +# define IsStat4 1 +#else +# define IsStat4 0 +# undef SQLITE_STAT4_SAMPLES +# define SQLITE_STAT4_SAMPLES 1 +#endif + +/* +** This routine generates code that opens the sqlite_statN tables. +** The sqlite_stat1 table is always relevant. sqlite_stat2 is now +** obsolete. sqlite_stat3 and sqlite_stat4 are only opened when +** appropriate compile-time options are provided. +** +** If the sqlite_statN tables do not previously exist, it is created. +** +** Argument zWhere may be a pointer to a buffer containing a table name, +** or it may be a NULL pointer. If it is not NULL, then all entries in +** the sqlite_statN tables associated with the named table are deleted. +** If zWhere==0, then code is generated to delete all stat table entries. +*/ +static void openStatTable( + Parse *pParse, /* Parsing context */ + int iDb, /* The database we are looking in */ + int iStatCur, /* Open the sqlite_stat1 table on this cursor */ + const char *zWhere, /* Delete entries for this table or index */ + const char *zWhereType /* Either "tbl" or "idx" */ +){ + static const struct { + const char *zName; + const char *zCols; + } aTable[] = { + { "sqlite_stat1", "tbl,idx,stat" }, +#if defined(SQLITE_ENABLE_STAT4) + { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, +#else + { "sqlite_stat4", 0 }, +#endif + { "sqlite_stat3", 0 }, + }; + int i; + sqlite3 *db = pParse->db; + Db *pDb; + Vdbe *v = sqlite3GetVdbe(pParse); + u32 aRoot[ArraySize(aTable)]; + u8 aCreateTbl[ArraySize(aTable)]; +#ifdef SQLITE_ENABLE_STAT4 + const int nToOpen = OptimizationEnabled(db,SQLITE_Stat4) ? 2 : 1; +#else + const int nToOpen = 1; +#endif + + if( v==0 ) return; + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3VdbeDb(v)==db ); + pDb = &db->aDb[iDb]; + + /* Create new statistic tables if they do not exist, or clear them + ** if they do already exist. + */ + for(i=0; izDbSName))==0 ){ + if( iregRoot. This is important + ** because the OpenWrite opcode below will be needing it. */ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols + ); + aRoot[i] = (u32)pParse->regRoot; + aCreateTbl[i] = OPFLAG_P2ISREG; + } + }else{ + /* The table already exists. If zWhere is not NULL, delete all entries + ** associated with the table zWhere. If zWhere is NULL, delete the + ** entire contents of the table. */ + aRoot[i] = pStat->tnum; + sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); + if( zWhere ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE %s=%Q", + pDb->zDbSName, zTab, zWhereType, zWhere + ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + }else if( db->xPreUpdateCallback ){ + sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab); +#endif + }else{ + /* The sqlite_stat[134] table already exists. Delete all rows. */ + sqlite3VdbeAddOp2(v, OP_Clear, (int)aRoot[i], iDb); + } + } + } + + /* Open the sqlite_stat[134] tables for writing. */ + for(i=0; inRowid ){ + sqlite3DbFree(db, p->u.aRowid); + p->nRowid = 0; + } +} +#endif + +/* Initialize the BLOB value of a ROWID +*/ +#ifdef SQLITE_ENABLE_STAT4 +static void sampleSetRowid(sqlite3 *db, StatSample *p, int n, const u8 *pData){ + assert( db!=0 ); + if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); + p->u.aRowid = sqlite3DbMallocRawNN(db, n); + if( p->u.aRowid ){ + p->nRowid = n; + memcpy(p->u.aRowid, pData, n); + }else{ + p->nRowid = 0; + } +} +#endif + +/* Initialize the INTEGER value of a ROWID. +*/ +#ifdef SQLITE_ENABLE_STAT4 +static void sampleSetRowidInt64(sqlite3 *db, StatSample *p, i64 iRowid){ + assert( db!=0 ); + if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); + p->nRowid = 0; + p->u.iRowid = iRowid; +} +#endif + + +/* +** Copy the contents of object (*pFrom) into (*pTo). +*/ +#ifdef SQLITE_ENABLE_STAT4 +static void sampleCopy(StatAccum *p, StatSample *pTo, StatSample *pFrom){ + pTo->isPSample = pFrom->isPSample; + pTo->iCol = pFrom->iCol; + pTo->iHash = pFrom->iHash; + memcpy(pTo->anEq, pFrom->anEq, sizeof(tRowcnt)*p->nCol); + memcpy(pTo->anLt, pFrom->anLt, sizeof(tRowcnt)*p->nCol); + memcpy(pTo->anDLt, pFrom->anDLt, sizeof(tRowcnt)*p->nCol); + if( pFrom->nRowid ){ + sampleSetRowid(p->db, pTo, pFrom->nRowid, pFrom->u.aRowid); + }else{ + sampleSetRowidInt64(p->db, pTo, pFrom->u.iRowid); + } +} +#endif + +/* +** Reclaim all memory of a StatAccum structure. +*/ +static void statAccumDestructor(void *pOld){ + StatAccum *p = (StatAccum*)pOld; +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ){ + int i; + for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); + for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); + sampleClear(p->db, &p->current); + } +#endif + sqlite3DbFree(p->db, p); +} + +/* +** Implementation of the stat_init(N,K,C,L) SQL function. The four parameters +** are: +** N: The number of columns in the index including the rowid/pk (note 1) +** K: The number of columns in the index excluding the rowid/pk. +** C: Estimated number of rows in the index +** L: A limit on the number of rows to scan, or 0 for no-limit +** +** Note 1: In the special case of the covering index that implements a +** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the +** total number of columns in the table. +** +** For indexes on ordinary rowid tables, N==K+1. But for indexes on +** WITHOUT ROWID tables, N=K+P where P is the number of columns in the +** PRIMARY KEY of the table. The covering index that implements the +** original WITHOUT ROWID table as N==K as a special case. +** +** This routine allocates the StatAccum object in heap memory. The return +** value is a pointer to the StatAccum object. The datatype of the +** return value is BLOB, but it is really just a pointer to the StatAccum +** object. +*/ +static void statInit( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + StatAccum *p; + int nCol; /* Number of columns in index being sampled */ + int nKeyCol; /* Number of key columns */ + int nColUp; /* nCol rounded up for alignment */ + int n; /* Bytes of space to allocate */ + sqlite3 *db = sqlite3_context_db_handle(context); /* Database connection */ +#ifdef SQLITE_ENABLE_STAT4 + /* Maximum number of samples. 0 if STAT4 data is not collected */ + int mxSample = OptimizationEnabled(db,SQLITE_Stat4) ?SQLITE_STAT4_SAMPLES :0; +#endif + + /* Decode the three function arguments */ + UNUSED_PARAMETER(argc); + nCol = sqlite3_value_int(argv[0]); + assert( nCol>0 ); + nColUp = sizeof(tRowcnt)<8 ? (nCol+1)&~1 : nCol; + nKeyCol = sqlite3_value_int(argv[1]); + assert( nKeyCol<=nCol ); + assert( nKeyCol>0 ); + + /* Allocate the space required for the StatAccum object */ + n = sizeof(*p) + + sizeof(tRowcnt)*nColUp /* StatAccum.anEq */ + + sizeof(tRowcnt)*nColUp; /* StatAccum.anDLt */ +#ifdef SQLITE_ENABLE_STAT4 + if( mxSample ){ + n += sizeof(tRowcnt)*nColUp /* StatAccum.anLt */ + + sizeof(StatSample)*(nCol+mxSample) /* StatAccum.aBest[], a[] */ + + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample); + } +#endif + p = sqlite3DbMallocZero(db, n); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + + p->db = db; + p->nEst = sqlite3_value_int64(argv[2]); + p->nRow = 0; + p->nLimit = sqlite3_value_int64(argv[3]); + p->nCol = nCol; + p->nKeyCol = nKeyCol; + p->nSkipAhead = 0; + p->current.anDLt = (tRowcnt*)&p[1]; + p->current.anEq = &p->current.anDLt[nColUp]; + +#ifdef SQLITE_ENABLE_STAT4 + p->mxSample = p->nLimit==0 ? mxSample : 0; + if( mxSample ){ + u8 *pSpace; /* Allocated space not yet assigned */ + int i; /* Used to iterate through p->aSample[] */ + + p->iGet = -1; + p->nPSample = (tRowcnt)(p->nEst/(mxSample/3+1) + 1); + p->current.anLt = &p->current.anEq[nColUp]; + p->iPrn = 0x689e962d*(u32)nCol ^ 0xd0944565*(u32)sqlite3_value_int(argv[2]); + + /* Set up the StatAccum.a[] and aBest[] arrays */ + p->a = (struct StatSample*)&p->current.anLt[nColUp]; + p->aBest = &p->a[mxSample]; + pSpace = (u8*)(&p->a[mxSample+nCol]); + for(i=0; i<(mxSample+nCol); i++){ + p->a[i].anEq = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + p->a[i].anLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + p->a[i].anDLt = (tRowcnt *)pSpace; pSpace += (sizeof(tRowcnt) * nColUp); + } + assert( (pSpace - (u8*)p)==n ); + + for(i=0; iaBest[i].iCol = i; + } + } +#endif + + /* Return a pointer to the allocated object to the caller. Note that + ** only the pointer (the 2nd parameter) matters. The size of the object + ** (given by the 3rd parameter) is never used and can be any positive + ** value. */ + sqlite3_result_blob(context, p, sizeof(*p), statAccumDestructor); +} +static const FuncDef statInitFuncdef = { + 4, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statInit, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "stat_init", /* zName */ + {0} +}; + +#ifdef SQLITE_ENABLE_STAT4 +/* +** pNew and pOld are both candidate non-periodic samples selected for +** the same column (pNew->iCol==pOld->iCol). Ignoring this column and +** considering only any trailing columns and the sample hash value, this +** function returns true if sample pNew is to be preferred over pOld. +** In other words, if we assume that the cardinalities of the selected +** column for pNew and pOld are equal, is pNew to be preferred over pOld. +** +** This function assumes that for each argument sample, the contents of +** the anEq[] array from pSample->anEq[pSample->iCol+1] onwards are valid. +*/ +static int sampleIsBetterPost( + StatAccum *pAccum, + StatSample *pNew, + StatSample *pOld +){ + int nCol = pAccum->nCol; + int i; + assert( pNew->iCol==pOld->iCol ); + for(i=pNew->iCol+1; ianEq[i]>pOld->anEq[i] ) return 1; + if( pNew->anEq[i]anEq[i] ) return 0; + } + if( pNew->iHash>pOld->iHash ) return 1; + return 0; +} +#endif + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Return true if pNew is to be preferred over pOld. +** +** This function assumes that for each argument sample, the contents of +** the anEq[] array from pSample->anEq[pSample->iCol] onwards are valid. +*/ +static int sampleIsBetter( + StatAccum *pAccum, + StatSample *pNew, + StatSample *pOld +){ + tRowcnt nEqNew = pNew->anEq[pNew->iCol]; + tRowcnt nEqOld = pOld->anEq[pOld->iCol]; + + assert( pOld->isPSample==0 && pNew->isPSample==0 ); + assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); + + if( (nEqNew>nEqOld) ) return 1; + if( nEqNew==nEqOld ){ + if( pNew->iColiCol ) return 1; + return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); + } + return 0; +} + +/* +** Copy the contents of sample *pNew into the p->a[] array. If necessary, +** remove the least desirable sample from p->a[] to make room. +*/ +static void sampleInsert(StatAccum *p, StatSample *pNew, int nEqZero){ + StatSample *pSample = 0; + int i; + + assert( IsStat4 || nEqZero==0 ); + + /* StatAccum.nMaxEqZero is set to the maximum number of leading 0 + ** values in the anEq[] array of any sample in StatAccum.a[]. In + ** other words, if nMaxEqZero is n, then it is guaranteed that there + ** are no samples with StatSample.anEq[m]==0 for (m>=n). */ + if( nEqZero>p->nMaxEqZero ){ + p->nMaxEqZero = nEqZero; + } + if( pNew->isPSample==0 ){ + StatSample *pUpgrade = 0; + assert( pNew->anEq[pNew->iCol]>0 ); + + /* This sample is being added because the prefix that ends in column + ** iCol occurs many times in the table. However, if we have already + ** added a sample that shares this prefix, there is no need to add + ** this one. Instead, upgrade the priority of the highest priority + ** existing sample that shares this prefix. */ + for(i=p->nSample-1; i>=0; i--){ + StatSample *pOld = &p->a[i]; + if( pOld->anEq[pNew->iCol]==0 ){ + if( pOld->isPSample ) return; + assert( pOld->iCol>pNew->iCol ); + assert( sampleIsBetter(p, pNew, pOld) ); + if( pUpgrade==0 || sampleIsBetter(p, pOld, pUpgrade) ){ + pUpgrade = pOld; + } + } + } + if( pUpgrade ){ + pUpgrade->iCol = pNew->iCol; + pUpgrade->anEq[pUpgrade->iCol] = pNew->anEq[pUpgrade->iCol]; + goto find_new_min; + } + } + + /* If necessary, remove sample iMin to make room for the new sample. */ + if( p->nSample>=p->mxSample ){ + StatSample *pMin = &p->a[p->iMin]; + tRowcnt *anEq = pMin->anEq; + tRowcnt *anLt = pMin->anLt; + tRowcnt *anDLt = pMin->anDLt; + sampleClear(p->db, pMin); + memmove(pMin, &pMin[1], sizeof(p->a[0])*(p->nSample-p->iMin-1)); + pSample = &p->a[p->nSample-1]; + pSample->nRowid = 0; + pSample->anEq = anEq; + pSample->anDLt = anDLt; + pSample->anLt = anLt; + p->nSample = p->mxSample-1; + } + + /* The "rows less-than" for the rowid column must be greater than that + ** for the last sample in the p->a[] array. Otherwise, the samples would + ** be out of order. */ + assert( p->nSample==0 + || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); + + /* Insert the new sample */ + pSample = &p->a[p->nSample]; + sampleCopy(p, pSample, pNew); + p->nSample++; + + /* Zero the first nEqZero entries in the anEq[] array. */ + memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); + +find_new_min: + if( p->nSample>=p->mxSample ){ + int iMin = -1; + for(i=0; imxSample; i++){ + if( p->a[i].isPSample ) continue; + if( iMin<0 || sampleIsBetter(p, &p->a[iMin], &p->a[i]) ){ + iMin = i; + } + } + assert( iMin>=0 ); + p->iMin = iMin; + } +} +#endif /* SQLITE_ENABLE_STAT4 */ + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Field iChng of the index being scanned has changed. So at this point +** p->current contains a sample that reflects the previous row of the +** index. The value of anEq[iChng] and subsequent anEq[] elements are +** correct at this point. +*/ +static void samplePushPrevious(StatAccum *p, int iChng){ + int i; + + /* Check if any samples from the aBest[] array should be pushed + ** into IndexSample.a[] at this point. */ + for(i=(p->nCol-2); i>=iChng; i--){ + StatSample *pBest = &p->aBest[i]; + pBest->anEq[i] = p->current.anEq[i]; + if( p->nSamplemxSample || sampleIsBetter(p, pBest, &p->a[p->iMin]) ){ + sampleInsert(p, pBest, i); + } + } + + /* Check that no sample contains an anEq[] entry with an index of + ** p->nMaxEqZero or greater set to zero. */ + for(i=p->nSample-1; i>=0; i--){ + int j; + for(j=p->nMaxEqZero; jnCol; j++) assert( p->a[i].anEq[j]>0 ); + } + + /* Update the anEq[] fields of any samples already collected. */ + if( iChngnMaxEqZero ){ + for(i=p->nSample-1; i>=0; i--){ + int j; + for(j=iChng; jnCol; j++){ + if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; + } + } + p->nMaxEqZero = iChng; + } +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** Implementation of the stat_push SQL function: stat_push(P,C,R) +** Arguments: +** +** P Pointer to the StatAccum object created by stat_init() +** C Index of left-most column to differ from previous row +** R Rowid for the current row. Might be a key record for +** WITHOUT ROWID tables. +** +** The purpose of this routine is to collect statistical data and/or +** samples from the index being analyzed into the StatAccum object. +** The stat_get() SQL function will be used afterwards to +** retrieve the information gathered. +** +** This SQL function usually returns NULL, but might return an integer +** if it wants the byte-code to do special processing. +** +** The R parameter is only used for STAT4 +*/ +static void statPush( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + + /* The three function arguments */ + StatAccum *p = (StatAccum*)sqlite3_value_blob(argv[0]); + int iChng = sqlite3_value_int(argv[1]); + + UNUSED_PARAMETER( argc ); + UNUSED_PARAMETER( context ); + assert( p->nCol>0 ); + assert( iChngnCol ); + + if( p->nRow==0 ){ + /* This is the first call to this function. Do initialization. */ + for(i=0; inCol; i++) p->current.anEq[i] = 1; + }else{ + /* Second and subsequent calls get processed here */ +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ) samplePushPrevious(p, iChng); +#endif + + /* Update anDLt[], anLt[] and anEq[] to reflect the values that apply + ** to the current row of the index. */ + for(i=0; icurrent.anEq[i]++; + } + for(i=iChng; inCol; i++){ + p->current.anDLt[i]++; +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ) p->current.anLt[i] += p->current.anEq[i]; +#endif + p->current.anEq[i] = 1; + } + } + + p->nRow++; +#ifdef SQLITE_ENABLE_STAT4 + if( p->mxSample ){ + tRowcnt nLt; + if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ + sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); + }else{ + sampleSetRowid(p->db, &p->current, sqlite3_value_bytes(argv[2]), + sqlite3_value_blob(argv[2])); + } + p->current.iHash = p->iPrn = p->iPrn*1103515245 + 12345; + + nLt = p->current.anLt[p->nCol-1]; + /* Check if this is to be a periodic sample. If so, add it. */ + if( (nLt/p->nPSample)!=(nLt+1)/p->nPSample ){ + p->current.isPSample = 1; + p->current.iCol = 0; + sampleInsert(p, &p->current, p->nCol-1); + p->current.isPSample = 0; + } + + /* Update the aBest[] array. */ + for(i=0; i<(p->nCol-1); i++){ + p->current.iCol = i; + if( i>=iChng || sampleIsBetterPost(p, &p->current, &p->aBest[i]) ){ + sampleCopy(p, &p->aBest[i], &p->current); + } + } + }else +#endif + if( p->nLimit && p->nRow>(tRowcnt)p->nLimit*(p->nSkipAhead+1) ){ + p->nSkipAhead++; + sqlite3_result_int(context, p->current.anDLt[0]>0); + } +} + +static const FuncDef statPushFuncdef = { + 2+IsStat4, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statPush, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "stat_push", /* zName */ + {0} +}; + +#define STAT_GET_STAT1 0 /* "stat" column of stat1 table */ +#define STAT_GET_ROWID 1 /* "rowid" column of stat[34] entry */ +#define STAT_GET_NEQ 2 /* "neq" column of stat[34] entry */ +#define STAT_GET_NLT 3 /* "nlt" column of stat[34] entry */ +#define STAT_GET_NDLT 4 /* "ndlt" column of stat[34] entry */ + +/* +** Implementation of the stat_get(P,J) SQL function. This routine is +** used to query statistical information that has been gathered into +** the StatAccum object by prior calls to stat_push(). The P parameter +** has type BLOB but it is really just a pointer to the StatAccum object. +** The content to returned is determined by the parameter J +** which is one of the STAT_GET_xxxx values defined above. +** +** The stat_get(P,J) function is not available to generic SQL. It is +** inserted as part of a manually constructed bytecode program. (See +** the callStatGet() routine below.) It is guaranteed that the P +** parameter will always be a pointer to a StatAccum object, never a +** NULL. +** +** If STAT4 is not enabled, then J is always +** STAT_GET_STAT1 and is hence omitted and this routine becomes +** a one-parameter function, stat_get(P), that always returns the +** stat1 table entry information. +*/ +static void statGet( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + StatAccum *p = (StatAccum*)sqlite3_value_blob(argv[0]); +#ifdef SQLITE_ENABLE_STAT4 + /* STAT4 has a parameter on this routine. */ + int eCall = sqlite3_value_int(argv[1]); + assert( argc==2 ); + assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ + || eCall==STAT_GET_ROWID || eCall==STAT_GET_NLT + || eCall==STAT_GET_NDLT + ); + assert( eCall==STAT_GET_STAT1 || p->mxSample ); + if( eCall==STAT_GET_STAT1 ) +#else + assert( argc==1 ); +#endif + { + /* Return the value to store in the "stat" column of the sqlite_stat1 + ** table for this index. + ** + ** The value is a string composed of a list of integers describing + ** the index. The first integer in the list is the total number of + ** entries in the index. There is one additional integer in the list + ** for each indexed column. This additional integer is an estimate of + ** the number of rows matched by a equality query on the index using + ** a key with the corresponding number of fields. In other words, + ** if the index is on columns (a,b) and the sqlite_stat1 value is + ** "100 10 2", then SQLite estimates that: + ** + ** * the index contains 100 rows, + ** * "WHERE a=?" matches 10 rows, and + ** * "WHERE a=? AND b=?" matches 2 rows. + ** + ** If D is the count of distinct values and K is the total number of + ** rows, then each estimate is usually computed as: + ** + ** I = (K+D-1)/D + ** + ** In other words, I is K/D rounded up to the next whole integer. + ** However, if I is between 1.0 and 1.1 (in other words if I is + ** close to 1.0 but just a little larger) then do not round up but + ** instead keep the I value at 1.0. + */ + sqlite3_str sStat; /* Text of the constructed "stat" line */ + int i; /* Loop counter */ + + sqlite3StrAccumInit(&sStat, 0, 0, 0, (p->nKeyCol+1)*100); + sqlite3_str_appendf(&sStat, "%llu", + p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); + for(i=0; inKeyCol; i++){ + u64 nDistinct = p->current.anDLt[i] + 1; + u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; + if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1; + sqlite3_str_appendf(&sStat, " %llu", iVal); + assert( p->current.anEq[i] ); + } + sqlite3ResultStrAccum(context, &sStat); + } +#ifdef SQLITE_ENABLE_STAT4 + else if( eCall==STAT_GET_ROWID ){ + if( p->iGet<0 ){ + samplePushPrevious(p, 0); + p->iGet = 0; + } + if( p->iGetnSample ){ + StatSample *pS = p->a + p->iGet; + if( pS->nRowid==0 ){ + sqlite3_result_int64(context, pS->u.iRowid); + }else{ + sqlite3_result_blob(context, pS->u.aRowid, pS->nRowid, + SQLITE_TRANSIENT); + } + } + }else{ + tRowcnt *aCnt = 0; + sqlite3_str sStat; + int i; + + assert( p->iGetnSample ); + switch( eCall ){ + case STAT_GET_NEQ: aCnt = p->a[p->iGet].anEq; break; + case STAT_GET_NLT: aCnt = p->a[p->iGet].anLt; break; + default: { + aCnt = p->a[p->iGet].anDLt; + p->iGet++; + break; + } + } + sqlite3StrAccumInit(&sStat, 0, 0, 0, p->nCol*100); + for(i=0; inCol; i++){ + sqlite3_str_appendf(&sStat, "%llu ", (u64)aCnt[i]); + } + if( sStat.nChar ) sStat.nChar--; + sqlite3ResultStrAccum(context, &sStat); + } +#endif /* SQLITE_ENABLE_STAT4 */ +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER( argc ); +#endif +} +static const FuncDef statGetFuncdef = { + 1+IsStat4, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + statGet, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "stat_get", /* zName */ + {0} +}; + +static void callStatGet(Parse *pParse, int regStat, int iParam, int regOut){ +#ifdef SQLITE_ENABLE_STAT4 + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat+1); +#elif SQLITE_DEBUG + assert( iParam==STAT_GET_STAT1 ); +#else + UNUSED_PARAMETER( iParam ); +#endif + assert( regOut!=regStat && regOut!=regStat+1 ); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat, regOut, 1+IsStat4, + &statGetFuncdef, 0); +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* Add a comment to the most recent VDBE opcode that is the name +** of the k-th column of the pIdx index. +*/ +static void analyzeVdbeCommentIndexWithColumnName( + Vdbe *v, /* Prepared statement under construction */ + Index *pIdx, /* Index whose column is being loaded */ + int k /* Which column index */ +){ + int i; /* Index of column in the table */ + assert( k>=0 && knColumn ); + i = pIdx->aiColumn[k]; + if( NEVER(i==XN_ROWID) ){ + VdbeComment((v,"%s.rowid",pIdx->zName)); + }else if( i==XN_EXPR ){ + VdbeComment((v,"%s.expr(%d)",pIdx->zName, k)); + }else{ + VdbeComment((v,"%s.%s", pIdx->zName, pIdx->pTable->aCol[i].zCnName)); + } +} +#else +# define analyzeVdbeCommentIndexWithColumnName(a,b,c) +#endif /* SQLITE_DEBUG */ + +/* +** Generate code to do an analysis of all indices associated with +** a single table. +*/ +static void analyzeOneTable( + Parse *pParse, /* Parser context */ + Table *pTab, /* Table whose indices are to be analyzed */ + Index *pOnlyIdx, /* If not NULL, only analyze this one index */ + int iStatCur, /* Index of VdbeCursor that writes the sqlite_stat1 table */ + int iMem, /* Available memory locations begin here */ + int iTab /* Next available cursor */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + Index *pIdx; /* An index to being analyzed */ + int iIdxCur; /* Cursor open on index being analyzed */ + int iTabCur; /* Table cursor */ + Vdbe *v; /* The virtual machine being built up */ + int i; /* Loop counter */ + int jZeroRows = -1; /* Jump from here if number of rows is zero */ + int iDb; /* Index of database containing pTab */ + u8 needTableCnt = 1; /* True to count the table */ + int regNewRowid = iMem++; /* Rowid for the inserted record */ + int regStat = iMem++; /* Register to hold StatAccum object */ + int regChng = iMem++; /* Index of changed index field */ + int regRowid = iMem++; /* Rowid argument passed to stat_push() */ + int regTemp = iMem++; /* Temporary use register */ + int regTemp2 = iMem++; /* Second temporary use register */ + int regTabname = iMem++; /* Register containing table name */ + int regIdxname = iMem++; /* Register containing index name */ + int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ + int regPrev = iMem; /* MUST BE LAST (see below) */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + Table *pStat1 = 0; +#endif + + pParse->nMem = MAX(pParse->nMem, iMem); + v = sqlite3GetVdbe(pParse); + if( v==0 || NEVER(pTab==0) ){ + return; + } + if( !IsOrdinaryTable(pTab) ){ + /* Do not gather statistics on views or virtual tables */ + return; + } + if( sqlite3_strlike("sqlite\\_%", pTab->zName, '\\')==0 ){ + /* Do not gather statistics on system tables */ + return; + } + assert( sqlite3BtreeHoldsAllMutexes(db) ); + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, + db->aDb[iDb].zDbSName ) ){ + return; + } +#endif + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( db->xPreUpdateCallback ){ + pStat1 = (Table*)sqlite3DbMallocZero(db, sizeof(Table) + 13); + if( pStat1==0 ) return; + pStat1->zName = (char*)&pStat1[1]; + memcpy(pStat1->zName, "sqlite_stat1", 13); + pStat1->nCol = 3; + pStat1->iPKey = -1; + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNAMIC); + } +#endif + + /* Establish a read-lock on the table at the shared-cache level. + ** Open a read-only cursor on the table. Also allocate a cursor number + ** to use for scanning indexes (iIdxCur). No index cursor is opened at + ** this time though. */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + iTabCur = iTab++; + iIdxCur = iTab++; + pParse->nTab = MAX(pParse->nTab, iTab); + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeLoadString(v, regTabname, pTab->zName); + + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int nCol; /* Number of columns in pIdx. "N" */ + int addrRewind; /* Address of "OP_Rewind iIdxCur" */ + int addrNextRow; /* Address of "next_row:" */ + const char *zIdxName; /* Name of the index */ + int nColTest; /* Number of columns to test for changes */ + + if( pOnlyIdx && pOnlyIdx!=pIdx ) continue; + if( pIdx->pPartIdxWhere==0 ) needTableCnt = 0; + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIdx) ){ + nCol = pIdx->nKeyCol; + zIdxName = pTab->zName; + nColTest = nCol - 1; + }else{ + nCol = pIdx->nColumn; + zIdxName = pIdx->zName; + nColTest = pIdx->uniqNotNull ? pIdx->nKeyCol-1 : nCol-1; + } + + /* Populate the register containing the index name. */ + sqlite3VdbeLoadString(v, regIdxname, zIdxName); + VdbeComment((v, "Analysis for %s.%s", pTab->zName, zIdxName)); + + /* + ** Pseudo-code for loop that calls stat_push(): + ** + ** Rewind csr + ** if eof(csr) goto end_of_scan; + ** regChng = 0 + ** goto chng_addr_0; + ** + ** next_row: + ** regChng = 0 + ** if( idx(0) != regPrev(0) ) goto chng_addr_0 + ** regChng = 1 + ** if( idx(1) != regPrev(1) ) goto chng_addr_1 + ** ... + ** regChng = N + ** goto chng_addr_N + ** + ** chng_addr_0: + ** regPrev(0) = idx(0) + ** chng_addr_1: + ** regPrev(1) = idx(1) + ** ... + ** + ** endDistinctTest: + ** regRowid = idx(rowid) + ** stat_push(P, regChng, regRowid) + ** Next csr + ** if !eof(csr) goto next_row; + ** + ** end_of_scan: + */ + + /* Make sure there are enough memory cells allocated to accommodate + ** the regPrev array and a trailing rowid (the rowid slot is required + ** when building a record to insert into the sample column of + ** the sqlite_stat4 table. */ + pParse->nMem = MAX(pParse->nMem, regPrev+nColTest); + + /* Open a read-only cursor on the index being analyzed. */ + assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) ); + sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + + /* Invoke the stat_init() function. The arguments are: + ** + ** (1) the number of columns in the index including the rowid + ** (or for a WITHOUT ROWID table, the number of PK columns), + ** (2) the number of columns in the key without the rowid/pk + ** (3) estimated number of rows in the index, + */ + sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat+1); + assert( regRowid==regStat+2 ); + sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regRowid); +#ifdef SQLITE_ENABLE_STAT4 + if( OptimizationEnabled(db, SQLITE_Stat4) ){ + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regTemp); + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + }else +#endif + { + addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); + } + assert( regTemp2==regStat+4 ); + sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 4, + &statInitFuncdef, 0); + + /* Implementation of the following: + ** + ** Rewind csr + ** if eof(csr) goto end_of_scan; + ** regChng = 0 + ** goto next_push_0; + ** + */ + sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); + addrNextRow = sqlite3VdbeCurrentAddr(v); + + if( nColTest>0 ){ + int endDistinctTest = sqlite3VdbeMakeLabel(pParse); + int *aGotoChng; /* Array of jump instruction addresses */ + aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); + if( aGotoChng==0 ) continue; + + /* + ** next_row: + ** regChng = 0 + ** if( idx(0) != regPrev(0) ) goto chng_addr_0 + ** regChng = 1 + ** if( idx(1) != regPrev(1) ) goto chng_addr_1 + ** ... + ** regChng = N + ** goto endDistinctTest + */ + sqlite3VdbeAddOp0(v, OP_Goto); + addrNextRow = sqlite3VdbeCurrentAddr(v); + if( nColTest==1 && pIdx->nKeyCol==1 && IsUniqueIndex(pIdx) ){ + /* For a single-column UNIQUE index, once we have found a non-NULL + ** row, we know that all the rest will be distinct, so skip + ** subsequent distinctness tests. */ + sqlite3VdbeAddOp2(v, OP_NotNull, regPrev, endDistinctTest); + VdbeCoverage(v); + } + for(i=0; iazColl[i]); + sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,i); + aGotoChng[i] = + sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); + sqlite3VdbeGoto(v, endDistinctTest); + + + /* + ** chng_addr_0: + ** regPrev(0) = idx(0) + ** chng_addr_1: + ** regPrev(1) = idx(1) + ** ... + */ + sqlite3VdbeJumpHere(v, addrNextRow-1); + for(i=0; ipTable); + int j, k, regKey; + regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); + assert( k>=0 && knColumn ); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,k); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); + sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); + } + } +#endif + assert( regChng==(regStat+1) ); + { + sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, + &statPushFuncdef, 0); + if( db->nAnalysisLimit ){ + int j1, j2, j3; + j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regTemp); VdbeCoverage(v); + j2 = sqlite3VdbeAddOp1(v, OP_If, regTemp); VdbeCoverage(v); + j3 = sqlite3VdbeAddOp4Int(v, OP_SeekGT, iIdxCur, 0, regPrev, 1); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, j2); + sqlite3VdbeJumpHere(v, j3); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + } + } + + /* Add the entry to the stat1 table. */ + callStatGet(pParse, regStat, STAT_GET_STAT1, regStat1); + assert( "BBB"[0]==SQLITE_AFF_TEXT ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); +#endif + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + + /* Add the entries to the stat4 table. */ +#ifdef SQLITE_ENABLE_STAT4 + if( OptimizationEnabled(db, SQLITE_Stat4) && db->nAnalysisLimit==0 ){ + int regEq = regStat1; + int regLt = regStat1+1; + int regDLt = regStat1+2; + int regSample = regStat1+3; + int regCol = regStat1+4; + int regSampleRowid = regCol + nCol; + int addrNext; + int addrIsNull; + u8 seekOp = HasRowid(pTab) ? OP_NotExists : OP_NotFound; + + pParse->nMem = MAX(pParse->nMem, regCol+nCol); + + addrNext = sqlite3VdbeCurrentAddr(v); + callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid); + addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); + VdbeCoverage(v); + callStatGet(pParse, regStat, STAT_GET_NEQ, regEq); + callStatGet(pParse, regStat, STAT_GET_NLT, regLt); + callStatGet(pParse, regStat, STAT_GET_NDLT, regDLt); + sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); + VdbeCoverage(v); + for(i=0; izName)); + sqlite3VdbeAddOp2(v, OP_Count, iTabCur, regStat1); + jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname); + assert( "BBB"[0]==SQLITE_AFF_TEXT ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); +#endif + sqlite3VdbeJumpHere(v, jZeroRows); + } +} + + +/* +** Generate code that will cause the most recent index analysis to +** be loaded into internal hash tables where is can be used. +*/ +static void loadAnalysis(Parse *pParse, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp1(v, OP_LoadAnalysis, iDb); + } +} + +/* +** Generate code that will do an analysis of an entire database +*/ +static void analyzeDatabase(Parse *pParse, int iDb){ + sqlite3 *db = pParse->db; + Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */ + HashElem *k; + int iStatCur; + int iMem; + int iTab; + + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab; + pParse->nTab += 3; + openStatTable(pParse, iDb, iStatCur, 0, 0); + iMem = pParse->nMem+1; + iTab = pParse->nTab; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pTab = (Table*)sqliteHashData(k); + analyzeOneTable(pParse, pTab, 0, iStatCur, iMem, iTab); + } + loadAnalysis(pParse, iDb); +} + +/* +** Generate code that will do an analysis of a single table in +** a database. If pOnlyIdx is not NULL then it is a single index +** in pTab that should be analyzed. +*/ +static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){ + int iDb; + int iStatCur; + + assert( pTab!=0 ); + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + iStatCur = pParse->nTab; + pParse->nTab += 3; + if( pOnlyIdx ){ + openStatTable(pParse, iDb, iStatCur, pOnlyIdx->zName, "idx"); + }else{ + openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl"); + } + analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur,pParse->nMem+1,pParse->nTab); + loadAnalysis(pParse, iDb); +} + +/* +** Generate code for the ANALYZE command. The parser calls this routine +** when it recognizes an ANALYZE command. +** +** ANALYZE -- 1 +** ANALYZE -- 2 +** ANALYZE ?.? -- 3 +** +** Form 1 causes all indices in all attached databases to be analyzed. +** Form 2 analyzes all indices the single database named. +** Form 3 analyzes all indices associated with the named table. +*/ +SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ + sqlite3 *db = pParse->db; + int iDb; + int i; + char *z, *zDb; + Table *pTab; + Index *pIdx; + Token *pTableName; + Vdbe *v; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + assert( pName2!=0 || pName1==0 ); + if( pName1==0 ){ + /* Form 1: Analyze everything */ + for(i=0; inDb; i++){ + if( i==1 ) continue; /* Do not analyze the TEMP database */ + analyzeDatabase(pParse, i); + } + }else if( pName2->n==0 && (iDb = sqlite3FindDb(db, pName1))>=0 ){ + /* Analyze the schema named as the argument */ + analyzeDatabase(pParse, iDb); + }else{ + /* Form 3: Analyze the table or index named as an argument */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); + if( iDb>=0 ){ + zDb = pName2->n ? db->aDb[iDb].zDbSName : 0; + z = sqlite3NameFromToken(db, pTableName); + if( z ){ + if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ + analyzeTable(pParse, pIdx->pTable, pIdx); + }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){ + analyzeTable(pParse, pTab, 0); + } + sqlite3DbFree(db, z); + } + } + } + if( db->nSqlExec==0 && (v = sqlite3GetVdbe(pParse))!=0 ){ + sqlite3VdbeAddOp0(v, OP_Expire); + } +} + +/* +** Used to pass information from the analyzer reader through to the +** callback routine. +*/ +typedef struct analysisInfo analysisInfo; +struct analysisInfo { + sqlite3 *db; + const char *zDatabase; +}; + +/* +** The first argument points to a nul-terminated string containing a +** list of space separated integers. Read the first nOut of these into +** the array aOut[]. +*/ +static void decodeIntArray( + char *zIntArray, /* String containing int array to decode */ + int nOut, /* Number of slots in aOut[] */ + tRowcnt *aOut, /* Store integers here */ + LogEst *aLog, /* Or, if aOut==0, here */ + Index *pIndex /* Handle extra flags for this index, if not NULL */ +){ + char *z = zIntArray; + int c; + int i; + tRowcnt v; + +#ifdef SQLITE_ENABLE_STAT4 + if( z==0 ) z = ""; +#else + assert( z!=0 ); +#endif + for(i=0; *z && i='0' && c<='9' ){ + v = v*10 + c - '0'; + z++; + } +#ifdef SQLITE_ENABLE_STAT4 + if( aOut ) aOut[i] = v; + if( aLog ) aLog[i] = sqlite3LogEst(v); +#else + assert( aOut==0 ); + UNUSED_PARAMETER(aOut); + assert( aLog!=0 ); + aLog[i] = sqlite3LogEst(v); +#endif + if( *z==' ' ) z++; + } +#ifndef SQLITE_ENABLE_STAT4 + assert( pIndex!=0 ); { +#else + if( pIndex ){ +#endif + pIndex->bUnordered = 0; + pIndex->noSkipScan = 0; + while( z[0] ){ + if( sqlite3_strglob("unordered*", z)==0 ){ + pIndex->bUnordered = 1; + }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ + int sz = sqlite3Atoi(z+3); + if( sz<2 ) sz = 2; + pIndex->szIdxRow = sqlite3LogEst(sz); + }else if( sqlite3_strglob("noskipscan*", z)==0 ){ + pIndex->noSkipScan = 1; + } +#ifdef SQLITE_ENABLE_COSTMULT + else if( sqlite3_strglob("costmult=[0-9]*",z)==0 ){ + pIndex->pTable->costMult = sqlite3LogEst(sqlite3Atoi(z+9)); + } +#endif + while( z[0]!=0 && z[0]!=' ' ) z++; + while( z[0]==' ' ) z++; + } + } +} + +/* +** This callback is invoked once for each index when reading the +** sqlite_stat1 table. +** +** argv[0] = name of the table +** argv[1] = name of the index (might be NULL) +** argv[2] = results of analysis - on integer for each column +** +** Entries for which argv[1]==NULL simply record the number of rows in +** the table. +*/ +static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ + analysisInfo *pInfo = (analysisInfo*)pData; + Index *pIndex; + Table *pTable; + const char *z; + + assert( argc==3 ); + UNUSED_PARAMETER2(NotUsed, argc); + + if( argv==0 || argv[0]==0 || argv[2]==0 ){ + return 0; + } + pTable = sqlite3FindTable(pInfo->db, argv[0], pInfo->zDatabase); + if( pTable==0 ){ + return 0; + } + if( argv[1]==0 ){ + pIndex = 0; + }else if( sqlite3_stricmp(argv[0],argv[1])==0 ){ + pIndex = sqlite3PrimaryKeyIndex(pTable); + }else{ + pIndex = sqlite3FindIndex(pInfo->db, argv[1], pInfo->zDatabase); + } + z = argv[2]; + + if( pIndex ){ + tRowcnt *aiRowEst = 0; + int nCol = pIndex->nKeyCol+1; +#ifdef SQLITE_ENABLE_STAT4 + /* Index.aiRowEst may already be set here if there are duplicate + ** sqlite_stat1 entries for this index. In that case just clobber + ** the old data with the new instead of allocating a new array. */ + if( pIndex->aiRowEst==0 ){ + pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero(sizeof(tRowcnt) * nCol); + if( pIndex->aiRowEst==0 ) sqlite3OomFault(pInfo->db); + } + aiRowEst = pIndex->aiRowEst; +#endif + pIndex->bUnordered = 0; + decodeIntArray((char*)z, nCol, aiRowEst, pIndex->aiRowLogEst, pIndex); + pIndex->hasStat1 = 1; + if( pIndex->pPartIdxWhere==0 ){ + pTable->nRowLogEst = pIndex->aiRowLogEst[0]; + pTable->tabFlags |= TF_HasStat1; + } + }else{ + Index fakeIdx; + fakeIdx.szIdxRow = pTable->szTabRow; +#ifdef SQLITE_ENABLE_COSTMULT + fakeIdx.pTable = pTable; +#endif + decodeIntArray((char*)z, 1, 0, &pTable->nRowLogEst, &fakeIdx); + pTable->szTabRow = fakeIdx.szIdxRow; + pTable->tabFlags |= TF_HasStat1; + } + + return 0; +} + +/* +** If the Index.aSample variable is not NULL, delete the aSample[] array +** and its contents. +*/ +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ +#ifdef SQLITE_ENABLE_STAT4 + if( pIdx->aSample ){ + int j; + for(j=0; jnSample; j++){ + IndexSample *p = &pIdx->aSample[j]; + sqlite3DbFree(db, p->p); + } + sqlite3DbFree(db, pIdx->aSample); + } + if( db && db->pnBytesFreed==0 ){ + pIdx->nSample = 0; + pIdx->aSample = 0; + } +#else + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(pIdx); +#endif /* SQLITE_ENABLE_STAT4 */ +} + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Populate the pIdx->aAvgEq[] array based on the samples currently +** stored in pIdx->aSample[]. +*/ +static void initAvgEq(Index *pIdx){ + if( pIdx ){ + IndexSample *aSample = pIdx->aSample; + IndexSample *pFinal = &aSample[pIdx->nSample-1]; + int iCol; + int nCol = 1; + if( pIdx->nSampleCol>1 ){ + /* If this is stat4 data, then calculate aAvgEq[] values for all + ** sample columns except the last. The last is always set to 1, as + ** once the trailing PK fields are considered all index keys are + ** unique. */ + nCol = pIdx->nSampleCol-1; + pIdx->aAvgEq[nCol] = 1; + } + for(iCol=0; iColnSample; + int i; /* Used to iterate through samples */ + tRowcnt sumEq = 0; /* Sum of the nEq values */ + tRowcnt avgEq = 0; + tRowcnt nRow; /* Number of rows in index */ + i64 nSum100 = 0; /* Number of terms contributing to sumEq */ + i64 nDist100; /* Number of distinct values in index */ + + if( !pIdx->aiRowEst || iCol>=pIdx->nKeyCol || pIdx->aiRowEst[iCol+1]==0 ){ + nRow = pFinal->anLt[iCol]; + nDist100 = (i64)100 * pFinal->anDLt[iCol]; + nSample--; + }else{ + nRow = pIdx->aiRowEst[0]; + nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol+1]; + } + pIdx->nRowEst0 = nRow; + + /* Set nSum to the number of distinct (iCol+1) field prefixes that + ** occur in the stat4 table for this index. Set sumEq to the sum of + ** the nEq values for column iCol for the same set (adding the value + ** only once where there exist duplicate prefixes). */ + for(i=0; inSample-1) + || aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol] + ){ + sumEq += aSample[i].anEq[iCol]; + nSum100 += 100; + } + } + + if( nDist100>nSum100 && sumEqaAvgEq[iCol] = avgEq; + } + } +} + +/* +** Look up an index by name. Or, if the name of a WITHOUT ROWID table +** is supplied instead, find the PRIMARY KEY index for that table. +*/ +static Index *findIndexOrPrimaryKey( + sqlite3 *db, + const char *zName, + const char *zDb +){ + Index *pIdx = sqlite3FindIndex(db, zName, zDb); + if( pIdx==0 ){ + Table *pTab = sqlite3FindTable(db, zName, zDb); + if( pTab && !HasRowid(pTab) ) pIdx = sqlite3PrimaryKeyIndex(pTab); + } + return pIdx; +} + +/* +** Load the content from either the sqlite_stat4 +** into the relevant Index.aSample[] arrays. +** +** Arguments zSql1 and zSql2 must point to SQL statements that return +** data equivalent to the following: +** +** zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx +** zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4 +** +** where %Q is replaced with the database name before the SQL is executed. +*/ +static int loadStatTbl( + sqlite3 *db, /* Database handle */ + const char *zSql1, /* SQL statement 1 (see above) */ + const char *zSql2, /* SQL statement 2 (see above) */ + const char *zDb /* Database name (e.g. "main") */ +){ + int rc; /* Result codes from subroutines */ + sqlite3_stmt *pStmt = 0; /* An SQL statement being run */ + char *zSql; /* Text of the SQL statement */ + Index *pPrevIdx = 0; /* Previous index in the loop */ + IndexSample *pSample; /* A slot in pIdx->aSample[] */ + + assert( db->lookaside.bDisable ); + zSql = sqlite3MPrintf(db, zSql1, zDb); + if( !zSql ){ + return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + sqlite3DbFree(db, zSql); + if( rc ) return rc; + + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + int nIdxCol = 1; /* Number of columns in stat4 records */ + + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nSample; /* Number of samples */ + int nByte; /* Bytes of space required */ + int i; /* Bytes of space required */ + tRowcnt *pSpace; + + zIndex = (char *)sqlite3_column_text(pStmt, 0); + if( zIndex==0 ) continue; + nSample = sqlite3_column_int(pStmt, 1); + pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); + assert( pIdx==0 || pIdx->nSample==0 ); + if( pIdx==0 ) continue; + assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); + if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ + nIdxCol = pIdx->nKeyCol; + }else{ + nIdxCol = pIdx->nColumn; + } + pIdx->nSampleCol = nIdxCol; + nByte = sizeof(IndexSample) * nSample; + nByte += sizeof(tRowcnt) * nIdxCol * 3 * nSample; + nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */ + + pIdx->aSample = sqlite3DbMallocZero(db, nByte); + if( pIdx->aSample==0 ){ + sqlite3_finalize(pStmt); + return SQLITE_NOMEM_BKPT; + } + pSpace = (tRowcnt*)&pIdx->aSample[nSample]; + pIdx->aAvgEq = pSpace; pSpace += nIdxCol; + pIdx->pTable->tabFlags |= TF_HasStat4; + for(i=0; iaSample[i].anEq = pSpace; pSpace += nIdxCol; + pIdx->aSample[i].anLt = pSpace; pSpace += nIdxCol; + pIdx->aSample[i].anDLt = pSpace; pSpace += nIdxCol; + } + assert( ((u8*)pSpace)-nByte==(u8*)(pIdx->aSample) ); + } + rc = sqlite3_finalize(pStmt); + if( rc ) return rc; + + zSql = sqlite3MPrintf(db, zSql2, zDb); + if( !zSql ){ + return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + sqlite3DbFree(db, zSql); + if( rc ) return rc; + + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nCol = 1; /* Number of columns in index */ + + zIndex = (char *)sqlite3_column_text(pStmt, 0); + if( zIndex==0 ) continue; + pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); + if( pIdx==0 ) continue; + /* This next condition is true if data has already been loaded from + ** the sqlite_stat4 table. */ + nCol = pIdx->nSampleCol; + if( pIdx!=pPrevIdx ){ + initAvgEq(pPrevIdx); + pPrevIdx = pIdx; + } + pSample = &pIdx->aSample[pIdx->nSample]; + decodeIntArray((char*)sqlite3_column_text(pStmt,1),nCol,pSample->anEq,0,0); + decodeIntArray((char*)sqlite3_column_text(pStmt,2),nCol,pSample->anLt,0,0); + decodeIntArray((char*)sqlite3_column_text(pStmt,3),nCol,pSample->anDLt,0,0); + + /* Take a copy of the sample. Add two 0x00 bytes the end of the buffer. + ** This is in case the sample record is corrupted. In that case, the + ** sqlite3VdbeRecordCompare() may read up to two varints past the + ** end of the allocated buffer before it realizes it is dealing with + ** a corrupt record. Adding the two 0x00 bytes prevents this from causing + ** a buffer overread. */ + pSample->n = sqlite3_column_bytes(pStmt, 4); + pSample->p = sqlite3DbMallocZero(db, pSample->n + 2); + if( pSample->p==0 ){ + sqlite3_finalize(pStmt); + return SQLITE_NOMEM_BKPT; + } + if( pSample->n ){ + memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); + } + pIdx->nSample++; + } + rc = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) initAvgEq(pPrevIdx); + return rc; +} + +/* +** Load content from the sqlite_stat4 table into +** the Index.aSample[] arrays of all indices. +*/ +static int loadStat4(sqlite3 *db, const char *zDb){ + int rc = SQLITE_OK; /* Result codes from subroutines */ + const Table *pStat4; + + assert( db->lookaside.bDisable ); + if( (pStat4 = sqlite3FindTable(db, "sqlite_stat4", zDb))!=0 + && IsOrdinaryTable(pStat4) + ){ + rc = loadStatTbl(db, + "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", + "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", + zDb + ); + } + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** Load the content of the sqlite_stat1 and sqlite_stat4 tables. The +** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] +** arrays. The contents of sqlite_stat4 are used to populate the +** Index.aSample[] arrays. +** +** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR +** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined +** during compilation and the sqlite_stat4 table is present, no data is +** read from it. +** +** If SQLITE_ENABLE_STAT4 was defined during compilation and the +** sqlite_stat4 table is not present in the database, SQLITE_ERROR is +** returned. However, in this case, data is read from the sqlite_stat1 +** table (if it is present) before returning. +** +** If an OOM error occurs, this function always sets db->mallocFailed. +** This means if the caller does not care about other errors, the return +** code may be ignored. +*/ +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ + analysisInfo sInfo; + HashElem *i; + char *zSql; + int rc = SQLITE_OK; + Schema *pSchema = db->aDb[iDb].pSchema; + const Table *pStat1; + + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pBt!=0 ); + + /* Clear any prior statistics */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + pTab->tabFlags &= ~TF_HasStat1; + } + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + pIdx->hasStat1 = 0; +#ifdef SQLITE_ENABLE_STAT4 + sqlite3DeleteIndexSamples(db, pIdx); + pIdx->aSample = 0; +#endif + } + + /* Load new statistics out of the sqlite_stat1 table */ + sInfo.db = db; + sInfo.zDatabase = db->aDb[iDb].zDbSName; + if( (pStat1 = sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)) + && IsOrdinaryTable(pStat1) + ){ + zSql = sqlite3MPrintf(db, + "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); + sqlite3DbFree(db, zSql); + } + } + + /* Set appropriate defaults on all indexes not in the sqlite_stat1 table */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + if( !pIdx->hasStat1 ) sqlite3DefaultRowEst(pIdx); + } + + /* Load the statistics from the sqlite_stat4 table. */ +#ifdef SQLITE_ENABLE_STAT4 + if( rc==SQLITE_OK ){ + DisableLookaside; + rc = loadStat4(db, sInfo.zDatabase); + EnableLookaside; + } + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + sqlite3_free(pIdx->aiRowEst); + pIdx->aiRowEst = 0; + } +#endif + + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + return rc; +} + + +#endif /* SQLITE_OMIT_ANALYZE */ + +/************** End of analyze.c *********************************************/ +/************** Begin file attach.c ******************************************/ +/* +** 2003 April 6 +** +** 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 contains code used to implement the ATTACH and DETACH commands. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_ATTACH +/* +** Resolve an expression that was part of an ATTACH or DETACH statement. This +** is slightly different from resolving a normal SQL expression, because simple +** identifiers are treated as strings, not possible column names or aliases. +** +** i.e. if the parser sees: +** +** ATTACH DATABASE abc AS def +** +** it treats the two expressions as literal strings 'abc' and 'def' instead of +** looking for columns of the same name. +** +** This only applies to the root node of pExpr, so the statement: +** +** ATTACH DATABASE abc||def AS 'db2' +** +** will fail because neither abc or def can be resolved. +*/ +static int resolveAttachExpr(NameContext *pName, Expr *pExpr) +{ + int rc = SQLITE_OK; + if( pExpr ){ + if( pExpr->op!=TK_ID ){ + rc = sqlite3ResolveExprNames(pName, pExpr); + }else{ + pExpr->op = TK_STRING; + } + } + return rc; +} + +/* +** Return true if zName points to a name that may be used to refer to +** database iDb attached to handle db. +*/ +SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName){ + return ( + sqlite3StrICmp(db->aDb[iDb].zDbSName, zName)==0 + || (iDb==0 && sqlite3StrICmp("main", zName)==0) + ); +} + +/* +** An SQL user-function registered to do the work of an ATTACH statement. The +** three arguments to the function come directly from an attach statement: +** +** ATTACH DATABASE x AS y KEY z +** +** SELECT sqlite_attach(x, y, z) +** +** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the +** third argument. +** +** If the db->init.reopenMemdb flags is set, then instead of attaching a +** new database, close the database on db->init.iDb and reopen it as an +** empty MemDB. +*/ +static void attachFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + int i; + int rc = 0; + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zName; + const char *zFile; + char *zPath = 0; + char *zErr = 0; + unsigned int flags; + Db *aNew; /* New array of Db pointers */ + Db *pNew; /* Db object for the newly attached database */ + char *zErrDyn = 0; + sqlite3_vfs *pVfs; + + UNUSED_PARAMETER(NotUsed); + zFile = (const char *)sqlite3_value_text(argv[0]); + zName = (const char *)sqlite3_value_text(argv[1]); + if( zFile==0 ) zFile = ""; + if( zName==0 ) zName = ""; + +#ifndef SQLITE_OMIT_DESERIALIZE +# define REOPEN_AS_MEMDB(db) (db->init.reopenMemdb) +#else +# define REOPEN_AS_MEMDB(db) (0) +#endif + + if( REOPEN_AS_MEMDB(db) ){ + /* This is not a real ATTACH. Instead, this routine is being called + ** from sqlite3_deserialize() to close database db->init.iDb and + ** reopen it as a MemDB */ + pVfs = sqlite3_vfs_find("memdb"); + if( pVfs==0 ) return; + pNew = &db->aDb[db->init.iDb]; + if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt); + pNew->pBt = 0; + pNew->pSchema = 0; + rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); + }else{ + /* This is a real ATTACH + ** + ** Check for the following errors: + ** + ** * Too many attached databases, + ** * Transaction currently open + ** * Specified database name already being used. + */ + if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ + zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", + db->aLimit[SQLITE_LIMIT_ATTACHED] + ); + goto attach_error; + } + for(i=0; inDb; i++){ + assert( zName ); + if( sqlite3DbIsNamed(db, i, zName) ){ + zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); + goto attach_error; + } + } + + /* Allocate the new entry in the db->aDb[] array and initialize the schema + ** hash tables. + */ + if( db->aDb==db->aDbStatic ){ + aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 ); + if( aNew==0 ) return; + memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); + }else{ + aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); + if( aNew==0 ) return; + } + db->aDb = aNew; + pNew = &db->aDb[db->nDb]; + memset(pNew, 0, sizeof(*pNew)); + + /* Open the database file. If the btree is successfully opened, use + ** it to obtain the database schema. At this point the schema may + ** or may not be initialized. + */ + flags = db->openFlags; + rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + assert( pVfs ); + flags |= SQLITE_OPEN_MAIN_DB; + rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); + db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); + } + db->noSharedCache = 0; + if( rc==SQLITE_CONSTRAINT ){ + rc = SQLITE_ERROR; + zErrDyn = sqlite3MPrintf(db, "database is already attached"); + }else if( rc==SQLITE_OK ){ + Pager *pPager; + pNew->pSchema = sqlite3SchemaGet(db, pNew->pBt); + if( !pNew->pSchema ){ + rc = SQLITE_NOMEM_BKPT; + }else if( pNew->pSchema->file_format && pNew->pSchema->enc!=ENC(db) ){ + zErrDyn = sqlite3MPrintf(db, + "attached databases must use the same text encoding as main database"); + rc = SQLITE_ERROR; + } + sqlite3BtreeEnter(pNew->pBt); + pPager = sqlite3BtreePager(pNew->pBt); + sqlite3PagerLockingMode(pPager, db->dfltLockMode); + sqlite3BtreeSecureDelete(pNew->pBt, + sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) ); +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + sqlite3BtreeSetPagerFlags(pNew->pBt, + PAGER_SYNCHRONOUS_FULL | (db->flags & PAGER_FLAGS_MASK)); +#endif + sqlite3BtreeLeave(pNew->pBt); + } + pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + if( rc==SQLITE_OK && pNew->zDbSName==0 ){ + rc = SQLITE_NOMEM_BKPT; + } + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if( rc==SQLITE_OK ){ + extern int sqlcipherCodecAttach(sqlite3*, int, const void*, int); + extern void sqlcipherCodecGetKey(sqlite3*, int, void**, int*); + int nKey; + char *zKey; + int t = sqlite3_value_type(argv[2]); + switch( t ){ + case SQLITE_INTEGER: + case SQLITE_FLOAT: + zErrDyn = sqlite3DbStrDup(db, "Invalid key value"); + rc = SQLITE_ERROR; + break; + + case SQLITE_TEXT: + case SQLITE_BLOB: + nKey = sqlite3_value_bytes(argv[2]); + zKey = (char *)sqlite3_value_blob(argv[2]); + rc = sqlcipherCodecAttach(db, db->nDb-1, zKey, nKey); + break; + + case SQLITE_NULL: + /* No key specified. Use the key from URI filename, or if none, + ** use the key from the main database. */ + if( sqlite3CodecQueryParameters(db, zName, zPath)==0 ){ + sqlcipherCodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey || sqlite3BtreeGetRequestedReserve(db->aDb[0].pBt)>0 ){ + rc = sqlcipherCodecAttach(db, db->nDb-1, zKey, nKey); + } + } + break; + } + } +#endif +/* END SQLCIPHER */ + sqlite3_free_filename( zPath ); + + /* If the file was opened successfully, read the schema for the new database. + ** If this fails, or if opening the file failed, then close the file and + ** remove the entry from the db->aDb[] array. i.e. put everything back the + ** way we found it. + */ + if( rc==SQLITE_OK ){ + sqlite3BtreeEnterAll(db); + db->init.iDb = 0; + db->mDbFlags &= ~(DBFLAG_SchemaKnownOk); + if( !REOPEN_AS_MEMDB(db) ){ + rc = sqlite3Init(db, &zErrDyn); + } + sqlite3BtreeLeaveAll(db); + assert( zErrDyn==0 || rc!=SQLITE_OK ); + } +#ifdef SQLITE_USER_AUTHENTICATION + if( rc==SQLITE_OK && !REOPEN_AS_MEMDB(db) ){ + u8 newAuth = 0; + rc = sqlite3UserAuthCheckLogin(db, zName, &newAuth); + if( newAuthauth.authLevel ){ + rc = SQLITE_AUTH_USER; + } + } +#endif + if( rc ){ + if( !REOPEN_AS_MEMDB(db) ){ + int iDb = db->nDb - 1; + assert( iDb>=2 ); + if( db->aDb[iDb].pBt ){ + sqlite3BtreeClose(db->aDb[iDb].pBt); + db->aDb[iDb].pBt = 0; + db->aDb[iDb].pSchema = 0; + } + sqlite3ResetAllSchemasOfConnection(db); + db->nDb = iDb; + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + sqlite3DbFree(db, zErrDyn); + zErrDyn = sqlite3MPrintf(db, "out of memory"); + }else if( zErrDyn==0 ){ + zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile); + } + } + goto attach_error; + } + + return; + +attach_error: + /* Return an error if we get here */ + if( zErrDyn ){ + sqlite3_result_error(context, zErrDyn, -1); + sqlite3DbFree(db, zErrDyn); + } + if( rc ) sqlite3_result_error_code(context, rc); +} + +/* +** An SQL user-function registered to do the work of an DETACH statement. The +** three arguments to the function come directly from a detach statement: +** +** DETACH DATABASE x +** +** SELECT sqlite_detach(x) +*/ +static void detachFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + const char *zName = (const char *)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + int i; + Db *pDb = 0; + HashElem *pEntry; + char zErr[128]; + + UNUSED_PARAMETER(NotUsed); + + if( zName==0 ) zName = ""; + for(i=0; inDb; i++){ + pDb = &db->aDb[i]; + if( pDb->pBt==0 ) continue; + if( sqlite3DbIsNamed(db, i, zName) ) break; + } + + if( i>=db->nDb ){ + sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); + goto detach_error; + } + if( i<2 ){ + sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); + goto detach_error; + } + if( sqlite3BtreeTxnState(pDb->pBt)!=SQLITE_TXN_NONE + || sqlite3BtreeIsInBackup(pDb->pBt) + ){ + sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); + goto detach_error; + } + + /* If any TEMP triggers reference the schema being detached, move those + ** triggers to reference the TEMP schema itself. */ + assert( db->aDb[1].pSchema ); + pEntry = sqliteHashFirst(&db->aDb[1].pSchema->trigHash); + while( pEntry ){ + Trigger *pTrig = (Trigger*)sqliteHashData(pEntry); + if( pTrig->pTabSchema==pDb->pSchema ){ + pTrig->pTabSchema = pTrig->pSchema; + } + pEntry = sqliteHashNext(pEntry); + } + + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + sqlite3CollapseDatabaseArray(db); + return; + +detach_error: + sqlite3_result_error(context, zErr, -1); +} + +/* +** This procedure generates VDBE code for a single invocation of either the +** sqlite_detach() or sqlite_attach() SQL user functions. +*/ +static void codeAttach( + Parse *pParse, /* The parser context */ + int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */ + FuncDef const *pFunc,/* FuncDef wrapper for detachFunc() or attachFunc() */ + Expr *pAuthArg, /* Expression to pass to authorization callback */ + Expr *pFilename, /* Name of database file */ + Expr *pDbname, /* Name of the database to use internally */ + Expr *pKey /* Database key for encryption extension */ +){ + int rc; + NameContext sName; + Vdbe *v; + sqlite3* db = pParse->db; + int regArgs; + + if( pParse->nErr ) goto attach_end; + memset(&sName, 0, sizeof(NameContext)); + sName.pParse = pParse; + + if( + SQLITE_OK!=resolveAttachExpr(&sName, pFilename) || + SQLITE_OK!=resolveAttachExpr(&sName, pDbname) || + SQLITE_OK!=resolveAttachExpr(&sName, pKey) + ){ + goto attach_end; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( ALWAYS(pAuthArg) ){ + char *zAuthArg; + if( pAuthArg->op==TK_STRING ){ + assert( !ExprHasProperty(pAuthArg, EP_IntValue) ); + zAuthArg = pAuthArg->u.zToken; + }else{ + zAuthArg = 0; + } + rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0); + if(rc!=SQLITE_OK ){ + goto attach_end; + } + } +#endif /* SQLITE_OMIT_AUTHORIZATION */ + + + v = sqlite3GetVdbe(pParse); + regArgs = sqlite3GetTempRange(pParse, 4); + sqlite3ExprCode(pParse, pFilename, regArgs); + sqlite3ExprCode(pParse, pDbname, regArgs+1); + sqlite3ExprCode(pParse, pKey, regArgs+2); + + assert( v || db->mallocFailed ); + if( v ){ + sqlite3VdbeAddFunctionCall(pParse, 0, regArgs+3-pFunc->nArg, regArgs+3, + pFunc->nArg, pFunc, 0); + /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this + ** statement only). For DETACH, set it to false (expire all existing + ** statements). + */ + sqlite3VdbeAddOp1(v, OP_Expire, (type==SQLITE_ATTACH)); + } + +attach_end: + sqlite3ExprDelete(db, pFilename); + sqlite3ExprDelete(db, pDbname); + sqlite3ExprDelete(db, pKey); +} + +/* +** Called by the parser to compile a DETACH statement. +** +** DETACH pDbname +*/ +SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){ + static const FuncDef detach_func = { + 1, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + detachFunc, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "sqlite_detach", /* zName */ + {0} + }; + codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname); +} + +/* +** Called by the parser to compile an ATTACH statement. +** +** ATTACH p AS pDbname KEY pKey +*/ +SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){ + static const FuncDef attach_func = { + 3, /* nArg */ + SQLITE_UTF8, /* funcFlags */ + 0, /* pUserData */ + 0, /* pNext */ + attachFunc, /* xSFunc */ + 0, /* xFinalize */ + 0, 0, /* xValue, xInverse */ + "sqlite_attach", /* zName */ + {0} + }; + codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey); +} +#endif /* SQLITE_OMIT_ATTACH */ + +/* +** Expression callback used by sqlite3FixAAAA() routines. +*/ +static int fixExprCb(Walker *p, Expr *pExpr){ + DbFixer *pFix = p->u.pFix; + if( !pFix->bTemp ) ExprSetProperty(pExpr, EP_FromDDL); + if( pExpr->op==TK_VARIABLE ){ + if( pFix->pParse->db->init.busy ){ + pExpr->op = TK_NULL; + }else{ + sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType); + return WRC_Abort; + } + } + return WRC_Continue; +} + +/* +** Select callback used by sqlite3FixAAAA() routines. +*/ +static int fixSelectCb(Walker *p, Select *pSelect){ + DbFixer *pFix = p->u.pFix; + int i; + SrcItem *pItem; + sqlite3 *db = pFix->pParse->db; + int iDb = sqlite3FindDbName(db, pFix->zDb); + SrcList *pList = pSelect->pSrc; + + if( NEVER(pList==0) ) return WRC_Continue; + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pFix->bTemp==0 ){ + if( pItem->zDatabase ){ + if( iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){ + sqlite3ErrorMsg(pFix->pParse, + "%s %T cannot reference objects in database %s", + pFix->zType, pFix->pName, pItem->zDatabase); + return WRC_Abort; + } + sqlite3DbFree(db, pItem->zDatabase); + pItem->zDatabase = 0; + pItem->fg.notCte = 1; + } + pItem->pSchema = pFix->pSchema; + pItem->fg.fromDDL = 1; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) + if( pList->a[i].fg.isUsing==0 + && sqlite3WalkExpr(&pFix->w, pList->a[i].u3.pOn) + ){ + return WRC_Abort; + } +#endif + } + if( pSelect->pWith ){ + for(i=0; ipWith->nCte; i++){ + if( sqlite3WalkSelect(p, pSelect->pWith->a[i].pSelect) ){ + return WRC_Abort; + } + } + } + return WRC_Continue; +} + +/* +** Initialize a DbFixer structure. This routine must be called prior +** to passing the structure to one of the sqliteFixAAAA() routines below. +*/ +SQLITE_PRIVATE void sqlite3FixInit( + DbFixer *pFix, /* The fixer to be initialized */ + Parse *pParse, /* Error messages will be written here */ + int iDb, /* This is the database that must be used */ + const char *zType, /* "view", "trigger", or "index" */ + const Token *pName /* Name of the view, trigger, or index */ +){ + sqlite3 *db = pParse->db; + assert( db->nDb>iDb ); + pFix->pParse = pParse; + pFix->zDb = db->aDb[iDb].zDbSName; + pFix->pSchema = db->aDb[iDb].pSchema; + pFix->zType = zType; + pFix->pName = pName; + pFix->bTemp = (iDb==1); + pFix->w.pParse = pParse; + pFix->w.xExprCallback = fixExprCb; + pFix->w.xSelectCallback = fixSelectCb; + pFix->w.xSelectCallback2 = sqlite3WalkWinDefnDummyCallback; + pFix->w.walkerDepth = 0; + pFix->w.eCode = 0; + pFix->w.u.pFix = pFix; +} + +/* +** The following set of routines walk through the parse tree and assign +** a specific database to all table references where the database name +** was left unspecified in the original SQL statement. The pFix structure +** must have been initialized by a prior call to sqlite3FixInit(). +** +** These routines are used to make sure that an index, trigger, or +** view in one database does not refer to objects in a different database. +** (Exception: indices, triggers, and views in the TEMP database are +** allowed to refer to anything.) If a reference is explicitly made +** to an object in a different database, an error message is added to +** pParse->zErrMsg and these routines return non-zero. If everything +** checks out, these routines return 0. +*/ +SQLITE_PRIVATE int sqlite3FixSrcList( + DbFixer *pFix, /* Context of the fixation */ + SrcList *pList /* The Source list to check and modify */ +){ + int res = 0; + if( pList ){ + Select s; + memset(&s, 0, sizeof(s)); + s.pSrc = pList; + res = sqlite3WalkSelect(&pFix->w, &s); + } + return res; +} +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) +SQLITE_PRIVATE int sqlite3FixSelect( + DbFixer *pFix, /* Context of the fixation */ + Select *pSelect /* The SELECT statement to be fixed to one database */ +){ + return sqlite3WalkSelect(&pFix->w, pSelect); +} +SQLITE_PRIVATE int sqlite3FixExpr( + DbFixer *pFix, /* Context of the fixation */ + Expr *pExpr /* The expression to be fixed to one database */ +){ + return sqlite3WalkExpr(&pFix->w, pExpr); +} +#endif + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE int sqlite3FixTriggerStep( + DbFixer *pFix, /* Context of the fixation */ + TriggerStep *pStep /* The trigger step be fixed to one database */ +){ + while( pStep ){ + if( sqlite3WalkSelect(&pFix->w, pStep->pSelect) + || sqlite3WalkExpr(&pFix->w, pStep->pWhere) + || sqlite3WalkExprList(&pFix->w, pStep->pExprList) + || sqlite3FixSrcList(pFix, pStep->pFrom) + ){ + return 1; + } +#ifndef SQLITE_OMIT_UPSERT + { + Upsert *pUp; + for(pUp=pStep->pUpsert; pUp; pUp=pUp->pNextUpsert){ + if( sqlite3WalkExprList(&pFix->w, pUp->pUpsertTarget) + || sqlite3WalkExpr(&pFix->w, pUp->pUpsertTargetWhere) + || sqlite3WalkExprList(&pFix->w, pUp->pUpsertSet) + || sqlite3WalkExpr(&pFix->w, pUp->pUpsertWhere) + ){ + return 1; + } + } + } +#endif + pStep = pStep->pNext; + } + + return 0; +} +#endif + +/************** End of attach.c **********************************************/ +/************** Begin file auth.c ********************************************/ +/* +** 2003 January 11 +** +** 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 contains code used to implement the sqlite3_set_authorizer() +** API. This facility is an optional feature of the library. Embedded +** systems that do not need this facility may omit it by recompiling +** the library with -DSQLITE_OMIT_AUTHORIZATION=1 +*/ +/* #include "sqliteInt.h" */ + +/* +** All of the code in this file may be omitted by defining a single +** macro. +*/ +#ifndef SQLITE_OMIT_AUTHORIZATION + +/* +** Set or clear the access authorization function. +** +** The access authorization function is be called during the compilation +** phase to verify that the user has read and/or write access permission on +** various fields of the database. The first argument to the auth function +** is a copy of the 3rd argument to this routine. The second argument +** to the auth function is one of these constants: +** +** SQLITE_CREATE_INDEX +** SQLITE_CREATE_TABLE +** SQLITE_CREATE_TEMP_INDEX +** SQLITE_CREATE_TEMP_TABLE +** SQLITE_CREATE_TEMP_TRIGGER +** SQLITE_CREATE_TEMP_VIEW +** SQLITE_CREATE_TRIGGER +** SQLITE_CREATE_VIEW +** SQLITE_DELETE +** SQLITE_DROP_INDEX +** SQLITE_DROP_TABLE +** SQLITE_DROP_TEMP_INDEX +** SQLITE_DROP_TEMP_TABLE +** SQLITE_DROP_TEMP_TRIGGER +** SQLITE_DROP_TEMP_VIEW +** SQLITE_DROP_TRIGGER +** SQLITE_DROP_VIEW +** SQLITE_INSERT +** SQLITE_PRAGMA +** SQLITE_READ +** SQLITE_SELECT +** SQLITE_TRANSACTION +** SQLITE_UPDATE +** +** The third and fourth arguments to the auth function are the name of +** the table and the column that are being accessed. The auth function +** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If +** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY +** means that the SQL statement will never-run - the sqlite3_exec() call +** will return with an error. SQLITE_IGNORE means that the SQL statement +** should run but attempts to read the specified column will return NULL +** and attempts to write the column will be ignored. +** +** Setting the auth function to NULL disables this hook. The default +** setting of the auth function is NULL. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3 *db, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xAuth = (sqlite3_xauth)xAuth; + db->pAuthArg = pArg; + if( db->xAuth ) sqlite3ExpirePreparedStatements(db, 1); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Write an error message into pParse->zErrMsg that explains that the +** user-supplied authorization function returned an illegal value. +*/ +static void sqliteAuthBadReturnCode(Parse *pParse){ + sqlite3ErrorMsg(pParse, "authorizer malfunction"); + pParse->rc = SQLITE_ERROR; +} + +/* +** Invoke the authorization callback for permission to read column zCol from +** table zTab in database zDb. This function assumes that an authorization +** callback has been registered (i.e. that sqlite3.xAuth is not NULL). +** +** If SQLITE_IGNORE is returned and pExpr is not NULL, then pExpr is changed +** to an SQL NULL expression. Otherwise, if pExpr is NULL, then SQLITE_IGNORE +** is treated as SQLITE_DENY. In this case an error is left in pParse. +*/ +SQLITE_PRIVATE int sqlite3AuthReadCol( + Parse *pParse, /* The parser context */ + const char *zTab, /* Table name */ + const char *zCol, /* Column name */ + int iDb /* Index of containing database. */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + char *zDb = db->aDb[iDb].zDbSName; /* Schema name of attached database */ + int rc; /* Auth callback return code */ + + if( db->init.busy ) return SQLITE_OK; + rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext +#ifdef SQLITE_USER_AUTHENTICATION + ,db->auth.zAuthUser +#endif + ); + if( rc==SQLITE_DENY ){ + char *z = sqlite3_mprintf("%s.%s", zTab, zCol); + if( db->nDb>2 || iDb!=0 ) z = sqlite3_mprintf("%s.%z", zDb, z); + sqlite3ErrorMsg(pParse, "access to %z is prohibited", z); + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_IGNORE && rc!=SQLITE_OK ){ + sqliteAuthBadReturnCode(pParse); + } + return rc; +} + +/* +** The pExpr should be a TK_COLUMN expression. The table referred to +** is in pTabList or else it is the NEW or OLD table of a trigger. +** Check to see if it is OK to read this particular column. +** +** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN +** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, +** then generate an error. +*/ +SQLITE_PRIVATE void sqlite3AuthRead( + Parse *pParse, /* The parser context */ + Expr *pExpr, /* The expression to check authorization on */ + Schema *pSchema, /* The schema of the expression */ + SrcList *pTabList /* All table that pExpr might refer to */ +){ + Table *pTab = 0; /* The table being read */ + const char *zCol; /* Name of the column of the table */ + int iSrc; /* Index in pTabList->a[] of table being read */ + int iDb; /* The index of the database the expression refers to */ + int iCol; /* Index of column in table */ + + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); + assert( !IN_RENAME_OBJECT ); + assert( pParse->db->xAuth!=0 ); + iDb = sqlite3SchemaToIndex(pParse->db, pSchema); + if( iDb<0 ){ + /* An attempt to read a column out of a subquery or other + ** temporary table. */ + return; + } + + if( pExpr->op==TK_TRIGGER ){ + pTab = pParse->pTriggerTab; + }else{ + assert( pTabList ); + for(iSrc=0; iSrcnSrc; iSrc++){ + if( pExpr->iTable==pTabList->a[iSrc].iCursor ){ + pTab = pTabList->a[iSrc].pTab; + break; + } + } + } + iCol = pExpr->iColumn; + if( pTab==0 ) return; + + if( iCol>=0 ){ + assert( iColnCol ); + zCol = pTab->aCol[iCol].zCnName; + }else if( pTab->iPKey>=0 ){ + assert( pTab->iPKeynCol ); + zCol = pTab->aCol[pTab->iPKey].zCnName; + }else{ + zCol = "ROWID"; + } + assert( iDb>=0 && iDbdb->nDb ); + if( SQLITE_IGNORE==sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb) ){ + pExpr->op = TK_NULL; + } +} + +/* +** Do an authorization check using the code and arguments given. Return +** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY +** is returned, then the error count and error message in pParse are +** modified appropriately. +*/ +SQLITE_PRIVATE int sqlite3AuthCheck( + Parse *pParse, + int code, + const char *zArg1, + const char *zArg2, + const char *zArg3 +){ + sqlite3 *db = pParse->db; + int rc; + + /* Don't do any authorization checks if the database is initialising + ** or if the parser is being invoked from within sqlite3_declare_vtab. + */ + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); + if( db->xAuth==0 || db->init.busy || IN_SPECIAL_PARSE ){ + return SQLITE_OK; + } + + /* EVIDENCE-OF: R-43249-19882 The third through sixth parameters to the + ** callback are either NULL pointers or zero-terminated strings that + ** contain additional details about the action to be authorized. + ** + ** The following testcase() macros show that any of the 3rd through 6th + ** parameters can be either NULL or a string. */ + testcase( zArg1==0 ); + testcase( zArg2==0 ); + testcase( zArg3==0 ); + testcase( pParse->zAuthContext==0 ); + + rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext +#ifdef SQLITE_USER_AUTHENTICATION + ,db->auth.zAuthUser +#endif + ); + if( rc==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized"); + pParse->rc = SQLITE_AUTH; + }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ + rc = SQLITE_DENY; + sqliteAuthBadReturnCode(pParse); + } + return rc; +} + +/* +** Push an authorization context. After this routine is called, the +** zArg3 argument to authorization callbacks will be zContext until +** popped. Or if pParse==0, this routine is a no-op. +*/ +SQLITE_PRIVATE void sqlite3AuthContextPush( + Parse *pParse, + AuthContext *pContext, + const char *zContext +){ + assert( pParse ); + pContext->pParse = pParse; + pContext->zAuthContext = pParse->zAuthContext; + pParse->zAuthContext = zContext; +} + +/* +** Pop an authorization context that was previously pushed +** by sqlite3AuthContextPush +*/ +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){ + if( pContext->pParse ){ + pContext->pParse->zAuthContext = pContext->zAuthContext; + pContext->pParse = 0; + } +} + +#endif /* SQLITE_OMIT_AUTHORIZATION */ + +/************** End of auth.c ************************************************/ +/************** Begin file build.c *******************************************/ +/* +** 2001 September 15 +** +** 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 contains C code routines that are called by the SQLite parser +** when syntax rules are reduced. The routines in this file handle the +** following kinds of SQL syntax: +** +** CREATE TABLE +** DROP TABLE +** CREATE INDEX +** DROP INDEX +** creating ID lists +** BEGIN TRANSACTION +** COMMIT +** ROLLBACK +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_SHARED_CACHE +/* +** The TableLock structure is only used by the sqlite3TableLock() and +** codeTableLocks() functions. +*/ +struct TableLock { + int iDb; /* The database containing the table to be locked */ + Pgno iTab; /* The root page of the table to be locked */ + u8 isWriteLock; /* True for write lock. False for a read lock */ + const char *zLockName; /* Name of the table */ +}; + +/* +** Record the fact that we want to lock a table at run-time. +** +** The table to be locked has root page iTab and is found in database iDb. +** A read or a write lock can be taken depending on isWritelock. +** +** This routine just records the fact that the lock is desired. The +** code to make the lock occur is generated by a later call to +** codeTableLocks() which occurs during sqlite3FinishCoding(). +*/ +static SQLITE_NOINLINE void lockTable( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database containing the table to lock */ + Pgno iTab, /* Root page number of the table to be locked */ + u8 isWriteLock, /* True for a write lock */ + const char *zName /* Name of the table to be locked */ +){ + Parse *pToplevel; + int i; + int nBytes; + TableLock *p; + assert( iDb>=0 ); + + pToplevel = sqlite3ParseToplevel(pParse); + for(i=0; inTableLock; i++){ + p = &pToplevel->aTableLock[i]; + if( p->iDb==iDb && p->iTab==iTab ){ + p->isWriteLock = (p->isWriteLock || isWriteLock); + return; + } + } + + nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1); + pToplevel->aTableLock = + sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes); + if( pToplevel->aTableLock ){ + p = &pToplevel->aTableLock[pToplevel->nTableLock++]; + p->iDb = iDb; + p->iTab = iTab; + p->isWriteLock = isWriteLock; + p->zLockName = zName; + }else{ + pToplevel->nTableLock = 0; + sqlite3OomFault(pToplevel->db); + } +} +SQLITE_PRIVATE void sqlite3TableLock( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database containing the table to lock */ + Pgno iTab, /* Root page number of the table to be locked */ + u8 isWriteLock, /* True for a write lock */ + const char *zName /* Name of the table to be locked */ +){ + if( iDb==1 ) return; + if( !sqlite3BtreeSharable(pParse->db->aDb[iDb].pBt) ) return; + lockTable(pParse, iDb, iTab, isWriteLock, zName); +} + +/* +** Code an OP_TableLock instruction for each table locked by the +** statement (configured by calls to sqlite3TableLock()). +*/ +static void codeTableLocks(Parse *pParse){ + int i; + Vdbe *pVdbe = pParse->pVdbe; + assert( pVdbe!=0 ); + + for(i=0; inTableLock; i++){ + TableLock *p = &pParse->aTableLock[i]; + int p1 = p->iDb; + sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, + p->zLockName, P4_STATIC); + } +} +#else + #define codeTableLocks(x) +#endif + +/* +** Return TRUE if the given yDbMask object is empty - if it contains no +** 1 bits. This routine is used by the DbMaskAllZero() and DbMaskNotZero() +** macros when SQLITE_MAX_ATTACHED is greater than 30. +*/ +#if SQLITE_MAX_ATTACHED>30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask m){ + int i; + for(i=0; ipToplevel==0 ); + db = pParse->db; + assert( db->pParse==pParse ); + if( pParse->nested ) return; + if( pParse->nErr ){ + if( db->mallocFailed ) pParse->rc = SQLITE_NOMEM; + return; + } + assert( db->mallocFailed==0 ); + + /* Begin by generating some termination code at the end of the + ** vdbe program + */ + v = pParse->pVdbe; + if( v==0 ){ + if( db->init.busy ){ + pParse->rc = SQLITE_DONE; + return; + } + v = sqlite3GetVdbe(pParse); + if( v==0 ) pParse->rc = SQLITE_ERROR; + } + assert( !pParse->isMultiWrite + || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); + if( v ){ + if( pParse->bReturning ){ + Returning *pReturning = pParse->u1.pReturning; + int addrRewind; + int i; + int reg; + + if( pReturning->nRetCol ){ + sqlite3VdbeAddOp0(v, OP_FkCheck); + addrRewind = + sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); + VdbeCoverage(v); + reg = pReturning->iRetReg; + for(i=0; inRetCol; i++){ + sqlite3VdbeAddOp3(v, OP_Column, pReturning->iRetCur, i, reg+i); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, reg, i); + sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind+1); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrRewind); + } + } + sqlite3VdbeAddOp0(v, OP_Halt); + +#if SQLITE_USER_AUTHENTICATION + if( pParse->nTableLock>0 && db->init.busy==0 ){ + sqlite3UserAuthInit(db); + if( db->auth.authLevelrc = SQLITE_AUTH_USER; + return; + } + } +#endif + + /* The cookie mask contains one bit for each database file open. + ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are + ** set for each database that is used. Generate code to start a + ** transaction on each used database and to verify the schema cookie + ** on each used database. + */ + if( db->mallocFailed==0 + && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr) + ){ + int iDb, i; + assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); + sqlite3VdbeJumpHere(v, 0); + assert( db->nDb>0 ); + iDb = 0; + do{ + Schema *pSchema; + if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; + sqlite3VdbeUsesBtree(v, iDb); + pSchema = db->aDb[iDb].pSchema; + sqlite3VdbeAddOp4Int(v, + OP_Transaction, /* Opcode */ + iDb, /* P1 */ + DbMaskTest(pParse->writeMask,iDb), /* P2 */ + pSchema->schema_cookie, /* P3 */ + pSchema->iGeneration /* P4 */ + ); + if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, + "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); + }while( ++iDbnDb ); +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=0; inVtabLock; i++){ + char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); + sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB); + } + pParse->nVtabLock = 0; +#endif + + /* Once all the cookies have been verified and transactions opened, + ** obtain the required table-locks. This is a no-op unless the + ** shared-cache feature is enabled. + */ + codeTableLocks(pParse); + + /* Initialize any AUTOINCREMENT data structures required. + */ + sqlite3AutoincrementBegin(pParse); + + /* Code constant expressions that where factored out of inner loops. + ** + ** The pConstExpr list might also contain expressions that we simply + ** want to keep around until the Parse object is deleted. Such + ** expressions have iConstExprReg==0. Do not generate code for + ** those expressions, of course. + */ + if( pParse->pConstExpr ){ + ExprList *pEL = pParse->pConstExpr; + pParse->okConstFactor = 0; + for(i=0; inExpr; i++){ + int iReg = pEL->a[i].u.iConstExprReg; + if( iReg>0 ){ + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); + } + } + } + + if( pParse->bReturning ){ + Returning *pRet = pParse->u1.pReturning; + if( pRet->nRetCol ){ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); + } + } + + /* Finally, jump back to the beginning of the executable code. */ + sqlite3VdbeGoto(v, 1); + } + } + + /* Get the VDBE program ready for execution + */ + assert( v!=0 || pParse->nErr ); + assert( db->mallocFailed==0 || pParse->nErr ); + if( pParse->nErr==0 ){ + /* A minimum of one cursor is required if autoincrement is used + * See ticket [a696379c1f08866] */ + assert( pParse->pAinc==0 || pParse->nTab>0 ); + sqlite3VdbeMakeReady(v, pParse); + pParse->rc = SQLITE_DONE; + }else{ + pParse->rc = SQLITE_ERROR; + } +} + +/* +** Run the parser and code generator recursively in order to generate +** code for the SQL statement given onto the end of the pParse context +** currently under construction. Notes: +** +** * The final OP_Halt is not appended and other initialization +** and finalization steps are omitted because those are handling by the +** outermost parser. +** +** * Built-in SQL functions always take precedence over application-defined +** SQL functions. In other words, it is not possible to override a +** built-in function. +*/ +SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ + va_list ap; + char *zSql; + sqlite3 *db = pParse->db; + u32 savedDbFlags = db->mDbFlags; + char saveBuf[PARSE_TAIL_SZ]; + + if( pParse->nErr ) return; + assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ + va_start(ap, zFormat); + zSql = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + if( zSql==0 ){ + /* This can result either from an OOM or because the formatted string + ** exceeds SQLITE_LIMIT_LENGTH. In the latter case, we need to set + ** an error */ + if( !db->mallocFailed ) pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; + return; + } + pParse->nested++; + memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); + memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); + db->mDbFlags |= DBFLAG_PreferBuiltin; + sqlite3RunParser(pParse, zSql); + db->mDbFlags = savedDbFlags; + sqlite3DbFree(db, zSql); + memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); + pParse->nested--; +} + +#if SQLITE_USER_AUTHENTICATION +/* +** Return TRUE if zTable is the name of the system table that stores the +** list of users and their access credentials. +*/ +SQLITE_PRIVATE int sqlite3UserAuthTable(const char *zTable){ + return sqlite3_stricmp(zTable, "sqlite_user")==0; +} +#endif + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the table and the +** first matching table is returned. (No checking for duplicate table +** names is done.) The search order is TEMP first, then MAIN, then any +** auxiliary databases added using the ATTACH command. +** +** See also sqlite3LocateTable(). +*/ +SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ + Table *p = 0; + int i; + + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) ); +#if SQLITE_USER_AUTHENTICATION + /* Only the admin user is allowed to know that the sqlite_user table + ** exists */ + if( db->auth.authLevelnDb; i++){ + if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break; + } + if( i>=db->nDb ){ + /* No match against the official names. But always match "main" + ** to schema 0 as a legacy fallback. */ + if( sqlite3StrICmp(zDatabase,"main")==0 ){ + i = 0; + }else{ + return 0; + } + } + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); + if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( i==1 ){ + if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 + || sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 + || sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 + ){ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, + LEGACY_TEMP_SCHEMA_TABLE); + } + }else{ + if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, + LEGACY_SCHEMA_TABLE); + } + } + } + }else{ + /* Match against TEMP first */ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName); + if( p ) return p; + /* The main database is second */ + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName); + if( p ) return p; + /* Attached databases are in order of attachment */ + for(i=2; inDb; i++){ + assert( sqlite3SchemaMutexHeld(db, i, 0) ); + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); + if( p ) break; + } + if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, LEGACY_SCHEMA_TABLE); + }else if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, + LEGACY_TEMP_SCHEMA_TABLE); + } + } + } + return p; +} + +/* +** Locate the in-memory structure that describes a particular database +** table given the name of that table and (optionally) the name of the +** database containing the table. Return NULL if not found. Also leave an +** error message in pParse->zErrMsg. +** +** The difference between this routine and sqlite3FindTable() is that this +** routine leaves an error message in pParse->zErrMsg where +** sqlite3FindTable() does not. +*/ +SQLITE_PRIVATE Table *sqlite3LocateTable( + Parse *pParse, /* context in which to report errors */ + u32 flags, /* LOCATE_VIEW or LOCATE_NOERR */ + const char *zName, /* Name of the table we are looking for */ + const char *zDbase /* Name of the database. Might be NULL */ +){ + Table *p; + sqlite3 *db = pParse->db; + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 + && SQLITE_OK!=sqlite3ReadSchema(pParse) + ){ + return 0; + } + + p = sqlite3FindTable(db, zName, zDbase); + if( p==0 ){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* If zName is the not the name of a table in the schema created using + ** CREATE, then check to see if it is the name of an virtual table that + ** can be an eponymous virtual table. */ + if( pParse->disableVtab==0 && db->init.busy==0 ){ + Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(db, zName); + } + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + testcase( pMod->pEpoTab==0 ); + return pMod->pEpoTab; + } + } +#endif + if( flags & LOCATE_NOERR ) return 0; + pParse->checkSchema = 1; + }else if( IsVirtual(p) && pParse->disableVtab ){ + p = 0; + } + + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); + } + }else{ + assert( HasRowid(p) || p->iPKey<0 ); + } + + return p; +} + +/* +** Locate the table identified by *p. +** +** This is a wrapper around sqlite3LocateTable(). The difference between +** sqlite3LocateTable() and this function is that this function restricts +** the search to schema (p->pSchema) if it is not NULL. p->pSchema may be +** non-NULL if it is part of a view or trigger program definition. See +** sqlite3FixSrcList() for details. +*/ +SQLITE_PRIVATE Table *sqlite3LocateTableItem( + Parse *pParse, + u32 flags, + SrcItem *p +){ + const char *zDb; + assert( p->pSchema==0 || p->zDatabase==0 ); + if( p->pSchema ){ + int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema); + zDb = pParse->db->aDb[iDb].zDbSName; + }else{ + zDb = p->zDatabase; + } + return sqlite3LocateTable(pParse, flags, p->zName, zDb); +} + +/* +** Return the preferred table name for system tables. Translate legacy +** names into the new preferred names, as appropriate. +*/ +SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char *zName){ + if( sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 ){ + return PREFERRED_SCHEMA_TABLE; + } + if( sqlite3StrICmp(zName+7, &LEGACY_TEMP_SCHEMA_TABLE[7])==0 ){ + return PREFERRED_TEMP_SCHEMA_TABLE; + } + } + return zName; +} + +/* +** Locate the in-memory structure that describes +** a particular index given the name of that index +** and the name of the database that contains the index. +** Return NULL if not found. +** +** If zDatabase is 0, all databases are searched for the +** table and the first matching index is returned. (No checking +** for duplicate index names is done.) The search order is +** TEMP first, then MAIN, then any auxiliary databases added +** using the ATTACH command. +*/ +SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ + Index *p = 0; + int i; + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + Schema *pSchema = db->aDb[j].pSchema; + assert( pSchema ); + if( zDb && sqlite3DbIsNamed(db, j, zDb)==0 ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + p = sqlite3HashFind(&pSchema->idxHash, zName); + if( p ) break; + } + return p; +} + +/* +** Reclaim the memory used by an index +*/ +SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3 *db, Index *p){ +#ifndef SQLITE_OMIT_ANALYZE + sqlite3DeleteIndexSamples(db, p); +#endif + sqlite3ExprDelete(db, p->pPartIdxWhere); + sqlite3ExprListDelete(db, p->aColExpr); + sqlite3DbFree(db, p->zColAff); + if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); +#ifdef SQLITE_ENABLE_STAT4 + sqlite3_free(p->aiRowEst); +#endif + sqlite3DbFree(db, p); +} + +/* +** For the index called zIdxName which is found in the database iDb, +** unlike that index from its Table then remove the index from +** the index hash table and free all memory structures associated +** with the index. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ + Index *pIndex; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &db->aDb[iDb].pSchema->idxHash; + pIndex = sqlite3HashInsert(pHash, zIdxName, 0); + if( ALWAYS(pIndex) ){ + if( pIndex->pTable->pIndex==pIndex ){ + pIndex->pTable->pIndex = pIndex->pNext; + }else{ + Index *p; + /* Justification of ALWAYS(); The index must be on the list of + ** indices. */ + p = pIndex->pTable->pIndex; + while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; } + if( ALWAYS(p && p->pNext==pIndex) ){ + p->pNext = pIndex->pNext; + } + } + sqlite3FreeIndex(db, pIndex); + } + db->mDbFlags |= DBFLAG_SchemaChange; +} + +/* +** Look through the list of open database files in db->aDb[] and if +** any have been closed, remove them from the list. Reallocate the +** db->aDb[] structure to a smaller size, if possible. +** +** Entry 0 (the "main" database) and entry 1 (the "temp" database) +** are never candidates for being collapsed. +*/ +SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ + int i, j; + for(i=j=2; inDb; i++){ + struct Db *pDb = &db->aDb[i]; + if( pDb->pBt==0 ){ + sqlite3DbFree(db, pDb->zDbSName); + pDb->zDbSName = 0; + continue; + } + if( jaDb[j] = db->aDb[i]; + } + j++; + } + db->nDb = j; + if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ + memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); + sqlite3DbFree(db, db->aDb); + db->aDb = db->aDbStatic; + } +} + +/* +** Reset the schema for the database at index iDb. Also reset the +** TEMP schema. The reset is deferred if db->nSchemaLock is not zero. +** Deferred resets may be run by calling with iDb<0. +*/ +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ + int i; + assert( iDbnDb ); + + if( iDb>=0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + DbSetProperty(db, iDb, DB_ResetWanted); + DbSetProperty(db, 1, DB_ResetWanted); + db->mDbFlags &= ~DBFLAG_SchemaKnownOk; + } + + if( db->nSchemaLock==0 ){ + for(i=0; inDb; i++){ + if( DbHasProperty(db, i, DB_ResetWanted) ){ + sqlite3SchemaClear(db->aDb[i].pSchema); + } + } + } +} + +/* +** Erase all schema information from all attached databases (including +** "main" and "temp") for a single database connection. +*/ +SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ + int i; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pSchema ){ + if( db->nSchemaLock==0 ){ + sqlite3SchemaClear(pDb->pSchema); + }else{ + DbSetProperty(db, i, DB_ResetWanted); + } + } + } + db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk); + sqlite3VtabUnlockList(db); + sqlite3BtreeLeaveAll(db); + if( db->nSchemaLock==0 ){ + sqlite3CollapseDatabaseArray(db); + } +} + +/* +** This routine is called when a commit occurs. +*/ +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){ + db->mDbFlags &= ~DBFLAG_SchemaChange; +} + +/* +** Set the expression associated with a column. This is usually +** the DEFAULT value, but might also be the expression that computes +** the value for a generated column. +*/ +SQLITE_PRIVATE void sqlite3ColumnSetExpr( + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table containing the column */ + Column *pCol, /* The column to receive the new DEFAULT expression */ + Expr *pExpr /* The new default expression */ +){ + ExprList *pList; + assert( IsOrdinaryTable(pTab) ); + pList = pTab->u.tab.pDfltList; + if( pCol->iDflt==0 + || NEVER(pList==0) + || NEVER(pList->nExpriDflt) + ){ + pCol->iDflt = pList==0 ? 1 : pList->nExpr+1; + pTab->u.tab.pDfltList = sqlite3ExprListAppend(pParse, pList, pExpr); + }else{ + sqlite3ExprDelete(pParse->db, pList->a[pCol->iDflt-1].pExpr); + pList->a[pCol->iDflt-1].pExpr = pExpr; + } +} + +/* +** Return the expression associated with a column. The expression might be +** the DEFAULT clause or the AS clause of a generated column. +** Return NULL if the column has no associated expression. +*/ +SQLITE_PRIVATE Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){ + if( pCol->iDflt==0 ) return 0; + if( NEVER(!IsOrdinaryTable(pTab)) ) return 0; + if( NEVER(pTab->u.tab.pDfltList==0) ) return 0; + if( NEVER(pTab->u.tab.pDfltList->nExpriDflt) ) return 0; + return pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; +} + +/* +** Set the collating sequence name for a column. +*/ +SQLITE_PRIVATE void sqlite3ColumnSetColl( + sqlite3 *db, + Column *pCol, + const char *zColl +){ + i64 nColl; + i64 n; + char *zNew; + assert( zColl!=0 ); + n = sqlite3Strlen30(pCol->zCnName) + 1; + if( pCol->colFlags & COLFLAG_HASTYPE ){ + n += sqlite3Strlen30(pCol->zCnName+n) + 1; + } + nColl = sqlite3Strlen30(zColl) + 1; + zNew = sqlite3DbRealloc(db, pCol->zCnName, nColl+n); + if( zNew ){ + pCol->zCnName = zNew; + memcpy(pCol->zCnName + n, zColl, nColl); + pCol->colFlags |= COLFLAG_HASCOLL; + } +} + +/* +** Return the collating squence name for a column +*/ +SQLITE_PRIVATE const char *sqlite3ColumnColl(Column *pCol){ + const char *z; + if( (pCol->colFlags & COLFLAG_HASCOLL)==0 ) return 0; + z = pCol->zCnName; + while( *z ){ z++; } + if( pCol->colFlags & COLFLAG_HASTYPE ){ + do{ z++; }while( *z ); + } + return z+1; +} + +/* +** Delete memory allocated for the column names of a table or view (the +** Table.aCol[] array). +*/ +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ + int i; + Column *pCol; + assert( pTable!=0 ); + if( (pCol = pTable->aCol)!=0 ){ + for(i=0; inCol; i++, pCol++){ + assert( pCol->zCnName==0 || pCol->hName==sqlite3StrIHash(pCol->zCnName) ); + sqlite3DbFree(db, pCol->zCnName); + } + sqlite3DbFree(db, pTable->aCol); + if( IsOrdinaryTable(pTable) ){ + sqlite3ExprListDelete(db, pTable->u.tab.pDfltList); + } + if( db==0 || db->pnBytesFreed==0 ){ + pTable->aCol = 0; + pTable->nCol = 0; + if( IsOrdinaryTable(pTable) ){ + pTable->u.tab.pDfltList = 0; + } + } + } +} + +/* +** Remove the memory data structures associated with the given +** Table. No changes are made to disk by this routine. +** +** This routine just deletes the data structure. It does not unlink +** the table data structure from the hash table. But it does destroy +** memory structures of the indices and foreign keys associated with +** the table. +** +** The db parameter is optional. It is needed if the Table object +** contains lookaside memory. (Table objects in the schema do not use +** lookaside memory, but some ephemeral Table objects do.) Or the +** db parameter can be used with db->pnBytesFreed to measure the memory +** used by the Table object. +*/ +static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ + Index *pIndex, *pNext; + +#ifdef SQLITE_DEBUG + /* Record the number of outstanding lookaside allocations in schema Tables + ** prior to doing any free() operations. Since schema Tables do not use + ** lookaside, this number should not change. + ** + ** If malloc has already failed, it may be that it failed while allocating + ** a Table object that was going to be marked ephemeral. So do not check + ** that no lookaside memory is used in this case either. */ + int nLookaside = 0; + if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){ + nLookaside = sqlite3LookasideUsed(db, 0); + } +#endif + + /* Delete all indices associated with this table. */ + for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ + pNext = pIndex->pNext; + assert( pIndex->pSchema==pTable->pSchema + || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) ); + if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){ + char *zName = pIndex->zName; + TESTONLY ( Index *pOld = ) sqlite3HashInsert( + &pIndex->pSchema->idxHash, zName, 0 + ); + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + assert( pOld==pIndex || pOld==0 ); + } + sqlite3FreeIndex(db, pIndex); + } + + if( IsOrdinaryTable(pTable) ){ + sqlite3FkDelete(db, pTable); + } +#ifndef SQLITE_OMIT_VIRTUAL_TABLE + else if( IsVirtual(pTable) ){ + sqlite3VtabClear(db, pTable); + } +#endif + else{ + assert( IsView(pTable) ); + sqlite3SelectDelete(db, pTable->u.view.pSelect); + } + + /* Delete the Table structure itself. + */ + sqlite3DeleteColumnNames(db, pTable); + sqlite3DbFree(db, pTable->zName); + sqlite3DbFree(db, pTable->zColAff); + sqlite3ExprListDelete(db, pTable->pCheck); + sqlite3DbFree(db, pTable); + + /* Verify that no lookaside memory was used by schema tables */ + assert( nLookaside==0 || nLookaside==sqlite3LookasideUsed(db,0) ); +} +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ + /* Do not delete the table until the reference count reaches zero. */ + if( !pTable ) return; + if( ((!db || db->pnBytesFreed==0) && (--pTable->nTabRef)>0) ) return; + deleteTable(db, pTable); +} + + +/* +** Unlink the given table from the hash tables and the delete the +** table structure with all its indices and foreign keys. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ + Table *p; + Db *pDb; + + assert( db!=0 ); + assert( iDb>=0 && iDbnDb ); + assert( zTabName ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */ + pDb = &db->aDb[iDb]; + p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, 0); + sqlite3DeleteTable(db, p); + db->mDbFlags |= DBFLAG_SchemaChange; +} + +/* +** Given a token, return a string that consists of the text of that +** token. Space to hold the returned string +** is obtained from sqliteMalloc() and must be freed by the calling +** function. +** +** Any quotation marks (ex: "name", 'name', [name], or `name`) that +** surround the body of the token are removed. +** +** Tokens are often just pointers into the original SQL text and so +** are not \000 terminated and are not persistent. The returned string +** is \000 terminated and is persistent. +*/ +SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, const Token *pName){ + char *zName; + if( pName ){ + zName = sqlite3DbStrNDup(db, (const char*)pName->z, pName->n); + sqlite3Dequote(zName); + }else{ + zName = 0; + } + return zName; +} + +/* +** Open the sqlite_schema table stored in database number iDb for +** writing. The table is opened using cursor 0. +*/ +SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){ + Vdbe *v = sqlite3GetVdbe(p); + sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, LEGACY_SCHEMA_TABLE); + sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5); + if( p->nTab==0 ){ + p->nTab = 1; + } +} + +/* +** Parameter zName points to a nul-terminated buffer containing the name +** of a database ("main", "temp" or the name of an attached db). This +** function returns the index of the named database in db->aDb[], or +** -1 if the named db cannot be found. +*/ +SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ + int i = -1; /* Database number */ + if( zName ){ + Db *pDb; + for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ + if( 0==sqlite3_stricmp(pDb->zDbSName, zName) ) break; + /* "main" is always an acceptable alias for the primary database + ** even if it has been renamed using SQLITE_DBCONFIG_MAINDBNAME. */ + if( i==0 && 0==sqlite3_stricmp("main", zName) ) break; + } + } + return i; +} + +/* +** The token *pName contains the name of a database (either "main" or +** "temp" or the name of an attached db). This routine returns the +** index of the named database in db->aDb[], or -1 if the named db +** does not exist. +*/ +SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){ + int i; /* Database number */ + char *zName; /* Name we are searching for */ + zName = sqlite3NameFromToken(db, pName); + i = sqlite3FindDbName(db, zName); + sqlite3DbFree(db, zName); + return i; +} + +/* The table or view or trigger name is passed to this routine via tokens +** pName1 and pName2. If the table name was fully qualified, for example: +** +** CREATE TABLE xxx.yyy (...); +** +** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if +** the table name is not fully qualified, i.e.: +** +** CREATE TABLE yyy(...); +** +** Then pName1 is set to "yyy" and pName2 is "". +** +** This routine sets the *ppUnqual pointer to point at the token (pName1 or +** pName2) that stores the unqualified table name. The index of the +** database "xxx" is returned. +*/ +SQLITE_PRIVATE int sqlite3TwoPartName( + Parse *pParse, /* Parsing and code generating context */ + Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */ + Token *pName2, /* The "yyy" in the name "xxx.yyy" */ + Token **pUnqual /* Write the unqualified object name here */ +){ + int iDb; /* Database holding the object */ + sqlite3 *db = pParse->db; + + assert( pName2!=0 ); + if( pName2->n>0 ){ + if( db->init.busy ) { + sqlite3ErrorMsg(pParse, "corrupt database"); + return -1; + } + *pUnqual = pName2; + iDb = sqlite3FindDb(db, pName1); + if( iDb<0 ){ + sqlite3ErrorMsg(pParse, "unknown database %T", pName1); + return -1; + } + }else{ + assert( db->init.iDb==0 || db->init.busy || IN_SPECIAL_PARSE + || (db->mDbFlags & DBFLAG_Vacuum)!=0); + iDb = db->init.iDb; + *pUnqual = pName1; + } + return iDb; +} + +/* +** True if PRAGMA writable_schema is ON +*/ +SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3 *db){ + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==0 ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_WriteSchema ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_Defensive ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + (SQLITE_WriteSchema|SQLITE_Defensive) ); + return (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==SQLITE_WriteSchema; +} + +/* +** This routine is used to check if the UTF-8 string zName is a legal +** unqualified name for a new schema object (table, index, view or +** trigger). All names are legal except those that begin with the string +** "sqlite_" (in upper, lower or mixed case). This portion of the namespace +** is reserved for internal use. +** +** When parsing the sqlite_schema table, this routine also checks to +** make sure the "type", "name", and "tbl_name" columns are consistent +** with the SQL. +*/ +SQLITE_PRIVATE int sqlite3CheckObjectName( + Parse *pParse, /* Parsing context */ + const char *zName, /* Name of the object to check */ + const char *zType, /* Type of this object */ + const char *zTblName /* Parent table name for triggers and indexes */ +){ + sqlite3 *db = pParse->db; + if( sqlite3WritableSchema(db) + || db->init.imposterTable + || !sqlite3Config.bExtraSchemaChecks + ){ + /* Skip these error checks for writable_schema=ON */ + return SQLITE_OK; + } + if( db->init.busy ){ + if( sqlite3_stricmp(zType, db->init.azInit[0]) + || sqlite3_stricmp(zName, db->init.azInit[1]) + || sqlite3_stricmp(zTblName, db->init.azInit[2]) + ){ + sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ + return SQLITE_ERROR; + } + }else{ + if( (pParse->nested==0 && 0==sqlite3StrNICmp(zName, "sqlite_", 7)) + || (sqlite3ReadOnlyShadowTables(db) && sqlite3ShadowTableName(db, zName)) + ){ + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", + zName); + return SQLITE_ERROR; + } + + } + return SQLITE_OK; +} + +/* +** Return the PRIMARY KEY index of a table +*/ +SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table *pTab){ + Index *p; + for(p=pTab->pIndex; p && !IsPrimaryKeyIndex(p); p=p->pNext){} + return p; +} + +/* +** Convert an table column number into a index column number. That is, +** for the column iCol in the table (as defined by the CREATE TABLE statement) +** find the (first) offset of that column in index pIdx. Or return -1 +** if column iCol is not used in index pIdx. +*/ +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index *pIdx, i16 iCol){ + int i; + for(i=0; inColumn; i++){ + if( iCol==pIdx->aiColumn[i] ) return i; + } + return -1; +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a storage column number into a table column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. The true column number +** is the index (0,1,2,...) of the column in the CREATE TABLE statement. +** +** The storage column number is less than the table column number if +** and only there are VIRTUAL columns to the left. +** +** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. +*/ +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ + if( pTab->tabFlags & TF_HasVirtual ){ + int i; + for(i=0; i<=iCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) iCol++; + } + } + return iCol; +} +#endif + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a table column number into a storage column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. Or, if the input column is +** the N-th virtual column (zero-based) then the storage number is +** the number of non-virtual columns in the table plus N. +** +** The true column number is the index (0,1,2,...) of the column in +** the CREATE TABLE statement. +** +** If the input column is a VIRTUAL column, then it should not appear +** in storage. But the value sometimes is cached in registers that +** follow the range of registers used to construct storage. This +** avoids computing the same VIRTUAL column multiple times, and provides +** values for use by OP_Param opcodes in triggers. Hence, if the +** input column is a VIRTUAL table, put it after all the other columns. +** +** In the following, N means "normal column", S means STORED, and +** V means VIRTUAL. Suppose the CREATE TABLE has columns like this: +** +** CREATE TABLE ex(N,S,V,N,S,V,N,S,V); +** -- 0 1 2 3 4 5 6 7 8 +** +** Then the mapping from this function is as follows: +** +** INPUTS: 0 1 2 3 4 5 6 7 8 +** OUTPUTS: 0 1 6 2 3 7 4 5 8 +** +** So, in other words, this routine shifts all the virtual columns to +** the end. +** +** If SQLITE_OMIT_GENERATED_COLUMNS then there are no virtual columns and +** this routine is a no-op macro. If the pTab does not have any virtual +** columns, then this routine is no-op that always return iCol. If iCol +** is negative (indicating the ROWID column) then this routine return iCol. +*/ +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ + int i; + i16 n; + assert( iColnCol ); + if( (pTab->tabFlags & TF_HasVirtual)==0 || iCol<0 ) return iCol; + for(i=0, n=0; iaCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++; + } + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + /* iCol is a virtual column itself */ + return pTab->nNVCol + i - n; + }else{ + /* iCol is a normal or stored column */ + return n; + } +} +#endif + +/* +** Insert a single OP_JournalMode query opcode in order to force the +** prepared statement to return false for sqlite3_stmt_readonly(). This +** is used by CREATE TABLE IF NOT EXISTS and similar if the table already +** exists, so that the prepared statement for CREATE TABLE IF NOT EXISTS +** will return false for sqlite3_stmt_readonly() even if that statement +** is a read-only no-op. +*/ +static void sqlite3ForceNotReadOnly(Parse *pParse){ + int iReg = ++pParse->nMem; + Vdbe *v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp3(v, OP_JournalMode, 0, iReg, PAGER_JOURNALMODE_QUERY); + sqlite3VdbeUsesBtree(v, 0); + } +} + +/* +** Begin constructing a new table representation in memory. This is +** the first of several action routines that get called in response +** to a CREATE TABLE statement. In particular, this routine is called +** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp +** flag is true if the table should be stored in the auxiliary database +** file instead of in the main database file. This is normally the case +** when the "TEMP" or "TEMPORARY" keyword occurs in between +** CREATE and TABLE. +** +** The new table record is initialized and put in pParse->pNewTable. +** As more of the CREATE TABLE statement is parsed, additional action +** routines will be called to add more information to this record. +** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine +** is called to complete the construction of the new table record. +*/ +SQLITE_PRIVATE void sqlite3StartTable( + Parse *pParse, /* Parser context */ + Token *pName1, /* First part of the name of the table or view */ + Token *pName2, /* Second part of the name of the table or view */ + int isTemp, /* True if this is a TEMP table */ + int isView, /* True if this is a VIEW */ + int isVirtual, /* True if this is a VIRTUAL table */ + int noErr /* Do nothing if table already exists */ +){ + Table *pTable; + char *zName = 0; /* The name of the new table */ + sqlite3 *db = pParse->db; + Vdbe *v; + int iDb; /* Database number to create the table in */ + Token *pName; /* Unqualified name of the table to create */ + + if( db->init.busy && db->init.newTnum==1 ){ + /* Special case: Parsing the sqlite_schema or sqlite_temp_schema schema */ + iDb = db->init.iDb; + zName = sqlite3DbStrDup(db, SCHEMA_TABLE(iDb)); + pName = pName1; + }else{ + /* The common case */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) return; + if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ + /* If creating a temp table, the name may not be qualified. Unless + ** the database name is "temp" anyway. */ + sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); + return; + } + if( !OMIT_TEMPDB && isTemp ) iDb = 1; + zName = sqlite3NameFromToken(db, pName); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)zName, pName); + } + } + pParse->sNameToken = *pName; + if( zName==0 ) return; + if( sqlite3CheckObjectName(pParse, zName, isView?"view":"table", zName) ){ + goto begin_table_error; + } + if( db->init.iDb==1 ) isTemp = 1; +#ifndef SQLITE_OMIT_AUTHORIZATION + assert( isTemp==0 || isTemp==1 ); + assert( isView==0 || isView==1 ); + { + static const u8 aCode[] = { + SQLITE_CREATE_TABLE, + SQLITE_CREATE_TEMP_TABLE, + SQLITE_CREATE_VIEW, + SQLITE_CREATE_TEMP_VIEW + }; + char *zDb = db->aDb[iDb].zDbSName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ + goto begin_table_error; + } + if( !isVirtual && sqlite3AuthCheck(pParse, (int)aCode[isTemp+2*isView], + zName, 0, zDb) ){ + goto begin_table_error; + } + } +#endif + + /* Make sure the new table name does not collide with an existing + ** index or table name in the same database. Issue an error message if + ** it does. The exception is if the statement being parsed was passed + ** to an sqlite3_declare_vtab() call. In that case only the column names + ** and types will be used, so there is no need to test for namespace + ** collisions. + */ + if( !IN_SPECIAL_PARSE ){ + char *zDb = db->aDb[iDb].zDbSName; + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto begin_table_error; + } + pTable = sqlite3FindTable(db, zName, zDb); + if( pTable ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "%s %T already exists", + (IsView(pTable)? "view" : "table"), pName); + }else{ + assert( !db->init.busy || CORRUPT_DB ); + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3ForceNotReadOnly(pParse); + } + goto begin_table_error; + } + if( sqlite3FindIndex(db, zName, zDb)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); + goto begin_table_error; + } + } + + pTable = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTable==0 ){ + assert( db->mallocFailed ); + pParse->rc = SQLITE_NOMEM_BKPT; + pParse->nErr++; + goto begin_table_error; + } + pTable->zName = zName; + pTable->iPKey = -1; + pTable->pSchema = db->aDb[iDb].pSchema; + pTable->nTabRef = 1; +#ifdef SQLITE_DEFAULT_ROWEST + pTable->nRowLogEst = sqlite3LogEst(SQLITE_DEFAULT_ROWEST); +#else + pTable->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); +#endif + assert( pParse->pNewTable==0 ); + pParse->pNewTable = pTable; + + /* Begin generating the code that will insert the table record into + ** the schema table. Note in particular that we must go ahead + ** and allocate the record number for the table entry now. Before any + ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause + ** indices to be created and the table record must come before the + ** indices. Hence, the record number for the table must be allocated + ** now. + */ + if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ + int addr1; + int fileFormat; + int reg1, reg2, reg3; + /* nullRow[] is an OP_Record encoding of a row containing 5 NULLs */ + static const char nullRow[] = { 6, 0, 0, 0, 0, 0 }; + sqlite3BeginWriteOperation(pParse, 1, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( isVirtual ){ + sqlite3VdbeAddOp0(v, OP_VBegin); + } +#endif + + /* If the file format and encoding in the database have not been set, + ** set them now. + */ + reg1 = pParse->regRowid = ++pParse->nMem; + reg2 = pParse->regRoot = ++pParse->nMem; + reg3 = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + addr1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); + fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? + 1 : SQLITE_MAX_FILE_FORMAT; + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, fileFormat); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, ENC(db)); + sqlite3VdbeJumpHere(v, addr1); + + /* This just creates a place-holder record in the sqlite_schema table. + ** The record created does not contain anything yet. It will be replaced + ** by the real entry in code generated at sqlite3EndTable(). + ** + ** The rowid for the new entry is left in register pParse->regRowid. + ** The root page number of the new table is left in reg pParse->regRoot. + ** The rowid and root page number values are needed by the code that + ** sqlite3EndTable will generate. + */ +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) + if( isView || isVirtual ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2); + }else +#endif + { + assert( !pParse->bReturning ); + pParse->u1.addrCrTab = + sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); + } + sqlite3OpenSchemaTable(pParse, iDb); + sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); + sqlite3VdbeAddOp4(v, OP_Blob, 6, reg3, 0, nullRow, P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3VdbeAddOp0(v, OP_Close); + } + + /* Normal (non-error) return. */ + return; + + /* If an error occurs, we jump here */ +begin_table_error: + pParse->checkSchema = 1; + sqlite3DbFree(db, zName); + return; +} + +/* Set properties of a table column based on the (magical) +** name of the column. +*/ +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ + if( sqlite3_strnicmp(pCol->zCnName, "__hidden__", 10)==0 ){ + pCol->colFlags |= COLFLAG_HIDDEN; + if( pTab ) pTab->tabFlags |= TF_HasHidden; + }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ + pTab->tabFlags |= TF_OOOHidden; + } +} +#endif + +/* +** Name of the special TEMP trigger used to implement RETURNING. The +** name begins with "sqlite_" so that it is guaranteed not to collide +** with any application-generated triggers. +*/ +#define RETURNING_TRIGGER_NAME "sqlite_returning" + +/* +** Clean up the data structures associated with the RETURNING clause. +*/ +static void sqlite3DeleteReturning(sqlite3 *db, Returning *pRet){ + Hash *pHash; + pHash = &(db->aDb[1].pSchema->trigHash); + sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, 0); + sqlite3ExprListDelete(db, pRet->pReturnEL); + sqlite3DbFree(db, pRet); +} + +/* +** Add the RETURNING clause to the parse currently underway. +** +** This routine creates a special TEMP trigger that will fire for each row +** of the DML statement. That TEMP trigger contains a single SELECT +** statement with a result set that is the argument of the RETURNING clause. +** The trigger has the Trigger.bReturning flag and an opcode of +** TK_RETURNING instead of TK_SELECT, so that the trigger code generator +** knows to handle it specially. The TEMP trigger is automatically +** removed at the end of the parse. +** +** When this routine is called, we do not yet know if the RETURNING clause +** is attached to a DELETE, INSERT, or UPDATE, so construct it as a +** RETURNING trigger instead. It will then be converted into the appropriate +** type on the first call to sqlite3TriggersExist(). +*/ +SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){ + Returning *pRet; + Hash *pHash; + sqlite3 *db = pParse->db; + if( pParse->pNewTrigger ){ + sqlite3ErrorMsg(pParse, "cannot use RETURNING in a trigger"); + }else{ + assert( pParse->bReturning==0 ); + } + pParse->bReturning = 1; + pRet = sqlite3DbMallocZero(db, sizeof(*pRet)); + if( pRet==0 ){ + sqlite3ExprListDelete(db, pList); + return; + } + pParse->u1.pReturning = pRet; + pRet->pParse = pParse; + pRet->pReturnEL = pList; + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3DeleteReturning, pRet); + testcase( pParse->earlyCleanup ); + if( db->mallocFailed ) return; + pRet->retTrig.zName = RETURNING_TRIGGER_NAME; + pRet->retTrig.op = TK_RETURNING; + pRet->retTrig.tr_tm = TRIGGER_AFTER; + pRet->retTrig.bReturning = 1; + pRet->retTrig.pSchema = db->aDb[1].pSchema; + pRet->retTrig.pTabSchema = db->aDb[1].pSchema; + pRet->retTrig.step_list = &pRet->retTStep; + pRet->retTStep.op = TK_RETURNING; + pRet->retTStep.pTrig = &pRet->retTrig; + pRet->retTStep.pExprList = pList; + pHash = &(db->aDb[1].pSchema->trigHash); + assert( sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME)==0 || pParse->nErr ); + if( sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, &pRet->retTrig) + ==&pRet->retTrig ){ + sqlite3OomFault(db); + } +} + +/* +** Add a new column to the table currently being constructed. +** +** The parser calls this routine once for each column declaration +** in a CREATE TABLE statement. sqlite3StartTable() gets called +** first to get things going. Then this routine is called for each +** column. +*/ +SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ + Table *p; + int i; + char *z; + char *zType; + Column *pCol; + sqlite3 *db = pParse->db; + u8 hName; + Column *aNew; + u8 eType = COLTYPE_CUSTOM; + u8 szEst = 1; + char affinity = SQLITE_AFF_BLOB; + + if( (p = pParse->pNewTable)==0 ) return; + if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); + return; + } + if( !IN_RENAME_OBJECT ) sqlite3DequoteToken(&sName); + + /* Because keywords GENERATE ALWAYS can be converted into indentifiers + ** by the parser, we can sometimes end up with a typename that ends + ** with "generated always". Check for this case and omit the surplus + ** text. */ + if( sType.n>=16 + && sqlite3_strnicmp(sType.z+(sType.n-6),"always",6)==0 + ){ + sType.n -= 6; + while( ALWAYS(sType.n>0) && sqlite3Isspace(sType.z[sType.n-1]) ) sType.n--; + if( sType.n>=9 + && sqlite3_strnicmp(sType.z+(sType.n-9),"generated",9)==0 + ){ + sType.n -= 9; + while( sType.n>0 && sqlite3Isspace(sType.z[sType.n-1]) ) sType.n--; + } + } + + /* Check for standard typenames. For standard typenames we will + ** set the Column.eType field rather than storing the typename after + ** the column name, in order to save space. */ + if( sType.n>=3 ){ + sqlite3DequoteToken(&sType); + for(i=0; i0) ); + if( z==0 ) return; + if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, &sName); + memcpy(z, sName.z, sName.n); + z[sName.n] = 0; + sqlite3Dequote(z); + hName = sqlite3StrIHash(z); + for(i=0; inCol; i++){ + if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zCnName)==0 ){ + sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); + sqlite3DbFree(db, z); + return; + } + } + aNew = sqlite3DbRealloc(db,p->aCol,((i64)p->nCol+1)*sizeof(p->aCol[0])); + if( aNew==0 ){ + sqlite3DbFree(db, z); + return; + } + p->aCol = aNew; + pCol = &p->aCol[p->nCol]; + memset(pCol, 0, sizeof(p->aCol[0])); + pCol->zCnName = z; + pCol->hName = hName; + sqlite3ColumnPropertiesFromName(p, pCol); + + if( sType.n==0 ){ + /* If there is no type specified, columns have the default affinity + ** 'BLOB' with a default size of 4 bytes. */ + pCol->affinity = affinity; + pCol->eCType = eType; + pCol->szEst = szEst; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( affinity==SQLITE_AFF_BLOB ){ + if( 4>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } + } +#endif + }else{ + zType = z + sqlite3Strlen30(z) + 1; + memcpy(zType, sType.z, sType.n); + zType[sType.n] = 0; + sqlite3Dequote(zType); + pCol->affinity = sqlite3AffinityType(zType, pCol); + pCol->colFlags |= COLFLAG_HASTYPE; + } + p->nCol++; + p->nNVCol++; + pParse->constraintName.n = 0; +} + +/* +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. A "NOT NULL" constraint has +** been seen on a column. This routine sets the notNull flag on +** the column currently under construction. +*/ +SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ + Table *p; + Column *pCol; + p = pParse->pNewTable; + if( p==0 || NEVER(p->nCol<1) ) return; + pCol = &p->aCol[p->nCol-1]; + pCol->notNull = (u8)onError; + p->tabFlags |= TF_HasNotNull; + + /* Set the uniqNotNull flag on any UNIQUE or PK indexes already created + ** on this column. */ + if( pCol->colFlags & COLFLAG_UNIQUE ){ + Index *pIdx; + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nKeyCol==1 && pIdx->onError!=OE_None ); + if( pIdx->aiColumn[0]==p->nCol-1 ){ + pIdx->uniqNotNull = 1; + } + } + } +} + +/* +** Scan the column type name zType (length nType) and return the +** associated affinity type. +** +** This routine does a case-independent search of zType for the +** substrings in the following table. If one of the substrings is +** found, the corresponding affinity is returned. If zType contains +** more than one of the substrings, entries toward the top of +** the table take priority. For example, if zType is 'BLOBINT', +** SQLITE_AFF_INTEGER is returned. +** +** Substring | Affinity +** -------------------------------- +** 'INT' | SQLITE_AFF_INTEGER +** 'CHAR' | SQLITE_AFF_TEXT +** 'CLOB' | SQLITE_AFF_TEXT +** 'TEXT' | SQLITE_AFF_TEXT +** 'BLOB' | SQLITE_AFF_BLOB +** 'REAL' | SQLITE_AFF_REAL +** 'FLOA' | SQLITE_AFF_REAL +** 'DOUB' | SQLITE_AFF_REAL +** +** If none of the substrings in the above table are found, +** SQLITE_AFF_NUMERIC is returned. +*/ +SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){ + u32 h = 0; + char aff = SQLITE_AFF_NUMERIC; + const char *zChar = 0; + + assert( zIn!=0 ); + while( zIn[0] ){ + h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff]; + zIn++; + if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ + aff = SQLITE_AFF_TEXT; + zChar = zIn; + }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */ + aff = SQLITE_AFF_TEXT; + }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */ + && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){ + aff = SQLITE_AFF_BLOB; + if( zIn[0]=='(' ) zChar = zIn; +#ifndef SQLITE_OMIT_FLOATING_POINT + }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; + }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */ + && aff==SQLITE_AFF_NUMERIC ){ + aff = SQLITE_AFF_REAL; +#endif + }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */ + aff = SQLITE_AFF_INTEGER; + break; + } + } + + /* If pCol is not NULL, store an estimate of the field size. The + ** estimate is scaled so that the size of an integer is 1. */ + if( pCol ){ + int v = 0; /* default size is approx 4 bytes */ + if( aff r=(k/4+1) */ + sqlite3GetInt32(zChar, &v); + break; + } + zChar++; + } + }else{ + v = 16; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/ + } + } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( v>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } +#endif + v = v/4 + 1; + if( v>255 ) v = 255; + pCol->szEst = v; + } + return aff; +} + +/* +** The expression is the default value for the most recently added column +** of the table currently under construction. +** +** Default value expressions must be constant. Raise an exception if this +** is not the case. +** +** This routine is called by the parser while in the middle of +** parsing a CREATE TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3AddDefaultValue( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The parsed expression of the default value */ + const char *zStart, /* Start of the default value text */ + const char *zEnd /* First character past end of defaut value text */ +){ + Table *p; + Column *pCol; + sqlite3 *db = pParse->db; + p = pParse->pNewTable; + if( p!=0 ){ + int isInit = db->init.busy && db->init.iDb!=1; + pCol = &(p->aCol[p->nCol-1]); + if( !sqlite3ExprIsConstantOrFunction(pExpr, isInit) ){ + sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", + pCol->zCnName); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, "cannot use DEFAULT on a generated column"); +#endif + }else{ + /* A copy of pExpr is used instead of the original, as pExpr contains + ** tokens that point to volatile memory. + */ + Expr x, *pDfltExpr; + memset(&x, 0, sizeof(x)); + x.op = TK_SPAN; + x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd); + x.pLeft = pExpr; + x.flags = EP_Skip; + pDfltExpr = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE); + sqlite3DbFree(db, x.u.zToken); + sqlite3ColumnSetExpr(pParse, p, pCol, pDfltExpr); + } + } + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } + sqlite3ExprDelete(db, pExpr); +} + +/* +** Backwards Compatibility Hack: +** +** Historical versions of SQLite accepted strings as column names in +** indexes and PRIMARY KEY constraints and in UNIQUE constraints. Example: +** +** CREATE TABLE xyz(a,b,c,d,e,PRIMARY KEY('a'),UNIQUE('b','c' COLLATE trim) +** CREATE INDEX abc ON xyz('c','d' DESC,'e' COLLATE nocase DESC); +** +** This is goofy. But to preserve backwards compatibility we continue to +** accept it. This routine does the necessary conversion. It converts +** the expression given in its argument from a TK_STRING into a TK_ID +** if the expression is just a TK_STRING with an optional COLLATE clause. +** If the expression is anything other than TK_STRING, the expression is +** unchanged. +*/ +static void sqlite3StringToId(Expr *p){ + if( p->op==TK_STRING ){ + p->op = TK_ID; + }else if( p->op==TK_COLLATE && p->pLeft->op==TK_STRING ){ + p->pLeft->op = TK_ID; + } +} + +/* +** Tag the given column as being part of the PRIMARY KEY +*/ +static void makeColumnPartOfPrimaryKey(Parse *pParse, Column *pCol){ + pCol->colFlags |= COLFLAG_PRIMKEY; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "generated columns cannot be part of the PRIMARY KEY"); + } +#endif +} + +/* +** Designate the PRIMARY KEY for the table. pList is a list of names +** of columns that form the primary key. If pList is NULL, then the +** most recently added column of the table is the primary key. +** +** A table can have at most one primary key. If the table already has +** a primary key (and this is the second primary key) then create an +** error. +** +** If the PRIMARY KEY is on a single column whose datatype is INTEGER, +** then we will try to use that column as the rowid. Set the Table.iPKey +** field of the table under construction to be the index of the +** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is +** no INTEGER PRIMARY KEY. +** +** If the key is not an INTEGER PRIMARY KEY, then create a unique +** index for the key. No index is created for INTEGER PRIMARY KEYs. +*/ +SQLITE_PRIVATE void sqlite3AddPrimaryKey( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List of field names to be indexed */ + int onError, /* What to do with a uniqueness conflict */ + int autoInc, /* True if the AUTOINCREMENT keyword is present */ + int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ +){ + Table *pTab = pParse->pNewTable; + Column *pCol = 0; + int iCol = -1, i; + int nTerm; + if( pTab==0 ) goto primary_key_exit; + if( pTab->tabFlags & TF_HasPrimaryKey ){ + sqlite3ErrorMsg(pParse, + "table \"%s\" has more than one primary key", pTab->zName); + goto primary_key_exit; + } + pTab->tabFlags |= TF_HasPrimaryKey; + if( pList==0 ){ + iCol = pTab->nCol - 1; + pCol = &pTab->aCol[iCol]; + makeColumnPartOfPrimaryKey(pParse, pCol); + nTerm = 1; + }else{ + nTerm = pList->nExpr; + for(i=0; ia[i].pExpr); + assert( pCExpr!=0 ); + sqlite3StringToId(pCExpr); + if( pCExpr->op==TK_ID ){ + const char *zCName; + assert( !ExprHasProperty(pCExpr, EP_IntValue) ); + zCName = pCExpr->u.zToken; + for(iCol=0; iColnCol; iCol++){ + if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName)==0 ){ + pCol = &pTab->aCol[iCol]; + makeColumnPartOfPrimaryKey(pParse, pCol); + break; + } + } + } + } + } + if( nTerm==1 + && pCol + && pCol->eCType==COLTYPE_INTEGER + && sortOrder!=SQLITE_SO_DESC + ){ + if( IN_RENAME_OBJECT && pList ){ + Expr *pCExpr = sqlite3ExprSkipCollate(pList->a[0].pExpr); + sqlite3RenameTokenRemap(pParse, &pTab->iPKey, pCExpr); + } + pTab->iPKey = iCol; + pTab->keyConf = (u8)onError; + assert( autoInc==0 || autoInc==1 ); + pTab->tabFlags |= autoInc*TF_Autoincrement; + if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags; + (void)sqlite3HasExplicitNulls(pParse, pList); + }else if( autoInc ){ +#ifndef SQLITE_OMIT_AUTOINCREMENT + sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " + "INTEGER PRIMARY KEY"); +#endif + }else{ + sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, + 0, sortOrder, 0, SQLITE_IDXTYPE_PRIMARYKEY); + pList = 0; + } + +primary_key_exit: + sqlite3ExprListDelete(pParse->db, pList); + return; +} + +/* +** Add a new CHECK constraint to the table currently under construction. +*/ +SQLITE_PRIVATE void sqlite3AddCheckConstraint( + Parse *pParse, /* Parsing context */ + Expr *pCheckExpr, /* The check expression */ + const char *zStart, /* Opening "(" */ + const char *zEnd /* Closing ")" */ +){ +#ifndef SQLITE_OMIT_CHECK + Table *pTab = pParse->pNewTable; + sqlite3 *db = pParse->db; + if( pTab && !IN_DECLARE_VTAB + && !sqlite3BtreeIsReadonly(db->aDb[db->init.iDb].pBt) + ){ + pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr); + if( pParse->constraintName.n ){ + sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); + }else{ + Token t; + for(zStart++; sqlite3Isspace(zStart[0]); zStart++){} + while( sqlite3Isspace(zEnd[-1]) ){ zEnd--; } + t.z = zStart; + t.n = (int)(zEnd - t.z); + sqlite3ExprListSetName(pParse, pTab->pCheck, &t, 1); + } + }else +#endif + { + sqlite3ExprDelete(pParse->db, pCheckExpr); + } +} + +/* +** Set the collation function of the most recently parsed table column +** to the CollSeq given. +*/ +SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){ + Table *p; + int i; + char *zColl; /* Dequoted name of collation sequence */ + sqlite3 *db; + + if( (p = pParse->pNewTable)==0 || IN_RENAME_OBJECT ) return; + i = p->nCol-1; + db = pParse->db; + zColl = sqlite3NameFromToken(db, pToken); + if( !zColl ) return; + + if( sqlite3LocateCollSeq(pParse, zColl) ){ + Index *pIdx; + sqlite3ColumnSetColl(db, &p->aCol[i], zColl); + + /* If the column is declared as " PRIMARY KEY COLLATE ", + ** then an index may have been created on this column before the + ** collation type was added. Correct this if it is the case. + */ + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nKeyCol==1 ); + if( pIdx->aiColumn[0]==i ){ + pIdx->azColl[0] = sqlite3ColumnColl(&p->aCol[i]); + } + } + } + sqlite3DbFree(db, zColl); +} + +/* Change the most recently parsed column to be a GENERATED ALWAYS AS +** column. +*/ +SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + u8 eType = COLFLAG_VIRTUAL; + Table *pTab = pParse->pNewTable; + Column *pCol; + if( pTab==0 ){ + /* generated column in an CREATE TABLE IF NOT EXISTS that already exists */ + goto generated_done; + } + pCol = &(pTab->aCol[pTab->nCol-1]); + if( IN_DECLARE_VTAB ){ + sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns"); + goto generated_done; + } + if( pCol->iDflt>0 ) goto generated_error; + if( pType ){ + if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){ + /* no-op */ + }else if( pType->n==6 && sqlite3StrNICmp("stored",pType->z,6)==0 ){ + eType = COLFLAG_STORED; + }else{ + goto generated_error; + } + } + if( eType==COLFLAG_VIRTUAL ) pTab->nNVCol--; + pCol->colFlags |= eType; + assert( TF_HasVirtual==COLFLAG_VIRTUAL ); + assert( TF_HasStored==COLFLAG_STORED ); + pTab->tabFlags |= eType; + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */ + } + sqlite3ColumnSetExpr(pParse, pTab, pCol, pExpr); + pExpr = 0; + goto generated_done; + +generated_error: + sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", + pCol->zCnName); +generated_done: + sqlite3ExprDelete(pParse->db, pExpr); +#else + /* Throw and error for the GENERATED ALWAYS AS clause if the + ** SQLITE_OMIT_GENERATED_COLUMNS compile-time option is used. */ + sqlite3ErrorMsg(pParse, "generated columns not supported"); + sqlite3ExprDelete(pParse->db, pExpr); +#endif +} + +/* +** Generate code that will increment the schema cookie. +** +** The schema cookie is used to determine when the schema for the +** database changes. After each schema change, the cookie value +** changes. When a process first reads the schema it records the +** cookie. Thereafter, whenever it goes to access the database, +** it checks the cookie to make sure the schema has not changed +** since it was last read. +** +** This plan is not completely bullet-proof. It is possible for +** the schema to change multiple times and for the cookie to be +** set back to prior value. But schema changes are infrequent +** and the probability of hitting the same cookie value is only +** 1 chance in 2^32. So we're safe enough. +** +** IMPLEMENTATION-OF: R-34230-56049 SQLite automatically increments +** the schema-version whenever the schema changes. +*/ +SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){ + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, + (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie)); +} + +/* +** Measure the number of characters needed to output the given +** identifier. The number returned includes any quotes used +** but does not include the null terminator. +** +** The estimate is conservative. It might be larger that what is +** really needed. +*/ +static int identLength(const char *z){ + int n; + for(n=0; *z; n++, z++){ + if( *z=='"' ){ n++; } + } + return n + 2; +} + +/* +** The first parameter is a pointer to an output buffer. The second +** parameter is a pointer to an integer that contains the offset at +** which to write into the output buffer. This function copies the +** nul-terminated string pointed to by the third parameter, zSignedIdent, +** to the specified offset in the buffer and updates *pIdx to refer +** to the first byte after the last byte written before returning. +** +** If the string zSignedIdent consists entirely of alpha-numeric +** characters, does not begin with a digit and is not an SQL keyword, +** then it is copied to the output buffer exactly as it is. Otherwise, +** it is quoted using double-quotes. +*/ +static void identPut(char *z, int *pIdx, char *zSignedIdent){ + unsigned char *zIdent = (unsigned char*)zSignedIdent; + int i, j, needQuote; + i = *pIdx; + + for(j=0; zIdent[j]; j++){ + if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break; + } + needQuote = sqlite3Isdigit(zIdent[0]) + || sqlite3KeywordCode(zIdent, j)!=TK_ID + || zIdent[j]!=0 + || j==0; + + if( needQuote ) z[i++] = '"'; + for(j=0; zIdent[j]; j++){ + z[i++] = zIdent[j]; + if( zIdent[j]=='"' ) z[i++] = '"'; + } + if( needQuote ) z[i++] = '"'; + z[i] = 0; + *pIdx = i; +} + +/* +** Generate a CREATE TABLE statement appropriate for the given +** table. Memory to hold the text of the statement is obtained +** from sqliteMalloc() and must be freed by the calling function. +*/ +static char *createTableStmt(sqlite3 *db, Table *p){ + int i, k, n; + char *zStmt; + char *zSep, *zSep2, *zEnd; + Column *pCol; + n = 0; + for(pCol = p->aCol, i=0; inCol; i++, pCol++){ + n += identLength(pCol->zCnName) + 5; + } + n += identLength(p->zName); + if( n<50 ){ + zSep = ""; + zSep2 = ","; + zEnd = ")"; + }else{ + zSep = "\n "; + zSep2 = ",\n "; + zEnd = "\n)"; + } + n += 35 + 6*p->nCol; + zStmt = sqlite3DbMallocRaw(0, n); + if( zStmt==0 ){ + sqlite3OomFault(db); + return 0; + } + sqlite3_snprintf(n, zStmt, "CREATE TABLE "); + k = sqlite3Strlen30(zStmt); + identPut(zStmt, &k, p->zName); + zStmt[k++] = '('; + for(pCol=p->aCol, i=0; inCol; i++, pCol++){ + static const char * const azType[] = { + /* SQLITE_AFF_BLOB */ "", + /* SQLITE_AFF_TEXT */ " TEXT", + /* SQLITE_AFF_NUMERIC */ " NUM", + /* SQLITE_AFF_INTEGER */ " INT", + /* SQLITE_AFF_REAL */ " REAL" + }; + int len; + const char *zType; + + sqlite3_snprintf(n-k, &zStmt[k], zSep); + k += sqlite3Strlen30(&zStmt[k]); + zSep = zSep2; + identPut(zStmt, &k, pCol->zCnName); + assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 ); + assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) ); + testcase( pCol->affinity==SQLITE_AFF_BLOB ); + testcase( pCol->affinity==SQLITE_AFF_TEXT ); + testcase( pCol->affinity==SQLITE_AFF_NUMERIC ); + testcase( pCol->affinity==SQLITE_AFF_INTEGER ); + testcase( pCol->affinity==SQLITE_AFF_REAL ); + + zType = azType[pCol->affinity - SQLITE_AFF_BLOB]; + len = sqlite3Strlen30(zType); + assert( pCol->affinity==SQLITE_AFF_BLOB + || pCol->affinity==sqlite3AffinityType(zType, 0) ); + memcpy(&zStmt[k], zType, len); + k += len; + assert( k<=n ); + } + sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); + return zStmt; +} + +/* +** Resize an Index object to hold N columns total. Return SQLITE_OK +** on success and SQLITE_NOMEM on an OOM error. +*/ +static int resizeIndexObject(sqlite3 *db, Index *pIdx, int N){ + char *zExtra; + int nByte; + if( pIdx->nColumn>=N ) return SQLITE_OK; + assert( pIdx->isResized==0 ); + nByte = (sizeof(char*) + sizeof(LogEst) + sizeof(i16) + 1)*N; + zExtra = sqlite3DbMallocZero(db, nByte); + if( zExtra==0 ) return SQLITE_NOMEM_BKPT; + memcpy(zExtra, pIdx->azColl, sizeof(char*)*pIdx->nColumn); + pIdx->azColl = (const char**)zExtra; + zExtra += sizeof(char*)*N; + memcpy(zExtra, pIdx->aiRowLogEst, sizeof(LogEst)*(pIdx->nKeyCol+1)); + pIdx->aiRowLogEst = (LogEst*)zExtra; + zExtra += sizeof(LogEst)*N; + memcpy(zExtra, pIdx->aiColumn, sizeof(i16)*pIdx->nColumn); + pIdx->aiColumn = (i16*)zExtra; + zExtra += sizeof(i16)*N; + memcpy(zExtra, pIdx->aSortOrder, pIdx->nColumn); + pIdx->aSortOrder = (u8*)zExtra; + pIdx->nColumn = N; + pIdx->isResized = 1; + return SQLITE_OK; +} + +/* +** Estimate the total row width for a table. +*/ +static void estimateTableWidth(Table *pTab){ + unsigned wTable = 0; + const Column *pTabCol; + int i; + for(i=pTab->nCol, pTabCol=pTab->aCol; i>0; i--, pTabCol++){ + wTable += pTabCol->szEst; + } + if( pTab->iPKey<0 ) wTable++; + pTab->szTabRow = sqlite3LogEst(wTable*4); +} + +/* +** Estimate the average size of a row for an index. +*/ +static void estimateIndexWidth(Index *pIdx){ + unsigned wIndex = 0; + int i; + const Column *aCol = pIdx->pTable->aCol; + for(i=0; inColumn; i++){ + i16 x = pIdx->aiColumn[i]; + assert( xpTable->nCol ); + wIndex += x<0 ? 1 : aCol[pIdx->aiColumn[i]].szEst; + } + pIdx->szIdxRow = sqlite3LogEst(wIndex*4); +} + +/* Return true if column number x is any of the first nCol entries of aiCol[]. +** This is used to determine if the column number x appears in any of the +** first nCol entries of an index. +*/ +static int hasColumn(const i16 *aiCol, int nCol, int x){ + while( nCol-- > 0 ){ + if( x==*(aiCol++) ){ + return 1; + } + } + return 0; +} + +/* +** Return true if any of the first nKey entries of index pIdx exactly +** match the iCol-th entry of pPk. pPk is always a WITHOUT ROWID +** PRIMARY KEY index. pIdx is an index on the same table. pIdx may +** or may not be the same index as pPk. +** +** The first nKey entries of pIdx are guaranteed to be ordinary columns, +** not a rowid or expression. +** +** This routine differs from hasColumn() in that both the column and the +** collating sequence must match for this routine, but for hasColumn() only +** the column name must match. +*/ +static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){ + int i, j; + assert( nKey<=pIdx->nColumn ); + assert( iColnColumn,pPk->nKeyCol) ); + assert( pPk->idxType==SQLITE_IDXTYPE_PRIMARYKEY ); + assert( pPk->pTable->tabFlags & TF_WithoutRowid ); + assert( pPk->pTable==pIdx->pTable ); + testcase( pPk==pIdx ); + j = pPk->aiColumn[iCol]; + assert( j!=XN_ROWID && j!=XN_EXPR ); + for(i=0; iaiColumn[i]>=0 || j>=0 ); + if( pIdx->aiColumn[i]==j + && sqlite3StrICmp(pIdx->azColl[i], pPk->azColl[iCol])==0 + ){ + return 1; + } + } + return 0; +} + +/* Recompute the colNotIdxed field of the Index. +** +** colNotIdxed is a bitmask that has a 0 bit representing each indexed +** columns that are within the first 63 columns of the table. The +** high-order bit of colNotIdxed is always 1. All unindexed columns +** of the table have a 1. +** +** 2019-10-24: For the purpose of this computation, virtual columns are +** not considered to be covered by the index, even if they are in the +** index, because we do not trust the logic in whereIndexExprTrans() to be +** able to find all instances of a reference to the indexed table column +** and convert them into references to the index. Hence we always want +** the actual table at hand in order to recompute the virtual column, if +** necessary. +** +** The colNotIdxed mask is AND-ed with the SrcList.a[].colUsed mask +** to determine if the index is covering index. +*/ +static void recomputeColumnsNotIndexed(Index *pIdx){ + Bitmask m = 0; + int j; + Table *pTab = pIdx->pTable; + for(j=pIdx->nColumn-1; j>=0; j--){ + int x = pIdx->aiColumn[j]; + if( x>=0 && (pTab->aCol[x].colFlags & COLFLAG_VIRTUAL)==0 ){ + testcase( x==BMS-1 ); + testcase( x==BMS-2 ); + if( xcolNotIdxed = ~m; + assert( (pIdx->colNotIdxed>>63)==1 ); +} + +/* +** This routine runs at the end of parsing a CREATE TABLE statement that +** has a WITHOUT ROWID clause. The job of this routine is to convert both +** internal schema data structures and the generated VDBE code so that they +** are appropriate for a WITHOUT ROWID table instead of a rowid table. +** Changes include: +** +** (1) Set all columns of the PRIMARY KEY schema object to be NOT NULL. +** (2) Convert P3 parameter of the OP_CreateBtree from BTREE_INTKEY +** into BTREE_BLOBKEY. +** (3) Bypass the creation of the sqlite_schema table entry +** for the PRIMARY KEY as the primary key index is now +** identified by the sqlite_schema table entry of the table itself. +** (4) Set the Index.tnum of the PRIMARY KEY Index object in the +** schema to the rootpage from the main table. +** (5) Add all table columns to the PRIMARY KEY Index object +** so that the PRIMARY KEY is a covering index. The surplus +** columns are part of KeyInfo.nAllField and are not used for +** sorting or lookup or uniqueness checks. +** (6) Replace the rowid tail on all automatically generated UNIQUE +** indices with the PRIMARY KEY columns. +** +** For virtual tables, only (1) is performed. +*/ +static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ + Index *pIdx; + Index *pPk; + int nPk; + int nExtra; + int i, j; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + + /* Mark every PRIMARY KEY column as NOT NULL (except for imposter tables) + */ + if( !db->init.imposterTable ){ + for(i=0; inCol; i++){ + if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 + && (pTab->aCol[i].notNull==OE_None) + ){ + pTab->aCol[i].notNull = OE_Abort; + } + } + pTab->tabFlags |= TF_HasNotNull; + } + + /* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY + ** into BTREE_BLOBKEY. + */ + assert( !pParse->bReturning ); + if( pParse->u1.addrCrTab ){ + assert( v ); + sqlite3VdbeChangeP3(v, pParse->u1.addrCrTab, BTREE_BLOBKEY); + } + + /* Locate the PRIMARY KEY index. Or, if this table was originally + ** an INTEGER PRIMARY KEY table, create a new PRIMARY KEY index. + */ + if( pTab->iPKey>=0 ){ + ExprList *pList; + Token ipkToken; + sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zCnName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); + if( pList==0 ){ + pTab->tabFlags &= ~TF_WithoutRowid; + return; + } + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); + } + pList->a[0].fg.sortFlags = pParse->iPkSortOrder; + assert( pParse->pNewTable==pTab ); + pTab->iPKey = -1; + sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, + SQLITE_IDXTYPE_PRIMARYKEY); + if( pParse->nErr ){ + pTab->tabFlags &= ~TF_WithoutRowid; + return; + } + assert( db->mallocFailed==0 ); + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk->nKeyCol==1 ); + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + + /* + ** Remove all redundant columns from the PRIMARY KEY. For example, change + ** "PRIMARY KEY(a,b,a,b,c,b,c,d)" into just "PRIMARY KEY(a,b,c,d)". Later + ** code assumes the PRIMARY KEY contains no repeated columns. + */ + for(i=j=1; inKeyCol; i++){ + if( isDupColumn(pPk, j, pPk, i) ){ + pPk->nColumn--; + }else{ + testcase( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ); + pPk->azColl[j] = pPk->azColl[i]; + pPk->aSortOrder[j] = pPk->aSortOrder[i]; + pPk->aiColumn[j++] = pPk->aiColumn[i]; + } + } + pPk->nKeyCol = j; + } + assert( pPk!=0 ); + pPk->isCovering = 1; + if( !db->init.imposterTable ) pPk->uniqNotNull = 1; + nPk = pPk->nColumn = pPk->nKeyCol; + + /* Bypass the creation of the PRIMARY KEY btree and the sqlite_schema + ** table entry. This is only required if currently generating VDBE + ** code for a CREATE TABLE (not when parsing one as part of reading + ** a database schema). */ + if( v && pPk->tnum>0 ){ + assert( db->init.busy==0 ); + sqlite3VdbeChangeOpcode(v, (int)pPk->tnum, OP_Goto); + } + + /* The root page of the PRIMARY KEY is the table root page */ + pPk->tnum = pTab->tnum; + + /* Update the in-memory representation of all UNIQUE indices by converting + ** the final rowid column into one or more columns of the PRIMARY KEY. + */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int n; + if( IsPrimaryKeyIndex(pIdx) ) continue; + for(i=n=0; inKeyCol, pPk, i) ){ + testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); + n++; + } + } + if( n==0 ){ + /* This index is a superset of the primary key */ + pIdx->nColumn = pIdx->nKeyCol; + continue; + } + if( resizeIndexObject(db, pIdx, pIdx->nKeyCol+n) ) return; + for(i=0, j=pIdx->nKeyCol; inKeyCol, pPk, i) ){ + testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); + pIdx->aiColumn[j] = pPk->aiColumn[i]; + pIdx->azColl[j] = pPk->azColl[i]; + if( pPk->aSortOrder[i] ){ + /* See ticket https://www.sqlite.org/src/info/bba7b69f9849b5bf */ + pIdx->bAscKeyBug = 1; + } + j++; + } + } + assert( pIdx->nColumn>=pIdx->nKeyCol+n ); + assert( pIdx->nColumn>=j ); + } + + /* Add all table columns to the PRIMARY KEY index + */ + nExtra = 0; + for(i=0; inCol; i++){ + if( !hasColumn(pPk->aiColumn, nPk, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) nExtra++; + } + if( resizeIndexObject(db, pPk, nPk+nExtra) ) return; + for(i=0, j=nPk; inCol; i++){ + if( !hasColumn(pPk->aiColumn, j, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 + ){ + assert( jnColumn ); + pPk->aiColumn[j] = i; + pPk->azColl[j] = sqlite3StrBINARY; + j++; + } + } + assert( pPk->nColumn==j ); + assert( pTab->nNVCol<=j ); + recomputeColumnsNotIndexed(pPk); +} + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if pTab is a virtual table and zName is a shadow table name +** for that virtual table. +*/ +SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){ + int nName; /* Length of zName */ + Module *pMod; /* Module for the virtual table */ + + if( !IsVirtual(pTab) ) return 0; + nName = sqlite3Strlen30(pTab->zName); + if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0; + if( zName[nName]!='_' ) return 0; + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->u.vtab.azArg[0]); + if( pMod==0 ) return 0; + if( pMod->pModule->iVersion<3 ) return 0; + if( pMod->pModule->xShadowName==0 ) return 0; + return pMod->pModule->xShadowName(zName+nName+1); +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Table pTab is a virtual table. If it the virtual table implementation +** exists and has an xShadowName method, then loop over all other ordinary +** tables within the same schema looking for shadow tables of pTab, and mark +** any shadow tables seen using the TF_Shadow flag. +*/ +SQLITE_PRIVATE void sqlite3MarkAllShadowTablesOf(sqlite3 *db, Table *pTab){ + int nName; /* Length of pTab->zName */ + Module *pMod; /* Module for the virtual table */ + HashElem *k; /* For looping through the symbol table */ + + assert( IsVirtual(pTab) ); + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->u.vtab.azArg[0]); + if( pMod==0 ) return; + if( NEVER(pMod->pModule==0) ) return; + if( pMod->pModule->iVersion<3 ) return; + if( pMod->pModule->xShadowName==0 ) return; + assert( pTab->zName!=0 ); + nName = sqlite3Strlen30(pTab->zName); + for(k=sqliteHashFirst(&pTab->pSchema->tblHash); k; k=sqliteHashNext(k)){ + Table *pOther = sqliteHashData(k); + assert( pOther->zName!=0 ); + if( !IsOrdinaryTable(pOther) ) continue; + if( pOther->tabFlags & TF_Shadow ) continue; + if( sqlite3StrNICmp(pOther->zName, pTab->zName, nName)==0 + && pOther->zName[nName]=='_' + && pMod->pModule->xShadowName(pOther->zName+nName+1) + ){ + pOther->tabFlags |= TF_Shadow; + } + } +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if zName is a shadow table name in the current database +** connection. +** +** zName is temporarily modified while this routine is running, but is +** restored to its original value prior to this routine returning. +*/ +SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ + char *zTail; /* Pointer to the last "_" in zName */ + Table *pTab; /* Table that zName is a shadow of */ + zTail = strrchr(zName, '_'); + if( zTail==0 ) return 0; + *zTail = 0; + pTab = sqlite3FindTable(db, zName, 0); + *zTail = '_'; + if( pTab==0 ) return 0; + if( !IsVirtual(pTab) ) return 0; + return sqlite3IsShadowTableOf(db, pTab, zName); +} +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + + +#ifdef SQLITE_DEBUG +/* +** Mark all nodes of an expression as EP_Immutable, indicating that +** they should not be changed. Expressions attached to a table or +** index definition are tagged this way to help ensure that we do +** not pass them into code generator routines by mistake. +*/ +static int markImmutableExprStep(Walker *pWalker, Expr *pExpr){ + ExprSetVVAProperty(pExpr, EP_Immutable); + return WRC_Continue; +} +static void markExprListImmutable(ExprList *pList){ + if( pList ){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = markImmutableExprStep; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback2 = 0; + sqlite3WalkExprList(&w, pList); + } +} +#else +#define markExprListImmutable(X) /* no-op */ +#endif /* SQLITE_DEBUG */ + + +/* +** This routine is called to report the final ")" that terminates +** a CREATE TABLE statement. +** +** The table structure that other action routines have been building +** is added to the internal hash tables, assuming no errors have +** occurred. +** +** An entry for the table is made in the schema table on disk, unless +** this is a temporary table or db->init.busy==1. When db->init.busy==1 +** it means we are reading the sqlite_schema table because we just +** connected to the database or because the sqlite_schema table has +** recently changed, so the entry for this table already exists in +** the sqlite_schema table. We do not want to create it again. +** +** If the pSelect argument is not NULL, it means that this routine +** was called to create a table generated from a +** "CREATE TABLE ... AS SELECT ..." statement. The column names of +** the new table will match the result set of the SELECT. +*/ +SQLITE_PRIVATE void sqlite3EndTable( + Parse *pParse, /* Parse context */ + Token *pCons, /* The ',' token after the last column defn. */ + Token *pEnd, /* The ')' before options in the CREATE TABLE */ + u32 tabOpts, /* Extra table options. Usually 0. */ + Select *pSelect /* Select from a "CREATE ... AS SELECT" */ +){ + Table *p; /* The new table */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb; /* Database in which the table lives */ + Index *pIdx; /* An implied index of the table */ + + if( pEnd==0 && pSelect==0 ){ + return; + } + p = pParse->pNewTable; + if( p==0 ) return; + + if( pSelect==0 && sqlite3ShadowTableName(db, p->zName) ){ + p->tabFlags |= TF_Shadow; + } + + /* If the db->init.busy is 1 it means we are reading the SQL off the + ** "sqlite_schema" or "sqlite_temp_schema" table on the disk. + ** So do not write to the disk again. Extract the root page number + ** for the table from the db->init.newTnum field. (The page number + ** should have been put there by the sqliteOpenCb routine.) + ** + ** If the root page number is 1, that means this is the sqlite_schema + ** table itself. So mark it read-only. + */ + if( db->init.busy ){ + if( pSelect || (!IsOrdinaryTable(p) && db->init.newTnum) ){ + sqlite3ErrorMsg(pParse, ""); + return; + } + p->tnum = db->init.newTnum; + if( p->tnum==1 ) p->tabFlags |= TF_Readonly; + } + + /* Special processing for tables that include the STRICT keyword: + ** + ** * Do not allow custom column datatypes. Every column must have + ** a datatype that is one of INT, INTEGER, REAL, TEXT, or BLOB. + ** + ** * If a PRIMARY KEY is defined, other than the INTEGER PRIMARY KEY, + ** then all columns of the PRIMARY KEY must have a NOT NULL + ** constraint. + */ + if( tabOpts & TF_Strict ){ + int ii; + p->tabFlags |= TF_Strict; + for(ii=0; iinCol; ii++){ + Column *pCol = &p->aCol[ii]; + if( pCol->eCType==COLTYPE_CUSTOM ){ + if( pCol->colFlags & COLFLAG_HASTYPE ){ + sqlite3ErrorMsg(pParse, + "unknown datatype for %s.%s: \"%s\"", + p->zName, pCol->zCnName, sqlite3ColumnType(pCol, "") + ); + }else{ + sqlite3ErrorMsg(pParse, "missing datatype for %s.%s", + p->zName, pCol->zCnName); + } + return; + }else if( pCol->eCType==COLTYPE_ANY ){ + pCol->affinity = SQLITE_AFF_BLOB; + } + if( (pCol->colFlags & COLFLAG_PRIMKEY)!=0 + && p->iPKey!=ii + && pCol->notNull == OE_None + ){ + pCol->notNull = OE_Abort; + p->tabFlags |= TF_HasNotNull; + } + } + } + + assert( (p->tabFlags & TF_HasPrimaryKey)==0 + || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); + assert( (p->tabFlags & TF_HasPrimaryKey)!=0 + || (p->iPKey<0 && sqlite3PrimaryKeyIndex(p)==0) ); + + /* Special processing for WITHOUT ROWID Tables */ + if( tabOpts & TF_WithoutRowid ){ + if( (p->tabFlags & TF_Autoincrement) ){ + sqlite3ErrorMsg(pParse, + "AUTOINCREMENT not allowed on WITHOUT ROWID tables"); + return; + } + if( (p->tabFlags & TF_HasPrimaryKey)==0 ){ + sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); + return; + } + p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; + convertToWithoutRowidTable(pParse, p); + } + iDb = sqlite3SchemaToIndex(db, p->pSchema); + +#ifndef SQLITE_OMIT_CHECK + /* Resolve names in all CHECK constraint expressions. + */ + if( p->pCheck ){ + sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); + if( pParse->nErr ){ + /* If errors are seen, delete the CHECK constraints now, else they might + ** actually be used if PRAGMA writable_schema=ON is set. */ + sqlite3ExprListDelete(db, p->pCheck); + p->pCheck = 0; + }else{ + markExprListImmutable(p->pCheck); + } + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( p->tabFlags & TF_HasGenerated ){ + int ii, nNG = 0; + testcase( p->tabFlags & TF_HasVirtual ); + testcase( p->tabFlags & TF_HasStored ); + for(ii=0; iinCol; ii++){ + u32 colFlags = p->aCol[ii].colFlags; + if( (colFlags & COLFLAG_GENERATED)!=0 ){ + Expr *pX = sqlite3ColumnExpr(p, &p->aCol[ii]); + testcase( colFlags & COLFLAG_VIRTUAL ); + testcase( colFlags & COLFLAG_STORED ); + if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){ + /* If there are errors in resolving the expression, change the + ** expression to a NULL. This prevents code generators that operate + ** on the expression from inserting extra parts into the expression + ** tree that have been allocated from lookaside memory, which is + ** illegal in a schema and will lead to errors or heap corruption + ** when the database connection closes. */ + sqlite3ColumnSetExpr(pParse, p, &p->aCol[ii], + sqlite3ExprAlloc(db, TK_NULL, 0, 0)); + } + }else{ + nNG++; + } + } + if( nNG==0 ){ + sqlite3ErrorMsg(pParse, "must have at least one non-generated column"); + return; + } + } +#endif + + /* Estimate the average row size for the table and for all implied indices */ + estimateTableWidth(p); + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + estimateIndexWidth(pIdx); + } + + /* If not initializing, then create a record for the new table + ** in the schema table of the database. + ** + ** If this is a TEMPORARY table, write the entry into the auxiliary + ** file instead of into the main database file. + */ + if( !db->init.busy ){ + int n; + Vdbe *v; + char *zType; /* "view" or "table" */ + char *zType2; /* "VIEW" or "TABLE" */ + char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */ + + v = sqlite3GetVdbe(pParse); + if( NEVER(v==0) ) return; + + sqlite3VdbeAddOp1(v, OP_Close, 0); + + /* + ** Initialize zType for the new view or table. + */ + if( IsOrdinaryTable(p) ){ + /* A regular table */ + zType = "table"; + zType2 = "TABLE"; +#ifndef SQLITE_OMIT_VIEW + }else{ + /* A view */ + zType = "view"; + zType2 = "VIEW"; +#endif + } + + /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT + ** statement to populate the new table. The root-page number for the + ** new table is in register pParse->regRoot. + ** + ** Once the SELECT has been coded by sqlite3Select(), it is in a + ** suitable state to query for the column names and types to be used + ** by the new table. + ** + ** A shared-cache write-lock is not required to write to the new table, + ** as a schema-lock must have already been obtained to create it. Since + ** a schema-lock excludes all other database users, the write-lock would + ** be redundant. + */ + if( pSelect ){ + SelectDest dest; /* Where the SELECT should store results */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int regRec; /* A record to be insert into the new table */ + int regRowid; /* Rowid of the next row to insert */ + int addrInsLoop; /* Top of the loop for inserting rows */ + Table *pSelTab; /* A table that describes the SELECT results */ + + if( IN_SPECIAL_PARSE ){ + pParse->rc = SQLITE_ERROR; + pParse->nErr++; + return; + } + regYield = ++pParse->nMem; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; + assert(pParse->nTab==1); + sqlite3MayAbort(pParse); + sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb); + sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); + pParse->nTab = 2; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + if( pParse->nErr ) return; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); + if( pSelTab==0 ) return; + assert( p->aCol==0 ); + p->nCol = p->nNVCol = pSelTab->nCol; + p->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + sqlite3DeleteTable(db, pSelTab); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + sqlite3Select(pParse, pSelect, &dest); + if( pParse->nErr ) return; + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); + addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec); + sqlite3TableAffinity(v, p, 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, 1, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, 1, regRec, regRowid); + sqlite3VdbeGoto(v, addrInsLoop); + sqlite3VdbeJumpHere(v, addrInsLoop); + sqlite3VdbeAddOp1(v, OP_Close, 1); + } + + /* Compute the complete text of the CREATE statement */ + if( pSelect ){ + zStmt = createTableStmt(db, p); + }else{ + Token *pEnd2 = tabOpts ? &pParse->sLastToken : pEnd; + n = (int)(pEnd2->z - pParse->sNameToken.z); + if( pEnd2->z[0]!=';' ) n += pEnd2->n; + zStmt = sqlite3MPrintf(db, + "CREATE %s %.*s", zType2, n, pParse->sNameToken.z + ); + } + + /* A slot for the record has already been allocated in the + ** schema table. We just need to update that slot with all + ** the information we've collected. + */ + sqlite3NestedParse(pParse, + "UPDATE %Q." LEGACY_SCHEMA_TABLE + " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" + " WHERE rowid=#%d", + db->aDb[iDb].zDbSName, + zType, + p->zName, + p->zName, + pParse->regRoot, + zStmt, + pParse->regRowid + ); + sqlite3DbFree(db, zStmt); + sqlite3ChangeCookie(pParse, iDb); + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Check to see if we need to create an sqlite_sequence table for + ** keeping track of autoincrement keys. + */ + if( (p->tabFlags & TF_Autoincrement)!=0 && !IN_SPECIAL_PARSE ){ + Db *pDb = &db->aDb[iDb]; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( pDb->pSchema->pSeqTab==0 ){ + sqlite3NestedParse(pParse, + "CREATE TABLE %Q.sqlite_sequence(name,seq)", + pDb->zDbSName + ); + } + } +#endif + + /* Reparse everything to update our internal data structures */ + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName),0); + } + + /* Add the table to the in-memory representation of the database. + */ + if( db->init.busy ){ + Table *pOld; + Schema *pSchema = p->pSchema; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( HasRowid(p) || p->iPKey<0 ); + pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, p); + if( pOld ){ + assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ + sqlite3OomFault(db); + return; + } + pParse->pNewTable = 0; + db->mDbFlags |= DBFLAG_SchemaChange; + + /* If this is the magic sqlite_sequence table used by autoincrement, + ** then record a pointer to this table in the main database structure + ** so that INSERT can find the table easily. */ + assert( !pParse->nested ); +#ifndef SQLITE_OMIT_AUTOINCREMENT + if( strcmp(p->zName, "sqlite_sequence")==0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + p->pSchema->pSeqTab = p; + } +#endif + } + +#ifndef SQLITE_OMIT_ALTERTABLE + if( !pSelect && IsOrdinaryTable(p) ){ + assert( pCons && pEnd ); + if( pCons->z==0 ){ + pCons = pEnd; + } + p->u.tab.addColOffset = 13 + (int)(pCons->z - pParse->sNameToken.z); + } +#endif +} + +#ifndef SQLITE_OMIT_VIEW +/* +** The parser calls this routine in order to create a new VIEW +*/ +SQLITE_PRIVATE void sqlite3CreateView( + Parse *pParse, /* The parsing context */ + Token *pBegin, /* The CREATE token that begins the statement */ + Token *pName1, /* The token that holds the name of the view */ + Token *pName2, /* The token that holds the name of the view */ + ExprList *pCNames, /* Optional list of view column names */ + Select *pSelect, /* A SELECT statement that will become the new view */ + int isTemp, /* TRUE for a TEMPORARY view */ + int noErr /* Suppress error messages if VIEW already exists */ +){ + Table *p; + int n; + const char *z; + Token sEnd; + DbFixer sFix; + Token *pName = 0; + int iDb; + sqlite3 *db = pParse->db; + + if( pParse->nVar>0 ){ + sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); + goto create_view_fail; + } + sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); + p = pParse->pNewTable; + if( p==0 || pParse->nErr ) goto create_view_fail; + + /* Legacy versions of SQLite allowed the use of the magic "rowid" column + ** on a view, even though views do not have rowids. The following flag + ** setting fixes this problem. But the fix can be disabled by compiling + ** with -DSQLITE_ALLOW_ROWID_IN_VIEW in case there are legacy apps that + ** depend upon the old buggy behavior. */ +#ifndef SQLITE_ALLOW_ROWID_IN_VIEW + p->tabFlags |= TF_NoVisibleRowid; +#endif + + sqlite3TwoPartName(pParse, pName1, pName2, &pName); + iDb = sqlite3SchemaToIndex(db, p->pSchema); + sqlite3FixInit(&sFix, pParse, iDb, "view", pName); + if( sqlite3FixSelect(&sFix, pSelect) ) goto create_view_fail; + + /* Make a copy of the entire SELECT statement that defines the view. + ** This will force all the Expr.token.z values to be dynamically + ** allocated rather than point to the input string - which means that + ** they will persist after the current sqlite3_exec() call returns. + */ + pSelect->selFlags |= SF_View; + if( IN_RENAME_OBJECT ){ + p->u.view.pSelect = pSelect; + pSelect = 0; + }else{ + p->u.view.pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + } + p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE); + p->eTabType = TABTYP_VIEW; + if( db->mallocFailed ) goto create_view_fail; + + /* Locate the end of the CREATE VIEW statement. Make sEnd point to + ** the end. + */ + sEnd = pParse->sLastToken; + assert( sEnd.z[0]!=0 || sEnd.n==0 ); + if( sEnd.z[0]!=';' ){ + sEnd.z += sEnd.n; + } + sEnd.n = 0; + n = (int)(sEnd.z - pBegin->z); + assert( n>0 ); + z = pBegin->z; + while( sqlite3Isspace(z[n-1]) ){ n--; } + sEnd.z = &z[n-1]; + sEnd.n = 1; + + /* Use sqlite3EndTable() to add the view to the schema table */ + sqlite3EndTable(pParse, 0, &sEnd, 0, 0); + +create_view_fail: + sqlite3SelectDelete(db, pSelect); + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprlistUnmap(pParse, pCNames); + } + sqlite3ExprListDelete(db, pCNames); + return; +} +#endif /* SQLITE_OMIT_VIEW */ + +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** The Table structure pTable is really a VIEW. Fill in the names of +** the columns of the view in the pTable structure. Return the number +** of errors. If an error is seen leave an error message in pParse->zErrMsg. +*/ +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ + Table *pSelTab; /* A fake table from which we get the result set */ + Select *pSel; /* Copy of the SELECT that implements the view */ + int nErr = 0; /* Number of errors encountered */ + sqlite3 *db = pParse->db; /* Database connection for malloc errors */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int rc; +#endif +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; /* Saved xAuth pointer */ +#endif + + assert( pTable ); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTable) ){ + db->nSchemaLock++; + rc = sqlite3VtabCallConnect(pParse, pTable); + db->nSchemaLock--; + return rc; + } +#endif + +#ifndef SQLITE_OMIT_VIEW + /* A positive nCol means the columns names for this view are + ** already known. + */ + if( pTable->nCol>0 ) return 0; + + /* A negative nCol is a special marker meaning that we are currently + ** trying to compute the column names. If we enter this routine with + ** a negative nCol, it means two or more views form a loop, like this: + ** + ** CREATE VIEW one AS SELECT * FROM two; + ** CREATE VIEW two AS SELECT * FROM one; + ** + ** Actually, the error above is now caught prior to reaching this point. + ** But the following test is still important as it does come up + ** in the following: + ** + ** CREATE TABLE main.ex1(a); + ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1; + ** SELECT * FROM temp.ex1; + */ + if( pTable->nCol<0 ){ + sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName); + return 1; + } + assert( pTable->nCol>=0 ); + + /* If we get this far, it means we need to compute the table names. + ** Note that the call to sqlite3ResultSetOfSelect() will expand any + ** "*" elements in the results set of the view and will assign cursors + ** to the elements of the FROM clause. But we do not want these changes + ** to be permanent. So the computation is done on a copy of the SELECT + ** statement that defines the view. + */ + assert( IsView(pTable) ); + pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0); + if( pSel ){ + u8 eParseMode = pParse->eParseMode; + int nTab = pParse->nTab; + int nSelect = pParse->nSelect; + pParse->eParseMode = PARSE_MODE_NORMAL; + sqlite3SrcListAssignCursors(pParse, pSel->pSrc); + pTable->nCol = -1; + DisableLookaside; +#ifndef SQLITE_OMIT_AUTHORIZATION + xAuth = db->xAuth; + db->xAuth = 0; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); + db->xAuth = xAuth; +#else + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); +#endif + pParse->nTab = nTab; + pParse->nSelect = nSelect; + if( pSelTab==0 ){ + pTable->nCol = 0; + nErr++; + }else if( pTable->pCheck ){ + /* CREATE VIEW name(arglist) AS ... + ** The names of the columns in the table are taken from + ** arglist which is stored in pTable->pCheck. The pCheck field + ** normally holds CHECK constraints on an ordinary table, but for + ** a VIEW it holds the list of column names. + */ + sqlite3ColumnsFromExprList(pParse, pTable->pCheck, + &pTable->nCol, &pTable->aCol); + if( pParse->nErr==0 + && pTable->nCol==pSel->pEList->nExpr + ){ + assert( db->mallocFailed==0 ); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, + SQLITE_AFF_NONE); + } + }else{ + /* CREATE VIEW name AS... without an argument list. Construct + ** the column names from the SELECT statement that defines the view. + */ + assert( pTable->aCol==0 ); + pTable->nCol = pSelTab->nCol; + pTable->aCol = pSelTab->aCol; + pTable->tabFlags |= (pSelTab->tabFlags & COLFLAG_NOINSERT); + pSelTab->nCol = 0; + pSelTab->aCol = 0; + assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); + } + pTable->nNVCol = pTable->nCol; + sqlite3DeleteTable(db, pSelTab); + sqlite3SelectDelete(db, pSel); + EnableLookaside; + pParse->eParseMode = eParseMode; + } else { + nErr++; + } + pTable->pSchema->schemaFlags |= DB_UnresetViews; + if( db->mallocFailed ){ + sqlite3DeleteColumnNames(db, pTable); + } +#endif /* SQLITE_OMIT_VIEW */ + return nErr; +} +#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifndef SQLITE_OMIT_VIEW +/* +** Clear the column names from every VIEW in database idx. +*/ +static void sqliteViewResetAll(sqlite3 *db, int idx){ + HashElem *i; + assert( sqlite3SchemaMutexHeld(db, idx, 0) ); + if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; + for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + if( IsView(pTab) ){ + sqlite3DeleteColumnNames(db, pTab); + } + } + DbClearProperty(db, idx, DB_UnresetViews); +} +#else +# define sqliteViewResetAll(A,B) +#endif /* SQLITE_OMIT_VIEW */ + +/* +** This function is called by the VDBE to adjust the internal schema +** used by SQLite when the btree layer moves a table root page. The +** root-page of a table or index in database iDb has changed from iFrom +** to iTo. +** +** Ticket #1728: The symbol table might still contain information +** on tables and/or indices that are the process of being deleted. +** If you are unlucky, one of those deleted indices or tables might +** have the same rootpage number as the real table or index that is +** being moved. So we cannot stop searching after the first match +** because the first match might be for one of the deleted indices +** or tables and not the table/index that is actually being moved. +** We must continue looping until all tables and indices with +** rootpage==iFrom have been converted to have a rootpage of iTo +** in order to be certain that we got the right one. +*/ +#ifndef SQLITE_OMIT_AUTOVACUUM +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, Pgno iFrom, Pgno iTo){ + HashElem *pElem; + Hash *pHash; + Db *pDb; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb = &db->aDb[iDb]; + pHash = &pDb->pSchema->tblHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + if( pTab->tnum==iFrom ){ + pTab->tnum = iTo; + } + } + pHash = &pDb->pSchema->idxHash; + for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ + Index *pIdx = sqliteHashData(pElem); + if( pIdx->tnum==iFrom ){ + pIdx->tnum = iTo; + } + } +} +#endif + +/* +** Write code to erase the table with root-page iTable from database iDb. +** Also write code to modify the sqlite_schema table and internal schema +** if a root-page of another table is moved by the btree-layer whilst +** erasing iTable (this can happen with an auto-vacuum database). +*/ +static void destroyRootPage(Parse *pParse, int iTable, int iDb){ + Vdbe *v = sqlite3GetVdbe(pParse); + int r1 = sqlite3GetTempReg(pParse); + if( iTable<2 ) sqlite3ErrorMsg(pParse, "corrupt schema"); + sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); + sqlite3MayAbort(pParse); +#ifndef SQLITE_OMIT_AUTOVACUUM + /* OP_Destroy stores an in integer r1. If this integer + ** is non-zero, then it is the root page number of a table moved to + ** location iTable. The following code modifies the sqlite_schema table to + ** reflect this. + ** + ** The "#NNN" in the SQL is a special constant that means whatever value + ** is in register NNN. See grammar rules associated with the TK_REGISTER + ** token for additional information. + */ + sqlite3NestedParse(pParse, + "UPDATE %Q." LEGACY_SCHEMA_TABLE + " SET rootpage=%d WHERE #%d AND rootpage=#%d", + pParse->db->aDb[iDb].zDbSName, iTable, r1, r1); +#endif + sqlite3ReleaseTempReg(pParse, r1); +} + +/* +** Write VDBE code to erase table pTab and all associated indices on disk. +** Code to update the sqlite_schema tables and internal schema definitions +** in case a root-page belonging to another table is moved by the btree layer +** is also added (this can happen with an auto-vacuum database). +*/ +static void destroyTable(Parse *pParse, Table *pTab){ + /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM + ** is not defined), then it is important to call OP_Destroy on the + ** table and index root-pages in order, starting with the numerically + ** largest root-page number. This guarantees that none of the root-pages + ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the + ** following were coded: + ** + ** OP_Destroy 4 0 + ** ... + ** OP_Destroy 5 0 + ** + ** and root page 5 happened to be the largest root-page number in the + ** database, then root page 5 would be moved to page 4 by the + ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit + ** a free-list page. + */ + Pgno iTab = pTab->tnum; + Pgno iDestroyed = 0; + + while( 1 ){ + Index *pIdx; + Pgno iLargest = 0; + + if( iDestroyed==0 || iTabpIndex; pIdx; pIdx=pIdx->pNext){ + Pgno iIdx = pIdx->tnum; + assert( pIdx->pSchema==pTab->pSchema ); + if( (iDestroyed==0 || (iIdxiLargest ){ + iLargest = iIdx; + } + } + if( iLargest==0 ){ + return; + }else{ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + assert( iDb>=0 && iDbdb->nDb ); + destroyRootPage(pParse, iLargest, iDb); + iDestroyed = iLargest; + } + } +} + +/* +** Remove entries from the sqlite_statN tables (for N in (1,2,3)) +** after a DROP INDEX or DROP TABLE command. +*/ +static void sqlite3ClearStatTables( + Parse *pParse, /* The parsing context */ + int iDb, /* The database number */ + const char *zType, /* "idx" or "tbl" */ + const char *zName /* Name of index or table */ +){ + int i; + const char *zDbName = pParse->db->aDb[iDb].zDbSName; + for(i=1; i<=4; i++){ + char zTab[24]; + sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i); + if( sqlite3FindTable(pParse->db, zTab, zDbName) ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE %s=%Q", + zDbName, zTab, zType, zName + ); + } + } +} + +/* +** Generate code to drop a table. +*/ +SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ + Vdbe *v; + sqlite3 *db = pParse->db; + Trigger *pTrigger; + Db *pDb = &db->aDb[iDb]; + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + sqlite3BeginWriteOperation(pParse, 1, iDb); + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp0(v, OP_VBegin); + } +#endif + + /* Drop all triggers associated with the table being dropped. Code + ** is generated to remove entries from sqlite_schema and/or + ** sqlite_temp_schema if required. + */ + pTrigger = sqlite3TriggerList(pParse, pTab); + while( pTrigger ){ + assert( pTrigger->pSchema==pTab->pSchema || + pTrigger->pSchema==db->aDb[1].pSchema ); + sqlite3DropTriggerPtr(pParse, pTrigger); + pTrigger = pTrigger->pNext; + } + +#ifndef SQLITE_OMIT_AUTOINCREMENT + /* Remove any entries of the sqlite_sequence table associated with + ** the table being dropped. This is done before the table is dropped + ** at the btree level, in case the sqlite_sequence table needs to + ** move as a result of the drop (can happen in auto-vacuum mode). + */ + if( pTab->tabFlags & TF_Autoincrement ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q.sqlite_sequence WHERE name=%Q", + pDb->zDbSName, pTab->zName + ); + } +#endif + + /* Drop all entries in the schema table that refer to the + ** table. The program name loops through the schema table and deletes + ** every row that refers to a table of the same name as the one being + ** dropped. Triggers are handled separately because a trigger can be + ** created in the temp database that refers to a table in another + ** database. + */ + sqlite3NestedParse(pParse, + "DELETE FROM %Q." LEGACY_SCHEMA_TABLE + " WHERE tbl_name=%Q and type!='trigger'", + pDb->zDbSName, pTab->zName); + if( !isView && !IsVirtual(pTab) ){ + destroyTable(pParse, pTab); + } + + /* Remove the table entry from SQLite's internal schema and modify + ** the schema cookie. + */ + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); + sqlite3ChangeCookie(pParse, iDb); + sqliteViewResetAll(db, iDb); +} + +/* +** Return TRUE if shadow tables should be read-only in the current +** context. +*/ +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (db->flags & SQLITE_Defensive)!=0 + && db->pVtabCtx==0 + && db->nVdbeExec==0 + && !sqlite3VtabInSync(db) + ){ + return 1; + } +#endif + return 0; +} + +/* +** Return true if it is not allowed to drop the given table +*/ +static int tableMayNotBeDropped(sqlite3 *db, Table *pTab){ + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + if( sqlite3StrNICmp(pTab->zName+7, "stat", 4)==0 ) return 0; + if( sqlite3StrNICmp(pTab->zName+7, "parameters", 10)==0 ) return 0; + return 1; + } + if( (pTab->tabFlags & TF_Shadow)!=0 && sqlite3ReadOnlyShadowTables(db) ){ + return 1; + } + if( pTab->tabFlags & TF_Eponymous ){ + return 1; + } + return 0; +} + +/* +** This routine is called to do the work of a DROP TABLE statement. +** pName is the name of the table to be dropped. +*/ +SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){ + Table *pTab; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + if( db->mallocFailed ){ + goto exit_drop_table; + } + assert( pParse->nErr==0 ); + assert( pName->nSrc==1 ); + if( sqlite3ReadSchema(pParse) ) goto exit_drop_table; + if( noErr ) db->suppressErr++; + assert( isView==0 || isView==LOCATE_VIEW ); + pTab = sqlite3LocateTableItem(pParse, isView, &pName->a[0]); + if( noErr ) db->suppressErr--; + + if( pTab==0 ){ + if( noErr ){ + sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + sqlite3ForceNotReadOnly(pParse); + } + goto exit_drop_table; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbnDb ); + + /* If pTab is a virtual table, call ViewGetColumnNames() to ensure + ** it is initialized. + */ + if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto exit_drop_table; + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code; + const char *zTab = SCHEMA_TABLE(iDb); + const char *zDb = db->aDb[iDb].zDbSName; + const char *zArg2 = 0; + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ + goto exit_drop_table; + } + if( isView ){ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_VIEW; + }else{ + code = SQLITE_DROP_VIEW; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + }else if( IsVirtual(pTab) ){ + code = SQLITE_DROP_VTABLE; + zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName; +#endif + }else{ + if( !OMIT_TEMPDB && iDb==1 ){ + code = SQLITE_DROP_TEMP_TABLE; + }else{ + code = SQLITE_DROP_TABLE; + } + } + if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){ + goto exit_drop_table; + } + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + goto exit_drop_table; + } + } +#endif + if( tableMayNotBeDropped(db, pTab) ){ + sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); + goto exit_drop_table; + } + +#ifndef SQLITE_OMIT_VIEW + /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used + ** on a table. + */ + if( isView && !IsView(pTab) ){ + sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); + goto exit_drop_table; + } + if( !isView && IsView(pTab) ){ + sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); + goto exit_drop_table; + } +#endif + + /* Generate code to remove the table from the schema table + ** on disk. + */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3BeginWriteOperation(pParse, 1, iDb); + if( !isView ){ + sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName); + sqlite3FkDropTable(pParse, pName, pTab); + } + sqlite3CodeDropTable(pParse, pTab, iDb, isView); + } + +exit_drop_table: + sqlite3SrcListDelete(db, pName); +} + +/* +** This routine is called to create a new foreign key on the table +** currently under construction. pFromCol determines which columns +** in the current table point to the foreign key. If pFromCol==0 then +** connect the key to the last column inserted. pTo is the name of +** the table referred to (a.k.a the "parent" table). pToCol is a list +** of tables in the parent pTo table. flags contains all +** information about the conflict resolution algorithms specified +** in the ON DELETE, ON UPDATE and ON INSERT clauses. +** +** An FKey structure is created and added to the table currently +** under construction in the pParse->pNewTable field. +** +** The foreign key is set for IMMEDIATE processing. A subsequent call +** to sqlite3DeferForeignKey() might change this to DEFERRED. +*/ +SQLITE_PRIVATE void sqlite3CreateForeignKey( + Parse *pParse, /* Parsing context */ + ExprList *pFromCol, /* Columns in this table that point to other table */ + Token *pTo, /* Name of the other table */ + ExprList *pToCol, /* Columns in the other table */ + int flags /* Conflict resolution algorithms. */ +){ + sqlite3 *db = pParse->db; +#ifndef SQLITE_OMIT_FOREIGN_KEY + FKey *pFKey = 0; + FKey *pNextTo; + Table *p = pParse->pNewTable; + i64 nByte; + int i; + int nCol; + char *z; + + assert( pTo!=0 ); + if( p==0 || IN_DECLARE_VTAB ) goto fk_end; + if( pFromCol==0 ){ + int iCol = p->nCol-1; + if( NEVER(iCol<0) ) goto fk_end; + if( pToCol && pToCol->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "foreign key on %s" + " should reference only one column of table %T", + p->aCol[iCol].zCnName, pTo); + goto fk_end; + } + nCol = 1; + }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){ + sqlite3ErrorMsg(pParse, + "number of columns in foreign key does not match the number of " + "columns in the referenced table"); + goto fk_end; + }else{ + nCol = pFromCol->nExpr; + } + nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; + if( pToCol ){ + for(i=0; inExpr; i++){ + nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1; + } + } + pFKey = sqlite3DbMallocZero(db, nByte ); + if( pFKey==0 ){ + goto fk_end; + } + pFKey->pFrom = p; + assert( IsOrdinaryTable(p) ); + pFKey->pNextFrom = p->u.tab.pFKey; + z = (char*)&pFKey->aCol[nCol]; + pFKey->zTo = z; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, (void*)z, pTo); + } + memcpy(z, pTo->z, pTo->n); + z[pTo->n] = 0; + sqlite3Dequote(z); + z += pTo->n+1; + pFKey->nCol = nCol; + if( pFromCol==0 ){ + pFKey->aCol[0].iFrom = p->nCol-1; + }else{ + for(i=0; inCol; j++){ + if( sqlite3StrICmp(p->aCol[j].zCnName, pFromCol->a[i].zEName)==0 ){ + pFKey->aCol[i].iFrom = j; + break; + } + } + if( j>=p->nCol ){ + sqlite3ErrorMsg(pParse, + "unknown column \"%s\" in foreign key definition", + pFromCol->a[i].zEName); + goto fk_end; + } + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zEName); + } + } + } + if( pToCol ){ + for(i=0; ia[i].zEName); + pFKey->aCol[i].zCol = z; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zEName); + } + memcpy(z, pToCol->a[i].zEName, n); + z[n] = 0; + z += n+1; + } + } + pFKey->isDeferred = 0; + pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */ + pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */ + + assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); + pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash, + pFKey->zTo, (void *)pFKey + ); + if( pNextTo==pFKey ){ + sqlite3OomFault(db); + goto fk_end; + } + if( pNextTo ){ + assert( pNextTo->pPrevTo==0 ); + pFKey->pNextTo = pNextTo; + pNextTo->pPrevTo = pFKey; + } + + /* Link the foreign key to the table as the last step. + */ + assert( IsOrdinaryTable(p) ); + p->u.tab.pFKey = pFKey; + pFKey = 0; + +fk_end: + sqlite3DbFree(db, pFKey); +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + sqlite3ExprListDelete(db, pFromCol); + sqlite3ExprListDelete(db, pToCol); +} + +/* +** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED +** clause is seen as part of a foreign key definition. The isDeferred +** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE. +** The behavior of the most recently created foreign key is adjusted +** accordingly. +*/ +SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ +#ifndef SQLITE_OMIT_FOREIGN_KEY + Table *pTab; + FKey *pFKey; + if( (pTab = pParse->pNewTable)==0 ) return; + if( NEVER(!IsOrdinaryTable(pTab)) ) return; + if( (pFKey = pTab->u.tab.pFKey)==0 ) return; + assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */ + pFKey->isDeferred = (u8)isDeferred; +#endif +} + +/* +** Generate code that will erase and refill index *pIdx. This is +** used to initialize a newly created index or to recompute the +** content of an index in response to a REINDEX command. +** +** if memRootPage is not negative, it means that the index is newly +** created. The register specified by memRootPage contains the +** root page number of the index. If memRootPage is negative, then +** the index already exists and must be cleared before being refilled and +** the root page number of the index is taken from pIndex->tnum. +*/ +static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ + Table *pTab = pIndex->pTable; /* The table that is indexed */ + int iTab = pParse->nTab++; /* Btree cursor used for pTab */ + int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */ + int iSorter; /* Cursor opened by OpenSorter (if in use) */ + int addr1; /* Address of top of loop */ + int addr2; /* Address to jump to for next iteration */ + Pgno tnum; /* Root page of index */ + int iPartIdxLabel; /* Jump to this label to skip a row */ + Vdbe *v; /* Generate code into this virtual machine */ + KeyInfo *pKey; /* KeyInfo for index */ + int regRecord; /* Register holding assembled index record */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, + db->aDb[iDb].zDbSName ) ){ + return; + } +#endif + + /* Require a write-lock on the table to perform this operation */ + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + + v = sqlite3GetVdbe(pParse); + if( v==0 ) return; + if( memRootPage>=0 ){ + tnum = (Pgno)memRootPage; + }else{ + tnum = pIndex->tnum; + } + pKey = sqlite3KeyInfoOfIndex(pParse, pIndex); + assert( pKey!=0 || pParse->nErr ); + + /* Open the sorter cursor if we are to use one. */ + iSorter = pParse->nTab++; + sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, pIndex->nKeyCol, (char*) + sqlite3KeyInfoRef(pKey), P4_KEYINFO); + + /* Open the table. Loop through all rows of the table, inserting index + ** records into the sorter. */ + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v); + regRecord = sqlite3GetTempReg(pParse); + sqlite3MultiWrite(pParse); + + sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); + sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord); + sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + if( memRootPage<0 ) sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb); + sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, (int)tnum, iDb, + (char *)pKey, P4_KEYINFO); + sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0)); + + addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v); + if( IsUniqueIndex(pIndex) ){ + int j2 = sqlite3VdbeGoto(v, 1); + addr2 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyAbortable(v, OE_Abort); + sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord, + pIndex->nKeyCol); VdbeCoverage(v); + sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); + sqlite3VdbeJumpHere(v, j2); + }else{ + /* Most CREATE INDEX and REINDEX statements that are not UNIQUE can not + ** abort. The exception is if one of the indexed expressions contains a + ** user function that throws an exception when it is evaluated. But the + ** overhead of adding a statement journal to a CREATE INDEX statement is + ** very small (since most of the pages written do not contain content that + ** needs to be restored if the statement aborts), so we call + ** sqlite3MayAbort() for all CREATE INDEX statements. */ + sqlite3MayAbort(pParse); + addr2 = sqlite3VdbeCurrentAddr(v); + } + sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); + if( !pIndex->bAscKeyBug ){ + /* This OP_SeekEnd opcode makes index insert for a REINDEX go much + ** faster by avoiding unnecessary seeks. But the optimization does + ** not work for UNIQUE constraint indexes on WITHOUT ROWID tables + ** with DESC primary keys, since those indexes have there keys in + ** a different order from the main table. + ** See ticket: https://www.sqlite.org/src/info/bba7b69f9849b5bf + */ + sqlite3VdbeAddOp1(v, OP_SeekEnd, iIdx); + } + sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + + sqlite3VdbeAddOp1(v, OP_Close, iTab); + sqlite3VdbeAddOp1(v, OP_Close, iIdx); + sqlite3VdbeAddOp1(v, OP_Close, iSorter); +} + +/* +** Allocate heap space to hold an Index object with nCol columns. +** +** Increase the allocation size to provide an extra nExtra bytes +** of 8-byte aligned space after the Index object and return a +** pointer to this extra space in *ppExtra. +*/ +SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( + sqlite3 *db, /* Database connection */ + i16 nCol, /* Total number of columns in the index */ + int nExtra, /* Number of bytes of extra space to alloc */ + char **ppExtra /* Pointer to the "extra" space */ +){ + Index *p; /* Allocated index object */ + int nByte; /* Bytes of space for Index object + arrays */ + + nByte = ROUND8(sizeof(Index)) + /* Index structure */ + ROUND8(sizeof(char*)*nCol) + /* Index.azColl */ + ROUND8(sizeof(LogEst)*(nCol+1) + /* Index.aiRowLogEst */ + sizeof(i16)*nCol + /* Index.aiColumn */ + sizeof(u8)*nCol); /* Index.aSortOrder */ + p = sqlite3DbMallocZero(db, nByte + nExtra); + if( p ){ + char *pExtra = ((char*)p)+ROUND8(sizeof(Index)); + p->azColl = (const char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); + p->aiRowLogEst = (LogEst*)pExtra; pExtra += sizeof(LogEst)*(nCol+1); + p->aiColumn = (i16*)pExtra; pExtra += sizeof(i16)*nCol; + p->aSortOrder = (u8*)pExtra; + p->nColumn = nCol; + p->nKeyCol = nCol - 1; + *ppExtra = ((char*)p) + nByte; + } + return p; +} + +/* +** If expression list pList contains an expression that was parsed with +** an explicit "NULLS FIRST" or "NULLS LAST" clause, leave an error in +** pParse and return non-zero. Otherwise, return zero. +*/ +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ + if( pList ){ + int i; + for(i=0; inExpr; i++){ + if( pList->a[i].fg.bNulls ){ + u8 sf = pList->a[i].fg.sortFlags; + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", + (sf==0 || sf==3) ? "FIRST" : "LAST" + ); + return 1; + } + } + } + return 0; +} + +/* +** Create a new index for an SQL table. pName1.pName2 is the name of the index +** and pTblList is the name of the table that is to be indexed. Both will +** be NULL for a primary key or an index that is created to satisfy a +** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable +** as the table to be indexed. pParse->pNewTable is a table that is +** currently being constructed by a CREATE TABLE statement. +** +** pList is a list of columns to be indexed. pList will be NULL if this +** is a primary key or unique-constraint on the most recent column added +** to the table currently under construction. +*/ +SQLITE_PRIVATE void sqlite3CreateIndex( + Parse *pParse, /* All information about this parse */ + Token *pName1, /* First part of index name. May be NULL */ + Token *pName2, /* Second part of index name. May be NULL */ + SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */ + ExprList *pList, /* A list of columns to be indexed */ + int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + Token *pStart, /* The CREATE token that begins this statement */ + Expr *pPIWhere, /* WHERE clause for partial indices */ + int sortOrder, /* Sort order of primary key when pList==NULL */ + int ifNotExist, /* Omit error if index already exists */ + u8 idxType /* The index type */ +){ + Table *pTab = 0; /* Table to be indexed */ + Index *pIndex = 0; /* The index to be created */ + char *zName = 0; /* Name of the index */ + int nName; /* Number of characters in zName */ + int i, j; + DbFixer sFix; /* For assigning database names to pTable */ + int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */ + sqlite3 *db = pParse->db; + Db *pDb; /* The specific table containing the indexed database */ + int iDb; /* Index of the database that is being written */ + Token *pName = 0; /* Unqualified name of the index to create */ + struct ExprList_item *pListItem; /* For looping over pList */ + int nExtra = 0; /* Space allocated for zExtra[] */ + int nExtraCol; /* Number of extra columns needed */ + char *zExtra = 0; /* Extra space after the Index object */ + Index *pPk = 0; /* PRIMARY KEY index for WITHOUT ROWID tables */ + + assert( db->pParse==pParse ); + if( pParse->nErr ){ + goto exit_create_index; + } + assert( db->mallocFailed==0 ); + if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ + goto exit_create_index; + } + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_create_index; + } + if( sqlite3HasExplicitNulls(pParse, pList) ){ + goto exit_create_index; + } + + /* + ** Find the table that is to be indexed. Return early if not found. + */ + if( pTblName!=0 ){ + + /* Use the two-part index name to determine the database + ** to search for the table. 'Fix' the table name to this db + ** before looking up the table. + */ + assert( pName1 && pName2 ); + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) goto exit_create_index; + assert( pName && pName->z ); + +#ifndef SQLITE_OMIT_TEMPDB + /* If the index name was unqualified, check if the table + ** is a temp table. If so, set the database to 1. Do not do this + ** if initialising a database schema. + */ + if( !db->init.busy ){ + pTab = sqlite3SrcListLookup(pParse, pTblName); + if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } + } +#endif + + sqlite3FixInit(&sFix, pParse, iDb, "index", pName); + if( sqlite3FixSrcList(&sFix, pTblName) ){ + /* Because the parser constructs pTblName from a single identifier, + ** sqlite3FixSrcList can never fail. */ + assert(0); + } + pTab = sqlite3LocateTableItem(pParse, 0, &pTblName->a[0]); + assert( db->mallocFailed==0 || pTab==0 ); + if( pTab==0 ) goto exit_create_index; + if( iDb==1 && db->aDb[iDb].pSchema!=pTab->pSchema ){ + sqlite3ErrorMsg(pParse, + "cannot create a TEMP index on non-TEMP table \"%s\"", + pTab->zName); + goto exit_create_index; + } + if( !HasRowid(pTab) ) pPk = sqlite3PrimaryKeyIndex(pTab); + }else{ + assert( pName==0 ); + assert( pStart==0 ); + pTab = pParse->pNewTable; + if( !pTab ) goto exit_create_index; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + } + pDb = &db->aDb[iDb]; + + assert( pTab!=0 ); + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 + && db->init.busy==0 + && pTblName!=0 +#if SQLITE_USER_AUTHENTICATION + && sqlite3UserAuthTable(pTab->zName)==0 +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); + goto exit_create_index; + } +#ifndef SQLITE_OMIT_VIEW + if( IsView(pTab) ){ + sqlite3ErrorMsg(pParse, "views may not be indexed"); + goto exit_create_index; + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "virtual tables may not be indexed"); + goto exit_create_index; + } +#endif + + /* + ** Find the name of the index. Make sure there is not already another + ** index or table with the same name. + ** + ** Exception: If we are reading the names of permanent indices from the + ** sqlite_schema table (because some other process changed the schema) and + ** one of the index names collides with the name of a temporary table or + ** index, then we will continue to process this index. + ** + ** If pName==0 it means that we are + ** dealing with a primary key or UNIQUE constraint. We have to invent our + ** own name. + */ + if( pName ){ + zName = sqlite3NameFromToken(db, pName); + if( zName==0 ) goto exit_create_index; + assert( pName->z!=0 ); + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName,"index",pTab->zName) ){ + goto exit_create_index; + } + if( !IN_RENAME_OBJECT ){ + if( !db->init.busy ){ + if( sqlite3FindTable(db, zName, 0)!=0 ){ + sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); + goto exit_create_index; + } + } + if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){ + if( !ifNotExist ){ + sqlite3ErrorMsg(pParse, "index %s already exists", zName); + }else{ + assert( !db->init.busy ); + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3ForceNotReadOnly(pParse); + } + goto exit_create_index; + } + } + }else{ + int n; + Index *pLoop; + for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){} + zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n); + if( zName==0 ){ + goto exit_create_index; + } + + /* Automatic index names generated from within sqlite3_declare_vtab() + ** must have names that are distinct from normal automatic index names. + ** The following statement converts "sqlite3_autoindex..." into + ** "sqlite3_butoindex..." in order to make the names distinct. + ** The "vtab_err.test" test demonstrates the need of this statement. */ + if( IN_SPECIAL_PARSE ) zName[7]++; + } + + /* Check for authorization to create an index. + */ +#ifndef SQLITE_OMIT_AUTHORIZATION + if( !IN_RENAME_OBJECT ){ + const char *zDb = pDb->zDbSName; + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ + goto exit_create_index; + } + i = SQLITE_CREATE_INDEX; + if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){ + goto exit_create_index; + } + } +#endif + + /* If pList==0, it means this routine was called to make a primary + ** key out of the last column added to the table under construction. + ** So create a fake list to simulate this. + */ + if( pList==0 ){ + Token prevCol; + Column *pCol = &pTab->aCol[pTab->nCol-1]; + pCol->colFlags |= COLFLAG_UNIQUE; + sqlite3TokenInit(&prevCol, pCol->zCnName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); + if( pList==0 ) goto exit_create_index; + assert( pList->nExpr==1 ); + sqlite3ExprListSetSortOrder(pList, sortOrder, SQLITE_SO_UNDEFINED); + }else{ + sqlite3ExprListCheckLength(pParse, pList, "index"); + if( pParse->nErr ) goto exit_create_index; + } + + /* Figure out how many bytes of space are required to store explicitly + ** specified collation sequence names. + */ + for(i=0; inExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + if( pExpr->op==TK_COLLATE ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); + } + } + + /* + ** Allocate the index structure. + */ + nName = sqlite3Strlen30(zName); + nExtraCol = pPk ? pPk->nKeyCol : 1; + assert( pList->nExpr + nExtraCol <= 32767 /* Fits in i16 */ ); + pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, + nName + nExtra + 1, &zExtra); + if( db->mallocFailed ){ + goto exit_create_index; + } + assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowLogEst) ); + assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); + pIndex->zName = zExtra; + zExtra += nName + 1; + memcpy(pIndex->zName, zName, nName+1); + pIndex->pTable = pTab; + pIndex->onError = (u8)onError; + pIndex->uniqNotNull = onError!=OE_None; + pIndex->idxType = idxType; + pIndex->pSchema = db->aDb[iDb].pSchema; + pIndex->nKeyCol = pList->nExpr; + if( pPIWhere ){ + sqlite3ResolveSelfReference(pParse, pTab, NC_PartIdx, pPIWhere, 0); + pIndex->pPartIdxWhere = pPIWhere; + pPIWhere = 0; + } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + + /* Check to see if we should honor DESC requests on index columns + */ + if( pDb->pSchema->file_format>=4 ){ + sortOrderMask = -1; /* Honor DESC */ + }else{ + sortOrderMask = 0; /* Ignore DESC */ + } + + /* Analyze the list of expressions that form the terms of the index and + ** report any errors. In the common case where the expression is exactly + ** a table column, store that column in aiColumn[]. For general expressions, + ** populate pIndex->aColExpr and store XN_EXPR (-2) in aiColumn[]. + ** + ** TODO: Issue a warning if two or more columns of the index are identical. + ** TODO: Issue a warning if the table primary key is used as part of the + ** index key. + */ + pListItem = pList->a; + if( IN_RENAME_OBJECT ){ + pIndex->aColExpr = pList; + pList = 0; + } + for(i=0; inKeyCol; i++, pListItem++){ + Expr *pCExpr; /* The i-th index expression */ + int requestedSortOrder; /* ASC or DESC on the i-th expression */ + const char *zColl; /* Collation sequence name */ + + sqlite3StringToId(pListItem->pExpr); + sqlite3ResolveSelfReference(pParse, pTab, NC_IdxExpr, pListItem->pExpr, 0); + if( pParse->nErr ) goto exit_create_index; + pCExpr = sqlite3ExprSkipCollate(pListItem->pExpr); + if( pCExpr->op!=TK_COLUMN ){ + if( pTab==pParse->pNewTable ){ + sqlite3ErrorMsg(pParse, "expressions prohibited in PRIMARY KEY and " + "UNIQUE constraints"); + goto exit_create_index; + } + if( pIndex->aColExpr==0 ){ + pIndex->aColExpr = pList; + pList = 0; + } + j = XN_EXPR; + pIndex->aiColumn[i] = XN_EXPR; + pIndex->uniqNotNull = 0; + }else{ + j = pCExpr->iColumn; + assert( j<=0x7fff ); + if( j<0 ){ + j = pTab->iPKey; + }else{ + if( pTab->aCol[j].notNull==0 ){ + pIndex->uniqNotNull = 0; + } + if( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ){ + pIndex->bHasVCol = 1; + } + } + pIndex->aiColumn[i] = (i16)j; + } + zColl = 0; + if( pListItem->pExpr->op==TK_COLLATE ){ + int nColl; + assert( !ExprHasProperty(pListItem->pExpr, EP_IntValue) ); + zColl = pListItem->pExpr->u.zToken; + nColl = sqlite3Strlen30(zColl) + 1; + assert( nExtra>=nColl ); + memcpy(zExtra, zColl, nColl); + zColl = zExtra; + zExtra += nColl; + nExtra -= nColl; + }else if( j>=0 ){ + zColl = sqlite3ColumnColl(&pTab->aCol[j]); + } + if( !zColl ) zColl = sqlite3StrBINARY; + if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ + goto exit_create_index; + } + pIndex->azColl[i] = zColl; + requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask; + pIndex->aSortOrder[i] = (u8)requestedSortOrder; + } + + /* Append the table key to the end of the index. For WITHOUT ROWID + ** tables (when pPk!=0) this will be the declared PRIMARY KEY. For + ** normal tables (when pPk==0) this will be the rowid. + */ + if( pPk ){ + for(j=0; jnKeyCol; j++){ + int x = pPk->aiColumn[j]; + assert( x>=0 ); + if( isDupColumn(pIndex, pIndex->nKeyCol, pPk, j) ){ + pIndex->nColumn--; + }else{ + testcase( hasColumn(pIndex->aiColumn,pIndex->nKeyCol,x) ); + pIndex->aiColumn[i] = x; + pIndex->azColl[i] = pPk->azColl[j]; + pIndex->aSortOrder[i] = pPk->aSortOrder[j]; + i++; + } + } + assert( i==pIndex->nColumn ); + }else{ + pIndex->aiColumn[i] = XN_ROWID; + pIndex->azColl[i] = sqlite3StrBINARY; + } + sqlite3DefaultRowEst(pIndex); + if( pParse->pNewTable==0 ) estimateIndexWidth(pIndex); + + /* If this index contains every column of its table, then mark + ** it as a covering index */ + assert( HasRowid(pTab) + || pTab->iPKey<0 || sqlite3TableColumnToIndex(pIndex, pTab->iPKey)>=0 ); + recomputeColumnsNotIndexed(pIndex); + if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ + pIndex->isCovering = 1; + for(j=0; jnCol; j++){ + if( j==pTab->iPKey ) continue; + if( sqlite3TableColumnToIndex(pIndex,j)>=0 ) continue; + pIndex->isCovering = 0; + break; + } + } + + if( pTab==pParse->pNewTable ){ + /* This routine has been called to create an automatic index as a + ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or + ** a PRIMARY KEY or UNIQUE clause following the column definitions. + ** i.e. one of: + ** + ** CREATE TABLE t(x PRIMARY KEY, y); + ** CREATE TABLE t(x, y, UNIQUE(x, y)); + ** + ** Either way, check to see if the table already has such an index. If + ** so, don't bother creating this one. This only applies to + ** automatically created indices. Users can do as they wish with + ** explicit indices. + ** + ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent + ** (and thus suppressing the second one) even if they have different + ** sort orders. + ** + ** If there are different collating sequences or if the columns of + ** the constraint occur in different orders, then the constraints are + ** considered distinct and both result in separate indices. + */ + Index *pIdx; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int k; + assert( IsUniqueIndex(pIdx) ); + assert( pIdx->idxType!=SQLITE_IDXTYPE_APPDEF ); + assert( IsUniqueIndex(pIndex) ); + + if( pIdx->nKeyCol!=pIndex->nKeyCol ) continue; + for(k=0; knKeyCol; k++){ + const char *z1; + const char *z2; + assert( pIdx->aiColumn[k]>=0 ); + if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break; + z1 = pIdx->azColl[k]; + z2 = pIndex->azColl[k]; + if( sqlite3StrICmp(z1, z2) ) break; + } + if( k==pIdx->nKeyCol ){ + if( pIdx->onError!=pIndex->onError ){ + /* This constraint creates the same index as a previous + ** constraint specified somewhere in the CREATE TABLE statement. + ** However the ON CONFLICT clauses are different. If both this + ** constraint and the previous equivalent constraint have explicit + ** ON CONFLICT clauses this is an error. Otherwise, use the + ** explicitly specified behavior for the index. + */ + if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){ + sqlite3ErrorMsg(pParse, + "conflicting ON CONFLICT clauses specified", 0); + } + if( pIdx->onError==OE_Default ){ + pIdx->onError = pIndex->onError; + } + } + if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } + goto exit_create_index; + } + } + } + + if( !IN_RENAME_OBJECT ){ + + /* Link the new Index structure to its table and to the other + ** in-memory database structures. + */ + assert( pParse->nErr==0 ); + if( db->init.busy ){ + Index *p; + assert( !IN_SPECIAL_PARSE ); + assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid rootpage"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } + } + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, + pIndex->zName, pIndex); + if( p ){ + assert( p==pIndex ); /* Malloc must have failed */ + sqlite3OomFault(db); + goto exit_create_index; + } + db->mDbFlags |= DBFLAG_SchemaChange; + } + + /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the + ** index is an implied index for a UNIQUE or PRIMARY KEY constraint) then + ** emit code to allocate the index rootpage on disk and make an entry for + ** the index in the sqlite_schema table and populate the index with + ** content. But, do not do this if we are simply reading the sqlite_schema + ** table to parse the schema, or if this index is the PRIMARY KEY index + ** of a WITHOUT ROWID table. + ** + ** If pTblName==0 it means this index is generated as an implied PRIMARY KEY + ** or UNIQUE index in a CREATE TABLE statement. Since the table + ** has just been created, it contains no data and the index initialization + ** step can be skipped. + */ + else if( HasRowid(pTab) || pTblName!=0 ){ + Vdbe *v; + char *zStmt; + int iMem = ++pParse->nMem; + + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto exit_create_index; + + sqlite3BeginWriteOperation(pParse, 1, iDb); + + /* Create the rootpage for the index using CreateIndex. But before + ** doing so, code a Noop instruction and store its address in + ** Index.tnum. This is required in case this index is actually a + ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In + ** that case the convertToWithoutRowidTable() routine will replace + ** the Noop with a Goto to jump over the VDBE code generated below. */ + pIndex->tnum = (Pgno)sqlite3VdbeAddOp0(v, OP_Noop); + sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY); + + /* Gather the complete text of the CREATE INDEX statement into + ** the zStmt variable + */ + assert( pName!=0 || pStart==0 ); + if( pStart ){ + int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; + if( pName->z[n-1]==';' ) n--; + /* A named index with an explicit CREATE INDEX statement */ + zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s", + onError==OE_None ? "" : " UNIQUE", n, pName->z); + }else{ + /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */ + /* zStmt = sqlite3MPrintf(""); */ + zStmt = 0; + } + + /* Add an entry in sqlite_schema for this index + */ + sqlite3NestedParse(pParse, + "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, + pIndex->zName, + pTab->zName, + iMem, + zStmt + ); + sqlite3DbFree(db, zStmt); + + /* Fill the index with data and reparse the schema. Code an OP_Expire + ** to invalidate all pre-compiled statements. + */ + if( pTblName ){ + sqlite3RefillIndex(pParse, pIndex, iMem); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName), 0); + sqlite3VdbeAddOp2(v, OP_Expire, 0, 1); + } + + sqlite3VdbeJumpHere(v, (int)pIndex->tnum); + } + } + if( db->init.busy || pTblName==0 ){ + pIndex->pNext = pTab->pIndex; + pTab->pIndex = pIndex; + pIndex = 0; + } + else if( IN_RENAME_OBJECT ){ + assert( pParse->pNewIndex==0 ); + pParse->pNewIndex = pIndex; + pIndex = 0; + } + + /* Clean up before exiting */ +exit_create_index: + if( pIndex ) sqlite3FreeIndex(db, pIndex); + if( pTab ){ + /* Ensure all REPLACE indexes on pTab are at the end of the pIndex list. + ** The list was already ordered when this routine was entered, so at this + ** point at most a single index (the newly added index) will be out of + ** order. So we have to reorder at most one index. */ + Index **ppFrom; + Index *pThis; + for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ + Index *pNext; + if( pThis->onError!=OE_Replace ) continue; + while( (pNext = pThis->pNext)!=0 && pNext->onError!=OE_Replace ){ + *ppFrom = pNext; + pThis->pNext = pNext->pNext; + pNext->pNext = pThis; + ppFrom = &pNext->pNext; + } + break; + } +#ifdef SQLITE_DEBUG + /* Verify that all REPLACE indexes really are now at the end + ** of the index list. In other words, no other index type ever + ** comes after a REPLACE index on the list. */ + for(pThis = pTab->pIndex; pThis; pThis=pThis->pNext){ + assert( pThis->onError!=OE_Replace + || pThis->pNext==0 + || pThis->pNext->onError==OE_Replace ); + } +#endif + } + sqlite3ExprDelete(db, pPIWhere); + sqlite3ExprListDelete(db, pList); + sqlite3SrcListDelete(db, pTblName); + sqlite3DbFree(db, zName); +} + +/* +** Fill the Index.aiRowEst[] array with default information - information +** to be used when we have not run the ANALYZE command. +** +** aiRowEst[0] is supposed to contain the number of elements in the index. +** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the +** number of rows in the table that match any particular value of the +** first column of the index. aiRowEst[2] is an estimate of the number +** of rows that match any particular combination of the first 2 columns +** of the index. And so forth. It must always be the case that +* +** aiRowEst[N]<=aiRowEst[N-1] +** aiRowEst[N]>=1 +** +** Apart from that, we have little to go on besides intuition as to +** how aiRowEst[] should be initialized. The numbers generated here +** are based on typical values found in actual indices. +*/ +SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){ + /* 10, 9, 8, 7, 6 */ + static const LogEst aVal[] = { 33, 32, 30, 28, 26 }; + LogEst *a = pIdx->aiRowLogEst; + LogEst x; + int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); + int i; + + /* Indexes with default row estimates should not have stat1 data */ + assert( !pIdx->hasStat1 ); + + /* Set the first entry (number of rows in the index) to the estimated + ** number of rows in the table, or half the number of rows in the table + ** for a partial index. + ** + ** 2020-05-27: If some of the stat data is coming from the sqlite_stat1 + ** table but other parts we are having to guess at, then do not let the + ** estimated number of rows in the table be less than 1000 (LogEst 99). + ** Failure to do this can cause the indexes for which we do not have + ** stat1 data to be ignored by the query planner. + */ + x = pIdx->pTable->nRowLogEst; + assert( 99==sqlite3LogEst(1000) ); + if( x<99 ){ + pIdx->pTable->nRowLogEst = x = 99; + } + if( pIdx->pPartIdxWhere!=0 ){ x -= 10; assert( 10==sqlite3LogEst(2) ); } + a[0] = x; + + /* Estimate that a[1] is 10, a[2] is 9, a[3] is 8, a[4] is 7, a[5] is + ** 6 and each subsequent value (if any) is 5. */ + memcpy(&a[1], aVal, nCopy*sizeof(LogEst)); + for(i=nCopy+1; i<=pIdx->nKeyCol; i++){ + a[i] = 23; assert( 23==sqlite3LogEst(5) ); + } + + assert( 0==sqlite3LogEst(1) ); + if( IsUniqueIndex(pIdx) ) a[pIdx->nKeyCol] = 0; +} + +/* +** This routine will drop an existing named index. This routine +** implements the DROP INDEX statement. +*/ +SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ + Index *pIndex; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + if( db->mallocFailed ){ + goto exit_drop_index; + } + assert( pParse->nErr==0 ); /* Never called with prior non-OOM errors */ + assert( pName->nSrc==1 ); + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto exit_drop_index; + } + pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); + if( pIndex==0 ){ + if( !ifExists ){ + sqlite3ErrorMsg(pParse, "no such index: %S", pName->a); + }else{ + sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + sqlite3ForceNotReadOnly(pParse); + } + pParse->checkSchema = 1; + goto exit_drop_index; + } + if( pIndex->idxType!=SQLITE_IDXTYPE_APPDEF ){ + sqlite3ErrorMsg(pParse, "index associated with UNIQUE " + "or PRIMARY KEY constraint cannot be dropped", 0); + goto exit_drop_index; + } + iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int code = SQLITE_DROP_INDEX; + Table *pTab = pIndex->pTable; + const char *zDb = db->aDb[iDb].zDbSName; + const char *zTab = SCHEMA_TABLE(iDb); + if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + goto exit_drop_index; + } + if( !OMIT_TEMPDB && iDb==1 ) code = SQLITE_DROP_TEMP_INDEX; + if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){ + goto exit_drop_index; + } + } +#endif + + /* Generate code to remove the index and from the schema table */ + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3BeginWriteOperation(pParse, 1, iDb); + sqlite3NestedParse(pParse, + "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='index'", + db->aDb[iDb].zDbSName, pIndex->zName + ); + sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); + sqlite3ChangeCookie(pParse, iDb); + destroyRootPage(pParse, pIndex->tnum, iDb); + sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0); + } + +exit_drop_index: + sqlite3SrcListDelete(db, pName); +} + +/* +** pArray is a pointer to an array of objects. Each object in the +** array is szEntry bytes in size. This routine uses sqlite3DbRealloc() +** to extend the array so that there is space for a new object at the end. +** +** When this function is called, *pnEntry contains the current size of +** the array (in entries - so the allocation is ((*pnEntry) * szEntry) bytes +** in total). +** +** If the realloc() is successful (i.e. if no OOM condition occurs), the +** space allocated for the new object is zeroed, *pnEntry updated to +** reflect the new size of the array and a pointer to the new allocation +** returned. *pIdx is set to the index of the new array entry in this case. +** +** Otherwise, if the realloc() fails, *pIdx is set to -1, *pnEntry remains +** unchanged and a copy of pArray returned. +*/ +SQLITE_PRIVATE void *sqlite3ArrayAllocate( + sqlite3 *db, /* Connection to notify of malloc failures */ + void *pArray, /* Array of objects. Might be reallocated */ + int szEntry, /* Size of each object in the array */ + int *pnEntry, /* Number of objects currently in use */ + int *pIdx /* Write the index of a new slot here */ +){ + char *z; + sqlite3_int64 n = *pIdx = *pnEntry; + if( (n & (n-1))==0 ){ + sqlite3_int64 sz = (n==0) ? 1 : 2*n; + void *pNew = sqlite3DbRealloc(db, pArray, sz*szEntry); + if( pNew==0 ){ + *pIdx = -1; + return pArray; + } + pArray = pNew; + } + z = (char*)pArray; + memset(&z[n * szEntry], 0, szEntry); + ++*pnEntry; + return pArray; +} + +/* +** Append a new element to the given IdList. Create a new IdList if +** need be. +** +** A new IdList is returned, or NULL if malloc() fails. +*/ +SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *pToken){ + sqlite3 *db = pParse->db; + int i; + if( pList==0 ){ + pList = sqlite3DbMallocZero(db, sizeof(IdList) ); + if( pList==0 ) return 0; + }else{ + IdList *pNew; + pNew = sqlite3DbRealloc(db, pList, + sizeof(IdList) + pList->nId*sizeof(pList->a)); + if( pNew==0 ){ + sqlite3IdListDelete(db, pList); + return 0; + } + pList = pNew; + } + i = pList->nId++; + pList->a[i].zName = sqlite3NameFromToken(db, pToken); + if( IN_RENAME_OBJECT && pList->a[i].zName ){ + sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken); + } + return pList; +} + +/* +** Delete an IdList. +*/ +SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ + int i; + if( pList==0 ) return; + assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */ + for(i=0; inId; i++){ + sqlite3DbFree(db, pList->a[i].zName); + } + sqlite3DbFreeNN(db, pList); +} + +/* +** Return the index in pList of the identifier named zId. Return -1 +** if not found. +*/ +SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ + int i; + assert( pList!=0 ); + for(i=0; inId; i++){ + if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; + } + return -1; +} + +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + +/* +** Expand the space allocated for the given SrcList object by +** creating nExtra new slots beginning at iStart. iStart is zero based. +** New slots are zeroed. +** +** For example, suppose a SrcList initially contains two entries: A,B. +** To append 3 new entries onto the end, do this: +** +** sqlite3SrcListEnlarge(db, pSrclist, 3, 2); +** +** After the call above it would contain: A, B, nil, nil, nil. +** If the iStart argument had been 1 instead of 2, then the result +** would have been: A, nil, nil, nil, B. To prepend the new slots, +** the iStart value would be 0. The result then would +** be: nil, nil, nil, A, B. +** +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( + Parse *pParse, /* Parsing context into which errors are reported */ + SrcList *pSrc, /* The SrcList to be enlarged */ + int nExtra, /* Number of new slots to add to pSrc->a[] */ + int iStart /* Index in pSrc->a[] of first new slot */ +){ + int i; + + /* Sanity checking on calling parameters */ + assert( iStart>=0 ); + assert( nExtra>=1 ); + assert( pSrc!=0 ); + assert( iStart<=pSrc->nSrc ); + + /* Allocate additional space if needed */ + if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ + SrcList *pNew; + sqlite3_int64 nAlloc = 2*(sqlite3_int64)pSrc->nSrc+nExtra; + sqlite3 *db = pParse->db; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; + pNew = sqlite3DbRealloc(db, pSrc, + sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); + if( pNew==0 ){ + assert( db->mallocFailed ); + return 0; + } + pSrc = pNew; + pSrc->nAlloc = nAlloc; + } + + /* Move existing slots that come after the newly inserted slots + ** out of the way */ + for(i=pSrc->nSrc-1; i>=iStart; i--){ + pSrc->a[i+nExtra] = pSrc->a[i]; + } + pSrc->nSrc += nExtra; + + /* Zero the newly allocated slots */ + memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra); + for(i=iStart; ia[i].iCursor = -1; + } + + /* Return a pointer to the enlarged SrcList */ + return pSrc; +} + + +/* +** Append a new table name to the given SrcList. Create a new SrcList if +** need be. A new entry is created in the SrcList even if pTable is NULL. +** +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned +** SrcList might be the same as the SrcList that was input or it might be +** a new one. If an OOM error does occurs, then the prior value of pList +** that is input to this routine is automatically freed. +** +** If pDatabase is not null, it means that the table has an optional +** database name prefix. Like this: "database.table". The pDatabase +** points to the table name and the pTable points to the database name. +** The SrcList.a[].zName field is filled with the table name which might +** come from pTable (if pDatabase is NULL) or from pDatabase. +** SrcList.a[].zDatabase is filled with the database name from pTable, +** or with NULL if no database is specified. +** +** In other words, if call like this: +** +** sqlite3SrcListAppend(D,A,B,0); +** +** Then B is a table name and the database name is unspecified. If called +** like this: +** +** sqlite3SrcListAppend(D,A,B,C); +** +** Then C is the table name and B is the database name. If C is defined +** then so is B. In other words, we never have a case where: +** +** sqlite3SrcListAppend(D,A,0,C); +** +** Both pTable and pDatabase are assumed to be quoted. They are dequoted +** before being added to the SrcList. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( + Parse *pParse, /* Parsing context, in which errors are reported */ + SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ + Token *pTable, /* Table to append */ + Token *pDatabase /* Database of the table */ +){ + SrcItem *pItem; + sqlite3 *db; + assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; + if( pList==0 ){ + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); + if( pList==0 ) return 0; + pList->nAlloc = 1; + pList->nSrc = 1; + memset(&pList->a[0], 0, sizeof(pList->a[0])); + pList->a[0].iCursor = -1; + }else{ + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } + } + pItem = &pList->a[pList->nSrc-1]; + if( pDatabase && pDatabase->z==0 ){ + pDatabase = 0; + } + if( pDatabase ){ + pItem->zName = sqlite3NameFromToken(db, pDatabase); + pItem->zDatabase = sqlite3NameFromToken(db, pTable); + }else{ + pItem->zName = sqlite3NameFromToken(db, pTable); + pItem->zDatabase = 0; + } + return pList; +} + +/* +** Assign VdbeCursor index numbers to all tables in a SrcList +*/ +SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ + int i; + SrcItem *pItem; + assert( pList || pParse->db->mallocFailed ); + if( ALWAYS(pList) ){ + for(i=0, pItem=pList->a; inSrc; i++, pItem++){ + if( pItem->iCursor>=0 ) continue; + pItem->iCursor = pParse->nTab++; + if( pItem->pSelect ){ + sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); + } + } + } +} + +/* +** Delete an entire SrcList including all its substructure. +*/ +SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ + int i; + SrcItem *pItem; + if( pList==0 ) return; + for(pItem=pList->a, i=0; inSrc; i++, pItem++){ + if( pItem->zDatabase ) sqlite3DbFreeNN(db, pItem->zDatabase); + sqlite3DbFree(db, pItem->zName); + if( pItem->zAlias ) sqlite3DbFreeNN(db, pItem->zAlias); + if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy); + if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); + sqlite3DeleteTable(db, pItem->pTab); + if( pItem->pSelect ) sqlite3SelectDelete(db, pItem->pSelect); + if( pItem->fg.isUsing ){ + sqlite3IdListDelete(db, pItem->u3.pUsing); + }else if( pItem->u3.pOn ){ + sqlite3ExprDelete(db, pItem->u3.pOn); + } + } + sqlite3DbFreeNN(db, pList); +} + +/* +** This routine is called by the parser to add a new term to the +** end of a growing FROM clause. The "p" parameter is the part of +** the FROM clause that has already been constructed. "p" is NULL +** if this is the first term of the FROM clause. pTable and pDatabase +** are the name of the table and database named in the FROM clause term. +** pDatabase is NULL if the database name qualifier is missing - the +** usual case. If the term has an alias, then pAlias points to the +** alias token. If the term is a subquery, then pSubquery is the +** SELECT statement that the subquery encodes. The pTable and +** pDatabase parameters are NULL for subqueries. The pOn and pUsing +** parameters are the content of the ON and USING clauses. +** +** Return a new SrcList which encodes is the FROM with the new +** term added. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( + Parse *pParse, /* Parsing context */ + SrcList *p, /* The left part of the FROM clause already seen */ + Token *pTable, /* Name of the table to add to the FROM clause */ + Token *pDatabase, /* Name of the database containing pTable */ + Token *pAlias, /* The right-hand side of the AS subexpression */ + Select *pSubquery, /* A subquery used in place of a table name */ + OnOrUsing *pOnUsing /* Either the ON clause or the USING clause */ +){ + SrcItem *pItem; + sqlite3 *db = pParse->db; + if( !p && pOnUsing!=0 && (pOnUsing->pOn || pOnUsing->pUsing) ){ + sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", + (pOnUsing->pOn ? "ON" : "USING") + ); + goto append_from_error; + } + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); + if( p==0 ){ + goto append_from_error; + } + assert( p->nSrc>0 ); + pItem = &p->a[p->nSrc-1]; + assert( (pTable==0)==(pDatabase==0) ); + assert( pItem->zName==0 || pDatabase!=0 ); + if( IN_RENAME_OBJECT && pItem->zName ){ + Token *pToken = (ALWAYS(pDatabase) && pDatabase->z) ? pDatabase : pTable; + sqlite3RenameTokenMap(pParse, pItem->zName, pToken); + } + assert( pAlias!=0 ); + if( pAlias->n ){ + pItem->zAlias = sqlite3NameFromToken(db, pAlias); + } + if( pSubquery ){ + pItem->pSelect = pSubquery; + if( pSubquery->selFlags & SF_NestedFrom ){ + pItem->fg.isNestedFrom = 1; + } + } + assert( pOnUsing==0 || pOnUsing->pOn==0 || pOnUsing->pUsing==0 ); + assert( pItem->fg.isUsing==0 ); + if( pOnUsing==0 ){ + pItem->u3.pOn = 0; + }else if( pOnUsing->pUsing ){ + pItem->fg.isUsing = 1; + pItem->u3.pUsing = pOnUsing->pUsing; + }else{ + pItem->u3.pOn = pOnUsing->pOn; + } + return p; + +append_from_error: + assert( p==0 ); + sqlite3ClearOnOrUsing(db, pOnUsing); + sqlite3SelectDelete(db, pSubquery); + return 0; +} + +/* +** Add an INDEXED BY or NOT INDEXED clause to the most recently added +** element of the source-list passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ + assert( pIndexedBy!=0 ); + if( p && pIndexedBy->n>0 ){ + SrcItem *pItem; + assert( p->nSrc>0 ); + pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + if( pIndexedBy->n==1 && !pIndexedBy->z ){ + /* A "NOT INDEXED" clause was supplied. See parse.y + ** construct "indexed_opt" for details. */ + pItem->fg.notIndexed = 1; + }else{ + pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); + pItem->fg.isIndexedBy = 1; + assert( pItem->fg.isCte==0 ); /* No collision on union u2 */ + } + } +} + +/* +** Append the contents of SrcList p2 to SrcList p1 and return the resulting +** SrcList. Or, if an error occurs, return NULL. In all cases, p1 and p2 +** are deleted by this function. +*/ +SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2){ + assert( p1 && p1->nSrc==1 ); + if( p2 ){ + SrcList *pNew = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, 1); + if( pNew==0 ){ + sqlite3SrcListDelete(pParse->db, p2); + }else{ + p1 = pNew; + memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(SrcItem)); + sqlite3DbFree(pParse->db, p2); + p1->a[0].fg.jointype |= (JT_LTORJ & p1->a[1].fg.jointype); + } + } + return p1; +} + +/* +** Add the list of function arguments to the SrcList entry for a +** table-valued-function. +*/ +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList *pList){ + if( p ){ + SrcItem *pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + pItem->u1.pFuncArg = pList; + pItem->fg.isTabFunc = 1; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + +/* +** When building up a FROM clause in the parser, the join operator +** is initially attached to the left operand. But the code generator +** expects the join operator to be on the right operand. This routine +** Shifts all join operators from left to right for an entire FROM +** clause. +** +** Example: Suppose the join is like this: +** +** A natural cross join B +** +** The operator is "natural cross join". The A and B operands are stored +** in p->a[0] and p->a[1], respectively. The parser initially stores the +** operator with A. This routine shifts that operator over to B. +** +** Additional changes: +** +** * All tables to the left of the right-most RIGHT JOIN are tagged with +** JT_LTORJ (mnemonic: Left Table Of Right Join) so that the +** code generator can easily tell that the table is part of +** the left operand of at least one RIGHT JOIN. +*/ +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse *pParse, SrcList *p){ + (void)pParse; + if( p && p->nSrc>1 ){ + int i = p->nSrc-1; + u8 allFlags = 0; + do{ + allFlags |= p->a[i].fg.jointype = p->a[i-1].fg.jointype; + }while( (--i)>0 ); + p->a[0].fg.jointype = 0; + + /* All terms to the left of a RIGHT JOIN should be tagged with the + ** JT_LTORJ flags */ + if( allFlags & JT_RIGHT ){ + for(i=p->nSrc-1; ALWAYS(i>0) && (p->a[i].fg.jointype&JT_RIGHT)==0; i--){} + i--; + assert( i>=0 ); + do{ + p->a[i].fg.jointype |= JT_LTORJ; + }while( (--i)>=0 ); + } + } +} + +/* +** Generate VDBE code for a BEGIN statement. +*/ +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ + sqlite3 *db; + Vdbe *v; + int i; + + assert( pParse!=0 ); + db = pParse->db; + assert( db!=0 ); + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( !v ) return; + if( type!=TK_DEFERRED ){ + for(i=0; inDb; i++){ + int eTxnType; + Btree *pBt = db->aDb[i].pBt; + if( pBt && sqlite3BtreeIsReadonly(pBt) ){ + eTxnType = 0; /* Read txn */ + }else if( type==TK_EXCLUSIVE ){ + eTxnType = 2; /* Exclusive txn */ + }else{ + eTxnType = 1; /* Write txn */ + } + sqlite3VdbeAddOp2(v, OP_Transaction, i, eTxnType); + sqlite3VdbeUsesBtree(v, i); + } + } + sqlite3VdbeAddOp0(v, OP_AutoCommit); +} + +/* +** Generate VDBE code for a COMMIT or ROLLBACK statement. +** Code for ROLLBACK is generated if eType==TK_ROLLBACK. Otherwise +** code is generated for a COMMIT. +*/ +SQLITE_PRIVATE void sqlite3EndTransaction(Parse *pParse, int eType){ + Vdbe *v; + int isRollback; + + assert( pParse!=0 ); + assert( pParse->db!=0 ); + assert( eType==TK_COMMIT || eType==TK_END || eType==TK_ROLLBACK ); + isRollback = eType==TK_ROLLBACK; + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, + isRollback ? "ROLLBACK" : "COMMIT", 0, 0) ){ + return; + } + v = sqlite3GetVdbe(pParse); + if( v ){ + sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, isRollback); + } +} + +/* +** This function is called by the parser when it parses a command to create, +** release or rollback an SQL savepoint. +*/ +SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){ + char *zName = sqlite3NameFromToken(pParse->db, pName); + if( zName ){ + Vdbe *v = sqlite3GetVdbe(pParse); +#ifndef SQLITE_OMIT_AUTHORIZATION + static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" }; + assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 ); +#endif + if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){ + sqlite3DbFree(pParse->db, zName); + return; + } + sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC); + } +} + +/* +** Make sure the TEMP database is open and available for use. Return +** the number of errors. Leave any error messages in the pParse structure. +*/ +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt==0 && !pParse->explain ){ + int rc; + Btree *pBt; + static const int flags = + SQLITE_OPEN_READWRITE | + SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | + SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_TEMP_DB; + + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pBt, 0, flags); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "unable to open a temporary database " + "file for storing temporary tables"); + pParse->rc = rc; + return 1; + } + db->aDb[1].pBt = pBt; + assert( db->aDb[1].pSchema ); + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, 0, 0) ){ + sqlite3OomFault(db); + return 1; + } + } + return 0; +} + +/* +** Record the fact that the schema cookie will need to be verified +** for database iDb. The code to actually verify the schema cookie +** will occur at the end of the top-level VDBE and will be generated +** later, by sqlite3FinishCoding(). +*/ +static void sqlite3CodeVerifySchemaAtToplevel(Parse *pToplevel, int iDb){ + assert( iDb>=0 && iDbdb->nDb ); + assert( pToplevel->db->aDb[iDb].pBt!=0 || iDb==1 ); + assert( iDbdb, iDb, 0) ); + if( DbMaskTest(pToplevel->cookieMask, iDb)==0 ){ + DbMaskSet(pToplevel->cookieMask, iDb); + if( !OMIT_TEMPDB && iDb==1 ){ + sqlite3OpenTempDatabase(pToplevel); + } + } +} +SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ + sqlite3CodeVerifySchemaAtToplevel(sqlite3ParseToplevel(pParse), iDb); +} + + +/* +** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each +** attached database. Otherwise, invoke it for the database named zDb only. +*/ +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){ + sqlite3 *db = pParse->db; + int i; + for(i=0; inDb; i++){ + Db *pDb = &db->aDb[i]; + if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zDbSName)) ){ + sqlite3CodeVerifySchema(pParse, i); + } + } +} + +/* +** Generate VDBE code that prepares for doing an operation that +** might change the database. +** +** This routine starts a new transaction if we are not already within +** a transaction. If we are already within a transaction, then a checkpoint +** is set if the setStatement parameter is true. A checkpoint should +** be set for operations that might fail (due to a constraint) part of +** the way through and which will need to undo some writes without having to +** rollback the whole transaction. For operations where all constraints +** can be checked before any changes are made to the database, it is never +** necessary to undo a write and the checkpoint should not be set. +*/ +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + sqlite3CodeVerifySchemaAtToplevel(pToplevel, iDb); + DbMaskSet(pToplevel->writeMask, iDb); + pToplevel->isMultiWrite |= setStatement; +} + +/* +** Indicate that the statement currently under construction might write +** more than one entry (example: deleting one row then inserting another, +** inserting multiple rows in a table, or inserting a row and index entries.) +** If an abort occurs after some of these writes have completed, then it will +** be necessary to undo the completed writes. +*/ +SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pToplevel->isMultiWrite = 1; +} + +/* +** The code generator calls this routine if is discovers that it is +** possible to abort a statement prior to completion. In order to +** perform this abort without corrupting the database, we need to make +** sure that the statement is protected by a statement transaction. +** +** Technically, we only need to set the mayAbort flag if the +** isMultiWrite flag was previously set. There is a time dependency +** such that the abort must occur after the multiwrite. This makes +** some statements involving the REPLACE conflict resolution algorithm +** go a little faster. But taking advantage of this time dependency +** makes it more difficult to prove that the code is correct (in +** particular, it prevents us from writing an effective +** implementation of sqlite3AssertMayAbort()) and so we have chosen +** to take the safe route and skip the optimization. +*/ +SQLITE_PRIVATE void sqlite3MayAbort(Parse *pParse){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + pToplevel->mayAbort = 1; +} + +/* +** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT +** error. The onError parameter determines which (if any) of the statement +** and/or current transaction is rolled back. +*/ +SQLITE_PRIVATE void sqlite3HaltConstraint( + Parse *pParse, /* Parsing context */ + int errCode, /* extended error code */ + int onError, /* Constraint type */ + char *p4, /* Error message */ + i8 p4type, /* P4_STATIC or P4_TRANSIENT */ + u8 p5Errmsg /* P5_ErrMsg type */ +){ + Vdbe *v; + assert( pParse->pVdbe!=0 ); + v = sqlite3GetVdbe(pParse); + assert( (errCode&0xff)==SQLITE_CONSTRAINT || pParse->nested ); + if( onError==OE_Abort ){ + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp4(v, OP_Halt, errCode, onError, 0, p4, p4type); + sqlite3VdbeChangeP5(v, p5Errmsg); +} + +/* +** Code an OP_Halt due to UNIQUE or PRIMARY KEY constraint violation. +*/ +SQLITE_PRIVATE void sqlite3UniqueConstraint( + Parse *pParse, /* Parsing context */ + int onError, /* Constraint type */ + Index *pIdx /* The index that triggers the constraint */ +){ + char *zErr; + int j; + StrAccum errMsg; + Table *pTab = pIdx->pTable; + + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, + pParse->db->aLimit[SQLITE_LIMIT_LENGTH]); + if( pIdx->aColExpr ){ + sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName); + }else{ + for(j=0; jnKeyCol; j++){ + char *zCol; + assert( pIdx->aiColumn[j]>=0 ); + zCol = pTab->aCol[pIdx->aiColumn[j]].zCnName; + if( j ) sqlite3_str_append(&errMsg, ", ", 2); + sqlite3_str_appendall(&errMsg, pTab->zName); + sqlite3_str_append(&errMsg, ".", 1); + sqlite3_str_appendall(&errMsg, zCol); + } + } + zErr = sqlite3StrAccumFinish(&errMsg); + sqlite3HaltConstraint(pParse, + IsPrimaryKeyIndex(pIdx) ? SQLITE_CONSTRAINT_PRIMARYKEY + : SQLITE_CONSTRAINT_UNIQUE, + onError, zErr, P4_DYNAMIC, P5_ConstraintUnique); +} + + +/* +** Code an OP_Halt due to non-unique rowid. +*/ +SQLITE_PRIVATE void sqlite3RowidConstraint( + Parse *pParse, /* Parsing context */ + int onError, /* Conflict resolution algorithm */ + Table *pTab /* The table with the non-unique rowid */ +){ + char *zMsg; + int rc; + if( pTab->iPKey>=0 ){ + zMsg = sqlite3MPrintf(pParse->db, "%s.%s", pTab->zName, + pTab->aCol[pTab->iPKey].zCnName); + rc = SQLITE_CONSTRAINT_PRIMARYKEY; + }else{ + zMsg = sqlite3MPrintf(pParse->db, "%s.rowid", pTab->zName); + rc = SQLITE_CONSTRAINT_ROWID; + } + sqlite3HaltConstraint(pParse, rc, onError, zMsg, P4_DYNAMIC, + P5_ConstraintUnique); +} + +/* +** Check to see if pIndex uses the collating sequence pColl. Return +** true if it does and false if it does not. +*/ +#ifndef SQLITE_OMIT_REINDEX +static int collationMatch(const char *zColl, Index *pIndex){ + int i; + assert( zColl!=0 ); + for(i=0; inColumn; i++){ + const char *z = pIndex->azColl[i]; + assert( z!=0 || pIndex->aiColumn[i]<0 ); + if( pIndex->aiColumn[i]>=0 && 0==sqlite3StrICmp(z, zColl) ){ + return 1; + } + } + return 0; +} +#endif + +/* +** Recompute all indices of pTab that use the collating sequence pColl. +** If pColl==0 then recompute all indices of pTab. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ + + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } + } + } +} +#endif + +/* +** Recompute all indices of all tables in all databases where the +** indices use the collating sequence pColl. If pColl==0 then recompute +** all indices everywhere. +*/ +#ifndef SQLITE_OMIT_REINDEX +static void reindexDatabases(Parse *pParse, char const *zColl){ + Db *pDb; /* A single database */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + HashElem *k; /* For looping over tables in pDb */ + Table *pTab; /* A table in the database */ + + assert( sqlite3BtreeHoldsAllMutexes(db) ); /* Needed for schema access */ + for(iDb=0, pDb=db->aDb; iDbnDb; iDb++, pDb++){ + assert( pDb!=0 ); + for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + reindexTable(pParse, pTab, zColl); + } + } +} +#endif + +/* +** Generate code for the REINDEX command. +** +** REINDEX -- 1 +** REINDEX -- 2 +** REINDEX ?.? -- 3 +** REINDEX ?.? -- 4 +** +** Form 1 causes all indices in all attached databases to be rebuilt. +** Form 2 rebuilds all indices in all databases that use the named +** collating function. Forms 3 and 4 rebuild the named index or all +** indices associated with the named table. +*/ +#ifndef SQLITE_OMIT_REINDEX +SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ + CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */ + char *z; /* Name of a table or index */ + const char *zDb; /* Name of the database */ + Table *pTab; /* A table in the database */ + Index *pIndex; /* An index associated with pTab */ + int iDb; /* The database index number */ + sqlite3 *db = pParse->db; /* The database connection */ + Token *pObjName; /* Name of the table or index to be reindexed */ + + /* Read the database schema. If an error occurs, leave an error message + ** and code in pParse and return NULL. */ + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + return; + } + + if( pName1==0 ){ + reindexDatabases(pParse, 0); + return; + }else if( NEVER(pName2==0) || pName2->z==0 ){ + char *zColl; + assert( pName1->z ); + zColl = sqlite3NameFromToken(pParse->db, pName1); + if( !zColl ) return; + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + if( pColl ){ + reindexDatabases(pParse, zColl); + sqlite3DbFree(db, zColl); + return; + } + sqlite3DbFree(db, zColl); + } + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); + if( iDb<0 ) return; + z = sqlite3NameFromToken(db, pObjName); + if( z==0 ) return; + zDb = db->aDb[iDb].zDbSName; + pTab = sqlite3FindTable(db, z, zDb); + if( pTab ){ + reindexTable(pParse, pTab, 0); + sqlite3DbFree(db, z); + return; + } + pIndex = sqlite3FindIndex(db, z, zDb); + sqlite3DbFree(db, z); + if( pIndex ){ + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + return; + } + sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed"); +} +#endif + +/* +** Return a KeyInfo structure that is appropriate for the given Index. +** +** The caller should invoke sqlite3KeyInfoUnref() on the returned object +** when it has finished using it. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ + int i; + int nCol = pIdx->nColumn; + int nKey = pIdx->nKeyCol; + KeyInfo *pKey; + if( pParse->nErr ) return 0; + if( pIdx->uniqNotNull ){ + pKey = sqlite3KeyInfoAlloc(pParse->db, nKey, nCol-nKey); + }else{ + pKey = sqlite3KeyInfoAlloc(pParse->db, nCol, 0); + } + if( pKey ){ + assert( sqlite3KeyInfoIsWriteable(pKey) ); + for(i=0; iazColl[i]; + pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : + sqlite3LocateCollSeq(pParse, zColl); + pKey->aSortFlags[i] = pIdx->aSortOrder[i]; + assert( 0==(pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) ); + } + if( pParse->nErr ){ + assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); + if( pIdx->bNoQuery==0 ){ + /* Deactivate the index because it contains an unknown collating + ** sequence. The only way to reactive the index is to reload the + ** schema. Adding the missing collating sequence later does not + ** reactive the index. The application had the chance to register + ** the missing index using the collation-needed callback. For + ** simplicity, SQLite will not give the application a second chance. + */ + pIdx->bNoQuery = 1; + pParse->rc = SQLITE_ERROR_RETRY; + } + sqlite3KeyInfoUnref(pKey); + pKey = 0; + } + } + return pKey; +} + +#ifndef SQLITE_OMIT_CTE +/* +** Create a new CTE object +*/ +SQLITE_PRIVATE Cte *sqlite3CteNew( + Parse *pParse, /* Parsing context */ + Token *pName, /* Name of the common-table */ + ExprList *pArglist, /* Optional column name list for the table */ + Select *pQuery, /* Query used to initialize the table */ + u8 eM10d /* The MATERIALIZED flag */ +){ + Cte *pNew; + sqlite3 *db = pParse->db; + + pNew = sqlite3DbMallocZero(db, sizeof(*pNew)); + assert( pNew!=0 || db->mallocFailed ); + + if( db->mallocFailed ){ + sqlite3ExprListDelete(db, pArglist); + sqlite3SelectDelete(db, pQuery); + }else{ + pNew->pSelect = pQuery; + pNew->pCols = pArglist; + pNew->zName = sqlite3NameFromToken(pParse->db, pName); + pNew->eM10d = eM10d; + } + return pNew; +} + +/* +** Clear information from a Cte object, but do not deallocate storage +** for the object itself. +*/ +static void cteClear(sqlite3 *db, Cte *pCte){ + assert( pCte!=0 ); + sqlite3ExprListDelete(db, pCte->pCols); + sqlite3SelectDelete(db, pCte->pSelect); + sqlite3DbFree(db, pCte->zName); +} + +/* +** Free the contents of the CTE object passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3CteDelete(sqlite3 *db, Cte *pCte){ + assert( pCte!=0 ); + cteClear(db, pCte); + sqlite3DbFree(db, pCte); +} + +/* +** This routine is invoked once per CTE by the parser while parsing a +** WITH clause. The CTE described by teh third argument is added to +** the WITH clause of the second argument. If the second argument is +** NULL, then a new WITH argument is created. +*/ +SQLITE_PRIVATE With *sqlite3WithAdd( + Parse *pParse, /* Parsing context */ + With *pWith, /* Existing WITH clause, or NULL */ + Cte *pCte /* CTE to add to the WITH clause */ +){ + sqlite3 *db = pParse->db; + With *pNew; + char *zName; + + if( pCte==0 ){ + return pWith; + } + + /* Check that the CTE name is unique within this WITH clause. If + ** not, store an error in the Parse structure. */ + zName = pCte->zName; + if( zName && pWith ){ + int i; + for(i=0; inCte; i++){ + if( sqlite3StrICmp(zName, pWith->a[i].zName)==0 ){ + sqlite3ErrorMsg(pParse, "duplicate WITH table name: %s", zName); + } + } + } + + if( pWith ){ + sqlite3_int64 nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); + pNew = sqlite3DbRealloc(db, pWith, nByte); + }else{ + pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); + } + assert( (pNew!=0 && zName!=0) || db->mallocFailed ); + + if( db->mallocFailed ){ + sqlite3CteDelete(db, pCte); + pNew = pWith; + }else{ + pNew->a[pNew->nCte++] = *pCte; + sqlite3DbFree(db, pCte); + } + + return pNew; +} + +/* +** Free the contents of the With object passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ + if( pWith ){ + int i; + for(i=0; inCte; i++){ + cteClear(db, &pWith->a[i]); + } + sqlite3DbFree(db, pWith); + } +} +#endif /* !defined(SQLITE_OMIT_CTE) */ + +/************** End of build.c ***********************************************/ +/************** Begin file callback.c ****************************************/ +/* +** 2005 May 23 +** +** 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 contains functions used to access the internal hash tables +** of user defined functions and collation sequences. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Invoke the 'collation needed' callback to request a collation sequence +** in the encoding enc of name zName, length nName. +*/ +static void callCollNeeded(sqlite3 *db, int enc, const char *zName){ + assert( !db->xCollNeeded || !db->xCollNeeded16 ); + if( db->xCollNeeded ){ + char *zExternal = sqlite3DbStrDup(db, zName); + if( !zExternal ) return; + db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal); + sqlite3DbFree(db, zExternal); + } +#ifndef SQLITE_OMIT_UTF16 + if( db->xCollNeeded16 ){ + char const *zExternal; + sqlite3_value *pTmp = sqlite3ValueNew(db); + sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC); + zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE); + if( zExternal ){ + db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); + } + sqlite3ValueFree(pTmp); + } +#endif +} + +/* +** This routine is called if the collation factory fails to deliver a +** collation function in the best encoding but there may be other versions +** of this collation function (for other text encodings) available. Use one +** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if +** possible. +*/ +static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ + CollSeq *pColl2; + char *z = pColl->zName; + int i; + static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 }; + for(i=0; i<3; i++){ + pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0); + if( pColl2->xCmp!=0 ){ + memcpy(pColl, pColl2, sizeof(CollSeq)); + pColl->xDel = 0; /* Do not copy the destructor */ + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +/* +** This routine is called on a collation sequence before it is used to +** check that it is defined. An undefined collation sequence exists when +** a database is loaded that contains references to collation sequences +** that have not been defined by sqlite3_create_collation() etc. +** +** If required, this routine calls the 'collation needed' callback to +** request a definition of the collating sequence. If this doesn't work, +** an equivalent collating sequence that uses a text encoding different +** from the main database is substituted, if one is available. +*/ +SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ + if( pColl && pColl->xCmp==0 ){ + const char *zName = pColl->zName; + sqlite3 *db = pParse->db; + CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName); + if( !p ){ + return SQLITE_ERROR; + } + assert( p==pColl ); + } + return SQLITE_OK; +} + + + +/* +** Locate and return an entry from the db.aCollSeq hash table. If the entry +** specified by zName and nName is not found and parameter 'create' is +** true, then create a new entry. Otherwise return NULL. +** +** Each pointer stored in the sqlite3.aCollSeq hash table contains an +** array of three CollSeq structures. The first is the collation sequence +** preferred for UTF-8, the second UTF-16le, and the third UTF-16be. +** +** Stored immediately after the three collation sequences is a copy of +** the collation sequence name. A pointer to this string is stored in +** each collation sequence structure. +*/ +static CollSeq *findCollSeqEntry( + sqlite3 *db, /* Database connection */ + const char *zName, /* Name of the collating sequence */ + int create /* Create a new entry if true */ +){ + CollSeq *pColl; + pColl = sqlite3HashFind(&db->aCollSeq, zName); + + if( 0==pColl && create ){ + int nName = sqlite3Strlen30(zName) + 1; + pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName); + if( pColl ){ + CollSeq *pDel = 0; + pColl[0].zName = (char*)&pColl[3]; + pColl[0].enc = SQLITE_UTF8; + pColl[1].zName = (char*)&pColl[3]; + pColl[1].enc = SQLITE_UTF16LE; + pColl[2].zName = (char*)&pColl[3]; + pColl[2].enc = SQLITE_UTF16BE; + memcpy(pColl[0].zName, zName, nName); + pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); + + /* If a malloc() failure occurred in sqlite3HashInsert(), it will + ** return the pColl pointer to be deleted (because it wasn't added + ** to the hash table). + */ + assert( pDel==0 || pDel==pColl ); + if( pDel!=0 ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pColl = 0; + } + } + } + return pColl; +} + +/* +** Parameter zName points to a UTF-8 encoded string nName bytes long. +** Return the CollSeq* pointer for the collation sequence named zName +** for the encoding 'enc' from the database 'db'. +** +** If the entry specified is not found and 'create' is true, then create a +** new entry. Otherwise return NULL. +** +** A separate function sqlite3LocateCollSeq() is a wrapper around +** this routine. sqlite3LocateCollSeq() invokes the collation factory +** if necessary and generates an error message if the collating sequence +** cannot be found. +** +** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( + sqlite3 *db, /* Database connection to search */ + u8 enc, /* Desired text encoding */ + const char *zName, /* Name of the collating sequence. Might be NULL */ + int create /* True to create CollSeq if doesn't already exist */ +){ + CollSeq *pColl; + assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); + if( zName ){ + pColl = findCollSeqEntry(db, zName, create); + if( pColl ) pColl += enc-1; + }else{ + pColl = db->pDfltColl; + } + return pColl; +} + +/* +** Change the text encoding for a database connection. This means that +** the pDfltColl must change as well. +*/ +SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){ + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + db->enc = enc; + /* EVIDENCE-OF: R-08308-17224 The default collating function for all + ** strings is BINARY. + */ + db->pDfltColl = sqlite3FindCollSeq(db, enc, sqlite3StrBINARY, 0); +} + +/* +** This function is responsible for invoking the collation factory callback +** or substituting a collation sequence of a different encoding when the +** requested collation sequence is not available in the desired encoding. +** +** If it is not NULL, then pColl must point to the database native encoding +** collation sequence with name zName, length nName. +** +** The return value is either the collation sequence to be used in database +** db for collation type name zName, length nName, or NULL, if no collation +** sequence can be found. If no collation is found, leave an error message. +** +** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( + Parse *pParse, /* Parsing context */ + u8 enc, /* The desired encoding for the collating sequence */ + CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ + const char *zName /* Collating sequence name */ +){ + CollSeq *p; + sqlite3 *db = pParse->db; + + p = pColl; + if( !p ){ + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( !p || !p->xCmp ){ + /* No collation sequence of this type for this encoding is registered. + ** Call the collation factory to see if it can supply us with one. + */ + callCollNeeded(db, enc, zName); + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( p && !p->xCmp && synthCollSeq(db, p) ){ + p = 0; + } + assert( !p || p->xCmp ); + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; + } + return p; +} + +/* +** This function returns the collation sequence for database native text +** encoding identified by the string zName. +** +** If the requested collation sequence is not available, or not available +** in the database native encoding, the collation factory is invoked to +** request it. If the collation factory does not supply such a sequence, +** and the sequence is available in another text encoding, then that is +** returned instead. +** +** If no versions of the requested collations sequence are available, or +** another error occurs, NULL is returned and an error message written into +** pParse. +** +** This routine is a wrapper around sqlite3FindCollSeq(). This routine +** invokes the collation factory if the named collation cannot be found +** and generates an error message. +** +** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() +*/ +SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + u8 initbusy = db->init.busy; + CollSeq *pColl; + + pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); + if( !initbusy && (!pColl || !pColl->xCmp) ){ + pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); + } + + return pColl; +} + +/* During the search for the best function definition, this procedure +** is called to test how well the function passed as the first argument +** matches the request for a function with nArg arguments in a system +** that uses encoding enc. The value returned indicates how well the +** request is matched. A higher value indicates a better match. +** +** If nArg is -1 that means to only return a match (non-zero) if p->nArg +** is also -1. In other words, we are searching for a function that +** takes a variable number of arguments. +** +** If nArg is -2 that means that we are searching for any function +** regardless of the number of arguments it uses, so return a positive +** match score for any +** +** The returned value is always between 0 and 6, as follows: +** +** 0: Not a match. +** 1: UTF8/16 conversion required and function takes any number of arguments. +** 2: UTF16 byte order change required and function takes any number of args. +** 3: encoding matches and function takes any number of arguments +** 4: UTF8/16 conversion required - argument count matches exactly +** 5: UTF16 byte order conversion required - argument count matches exactly +** 6: Perfect match: encoding and argument count match exactly. +** +** If nArg==(-2) then any function with a non-null xSFunc is +** a perfect match and any function with xSFunc NULL is +** a non-match. +*/ +#define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */ +static int matchQuality( + FuncDef *p, /* The function we are evaluating for match quality */ + int nArg, /* Desired number of arguments. (-1)==any */ + u8 enc /* Desired text encoding */ +){ + int match; + assert( p->nArg>=-1 ); + + /* Wrong number of arguments means "no match" */ + if( p->nArg!=nArg ){ + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + if( p->nArg>=0 ) return 0; + } + + /* Give a better score to a function with a specific number of arguments + ** than to function that accepts any number of arguments. */ + if( p->nArg==nArg ){ + match = 4; + }else{ + match = 1; + } + + /* Bonus points if the text encoding matches */ + if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){ + match += 2; /* Exact encoding match */ + }else if( (enc & p->funcFlags & 2)!=0 ){ + match += 1; /* Both are UTF16, but with different byte orders */ + } + + return match; +} + +/* +** Search a FuncDefHash for a function with the given name. Return +** a pointer to the matching FuncDef if found, or 0 if there is no match. +*/ +SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch( + int h, /* Hash of the name */ + const char *zFunc /* Name of function */ +){ + FuncDef *p; + for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ + assert( p->funcFlags & SQLITE_FUNC_BUILTIN ); + if( sqlite3StrICmp(p->zName, zFunc)==0 ){ + return p; + } + } + return 0; +} + +/* +** Insert a new FuncDef into a FuncDefHash hash table. +*/ +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( + FuncDef *aDef, /* List of global functions to be inserted */ + int nDef /* Length of the apDef[] list */ +){ + int i; + for(i=0; ipNext!=&aDef[i] ); + aDef[i].pNext = pOther->pNext; + pOther->pNext = &aDef[i]; + }else{ + aDef[i].pNext = 0; + aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h]; + sqlite3BuiltinFunctions.a[h] = &aDef[i]; + } + } +} + + + +/* +** Locate a user function given a name, a number of arguments and a flag +** indicating whether the function prefers UTF-16 over UTF-8. Return a +** pointer to the FuncDef structure that defines that function, or return +** NULL if the function does not exist. +** +** If the createFlag argument is true, then a new (blank) FuncDef +** structure is created and liked into the "db" structure if a +** no matching function previously existed. +** +** If nArg is -2, then the first valid function found is returned. A +** function is valid if xSFunc is non-zero. The nArg==(-2) +** case is used to see if zName is a valid function name for some number +** of arguments. If nArg is -2, then createFlag must be 0. +** +** If createFlag is false, then a function with the required name and +** number of arguments may be returned even if the eTextRep flag does not +** match that requested. +*/ +SQLITE_PRIVATE FuncDef *sqlite3FindFunction( + sqlite3 *db, /* An open database */ + const char *zName, /* Name of the function. zero-terminated */ + int nArg, /* Number of arguments. -1 means any number */ + u8 enc, /* Preferred text encoding */ + u8 createFlag /* Create new entry if true and does not otherwise exist */ +){ + FuncDef *p; /* Iterator variable */ + FuncDef *pBest = 0; /* Best match found so far */ + int bestScore = 0; /* Score of best match */ + int h; /* Hash value */ + int nName; /* Length of the name */ + + assert( nArg>=(-2) ); + assert( nArg>=(-1) || createFlag==0 ); + nName = sqlite3Strlen30(zName); + + /* First search for a match amongst the application-defined functions. + */ + p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName); + while( p ){ + int score = matchQuality(p, nArg, enc); + if( score>bestScore ){ + pBest = p; + bestScore = score; + } + p = p->pNext; + } + + /* If no match is found, search the built-in functions. + ** + ** If the DBFLAG_PreferBuiltin flag is set, then search the built-in + ** functions even if a prior app-defined function was found. And give + ** priority to built-in functions. + ** + ** Except, if createFlag is true, that means that we are trying to + ** install a new function. Whatever FuncDef structure is returned it will + ** have fields overwritten with new information appropriate for the + ** new function. But the FuncDefs for built-in functions are read-only. + ** So we must not search for built-ins when creating a new function. + */ + if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ + bestScore = 0; + h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); + p = sqlite3FunctionSearch(h, zName); + while( p ){ + int score = matchQuality(p, nArg, enc); + if( score>bestScore ){ + pBest = p; + bestScore = score; + } + p = p->pNext; + } + } + + /* If the createFlag parameter is true and the search did not reveal an + ** exact match for the name, number of arguments and encoding, then add a + ** new entry to the hash table and return it. + */ + if( createFlag && bestScorezName = (const char*)&pBest[1]; + pBest->nArg = (u16)nArg; + pBest->funcFlags = enc; + memcpy((char*)&pBest[1], zName, nName+1); + for(z=(u8*)pBest->zName; *z; z++) *z = sqlite3UpperToLower[*z]; + pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest); + if( pOther==pBest ){ + sqlite3DbFree(db, pBest); + sqlite3OomFault(db); + return 0; + }else{ + pBest->pNext = pOther; + } + } + + if( pBest && (pBest->xSFunc || createFlag) ){ + return pBest; + } + return 0; +} + +/* +** Free all resources held by the schema structure. The void* argument points +** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the +** pointer itself, it just cleans up subsidiary resources (i.e. the contents +** of the schema hash tables). +** +** The Schema.cache_size variable is not cleared. +*/ +SQLITE_PRIVATE void sqlite3SchemaClear(void *p){ + Hash temp1; + Hash temp2; + HashElem *pElem; + Schema *pSchema = (Schema *)p; + + temp1 = pSchema->tblHash; + temp2 = pSchema->trigHash; + sqlite3HashInit(&pSchema->trigHash); + sqlite3HashClear(&pSchema->idxHash); + for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ + sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem)); + } + sqlite3HashClear(&temp2); + sqlite3HashInit(&pSchema->tblHash); + for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ + Table *pTab = sqliteHashData(pElem); + sqlite3DeleteTable(0, pTab); + } + sqlite3HashClear(&temp1); + sqlite3HashClear(&pSchema->fkeyHash); + pSchema->pSeqTab = 0; + if( pSchema->schemaFlags & DB_SchemaLoaded ){ + pSchema->iGeneration++; + } + pSchema->schemaFlags &= ~(DB_SchemaLoaded|DB_ResetWanted); +} + +/* +** Find and return the schema associated with a BTree. Create +** a new one if necessary. +*/ +SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ + Schema * p; + if( pBt ){ + p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear); + }else{ + p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); + } + if( !p ){ + sqlite3OomFault(db); + }else if ( 0==p->file_format ){ + sqlite3HashInit(&p->tblHash); + sqlite3HashInit(&p->idxHash); + sqlite3HashInit(&p->trigHash); + sqlite3HashInit(&p->fkeyHash); + p->enc = SQLITE_UTF8; + } + return p; +} + +/************** End of callback.c ********************************************/ +/************** Begin file delete.c ******************************************/ +/* +** 2001 September 15 +** +** 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 contains C code routines that are called by the parser +** in order to generate code for DELETE FROM statements. +*/ +/* #include "sqliteInt.h" */ + +/* +** While a SrcList can in general represent multiple tables and subqueries +** (as in the FROM clause of a SELECT statement) in this case it contains +** the name of a single table, as one might find in an INSERT, DELETE, +** or UPDATE statement. Look up that table in the symbol table and +** return a pointer. Set an error message and return NULL if the table +** name is not found or if any other error occurs. +** +** The following fields are initialized appropriate in pSrc: +** +** pSrc->a[0].pTab Pointer to the Table object +** pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one +** +*/ +SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ + SrcItem *pItem = pSrc->a; + Table *pTab; + assert( pItem && pSrc->nSrc>=1 ); + pTab = sqlite3LocateTableItem(pParse, 0, pItem); + sqlite3DeleteTable(pParse->db, pItem->pTab); + pItem->pTab = pTab; + if( pTab ){ + pTab->nTabRef++; + if( pItem->fg.isIndexedBy && sqlite3IndexedByLookup(pParse, pItem) ){ + pTab = 0; + } + } + return pTab; +} + +/* Generate byte-code that will report the number of rows modified +** by a DELETE, INSERT, or UPDATE statement. +*/ +SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe *v, int regCounter, const char *zColName){ + sqlite3VdbeAddOp0(v, OP_FkCheck); + sqlite3VdbeAddOp2(v, OP_ResultRow, regCounter, 1); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zColName, SQLITE_STATIC); +} + +/* Return true if table pTab is read-only. +** +** A table is read-only if any of the following are true: +** +** 1) It is a virtual table and no implementation of the xUpdate method +** has been provided +** +** 2) It is a system table (i.e. sqlite_schema), this call is not +** part of a nested parse and writable_schema pragma has not +** been specified +** +** 3) The table is a shadow table, the database connection is in +** defensive mode, and the current sqlite3_prepare() +** is for a top-level SQL statement. +*/ +static int tabIsReadOnly(Parse *pParse, Table *pTab){ + sqlite3 *db; + if( IsVirtual(pTab) ){ + return sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0; + } + if( (pTab->tabFlags & (TF_Readonly|TF_Shadow))==0 ) return 0; + db = pParse->db; + if( (pTab->tabFlags & TF_Readonly)!=0 ){ + return sqlite3WritableSchema(db)==0 && pParse->nested==0; + } + assert( pTab->tabFlags & TF_Shadow ); + return sqlite3ReadOnlyShadowTables(db); +} + +/* +** Check to make sure the given table is writable. If it is not +** writable, generate an error message and return 1. If it is +** writable return 0; +*/ +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ + if( tabIsReadOnly(pParse, pTab) ){ + sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); + return 1; + } +#ifndef SQLITE_OMIT_VIEW + if( !viewOk && IsView(pTab) ){ + sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); + return 1; + } +#endif + return 0; +} + + +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) +/* +** Evaluate a view and store its result in an ephemeral table. The +** pWhere argument is an optional WHERE clause that restricts the +** set of rows in the view that are to be added to the ephemeral table. +*/ +SQLITE_PRIVATE void sqlite3MaterializeView( + Parse *pParse, /* Parsing context */ + Table *pView, /* View definition */ + Expr *pWhere, /* Optional WHERE clause to be added */ + ExprList *pOrderBy, /* Optional ORDER BY clause */ + Expr *pLimit, /* Optional LIMIT clause */ + int iCur /* Cursor number for ephemeral table */ +){ + SelectDest dest; + Select *pSel; + SrcList *pFrom; + sqlite3 *db = pParse->db; + int iDb = sqlite3SchemaToIndex(db, pView->pSchema); + pWhere = sqlite3ExprDup(db, pWhere, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pFrom ){ + assert( pFrom->nSrc==1 ); + pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); + pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); + assert( pFrom->a[0].fg.isUsing==0 ); + assert( pFrom->a[0].u3.pOn==0 ); + } + pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, + SF_IncludeHidden, pLimit); + sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); + sqlite3Select(pParse, pSel, &dest); + sqlite3SelectDelete(db, pSel); +} +#endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */ + +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Generate an expression tree to implement the WHERE, ORDER BY, +** and LIMIT/OFFSET portion of DELETE and UPDATE statements. +** +** DELETE FROM table_wxyz WHERE a<5 ORDER BY a LIMIT 1; +** \__________________________/ +** pLimitWhere (pInClause) +*/ +SQLITE_PRIVATE Expr *sqlite3LimitWhere( + Parse *pParse, /* The parser context */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* The WHERE clause. May be null */ + ExprList *pOrderBy, /* The ORDER BY clause. May be null */ + Expr *pLimit, /* The LIMIT clause. May be null */ + char *zStmtType /* Either DELETE or UPDATE. For err msgs. */ +){ + sqlite3 *db = pParse->db; + Expr *pLhs = NULL; /* LHS of IN(SELECT...) operator */ + Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */ + ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */ + SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */ + Select *pSelect = NULL; /* Complete SELECT tree */ + Table *pTab; + + /* Check that there isn't an ORDER BY without a LIMIT clause. + */ + if( pOrderBy && pLimit==0 ) { + sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType); + sqlite3ExprDelete(pParse->db, pWhere); + sqlite3ExprListDelete(pParse->db, pOrderBy); + return 0; + } + + /* We only need to generate a select expression if there + ** is a limit/offset term to enforce. + */ + if( pLimit == 0 ) { + return pWhere; + } + + /* Generate a select expression tree to enforce the limit/offset + ** term for the DELETE or UPDATE statement. For example: + ** DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 + ** becomes: + ** DELETE FROM table_a WHERE rowid IN ( + ** SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1 + ** ); + */ + + pTab = pSrc->a[0].pTab; + if( HasRowid(pTab) ){ + pLhs = sqlite3PExpr(pParse, TK_ROW, 0, 0); + pEList = sqlite3ExprListAppend( + pParse, 0, sqlite3PExpr(pParse, TK_ROW, 0, 0) + ); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + if( pPk->nKeyCol==1 ){ + const char *zName = pTab->aCol[pPk->aiColumn[0]].zCnName; + pLhs = sqlite3Expr(db, TK_ID, zName); + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName)); + }else{ + int i; + for(i=0; inKeyCol; i++){ + Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zCnName); + pEList = sqlite3ExprListAppend(pParse, pEList, p); + } + pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( pLhs ){ + pLhs->x.pList = sqlite3ExprListDup(db, pEList, 0); + } + } + } + + /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree + ** and the SELECT subtree. */ + pSrc->a[0].pTab = 0; + pSelectSrc = sqlite3SrcListDup(db, pSrc, 0); + pSrc->a[0].pTab = pTab; + if( pSrc->a[0].fg.isIndexedBy ){ + assert( pSrc->a[0].fg.isCte==0 ); + pSrc->a[0].u2.pIBIndex = 0; + pSrc->a[0].fg.isIndexedBy = 0; + sqlite3DbFree(db, pSrc->a[0].u1.zIndexedBy); + }else if( pSrc->a[0].fg.isCte ){ + pSrc->a[0].u2.pCteUse->nUse++; + } + + /* generate the SELECT expression tree. */ + pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0, + pOrderBy,0,pLimit + ); + + /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */ + pInClause = sqlite3PExpr(pParse, TK_IN, pLhs, 0); + sqlite3PExprAddSelect(pParse, pInClause, pSelect); + return pInClause; +} +#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */ + /* && !defined(SQLITE_OMIT_SUBQUERY) */ + +/* +** Generate code for a DELETE FROM statement. +** +** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; +** \________/ \________________/ +** pTabList pWhere +*/ +SQLITE_PRIVATE void sqlite3DeleteFrom( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table from which we should delete things */ + Expr *pWhere, /* The WHERE clause. May be null */ + ExprList *pOrderBy, /* ORDER BY clause. May be null */ + Expr *pLimit /* LIMIT clause. May be null */ +){ + Vdbe *v; /* The virtual database engine */ + Table *pTab; /* The table from which records will be deleted */ + int i; /* Loop counter */ + WhereInfo *pWInfo; /* Information about the WHERE clause */ + Index *pIdx; /* For looping over indices of the table */ + int iTabCur; /* Cursor number for the table */ + int iDataCur = 0; /* VDBE cursor for the canonical data source */ + int iIdxCur = 0; /* Cursor number of the first index */ + int nIdx; /* Number of indices */ + sqlite3 *db; /* Main database structure */ + AuthContext sContext; /* Authorization context */ + NameContext sNC; /* Name context to resolve expressions in */ + int iDb; /* Database number */ + int memCnt = 0; /* Memory cell used for change counting */ + int rcauth; /* Value returned by authorization callback */ + int eOnePass; /* ONEPASS_OFF or _SINGLE or _MULTI */ + int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + u8 *aToOpen = 0; /* Open cursor iTabCur+j if aToOpen[j] is true */ + Index *pPk; /* The PRIMARY KEY index on the table */ + int iPk = 0; /* First of nPk registers holding PRIMARY KEY value */ + i16 nPk = 1; /* Number of columns in the PRIMARY KEY */ + int iKey; /* Memory cell holding key of row to be deleted */ + i16 nKey; /* Number of memory cells in the row key */ + int iEphCur = 0; /* Ephemeral table holding all primary key values */ + int iRowSet = 0; /* Register for rowset of rows to delete */ + int addrBypass = 0; /* Address of jump over the delete logic */ + int addrLoop = 0; /* Top of the delete loop */ + int addrEphOpen = 0; /* Instruction to open the Ephemeral table */ + int bComplex; /* True if there are triggers or FKs or + ** subqueries in the WHERE clause */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to delete from a view */ + Trigger *pTrigger; /* List of table triggers, if required */ +#endif + + memset(&sContext, 0, sizeof(sContext)); + db = pParse->db; + assert( db->pParse==pParse ); + if( pParse->nErr ){ + goto delete_from_cleanup; + } + assert( db->mallocFailed==0 ); + assert( pTabList->nSrc==1 ); + + /* Locate the table which we want to delete. This table has to be + ** put in an SrcList structure because some of the subroutines we + ** will be calling are designed to work with multiple tables and expect + ** an SrcList* parameter instead of just a Table* parameter. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto delete_from_cleanup; + + /* Figure out if we have any triggers and if the table being + ** deleted from is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + isView = IsView(pTab); +#else +# define pTrigger 0 +# define isView 0 +#endif + bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0); +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Delete() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewDelete(pParse->pWith, pTabList, pWhere, + pOrderBy, pLimit, pTrigger); + } +#endif + +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( !isView ){ + pWhere = sqlite3LimitWhere( + pParse, pTabList, pWhere, pOrderBy, pLimit, "DELETE" + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + + /* If pTab is really a view, make sure it has been initialized. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto delete_from_cleanup; + } + + if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + goto delete_from_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, + db->aDb[iDb].zDbSName); + assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE ); + if( rcauth==SQLITE_DENY ){ + goto delete_from_cleanup; + } + assert(!isView || pTrigger); + + /* Assign cursor numbers to the table and all its indices. + */ + assert( pTabList->nSrc==1 ); + iTabCur = pTabList->a[0].iCursor = pParse->nTab++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + pParse->nTab++; + } + + /* Start the view context + */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* Begin generating code. + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ){ + goto delete_from_cleanup; + } + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, bComplex, iDb); + + /* If we are trying to delete from a view, realize that view into + ** an ephemeral table. + */ +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) + if( isView ){ + sqlite3MaterializeView(pParse, pTab, + pWhere, pOrderBy, pLimit, iTabCur + ); + iDataCur = iIdxCur = iTabCur; + pOrderBy = 0; + pLimit = 0; + } +#endif + + /* Resolve the column names in the WHERE clause. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + goto delete_from_cleanup; + } + + /* Initialize the counter of the number of rows deleted, if + ** we are counting rows. + */ + if( (db->flags & SQLITE_CountRows)!=0 + && !pParse->nested + && !pParse->pTriggerTab + && !pParse->bReturning + ){ + memCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); + } + +#ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION + /* Special case: A DELETE without a WHERE clause deletes everything. + ** It is easier just to erase the whole table. Prior to version 3.6.5, + ** this optimization caused the row change count (the value returned by + ** API function sqlite3_count_changes) to be set incorrectly. + ** + ** The "rcauth==SQLITE_OK" terms is the + ** IMPLEMENTATION-OF: R-17228-37124 If the action code is SQLITE_DELETE and + ** the callback returns SQLITE_IGNORE then the DELETE operation proceeds but + ** the truncate optimization is disabled and all rows are deleted + ** individually. + */ + if( rcauth==SQLITE_OK + && pWhere==0 + && !bComplex + && !IsVirtual(pTab) +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + && db->xPreUpdateCallback==0 +#endif + ){ + assert( !isView ); + sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt ? memCnt : -1, + pTab->zName, P4_STATIC); + } + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->pSchema==pTab->pSchema ); + sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + sqlite3VdbeChangeP3(v, -1, memCnt ? memCnt : -1); + } + } + }else +#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */ + { + u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK; + if( sNC.ncFlags & NC_VarSelect ) bComplex = 1; + wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW); + if( HasRowid(pTab) ){ + /* For a rowid table, initialize the RowSet to an empty set */ + pPk = 0; + nPk = 1; + iRowSet = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet); + }else{ + /* For a WITHOUT ROWID table, create an ephemeral table used to + ** hold all primary keys for rows to be deleted. */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + nPk = pPk->nKeyCol; + iPk = pParse->nMem+1; + pParse->nMem += nPk; + iEphCur = pParse->nTab++; + addrEphOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEphCur, nPk); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + + /* Construct a query to find the rowid or primary key for every row + ** to be deleted, based on the WHERE clause. Set variable eOnePass + ** to indicate the strategy used to implement this delete: + ** + ** ONEPASS_OFF: Two-pass approach - use a FIFO for rowids/PK values. + ** ONEPASS_SINGLE: One-pass approach - at most one row deleted. + ** ONEPASS_MULTI: One-pass approach - any number of rows may be deleted. + */ + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0,0,wcf,iTabCur+1); + if( pWInfo==0 ) goto delete_from_cleanup; + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); + assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); + if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse); + if( sqlite3WhereUsesDeferredSeek(pWInfo) ){ + sqlite3VdbeAddOp1(v, OP_FinishSeek, iTabCur); + } + + /* Keep track of the number of rows to be deleted */ + if( memCnt ){ + sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); + } + + /* Extract the rowid or primary key for the current row */ + if( pPk ){ + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, + pPk->aiColumn[i], iPk+i); + } + iKey = iPk; + }else{ + iKey = ++pParse->nMem; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey); + } + + if( eOnePass!=ONEPASS_OFF ){ + /* For ONEPASS, no need to store the rowid/primary-key. There is only + ** one, so just keep it in its register(s) and fall through to the + ** delete code. */ + nKey = nPk; /* OP_Found will use an unpacked key */ + aToOpen = sqlite3DbMallocRawNN(db, nIdx+2); + if( aToOpen==0 ){ + sqlite3WhereEnd(pWInfo); + goto delete_from_cleanup; + } + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iTabCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iTabCur] = 0; + if( addrEphOpen ) sqlite3VdbeChangeToNoop(v, addrEphOpen); + addrBypass = sqlite3VdbeMakeLabel(pParse); + }else{ + if( pPk ){ + /* Add the PK key for this row to the temporary table */ + iKey = ++pParse->nMem; + nKey = 0; /* Zero tells OP_Found to use a composite key */ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, + sqlite3IndexAffinityStr(pParse->db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEphCur, iKey, iPk, nPk); + }else{ + /* Add the rowid of the row to be deleted to the RowSet */ + nKey = 1; /* OP_DeferredSeek always uses a single rowid */ + sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); + } + sqlite3WhereEnd(pWInfo); + } + + /* Unless this is a view, open cursors for the table we are + ** deleting from and all its indices. If this is a view, then the + ** only effect this statement has is to fire the INSTEAD OF + ** triggers. + */ + if( !isView ){ + int iAddrOnce = 0; + if( eOnePass==ONEPASS_MULTI ){ + iAddrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + testcase( IsVirtual(pTab) ); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, OPFLAG_FORDELETE, + iTabCur, aToOpen, &iDataCur, &iIdxCur); + assert( pPk || IsVirtual(pTab) || iDataCur==iTabCur ); + assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); + if( eOnePass==ONEPASS_MULTI ){ + sqlite3VdbeJumpHereOrPopInst(v, iAddrOnce); + } + } + + /* Set up a loop over the rowids/primary-keys that were found in the + ** where-clause loop above. + */ + if( eOnePass!=ONEPASS_OFF ){ + assert( nKey==nPk ); /* OP_Found will use an unpacked key */ + if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){ + assert( pPk!=0 || IsView(pTab) ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); + VdbeCoverage(v); + } + }else if( pPk ){ + addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Column, iEphCur, 0, iKey); + }else{ + sqlite3VdbeAddOp2(v, OP_RowData, iEphCur, iKey); + } + assert( nKey==0 ); /* OP_Found will use a composite key */ + }else{ + addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); + VdbeCoverage(v); + assert( nKey==1 ); + } + + /* Delete the row */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + sqlite3VtabMakeWritable(pParse, pTab); + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + sqlite3MayAbort(pParse); + if( eOnePass==ONEPASS_SINGLE ){ + sqlite3VdbeAddOp1(v, OP_Close, iTabCur); + if( sqlite3IsToplevel(pParse) ){ + pParse->isMultiWrite = 0; + } + } + sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, OE_Abort); + }else +#endif + { + int count = (pParse->nested==0); /* True to count changes */ + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + iKey, nKey, count, OE_Default, eOnePass, aiCurOnePass[1]); + } + + /* End of the loop over all rowids/primary-keys. */ + if( eOnePass!=ONEPASS_OFF ){ + sqlite3VdbeResolveLabel(v, addrBypass); + sqlite3WhereEnd(pWInfo); + }else if( pPk ){ + sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrLoop); + }else{ + sqlite3VdbeGoto(v, addrLoop); + sqlite3VdbeJumpHere(v, addrLoop); + } + } /* End non-truncate path */ + + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* Return the number of rows that were deleted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( memCnt ){ + sqlite3CodeChangeCount(v, memCnt, "rows deleted"); + } + +delete_from_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprDelete(db, pWhere); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + sqlite3ExprListDelete(db, pOrderBy); + sqlite3ExprDelete(db, pLimit); +#endif + sqlite3DbFree(db, aToOpen); + return; +} +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif + +/* +** This routine generates VDBE code that causes a single row of a +** single table to be deleted. Both the original table entry and +** all indices are removed. +** +** Preconditions: +** +** 1. iDataCur is an open cursor on the btree that is the canonical data +** store for the table. (This will be either the table itself, +** in the case of a rowid table, or the PRIMARY KEY index in the case +** of a WITHOUT ROWID table.) +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iIdxCur+i for the i-th index. +** +** 3. The primary key for the row to be deleted must be stored in a +** sequence of nPk memory cells starting at iPk. If nPk==0 that means +** that a search record formed from OP_MakeRecord is contained in the +** single memory location iPk. +** +** eMode: +** Parameter eMode may be passed either ONEPASS_OFF (0), ONEPASS_SINGLE, or +** ONEPASS_MULTI. If eMode is not ONEPASS_OFF, then the cursor +** iDataCur already points to the row to delete. If eMode is ONEPASS_OFF +** then this function must seek iDataCur to the entry identified by iPk +** and nPk before reading from it. +** +** If eMode is ONEPASS_MULTI, then this call is being made as part +** of a ONEPASS delete that affects multiple rows. In this case, if +** iIdxNoSeek is a valid cursor number (>=0) and is not the same as +** iDataCur, then its position should be preserved following the delete +** operation. Or, if iIdxNoSeek is not a valid cursor number, the +** position of iDataCur should be preserved instead. +** +** iIdxNoSeek: +** If iIdxNoSeek is a valid cursor number (>=0) not equal to iDataCur, +** then it identifies an index cursor (from within array of cursors +** starting at iIdxCur) that already points to the index entry to be deleted. +** Except, this optimization is disabled if there are BEFORE triggers since +** the trigger body might have moved the cursor. +*/ +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table containing the row to be deleted */ + Trigger *pTrigger, /* List of triggers to (potentially) fire */ + int iDataCur, /* Cursor from which column data is extracted */ + int iIdxCur, /* First index cursor */ + int iPk, /* First memory cell containing the PRIMARY KEY */ + i16 nPk, /* Number of PRIMARY KEY memory cells */ + u8 count, /* If non-zero, increment the row change counter */ + u8 onconf, /* Default ON CONFLICT policy for triggers */ + u8 eMode, /* ONEPASS_OFF, _SINGLE, or _MULTI. See above */ + int iIdxNoSeek /* Cursor number of cursor that does not need seeking */ +){ + Vdbe *v = pParse->pVdbe; /* Vdbe */ + int iOld = 0; /* First register in OLD.* array */ + int iLabel; /* Label resolved to end of generated code */ + u8 opSeek; /* Seek opcode */ + + /* Vdbe is guaranteed to have been allocated by this stage. */ + assert( v ); + VdbeModuleComment((v, "BEGIN: GenRowDel(%d,%d,%d,%d)", + iDataCur, iIdxCur, iPk, (int)nPk)); + + /* Seek cursor iCur to the row to delete. If this row no longer exists + ** (this can happen if a trigger program has already deleted it), do + ** not attempt to delete it or fire any DELETE triggers. */ + iLabel = sqlite3VdbeMakeLabel(pParse); + opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; + if( eMode==ONEPASS_OFF ){ + sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); + VdbeCoverageIf(v, opSeek==OP_NotExists); + VdbeCoverageIf(v, opSeek==OP_NotFound); + } + + /* If there are any triggers to fire, allocate a range of registers to + ** use for the old.* references in the triggers. */ + if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){ + u32 mask; /* Mask of OLD.* columns in use */ + int iCol; /* Iterator used while populating OLD.* */ + int addrStart; /* Start of BEFORE trigger programs */ + + /* TODO: Could use temporary registers here. Also could attempt to + ** avoid copying the contents of the rowid register. */ + mask = sqlite3TriggerColmask( + pParse, pTrigger, 0, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onconf + ); + mask |= sqlite3FkOldmask(pParse, pTab); + iOld = pParse->nMem+1; + pParse->nMem += (1 + pTab->nCol); + + /* Populate the OLD.* pseudo-table register array. These values will be + ** used by any BEFORE and AFTER triggers that exist. */ + sqlite3VdbeAddOp2(v, OP_Copy, iPk, iOld); + for(iCol=0; iColnCol; iCol++){ + testcase( mask!=0xffffffff && iCol==31 ); + testcase( mask!=0xffffffff && iCol==32 ); + if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ + int kk = sqlite3TableColumnToStorage(pTab, iCol); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+kk+1); + } + } + + /* Invoke BEFORE DELETE trigger programs. */ + addrStart = sqlite3VdbeCurrentAddr(v); + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel + ); + + /* If any BEFORE triggers were coded, then seek the cursor to the + ** row to be deleted again. It may be that the BEFORE triggers moved + ** the cursor or already deleted the row that the cursor was + ** pointing to. + ** + ** Also disable the iIdxNoSeek optimization since the BEFORE trigger + ** may have moved that cursor. + */ + if( addrStart=0 ); + iIdxNoSeek = -1; + } + + /* Do FK processing. This call checks that any FK constraints that + ** refer to this table (i.e. constraints attached to other tables) + ** are not violated by deleting this row. */ + sqlite3FkCheck(pParse, pTab, iOld, 0, 0, 0); + } + + /* Delete the index and table entries. Skip this step if pTab is really + ** a view (in which case the only effect of the DELETE statement is to + ** fire the INSTEAD OF triggers). + ** + ** If variable 'count' is non-zero, then this OP_Delete instruction should + ** invoke the update-hook. The pre-update-hook, on the other hand should + ** be invoked unless table pTab is a system table. The difference is that + ** the update-hook is not invoked for rows removed by REPLACE, but the + ** pre-update-hook is. + */ + if( !IsView(pTab) ){ + u8 p5 = 0; + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0)); + if( pParse->nested==0 || 0==sqlite3_stricmp(pTab->zName, "sqlite_stat1") ){ + sqlite3VdbeAppendP4(v, (char*)pTab, P4_TABLE); + } + if( eMode!=ONEPASS_OFF ){ + sqlite3VdbeChangeP5(v, OPFLAG_AUXDELETE); + } + if( iIdxNoSeek>=0 && iIdxNoSeek!=iDataCur ){ + sqlite3VdbeAddOp1(v, OP_Delete, iIdxNoSeek); + } + if( eMode==ONEPASS_MULTI ) p5 |= OPFLAG_SAVEPOSITION; + sqlite3VdbeChangeP5(v, p5); + } + + /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to + ** handle rows (possibly in other tables) that refer via a foreign key + ** to the row just deleted. */ + sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0); + + /* Invoke AFTER DELETE trigger programs. */ + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel + ); + + /* Jump here if the row had already been deleted before any BEFORE + ** trigger programs were invoked. Or if a trigger program throws a + ** RAISE(IGNORE) exception. */ + sqlite3VdbeResolveLabel(v, iLabel); + VdbeModuleComment((v, "END: GenRowDel()")); +} + +/* +** This routine generates VDBE code that causes the deletion of all +** index entries associated with a single row of a single table, pTab +** +** Preconditions: +** +** 1. A read/write cursor "iDataCur" must be open on the canonical storage +** btree for the table pTab. (This will be either the table itself +** for rowid tables or to the primary key index for WITHOUT ROWID +** tables.) +** +** 2. Read/write cursors for all indices of pTab must be open as +** cursor number iIdxCur+i for the i-th index. (The pTab->pIndex +** index is the 0-th index.) +** +** 3. The "iDataCur" cursor must be already be positioned on the row +** that is to be deleted. +*/ +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* Table containing the row to be deleted */ + int iDataCur, /* Cursor of table holding data. */ + int iIdxCur, /* First index cursor */ + int *aRegIdx, /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ + int iIdxNoSeek /* Do not delete from this cursor */ +){ + int i; /* Index loop counter */ + int r1 = -1; /* Register holding an index key */ + int iPartIdxLabel; /* Jump destination for skipping partial index entries */ + Index *pIdx; /* Current index */ + Index *pPrior = 0; /* Prior index */ + Vdbe *v; /* The prepared statement under construction */ + Index *pPk; /* PRIMARY KEY index, or NULL for rowid tables */ + + v = pParse->pVdbe; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ + assert( iIdxCur+i!=iDataCur || pPk==pIdx ); + if( aRegIdx!=0 && aRegIdx[i]==0 ) continue; + if( pIdx==pPk ) continue; + if( iIdxCur+i==iIdxNoSeek ) continue; + VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, + &iPartIdxLabel, pPrior, r1); + sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, + pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); + sqlite3VdbeChangeP5(v, 1); /* Cause IdxDelete to error if no entry found */ + sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); + pPrior = pIdx; + } +} + +/* +** Generate code that will assemble an index key and stores it in register +** regOut. The key with be for index pIdx which is an index on pTab. +** iCur is the index of a cursor open on the pTab table and pointing to +** the entry that needs indexing. If pTab is a WITHOUT ROWID table, then +** iCur must be the cursor of the PRIMARY KEY index. +** +** Return a register number which is the first in a block of +** registers that holds the elements of the index key. The +** block of registers has already been deallocated by the time +** this routine returns. +** +** If *piPartIdxLabel is not NULL, fill it in with a label and jump +** to that label if pIdx is a partial index that should be skipped. +** The label should be resolved using sqlite3ResolvePartIdxLabel(). +** A partial index should be skipped if its WHERE clause evaluates +** to false or null. If pIdx is not a partial index, *piPartIdxLabel +** will be set to zero which is an empty label that is ignored by +** sqlite3ResolvePartIdxLabel(). +** +** The pPrior and regPrior parameters are used to implement a cache to +** avoid unnecessary register loads. If pPrior is not NULL, then it is +** a pointer to a different index for which an index key has just been +** computed into register regPrior. If the current pIdx index is generating +** its key into the same sequence of registers and if pPrior and pIdx share +** a column in common, then the register corresponding to that column already +** holds the correct value and the loading of that register is skipped. +** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK +** on a table with multiple indices, and especially with the ROWID or +** PRIMARY KEY columns of the index. +*/ +SQLITE_PRIVATE int sqlite3GenerateIndexKey( + Parse *pParse, /* Parsing context */ + Index *pIdx, /* The index for which to generate a key */ + int iDataCur, /* Cursor number from which to take column data */ + int regOut, /* Put the new key into this register if not 0 */ + int prefixOnly, /* Compute only a unique prefix of the key */ + int *piPartIdxLabel, /* OUT: Jump to this label to skip partial index */ + Index *pPrior, /* Previously generated index key */ + int regPrior /* Register holding previous generated key */ +){ + Vdbe *v = pParse->pVdbe; + int j; + int regBase; + int nCol; + + if( piPartIdxLabel ){ + if( pIdx->pPartIdxWhere ){ + *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); + pParse->iSelfTab = iDataCur + 1; + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, + SQLITE_JUMPIFNULL); + pParse->iSelfTab = 0; + pPrior = 0; /* Ticket a9efb42811fa41ee 2019-11-02; + ** pPartIdxWhere may have corrupted regPrior registers */ + }else{ + *piPartIdxLabel = 0; + } + } + nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn; + regBase = sqlite3GetTempRange(pParse, nCol); + if( pPrior && (regBase!=regPrior || pPrior->pPartIdxWhere) ) pPrior = 0; + for(j=0; jaiColumn[j]==pIdx->aiColumn[j] + && pPrior->aiColumn[j]!=XN_EXPR + ){ + /* This column was already computed by the previous index */ + continue; + } + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iDataCur, j, regBase+j); + if( pIdx->aiColumn[j]>=0 ){ + /* If the column affinity is REAL but the number is an integer, then it + ** might be stored in the table as an integer (using a compact + ** representation) then converted to REAL by an OP_RealAffinity opcode. + ** But we are getting ready to store this value back into an index, where + ** it should be converted by to INTEGER again. So omit the + ** OP_RealAffinity opcode if it is present */ + sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); + } + } + if( regOut ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); + } + sqlite3ReleaseTempRange(pParse, regBase, nCol); + return regBase; +} + +/* +** If a prior call to sqlite3GenerateIndexKey() generated a jump-over label +** because it was a partial index, then this routine should be called to +** resolve that label. +*/ +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){ + if( iLabel ){ + sqlite3VdbeResolveLabel(pParse->pVdbe, iLabel); + } +} + +/************** End of delete.c **********************************************/ +/************** Begin file func.c ********************************************/ +/* +** 2002 February 23 +** +** 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 contains the C-language implementations for many of the SQL +** functions of SQLite. (Some function, and in particular the date and +** time functions, are implemented separately.) +*/ +/* #include "sqliteInt.h" */ +/* #include */ +/* #include */ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* #include */ +#endif +/* #include "vdbeInt.h" */ + +/* +** Return the collating function associated with a function. +*/ +static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ + VdbeOp *pOp; + assert( context->pVdbe!=0 ); + pOp = &context->pVdbe->aOp[context->iOp-1]; + assert( pOp->opcode==OP_CollSeq ); + assert( pOp->p4type==P4_COLLSEQ ); + return pOp->p4.pColl; +} + +/* +** Indicate that the accumulator load should be skipped on this +** iteration of the aggregate loop. +*/ +static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){ + assert( context->isError<=0 ); + context->isError = -1; + context->skipFlag = 1; +} + +/* +** Implementation of the non-aggregate min() and max() functions +*/ +static void minmaxFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i; + int mask; /* 0 for min() or 0xffffffff for max() */ + int iBest; + CollSeq *pColl; + + assert( argc>1 ); + mask = sqlite3_user_data(context)==0 ? 0 : -1; + pColl = sqlite3GetFuncCollSeq(context); + assert( pColl ); + assert( mask==-1 || mask==0 ); + iBest = 0; + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + for(i=1; i=0 ){ + testcase( mask==0 ); + iBest = i; + } + } + sqlite3_result_value(context, argv[iBest]); +} + +/* +** Return the type of the argument. +*/ +static void typeofFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + static const char *azType[] = { "integer", "real", "text", "blob", "null" }; + int i = sqlite3_value_type(argv[0]) - 1; + UNUSED_PARAMETER(NotUsed); + assert( i>=0 && i=0xc0 ){ + while( (*z & 0xc0)==0x80 ){ z++; z0++; } + } + } + sqlite3_result_int(context, (int)(z-z0)); + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + +/* +** Implementation of the abs() function. +** +** IMP: R-23979-26855 The abs(X) function returns the absolute value of +** the numeric argument X. +*/ +static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + assert( argc==1 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + if( iVal<0 ){ + if( iVal==SMALLEST_INT64 ){ + /* IMP: R-31676-45509 If X is the integer -9223372036854775808 + ** then abs(X) throws an integer overflow error since there is no + ** equivalent positive 64-bit two complement value. */ + sqlite3_result_error(context, "integer overflow", -1); + return; + } + iVal = -iVal; + } + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */ + sqlite3_result_null(context); + break; + } + default: { + /* Because sqlite3_value_double() returns 0.0 if the argument is not + ** something that can be converted into a number, we have: + ** IMP: R-01992-00519 Abs(X) returns 0.0 if X is a string or blob + ** that cannot be converted to a numeric value. + */ + double rVal = sqlite3_value_double(argv[0]); + if( rVal<0 ) rVal = -rVal; + sqlite3_result_double(context, rVal); + break; + } + } +} + +/* +** Implementation of the instr() function. +** +** instr(haystack,needle) finds the first occurrence of needle +** in haystack and returns the number of previous characters plus 1, +** or 0 if needle does not occur within haystack. +** +** If both haystack and needle are BLOBs, then the result is one more than +** the number of bytes in haystack prior to the first occurrence of needle, +** or 0 if needle never occurs in haystack. +*/ +static void instrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zHaystack; + const unsigned char *zNeedle; + int nHaystack; + int nNeedle; + int typeHaystack, typeNeedle; + int N = 1; + int isText; + unsigned char firstChar; + sqlite3_value *pC1 = 0; + sqlite3_value *pC2 = 0; + + UNUSED_PARAMETER(argc); + typeHaystack = sqlite3_value_type(argv[0]); + typeNeedle = sqlite3_value_type(argv[1]); + if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return; + nHaystack = sqlite3_value_bytes(argv[0]); + nNeedle = sqlite3_value_bytes(argv[1]); + if( nNeedle>0 ){ + if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ + zHaystack = sqlite3_value_blob(argv[0]); + zNeedle = sqlite3_value_blob(argv[1]); + isText = 0; + }else if( typeHaystack!=SQLITE_BLOB && typeNeedle!=SQLITE_BLOB ){ + zHaystack = sqlite3_value_text(argv[0]); + zNeedle = sqlite3_value_text(argv[1]); + isText = 1; + }else{ + pC1 = sqlite3_value_dup(argv[0]); + zHaystack = sqlite3_value_text(pC1); + if( zHaystack==0 ) goto endInstrOOM; + nHaystack = sqlite3_value_bytes(pC1); + pC2 = sqlite3_value_dup(argv[1]); + zNeedle = sqlite3_value_text(pC2); + if( zNeedle==0 ) goto endInstrOOM; + nNeedle = sqlite3_value_bytes(pC2); + isText = 1; + } + if( zNeedle==0 || (nHaystack && zHaystack==0) ) goto endInstrOOM; + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ + N++; + do{ + nHaystack--; + zHaystack++; + }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } + if( nNeedle>nHaystack ) N = 0; + } + sqlite3_result_int(context, N); +endInstr: + sqlite3_value_free(pC1); + sqlite3_value_free(pC2); + return; +endInstrOOM: + sqlite3_result_error_nomem(context); + goto endInstr; +} + +/* +** Implementation of the printf() (a.k.a. format()) SQL function. +*/ +static void printfFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + PrintfArguments x; + StrAccum str; + const char *zFormat; + int n; + sqlite3 *db = sqlite3_context_db_handle(context); + + 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, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + str.printfFlags = SQLITE_PRINTF_SQLFUNC; + sqlite3_str_appendf(&str, zFormat, &x); + n = str.nChar; + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, + SQLITE_DYNAMIC); + } +} + +/* +** Implementation of the substr() function. +** +** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. +** p1 is 1-indexed. So substr(x,1,1) returns the first character +** of x. If x is text, then we actually count UTF-8 characters. +** If x is a blob, then we count bytes. +** +** If p1 is negative, then we begin abs(p1) from the end of x[]. +** +** If p2 is negative, return the p2 characters preceding p1. +*/ +static void substrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z; + const unsigned char *z2; + int len; + int p0type; + i64 p1, p2; + int negP2 = 0; + + assert( argc==3 || argc==2 ); + if( sqlite3_value_type(argv[1])==SQLITE_NULL + || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL) + ){ + return; + } + p0type = sqlite3_value_type(argv[0]); + p1 = sqlite3_value_int(argv[1]); + if( p0type==SQLITE_BLOB ){ + len = sqlite3_value_bytes(argv[0]); + z = sqlite3_value_blob(argv[0]); + if( z==0 ) return; + assert( len==sqlite3_value_bytes(argv[0]) ); + }else{ + z = sqlite3_value_text(argv[0]); + if( z==0 ) return; + len = 0; + if( p1<0 ){ + for(z2=z; *z2; len++){ + SQLITE_SKIP_UTF8(z2); + } + } + } +#ifdef SQLITE_SUBSTR_COMPATIBILITY + /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as + ** as substr(X,1,N) - it returns the first N characters of X. This + ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8] + ** from 2009-02-02 for compatibility of applications that exploited the + ** old buggy behavior. */ + if( p1==0 ) p1 = 1; /* */ +#endif + if( argc==3 ){ + p2 = sqlite3_value_int(argv[2]); + if( p2<0 ){ + p2 = -p2; + negP2 = 1; + } + }else{ + p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; + } + if( p1<0 ){ + p1 += len; + if( p1<0 ){ + p2 += p1; + if( p2<0 ) p2 = 0; + p1 = 0; + } + }else if( p1>0 ){ + p1--; + }else if( p2>0 ){ + p2--; + } + if( negP2 ){ + p1 -= p2; + if( p1<0 ){ + p2 += p1; + p1 = 0; + } + } + assert( p1>=0 && p2>=0 ); + if( p0type!=SQLITE_BLOB ){ + while( *z && p1 ){ + SQLITE_SKIP_UTF8(z); + p1--; + } + for(z2=z; *z2 && p2; p2--){ + SQLITE_SKIP_UTF8(z2); + } + sqlite3_result_text64(context, (char*)z, z2-z, SQLITE_TRANSIENT, + SQLITE_UTF8); + }else{ + if( p1+p2>len ){ + p2 = len-p1; + if( p2<0 ) p2 = 0; + } + sqlite3_result_blob64(context, (char*)&z[p1], (u64)p2, SQLITE_TRANSIENT); + } +} + +/* +** Implementation of the round() function +*/ +#ifndef SQLITE_OMIT_FLOATING_POINT +static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + int n = 0; + double r; + char *zBuf; + assert( argc==1 || argc==2 ); + if( argc==2 ){ + if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return; + n = sqlite3_value_int(argv[1]); + if( n>30 ) n = 30; + if( n<0 ) n = 0; + } + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + r = sqlite3_value_double(argv[0]); + /* If Y==0 and X will fit in a 64-bit int, + ** handle the rounding directly, + ** otherwise use printf. + */ + if( r<-4503599627370496.0 || r>+4503599627370496.0 ){ + /* The value has no fractional part so there is nothing to round */ + }else if( n==0 ){ + r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5))); + }else{ + zBuf = sqlite3_mprintf("%.*f",n,r); + if( zBuf==0 ){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8); + sqlite3_free(zBuf); + } + sqlite3_result_double(context, r); +} +#endif + +/* +** Allocate nByte bytes of space using sqlite3Malloc(). If the +** allocation fails, call sqlite3_result_error_nomem() to notify +** the database handle that malloc() has failed and return NULL. +** If nByte is larger than the maximum string or blob length, then +** raise an SQLITE_TOOBIG exception and return NULL. +*/ +static void *contextMalloc(sqlite3_context *context, i64 nByte){ + char *z; + sqlite3 *db = sqlite3_context_db_handle(context); + assert( nByte>0 ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); + if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + z = 0; + }else{ + z = sqlite3Malloc(nByte); + if( !z ){ + sqlite3_result_error_nomem(context); + } + } + return z; +} + +/* +** Implementation of the upper() and lower() SQL functions. +*/ +static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char *z1; + const char *z2; + int i, n; + UNUSED_PARAMETER(argc); + z2 = (char*)sqlite3_value_text(argv[0]); + n = sqlite3_value_bytes(argv[0]); + /* Verify that the call to _bytes() does not invalidate the _text() pointer */ + assert( z2==(char*)sqlite3_value_text(argv[0]) ); + if( z2 ){ + z1 = contextMalloc(context, ((i64)n)+1); + if( z1 ){ + for(i=0; imatchOne; /* "?" or "_" */ + u32 matchAll = pInfo->matchAll; /* "*" or "%" */ + u8 noCase = pInfo->noCase; /* True if uppercase==lowercase */ + const u8 *zEscaped = 0; /* One past the last escaped input char */ + + while( (c = Utf8Read(zPattern))!=0 ){ + if( c==matchAll ){ /* Match "*" */ + /* Skip over multiple "*" characters in the pattern. If there + ** are also "?" characters, skip those as well, but consume a + ** single character of the input string for each "?" skipped */ + while( (c=Utf8Read(zPattern)) == matchAll + || (c == matchOne && matchOne!=0) ){ + if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){ + return SQLITE_NOWILDCARDMATCH; + } + } + if( c==0 ){ + return SQLITE_MATCH; /* "*" at the end of the pattern matches */ + }else if( c==matchOther ){ + if( pInfo->matchSet==0 ){ + c = sqlite3Utf8Read(&zPattern); + if( c==0 ) return SQLITE_NOWILDCARDMATCH; + }else{ + /* "[...]" immediately follows the "*". We have to do a slow + ** recursive search in this case, but it is an unusual case. */ + assert( matchOther<0x80 ); /* '[' is a single-byte character */ + while( *zString ){ + int bMatch = patternCompare(&zPattern[-1],zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; + SQLITE_SKIP_UTF8(zString); + } + return SQLITE_NOWILDCARDMATCH; + } + } + + /* At this point variable c contains the first character of the + ** pattern string past the "*". Search in the input string for the + ** first matching character and recursively continue the match from + ** that point. + ** + ** For a case-insensitive search, set variable cx to be the same as + ** c but in the other case and search the input string for either + ** c or cx. + */ + if( c<=0x80 ){ + char zStop[3]; + int bMatch; + if( noCase ){ + zStop[0] = sqlite3Toupper(c); + zStop[1] = sqlite3Tolower(c); + zStop[2] = 0; + }else{ + zStop[0] = c; + zStop[1] = 0; + } + while(1){ + zString += strcspn((const char*)zString, zStop); + if( zString[0]==0 ) break; + zString++; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; + } + }else{ + int bMatch; + while( (c2 = Utf8Read(zString))!=0 ){ + if( c2!=c ) continue; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; + } + } + return SQLITE_NOWILDCARDMATCH; + } + if( c==matchOther ){ + if( pInfo->matchSet==0 ){ + c = sqlite3Utf8Read(&zPattern); + if( c==0 ) return SQLITE_NOMATCH; + zEscaped = zPattern; + }else{ + u32 prior_c = 0; + int seen = 0; + int invert = 0; + c = sqlite3Utf8Read(&zString); + if( c==0 ) return SQLITE_NOMATCH; + c2 = sqlite3Utf8Read(&zPattern); + if( c2=='^' ){ + invert = 1; + c2 = sqlite3Utf8Read(&zPattern); + } + if( c2==']' ){ + if( c==']' ) seen = 1; + c2 = sqlite3Utf8Read(&zPattern); + } + while( c2 && c2!=']' ){ + if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ + c2 = sqlite3Utf8Read(&zPattern); + if( c>=prior_c && c<=c2 ) seen = 1; + prior_c = 0; + }else{ + if( c==c2 ){ + seen = 1; + } + prior_c = c2; + } + c2 = sqlite3Utf8Read(&zPattern); + } + if( c2==0 || (seen ^ invert)==0 ){ + return SQLITE_NOMATCH; + } + continue; + } + } + c2 = Utf8Read(zString); + if( c==c2 ) continue; + if( noCase && sqlite3Tolower(c)==sqlite3Tolower(c2) && c<0x80 && c2<0x80 ){ + continue; + } + if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; + return SQLITE_NOMATCH; + } + return *zString==0 ? SQLITE_MATCH : SQLITE_NOMATCH; +} + +/* +** The sqlite3_strglob() interface. Return 0 on a match (like strcmp()) and +** non-zero if there is no match. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){ + return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '['); +} + +/* +** The sqlite3_strlike() interface. Return 0 on a match and non-zero for +** a miss - like strcmp(). +*/ +SQLITE_API int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){ + return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc); +} + +/* +** Count the number of times that the LIKE operator (or GLOB which is +** just a variation of LIKE) gets called. This is used for testing +** only. +*/ +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_like_count = 0; +#endif + + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B,A). +** +** This same function (with a different compareInfo structure) computes +** the GLOB operator. +*/ +static void likeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA, *zB; + u32 escape; + int nPat; + sqlite3 *db = sqlite3_context_db_handle(context); + struct compareInfo *pInfo = sqlite3_user_data(context); + struct compareInfo backupInfo; + +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( sqlite3_value_type(argv[0])==SQLITE_BLOB + || sqlite3_value_type(argv[1])==SQLITE_BLOB + ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, 0); + return; + } +#endif + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + nPat = sqlite3_value_bytes(argv[0]); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ); + testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 ); + if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + const unsigned char *zEsc = sqlite3_value_text(argv[2]); + if( zEsc==0 ) return; + if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + escape = sqlite3Utf8Read(&zEsc); + if( escape==pInfo->matchAll || escape==pInfo->matchOne ){ + memcpy(&backupInfo, pInfo, sizeof(backupInfo)); + pInfo = &backupInfo; + if( escape==pInfo->matchAll ) pInfo->matchAll = 0; + if( escape==pInfo->matchOne ) pInfo->matchOne = 0; + } + }else{ + escape = pInfo->matchSet; + } + zB = sqlite3_value_text(argv[0]); + zA = sqlite3_value_text(argv[1]); + if( zA && zB ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, + patternCompare(zB, zA, pInfo, escape)==SQLITE_MATCH); + } +} + +/* +** Implementation of the NULLIF(x,y) function. The result is the first +** argument if the arguments are different. The result is NULL if the +** arguments are equal to each other. +*/ +static void nullifFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + UNUSED_PARAMETER(NotUsed); + if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){ + sqlite3_result_value(context, argv[0]); + } +} + +/* +** Implementation of the sqlite_version() function. The result is the version +** of the SQLite library that is running. +*/ +static void versionFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + /* IMP: R-48699-48617 This function is an SQL wrapper around the + ** sqlite3_libversion() C-interface. */ + sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC); +} + +/* +** Implementation of the sqlite_source_id() function. The result is a string +** that identifies the particular version of the source code used to build +** SQLite. +*/ +static void sourceidFunc( + sqlite3_context *context, + int NotUsed, + sqlite3_value **NotUsed2 +){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + /* IMP: R-24470-31136 This function is an SQL wrapper around the + ** sqlite3_sourceid() C interface. */ + sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC); +} + +/* +** Implementation of the sqlite_log() function. This is a wrapper around +** sqlite3_log(). The return value is NULL. The function exists purely for +** its side-effects. +*/ +static void errlogFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(context); + sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1])); +} + +/* +** Implementation of the sqlite_compileoption_used() function. +** The result is an integer that identifies if the compiler option +** was used to build SQLite. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +static void compileoptionusedFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zOptName; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL + ** function is a wrapper around the sqlite3_compileoption_used() C/C++ + ** function. + */ + if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){ + sqlite3_result_int(context, sqlite3_compileoption_used(zOptName)); + } +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/* +** Implementation of the sqlite_compileoption_get() function. +** The result is a string that identifies the compiler options +** used to build SQLite. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +static void compileoptiongetFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function + ** is a wrapper around the sqlite3_compileoption_get() C/C++ function. + */ + n = sqlite3_value_int(argv[0]); + sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC); +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/* Array for converting from half-bytes (nybbles) into ASCII hex +** digits. */ +static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + +/* +** Append to pStr text that is the SQL literal representation of the +** value contained in pValue. +*/ +SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue){ + /* As currently implemented, the string must be initially empty. + ** we might relax this requirement in the future, but that will + ** require enhancements to the implementation. */ + assert( pStr!=0 && pStr->nChar==0 ); + + switch( sqlite3_value_type(pValue) ){ + case SQLITE_FLOAT: { + double r1, r2; + const char *zVal; + r1 = sqlite3_value_double(pValue); + sqlite3_str_appendf(pStr, "%!.15g", r1); + zVal = sqlite3_str_value(pStr); + if( zVal ){ + sqlite3AtoF(zVal, &r2, pStr->nChar, SQLITE_UTF8); + if( r1!=r2 ){ + sqlite3_str_reset(pStr); + sqlite3_str_appendf(pStr, "%!.20e", r1); + } + } + break; + } + case SQLITE_INTEGER: { + sqlite3_str_appendf(pStr, "%lld", sqlite3_value_int64(pValue)); + break; + } + case SQLITE_BLOB: { + char const *zBlob = sqlite3_value_blob(pValue); + int nBlob = sqlite3_value_bytes(pValue); + assert( zBlob==sqlite3_value_blob(pValue) ); /* No encoding change */ + sqlite3StrAccumEnlarge(pStr, nBlob*2 + 4); + if( pStr->accError==0 ){ + char *zText = pStr->zText; + int i; + for(i=0; i>4)&0x0F]; + zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F]; + } + zText[(nBlob*2)+2] = '\''; + zText[(nBlob*2)+3] = '\0'; + zText[0] = 'X'; + zText[1] = '\''; + pStr->nChar = nBlob*2 + 3; + } + break; + } + case SQLITE_TEXT: { + const unsigned char *zArg = sqlite3_value_text(pValue); + sqlite3_str_appendf(pStr, "%Q", zArg); + break; + } + default: { + assert( sqlite3_value_type(pValue)==SQLITE_NULL ); + sqlite3_str_append(pStr, "NULL", 4); + break; + } + } +} + +/* +** Implementation of the QUOTE() function. +** +** The quote(X) function returns the text of an SQL literal which is the +** value of its argument suitable for inclusion into an SQL statement. +** Strings are surrounded by single-quotes with escapes on interior quotes +** as needed. BLOBs are encoded as hexadecimal literals. Strings with +** embedded NUL characters cannot be represented as string literals in SQL +** and hence the returned string literal is truncated prior to the first NUL. +*/ +static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + sqlite3_str str; + sqlite3 *db = sqlite3_context_db_handle(context); + assert( argc==1 ); + UNUSED_PARAMETER(argc); + sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + sqlite3QuoteValue(&str,argv[0]); + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), str.nChar, + SQLITE_DYNAMIC); + if( str.accError!=SQLITE_OK ){ + sqlite3_result_null(context); + sqlite3_result_error_code(context, str.accError); + } +} + +/* +** The unicode() function. Return the integer unicode code-point value +** for the first character of the input string. +*/ +static void unicodeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *z = sqlite3_value_text(argv[0]); + (void)argc; + if( z && z[0] ) sqlite3_result_int(context, sqlite3Utf8Read(&z)); +} + +/* +** The char() function takes zero or more arguments, each of which is +** an integer. It constructs a string where each character of the string +** is the unicode character for the corresponding integer argument. +*/ +static void charFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char *z, *zOut; + int i; + zOut = z = sqlite3_malloc64( argc*4+1 ); + if( z==0 ){ + sqlite3_result_error_nomem(context); + return; + } + for(i=0; i0x10ffff ) x = 0xfffd; + c = (unsigned)(x & 0x1fffff); + if( c<0x00080 ){ + *zOut++ = (u8)(c&0xFF); + }else if( c<0x00800 ){ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + }else if( c<0x10000 ){ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + }else{ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); + *zOut++ = 0x80 + (u8)(c & 0x3F); + } \ + } + sqlite3_result_text64(context, (char*)z, zOut-z, sqlite3_free, SQLITE_UTF8); +} + +/* +** The hex() function. Interpret the argument as a blob. Return +** a hexadecimal rendering as text. +*/ +static void hexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i, n; + const unsigned char *pBlob; + char *zHex, *z; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + pBlob = sqlite3_value_blob(argv[0]); + n = sqlite3_value_bytes(argv[0]); + assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ + z = zHex = contextMalloc(context, ((i64)n)*2 + 1); + if( zHex ){ + for(i=0; i>4)&0xf]; + *(z++) = hexdigits[c&0xf]; + } + *z = 0; + sqlite3_result_text(context, zHex, n*2, sqlite3_free); + } +} + +/* +** The zeroblob(N) function returns a zero-filled blob of size N bytes. +*/ +static void zeroblobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + i64 n; + int rc; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + n = sqlite3_value_int64(argv[0]); + if( n<0 ) n = 0; + rc = sqlite3_result_zeroblob64(context, n); /* IMP: R-00293-64994 */ + if( rc ){ + sqlite3_result_error_code(context, rc); + } +} + +/* +** The replace() function. Three arguments are all strings: call +** them A, B, and C. The result is also a string which is derived +** from A by replacing every occurrence of B with C. The match +** must be exact. Collating sequences are not used. +*/ +static void replaceFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zStr; /* The input string A */ + const unsigned char *zPattern; /* The pattern string B */ + const unsigned char *zRep; /* The replacement string C */ + unsigned char *zOut; /* The output */ + int nStr; /* Size of zStr */ + int nPattern; /* Size of zPattern */ + int nRep; /* Size of zRep */ + i64 nOut; /* Maximum size of zOut */ + int loopLimit; /* Last zStr[] that might match zPattern[] */ + int i, j; /* Loop counters */ + unsigned cntExpand; /* Number zOut expansions */ + sqlite3 *db = sqlite3_context_db_handle(context); + + assert( argc==3 ); + UNUSED_PARAMETER(argc); + zStr = sqlite3_value_text(argv[0]); + if( zStr==0 ) return; + nStr = sqlite3_value_bytes(argv[0]); + assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ + zPattern = sqlite3_value_text(argv[1]); + if( zPattern==0 ){ + assert( sqlite3_value_type(argv[1])==SQLITE_NULL + || sqlite3_context_db_handle(context)->mallocFailed ); + return; + } + if( zPattern[0]==0 ){ + assert( sqlite3_value_type(argv[1])!=SQLITE_NULL ); + sqlite3_result_value(context, argv[0]); + return; + } + nPattern = sqlite3_value_bytes(argv[1]); + assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */ + zRep = sqlite3_value_text(argv[2]); + if( zRep==0 ) return; + nRep = sqlite3_value_bytes(argv[2]); + assert( zRep==sqlite3_value_text(argv[2]) ); + nOut = nStr + 1; + assert( nOutnPattern ){ + nOut += nRep - nPattern; + testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + sqlite3_free(zOut); + return; + } + cntExpand++; + if( (cntExpand&(cntExpand-1))==0 ){ + /* Grow the size of the output buffer only on substitutions + ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */ + u8 *zOld; + zOld = zOut; + zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1)); + if( zOut==0 ){ + sqlite3_result_error_nomem(context); + sqlite3_free(zOld); + return; + } + } + } + memcpy(&zOut[j], zRep, nRep); + j += nRep; + i += nPattern-1; + } + } + assert( j+nStr-i+1<=nOut ); + memcpy(&zOut[j], &zStr[i], nStr-i); + j += nStr - i; + assert( j<=nOut ); + zOut[j] = 0; + sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); +} + +/* +** Implementation of the TRIM(), LTRIM(), and RTRIM() functions. +** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both. +*/ +static void trimFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zIn; /* Input string */ + const unsigned char *zCharSet; /* Set of characters to trim */ + unsigned int nIn; /* Number of bytes in input */ + int flags; /* 1: trimleft 2: trimright 3: trim */ + int i; /* Loop counter */ + unsigned int *aLen = 0; /* Length of each character in zCharSet */ + unsigned char **azChar = 0; /* Individual characters in zCharSet */ + int nChar; /* Number of characters in zCharSet */ + + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + return; + } + zIn = sqlite3_value_text(argv[0]); + if( zIn==0 ) return; + nIn = (unsigned)sqlite3_value_bytes(argv[0]); + assert( zIn==sqlite3_value_text(argv[0]) ); + if( argc==1 ){ + static const unsigned lenOne[] = { 1 }; + static unsigned char * const azOne[] = { (u8*)" " }; + nChar = 1; + aLen = (unsigned*)lenOne; + azChar = (unsigned char **)azOne; + zCharSet = 0; + }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ + return; + }else{ + const unsigned char *z; + for(z=zCharSet, nChar=0; *z; nChar++){ + SQLITE_SKIP_UTF8(z); + } + if( nChar>0 ){ + azChar = contextMalloc(context, + ((i64)nChar)*(sizeof(char*)+sizeof(unsigned))); + if( azChar==0 ){ + return; + } + aLen = (unsigned*)&azChar[nChar]; + for(z=zCharSet, nChar=0; *z; nChar++){ + azChar[nChar] = (unsigned char *)z; + SQLITE_SKIP_UTF8(z); + aLen[nChar] = (unsigned)(z - azChar[nChar]); + } + } + } + if( nChar>0 ){ + flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context)); + if( flags & 1 ){ + while( nIn>0 ){ + unsigned int len = 0; + for(i=0; i=nChar ) break; + zIn += len; + nIn -= len; + } + } + if( flags & 2 ){ + while( nIn>0 ){ + unsigned int len = 0; + for(i=0; i=nChar ) break; + nIn -= len; + } + } + if( zCharSet ){ + sqlite3_free(azChar); + } + } + sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); +} + + +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION +/* +** The "unknown" function is automatically substituted in place of +** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN +** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used. +** When the "sqlite3" command-line shell is built using this functionality, +** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries +** involving application-defined functions to be examined in a generic +** sqlite3 shell. +*/ +static void unknownFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + /* no-op */ +} +#endif /*SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION*/ + + +/* IMP: R-25361-16150 This function is omitted from SQLite by default. It +** is only available if the SQLITE_SOUNDEX compile-time option is used +** when SQLite is built. +*/ +#ifdef SQLITE_SOUNDEX +/* +** Compute the soundex encoding of a word. +** +** IMP: R-59782-00072 The soundex(X) function returns a string that is the +** soundex encoding of the string X. +*/ +static void soundexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + char zResult[8]; + const u8 *zIn; + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + assert( argc==1 ); + zIn = (u8*)sqlite3_value_text(argv[0]); + if( zIn==0 ) zIn = (u8*)""; + for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){} + if( zIn[i] ){ + u8 prevcode = iCode[zIn[i]&0x7f]; + zResult[0] = sqlite3Toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + if( code!=prevcode ){ + prevcode = code; + zResult[j++] = code + '0'; + } + }else{ + prevcode = 0; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + zResult[j] = 0; + sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); + }else{ + /* IMP: R-64894-50321 The string "?000" is returned if the argument + ** is NULL or contains no ASCII alphabetic characters. */ + sqlite3_result_text(context, "?000", 4, SQLITE_STATIC); + } +} +#endif /* SQLITE_SOUNDEX */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** A function that loads a shared-library extension then returns NULL. +*/ +static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *zFile = (const char *)sqlite3_value_text(argv[0]); + const char *zProc; + sqlite3 *db = sqlite3_context_db_handle(context); + char *zErrMsg = 0; + + /* Disallow the load_extension() SQL function unless the SQLITE_LoadExtFunc + ** flag is set. See the sqlite3_enable_load_extension() API. + */ + if( (db->flags & SQLITE_LoadExtFunc)==0 ){ + sqlite3_result_error(context, "not authorized", -1); + return; + } + + if( argc==2 ){ + zProc = (const char *)sqlite3_value_text(argv[1]); + }else{ + zProc = 0; + } + if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ + sqlite3_result_error(context, zErrMsg, -1); + sqlite3_free(zErrMsg); + } +} +#endif + + +/* +** An instance of the following structure holds the context of a +** sum() or avg() aggregate computation. +*/ +typedef struct SumCtx SumCtx; +struct SumCtx { + double rSum; /* Floating point sum */ + i64 iSum; /* Integer sum */ + i64 cnt; /* Number of elements summed */ + u8 overflow; /* True if integer overflow seen */ + u8 approx; /* True if non-integer value was input to the sum */ +}; + +/* +** Routines used to compute the sum, average, and total. +** +** The SUM() function follows the (broken) SQL standard which means +** that it returns NULL if it sums over no inputs. TOTAL returns +** 0.0 in that case. In addition, TOTAL always returns a float where +** SUM might return an integer if it never encounters a floating point +** value. TOTAL never fails, but SUM might through an exception if +** it overflows an integer. +*/ +static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + SumCtx *p; + int type; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + p = sqlite3_aggregate_context(context, sizeof(*p)); + type = sqlite3_value_numeric_type(argv[0]); + if( p && type!=SQLITE_NULL ){ + p->cnt++; + if( type==SQLITE_INTEGER ){ + i64 v = sqlite3_value_int64(argv[0]); + p->rSum += v; + if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){ + p->approx = p->overflow = 1; + } + }else{ + p->rSum += sqlite3_value_double(argv[0]); + p->approx = 1; + } + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){ + SumCtx *p; + int type; + assert( argc==1 ); + UNUSED_PARAMETER(argc); + p = sqlite3_aggregate_context(context, sizeof(*p)); + type = sqlite3_value_numeric_type(argv[0]); + /* p is always non-NULL because sumStep() will have been called first + ** to initialize it */ + if( ALWAYS(p) && type!=SQLITE_NULL ){ + assert( p->cnt>0 ); + p->cnt--; + assert( type==SQLITE_INTEGER || p->approx ); + if( type==SQLITE_INTEGER && p->approx==0 ){ + i64 v = sqlite3_value_int64(argv[0]); + p->rSum -= v; + p->iSum -= v; + }else{ + p->rSum -= sqlite3_value_double(argv[0]); + } + } +} +#else +# define sumInverse 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ +static void sumFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + if( p->overflow ){ + sqlite3_result_error(context,"integer overflow",-1); + }else if( p->approx ){ + sqlite3_result_double(context, p->rSum); + }else{ + sqlite3_result_int64(context, p->iSum); + } + } +} +static void avgFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>0 ){ + sqlite3_result_double(context, p->rSum/(double)p->cnt); + } +} +static void totalFinalize(sqlite3_context *context){ + SumCtx *p; + p = sqlite3_aggregate_context(context, 0); + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + sqlite3_result_double(context, p ? p->rSum : (double)0); +} + +/* +** The following structure keeps track of state information for the +** count() aggregate function. +*/ +typedef struct CountCtx CountCtx; +struct CountCtx { + i64 n; +#ifdef SQLITE_DEBUG + int bInverse; /* True if xInverse() ever called */ +#endif +}; + +/* +** Routines to implement the count() aggregate function. +*/ +static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + CountCtx *p; + p = sqlite3_aggregate_context(context, sizeof(*p)); + if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ + p->n++; + } + +#ifndef SQLITE_OMIT_DEPRECATED + /* The sqlite3_aggregate_count() function is deprecated. But just to make + ** sure it still operates correctly, verify that its count agrees with our + ** internal count when using count(*) and when the total count can be + ** expressed as a 32-bit integer. */ + assert( argc==1 || p==0 || p->n>0x7fffffff || p->bInverse + || p->n==sqlite3_aggregate_count(context) ); +#endif +} +static void countFinalize(sqlite3_context *context){ + CountCtx *p; + p = sqlite3_aggregate_context(context, 0); + sqlite3_result_int64(context, p ? p->n : 0); +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void countInverse(sqlite3_context *ctx, int argc, sqlite3_value **argv){ + CountCtx *p; + p = sqlite3_aggregate_context(ctx, sizeof(*p)); + /* p is always non-NULL since countStep() will have been called first */ + if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && ALWAYS(p) ){ + p->n--; +#ifdef SQLITE_DEBUG + p->bInverse = 1; +#endif + } +} +#else +# define countInverse 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** Routines to implement min() and max() aggregate functions. +*/ +static void minmaxStep( + sqlite3_context *context, + int NotUsed, + sqlite3_value **argv +){ + Mem *pArg = (Mem *)argv[0]; + Mem *pBest; + UNUSED_PARAMETER(NotUsed); + + pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest)); + if( !pBest ) return; + + if( sqlite3_value_type(pArg)==SQLITE_NULL ){ + if( pBest->flags ) sqlite3SkipAccumulatorLoad(context); + }else if( pBest->flags ){ + int max; + int cmp; + CollSeq *pColl = sqlite3GetFuncCollSeq(context); + /* This step function is used for both the min() and max() aggregates, + ** the only difference between the two being that the sense of the + ** comparison is inverted. For the max() aggregate, the + ** sqlite3_user_data() function returns (void *)-1. For min() it + ** returns (void *)db, where db is the sqlite3* database pointer. + ** Therefore the next statement sets variable 'max' to 1 for the max() + ** aggregate, or 0 for min(). + */ + max = sqlite3_user_data(context)!=0; + cmp = sqlite3MemCompare(pBest, pArg, pColl); + if( (max && cmp<0) || (!max && cmp>0) ){ + sqlite3VdbeMemCopy(pBest, pArg); + }else{ + sqlite3SkipAccumulatorLoad(context); + } + }else{ + pBest->db = sqlite3_context_db_handle(context); + sqlite3VdbeMemCopy(pBest, pArg); + } +} +static void minMaxValueFinalize(sqlite3_context *context, int bValue){ + sqlite3_value *pRes; + pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); + if( pRes ){ + if( pRes->flags ){ + sqlite3_result_value(context, pRes); + } + if( bValue==0 ) sqlite3VdbeMemRelease(pRes); + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void minMaxValue(sqlite3_context *context){ + minMaxValueFinalize(context, 1); +} +#else +# define minMaxValue 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ +static void minMaxFinalize(sqlite3_context *context){ + minMaxValueFinalize(context, 0); +} + +/* +** group_concat(EXPR, ?SEPARATOR?) +** +** The SEPARATOR goes before the EXPR string. This is tragic. The +** groupConcatInverse() implementation would have been easier if the +** SEPARATOR were appended after EXPR. And the order is undocumented, +** so we could change it, in theory. But the old behavior has been +** around for so long that we dare not, for fear of breaking something. +*/ +typedef struct { + StrAccum str; /* The accumulated concatenation */ +#ifndef SQLITE_OMIT_WINDOWFUNC + int nAccum; /* Number of strings presently concatenated */ + int nFirstSepLength; /* Used to detect separator length change */ + /* If pnSepLengths!=0, refs an array of inter-string separator lengths, + ** stored as actually incorporated into presently accumulated result. + ** (Hence, its slots in use number nAccum-1 between method calls.) + ** If pnSepLengths==0, nFirstSepLength is the length used throughout. + */ + int *pnSepLengths; +#endif +} GroupConcatCtx; + +static void groupConcatStep( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zVal; + GroupConcatCtx *pGCC; + const char *zSep; + int nVal, nSep; + assert( argc==1 || argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC)); + if( pGCC ){ + sqlite3 *db = sqlite3_context_db_handle(context); + int firstTerm = pGCC->str.mxAlloc==0; + pGCC->str.mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; + if( argc==1 ){ + if( !firstTerm ){ + sqlite3_str_appendchar(&pGCC->str, 1, ','); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else{ + pGCC->nFirstSepLength = 1; + } +#endif + }else if( !firstTerm ){ + zSep = (char*)sqlite3_value_text(argv[1]); + nSep = sqlite3_value_bytes(argv[1]); + if( zSep ){ + sqlite3_str_append(&pGCC->str, zSep, nSep); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else{ + nSep = 0; + } + if( nSep != pGCC->nFirstSepLength || pGCC->pnSepLengths != 0 ){ + int *pnsl = pGCC->pnSepLengths; + if( pnsl == 0 ){ + /* First separator length variation seen, start tracking them. */ + pnsl = (int*)sqlite3_malloc64((pGCC->nAccum+1) * sizeof(int)); + if( pnsl!=0 ){ + int i = 0, nA = pGCC->nAccum-1; + while( inFirstSepLength; + } + }else{ + pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int)); + } + if( pnsl!=0 ){ + if( ALWAYS(pGCC->nAccum>0) ){ + pnsl[pGCC->nAccum-1] = nSep; + } + pGCC->pnSepLengths = pnsl; + }else{ + sqlite3StrAccumSetError(&pGCC->str, SQLITE_NOMEM); + } + } +#endif + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else{ + pGCC->nFirstSepLength = sqlite3_value_bytes(argv[1]); + } + pGCC->nAccum += 1; +#endif + zVal = (char*)sqlite3_value_text(argv[0]); + nVal = sqlite3_value_bytes(argv[0]); + if( zVal ) sqlite3_str_append(&pGCC->str, zVal, nVal); + } +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +static void groupConcatInverse( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GroupConcatCtx *pGCC; + assert( argc==1 || argc==2 ); + (void)argc; /* Suppress unused parameter warning */ + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC)); + /* pGCC is always non-NULL since groupConcatStep() will have always + ** run frist to initialize it */ + if( ALWAYS(pGCC) ){ + int nVS; + /* Must call sqlite3_value_text() to convert the argument into text prior + ** to invoking sqlite3_value_bytes(), in case the text encoding is UTF16 */ + (void)sqlite3_value_text(argv[0]); + nVS = sqlite3_value_bytes(argv[0]); + pGCC->nAccum -= 1; + if( pGCC->pnSepLengths!=0 ){ + assert(pGCC->nAccum >= 0); + if( pGCC->nAccum>0 ){ + nVS += *pGCC->pnSepLengths; + memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1, + (pGCC->nAccum-1)*sizeof(int)); + } + }else{ + /* If removing single accumulated string, harmlessly over-do. */ + nVS += pGCC->nFirstSepLength; + } + if( nVS>=(int)pGCC->str.nChar ){ + pGCC->str.nChar = 0; + }else{ + pGCC->str.nChar -= nVS; + memmove(pGCC->str.zText, &pGCC->str.zText[nVS], pGCC->str.nChar); + } + if( pGCC->str.nChar==0 ){ + pGCC->str.mxAlloc = 0; + sqlite3_free(pGCC->pnSepLengths); + pGCC->pnSepLengths = 0; + } + } +} +#else +# define groupConcatInverse 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ +static void groupConcatFinalize(sqlite3_context *context){ + GroupConcatCtx *pGCC + = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0); + if( pGCC ){ + sqlite3ResultStrAccum(context, &pGCC->str); +#ifndef SQLITE_OMIT_WINDOWFUNC + sqlite3_free(pGCC->pnSepLengths); +#endif + } +} +#ifndef SQLITE_OMIT_WINDOWFUNC +static void groupConcatValue(sqlite3_context *context){ + GroupConcatCtx *pGCC + = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0); + if( pGCC ){ + StrAccum *pAccum = &pGCC->str; + if( pAccum->accError==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(context); + }else if( pAccum->accError==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + const char *zText = sqlite3_str_value(pAccum); + sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT); + } + } +} +#else +# define groupConcatValue 0 +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** This routine does per-connection function registration. Most +** of the built-in functions above are part of the global function set. +** This routine only deals with those that are not global. +*/ +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ + int rc = sqlite3_overload_function(db, "MATCH", 2); + assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + { + extern void sqlcipher_exportFunc(sqlite3_context *, int, sqlite3_value **); + sqlite3CreateFunc(db, "sqlcipher_export", -1, SQLITE_TEXT, 0, sqlcipher_exportFunc, 0, 0, 0, 0, 0); + } +#ifdef SQLCIPHER_EXT +#include "sqlcipher_funcs_init.h" +#endif +#endif +/* END SQLCIPHER */ +} + +/* +** Re-register the built-in LIKE functions. The caseSensitive +** parameter determines whether or not the LIKE operator is case +** sensitive. +*/ +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ + struct compareInfo *pInfo; + int flags; + if( caseSensitive ){ + pInfo = (struct compareInfo*)&likeInfoAlt; + flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE; + }else{ + pInfo = (struct compareInfo*)&likeInfoNorm; + flags = SQLITE_FUNC_LIKE; + } + sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); + sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); + sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags; + sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags; +} + +/* +** pExpr points to an expression which implements a function. If +** it is appropriate to apply the LIKE optimization to that function +** then set aWc[0] through aWc[2] to the wildcard characters and the +** escape character and then return TRUE. If the function is not a +** LIKE-style function then return FALSE. +** +** The expression "a LIKE b ESCAPE c" is only considered a valid LIKE +** operator if c is a string literal that is exactly one byte in length. +** That one byte is stored in aWc[3]. aWc[3] is set to zero if there is +** no ESCAPE clause. +** +** *pIsNocase is set to true if uppercase and lowercase are equivalent for +** the function (default for LIKE). If the function makes the distinction +** between uppercase and lowercase (as does GLOB) then *pIsNocase is set to +** false. +*/ +SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ + FuncDef *pDef; + int nExpr; + assert( pExpr!=0 ); + assert( pExpr->op==TK_FUNCTION ); + assert( ExprUseXList(pExpr) ); + if( !pExpr->x.pList ){ + return 0; + } + nExpr = pExpr->x.pList->nExpr; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 ) return 0; +#endif + if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ + return 0; + } + + /* The memcpy() statement assumes that the wildcard characters are + ** the first three statements in the compareInfo structure. The + ** asserts() that follow verify that assumption + */ + memcpy(aWc, pDef->pUserData, 3); + assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); + assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); + assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); + + if( nExpr<3 ){ + aWc[3] = 0; + }else{ + Expr *pEscape = pExpr->x.pList->a[2].pExpr; + char *zEscape; + if( pEscape->op!=TK_STRING ) return 0; + assert( !ExprHasProperty(pEscape, EP_IntValue) ); + zEscape = pEscape->u.zToken; + if( zEscape[0]==0 || zEscape[1]!=0 ) return 0; + if( zEscape[0]==aWc[0] ) return 0; + if( zEscape[0]==aWc[1] ) return 0; + aWc[3] = zEscape[0]; + } + + *pIsNocase = (pDef->funcFlags & SQLITE_FUNC_CASE)==0; + return 1; +} + +/* Mathematical Constants */ +#ifndef M_PI +# define M_PI 3.141592653589793238462643383279502884 +#endif +#ifndef M_LN10 +# define M_LN10 2.302585092994045684017991454684364208 +#endif +#ifndef M_LN2 +# define M_LN2 0.693147180559945309417232121458176568 +#endif + + +/* Extra math functions that require linking with -lm +*/ +#ifdef SQLITE_ENABLE_MATH_FUNCTIONS +/* +** Implementation SQL functions: +** +** ceil(X) +** ceiling(X) +** floor(X) +** +** The sqlite3_user_data() pointer is a pointer to the libm implementation +** of the underlying C function. +*/ +static void ceilingFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( argc==1 ); + switch( sqlite3_value_numeric_type(argv[0]) ){ + case SQLITE_INTEGER: { + sqlite3_result_int64(context, sqlite3_value_int64(argv[0])); + break; + } + case SQLITE_FLOAT: { + double (*x)(double) = (double(*)(double))sqlite3_user_data(context); + sqlite3_result_double(context, x(sqlite3_value_double(argv[0]))); + break; + } + default: { + break; + } + } +} + +/* +** On some systems, ceil() and floor() are intrinsic function. You are +** unable to take a pointer to these functions. Hence, we here wrap them +** in our own actual functions. +*/ +static double xCeil(double x){ return ceil(x); } +static double xFloor(double x){ return floor(x); } + +/* +** Implementation of SQL functions: +** +** ln(X) - natural logarithm +** log(X) - log X base 10 +** log10(X) - log X base 10 +** log(B,X) - log X base B +*/ +static void logFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + double x, b, ans; + assert( argc==1 || argc==2 ); + switch( sqlite3_value_numeric_type(argv[0]) ){ + case SQLITE_INTEGER: + case SQLITE_FLOAT: + x = sqlite3_value_double(argv[0]); + if( x<=0.0 ) return; + break; + default: + return; + } + if( argc==2 ){ + switch( sqlite3_value_numeric_type(argv[0]) ){ + case SQLITE_INTEGER: + case SQLITE_FLOAT: + b = log(x); + if( b<=0.0 ) return; + x = sqlite3_value_double(argv[1]); + if( x<=0.0 ) return; + break; + default: + return; + } + ans = log(x)/b; + }else{ + ans = log(x); + switch( SQLITE_PTR_TO_INT(sqlite3_user_data(context)) ){ + case 1: + /* Convert from natural logarithm to log base 10 */ + ans /= M_LN10; + break; + case 2: + /* Convert from natural logarithm to log base 2 */ + ans /= M_LN2; + break; + default: + break; + } + } + sqlite3_result_double(context, ans); +} + +/* +** Functions to converts degrees to radians and radians to degrees. +*/ +static double degToRad(double x){ return x*(M_PI/180.0); } +static double radToDeg(double x){ return x*(180.0/M_PI); } + +/* +** Implementation of 1-argument SQL math functions: +** +** exp(X) - Compute e to the X-th power +*/ +static void math1Func( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int type0; + double v0, ans; + double (*x)(double); + assert( argc==1 ); + type0 = sqlite3_value_numeric_type(argv[0]); + if( type0!=SQLITE_INTEGER && type0!=SQLITE_FLOAT ) return; + v0 = sqlite3_value_double(argv[0]); + x = (double(*)(double))sqlite3_user_data(context); + ans = x(v0); + sqlite3_result_double(context, ans); +} + +/* +** Implementation of 2-argument SQL math functions: +** +** power(X,Y) - Compute X to the Y-th power +*/ +static void math2Func( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int type0, type1; + double v0, v1, ans; + double (*x)(double,double); + assert( argc==2 ); + type0 = sqlite3_value_numeric_type(argv[0]); + if( type0!=SQLITE_INTEGER && type0!=SQLITE_FLOAT ) return; + type1 = sqlite3_value_numeric_type(argv[1]); + if( type1!=SQLITE_INTEGER && type1!=SQLITE_FLOAT ) return; + v0 = sqlite3_value_double(argv[0]); + v1 = sqlite3_value_double(argv[1]); + x = (double(*)(double,double))sqlite3_user_data(context); + ans = x(v0, v1); + sqlite3_result_double(context, ans); +} + +/* +** Implementation of 0-argument pi() function. +*/ +static void piFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( argc==0 ); + sqlite3_result_double(context, M_PI); +} + +#endif /* SQLITE_ENABLE_MATH_FUNCTIONS */ + +/* +** Implementation of sign(X) function. +*/ +static void signFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int type0; + double x; + UNUSED_PARAMETER(argc); + assert( argc==1 ); + type0 = sqlite3_value_numeric_type(argv[0]); + if( type0!=SQLITE_INTEGER && type0!=SQLITE_FLOAT ) return; + x = sqlite3_value_double(argv[0]); + sqlite3_result_int(context, x<0.0 ? -1 : x>0.0 ? +1 : 0); +} + +/* +** All of the FuncDef structures in the aBuiltinFunc[] array above +** to the global function hash table. This occurs at start-time (as +** a consequence of calling sqlite3_initialize()). +** +** After this routine runs +*/ +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ + /* + ** The following array holds FuncDef structures for all of the functions + ** defined in this file. + ** + ** The array cannot be constant since changes are made to the + ** FuncDef.pHash elements at start-time. The elements of this array + ** are read-only after initialization is complete. + ** + ** For peak efficiency, put the most frequently used function last. + */ + static FuncDef aBuiltinFunc[] = { +/***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/ +#if !defined(SQLITE_UNTESTABLE) + TEST_FUNC(implies_nonnull_row, 2, INLINEFUNC_implies_nonnull_row, 0), + TEST_FUNC(expr_compare, 2, INLINEFUNC_expr_compare, 0), + TEST_FUNC(expr_implies_expr, 2, INLINEFUNC_expr_implies_expr, 0), + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), +#endif /* !defined(SQLITE_UNTESTABLE) */ +/***** Regular functions *****/ +#ifdef SQLITE_SOUNDEX + FUNCTION(soundex, 1, 0, 0, soundexFunc ), +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + SFUNCTION(load_extension, 1, 0, 0, loadExt ), + SFUNCTION(load_extension, 2, 0, 0, loadExt ), +#endif +#if SQLITE_USER_AUTHENTICATION + FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), +#endif +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), + DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + INLINE_FUNC(sqlite_offset, 1, INLINEFUNC_sqlite_offset, 0 ), +#endif + FUNCTION(ltrim, 1, 1, 0, trimFunc ), + FUNCTION(ltrim, 2, 1, 0, trimFunc ), + FUNCTION(rtrim, 1, 2, 0, trimFunc ), + FUNCTION(rtrim, 2, 2, 0, trimFunc ), + FUNCTION(trim, 1, 3, 0, trimFunc ), + FUNCTION(trim, 2, 3, 0, trimFunc ), + FUNCTION(min, -1, 0, 1, minmaxFunc ), + FUNCTION(min, 0, 0, 1, 0 ), + WAGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, + SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), + FUNCTION(max, -1, 1, 1, minmaxFunc ), + FUNCTION(max, 0, 1, 1, 0 ), + WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, + SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), + FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), + FUNCTION2(subtype, 1, 0, 0, subtypeFunc, SQLITE_FUNC_TYPEOF), + FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH), + FUNCTION(instr, 2, 0, 0, instrFunc ), + FUNCTION(printf, -1, 0, 0, printfFunc ), + FUNCTION(format, -1, 0, 0, printfFunc ), + FUNCTION(unicode, 1, 0, 0, unicodeFunc ), + FUNCTION(char, -1, 0, 0, charFunc ), + FUNCTION(abs, 1, 0, 0, absFunc ), +#ifndef SQLITE_OMIT_FLOATING_POINT + FUNCTION(round, 1, 0, 0, roundFunc ), + FUNCTION(round, 2, 0, 0, roundFunc ), +#endif + FUNCTION(upper, 1, 0, 0, upperFunc ), + FUNCTION(lower, 1, 0, 0, lowerFunc ), + FUNCTION(hex, 1, 0, 0, hexFunc ), + INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ), + VFUNCTION(random, 0, 0, 0, randomFunc ), + VFUNCTION(randomblob, 1, 0, 0, randomBlob ), + FUNCTION(nullif, 2, 0, 1, nullifFunc ), + DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ), + DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), + FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), + FUNCTION(quote, 1, 0, 0, quoteFunc ), + VFUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid), + VFUNCTION(changes, 0, 0, 0, changes ), + VFUNCTION(total_changes, 0, 0, 0, total_changes ), + FUNCTION(replace, 3, 0, 0, replaceFunc ), + FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ), + FUNCTION(substr, 2, 0, 0, substrFunc ), + FUNCTION(substr, 3, 0, 0, substrFunc ), + FUNCTION(substring, 2, 0, 0, substrFunc ), + FUNCTION(substring, 3, 0, 0, substrFunc ), + WAGGREGATE(sum, 1,0,0, sumStep, sumFinalize, sumFinalize, sumInverse, 0), + WAGGREGATE(total, 1,0,0, sumStep,totalFinalize,totalFinalize,sumInverse, 0), + WAGGREGATE(avg, 1,0,0, sumStep, avgFinalize, avgFinalize, sumInverse, 0), + WAGGREGATE(count, 0,0,0, countStep, + countFinalize, countFinalize, countInverse, + SQLITE_FUNC_COUNT|SQLITE_FUNC_ANYORDER ), + WAGGREGATE(count, 1,0,0, countStep, + countFinalize, countFinalize, countInverse, SQLITE_FUNC_ANYORDER ), + WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep, + groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), + WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep, + groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), + + LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), +#ifdef SQLITE_CASE_SENSITIVE_LIKE + LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), + LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), +#else + LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE), + LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), +#endif +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + FUNCTION(unknown, -1, 0, 0, unknownFunc ), +#endif + FUNCTION(coalesce, 1, 0, 0, 0 ), + FUNCTION(coalesce, 0, 0, 0, 0 ), +#ifdef SQLITE_ENABLE_MATH_FUNCTIONS + MFUNCTION(ceil, 1, xCeil, ceilingFunc ), + MFUNCTION(ceiling, 1, xCeil, ceilingFunc ), + MFUNCTION(floor, 1, xFloor, ceilingFunc ), +#if SQLITE_HAVE_C99_MATH_FUNCS + MFUNCTION(trunc, 1, trunc, ceilingFunc ), +#endif + FUNCTION(ln, 1, 0, 0, logFunc ), + FUNCTION(log, 1, 1, 0, logFunc ), + FUNCTION(log10, 1, 1, 0, logFunc ), + FUNCTION(log2, 1, 2, 0, logFunc ), + FUNCTION(log, 2, 0, 0, logFunc ), + MFUNCTION(exp, 1, exp, math1Func ), + MFUNCTION(pow, 2, pow, math2Func ), + MFUNCTION(power, 2, pow, math2Func ), + MFUNCTION(mod, 2, fmod, math2Func ), + MFUNCTION(acos, 1, acos, math1Func ), + MFUNCTION(asin, 1, asin, math1Func ), + MFUNCTION(atan, 1, atan, math1Func ), + MFUNCTION(atan2, 2, atan2, math2Func ), + MFUNCTION(cos, 1, cos, math1Func ), + MFUNCTION(sin, 1, sin, math1Func ), + MFUNCTION(tan, 1, tan, math1Func ), + MFUNCTION(cosh, 1, cosh, math1Func ), + MFUNCTION(sinh, 1, sinh, math1Func ), + MFUNCTION(tanh, 1, tanh, math1Func ), +#if SQLITE_HAVE_C99_MATH_FUNCS + MFUNCTION(acosh, 1, acosh, math1Func ), + MFUNCTION(asinh, 1, asinh, math1Func ), + MFUNCTION(atanh, 1, atanh, math1Func ), +#endif + MFUNCTION(sqrt, 1, sqrt, math1Func ), + MFUNCTION(radians, 1, degToRad, math1Func ), + MFUNCTION(degrees, 1, radToDeg, math1Func ), + FUNCTION(pi, 0, 0, 0, piFunc ), +#endif /* SQLITE_ENABLE_MATH_FUNCTIONS */ + FUNCTION(sign, 1, 0, 0, signFunc ), + INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ), + INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ), + }; +#ifndef SQLITE_OMIT_ALTERTABLE + sqlite3AlterFunctions(); +#endif + sqlite3WindowFunctions(); + sqlite3RegisterDateTimeFunctions(); + sqlite3RegisterJsonFunctions(); + sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); + +#if 0 /* Enable to print out how the built-in functions are hashed */ + { + int i; + FuncDef *p; + for(i=0; iu.pHash){ + int n = sqlite3Strlen30(p->zName); + int h = p->zName[0] + n; + assert( p->funcFlags & SQLITE_FUNC_BUILTIN ); + printf(" %s(%d)", p->zName, h); + } + printf("\n"); + } + } +#endif +} + +/************** End of func.c ************************************************/ +/************** Begin file fkey.c ********************************************/ +/* +** +** 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 contains code used by the compiler to add foreign key +** support to compiled SQL statements. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +#ifndef SQLITE_OMIT_TRIGGER + +/* +** Deferred and Immediate FKs +** -------------------------- +** +** Foreign keys in SQLite come in two flavours: deferred and immediate. +** If an immediate foreign key constraint is violated, +** SQLITE_CONSTRAINT_FOREIGNKEY is returned and the current +** statement transaction rolled back. If a +** deferred foreign key constraint is violated, no action is taken +** immediately. However if the application attempts to commit the +** transaction before fixing the constraint violation, the attempt fails. +** +** Deferred constraints are implemented using a simple counter associated +** with the database handle. The counter is set to zero each time a +** database transaction is opened. Each time a statement is executed +** that causes a foreign key violation, the counter is incremented. Each +** time a statement is executed that removes an existing violation from +** the database, the counter is decremented. When the transaction is +** committed, the commit fails if the current value of the counter is +** greater than zero. This scheme has two big drawbacks: +** +** * When a commit fails due to a deferred foreign key constraint, +** there is no way to tell which foreign constraint is not satisfied, +** or which row it is not satisfied for. +** +** * If the database contains foreign key violations when the +** transaction is opened, this may cause the mechanism to malfunction. +** +** Despite these problems, this approach is adopted as it seems simpler +** than the alternatives. +** +** INSERT operations: +** +** I.1) For each FK for which the table is the child table, search +** the parent table for a match. If none is found increment the +** constraint counter. +** +** I.2) For each FK for which the table is the parent table, +** search the child table for rows that correspond to the new +** row in the parent table. Decrement the counter for each row +** found (as the constraint is now satisfied). +** +** DELETE operations: +** +** D.1) For each FK for which the table is the child table, +** search the parent table for a row that corresponds to the +** deleted row in the child table. If such a row is not found, +** decrement the counter. +** +** D.2) For each FK for which the table is the parent table, search +** the child table for rows that correspond to the deleted row +** in the parent table. For each found increment the counter. +** +** UPDATE operations: +** +** An UPDATE command requires that all 4 steps above are taken, but only +** for FK constraints for which the affected columns are actually +** modified (values must be compared at runtime). +** +** Note that I.1 and D.1 are very similar operations, as are I.2 and D.2. +** This simplifies the implementation a bit. +** +** For the purposes of immediate FK constraints, the OR REPLACE conflict +** resolution is considered to delete rows before the new row is inserted. +** If a delete caused by OR REPLACE violates an FK constraint, an exception +** is thrown, even if the FK constraint would be satisfied after the new +** row is inserted. +** +** Immediate constraints are usually handled similarly. The only difference +** is that the counter used is stored as part of each individual statement +** object (struct Vdbe). If, after the statement has run, its immediate +** constraint counter is greater than zero, +** it returns SQLITE_CONSTRAINT_FOREIGNKEY +** and the statement transaction is rolled back. An exception is an INSERT +** statement that inserts a single row only (no triggers). In this case, +** instead of using a counter, an exception is thrown immediately if the +** INSERT violates a foreign key constraint. This is necessary as such +** an INSERT does not open a statement transaction. +** +** TODO: How should dropping a table be handled? How should renaming a +** table be handled? +** +** +** Query API Notes +** --------------- +** +** Before coding an UPDATE or DELETE row operation, the code-generator +** for those two operations needs to know whether or not the operation +** requires any FK processing and, if so, which columns of the original +** row are required by the FK processing VDBE code (i.e. if FKs were +** implemented using triggers, which of the old.* columns would be +** accessed). No information is required by the code-generator before +** coding an INSERT operation. The functions used by the UPDATE/DELETE +** generation code to query for this information are: +** +** sqlite3FkRequired() - Test to see if FK processing is required. +** sqlite3FkOldmask() - Query for the set of required old.* columns. +** +** +** Externally accessible module functions +** -------------------------------------- +** +** sqlite3FkCheck() - Check for foreign key violations. +** sqlite3FkActions() - Code triggers for ON UPDATE/ON DELETE actions. +** sqlite3FkDelete() - Delete an FKey structure. +*/ + +/* +** VDBE Calling Convention +** ----------------------- +** +** Example: +** +** For the following INSERT statement: +** +** CREATE TABLE t1(a, b INTEGER PRIMARY KEY, c); +** INSERT INTO t1 VALUES(1, 2, 3.1); +** +** Register (x): 2 (type integer) +** Register (x+1): 1 (type integer) +** Register (x+2): NULL (type NULL) +** Register (x+3): 3.1 (type real) +*/ + +/* +** A foreign key constraint requires that the key columns in the parent +** table are collectively subject to a UNIQUE or PRIMARY KEY constraint. +** Given that pParent is the parent table for foreign key constraint pFKey, +** search the schema for a unique index on the parent key columns. +** +** If successful, zero is returned. If the parent key is an INTEGER PRIMARY +** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx +** is set to point to the unique index. +** +** If the parent key consists of a single column (the foreign key constraint +** is not a composite foreign key), output variable *paiCol is set to NULL. +** Otherwise, it is set to point to an allocated array of size N, where +** N is the number of columns in the parent key. The first element of the +** array is the index of the child table column that is mapped by the FK +** constraint to the parent table column stored in the left-most column +** of index *ppIdx. The second element of the array is the index of the +** child table column that corresponds to the second left-most column of +** *ppIdx, and so on. +** +** If the required index cannot be found, either because: +** +** 1) The named parent key columns do not exist, or +** +** 2) The named parent key columns do exist, but are not subject to a +** UNIQUE or PRIMARY KEY constraint, or +** +** 3) No parent key columns were provided explicitly as part of the +** foreign key definition, and the parent table does not have a +** PRIMARY KEY, or +** +** 4) No parent key columns were provided explicitly as part of the +** foreign key definition, and the PRIMARY KEY of the parent table +** consists of a different number of columns to the child key in +** the child table. +** +** then non-zero is returned, and a "foreign key mismatch" error loaded +** into pParse. If an OOM error occurs, non-zero is returned and the +** pParse->db->mallocFailed flag is set. +*/ +SQLITE_PRIVATE int sqlite3FkLocateIndex( + Parse *pParse, /* Parse context to store any error in */ + Table *pParent, /* Parent table of FK constraint pFKey */ + FKey *pFKey, /* Foreign key to find index for */ + Index **ppIdx, /* OUT: Unique index on parent table */ + int **paiCol /* OUT: Map of index columns in pFKey */ +){ + Index *pIdx = 0; /* Value to return via *ppIdx */ + int *aiCol = 0; /* Value to return via *paiCol */ + int nCol = pFKey->nCol; /* Number of columns in parent key */ + char *zKey = pFKey->aCol[0].zCol; /* Name of left-most parent key column */ + + /* The caller is responsible for zeroing output parameters. */ + assert( ppIdx && *ppIdx==0 ); + assert( !paiCol || *paiCol==0 ); + assert( pParse ); + + /* If this is a non-composite (single column) foreign key, check if it + ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx + ** and *paiCol set to zero and return early. + ** + ** Otherwise, for a composite foreign key (more than one column), allocate + ** space for the aiCol array (returned via output parameter *paiCol). + ** Non-composite foreign keys do not require the aiCol array. + */ + if( nCol==1 ){ + /* The FK maps to the IPK if any of the following are true: + ** + ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly + ** mapped to the primary key of table pParent, or + ** 2) The FK is explicitly mapped to a column declared as INTEGER + ** PRIMARY KEY. + */ + if( pParent->iPKey>=0 ){ + if( !zKey ) return 0; + if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zCnName, zKey) ){ + return 0; + } + } + }else if( paiCol ){ + assert( nCol>1 ); + aiCol = (int *)sqlite3DbMallocRawNN(pParse->db, nCol*sizeof(int)); + if( !aiCol ) return 1; + *paiCol = aiCol; + } + + for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) && pIdx->pPartIdxWhere==0 ){ + /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number + ** of columns. If each indexed column corresponds to a foreign key + ** column of pFKey, then this index is a winner. */ + + if( zKey==0 ){ + /* If zKey is NULL, then this foreign key is implicitly mapped to + ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be + ** identified by the test. */ + if( IsPrimaryKeyIndex(pIdx) ){ + if( aiCol ){ + int i; + for(i=0; iaCol[i].iFrom; + } + break; + } + }else{ + /* If zKey is non-NULL, then this foreign key was declared to + ** map to an explicit list of columns in table pParent. Check if this + ** index matches those columns. Also, check that the index uses + ** the default collation sequences for each column. */ + int i, j; + for(i=0; iaiColumn[i]; /* Index of column in parent tbl */ + const char *zDfltColl; /* Def. collation for column */ + char *zIdxCol; /* Name of indexed column */ + + if( iCol<0 ) break; /* No foreign keys against expression indexes */ + + /* If the index uses a collation sequence that is different from + ** the default collation sequence for the column, this index is + ** unusable. Bail out early in this case. */ + zDfltColl = sqlite3ColumnColl(&pParent->aCol[iCol]); + if( !zDfltColl ) zDfltColl = sqlite3StrBINARY; + if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; + + zIdxCol = pParent->aCol[iCol].zCnName; + for(j=0; jaCol[j].zCol, zIdxCol)==0 ){ + if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom; + break; + } + } + if( j==nCol ) break; + } + if( i==nCol ) break; /* pIdx is usable */ + } + } + } + + if( !pIdx ){ + if( !pParse->disableTriggers ){ + sqlite3ErrorMsg(pParse, + "foreign key mismatch - \"%w\" referencing \"%w\"", + pFKey->pFrom->zName, pFKey->zTo); + } + sqlite3DbFree(pParse->db, aiCol); + return 1; + } + + *ppIdx = pIdx; + return 0; +} + +/* +** This function is called when a row is inserted into or deleted from the +** child table of foreign key constraint pFKey. If an SQL UPDATE is executed +** on the child table of pFKey, this function is invoked twice for each row +** affected - once to "delete" the old row, and then again to "insert" the +** new row. +** +** Each time it is called, this function generates VDBE code to locate the +** row in the parent table that corresponds to the row being inserted into +** or deleted from the child table. If the parent row can be found, no +** special action is taken. Otherwise, if the parent row can *not* be +** found in the parent table: +** +** Operation | FK type | Action taken +** -------------------------------------------------------------------------- +** INSERT immediate Increment the "immediate constraint counter". +** +** DELETE immediate Decrement the "immediate constraint counter". +** +** INSERT deferred Increment the "deferred constraint counter". +** +** DELETE deferred Decrement the "deferred constraint counter". +** +** These operations are identified in the comment at the top of this file +** (fkey.c) as "I.1" and "D.1". +*/ +static void fkLookupParent( + Parse *pParse, /* Parse context */ + int iDb, /* Index of database housing pTab */ + Table *pTab, /* Parent table of FK pFKey */ + Index *pIdx, /* Unique index on parent key columns in pTab */ + FKey *pFKey, /* Foreign key constraint */ + int *aiCol, /* Map from parent key columns to child table columns */ + int regData, /* Address of array containing child table row */ + int nIncr, /* Increment constraint counter by this */ + int isIgnore /* If true, pretend pTab contains all NULL values */ +){ + int i; /* Iterator variable */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ + int iCur = pParse->nTab - 1; /* Cursor number to use */ + int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */ + + sqlite3VdbeVerifyAbortable(v, + (!pFKey->isDeferred + && !(pParse->db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel + && !pParse->isMultiWrite) ? OE_Abort : OE_Ignore); + + /* If nIncr is less than zero, then check at runtime if there are any + ** outstanding constraints to resolve. If there are not, there is no need + ** to check if deleting this row resolves any outstanding violations. + ** + ** Check if any of the key columns in the child table row are NULL. If + ** any are, then the constraint is considered satisfied. No need to + ** search for a matching row in the parent table. */ + if( nIncr<0 ){ + sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, iOk); + VdbeCoverage(v); + } + for(i=0; inCol; i++){ + int iReg = sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[i]) + regData + 1; + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); VdbeCoverage(v); + } + + if( isIgnore==0 ){ + if( pIdx==0 ){ + /* If pIdx is NULL, then the parent key is the INTEGER PRIMARY KEY + ** column of the parent table (table pTab). */ + int iMustBeInt; /* Address of MustBeInt instruction */ + int regTemp = sqlite3GetTempReg(pParse); + + /* Invoke MustBeInt to coerce the child key value to an integer (i.e. + ** apply the affinity of the parent key). If this fails, then there + ** is no matching parent key. Before using MustBeInt, make a copy of + ** the value. Otherwise, the value inserted into the child key column + ** will have INTEGER affinity applied to it, which may not be correct. */ + sqlite3VdbeAddOp2(v, OP_SCopy, + sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[0])+1+regData, regTemp); + iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); + VdbeCoverage(v); + + /* If the parent table is the same as the child table, and we are about + ** to increment the constraint-counter (i.e. this is an INSERT operation), + ** then check if the row being inserted matches itself. If so, do not + ** increment the constraint-counter. */ + if( pTab==pFKey->pFrom && nIncr==1 ){ + sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + } + + sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); VdbeCoverage(v); + sqlite3VdbeGoto(v, iOk); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + sqlite3VdbeJumpHere(v, iMustBeInt); + sqlite3ReleaseTempReg(pParse, regTemp); + }else{ + int nCol = pFKey->nCol; + int regTemp = sqlite3GetTempRange(pParse, nCol); + + sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + for(i=0; ipFrom, aiCol[i])+1+regData, + regTemp+i); + } + + /* If the parent table is the same as the child table, and we are about + ** to increment the constraint-counter (i.e. this is an INSERT operation), + ** then check if the row being inserted matches itself. If so, do not + ** increment the constraint-counter. + ** + ** If any of the parent-key values are NULL, then the row cannot match + ** itself. So set JUMPIFNULL to make sure we do the OP_Found if any + ** of the parent-key values are NULL (at this point it is known that + ** none of the child key values are). + */ + if( pTab==pFKey->pFrom && nIncr==1 ){ + int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1; + for(i=0; ipFrom,aiCol[i]) + +1+regData; + int iParent = 1+regData; + iParent += sqlite3TableColumnToStorage(pIdx->pTable, + pIdx->aiColumn[i]); + assert( pIdx->aiColumn[i]>=0 ); + assert( aiCol[i]!=pTab->iPKey ); + if( pIdx->aiColumn[i]==pTab->iPKey ){ + /* The parent key is a composite key that includes the IPK column */ + iParent = regData; + } + sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); + } + sqlite3VdbeGoto(v, iOk); + } + + sqlite3VdbeAddOp4(v, OP_Affinity, regTemp, nCol, 0, + sqlite3IndexAffinityStr(pParse->db,pIdx), nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regTemp, nCol); + VdbeCoverage(v); + sqlite3ReleaseTempRange(pParse, regTemp, nCol); + } + } + + if( !pFKey->isDeferred && !(pParse->db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel + && !pParse->isMultiWrite + ){ + /* Special case: If this is an INSERT statement that will insert exactly + ** one row into the table, raise a constraint immediately instead of + ** incrementing a counter. This is necessary as the VM code is being + ** generated for will not open a statement transaction. */ + assert( nIncr==1 ); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, + OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + }else{ + if( nIncr>0 && pFKey->isDeferred==0 ){ + sqlite3MayAbort(pParse); + } + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + } + + sqlite3VdbeResolveLabel(v, iOk); + sqlite3VdbeAddOp1(v, OP_Close, iCur); +} + + +/* +** Return an Expr object that refers to a memory register corresponding +** to column iCol of table pTab. +** +** regBase is the first of an array of register that contains the data +** for pTab. regBase itself holds the rowid. regBase+1 holds the first +** column. regBase+2 holds the second column, and so forth. +*/ +static Expr *exprTableRegister( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* The table whose content is at r[regBase]... */ + int regBase, /* Contents of table pTab */ + i16 iCol /* Which column of pTab is desired */ +){ + Expr *pExpr; + Column *pCol; + const char *zColl; + sqlite3 *db = pParse->db; + + pExpr = sqlite3Expr(db, TK_REGISTER, 0); + if( pExpr ){ + if( iCol>=0 && iCol!=pTab->iPKey ){ + pCol = &pTab->aCol[iCol]; + pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1; + pExpr->affExpr = pCol->affinity; + zColl = sqlite3ColumnColl(pCol); + if( zColl==0 ) zColl = db->pDfltColl->zName; + pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); + }else{ + pExpr->iTable = regBase; + pExpr->affExpr = SQLITE_AFF_INTEGER; + } + } + return pExpr; +} + +/* +** Return an Expr object that refers to column iCol of table pTab which +** has cursor iCur. +*/ +static Expr *exprTableColumn( + sqlite3 *db, /* The database connection */ + Table *pTab, /* The table whose column is desired */ + int iCursor, /* The open cursor on the table */ + i16 iCol /* The column that is wanted */ +){ + Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0); + if( pExpr ){ + assert( ExprUseYTab(pExpr) ); + pExpr->y.pTab = pTab; + pExpr->iTable = iCursor; + pExpr->iColumn = iCol; + } + return pExpr; +} + +/* +** This function is called to generate code executed when a row is deleted +** from the parent table of foreign key constraint pFKey and, if pFKey is +** deferred, when a row is inserted into the same table. When generating +** code for an SQL UPDATE operation, this function may be called twice - +** once to "delete" the old row and once to "insert" the new row. +** +** Parameter nIncr is passed -1 when inserting a row (as this may decrease +** the number of FK violations in the db) or +1 when deleting one (as this +** may increase the number of FK constraint problems). +** +** The code generated by this function scans through the rows in the child +** table that correspond to the parent table row being deleted or inserted. +** For each child row found, one of the following actions is taken: +** +** Operation | FK type | Action taken +** -------------------------------------------------------------------------- +** DELETE immediate Increment the "immediate constraint counter". +** +** INSERT immediate Decrement the "immediate constraint counter". +** +** DELETE deferred Increment the "deferred constraint counter". +** +** INSERT deferred Decrement the "deferred constraint counter". +** +** These operations are identified in the comment at the top of this file +** (fkey.c) as "I.2" and "D.2". +*/ +static void fkScanChildren( + Parse *pParse, /* Parse context */ + SrcList *pSrc, /* The child table to be scanned */ + Table *pTab, /* The parent table */ + Index *pIdx, /* Index on parent covering the foreign key */ + FKey *pFKey, /* The foreign key linking pSrc to pTab */ + int *aiCol, /* Map from pIdx cols to child table cols */ + int regData, /* Parent row data starts here */ + int nIncr /* Amount to increment deferred counter by */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + int i; /* Iterator variable */ + Expr *pWhere = 0; /* WHERE clause to scan with */ + NameContext sNameContext; /* Context used to resolve WHERE clause */ + WhereInfo *pWInfo; /* Context used by sqlite3WhereXXX() */ + int iFkIfZero = 0; /* Address of OP_FkIfZero */ + Vdbe *v = sqlite3GetVdbe(pParse); + + assert( pIdx==0 || pIdx->pTable==pTab ); + assert( pIdx==0 || pIdx->nKeyCol==pFKey->nCol ); + assert( pIdx!=0 || pFKey->nCol==1 ); + assert( pIdx!=0 || HasRowid(pTab) ); + + if( nIncr<0 ){ + iFkIfZero = sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, 0); + VdbeCoverage(v); + } + + /* Create an Expr object representing an SQL expression like: + ** + ** = AND = ... + ** + ** The collation sequence used for the comparison should be that of + ** the parent key columns. The affinity of the parent key column should + ** be applied to each child key value before the comparison takes place. + */ + for(i=0; inCol; i++){ + Expr *pLeft; /* Value from parent table row */ + Expr *pRight; /* Column ref to child table */ + Expr *pEq; /* Expression (pLeft = pRight) */ + i16 iCol; /* Index of column in child table */ + const char *zCol; /* Name of column in child table */ + + iCol = pIdx ? pIdx->aiColumn[i] : -1; + pLeft = exprTableRegister(pParse, pTab, regData, iCol); + iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; + assert( iCol>=0 ); + zCol = pFKey->pFrom->aCol[iCol].zCnName; + pRight = sqlite3Expr(db, TK_ID, zCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); + pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); + } + + /* If the child table is the same as the parent table, then add terms + ** to the WHERE clause that prevent this entry from being scanned. + ** The added WHERE clause terms are like this: + ** + ** $current_rowid!=rowid + ** NOT( $current_a==a AND $current_b==b AND ... ) + ** + ** The first form is used for rowid tables. The second form is used + ** for WITHOUT ROWID tables. In the second form, the *parent* key is + ** (a,b,...). Either the parent or primary key could be used to + ** uniquely identify the current row, but the parent key is more convenient + ** as the required values have already been loaded into registers + ** by the caller. + */ + if( pTab==pFKey->pFrom && nIncr>0 ){ + Expr *pNe; /* Expression (pLeft != pRight) */ + Expr *pLeft; /* Value from parent table row */ + Expr *pRight; /* Column ref to child table */ + if( HasRowid(pTab) ){ + pLeft = exprTableRegister(pParse, pTab, regData, -1); + pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, -1); + pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); + }else{ + Expr *pEq, *pAll = 0; + assert( pIdx!=0 ); + for(i=0; inKeyCol; i++){ + i16 iCol = pIdx->aiColumn[i]; + assert( iCol>=0 ); + pLeft = exprTableRegister(pParse, pTab, regData, iCol); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zCnName); + pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); + pAll = sqlite3ExprAnd(pParse, pAll, pEq); + } + pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); + } + pWhere = sqlite3ExprAnd(pParse, pWhere, pNe); + } + + /* Resolve the references in the WHERE clause. */ + memset(&sNameContext, 0, sizeof(NameContext)); + sNameContext.pSrcList = pSrc; + sNameContext.pParse = pParse; + sqlite3ResolveExprNames(&sNameContext, pWhere); + + /* Create VDBE to loop through the entries in pSrc that match the WHERE + ** clause. For each row found, increment either the deferred or immediate + ** foreign key constraint counter. */ + if( pParse->nErr==0 ){ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0, 0); + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + if( pWInfo ){ + sqlite3WhereEnd(pWInfo); + } + } + + /* Clean up the WHERE clause constructed above. */ + sqlite3ExprDelete(db, pWhere); + if( iFkIfZero ){ + sqlite3VdbeJumpHereOrPopInst(v, iFkIfZero); + } +} + +/* +** This function returns a linked list of FKey objects (connected by +** FKey.pNextTo) holding all children of table pTab. For example, +** given the following schema: +** +** CREATE TABLE t1(a PRIMARY KEY); +** CREATE TABLE t2(b REFERENCES t1(a); +** +** Calling this function with table "t1" as an argument returns a pointer +** to the FKey structure representing the foreign key constraint on table +** "t2". Calling this function with "t2" as the argument would return a +** NULL pointer (as there are no FK constraints for which t2 is the parent +** table). +*/ +SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){ + return (FKey *)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName); +} + +/* +** The second argument is a Trigger structure allocated by the +** fkActionTrigger() routine. This function deletes the Trigger structure +** and all of its sub-components. +** +** The Trigger structure or any of its sub-components may be allocated from +** the lookaside buffer belonging to database handle dbMem. +*/ +static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){ + if( p ){ + TriggerStep *pStep = p->step_list; + sqlite3ExprDelete(dbMem, pStep->pWhere); + sqlite3ExprListDelete(dbMem, pStep->pExprList); + sqlite3SelectDelete(dbMem, pStep->pSelect); + sqlite3ExprDelete(dbMem, p->pWhen); + sqlite3DbFree(dbMem, p); + } +} + +/* +** Clear the apTrigger[] cache of CASCADE triggers for all foreign keys +** in a particular database. This needs to happen when the schema +** changes. +*/ +SQLITE_PRIVATE void sqlite3FkClearTriggerCache(sqlite3 *db, int iDb){ + HashElem *k; + Hash *pHash = &db->aDb[iDb].pSchema->tblHash; + for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k)){ + Table *pTab = sqliteHashData(k); + FKey *pFKey; + if( !IsOrdinaryTable(pTab) ) continue; + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ + fkTriggerDelete(db, pFKey->apTrigger[0]); pFKey->apTrigger[0] = 0; + fkTriggerDelete(db, pFKey->apTrigger[1]); pFKey->apTrigger[1] = 0; + } + } +} + +/* +** This function is called to generate code that runs when table pTab is +** being dropped from the database. The SrcList passed as the second argument +** to this function contains a single entry guaranteed to resolve to +** table pTab. +** +** Normally, no code is required. However, if either +** +** (a) The table is the parent table of a FK constraint, or +** (b) The table is the child table of a deferred FK constraint and it is +** determined at runtime that there are outstanding deferred FK +** constraint violations in the database, +** +** then the equivalent of "DELETE FROM " is executed before dropping +** the table from the database. Triggers are disabled while running this +** DELETE, but foreign key actions are not. +*/ +SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ + sqlite3 *db = pParse->db; + if( (db->flags&SQLITE_ForeignKeys) && IsOrdinaryTable(pTab) ){ + int iSkip = 0; + Vdbe *v = sqlite3GetVdbe(pParse); + + assert( v ); /* VDBE has already been allocated */ + assert( IsOrdinaryTable(pTab) ); + if( sqlite3FkReferences(pTab)==0 ){ + /* Search for a deferred foreign key constraint for which this table + ** is the child table. If one cannot be found, return without + ** generating any VDBE code. If one can be found, then jump over + ** the entire DELETE if there are no outstanding deferred constraints + ** when this statement is run. */ + FKey *p; + for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ + if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; + } + if( !p ) return; + iSkip = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); + } + + pParse->disableTriggers = 1; + sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0, 0, 0); + pParse->disableTriggers = 0; + + /* If the DELETE has generated immediate foreign key constraint + ** violations, halt the VDBE and return an error at this point, before + ** any modifications to the schema are made. This is because statement + ** transactions are not able to rollback schema changes. + ** + ** If the SQLITE_DeferFKs flag is set, then this is not required, as + ** the statement transaction will not be rolled back even if FK + ** constraints are violated. + */ + if( (db->flags & SQLITE_DeferFKs)==0 ){ + sqlite3VdbeVerifyAbortable(v, OE_Abort); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, + OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + } + + if( iSkip ){ + sqlite3VdbeResolveLabel(v, iSkip); + } + } +} + + +/* +** The second argument points to an FKey object representing a foreign key +** for which pTab is the child table. An UPDATE statement against pTab +** is currently being processed. For each column of the table that is +** actually updated, the corresponding element in the aChange[] array +** is zero or greater (if a column is unmodified the corresponding element +** is set to -1). If the rowid column is modified by the UPDATE statement +** the bChngRowid argument is non-zero. +** +** This function returns true if any of the columns that are part of the +** child key for FK constraint *p are modified. +*/ +static int fkChildIsModified( + Table *pTab, /* Table being updated */ + FKey *p, /* Foreign key for which pTab is the child */ + int *aChange, /* Array indicating modified columns */ + int bChngRowid /* True if rowid is modified by this update */ +){ + int i; + for(i=0; inCol; i++){ + int iChildKey = p->aCol[i].iFrom; + if( aChange[iChildKey]>=0 ) return 1; + if( iChildKey==pTab->iPKey && bChngRowid ) return 1; + } + return 0; +} + +/* +** The second argument points to an FKey object representing a foreign key +** for which pTab is the parent table. An UPDATE statement against pTab +** is currently being processed. For each column of the table that is +** actually updated, the corresponding element in the aChange[] array +** is zero or greater (if a column is unmodified the corresponding element +** is set to -1). If the rowid column is modified by the UPDATE statement +** the bChngRowid argument is non-zero. +** +** This function returns true if any of the columns that are part of the +** parent key for FK constraint *p are modified. +*/ +static int fkParentIsModified( + Table *pTab, + FKey *p, + int *aChange, + int bChngRowid +){ + int i; + for(i=0; inCol; i++){ + char *zKey = p->aCol[i].zCol; + int iKey; + for(iKey=0; iKeynCol; iKey++){ + if( aChange[iKey]>=0 || (iKey==pTab->iPKey && bChngRowid) ){ + Column *pCol = &pTab->aCol[iKey]; + if( zKey ){ + if( 0==sqlite3StrICmp(pCol->zCnName, zKey) ) return 1; + }else if( pCol->colFlags & COLFLAG_PRIMKEY ){ + return 1; + } + } + } + } + return 0; +} + +/* +** Return true if the parser passed as the first argument is being +** used to code a trigger that is really a "SET NULL" action belonging +** to trigger pFKey. +*/ +static int isSetNullAction(Parse *pParse, FKey *pFKey){ + Parse *pTop = sqlite3ParseToplevel(pParse); + if( pTop->pTriggerPrg ){ + Trigger *p = pTop->pTriggerPrg->pTrigger; + if( (p==pFKey->apTrigger[0] && pFKey->aAction[0]==OE_SetNull) + || (p==pFKey->apTrigger[1] && pFKey->aAction[1]==OE_SetNull) + ){ + return 1; + } + } + return 0; +} + +/* +** This function is called when inserting, deleting or updating a row of +** table pTab to generate VDBE code to perform foreign key constraint +** processing for the operation. +** +** For a DELETE operation, parameter regOld is passed the index of the +** first register in an array of (pTab->nCol+1) registers containing the +** rowid of the row being deleted, followed by each of the column values +** of the row being deleted, from left to right. Parameter regNew is passed +** zero in this case. +** +** For an INSERT operation, regOld is passed zero and regNew is passed the +** first register of an array of (pTab->nCol+1) registers containing the new +** row data. +** +** For an UPDATE operation, this function is called twice. Once before +** the original record is deleted from the table using the calling convention +** described for DELETE. Then again after the original record is deleted +** but before the new record is inserted using the INSERT convention. +*/ +SQLITE_PRIVATE void sqlite3FkCheck( + Parse *pParse, /* Parse context */ + Table *pTab, /* Row is being deleted from this table */ + int regOld, /* Previous row data is stored here */ + int regNew, /* New row data is stored here */ + int *aChange, /* Array indicating UPDATEd columns (or 0) */ + int bChngRowid /* True if rowid is UPDATEd */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + FKey *pFKey; /* Used to iterate through FKs */ + int iDb; /* Index of database containing pTab */ + const char *zDb; /* Name of database containing pTab */ + int isIgnoreErrors = pParse->disableTriggers; + + /* Exactly one of regOld and regNew should be non-zero. */ + assert( (regOld==0)!=(regNew==0) ); + + /* If foreign-keys are disabled, this function is a no-op. */ + if( (db->flags&SQLITE_ForeignKeys)==0 ) return; + if( !IsOrdinaryTable(pTab) ) return; + + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + + /* Loop through all the foreign key constraints for which pTab is the + ** child table (the table that the foreign key definition is part of). */ + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ + Table *pTo; /* Parent table of foreign key pFKey */ + Index *pIdx = 0; /* Index on key columns in pTo */ + int *aiFree = 0; + int *aiCol; + int iCol; + int i; + int bIgnore = 0; + + if( aChange + && sqlite3_stricmp(pTab->zName, pFKey->zTo)!=0 + && fkChildIsModified(pTab, pFKey, aChange, bChngRowid)==0 + ){ + continue; + } + + /* Find the parent table of this foreign key. Also find a unique index + ** on the parent key columns in the parent table. If either of these + ** schema items cannot be located, set an error in pParse and return + ** early. */ + if( pParse->disableTriggers ){ + pTo = sqlite3FindTable(db, pFKey->zTo, zDb); + }else{ + pTo = sqlite3LocateTable(pParse, 0, pFKey->zTo, zDb); + } + if( !pTo || sqlite3FkLocateIndex(pParse, pTo, pFKey, &pIdx, &aiFree) ){ + assert( isIgnoreErrors==0 || (regOld!=0 && regNew==0) ); + if( !isIgnoreErrors || db->mallocFailed ) return; + if( pTo==0 ){ + /* If isIgnoreErrors is true, then a table is being dropped. In this + ** case SQLite runs a "DELETE FROM xxx" on the table being dropped + ** before actually dropping it in order to check FK constraints. + ** If the parent table of an FK constraint on the current table is + ** missing, behave as if it is empty. i.e. decrement the relevant + ** FK counter for each row of the current table with non-NULL keys. + */ + Vdbe *v = sqlite3GetVdbe(pParse); + int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; + for(i=0; inCol; i++){ + int iFromCol, iReg; + iFromCol = pFKey->aCol[i].iFrom; + iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iFromCol) + regOld+1; + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); + } + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); + } + continue; + } + assert( pFKey->nCol==1 || (aiFree && pIdx) ); + + if( aiFree ){ + aiCol = aiFree; + }else{ + iCol = pFKey->aCol[0].iFrom; + aiCol = &iCol; + } + for(i=0; inCol; i++){ + if( aiCol[i]==pTab->iPKey ){ + aiCol[i] = -1; + } + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Request permission to read the parent key columns. If the + ** authorization callback returns SQLITE_IGNORE, behave as if any + ** values read from the parent table are NULL. */ + if( db->xAuth ){ + int rcauth; + char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zCnName; + rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb); + bIgnore = (rcauth==SQLITE_IGNORE); + } +#endif + } + + /* Take a shared-cache advisory read-lock on the parent table. Allocate + ** a cursor to use to search the unique index on the parent key columns + ** in the parent table. */ + sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName); + pParse->nTab++; + + if( regOld!=0 ){ + /* A row is being removed from the child table. Search for the parent. + ** If the parent does not exist, removing the child row resolves an + ** outstanding foreign key constraint violation. */ + fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regOld, -1, bIgnore); + } + if( regNew!=0 && !isSetNullAction(pParse, pFKey) ){ + /* A row is being added to the child table. If a parent row cannot + ** be found, adding the child row has violated the FK constraint. + ** + ** If this operation is being performed as part of a trigger program + ** that is actually a "SET NULL" action belonging to this very + ** foreign key, then omit this scan altogether. As all child key + ** values are guaranteed to be NULL, it is not possible for adding + ** this row to cause an FK violation. */ + fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regNew, +1, bIgnore); + } + + sqlite3DbFree(db, aiFree); + } + + /* Loop through all the foreign key constraints that refer to this table. + ** (the "child" constraints) */ + for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){ + Index *pIdx = 0; /* Foreign key index for pFKey */ + SrcList *pSrc; + int *aiCol = 0; + + if( aChange && fkParentIsModified(pTab, pFKey, aChange, bChngRowid)==0 ){ + continue; + } + + if( !pFKey->isDeferred && !(db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel && !pParse->isMultiWrite + ){ + assert( regOld==0 && regNew!=0 ); + /* Inserting a single row into a parent table cannot cause (or fix) + ** an immediate foreign key violation. So do nothing in this case. */ + continue; + } + + if( sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ){ + if( !isIgnoreErrors || db->mallocFailed ) return; + continue; + } + assert( aiCol || pFKey->nCol==1 ); + + /* Create a SrcList structure containing the child table. We need the + ** child table as a SrcList for sqlite3WhereBegin() */ + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc ){ + SrcItem *pItem = pSrc->a; + pItem->pTab = pFKey->pFrom; + pItem->zName = pFKey->pFrom->zName; + pItem->pTab->nTabRef++; + pItem->iCursor = pParse->nTab++; + + if( regNew!=0 ){ + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1); + } + if( regOld!=0 ){ + int eAction = pFKey->aAction[aChange!=0]; + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1); + /* If this is a deferred FK constraint, or a CASCADE or SET NULL + ** action applies, then any foreign key violations caused by + ** removing the parent key will be rectified by the action trigger. + ** So do not set the "may-abort" flag in this case. + ** + ** Note 1: If the FK is declared "ON UPDATE CASCADE", then the + ** may-abort flag will eventually be set on this statement anyway + ** (when this function is called as part of processing the UPDATE + ** within the action trigger). + ** + ** Note 2: At first glance it may seem like SQLite could simply omit + ** all OP_FkCounter related scans when either CASCADE or SET NULL + ** applies. The trouble starts if the CASCADE or SET NULL action + ** trigger causes other triggers or action rules attached to the + ** child table to fire. In these cases the fk constraint counters + ** might be set incorrectly if any OP_FkCounter related scans are + ** omitted. */ + if( !pFKey->isDeferred && eAction!=OE_Cascade && eAction!=OE_SetNull ){ + sqlite3MayAbort(pParse); + } + } + pItem->zName = 0; + sqlite3SrcListDelete(db, pSrc); + } + sqlite3DbFree(db, aiCol); + } +} + +#define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x))) + +/* +** This function is called before generating code to update or delete a +** row contained in table pTab. +*/ +SQLITE_PRIVATE u32 sqlite3FkOldmask( + Parse *pParse, /* Parse context */ + Table *pTab /* Table being modified */ +){ + u32 mask = 0; + if( pParse->db->flags&SQLITE_ForeignKeys && IsOrdinaryTable(pTab) ){ + FKey *p; + int i; + for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ + for(i=0; inCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom); + } + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + Index *pIdx = 0; + sqlite3FkLocateIndex(pParse, pTab, p, &pIdx, 0); + if( pIdx ){ + for(i=0; inKeyCol; i++){ + assert( pIdx->aiColumn[i]>=0 ); + mask |= COLUMN_MASK(pIdx->aiColumn[i]); + } + } + } + } + return mask; +} + + +/* +** This function is called before generating code to update or delete a +** row contained in table pTab. If the operation is a DELETE, then +** parameter aChange is passed a NULL value. For an UPDATE, aChange points +** to an array of size N, where N is the number of columns in table pTab. +** If the i'th column is not modified by the UPDATE, then the corresponding +** entry in the aChange[] array is set to -1. If the column is modified, +** the value is 0 or greater. Parameter chngRowid is set to true if the +** UPDATE statement modifies the rowid fields of the table. +** +** If any foreign key processing will be required, this function returns +** non-zero. If there is no foreign key related processing, this function +** returns zero. +** +** For an UPDATE, this function returns 2 if: +** +** * There are any FKs for which pTab is the child and the parent table +** and any FK processing at all is required (even of a different FK), or +** +** * the UPDATE modifies one or more parent keys for which the action is +** not "NO ACTION" (i.e. is CASCADE, SET DEFAULT or SET NULL). +** +** Or, assuming some other foreign key processing is required, 1. +*/ +SQLITE_PRIVATE int sqlite3FkRequired( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being modified */ + int *aChange, /* Non-NULL for UPDATE operations */ + int chngRowid /* True for UPDATE that affects rowid */ +){ + int eRet = 1; /* Value to return if bHaveFK is true */ + int bHaveFK = 0; /* If FK processing is required */ + if( pParse->db->flags&SQLITE_ForeignKeys && IsOrdinaryTable(pTab) ){ + if( !aChange ){ + /* A DELETE operation. Foreign key processing is required if the + ** table in question is either the child or parent table for any + ** foreign key constraint. */ + bHaveFK = (sqlite3FkReferences(pTab) || pTab->u.tab.pFKey); + }else{ + /* This is an UPDATE. Foreign key processing is only required if the + ** operation modifies one or more child or parent key columns. */ + FKey *p; + + /* Check if any child key columns are being modified. */ + for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ + if( fkChildIsModified(pTab, p, aChange, chngRowid) ){ + if( 0==sqlite3_stricmp(pTab->zName, p->zTo) ) eRet = 2; + bHaveFK = 1; + } + } + + /* Check if any parent key columns are being modified. */ + for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ + if( fkParentIsModified(pTab, p, aChange, chngRowid) ){ + if( p->aAction[1]!=OE_None ) return 2; + bHaveFK = 1; + } + } + } + } + return bHaveFK ? eRet : 0; +} + +/* +** This function is called when an UPDATE or DELETE operation is being +** compiled on table pTab, which is the parent table of foreign-key pFKey. +** If the current operation is an UPDATE, then the pChanges parameter is +** passed a pointer to the list of columns being modified. If it is a +** DELETE, pChanges is passed a NULL pointer. +** +** It returns a pointer to a Trigger structure containing a trigger +** equivalent to the ON UPDATE or ON DELETE action specified by pFKey. +** If the action is "NO ACTION" then a NULL pointer is returned (these actions +** require no special handling by the triggers sub-system, code for them is +** created by fkScanChildren()). +** +** For example, if pFKey is the foreign key and pTab is table "p" in +** the following schema: +** +** CREATE TABLE p(pk PRIMARY KEY); +** CREATE TABLE c(ck REFERENCES p ON DELETE CASCADE); +** +** then the returned trigger structure is equivalent to: +** +** CREATE TRIGGER ... DELETE ON p BEGIN +** DELETE FROM c WHERE ck = old.pk; +** END; +** +** The returned pointer is cached as part of the foreign key object. It +** is eventually freed along with the rest of the foreign key object by +** sqlite3FkDelete(). +*/ +static Trigger *fkActionTrigger( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated or deleted from */ + FKey *pFKey, /* Foreign key to get action for */ + ExprList *pChanges /* Change-list for UPDATE, NULL for DELETE */ +){ + sqlite3 *db = pParse->db; /* Database handle */ + int action; /* One of OE_None, OE_Cascade etc. */ + Trigger *pTrigger; /* Trigger definition to return */ + int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */ + + action = pFKey->aAction[iAction]; + if( action==OE_Restrict && (db->flags & SQLITE_DeferFKs) ){ + return 0; + } + pTrigger = pFKey->apTrigger[iAction]; + + if( action!=OE_None && !pTrigger ){ + char const *zFrom; /* Name of child table */ + int nFrom; /* Length in bytes of zFrom */ + Index *pIdx = 0; /* Parent key index for this FK */ + int *aiCol = 0; /* child table cols -> parent key cols */ + TriggerStep *pStep = 0; /* First (only) step of trigger program */ + Expr *pWhere = 0; /* WHERE clause of trigger step */ + ExprList *pList = 0; /* Changes list if ON UPDATE CASCADE */ + Select *pSelect = 0; /* If RESTRICT, "SELECT RAISE(...)" */ + int i; /* Iterator variable */ + Expr *pWhen = 0; /* WHEN clause for the trigger */ + + if( sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ) return 0; + assert( aiCol || pFKey->nCol==1 ); + + for(i=0; inCol; i++){ + Token tOld = { "old", 3 }; /* Literal "old" token */ + Token tNew = { "new", 3 }; /* Literal "new" token */ + Token tFromCol; /* Name of column in child table */ + Token tToCol; /* Name of column in parent table */ + int iFromCol; /* Idx of column in child table */ + Expr *pEq; /* tFromCol = OLD.tToCol */ + + iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; + assert( iFromCol>=0 ); + assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKeynCol) ); + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); + sqlite3TokenInit(&tToCol, + pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zCnName); + sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zCnName); + + /* Create the expression "OLD.zToCol = zFromCol". It is important + ** that the "OLD.zToCol" term is on the LHS of the = operator, so + ** that the affinity and collation sequence associated with the + ** parent table are used for the comparison. */ + pEq = sqlite3PExpr(pParse, TK_EQ, + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), + sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) + ); + pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); + + /* For ON UPDATE, construct the next term of the WHEN clause. + ** The final WHEN clause will be like this: + ** + ** WHEN NOT(old.col1 IS new.col1 AND ... AND old.colN IS new.colN) + */ + if( pChanges ){ + pEq = sqlite3PExpr(pParse, TK_IS, + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), + sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)) + ); + pWhen = sqlite3ExprAnd(pParse, pWhen, pEq); + } + + if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){ + Expr *pNew; + if( action==OE_Cascade ){ + pNew = sqlite3PExpr(pParse, TK_DOT, + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); + }else if( action==OE_SetDflt ){ + Column *pCol = pFKey->pFrom->aCol + iFromCol; + Expr *pDflt; + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + pDflt = 0; + }else{ + pDflt = sqlite3ColumnExpr(pFKey->pFrom, pCol); + } + if( pDflt ){ + pNew = sqlite3ExprDup(db, pDflt, 0); + }else{ + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + }else{ + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + } + pList = sqlite3ExprListAppend(pParse, pList, pNew); + sqlite3ExprListSetName(pParse, pList, &tFromCol, 0); + } + } + sqlite3DbFree(db, aiCol); + + zFrom = pFKey->pFrom->zName; + nFrom = sqlite3Strlen30(zFrom); + + if( action==OE_Restrict ){ + int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + Token tFrom; + Token tDb; + Expr *pRaise; + + tFrom.z = zFrom; + tFrom.n = nFrom; + tDb.z = db->aDb[iDb].zDbSName; + tDb.n = sqlite3Strlen30(tDb.z); + + pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); + if( pRaise ){ + pRaise->affExpr = OE_Abort; + } + pSelect = sqlite3SelectNew(pParse, + sqlite3ExprListAppend(pParse, 0, pRaise), + sqlite3SrcListAppend(pParse, 0, &tDb, &tFrom), + pWhere, + 0, 0, 0, 0, 0 + ); + pWhere = 0; + } + + /* Disable lookaside memory allocation */ + DisableLookaside; + + pTrigger = (Trigger *)sqlite3DbMallocZero(db, + sizeof(Trigger) + /* struct Trigger */ + sizeof(TriggerStep) + /* Single step in trigger program */ + nFrom + 1 /* Space for pStep->zTarget */ + ); + if( pTrigger ){ + pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1]; + pStep->zTarget = (char *)&pStep[1]; + memcpy((char *)pStep->zTarget, zFrom, nFrom); + + pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE); + pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + if( pWhen ){ + pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0); + pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); + } + } + + /* Re-enable the lookaside buffer, if it was disabled earlier. */ + EnableLookaside; + + sqlite3ExprDelete(db, pWhere); + sqlite3ExprDelete(db, pWhen); + sqlite3ExprListDelete(db, pList); + sqlite3SelectDelete(db, pSelect); + if( db->mallocFailed==1 ){ + fkTriggerDelete(db, pTrigger); + return 0; + } + assert( pStep!=0 ); + assert( pTrigger!=0 ); + + switch( action ){ + case OE_Restrict: + pStep->op = TK_SELECT; + break; + case OE_Cascade: + if( !pChanges ){ + pStep->op = TK_DELETE; + break; + } + /* no break */ deliberate_fall_through + default: + pStep->op = TK_UPDATE; + } + pStep->pTrig = pTrigger; + pTrigger->pSchema = pTab->pSchema; + pTrigger->pTabSchema = pTab->pSchema; + pFKey->apTrigger[iAction] = pTrigger; + pTrigger->op = (pChanges ? TK_UPDATE : TK_DELETE); + } + + return pTrigger; +} + +/* +** This function is called when deleting or updating a row to implement +** any required CASCADE, SET NULL or SET DEFAULT actions. +*/ +SQLITE_PRIVATE void sqlite3FkActions( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated or deleted from */ + ExprList *pChanges, /* Change-list for UPDATE, NULL for DELETE */ + int regOld, /* Address of array containing old row */ + int *aChange, /* Array indicating UPDATEd columns (or 0) */ + int bChngRowid /* True if rowid is UPDATEd */ +){ + /* If foreign-key support is enabled, iterate through all FKs that + ** refer to table pTab. If there is an action associated with the FK + ** for this operation (either update or delete), invoke the associated + ** trigger sub-program. */ + if( pParse->db->flags&SQLITE_ForeignKeys ){ + FKey *pFKey; /* Iterator variable */ + for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){ + if( aChange==0 || fkParentIsModified(pTab, pFKey, aChange, bChngRowid) ){ + Trigger *pAct = fkActionTrigger(pParse, pTab, pFKey, pChanges); + if( pAct ){ + sqlite3CodeRowTriggerDirect(pParse, pAct, pTab, regOld, OE_Abort, 0); + } + } + } + } +} + +#endif /* ifndef SQLITE_OMIT_TRIGGER */ + +/* +** Free all memory associated with foreign key definitions attached to +** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash +** hash table. +*/ +SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ + FKey *pFKey; /* Iterator variable */ + FKey *pNext; /* Copy of pFKey->pNextFrom */ + + assert( IsOrdinaryTable(pTab) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pNext){ + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); + + /* Remove the FK from the fkeyHash hash table. */ + if( !db || db->pnBytesFreed==0 ){ + if( pFKey->pPrevTo ){ + pFKey->pPrevTo->pNextTo = pFKey->pNextTo; + }else{ + void *p = (void *)pFKey->pNextTo; + const char *z = (p ? pFKey->pNextTo->zTo : pFKey->zTo); + sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, p); + } + if( pFKey->pNextTo ){ + pFKey->pNextTo->pPrevTo = pFKey->pPrevTo; + } + } + + /* EV: R-30323-21917 Each foreign key constraint in SQLite is + ** classified as either immediate or deferred. + */ + assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 ); + + /* Delete any triggers created to implement actions for this FK. */ +#ifndef SQLITE_OMIT_TRIGGER + fkTriggerDelete(db, pFKey->apTrigger[0]); + fkTriggerDelete(db, pFKey->apTrigger[1]); +#endif + + pNext = pFKey->pNextFrom; + sqlite3DbFree(db, pFKey); + } +} +#endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */ + +/************** End of fkey.c ************************************************/ +/************** Begin file insert.c ******************************************/ +/* +** 2001 September 15 +** +** 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 contains C code routines that are called by the parser +** to handle INSERT statements in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** Generate code that will +** +** (1) acquire a lock for table pTab then +** (2) open pTab as cursor iCur. +** +** If pTab is a WITHOUT ROWID table, then it is the PRIMARY KEY index +** for that table that is actually opened. +*/ +SQLITE_PRIVATE void sqlite3OpenTable( + Parse *pParse, /* Generate code into this VDBE */ + int iCur, /* The cursor number of the table */ + int iDb, /* The database index in sqlite3.aDb[] */ + Table *pTab, /* The table to be opened */ + int opcode /* OP_OpenRead or OP_OpenWrite */ +){ + Vdbe *v; + assert( !IsVirtual(pTab) ); + assert( pParse->pVdbe!=0 ); + v = pParse->pVdbe; + assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); + sqlite3TableLock(pParse, iDb, pTab->tnum, + (opcode==OP_OpenWrite)?1:0, pTab->zName); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nNVCol); + VdbeComment((v, "%s", pTab->zName)); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->tnum==pTab->tnum || CORRUPT_DB ); + sqlite3VdbeAddOp3(v, opcode, iCur, pPk->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + VdbeComment((v, "%s", pTab->zName)); + } +} + +/* +** Return a pointer to the column affinity string associated with index +** pIdx. A column affinity string has one character for each column in +** the table, according to the affinity of the column: +** +** Character Column affinity +** ------------------------------ +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'F' REAL +** +** An extra 'D' is appended to the end of the string to cover the +** rowid that appears as the last column in every index. +** +** Memory for the buffer containing the column index affinity string +** is managed along with the rest of the Index structure. It will be +** released when sqlite3DeleteIndex() is called. +*/ +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ + if( !pIdx->zColAff ){ + /* The first time a column affinity string for a particular index is + ** required, it is allocated and populated here. It is then stored as + ** a member of the Index structure for subsequent use. + ** + ** The column affinity string will eventually be deleted by + ** sqliteDeleteIndex() when the Index structure itself is cleaned + ** up. + */ + int n; + Table *pTab = pIdx->pTable; + pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); + if( !pIdx->zColAff ){ + sqlite3OomFault(db); + return 0; + } + for(n=0; nnColumn; n++){ + i16 x = pIdx->aiColumn[n]; + char aff; + if( x>=0 ){ + aff = pTab->aCol[x].affinity; + }else if( x==XN_ROWID ){ + aff = SQLITE_AFF_INTEGER; + }else{ + assert( x==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); + } + if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; + pIdx->zColAff[n] = aff; + } + pIdx->zColAff[n] = 0; + } + + return pIdx->zColAff; +} + +/* +** Make changes to the evolving bytecode to do affinity transformations +** of values that are about to be gathered into a row for table pTab. +** +** For ordinary (legacy, non-strict) tables: +** ----------------------------------------- +** +** Compute the affinity string for table pTab, if it has not already been +** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. +** +** If the affinity string is empty (because it was all SQLITE_AFF_BLOB entries +** which were then optimized out) then this routine becomes a no-op. +** +** Otherwise if iReg>0 then code an OP_Affinity opcode that will set the +** affinities for register iReg and following. Or if iReg==0, +** then just set the P4 operand of the previous opcode (which should be +** an OP_MakeRecord) to the affinity string. +** +** A column affinity string has one character per column: +** +** Character Column affinity +** --------- --------------- +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'E' REAL +** +** For STRICT tables: +** ------------------ +** +** Generate an appropropriate OP_TypeCheck opcode that will verify the +** datatypes against the column definitions in pTab. If iReg==0, that +** means an OP_MakeRecord opcode has already been generated and should be +** the last opcode generated. The new OP_TypeCheck needs to be inserted +** before the OP_MakeRecord. The new OP_TypeCheck should use the same +** register set as the OP_MakeRecord. If iReg>0 then register iReg is +** the first of a series of registers that will form the new record. +** Apply the type checking to that array of registers. +*/ +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ + int i, j; + char *zColAff; + if( pTab->tabFlags & TF_Strict ){ + if( iReg==0 ){ + /* Move the previous opcode (which should be OP_MakeRecord) forward + ** by one slot and insert a new OP_TypeCheck where the current + ** OP_MakeRecord is found */ + VdbeOp *pPrev; + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + pPrev = sqlite3VdbeGetOp(v, -1); + assert( pPrev!=0 ); + assert( pPrev->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed ); + pPrev->opcode = OP_TypeCheck; + sqlite3VdbeAddOp3(v, OP_MakeRecord, pPrev->p1, pPrev->p2, pPrev->p3); + }else{ + /* Insert an isolated OP_Typecheck */ + sqlite3VdbeAddOp2(v, OP_TypeCheck, iReg, pTab->nNVCol); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } + return; + } + zColAff = pTab->zColAff; + if( zColAff==0 ){ + sqlite3 *db = sqlite3VdbeDb(v); + zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); + if( !zColAff ){ + sqlite3OomFault(db); + return; + } + + for(i=j=0; inCol; i++){ + assert( pTab->aCol[i].affinity!=0 || sqlite3VdbeParser(v)->nErr>0 ); + if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ + zColAff[j++] = pTab->aCol[i].affinity; + } + } + do{ + zColAff[j--] = 0; + }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB ); + pTab->zColAff = zColAff; + } + assert( zColAff!=0 ); + i = sqlite3Strlen30NN(zColAff); + if( i ){ + if( iReg ){ + sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); + }else{ + assert( sqlite3VdbeGetOp(v, -1)->opcode==OP_MakeRecord + || sqlite3VdbeDb(v)->mallocFailed ); + sqlite3VdbeChangeP4(v, -1, zColAff, i); + } + } +} + +/* +** Return non-zero if the table pTab in database iDb or any of its indices +** have been opened at any point in the VDBE program. This is used to see if +** a statement of the form "INSERT INTO SELECT ..." can +** run without using a temporary table for the results of the SELECT. +*/ +static int readsTable(Parse *p, int iDb, Table *pTab){ + Vdbe *v = sqlite3GetVdbe(p); + int i; + int iEnd = sqlite3VdbeCurrentAddr(v); +#ifndef SQLITE_OMIT_VIRTUALTABLE + VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0; +#endif + + for(i=1; iopcode==OP_OpenRead && pOp->p3==iDb ){ + Index *pIndex; + Pgno tnum = pOp->p2; + if( tnum==pTab->tnum ){ + return 1; + } + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( tnum==pIndex->tnum ){ + return 1; + } + } + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){ + assert( pOp->p4.pVtab!=0 ); + assert( pOp->p4type==P4_VTAB ); + return 1; + } +#endif + } + return 0; +} + +/* This walker callback will compute the union of colFlags flags for all +** referenced columns in a CHECK constraint or generated column expression. +*/ +static int exprColumnFlagUnion(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 ){ + assert( pExpr->iColumn < pWalker->u.pTab->nCol ); + pWalker->eCode |= pWalker->u.pTab->aCol[pExpr->iColumn].colFlags; + } + return WRC_Continue; +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** All regular columns for table pTab have been puts into registers +** starting with iRegStore. The registers that correspond to STORED +** or VIRTUAL columns have not yet been initialized. This routine goes +** back and computes the values for those columns based on the previously +** computed normal columns. +*/ +SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns( + Parse *pParse, /* Parsing context */ + int iRegStore, /* Register holding the first column */ + Table *pTab /* The table */ +){ + int i; + Walker w; + Column *pRedo; + int eProgress; + VdbeOp *pOp; + + assert( pTab->tabFlags & TF_HasGenerated ); + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + + /* Before computing generated columns, first go through and make sure + ** that appropriate affinity has been applied to the regular columns + */ + sqlite3TableAffinity(pParse->pVdbe, pTab, iRegStore); + if( (pTab->tabFlags & TF_HasStored)!=0 ){ + pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + if( pOp->opcode==OP_Affinity ){ + /* Change the OP_Affinity argument to '@' (NONE) for all stored + ** columns. '@' is the no-op affinity and those columns have not + ** yet been computed. */ + int ii, jj; + char *zP4 = pOp->p4.z; + assert( zP4!=0 ); + assert( pOp->p4type==P4_DYNAMIC ); + for(ii=jj=0; zP4[jj]; ii++){ + if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){ + continue; + } + if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){ + zP4[jj] = SQLITE_AFF_NONE; + } + jj++; + } + }else if( pOp->opcode==OP_TypeCheck ){ + /* If an OP_TypeCheck was generated because the table is STRICT, + ** then set the P3 operand to indicate that generated columns should + ** not be checked */ + pOp->p3 = 1; + } + } + + /* Because there can be multiple generated columns that refer to one another, + ** this is a two-pass algorithm. On the first pass, mark all generated + ** columns as "not available". + */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; + } + } + + w.u.pTab = pTab; + w.xExprCallback = exprColumnFlagUnion; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + + /* On the second pass, compute the value of each NOT-AVAILABLE column. + ** Companion code in the TK_COLUMN case of sqlite3ExprCodeTarget() will + ** compute dependencies and mark remove the COLSPAN_NOTAVAIL mark, as + ** they are needed. + */ + pParse->iSelfTab = -iRegStore; + do{ + eProgress = 0; + pRedo = 0; + for(i=0; inCol; i++){ + Column *pCol = pTab->aCol + i; + if( (pCol->colFlags & COLFLAG_NOTAVAIL)!=0 ){ + int x; + pCol->colFlags |= COLFLAG_BUSY; + w.eCode = 0; + sqlite3WalkExpr(&w, sqlite3ColumnExpr(pTab, pCol)); + pCol->colFlags &= ~COLFLAG_BUSY; + if( w.eCode & COLFLAG_NOTAVAIL ){ + pRedo = pCol; + continue; + } + eProgress = 1; + assert( pCol->colFlags & COLFLAG_GENERATED ); + x = sqlite3TableColumnToStorage(pTab, i) + iRegStore; + sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, x); + pCol->colFlags &= ~COLFLAG_NOTAVAIL; + } + } + }while( pRedo && eProgress ); + if( pRedo ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zCnName); + } + pParse->iSelfTab = 0; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + + +#ifndef SQLITE_OMIT_AUTOINCREMENT +/* +** Locate or create an AutoincInfo structure associated with table pTab +** which is in database iDb. Return the register number for the register +** that holds the maximum rowid. Return zero if pTab is not an AUTOINCREMENT +** table. (Also return zero when doing a VACUUM since we do not want to +** update the AUTOINCREMENT counters during a VACUUM.) +** +** There is at most one AutoincInfo structure per table even if the +** same table is autoincremented multiple times due to inserts within +** triggers. A new AutoincInfo structure is created if this is the +** first use of table pTab. On 2nd and subsequent uses, the original +** AutoincInfo structure is used. +** +** Four consecutive registers are allocated: +** +** (1) The name of the pTab table. +** (2) The maximum ROWID of pTab. +** (3) The rowid in sqlite_sequence of pTab +** (4) The original value of the max ROWID in pTab, or NULL if none +** +** The 2nd register is the one that is returned. That is all the +** insert routine needs to know about. +*/ +static int autoIncBegin( + Parse *pParse, /* Parsing context */ + int iDb, /* Index of the database holding pTab */ + Table *pTab /* The table we are writing to */ +){ + int memId = 0; /* Register holding maximum rowid */ + assert( pParse->db->aDb[iDb].pSchema!=0 ); + if( (pTab->tabFlags & TF_Autoincrement)!=0 + && (pParse->db->mDbFlags & DBFLAG_Vacuum)==0 + ){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + AutoincInfo *pInfo; + Table *pSeqTab = pParse->db->aDb[iDb].pSchema->pSeqTab; + + /* Verify that the sqlite_sequence table exists and is an ordinary + ** rowid table with exactly two columns. + ** Ticket d8dc2b3a58cd5dc2918a1d4acb 2018-05-23 */ + if( pSeqTab==0 + || !HasRowid(pSeqTab) + || NEVER(IsVirtual(pSeqTab)) + || pSeqTab->nCol!=2 + ){ + pParse->nErr++; + pParse->rc = SQLITE_CORRUPT_SEQUENCE; + return 0; + } + + pInfo = pToplevel->pAinc; + while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } + if( pInfo==0 ){ + pInfo = sqlite3DbMallocRawNN(pParse->db, sizeof(*pInfo)); + sqlite3ParserAddCleanup(pToplevel, sqlite3DbFree, pInfo); + testcase( pParse->earlyCleanup ); + if( pParse->db->mallocFailed ) return 0; + pInfo->pNext = pToplevel->pAinc; + pToplevel->pAinc = pInfo; + pInfo->pTab = pTab; + pInfo->iDb = iDb; + pToplevel->nMem++; /* Register to hold name of table */ + pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */ + pToplevel->nMem +=2; /* Rowid in sqlite_sequence + orig max val */ + } + memId = pInfo->regCtr; + } + return memId; +} + +/* +** This routine generates code that will initialize all of the +** register used by the autoincrement tracker. +*/ +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ + AutoincInfo *p; /* Information about an AUTOINCREMENT */ + sqlite3 *db = pParse->db; /* The database connection */ + Db *pDb; /* Database only autoinc table */ + int memId; /* Register holding max rowid */ + Vdbe *v = pParse->pVdbe; /* VDBE under construction */ + + /* This routine is never called during trigger-generation. It is + ** only called from the top-level */ + assert( pParse->pTriggerTab==0 ); + assert( sqlite3IsToplevel(pParse) ); + + assert( v ); /* We failed long ago if this is not so */ + for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoInc[] = { + /* 0 */ {OP_Null, 0, 0, 0}, + /* 1 */ {OP_Rewind, 0, 10, 0}, + /* 2 */ {OP_Column, 0, 0, 0}, + /* 3 */ {OP_Ne, 0, 9, 0}, + /* 4 */ {OP_Rowid, 0, 0, 0}, + /* 5 */ {OP_Column, 0, 1, 0}, + /* 6 */ {OP_AddImm, 0, 0, 0}, + /* 7 */ {OP_Copy, 0, 0, 0}, + /* 8 */ {OP_Goto, 0, 11, 0}, + /* 9 */ {OP_Next, 0, 2, 0}, + /* 10 */ {OP_Integer, 0, 0, 0}, + /* 11 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; + pDb = &db->aDb[p->iDb]; + memId = p->regCtr; + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); + sqlite3VdbeLoadString(v, memId-1, p->pTab->zName); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn); + if( aOp==0 ) break; + aOp[0].p2 = memId; + aOp[0].p3 = memId+2; + aOp[2].p3 = memId; + aOp[3].p1 = memId-1; + aOp[3].p3 = memId; + aOp[3].p5 = SQLITE_JUMPIFNULL; + aOp[4].p2 = memId+1; + aOp[5].p3 = memId; + aOp[6].p1 = memId; + aOp[7].p2 = memId+2; + aOp[7].p1 = memId; + aOp[10].p2 = memId; + if( pParse->nTab==0 ) pParse->nTab = 1; + } +} + +/* +** Update the maximum rowid for an autoincrement calculation. +** +** This routine should be called when the regRowid register holds a +** new rowid that is about to be inserted. If that new rowid is +** larger than the maximum rowid in the memId memory cell, then the +** memory cell is updated. +*/ +static void autoIncStep(Parse *pParse, int memId, int regRowid){ + if( memId>0 ){ + sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid); + } +} + +/* +** This routine generates the code needed to write autoincrement +** maximum rowid values back into the sqlite_sequence register. +** Every statement that might do an INSERT into an autoincrement +** table (either directly or through triggers) needs to call this +** routine just before the "exit" code. +*/ +static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ + AutoincInfo *p; + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + + assert( v ); + for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoIncEnd[] = { + /* 0 */ {OP_NotNull, 0, 2, 0}, + /* 1 */ {OP_NewRowid, 0, 0, 0}, + /* 2 */ {OP_MakeRecord, 0, 2, 0}, + /* 3 */ {OP_Insert, 0, 0, 0}, + /* 4 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; + Db *pDb = &db->aDb[p->iDb]; + int iRec; + int memId = p->regCtr; + + iRec = sqlite3GetTempReg(pParse); + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3VdbeAddOp3(v, OP_Le, memId+2, sqlite3VdbeCurrentAddr(v)+7, memId); + VdbeCoverage(v); + sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn); + if( aOp==0 ) break; + aOp[0].p1 = memId+1; + aOp[1].p2 = memId+1; + aOp[2].p1 = memId-1; + aOp[2].p3 = iRec; + aOp[3].p2 = iRec; + aOp[3].p3 = memId+1; + aOp[3].p5 = OPFLAG_APPEND; + sqlite3ReleaseTempReg(pParse, iRec); + } +} +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ + if( pParse->pAinc ) autoIncrementEnd(pParse); +} +#else +/* +** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines +** above are all no-ops +*/ +# define autoIncBegin(A,B,C) (0) +# define autoIncStep(A,B,C) +#endif /* SQLITE_OMIT_AUTOINCREMENT */ + + +/* Forward declaration */ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +); + +/* +** This routine is called to handle SQL of the following forms: +** +** insert into TABLE (IDLIST) values(EXPRLIST),(EXPRLIST),... +** insert into TABLE (IDLIST) select +** insert into TABLE (IDLIST) default values +** +** The IDLIST following the table name is always optional. If omitted, +** then a list of all (non-hidden) columns for the table is substituted. +** The IDLIST appears in the pColumn parameter. pColumn is NULL if IDLIST +** is omitted. +** +** For the pSelect parameter holds the values to be inserted for the +** first two forms shown above. A VALUES clause is really just short-hand +** for a SELECT statement that omits the FROM clause and everything else +** that follows. If the pSelect parameter is NULL, that means that the +** DEFAULT VALUES form of the INSERT statement is intended. +** +** The code generated follows one of four templates. For a simple +** insert with data coming from a single-row VALUES clause, the code executes +** once straight down through. Pseudo-code follows (we call this +** the "1st template"): +** +** open write cursor to
        and its indices +** put VALUES clause expressions into registers +** write the resulting record into
        +** cleanup +** +** The three remaining templates assume the statement is of the form +** +** INSERT INTO
        SELECT ... +** +** If the SELECT clause is of the restricted form "SELECT * FROM " - +** in other words if the SELECT pulls all columns from a single table +** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and +** if and are distinct tables but have identical +** schemas, including all the same indices, then a special optimization +** is invoked that copies raw records from over to . +** See the xferOptimization() function for the implementation of this +** template. This is the 2nd template. +** +** open a write cursor to
        +** open read cursor on +** transfer all records in over to
        +** close cursors +** foreach index on
        +** open a write cursor on the
        index +** open a read cursor on the corresponding index +** transfer all records from the read to the write cursors +** close cursors +** end foreach +** +** The 3rd template is for when the second template does not apply +** and the SELECT clause does not read from
        at any time. +** The generated code follows this template: +** +** X <- A +** goto B +** A: setup for the SELECT +** loop over the rows in the SELECT +** load values into registers R..R+n +** yield X +** end loop +** cleanup after the SELECT +** end-coroutine X +** B: open write cursor to
        and its indices +** C: yield X, at EOF goto D +** insert the select result into
        from R..R+n +** goto C +** D: cleanup +** +** The 4th template is used if the insert statement takes its +** values from a SELECT but the data is being inserted into a table +** that is also read as part of the SELECT. In the third form, +** we have to use an intermediate table to store the results of +** the select. The template is like this: +** +** X <- A +** goto B +** A: setup for the SELECT +** loop over the tables in the SELECT +** load value into register R..R+n +** yield X +** end loop +** cleanup after the SELECT +** end co-routine R +** B: open temp table +** L: yield X, at EOF goto M +** insert row from R..R+n into temp table +** goto L +** M: open write cursor to
        and its indices +** rewind temp table +** C: loop over rows of intermediate table +** transfer values form intermediate table into
        +** end loop +** D: cleanup +*/ +SQLITE_PRIVATE void sqlite3Insert( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* Name of table into which we are inserting */ + Select *pSelect, /* A SELECT statement to use as the data source */ + IdList *pColumn, /* Column names corresponding to IDLIST, or NULL. */ + int onError, /* How to handle constraint errors */ + Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */ +){ + sqlite3 *db; /* The main database structure */ + Table *pTab; /* The table to insert into. aka TABLE */ + int i, j; /* Loop counters */ + Vdbe *v; /* Generate code into this virtual machine */ + Index *pIdx; /* For looping over indices of the table */ + int nColumn; /* Number of columns in the data */ + int nHidden = 0; /* Number of hidden columns if TABLE is virtual */ + int iDataCur = 0; /* VDBE cursor that is the main data repository */ + int iIdxCur = 0; /* First index cursor */ + int ipkColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ + int endOfLoop; /* Label for the end of the insertion loop */ + int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ + int addrInsTop = 0; /* Jump to label "D" */ + int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ + SelectDest dest; /* Destination for SELECT on rhs of INSERT */ + int iDb; /* Index of database holding TABLE */ + u8 useTempTable = 0; /* Store SELECT results in intermediate table */ + u8 appendFlag = 0; /* True if the insert is likely to be an append */ + u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ + u8 bIdListInOrder; /* True if IDLIST is in table order */ + ExprList *pList = 0; /* List of VALUES() to be inserted */ + int iRegStore; /* Register in which to store next column */ + + /* Register allocations */ + int regFromSelect = 0;/* Base register for data coming from SELECT */ + int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */ + int regRowCount = 0; /* Memory cell used for the row counter */ + int regIns; /* Block of regs holding rowid+data being inserted */ + int regRowid; /* registers holding insert rowid */ + int regData; /* register holding first column to insert */ + int *aRegIdx = 0; /* One register allocated to each index */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True if attempting to insert into a view */ + Trigger *pTrigger; /* List of triggers on pTab, if required */ + int tmask; /* Mask of trigger times */ +#endif + + db = pParse->db; + assert( db->pParse==pParse ); + if( pParse->nErr ){ + goto insert_cleanup; + } + assert( db->mallocFailed==0 ); + dest.iSDParm = 0; /* Suppress a harmless compiler warning */ + + /* If the Select object is really just a simple VALUES() list with a + ** single row (the common case) then keep that one row of values + ** and discard the other (unused) parts of the pSelect object + */ + if( pSelect && (pSelect->selFlags & SF_Values)!=0 && pSelect->pPrior==0 ){ + pList = pSelect->pEList; + pSelect->pEList = 0; + sqlite3SelectDelete(db, pSelect); + pSelect = 0; + } + + /* Locate the table into which we will be inserting new information. + */ + assert( pTabList->nSrc==1 ); + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ){ + goto insert_cleanup; + } + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDbnDb ); + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, + db->aDb[iDb].zDbSName) ){ + goto insert_cleanup; + } + withoutRowid = !HasRowid(pTab); + + /* Figure out if we have any triggers and if the table being + ** inserted into is a view + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); + isView = IsView(pTab); +#else +# define pTrigger 0 +# define tmask 0 +# define isView 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Insert() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewInsert(pParse->pWith, pTabList, pColumn, pSelect, pList, + onError, pUpsert, pTrigger); + } +#endif + + /* If pTab is really a view, make sure it has been initialized. + ** ViewGetColumnNames() is a no-op if pTab is not a view. + */ + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto insert_cleanup; + } + + /* Cannot insert into a read-only table. + */ + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + goto insert_cleanup; + } + + /* Allocate a VDBE + */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto insert_cleanup; + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb); + +#ifndef SQLITE_OMIT_XFER_OPT + /* If the statement is of the form + ** + ** INSERT INTO SELECT * FROM ; + ** + ** Then special optimizations can be applied that make the transfer + ** very fast and which reduce fragmentation of indices. + ** + ** This is the 2nd template. + */ + if( pColumn==0 + && pSelect!=0 + && pTrigger==0 + && xferOptimization(pParse, pTab, pSelect, onError, iDb) + ){ + assert( !pTrigger ); + assert( pList==0 ); + goto insert_end; + } +#endif /* SQLITE_OMIT_XFER_OPT */ + + /* If this is an AUTOINCREMENT table, look up the sequence number in the + ** sqlite_sequence table and store it in memory cell regAutoinc. + */ + regAutoinc = autoIncBegin(pParse, iDb, pTab); + + /* Allocate a block registers to hold the rowid and the values + ** for all columns of the new row. + */ + regRowid = regIns = pParse->nMem+1; + pParse->nMem += pTab->nCol + 1; + if( IsVirtual(pTab) ){ + regRowid++; + pParse->nMem++; + } + regData = regRowid+1; + + /* If the INSERT statement included an IDLIST term, then make sure + ** all elements of the IDLIST really are columns of the table and + ** remember the column indices. + ** + ** If the table has an INTEGER PRIMARY KEY column and that column + ** is named in the IDLIST, then record in the ipkColumn variable + ** the index into IDLIST of the primary key column. ipkColumn is + ** the index of the primary key as it appears in IDLIST, not as + ** is appears in the original table. (The index of the INTEGER + ** PRIMARY KEY in the original table is pTab->iPKey.) After this + ** loop, if ipkColumn==(-1), that means that integer primary key + ** is unspecified, and hence the table is either WITHOUT ROWID or + ** it will automatically generated an integer primary key. + ** + ** bIdListInOrder is true if the columns in IDLIST are in storage + ** order. This enables an optimization that avoids shuffling the + ** columns into storage order. False negatives are harmless, + ** but false positives will cause database corruption. + */ + bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; + if( pColumn ){ + assert( pColumn->eU4!=EU4_EXPR ); + pColumn->eU4 = EU4_IDX; + for(i=0; inId; i++){ + pColumn->a[i].u4.idx = -1; + } + for(i=0; inId; i++){ + for(j=0; jnCol; j++){ + if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zCnName)==0 ){ + pColumn->a[i].u4.idx = j; + if( i!=j ) bIdListInOrder = 0; + if( j==pTab->iPKey ){ + ipkColumn = i; assert( !withoutRowid ); + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot INSERT into generated column \"%s\"", + pTab->aCol[j].zCnName); + goto insert_cleanup; + } +#endif + break; + } + } + if( j>=pTab->nCol ){ + if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){ + ipkColumn = i; + bIdListInOrder = 0; + }else{ + sqlite3ErrorMsg(pParse, "table %S has no column named %s", + pTabList->a, pColumn->a[i].zName); + pParse->checkSchema = 1; + goto insert_cleanup; + } + } + } + } + + /* Figure out how many columns of data are supplied. If the data + ** is coming from a SELECT statement, then generate a co-routine that + ** produces a single row of the SELECT on each invocation. The + ** co-routine is the common header to the 3rd and 4th templates. + */ + if( pSelect ){ + /* Data is coming from a SELECT or from a multi-row VALUES clause. + ** Generate a co-routine to run the SELECT. */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int rc; /* Result code */ + + regYield = ++pParse->nMem; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + dest.iSdst = bIdListInOrder ? regData : 0; + dest.nSdst = pTab->nCol; + rc = sqlite3Select(pParse, pSelect, &dest); + regFromSelect = dest.iSdst; + assert( db->pParse==pParse ); + if( rc || pParse->nErr ) goto insert_cleanup; + assert( db->mallocFailed==0 ); + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ + assert( pSelect->pEList ); + nColumn = pSelect->pEList->nExpr; + + /* Set useTempTable to TRUE if the result of the SELECT statement + ** should be written into a temporary table (template 4). Set to + ** FALSE if each output row of the SELECT can be written directly into + ** the destination table (template 3). + ** + ** A temp table must be used if the table being updated is also one + ** of the tables being read by the SELECT statement. Also use a + ** temp table in the case of row triggers. + */ + if( pTrigger || readsTable(pParse, iDb, pTab) ){ + useTempTable = 1; + } + + if( useTempTable ){ + /* Invoke the coroutine to extract information from the SELECT + ** and add it to a transient table srcTab. The code generated + ** here is from the 4th template: + ** + ** B: open temp table + ** L: yield X, goto M at EOF + ** insert row from R..R+n into temp table + ** goto L + ** M: ... + */ + int regRec; /* Register to hold packed record */ + int regTempRowid; /* Register to hold temp table ROWID */ + int addrL; /* Label "L" */ + + srcTab = pParse->nTab++; + regRec = sqlite3GetTempReg(pParse); + regTempRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); + addrL = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); + sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); + sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); + sqlite3VdbeGoto(v, addrL); + sqlite3VdbeJumpHere(v, addrL); + sqlite3ReleaseTempReg(pParse, regRec); + sqlite3ReleaseTempReg(pParse, regTempRowid); + } + }else{ + /* This is the case if the data for the INSERT is coming from a + ** single-row VALUES clause + */ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + srcTab = -1; + assert( useTempTable==0 ); + if( pList ){ + nColumn = pList->nExpr; + if( sqlite3ResolveExprListNames(&sNC, pList) ){ + goto insert_cleanup; + } + }else{ + nColumn = 0; + } + } + + /* If there is no IDLIST term but the table has an integer primary + ** key, the set the ipkColumn variable to the integer primary key + ** column index in the original table definition. + */ + if( pColumn==0 && nColumn>0 ){ + ipkColumn = pTab->iPKey; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( ipkColumn>=0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + for(i=ipkColumn-1; i>=0; i--){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + ipkColumn--; + } + } + } +#endif + + /* Make sure the number of columns in the source data matches the number + ** of columns to be inserted into the table. + */ + assert( TF_HasHidden==COLFLAG_HIDDEN ); + assert( TF_HasGenerated==COLFLAG_GENERATED ); + assert( COLFLAG_NOINSERT==(COLFLAG_GENERATED|COLFLAG_HIDDEN) ); + if( (pTab->tabFlags & (TF_HasGenerated|TF_HasHidden))!=0 ){ + for(i=0; inCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ) nHidden++; + } + } + if( nColumn!=(pTab->nCol-nHidden) ){ + sqlite3ErrorMsg(pParse, + "table %S has %d columns but %d values were supplied", + pTabList->a, pTab->nCol-nHidden, nColumn); + goto insert_cleanup; + } + } + if( pColumn!=0 && nColumn!=pColumn->nId ){ + sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); + goto insert_cleanup; + } + + /* Initialize the count of rows to be inserted + */ + if( (db->flags & SQLITE_CountRows)!=0 + && !pParse->nested + && !pParse->pTriggerTab + && !pParse->bReturning + ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + + /* If this is not a view, open the table and and all indices */ + if( !isView ){ + int nIdx; + nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, -1, 0, + &iDataCur, &iIdxCur); + aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+2)); + if( aRegIdx==0 ){ + goto insert_cleanup; + } + for(i=0, pIdx=pTab->pIndex; ipNext, i++){ + assert( pIdx ); + aRegIdx[i] = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + } + aRegIdx[i] = ++pParse->nMem; /* Register to store the table record */ + } +#ifndef SQLITE_OMIT_UPSERT + if( pUpsert ){ + Upsert *pNx; + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } + if( IsView(pTab) ){ + sqlite3ErrorMsg(pParse, "cannot UPSERT a view"); + goto insert_cleanup; + } + if( sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget) ){ + goto insert_cleanup; + } + pTabList->a[0].iCursor = iDataCur; + pNx = pUpsert; + do{ + pNx->pUpsertSrc = pTabList; + pNx->regData = regData; + pNx->iDataCur = iDataCur; + pNx->iIdxCur = iIdxCur; + if( pNx->pUpsertTarget ){ + if( sqlite3UpsertAnalyzeTarget(pParse, pTabList, pNx) ){ + goto insert_cleanup; + } + } + pNx = pNx->pNextUpsert; + }while( pNx!=0 ); + } +#endif + + + /* This is the top of the main insertion loop */ + if( useTempTable ){ + /* This block codes the top of loop only. The complete loop is the + ** following pseudocode (template 4): + ** + ** rewind temp table, if empty goto D + ** C: loop over rows of intermediate table + ** transfer values form intermediate table into
        + ** end loop + ** D: ... + */ + addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); VdbeCoverage(v); + addrCont = sqlite3VdbeCurrentAddr(v); + }else if( pSelect ){ + /* This block codes the top of loop only. The complete loop is the + ** following pseudocode (template 3): + ** + ** C: yield X, at EOF goto D + ** insert the select result into
        from R..R+n + ** goto C + ** D: ... + */ + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); + addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + if( ipkColumn>=0 ){ + /* tag-20191021-001: If the INTEGER PRIMARY KEY is being generated by the + ** SELECT, go ahead and copy the value into the rowid slot now, so that + ** the value does not get overwritten by a NULL at tag-20191021-002. */ + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + } + } + + /* Compute data for ordinary columns of the new entry. Values + ** are written in storage order into registers starting with regData. + ** Only ordinary columns are computed in this loop. The rowid + ** (if there is one) is computed later and generated columns are + ** computed after the rowid since they might depend on the value + ** of the rowid. + */ + nHidden = 0; + iRegStore = regData; assert( regData==regRowid+1 ); + for(i=0; inCol; i++, iRegStore++){ + int k; + u32 colFlags; + assert( i>=nHidden ); + if( i==pTab->iPKey ){ + /* tag-20191021-002: References to the INTEGER PRIMARY KEY are filled + ** using the rowid. So put a NULL in the IPK slot of the record to avoid + ** using excess space. The file format definition requires this extra + ** NULL - we cannot optimize further by skipping the column completely */ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + continue; + } + if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ + nHidden++; + if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ + /* Virtual columns do not participate in OP_MakeRecord. So back up + ** iRegStore by one slot to compensate for the iRegStore++ in the + ** outer for() loop */ + iRegStore--; + continue; + }else if( (colFlags & COLFLAG_STORED)!=0 ){ + /* Stored columns are computed later. But if there are BEFORE + ** triggers, the slots used for stored columns will be OP_Copy-ed + ** to a second block of registers, so the register needs to be + ** initialized to NULL to avoid an uninitialized register read */ + if( tmask & TRIGGER_BEFORE ){ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + } + continue; + }else if( pColumn==0 ){ + /* Hidden columns that are not explicitly named in the INSERT + ** get there default value */ + sqlite3ExprCodeFactorable(pParse, + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + iRegStore); + continue; + } + } + if( pColumn ){ + assert( pColumn->eU4==EU4_IDX ); + for(j=0; jnId && pColumn->a[j].u4.idx!=i; j++){} + if( j>=pColumn->nId ){ + /* A column not named in the insert column list gets its + ** default value */ + sqlite3ExprCodeFactorable(pParse, + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + iRegStore); + continue; + } + k = j; + }else if( nColumn==0 ){ + /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ + sqlite3ExprCodeFactorable(pParse, + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + iRegStore); + continue; + }else{ + k = i - nHidden; + } + + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); + }else if( pSelect ){ + if( regFromSelect!=regData ){ + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); + } + }else{ + sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); + } + } + + + /* Run the BEFORE and INSTEAD OF triggers, if there are any + */ + endOfLoop = sqlite3VdbeMakeLabel(pParse); + if( tmask & TRIGGER_BEFORE ){ + int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); + + /* build the NEW.* reference row. Note that if there is an INTEGER + ** PRIMARY KEY into which a NULL is being inserted, that NULL will be + ** translated into a unique ID for the row. But on a BEFORE trigger, + ** we do not know what the unique ID will be (because the insert has + ** not happened yet) so we substitute a rowid of -1 + */ + if( ipkColumn<0 ){ + sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); + }else{ + int addr1; + assert( !withoutRowid ); + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); + }else{ + assert( pSelect==0 ); /* Otherwise useTempTable is true */ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); + } + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); + } + + /* Copy the new data already generated. */ + assert( pTab->nNVCol>0 ); + sqlite3VdbeAddOp3(v, OP_Copy, regRowid+1, regCols+1, pTab->nNVCol-1); + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** refers to the ROWID. */ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regCols+1, pTab); + } +#endif + + /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, + ** do not attempt any conversions before assembling the record. + ** If this is a real table, attempt conversions as required by the + ** table column affinities. + */ + if( !isView ){ + sqlite3TableAffinity(v, pTab, regCols+1); + } + + /* Fire BEFORE or INSTEAD OF triggers */ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, + pTab, regCols-pTab->nCol-1, onError, endOfLoop); + + sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); + } + + if( !isView ){ + if( IsVirtual(pTab) ){ + /* The row that the VUpdate opcode will delete: none */ + sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); + } + if( ipkColumn>=0 ){ + /* Compute the new rowid */ + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); + }else if( pSelect ){ + /* Rowid already initialized at tag-20191021-001 */ + }else{ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + appendFlag = 1; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); + } + } + /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid + ** to generate a unique primary key value. + */ + if( !appendFlag ){ + int addr1; + if( !IsVirtual(pTab) ){ + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + sqlite3VdbeJumpHere(v, addr1); + }else{ + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); + } + sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); + } + }else if( IsVirtual(pTab) || withoutRowid ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); + }else{ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); + appendFlag = 1; + } + autoIncStep(pParse, regAutoinc, regRowid); + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** is derived from the INTEGER PRIMARY KEY. */ + if( pTab->tabFlags & TF_HasGenerated ){ + sqlite3ComputeGeneratedColumns(pParse, regRowid+1, pTab); + } +#endif + + /* Generate code to check constraints and generate index keys and + ** do the insertion. + */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pTab) ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + sqlite3VtabMakeWritable(pParse, pTab); + sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); + sqlite3MayAbort(pParse); + }else +#endif + { + int isReplace = 0;/* Set to true if constraints may cause a replace */ + int bUseSeek; /* True to use OPFLAG_SEEKRESULT */ + sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, + regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert + ); + sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + + /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE + ** constraints or (b) there are no triggers and this table is not a + ** parent table in a foreign key constraint. It is safe to set the + ** flag in the second case as if any REPLACE constraint is hit, an + ** OP_Delete or OP_IdxDelete instruction will be executed on each + ** cursor that is disturbed. And these instructions both clear the + ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT + ** functionality. */ + bUseSeek = (isReplace==0 || !sqlite3VdbeHasSubProgram(v)); + sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, + regIns, aRegIdx, 0, appendFlag, bUseSeek + ); + } +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + }else if( pParse->bReturning ){ + /* If there is a RETURNING clause, populate the rowid register with + ** constant value -1, in case one or more of the returned expressions + ** refer to the "rowid" of the view. */ + sqlite3VdbeAddOp2(v, OP_Integer, -1, regRowid); +#endif + } + + /* Update the count of rows that are inserted + */ + if( regRowCount ){ + sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); + } + + if( pTrigger ){ + /* Code AFTER triggers */ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, + pTab, regData-2-pTab->nCol, onError, endOfLoop); + } + + /* The bottom of the main insertion loop, if the data source + ** is a SELECT statement. + */ + sqlite3VdbeResolveLabel(v, endOfLoop); + if( useTempTable ){ + sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrInsTop); + sqlite3VdbeAddOp1(v, OP_Close, srcTab); + }else if( pSelect ){ + sqlite3VdbeGoto(v, addrCont); +#ifdef SQLITE_DEBUG + /* If we are jumping back to an OP_Yield that is preceded by an + ** OP_ReleaseReg, set the p5 flag on the OP_Goto so that the + ** OP_ReleaseReg will be included in the loop. */ + if( sqlite3VdbeGetOp(v, addrCont-1)->opcode==OP_ReleaseReg ){ + assert( sqlite3VdbeGetOp(v, addrCont)->opcode==OP_Yield ); + sqlite3VdbeChangeP5(v, 1); + } +#endif + sqlite3VdbeJumpHere(v, addrInsTop); + } + +#ifndef SQLITE_OMIT_XFER_OPT +insert_end: +#endif /* SQLITE_OMIT_XFER_OPT */ + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* + ** Return the number of rows inserted. If this routine is + ** generating code because of a call to sqlite3NestedParse(), do not + ** invoke the callback function. + */ + if( regRowCount ){ + sqlite3CodeChangeCount(v, regRowCount, "rows inserted"); + } + +insert_cleanup: + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprListDelete(db, pList); + sqlite3UpsertDelete(db, pUpsert); + sqlite3SelectDelete(db, pSelect); + sqlite3IdListDelete(db, pColumn); + sqlite3DbFree(db, aRegIdx); +} + +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif +#ifdef tmask + #undef tmask +#endif + +/* +** Meanings of bits in of pWalker->eCode for +** sqlite3ExprReferencesUpdatedColumn() +*/ +#define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ +#define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ + +/* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn(). +* Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this +** expression node references any of the +** columns that are being modifed by an UPDATE statement. +*/ +static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + assert( pExpr->iColumn>=0 || pExpr->iColumn==-1 ); + if( pExpr->iColumn>=0 ){ + if( pWalker->u.aiCol[pExpr->iColumn]>=0 ){ + pWalker->eCode |= CKCNSTRNT_COLUMN; + } + }else{ + pWalker->eCode |= CKCNSTRNT_ROWID; + } + } + return WRC_Continue; +} + +/* +** pExpr is a CHECK constraint on a row that is being UPDATE-ed. The +** only columns that are modified by the UPDATE are those for which +** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. +** +** Return true if CHECK constraint pExpr uses any of the +** changing columns (or the rowid if it is changing). In other words, +** return true if this CHECK constraint must be validated for +** the new row in the UPDATE statement. +** +** 2018-09-15: pExpr might also be an expression for an index-on-expressions. +** The operation of this routine is the same - return true if an only if +** the expression uses one or more of columns identified by the second and +** third arguments. +*/ +SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn( + Expr *pExpr, /* The expression to be checked */ + int *aiChng, /* aiChng[x]>=0 if column x changed by the UPDATE */ + int chngRowid /* True if UPDATE changes the rowid */ +){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 0; + w.xExprCallback = checkConstraintExprNode; + w.u.aiCol = aiChng; + sqlite3WalkExpr(&w, pExpr); + if( !chngRowid ){ + testcase( (w.eCode & CKCNSTRNT_ROWID)!=0 ); + w.eCode &= ~CKCNSTRNT_ROWID; + } + testcase( w.eCode==0 ); + testcase( w.eCode==CKCNSTRNT_COLUMN ); + testcase( w.eCode==CKCNSTRNT_ROWID ); + testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); + return w.eCode!=0; +} + +/* +** The sqlite3GenerateConstraintChecks() routine usually wants to visit +** the indexes of a table in the order provided in the Table->pIndex list. +** However, sometimes (rarely - when there is an upsert) it wants to visit +** the indexes in a different order. The following data structures accomplish +** this. +** +** The IndexIterator object is used to walk through all of the indexes +** of a table in either Index.pNext order, or in some other order established +** by an array of IndexListTerm objects. +*/ +typedef struct IndexListTerm IndexListTerm; +typedef struct IndexIterator IndexIterator; +struct IndexIterator { + int eType; /* 0 for Index.pNext list. 1 for an array of IndexListTerm */ + int i; /* Index of the current item from the list */ + union { + struct { /* Use this object for eType==0: A Index.pNext list */ + Index *pIdx; /* The current Index */ + } lx; + struct { /* Use this object for eType==1; Array of IndexListTerm */ + int nIdx; /* Size of the array */ + IndexListTerm *aIdx; /* Array of IndexListTerms */ + } ax; + } u; +}; + +/* When IndexIterator.eType==1, then each index is an array of instances +** of the following object +*/ +struct IndexListTerm { + Index *p; /* The index */ + int ix; /* Which entry in the original Table.pIndex list is this index*/ +}; + +/* Return the first index on the list */ +static Index *indexIteratorFirst(IndexIterator *pIter, int *pIx){ + assert( pIter->i==0 ); + if( pIter->eType ){ + *pIx = pIter->u.ax.aIdx[0].ix; + return pIter->u.ax.aIdx[0].p; + }else{ + *pIx = 0; + return pIter->u.lx.pIdx; + } +} + +/* Return the next index from the list. Return NULL when out of indexes */ +static Index *indexIteratorNext(IndexIterator *pIter, int *pIx){ + if( pIter->eType ){ + int i = ++pIter->i; + if( i>=pIter->u.ax.nIdx ){ + *pIx = i; + return 0; + } + *pIx = pIter->u.ax.aIdx[i].ix; + return pIter->u.ax.aIdx[i].p; + }else{ + ++(*pIx); + pIter->u.lx.pIdx = pIter->u.lx.pIdx->pNext; + return pIter->u.lx.pIdx; + } +} + +/* +** Generate code to do constraint checks prior to an INSERT or an UPDATE +** on table pTab. +** +** The regNewData parameter is the first register in a range that contains +** the data to be inserted or the data after the update. There will be +** pTab->nCol+1 registers in this range. The first register (the one +** that regNewData points to) will contain the new rowid, or NULL in the +** case of a WITHOUT ROWID table. The second register in the range will +** contain the content of the first table column. The third register will +** contain the content of the second table column. And so forth. +** +** The regOldData parameter is similar to regNewData except that it contains +** the data prior to an UPDATE rather than afterwards. regOldData is zero +** for an INSERT. This routine can distinguish between UPDATE and INSERT by +** checking regOldData for zero. +** +** For an UPDATE, the pkChng boolean is true if the true primary key (the +** rowid for a normal table or the PRIMARY KEY for a WITHOUT ROWID table) +** might be modified by the UPDATE. If pkChng is false, then the key of +** the iDataCur content table is guaranteed to be unchanged by the UPDATE. +** +** For an INSERT, the pkChng boolean indicates whether or not the rowid +** was explicitly specified as part of the INSERT statement. If pkChng +** is zero, it means that the either rowid is computed automatically or +** that the table is a WITHOUT ROWID table and has no rowid. On an INSERT, +** pkChng will only be true if the INSERT statement provides an integer +** value for either the rowid column or its INTEGER PRIMARY KEY alias. +** +** The code generated by this routine will store new index entries into +** registers identified by aRegIdx[]. No index entry is created for +** indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is +** the same as the order of indices on the linked list of indices +** at pTab->pIndex. +** +** (2019-05-07) The generated code also creates a new record for the +** main table, if pTab is a rowid table, and stores that record in the +** register identified by aRegIdx[nIdx] - in other words in the first +** entry of aRegIdx[] past the last index. It is important that the +** record be generated during constraint checks to avoid affinity changes +** to the register content that occur after constraint checks but before +** the new record is inserted. +** +** The caller must have already opened writeable cursors on the main +** table and all applicable indices (that is to say, all indices for which +** aRegIdx[] is not zero). iDataCur is the cursor for the main table when +** inserting or updating a rowid table, or the cursor for the PRIMARY KEY +** index when operating on a WITHOUT ROWID table. iIdxCur is the cursor +** for the first index in the pTab->pIndex list. Cursors for other indices +** are at iIdxCur+N for the N-th element of the pTab->pIndex list. +** +** This routine also generates code to check constraints. NOT NULL, +** CHECK, and UNIQUE constraints are all checked. If a constraint fails, +** then the appropriate action is performed. There are five possible +** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. +** +** Constraint type Action What Happens +** --------------- ---------- ---------------------------------------- +** any ROLLBACK The current transaction is rolled back and +** sqlite3_step() returns immediately with a +** return code of SQLITE_CONSTRAINT. +** +** any ABORT Back out changes from the current command +** only (do not do a complete rollback) then +** cause sqlite3_step() to return immediately +** with SQLITE_CONSTRAINT. +** +** any FAIL Sqlite3_step() returns immediately with a +** return code of SQLITE_CONSTRAINT. The +** transaction is not rolled back and any +** changes to prior rows are retained. +** +** any IGNORE The attempt in insert or update the current +** row is skipped, without throwing an error. +** Processing continues with the next row. +** (There is an immediate jump to ignoreDest.) +** +** NOT NULL REPLACE The NULL value is replace by the default +** value for that column. If the default value +** is NULL, the action is the same as ABORT. +** +** UNIQUE REPLACE The other row that conflicts with the row +** being inserted is removed. +** +** CHECK REPLACE Illegal. The results in an exception. +** +** Which action to take is determined by the overrideError parameter. +** Or if overrideError==OE_Default, then the pParse->onError parameter +** is used. Or if pParse->onError==OE_Default then the onError value +** for the constraint is used. +*/ +SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( + Parse *pParse, /* The parser context */ + Table *pTab, /* The table being inserted or updated */ + int *aRegIdx, /* Use register aRegIdx[i] for index i. 0 for unused */ + int iDataCur, /* Canonical data cursor (main table or PK index) */ + int iIdxCur, /* First index cursor */ + int regNewData, /* First register in a range holding values to insert */ + int regOldData, /* Previous content. 0 for INSERTs */ + u8 pkChng, /* Non-zero if the rowid or PRIMARY KEY changed */ + u8 overrideError, /* Override onError to this if not OE_Default */ + int ignoreDest, /* Jump to this label on an OE_Ignore resolution */ + int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */ + int *aiChng, /* column i is unchanged if aiChng[i]<0 */ + Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */ +){ + Vdbe *v; /* VDBE under constrution */ + Index *pIdx; /* Pointer to one of the indices */ + Index *pPk = 0; /* The PRIMARY KEY index for WITHOUT ROWID tables */ + sqlite3 *db; /* Database connection */ + int i; /* loop counter */ + int ix; /* Index loop counter */ + int nCol; /* Number of columns */ + int onError; /* Conflict resolution strategy */ + int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ + int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ + Upsert *pUpsertClause = 0; /* The specific ON CONFLICT clause for pIdx */ + u8 isUpdate; /* True if this is an UPDATE operation */ + u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ + int upsertIpkReturn = 0; /* Address of Goto at end of IPK uniqueness check */ + int upsertIpkDelay = 0; /* Address of Goto to bypass initial IPK check */ + int ipkTop = 0; /* Top of the IPK uniqueness check */ + int ipkBottom = 0; /* OP_Goto at the end of the IPK uniqueness check */ + /* Variables associated with retesting uniqueness constraints after + ** replace triggers fire have run */ + int regTrigCnt; /* Register used to count replace trigger invocations */ + int addrRecheck = 0; /* Jump here to recheck all uniqueness constraints */ + int lblRecheckOk = 0; /* Each recheck jumps to this label if it passes */ + Trigger *pTrigger; /* List of DELETE triggers on the table pTab */ + int nReplaceTrig = 0; /* Number of replace triggers coded */ + IndexIterator sIdxIter; /* Index iterator */ + + isUpdate = regOldData!=0; + db = pParse->db; + v = pParse->pVdbe; + assert( v!=0 ); + assert( !IsView(pTab) ); /* This table is not a VIEW */ + nCol = pTab->nCol; + + /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for + ** normal rowid tables. nPkField is the number of key fields in the + ** pPk index or 1 for a rowid table. In other words, nPkField is the + ** number of fields in the true primary key of the table. */ + if( HasRowid(pTab) ){ + pPk = 0; + nPkField = 1; + }else{ + pPk = sqlite3PrimaryKeyIndex(pTab); + nPkField = pPk->nKeyCol; + } + + /* Record that this module has started */ + VdbeModuleComment((v, "BEGIN: GenCnstCks(%d,%d,%d,%d,%d)", + iDataCur, iIdxCur, regNewData, regOldData, pkChng)); + + /* Test all NOT NULL constraints. + */ + if( pTab->tabFlags & TF_HasNotNull ){ + int b2ndPass = 0; /* True if currently running 2nd pass */ + int nSeenReplace = 0; /* Number of ON CONFLICT REPLACE operations */ + int nGenerated = 0; /* Number of generated columns with NOT NULL */ + while(1){ /* Make 2 passes over columns. Exit loop via "break" */ + for(i=0; iaCol[i]; /* The column to check for NOT NULL */ + int isGenerated; /* non-zero if column is generated */ + onError = pCol->notNull; + if( onError==OE_None ) continue; /* No NOT NULL on this column */ + if( i==pTab->iPKey ){ + continue; /* ROWID is never NULL */ + } + isGenerated = pCol->colFlags & COLFLAG_GENERATED; + if( isGenerated && !b2ndPass ){ + nGenerated++; + continue; /* Generated columns processed on 2nd pass */ + } + if( aiChng && aiChng[i]<0 && !isGenerated ){ + /* Do not check NOT NULL on columns that do not change */ + continue; + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + if( onError==OE_Replace ){ + if( b2ndPass /* REPLACE becomes ABORT on the 2nd pass */ + || pCol->iDflt==0 /* REPLACE is ABORT if no DEFAULT value */ + ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + testcase( pCol->colFlags & COLFLAG_GENERATED ); + onError = OE_Abort; + }else{ + assert( !isGenerated ); + } + }else if( b2ndPass && !isGenerated ){ + continue; + } + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); + iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; + switch( onError ){ + case OE_Replace: { + int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, iReg); + VdbeCoverage(v); + assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); + nSeenReplace++; + sqlite3ExprCodeCopy(pParse, + sqlite3ColumnExpr(pTab, pCol), iReg); + sqlite3VdbeJumpHere(v, addr1); + break; + } + case OE_Abort: + sqlite3MayAbort(pParse); + /* no break */ deliberate_fall_through + case OE_Rollback: + case OE_Fail: { + char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, + pCol->zCnName); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, + onError, iReg); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); + sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); + break; + } + default: { + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest); + VdbeCoverage(v); + break; + } + } /* end switch(onError) */ + } /* end loop i over columns */ + if( nGenerated==0 && nSeenReplace==0 ){ + /* If there are no generated columns with NOT NULL constraints + ** and no NOT NULL ON CONFLICT REPLACE constraints, then a single + ** pass is sufficient */ + break; + } + if( b2ndPass ) break; /* Never need more than 2 passes */ + b2ndPass = 1; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( nSeenReplace>0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ + /* If any NOT NULL ON CONFLICT REPLACE constraints fired on the + ** first pass, recomputed values for all generated columns, as + ** those values might depend on columns affected by the REPLACE. + */ + sqlite3ComputeGeneratedColumns(pParse, regNewData+1, pTab); + } +#endif + } /* end of 2-pass loop */ + } /* end if( has-not-null-constraints ) */ + + /* Test all CHECK constraints + */ +#ifndef SQLITE_OMIT_CHECK + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ + ExprList *pCheck = pTab->pCheck; + pParse->iSelfTab = -(regNewData+1); + onError = overrideError!=OE_Default ? overrideError : OE_Abort; + for(i=0; inExpr; i++){ + int allOk; + Expr *pCopy; + Expr *pExpr = pCheck->a[i].pExpr; + if( aiChng + && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) + ){ + /* The check constraints do not reference any of the columns being + ** updated so there is no point it verifying the check constraint */ + continue; + } + if( bAffinityDone==0 ){ + sqlite3TableAffinity(v, pTab, regNewData+1); + bAffinityDone = 1; + } + allOk = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeVerifyAbortable(v, onError); + pCopy = sqlite3ExprDup(db, pExpr, 0); + if( !db->mallocFailed ){ + sqlite3ExprIfTrue(pParse, pCopy, allOk, SQLITE_JUMPIFNULL); + } + sqlite3ExprDelete(db, pCopy); + if( onError==OE_Ignore ){ + sqlite3VdbeGoto(v, ignoreDest); + }else{ + char *zName = pCheck->a[i].zEName; + assert( zName!=0 || pParse->db->mallocFailed ); + if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-26383-51744 */ + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, + onError, zName, P4_TRANSIENT, + P5_ConstraintCheck); + } + sqlite3VdbeResolveLabel(v, allOk); + } + pParse->iSelfTab = 0; + } +#endif /* !defined(SQLITE_OMIT_CHECK) */ + + /* UNIQUE and PRIMARY KEY constraints should be handled in the following + ** order: + ** + ** (1) OE_Update + ** (2) OE_Abort, OE_Fail, OE_Rollback, OE_Ignore + ** (3) OE_Replace + ** + ** OE_Fail and OE_Ignore must happen before any changes are made. + ** OE_Update guarantees that only a single row will change, so it + ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback + ** could happen in any order, but they are grouped up front for + ** convenience. + ** + ** 2018-08-14: Ticket https://www.sqlite.org/src/info/908f001483982c43 + ** The order of constraints used to have OE_Update as (2) and OE_Abort + ** and so forth as (1). But apparently PostgreSQL checks the OE_Update + ** constraint before any others, so it had to be moved. + ** + ** Constraint checking code is generated in this order: + ** (A) The rowid constraint + ** (B) Unique index constraints that do not have OE_Replace as their + ** default conflict resolution strategy + ** (C) Unique index that do use OE_Replace by default. + ** + ** The ordering of (2) and (3) is accomplished by making sure the linked + ** list of indexes attached to a table puts all OE_Replace indexes last + ** in the list. See sqlite3CreateIndex() for where that happens. + */ + sIdxIter.eType = 0; + sIdxIter.i = 0; + sIdxIter.u.ax.aIdx = 0; /* Silence harmless compiler warning */ + sIdxIter.u.lx.pIdx = pTab->pIndex; + if( pUpsert ){ + if( pUpsert->pUpsertTarget==0 ){ + /* There is just on ON CONFLICT clause and it has no constraint-target */ + assert( pUpsert->pNextUpsert==0 ); + if( pUpsert->isDoUpdate==0 ){ + /* A single ON CONFLICT DO NOTHING clause, without a constraint-target. + ** Make all unique constraint resolution be OE_Ignore */ + overrideError = OE_Ignore; + pUpsert = 0; + }else{ + /* A single ON CONFLICT DO UPDATE. Make all resolutions OE_Update */ + overrideError = OE_Update; + } + }else if( pTab->pIndex!=0 ){ + /* Otherwise, we'll need to run the IndexListTerm array version of the + ** iterator to ensure that all of the ON CONFLICT conditions are + ** checked first and in order. */ + int nIdx, jj; + u64 nByte; + Upsert *pTerm; + u8 *bUsed; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + assert( aRegIdx[nIdx]>0 ); + } + sIdxIter.eType = 1; + sIdxIter.u.ax.nIdx = nIdx; + nByte = (sizeof(IndexListTerm)+1)*nIdx + nIdx; + sIdxIter.u.ax.aIdx = sqlite3DbMallocZero(db, nByte); + if( sIdxIter.u.ax.aIdx==0 ) return; /* OOM */ + bUsed = (u8*)&sIdxIter.u.ax.aIdx[nIdx]; + pUpsert->pToFree = sIdxIter.u.ax.aIdx; + for(i=0, pTerm=pUpsert; pTerm; pTerm=pTerm->pNextUpsert){ + if( pTerm->pUpsertTarget==0 ) break; + if( pTerm->pUpsertIdx==0 ) continue; /* Skip ON CONFLICT for the IPK */ + jj = 0; + pIdx = pTab->pIndex; + while( ALWAYS(pIdx!=0) && pIdx!=pTerm->pUpsertIdx ){ + pIdx = pIdx->pNext; + jj++; + } + if( bUsed[jj] ) continue; /* Duplicate ON CONFLICT clause ignored */ + bUsed[jj] = 1; + sIdxIter.u.ax.aIdx[i].p = pIdx; + sIdxIter.u.ax.aIdx[i].ix = jj; + i++; + } + for(jj=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, jj++){ + if( bUsed[jj] ) continue; + sIdxIter.u.ax.aIdx[i].p = pIdx; + sIdxIter.u.ax.aIdx[i].ix = jj; + i++; + } + assert( i==nIdx ); + } + } + + /* Determine if it is possible that triggers (either explicitly coded + ** triggers or FK resolution actions) might run as a result of deletes + ** that happen when OE_Replace conflict resolution occurs. (Call these + ** "replace triggers".) If any replace triggers run, we will need to + ** recheck all of the uniqueness constraints after they have all run. + ** But on the recheck, the resolution is OE_Abort instead of OE_Replace. + ** + ** If replace triggers are a possibility, then + ** + ** (1) Allocate register regTrigCnt and initialize it to zero. + ** That register will count the number of replace triggers that + ** fire. Constraint recheck only occurs if the number is positive. + ** (2) Initialize pTrigger to the list of all DELETE triggers on pTab. + ** (3) Initialize addrRecheck and lblRecheckOk + ** + ** The uniqueness rechecking code will create a series of tests to run + ** in a second pass. The addrRecheck and lblRecheckOk variables are + ** used to link together these tests which are separated from each other + ** in the generate bytecode. + */ + if( (db->flags & (SQLITE_RecTriggers|SQLITE_ForeignKeys))==0 ){ + /* There are not DELETE triggers nor FK constraints. No constraint + ** rechecks are needed. */ + pTrigger = 0; + regTrigCnt = 0; + }else{ + if( db->flags&SQLITE_RecTriggers ){ + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + regTrigCnt = pTrigger!=0 || sqlite3FkRequired(pParse, pTab, 0, 0); + }else{ + pTrigger = 0; + regTrigCnt = sqlite3FkRequired(pParse, pTab, 0, 0); + } + if( regTrigCnt ){ + /* Replace triggers might exist. Allocate the counter and + ** initialize it to zero. */ + regTrigCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regTrigCnt); + VdbeComment((v, "trigger count")); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + addrRecheck = lblRecheckOk; + } + } + + /* If rowid is changing, make sure the new rowid does not previously + ** exist in the table. + */ + if( pkChng && pPk==0 ){ + int addrRowidOk = sqlite3VdbeMakeLabel(pParse); + + /* Figure out what action to take in case of a rowid collision */ + onError = pTab->keyConf; + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + /* figure out whether or not upsert applies in this case */ + if( pUpsert ){ + pUpsertClause = sqlite3UpsertOfIndex(pUpsert,0); + if( pUpsertClause!=0 ){ + if( pUpsertClause->isDoUpdate==0 ){ + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + }else{ + onError = OE_Update; /* DO UPDATE */ + } + } + if( pUpsertClause!=pUpsert ){ + /* The first ON CONFLICT clause has a conflict target other than + ** the IPK. We have to jump ahead to that first ON CONFLICT clause + ** and then come back here and deal with the IPK afterwards */ + upsertIpkDelay = sqlite3VdbeAddOp0(v, OP_Goto); + } + } + + /* If the response to a rowid conflict is REPLACE but the response + ** to some other UNIQUE constraint is FAIL or IGNORE, then we need + ** to defer the running of the rowid conflict checking until after + ** the UNIQUE constraints have run. + */ + if( onError==OE_Replace /* IPK rule is REPLACE */ + && onError!=overrideError /* Rules for other constraints are different */ + && pTab->pIndex /* There exist other constraints */ + && !upsertIpkDelay /* IPK check already deferred by UPSERT */ + ){ + ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1; + VdbeComment((v, "defer IPK REPLACE until last")); + } + + if( isUpdate ){ + /* pkChng!=0 does not mean that the rowid has changed, only that + ** it might have changed. Skip the conflict logic below if the rowid + ** is unchanged. */ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + + /* Check to see if the new rowid already exists in the table. Skip + ** the following conflict logic if it does not. */ + VdbeNoopComment((v, "uniqueness check for ROWID")); + sqlite3VdbeVerifyAbortable(v, onError); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); + VdbeCoverage(v); + + switch( onError ){ + default: { + onError = OE_Abort; + /* no break */ deliberate_fall_through + } + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + testcase( onError==OE_Rollback ); + testcase( onError==OE_Abort ); + testcase( onError==OE_Fail ); + sqlite3RowidConstraint(pParse, onError, pTab); + break; + } + case OE_Replace: { + /* If there are DELETE triggers on this table and the + ** recursive-triggers flag is set, call GenerateRowDelete() to + ** remove the conflicting row from the table. This will fire + ** the triggers and remove both the table and index b-tree entries. + ** + ** Otherwise, if there are no triggers or the recursive-triggers + ** flag is not set, but the table has one or more indexes, call + ** GenerateRowIndexDelete(). This removes the index b-tree entries + ** only. The table b-tree entry will be replaced by the new entry + ** when it is inserted. + ** + ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called, + ** also invoke MultiWrite() to indicate that this VDBE may require + ** statement rollback (if the statement is aborted after the delete + ** takes place). Earlier versions called sqlite3MultiWrite() regardless, + ** but being more selective here allows statements like: + ** + ** REPLACE INTO t(rowid) VALUES($newrowid) + ** + ** to run without a statement journal if there are no indexes on the + ** table. + */ + if( regTrigCnt ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + regNewData, 1, 0, OE_Replace, 1, -1); + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + nReplaceTrig++; + }else{ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + assert( HasRowid(pTab) ); + /* This OP_Delete opcode fires the pre-update-hook only. It does + ** not modify the b-tree. It is more efficient to let the coming + ** OP_Insert replace the existing entry than it is to delete the + ** existing entry and then insert a new one. */ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + if( pTab->pIndex ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,-1); + } + } + seenReplace = 1; + break; + } +#ifndef SQLITE_OMIT_UPSERT + case OE_Update: { + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, 0, iDataCur); + /* no break */ deliberate_fall_through + } +#endif + case OE_Ignore: { + testcase( onError==OE_Ignore ); + sqlite3VdbeGoto(v, ignoreDest); + break; + } + } + sqlite3VdbeResolveLabel(v, addrRowidOk); + if( pUpsert && pUpsertClause!=pUpsert ){ + upsertIpkReturn = sqlite3VdbeAddOp0(v, OP_Goto); + }else if( ipkTop ){ + ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, ipkTop-1); + } + } + + /* Test all UNIQUE constraints by creating entries for each UNIQUE + ** index and making sure that duplicate entries do not already exist. + ** Compute the revised record entries for indices as we go. + ** + ** This loop also handles the case of the PRIMARY KEY index for a + ** WITHOUT ROWID table. + */ + for(pIdx = indexIteratorFirst(&sIdxIter, &ix); + pIdx; + pIdx = indexIteratorNext(&sIdxIter, &ix) + ){ + int regIdx; /* Range of registers hold conent for pIdx */ + int regR; /* Range of registers holding conflicting PK */ + int iThisCur; /* Cursor for this UNIQUE index */ + int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ + int addrConflictCk; /* First opcode in the conflict check logic */ + + if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ + if( pUpsert ){ + pUpsertClause = sqlite3UpsertOfIndex(pUpsert, pIdx); + if( upsertIpkDelay && pUpsertClause==pUpsert ){ + sqlite3VdbeJumpHere(v, upsertIpkDelay); + } + } + addrUniqueOk = sqlite3VdbeMakeLabel(pParse); + if( bAffinityDone==0 ){ + sqlite3TableAffinity(v, pTab, regNewData+1); + bAffinityDone = 1; + } + VdbeNoopComment((v, "prep index %s", pIdx->zName)); + iThisCur = iIdxCur+ix; + + + /* Skip partial indices for which the WHERE clause is not true */ + if( pIdx->pPartIdxWhere ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, + SQLITE_JUMPIFNULL); + pParse->iSelfTab = 0; + } + + /* Create a record for this index entry as it should appear after + ** the insert or update. Store that record in the aRegIdx[ix] register + */ + regIdx = aRegIdx[ix]+1; + for(i=0; inColumn; i++){ + int iField = pIdx->aiColumn[i]; + int x; + if( iField==XN_EXPR ){ + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); + pParse->iSelfTab = 0; + VdbeComment((v, "%s column %d", pIdx->zName, i)); + }else if( iField==XN_ROWID || iField==pTab->iPKey ){ + x = regNewData; + sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx+i); + VdbeComment((v, "rowid")); + }else{ + testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); + x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; + sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); + VdbeComment((v, "%s", pTab->aCol[iField].zCnName)); + } + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); + VdbeComment((v, "for %s", pIdx->zName)); +#ifdef SQLITE_ENABLE_NULL_TRIM + if( pIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + sqlite3SetMakeRecordP5(v, pIdx->pTable); + } +#endif + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0, 0); + + /* In an UPDATE operation, if this index is the PRIMARY KEY index + ** of a WITHOUT ROWID table and there has been no change the + ** primary key, then no collision is possible. The collision detection + ** logic below can all be skipped. */ + if( isUpdate && pPk==pIdx && pkChng==0 ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } + + /* Find out what action to take in case there is a uniqueness conflict */ + onError = pIdx->onError; + if( onError==OE_None ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; /* pIdx is not a UNIQUE index */ + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ + onError = OE_Abort; + } + + /* Figure out if the upsert clause applies to this index */ + if( pUpsertClause ){ + if( pUpsertClause->isDoUpdate==0 ){ + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + }else{ + onError = OE_Update; /* DO UPDATE */ + } + } + + /* Collision detection may be omitted if all of the following are true: + ** (1) The conflict resolution algorithm is REPLACE + ** (2) The table is a WITHOUT ROWID table + ** (3) There are no secondary indexes on the table + ** (4) No delete triggers need to be fired if there is a conflict + ** (5) No FK constraint counters need to be updated if a conflict occurs. + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ + assert( IsOrdinaryTable(pTab) ); +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK + if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ + && pPk==pIdx /* Condition 2 */ + && onError==OE_Replace /* Condition 1 */ + && ( 0==(db->flags&SQLITE_RecTriggers) || /* Condition 4 */ + 0==sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0)) + && ( 0==(db->flags&SQLITE_ForeignKeys) || /* Condition 5 */ + (0==pTab->u.tab.pFKey && 0==sqlite3FkReferences(pTab))) + ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ + + /* Check to see if the new index entry will be unique */ + sqlite3VdbeVerifyAbortable(v, onError); + addrConflictCk = + sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, + regIdx, pIdx->nKeyCol); VdbeCoverage(v); + + /* Generate code to handle collisions */ + regR = pIdx==pPk ? regIdx : sqlite3GetTempRange(pParse, nPkField); + if( isUpdate || onError==OE_Replace ){ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); + /* Conflict only if the rowid of the existing index entry + ** is different from old-rowid */ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + }else{ + int x; + /* Extract the PRIMARY KEY from the end of the index entry and + ** store it in registers regR..regR+nPk-1 */ + if( pIdx!=pPk ){ + for(i=0; inKeyCol; i++){ + assert( pPk->aiColumn[i]>=0 ); + x = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); + VdbeComment((v, "%s.%s", pTab->zName, + pTab->aCol[pPk->aiColumn[i]].zCnName)); + } + } + if( isUpdate ){ + /* If currently processing the PRIMARY KEY of a WITHOUT ROWID + ** table, only conflict if the new PRIMARY KEY values are actually + ** different from the old. See TH3 withoutrowid04.test. + ** + ** For a UNIQUE index, only conflict if the PRIMARY KEY values + ** 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 = (IsPrimaryKeyIndex(pIdx) ? regIdx : regR); + + for(i=0; inKeyCol; i++){ + char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); + x = pPk->aiColumn[i]; + assert( x>=0 ); + if( i==(pPk->nKeyCol-1) ){ + addrJump = addrUniqueOk; + op = OP_Eq; + } + x = sqlite3TableColumnToStorage(pTab, x); + sqlite3VdbeAddOp4(v, op, + regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ + ); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverageIf(v, op==OP_Eq); + VdbeCoverageIf(v, op==OP_Ne); + } + } + } + } + + /* Generate code that executes if the new index entry is not unique */ + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace || onError==OE_Update ); + switch( onError ){ + case OE_Rollback: + case OE_Abort: + case OE_Fail: { + testcase( onError==OE_Rollback ); + testcase( onError==OE_Abort ); + testcase( onError==OE_Fail ); + sqlite3UniqueConstraint(pParse, onError, pIdx); + break; + } +#ifndef SQLITE_OMIT_UPSERT + case OE_Update: { + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, pIdx, iIdxCur+ix); + /* no break */ deliberate_fall_through + } +#endif + case OE_Ignore: { + testcase( onError==OE_Ignore ); + sqlite3VdbeGoto(v, ignoreDest); + break; + } + default: { + int nConflictCk; /* Number of opcodes in conflict check logic */ + + assert( onError==OE_Replace ); + nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; + assert( nConflictCk>0 || db->mallocFailed ); + testcase( nConflictCk<=0 ); + testcase( nConflictCk>1 ); + if( regTrigCnt ){ + sqlite3MultiWrite(pParse); + nReplaceTrig++; + } + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorLock, iDataCur); + } + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, + regR, nPkField, 0, OE_Replace, + (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); + if( pTrigger && isUpdate ){ + sqlite3VdbeAddOp1(v, OP_CursorUnlock, iDataCur); + } + if( regTrigCnt ){ + int addrBypass; /* Jump destination to bypass recheck logic */ + + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + addrBypass = sqlite3VdbeAddOp0(v, OP_Goto); /* Bypass recheck */ + VdbeComment((v, "bypass recheck")); + + /* Here we insert code that will be invoked after all constraint + ** checks have run, if and only if one or more replace triggers + ** fired. */ + sqlite3VdbeResolveLabel(v, lblRecheckOk); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + if( pIdx->pPartIdxWhere ){ + /* Bypass the recheck if this partial index is not defined + ** for the current row */ + sqlite3VdbeAddOp2(v, OP_IsNull, regIdx-1, lblRecheckOk); + VdbeCoverage(v); + } + /* Copy the constraint check code from above, except change + ** the constraint-ok jump destination to be the address of + ** the next retest block */ + while( nConflictCk>0 ){ + VdbeOp x; /* Conflict check opcode to copy */ + /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. + ** Hence, make a complete copy of the opcode, rather than using + ** a pointer to the opcode. */ + x = *sqlite3VdbeGetOp(v, addrConflictCk); + if( x.opcode!=OP_IdxRowid ){ + int p2; /* New P2 value for copied conflict check opcode */ + const char *zP4; + if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){ + p2 = lblRecheckOk; + }else{ + p2 = x.p2; + } + zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z; + sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, zP4, x.p4type); + sqlite3VdbeChangeP5(v, x.p5); + VdbeCoverageIf(v, p2!=x.p2); + } + nConflictCk--; + addrConflictCk++; + } + /* If the retest fails, issue an abort */ + sqlite3UniqueConstraint(pParse, OE_Abort, pIdx); + + sqlite3VdbeJumpHere(v, addrBypass); /* Terminate the recheck bypass */ + } + seenReplace = 1; + break; + } + } + sqlite3VdbeResolveLabel(v, addrUniqueOk); + if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField); + if( pUpsertClause + && upsertIpkReturn + && sqlite3UpsertNextIsIPK(pUpsertClause) + ){ + sqlite3VdbeGoto(v, upsertIpkDelay+1); + sqlite3VdbeJumpHere(v, upsertIpkReturn); + upsertIpkReturn = 0; + } + } + + /* If the IPK constraint is a REPLACE, run it last */ + if( ipkTop ){ + sqlite3VdbeGoto(v, ipkTop); + VdbeComment((v, "Do IPK REPLACE")); + assert( ipkBottom>0 ); + sqlite3VdbeJumpHere(v, ipkBottom); + } + + /* Recheck all uniqueness constraints after replace triggers have run */ + testcase( regTrigCnt!=0 && nReplaceTrig==0 ); + assert( regTrigCnt!=0 || nReplaceTrig==0 ); + if( nReplaceTrig ){ + sqlite3VdbeAddOp2(v, OP_IfNot, regTrigCnt, lblRecheckOk);VdbeCoverage(v); + if( !pPk ){ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRecheck, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRecheck, regNewData); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, OE_Abort, pTab); + }else{ + sqlite3VdbeGoto(v, addrRecheck); + } + sqlite3VdbeResolveLabel(v, lblRecheckOk); + } + + /* Generate the table record */ + if( HasRowid(pTab) ){ + int regRec = aRegIdx[ix]; + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nNVCol, regRec); + sqlite3SetMakeRecordP5(v, pTab); + if( !bAffinityDone ){ + sqlite3TableAffinity(v, pTab, 0); + } + } + + *pbMayReplace = seenReplace; + VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace)); +} + +#ifdef SQLITE_ENABLE_NULL_TRIM +/* +** Change the P5 operand on the last opcode (which should be an OP_MakeRecord) +** to be the number of columns in table pTab that must not be NULL-trimmed. +** +** Or if no columns of pTab may be NULL-trimmed, leave P5 at zero. +*/ +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){ + u16 i; + + /* Records with omitted columns are only allowed for schema format + ** version 2 and later (SQLite version 3.1.4, 2005-02-20). */ + if( pTab->pSchema->file_format<2 ) return; + + for(i=pTab->nCol-1; i>0; i--){ + if( pTab->aCol[i].iDflt!=0 ) break; + if( pTab->aCol[i].colFlags & COLFLAG_PRIMKEY ) break; + } + sqlite3VdbeChangeP5(v, i+1); +} +#endif + +/* +** Table pTab is a WITHOUT ROWID table that is being written to. The cursor +** number is iCur, and register regData contains the new record for the +** PK index. This function adds code to invoke the pre-update hook, +** if one is registered. +*/ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +static void codeWithoutRowidPreupdate( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being updated */ + int iCur, /* Cursor number for table */ + int regData /* Data containing new record */ +){ + Vdbe *v = pParse->pVdbe; + int r = sqlite3GetTempReg(pParse); + assert( !HasRowid(pTab) ); + assert( 0==(pParse->db->mDbFlags & DBFLAG_Vacuum) || CORRUPT_DB ); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, iCur, regData, r, (char*)pTab, P4_TABLE); + sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); +} +#else +# define codeWithoutRowidPreupdate(a,b,c,d) +#endif + +/* +** This routine generates code to finish the INSERT or UPDATE operation +** that was started by a prior call to sqlite3GenerateConstraintChecks. +** A consecutive range of registers starting at regNewData contains the +** rowid and the content to be inserted. +** +** The arguments to this routine should be the same as the first six +** arguments to sqlite3GenerateConstraintChecks. +*/ +SQLITE_PRIVATE void sqlite3CompleteInsertion( + Parse *pParse, /* The parser context */ + Table *pTab, /* the table into which we are inserting */ + int iDataCur, /* Cursor of the canonical data source */ + int iIdxCur, /* First index cursor */ + int regNewData, /* Range of content */ + int *aRegIdx, /* Register used by each index. 0 for unused indices */ + int update_flags, /* True for UPDATE, False for INSERT */ + int appendBias, /* True if this is likely to be an append */ + int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */ +){ + Vdbe *v; /* Prepared statements under construction */ + Index *pIdx; /* An index being inserted or updated */ + u8 pik_flags; /* flag values passed to the btree insert */ + int i; /* Loop counter */ + + assert( update_flags==0 + || update_flags==OPFLAG_ISUPDATE + || update_flags==(OPFLAG_ISUPDATE|OPFLAG_SAVEPOSITION) + ); + + v = pParse->pVdbe; + assert( v!=0 ); + assert( !IsView(pTab) ); /* This table is not a VIEW */ + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + /* All REPLACE indexes are at the end of the list */ + assert( pIdx->onError!=OE_Replace + || pIdx->pNext==0 + || pIdx->pNext->onError==OE_Replace ); + if( aRegIdx[i]==0 ) continue; + if( pIdx->pPartIdxWhere ){ + sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + } + pik_flags = (useSeekResult ? OPFLAG_USESEEKRESULT : 0); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + pik_flags |= OPFLAG_NCHANGE; + pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); + if( update_flags==0 ){ + codeWithoutRowidPreupdate(pParse, pTab, iIdxCur+i, aRegIdx[i]); + } + } + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i], + aRegIdx[i]+1, + pIdx->uniqNotNull ? pIdx->nKeyCol: pIdx->nColumn); + sqlite3VdbeChangeP5(v, pik_flags); + } + if( !HasRowid(pTab) ) return; + if( pParse->nested ){ + pik_flags = 0; + }else{ + pik_flags = OPFLAG_NCHANGE; + pik_flags |= (update_flags?update_flags:OPFLAG_LASTROWID); + } + if( appendBias ){ + pik_flags |= OPFLAG_APPEND; + } + if( useSeekResult ){ + pik_flags |= OPFLAG_USESEEKRESULT; + } + sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, aRegIdx[i], regNewData); + if( !pParse->nested ){ + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } + sqlite3VdbeChangeP5(v, pik_flags); +} + +/* +** Allocate cursors for the pTab table and all its indices and generate +** code to open and initialized those cursors. +** +** The cursor for the object that contains the complete data (normally +** the table itself, but the PRIMARY KEY index in the case of a WITHOUT +** ROWID table) is returned in *piDataCur. The first index cursor is +** returned in *piIdxCur. The number of indices is returned. +** +** Use iBase as the first cursor (either the *piDataCur for rowid tables +** or the first index for WITHOUT ROWID tables) if it is non-negative. +** If iBase is negative, then allocate the next available cursor. +** +** For a rowid table, *piDataCur will be exactly one less than *piIdxCur. +** For a WITHOUT ROWID table, *piDataCur will be somewhere in the range +** of *piIdxCurs, depending on where the PRIMARY KEY index appears on the +** pTab->pIndex list. +** +** If pTab is a virtual table, then this routine is a no-op and the +** *piDataCur and *piIdxCur values are left uninitialized. +*/ +SQLITE_PRIVATE int sqlite3OpenTableAndIndices( + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table to be opened */ + int op, /* OP_OpenRead or OP_OpenWrite */ + u8 p5, /* P5 value for OP_Open* opcodes (except on WITHOUT ROWID) */ + int iBase, /* Use this for the table cursor, if there is one */ + u8 *aToOpen, /* If not NULL: boolean for each table and index */ + int *piDataCur, /* Write the database source cursor number here */ + int *piIdxCur /* Write the first index cursor number here */ +){ + int i; + int iDb; + int iDataCur; + Index *pIdx; + Vdbe *v; + + assert( op==OP_OpenRead || op==OP_OpenWrite ); + assert( op==OP_OpenWrite || p5==0 ); + if( IsVirtual(pTab) ){ + /* This routine is a no-op for virtual tables. Leave the output + ** variables *piDataCur and *piIdxCur set to illegal cursor numbers + ** for improved error detection. */ + *piDataCur = *piIdxCur = -999; + return 0; + } + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + v = pParse->pVdbe; + assert( v!=0 ); + if( iBase<0 ) iBase = pParse->nTab; + iDataCur = iBase++; + if( piDataCur ) *piDataCur = iDataCur; + if( HasRowid(pTab) && (aToOpen==0 || aToOpen[0]) ){ + sqlite3OpenTable(pParse, iDataCur, iDb, pTab, op); + }else{ + sqlite3TableLock(pParse, iDb, pTab->tnum, op==OP_OpenWrite, pTab->zName); + } + if( piIdxCur ) *piIdxCur = iBase; + for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ + int iIdxCur = iBase++; + assert( pIdx->pSchema==pTab->pSchema ); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + if( piDataCur ) *piDataCur = iIdxCur; + p5 = 0; + } + if( aToOpen==0 || aToOpen[i+1] ){ + sqlite3VdbeAddOp3(v, op, iIdxCur, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + sqlite3VdbeChangeP5(v, p5); + VdbeComment((v, "%s", pIdx->zName)); + } + } + if( iBase>pParse->nTab ) pParse->nTab = iBase; + return i; +} + + +#ifdef SQLITE_TEST +/* +** The following global variable is incremented whenever the +** transfer optimization is used. This is used for testing +** purposes only - to make sure the transfer optimization really +** is happening when it is supposed to. +*/ +SQLITE_API int sqlite3_xferopt_count; +#endif /* SQLITE_TEST */ + + +#ifndef SQLITE_OMIT_XFER_OPT +/* +** Check to see if index pSrc is compatible as a source of data +** for index pDest in an insert transfer optimization. The rules +** for a compatible index: +** +** * The index is over the same set of columns +** * The same DESC and ASC markings occurs on all columns +** * The same onError processing (OE_Abort, OE_Ignore, etc) +** * The same collating sequence on each column +** * The index has the exact same WHERE clause +*/ +static int xferCompatibleIndex(Index *pDest, Index *pSrc){ + int i; + assert( pDest && pSrc ); + assert( pDest->pTable!=pSrc->pTable ); + if( pDest->nKeyCol!=pSrc->nKeyCol || pDest->nColumn!=pSrc->nColumn ){ + return 0; /* Different number of columns */ + } + if( pDest->onError!=pSrc->onError ){ + return 0; /* Different conflict resolution strategies */ + } + for(i=0; inKeyCol; i++){ + if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ + return 0; /* Different columns indexed */ + } + if( pSrc->aiColumn[i]==XN_EXPR ){ + assert( pSrc->aColExpr!=0 && pDest->aColExpr!=0 ); + if( sqlite3ExprCompare(0, pSrc->aColExpr->a[i].pExpr, + pDest->aColExpr->a[i].pExpr, -1)!=0 ){ + return 0; /* Different expressions in the index */ + } + } + if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ + return 0; /* Different sort orders */ + } + if( sqlite3_stricmp(pSrc->azColl[i],pDest->azColl[i])!=0 ){ + return 0; /* Different collating sequences */ + } + } + if( sqlite3ExprCompare(0, pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1) ){ + return 0; /* Different WHERE clauses */ + } + + /* If no test above fails then the indices must be compatible */ + return 1; +} + +/* +** Attempt the transfer optimization on INSERTs of the form +** +** INSERT INTO tab1 SELECT * FROM tab2; +** +** The xfer optimization transfers raw records from tab2 over to tab1. +** Columns are not decoded and reassembled, which greatly improves +** performance. Raw index records are transferred in the same way. +** +** The xfer optimization is only attempted if tab1 and tab2 are compatible. +** There are lots of rules for determining compatibility - see comments +** embedded in the code for details. +** +** This routine returns TRUE if the optimization is guaranteed to be used. +** Sometimes the xfer optimization will only work if the destination table +** is empty - a factor that can only be determined at run-time. In that +** case, this routine generates code for the xfer optimization but also +** does a test to see if the destination table is empty and jumps over the +** xfer optimization code if the test fails. In that case, this routine +** returns FALSE so that the caller will know to go ahead and generate +** an unoptimized transfer. This routine also returns FALSE if there +** is no chance that the xfer optimization can be applied. +** +** This optimization is particularly useful at making VACUUM run faster. +*/ +static int xferOptimization( + Parse *pParse, /* Parser context */ + Table *pDest, /* The table we are inserting into */ + Select *pSelect, /* A SELECT statement to use as the data source */ + int onError, /* How to handle constraint errors */ + int iDbDest /* The database of pDest */ +){ + sqlite3 *db = pParse->db; + ExprList *pEList; /* The result set of the SELECT */ + Table *pSrc; /* The table in the FROM clause of SELECT */ + Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ + SrcItem *pItem; /* An element of pSelect->pSrc */ + int i; /* Loop counter */ + int iDbSrc; /* The database of pSrc */ + int iSrc, iDest; /* Cursors from source and destination */ + int addr1, addr2; /* Loop addresses */ + int emptyDestTest = 0; /* Address of test for empty pDest */ + int emptySrcTest = 0; /* Address of test for empty pSrc */ + Vdbe *v; /* The VDBE we are building */ + int regAutoinc; /* Memory register used by AUTOINC */ + int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ + int regData, regRowid; /* Registers holding data and rowid */ + + assert( pSelect!=0 ); + if( pParse->pWith || pSelect->pWith ){ + /* Do not attempt to process this query if there are an WITH clauses + ** attached to it. Proceeding may generate a false "no such table: xxx" + ** error if pSelect reads from a CTE named "xxx". */ + return 0; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pDest) ){ + return 0; /* tab1 must not be a virtual table */ + } +#endif + if( onError==OE_Default ){ + if( pDest->iPKey>=0 ) onError = pDest->keyConf; + if( onError==OE_Default ) onError = OE_Abort; + } + assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ + if( pSelect->pSrc->nSrc!=1 ){ + return 0; /* FROM clause must have exactly one term */ + } + if( pSelect->pSrc->a[0].pSelect ){ + return 0; /* FROM clause cannot contain a subquery */ + } + if( pSelect->pWhere ){ + return 0; /* SELECT may not have a WHERE clause */ + } + if( pSelect->pOrderBy ){ + return 0; /* SELECT may not have an ORDER BY clause */ + } + /* Do not need to test for a HAVING clause. If HAVING is present but + ** there is no ORDER BY, we will get an error. */ + if( pSelect->pGroupBy ){ + return 0; /* SELECT may not have a GROUP BY clause */ + } + if( pSelect->pLimit ){ + return 0; /* SELECT may not have a LIMIT clause */ + } + if( pSelect->pPrior ){ + return 0; /* SELECT may not be a compound query */ + } + if( pSelect->selFlags & SF_Distinct ){ + return 0; /* SELECT may not be DISTINCT */ + } + pEList = pSelect->pEList; + assert( pEList!=0 ); + if( pEList->nExpr!=1 ){ + return 0; /* The result set must have exactly one column */ + } + assert( pEList->a[0].pExpr ); + if( pEList->a[0].pExpr->op!=TK_ASTERISK ){ + return 0; /* The result set must be the special operator "*" */ + } + + /* At this point we have established that the statement is of the + ** correct syntactic form to participate in this optimization. Now + ** we have to check the semantics. + */ + pItem = pSelect->pSrc->a; + pSrc = sqlite3LocateTableItem(pParse, 0, pItem); + if( pSrc==0 ){ + return 0; /* FROM clause does not contain a real table */ + } + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_schema.rootpage */ + return 0; /* tab1 and tab2 may not be the same table */ + } + if( HasRowid(pDest)!=HasRowid(pSrc) ){ + return 0; /* source and destination must both be WITHOUT ROWID or not */ + } + if( !IsOrdinaryTable(pSrc) ){ + return 0; /* tab2 may not be a view or virtual table */ + } + if( pDest->nCol!=pSrc->nCol ){ + return 0; /* Number of columns must be the same in tab1 and tab2 */ + } + if( pDest->iPKey!=pSrc->iPKey ){ + return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ + } + if( (pDest->tabFlags & TF_Strict)!=0 && (pSrc->tabFlags & TF_Strict)==0 ){ + return 0; /* Cannot feed from a non-strict into a strict table */ + } + for(i=0; inCol; i++){ + Column *pDestCol = &pDest->aCol[i]; + Column *pSrcCol = &pSrc->aCol[i]; +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS + if( (db->mDbFlags & DBFLAG_Vacuum)==0 + && (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN + ){ + return 0; /* Neither table may have __hidden__ columns */ + } +#endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Even if tables t1 and t2 have identical schemas, if they contain + ** generated columns, then this statement is semantically incorrect: + ** + ** INSERT INTO t2 SELECT * FROM t1; + ** + ** The reason is that generated column values are returned by the + ** the SELECT statement on the right but the INSERT statement on the + ** left wants them to be omitted. + ** + ** Nevertheless, this is a useful notational shorthand to tell SQLite + ** to do a bulk transfer all of the content from t1 over to t2. + ** + ** We could, in theory, disable this (except for internal use by the + ** VACUUM command where it is actually needed). But why do that? It + ** seems harmless enough, and provides a useful service. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED) != + (pSrcCol->colFlags & COLFLAG_GENERATED) ){ + return 0; /* Both columns have the same generated-column type */ + } + /* But the transfer is only allowed if both the source and destination + ** tables have the exact same expressions for generated columns. + ** This requirement could be relaxed for VIRTUAL columns, I suppose. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ + if( sqlite3ExprCompare(0, + sqlite3ColumnExpr(pSrc, pSrcCol), + sqlite3ColumnExpr(pDest, pDestCol), -1)!=0 ){ + testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pDestCol->colFlags & COLFLAG_STORED ); + return 0; /* Different generator expressions */ + } + } +#endif + if( pDestCol->affinity!=pSrcCol->affinity ){ + return 0; /* Affinity must be the same on all columns */ + } + if( sqlite3_stricmp(sqlite3ColumnColl(pDestCol), + sqlite3ColumnColl(pSrcCol))!=0 ){ + return 0; /* Collating sequence must be the same on all columns */ + } + if( pDestCol->notNull && !pSrcCol->notNull ){ + return 0; /* tab2 must be NOT NULL if tab1 is */ + } + /* Default values for second and subsequent columns need to match. */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){ + Expr *pDestExpr = sqlite3ColumnExpr(pDest, pDestCol); + Expr *pSrcExpr = sqlite3ColumnExpr(pSrc, pSrcCol); + assert( pDestExpr==0 || pDestExpr->op==TK_SPAN ); + assert( pDestExpr==0 || !ExprHasProperty(pDestExpr, EP_IntValue) ); + assert( pSrcExpr==0 || pSrcExpr->op==TK_SPAN ); + assert( pSrcExpr==0 || !ExprHasProperty(pSrcExpr, EP_IntValue) ); + if( (pDestExpr==0)!=(pSrcExpr==0) + || (pDestExpr!=0 && strcmp(pDestExpr->u.zToken, + pSrcExpr->u.zToken)!=0) + ){ + return 0; /* Default values must be the same for all columns */ + } + } + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + if( IsUniqueIndex(pDestIdx) ){ + destHasUniqueIdx = 1; + } + for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + if( pSrcIdx==0 ){ + return 0; /* pDestIdx has no corresponding index in pSrc */ + } + if( pSrcIdx->tnum==pDestIdx->tnum && pSrc->pSchema==pDest->pSchema + && sqlite3FaultSim(411)==SQLITE_OK ){ + /* The sqlite3FaultSim() call allows this corruption test to be + ** bypassed during testing, in order to exercise other corruption tests + ** further downstream. */ + return 0; /* Corrupt schema - two indexes on the same btree */ + } + } +#ifndef SQLITE_OMIT_CHECK + if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) ){ + return 0; /* Tables have different CHECK constraints. Ticket #2252 */ + } +#endif +#ifndef SQLITE_OMIT_FOREIGN_KEY + /* Disallow the transfer optimization if the destination table constains + ** any foreign key constraints. This is more restrictive than necessary. + ** But the main beneficiary of the transfer optimization is the VACUUM + ** command, and the VACUUM command disables foreign key constraints. So + ** the extra complication to make this rule less restrictive is probably + ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] + */ + assert( IsOrdinaryTable(pDest) ); + if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->u.tab.pFKey!=0 ){ + return 0; + } +#endif + if( (db->flags & SQLITE_CountRows)!=0 ){ + return 0; /* xfer opt does not play well with PRAGMA count_changes */ + } + + /* If we get this far, it means that the xfer optimization is at + ** least a possibility, though it might only work if the destination + ** table (tab1) is initially empty. + */ +#ifdef SQLITE_TEST + sqlite3_xferopt_count++; +#endif + iDbSrc = sqlite3SchemaToIndex(db, pSrc->pSchema); + v = sqlite3GetVdbe(pParse); + sqlite3CodeVerifySchema(pParse, iDbSrc); + iSrc = pParse->nTab++; + iDest = pParse->nTab++; + regAutoinc = autoIncBegin(pParse, iDbDest, pDest); + regData = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Null, 0, regData); + regRowid = sqlite3GetTempReg(pParse); + sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); + assert( HasRowid(pDest) || destHasUniqueIdx ); + if( (db->mDbFlags & DBFLAG_Vacuum)==0 && ( + (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */ + || destHasUniqueIdx /* (2) */ + || (onError!=OE_Abort && onError!=OE_Rollback) /* (3) */ + )){ + /* In some circumstances, we are able to run the xfer optimization + ** only if the destination table is initially empty. Unless the + ** DBFLAG_Vacuum flag is set, this block generates code to make + ** that determination. If DBFLAG_Vacuum is set, then the destination + ** table is always empty. + ** + ** Conditions under which the destination must be empty: + ** + ** (1) There is no INTEGER PRIMARY KEY but there are indices. + ** (If the destination is not initially empty, the rowid fields + ** of index entries might need to change.) + ** + ** (2) The destination has a unique index. (The xfer optimization + ** is unable to test uniqueness.) + ** + ** (3) onError is something other than OE_Abort and OE_Rollback. + */ + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); VdbeCoverage(v); + emptyDestTest = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, addr1); + } + if( HasRowid(pSrc) ){ + u8 insFlags; + sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); + emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); + if( pDest->iPKey>=0 ){ + addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + if( (db->mDbFlags & DBFLAG_Vacuum)==0 ){ + sqlite3VdbeVerifyAbortable(v, onError); + addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, onError, pDest); + sqlite3VdbeJumpHere(v, addr2); + } + autoIncStep(pParse, regAutoinc, regRowid); + }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ + addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); + }else{ + addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + assert( (pDest->tabFlags & TF_Autoincrement)==0 ); + } + + if( db->mDbFlags & DBFLAG_Vacuum ){ + sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); + insFlags = OPFLAG_APPEND|OPFLAG_USESEEKRESULT|OPFLAG_PREFORMAT; + }else{ + insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND|OPFLAG_PREFORMAT; + } +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( (db->mDbFlags & DBFLAG_Vacuum)==0 ){ + sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); + insFlags &= ~OPFLAG_PREFORMAT; + }else +#endif + { + sqlite3VdbeAddOp3(v, OP_RowCell, iDest, iSrc, regRowid); + } + sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); + if( (db->mDbFlags & DBFLAG_Vacuum)==0 ){ + sqlite3VdbeChangeP4(v, -1, (char*)pDest, P4_TABLE); + } + sqlite3VdbeChangeP5(v, insFlags); + + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + }else{ + sqlite3TableLock(pParse, iDbDest, pDest->tnum, 1, pDest->zName); + sqlite3TableLock(pParse, iDbSrc, pSrc->tnum, 0, pSrc->zName); + } + for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + u8 idxInsFlags = 0; + for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){ + if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; + } + assert( pSrcIdx ); + sqlite3VdbeAddOp3(v, OP_OpenRead, iSrc, pSrcIdx->tnum, iDbSrc); + sqlite3VdbeSetP4KeyInfo(pParse, pSrcIdx); + VdbeComment((v, "%s", pSrcIdx->zName)); + sqlite3VdbeAddOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest); + sqlite3VdbeSetP4KeyInfo(pParse, pDestIdx); + sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); + VdbeComment((v, "%s", pDestIdx->zName)); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); + if( db->mDbFlags & DBFLAG_Vacuum ){ + /* This INSERT command is part of a VACUUM operation, which guarantees + ** that the destination table is empty. If all indexed columns use + ** collation sequence BINARY, then it can also be assumed that the + ** index will be populated by inserting keys in strictly sorted + ** order. In this case, instead of seeking within the b-tree as part + ** of every OP_IdxInsert opcode, an OP_SeekEnd is added before the + ** OP_IdxInsert to seek to the point within the b-tree where each key + ** should be inserted. This is faster. + ** + ** If any of the indexed columns use a collation sequence other than + ** BINARY, this optimization is disabled. This is because the user + ** might change the definition of a collation sequence and then run + ** a VACUUM command. In that case keys may not be written in strictly + ** sorted order. */ + for(i=0; inColumn; i++){ + const char *zColl = pSrcIdx->azColl[i]; + if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; + } + if( i==pSrcIdx->nColumn ){ + idxInsFlags = OPFLAG_USESEEKRESULT|OPFLAG_PREFORMAT; + sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); + sqlite3VdbeAddOp2(v, OP_RowCell, iDest, iSrc); + } + }else if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + idxInsFlags |= OPFLAG_NCHANGE; + } + if( idxInsFlags!=(OPFLAG_USESEEKRESULT|OPFLAG_PREFORMAT) ){ + sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); + if( (db->mDbFlags & DBFLAG_Vacuum)==0 + && !HasRowid(pDest) + && IsPrimaryKeyIndex(pDestIdx) + ){ + codeWithoutRowidPreupdate(pParse, pDest, iDest, regData); + } + } + sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); + sqlite3VdbeChangeP5(v, idxInsFlags|OPFLAG_APPEND); + sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + } + if( emptySrcTest ) sqlite3VdbeJumpHere(v, emptySrcTest); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regData); + if( emptyDestTest ){ + sqlite3AutoincrementEnd(pParse); + sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0); + sqlite3VdbeJumpHere(v, emptyDestTest); + sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); + return 0; + }else{ + return 1; + } +} +#endif /* SQLITE_OMIT_XFER_OPT */ + +/************** End of insert.c **********************************************/ +/************** Begin file legacy.c ******************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** implement the programmer interface to the library. Routines in +** other files are for internal use by SQLite and should not be +** accessed by users of the library. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Execute SQL code. Return one of the SQLITE_ success/failure +** codes. Also write an error message into memory obtained from +** malloc() and make *pzErrMsg point to that message. +** +** If the SQL is a query, then for each row in the query result +** the xCallback() function is called. pArg becomes the first +** argument to xCallback(). If xCallback=NULL then no callback +** is invoked, even for queries. +*/ +SQLITE_API int sqlite3_exec( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + sqlite3_callback xCallback, /* Invoke this callback routine */ + void *pArg, /* First argument to xCallback() */ + char **pzErrMsg /* Write error messages here */ +){ + int rc = SQLITE_OK; /* Return code */ + const char *zLeftover; /* Tail of unprocessed SQL */ + sqlite3_stmt *pStmt = 0; /* The current SQL statement */ + char **azCols = 0; /* Names of result columns */ + int callbackIsInit; /* True if callback data is initialized */ + + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if( zSql==0 ) zSql = ""; + + sqlite3_mutex_enter(db->mutex); + sqlite3Error(db, SQLITE_OK); + while( rc==SQLITE_OK && zSql[0] ){ + int nCol = 0; + char **azVals = 0; + + pStmt = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); + assert( rc==SQLITE_OK || pStmt==0 ); + if( rc!=SQLITE_OK ){ + continue; + } + if( !pStmt ){ + /* this happens for a comment or white-space */ + zSql = zLeftover; + continue; + } + callbackIsInit = 0; + + while( 1 ){ + int i; + rc = sqlite3_step(pStmt); + + /* Invoke the callback function if required */ + if( xCallback && (SQLITE_ROW==rc || + (SQLITE_DONE==rc && !callbackIsInit + && db->flags&SQLITE_NullCallback)) ){ + if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); + azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); + if( azCols==0 ){ + goto exec_out; + } + for(i=0; ierrMask)==rc ); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/************** End of legacy.c **********************************************/ +/************** Begin file loadext.c *****************************************/ +/* +** 2006 June 7 +** +** 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 contains code used to dynamically load extensions into +** the SQLite library. +*/ + +#ifndef SQLITE_CORE + #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ +#endif +/************** Include sqlite3ext.h in the middle of loadext.c **************/ +/************** Begin file sqlite3ext.h **************************************/ +/* +** 2006 June 7 +** +** 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 header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +*/ +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +/* #include "sqlite3.h" */ + +/* +** The following structure holds pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each other's shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const void*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, + const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*xsnprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, + char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, + sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, + void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, + int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*), + void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); + int (*xthreadsafe)(void); + void (*result_zeroblob)(sqlite3_context*,int); + void (*result_error_code)(sqlite3_context*,int); + int (*test_control)(int, ...); + void (*randomness)(int,void*); + sqlite3 *(*context_db_handle)(sqlite3_context*); + int (*extended_result_codes)(sqlite3*,int); + int (*limit)(sqlite3*,int,int); + sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); + const char *(*sql)(sqlite3_stmt*); + int (*status)(int,int*,int*,int); + int (*backup_finish)(sqlite3_backup*); + sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); + int (*backup_pagecount)(sqlite3_backup*); + int (*backup_remaining)(sqlite3_backup*); + int (*backup_step)(sqlite3_backup*,int); + const char *(*compileoption_get)(int); + int (*compileoption_used)(const char*); + int (*create_function_v2)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*)); + int (*db_config)(sqlite3*,int,...); + sqlite3_mutex *(*db_mutex)(sqlite3*); + int (*db_status)(sqlite3*,int,int*,int*,int); + int (*extended_errcode)(sqlite3*); + void (*log)(int,const char*,...); + sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); + const char *(*sourceid)(void); + int (*stmt_status)(sqlite3_stmt*,int,int); + int (*strnicmp)(const char*,const char*,int); + int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); + int (*wal_autocheckpoint)(sqlite3*,int); + int (*wal_checkpoint)(sqlite3*,const char*); + void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); + int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); + int (*vtab_config)(sqlite3*,int op,...); + int (*vtab_on_conflict)(sqlite3*); + /* Version 3.7.16 and later */ + int (*close_v2)(sqlite3*); + const char *(*db_filename)(sqlite3*,const char*); + int (*db_readonly)(sqlite3*,const char*); + int (*db_release_memory)(sqlite3*); + const char *(*errstr)(int); + int (*stmt_busy)(sqlite3_stmt*); + int (*stmt_readonly)(sqlite3_stmt*); + int (*stricmp)(const char*,const char*); + int (*uri_boolean)(const char*,const char*,int); + sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); + const char *(*uri_parameter)(const char*,const char*); + char *(*xvsnprintf)(int,char*,const char*,va_list); + int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); + /* Version 3.8.7 and later */ + int (*auto_extension)(void(*)(void)); + int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64, + void(*)(void*)); + int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64, + void(*)(void*),unsigned char); + int (*cancel_auto_extension)(void(*)(void)); + int (*load_extension)(sqlite3*,const char*,const char*,char**); + void *(*malloc64)(sqlite3_uint64); + sqlite3_uint64 (*msize)(void*); + void *(*realloc64)(void*,sqlite3_uint64); + void (*reset_auto_extension)(void); + void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64, + void(*)(void*)); + void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, + void(*)(void*), unsigned char); + int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); + /* Version 3.18.0 and later */ + void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64); + /* Version 3.20.0 and later */ + int (*prepare_v3)(sqlite3*,const char*,int,unsigned int, + sqlite3_stmt**,const char**); + int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int, + sqlite3_stmt**,const void**); + int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); + void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); + void *(*value_pointer)(sqlite3_value*,const char*); + int (*vtab_nochange)(sqlite3_context*); + int (*value_nochange)(sqlite3_value*); + const char *(*vtab_collation)(sqlite3_index_info*,int); + /* Version 3.24.0 and later */ + int (*keyword_count)(void); + int (*keyword_name)(int,const char**,int*); + int (*keyword_check)(const char*,int); + sqlite3_str *(*str_new)(sqlite3*); + char *(*str_finish)(sqlite3_str*); + void (*str_appendf)(sqlite3_str*, const char *zFormat, ...); + void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list); + void (*str_append)(sqlite3_str*, const char *zIn, int N); + void (*str_appendall)(sqlite3_str*, const char *zIn); + void (*str_appendchar)(sqlite3_str*, int N, char C); + void (*str_reset)(sqlite3_str*); + int (*str_errcode)(sqlite3_str*); + int (*str_length)(sqlite3_str*); + char *(*str_value)(sqlite3_str*); + /* Version 3.25.0 and later */ + int (*create_window_function)(sqlite3*,const char*,int,int,void*, + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInv)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*)); + /* Version 3.26.0 and later */ + const char *(*normalized_sql)(sqlite3_stmt*); + /* Version 3.28.0 and later */ + int (*stmt_isexplain)(sqlite3_stmt*); + int (*value_frombind)(sqlite3_value*); + /* Version 3.30.0 and later */ + int (*drop_modules)(sqlite3*,const char**); + /* Version 3.31.0 and later */ + sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); + const char *(*uri_key)(const char*,int); + const char *(*filename_database)(const char*); + const char *(*filename_journal)(const char*); + const char *(*filename_wal)(const char*); + /* Version 3.32.0 and later */ + char *(*create_filename)(const char*,const char*,const char*, + int,const char**); + void (*free_filename)(char*); + sqlite3_file *(*database_file_object)(const char*); + /* Version 3.34.0 and later */ + int (*txn_state)(sqlite3*,const char*); + /* Version 3.36.1 and later */ + sqlite3_int64 (*changes64)(sqlite3*); + sqlite3_int64 (*total_changes64)(sqlite3*); + /* Version 3.37.0 and later */ + int (*autovacuum_pages)(sqlite3*, + unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), + void*, void(*)(void*)); + /* Version 3.38.0 and later */ + int (*error_offset)(sqlite3*); + int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**); + int (*vtab_distinct)(sqlite3_index_info*); + int (*vtab_in)(sqlite3_index_info*,int,int); + int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); + int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); + /* Version 3.39.0 and later */ + int (*deserialize)(sqlite3*,const char*,unsigned char*, + sqlite3_int64,sqlite3_int64,unsigned); + unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*, + unsigned int); + const char *(*db_name)(sqlite3*,int); +}; + +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + +/* +** The following macros redefine the API routines so that they are +** redirected through the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->xsnprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +/* Version 3.18.0 and later */ +#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid +/* Version 3.20.0 and later */ +#define sqlite3_prepare_v3 sqlite3_api->prepare_v3 +#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3 +#define sqlite3_bind_pointer sqlite3_api->bind_pointer +#define sqlite3_result_pointer sqlite3_api->result_pointer +#define sqlite3_value_pointer sqlite3_api->value_pointer +/* Version 3.22.0 and later */ +#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange +#define sqlite3_value_nochange sqlite3_api->value_nochange +#define sqlite3_vtab_collation sqlite3_api->vtab_collation +/* Version 3.24.0 and later */ +#define sqlite3_keyword_count sqlite3_api->keyword_count +#define sqlite3_keyword_name sqlite3_api->keyword_name +#define sqlite3_keyword_check sqlite3_api->keyword_check +#define sqlite3_str_new sqlite3_api->str_new +#define sqlite3_str_finish sqlite3_api->str_finish +#define sqlite3_str_appendf sqlite3_api->str_appendf +#define sqlite3_str_vappendf sqlite3_api->str_vappendf +#define sqlite3_str_append sqlite3_api->str_append +#define sqlite3_str_appendall sqlite3_api->str_appendall +#define sqlite3_str_appendchar sqlite3_api->str_appendchar +#define sqlite3_str_reset sqlite3_api->str_reset +#define sqlite3_str_errcode sqlite3_api->str_errcode +#define sqlite3_str_length sqlite3_api->str_length +#define sqlite3_str_value sqlite3_api->str_value +/* Version 3.25.0 and later */ +#define sqlite3_create_window_function sqlite3_api->create_window_function +/* Version 3.26.0 and later */ +#define sqlite3_normalized_sql sqlite3_api->normalized_sql +/* Version 3.28.0 and later */ +#define sqlite3_stmt_isexplain sqlite3_api->stmt_isexplain +#define sqlite3_value_frombind sqlite3_api->value_frombind +/* Version 3.30.0 and later */ +#define sqlite3_drop_modules sqlite3_api->drop_modules +/* Version 3.31.0 and later */ +#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 +#define sqlite3_uri_key sqlite3_api->uri_key +#define sqlite3_filename_database sqlite3_api->filename_database +#define sqlite3_filename_journal sqlite3_api->filename_journal +#define sqlite3_filename_wal sqlite3_api->filename_wal +/* Version 3.32.0 and later */ +#define sqlite3_create_filename sqlite3_api->create_filename +#define sqlite3_free_filename sqlite3_api->free_filename +#define sqlite3_database_file_object sqlite3_api->database_file_object +/* Version 3.34.0 and later */ +#define sqlite3_txn_state sqlite3_api->txn_state +/* Version 3.36.1 and later */ +#define sqlite3_changes64 sqlite3_api->changes64 +#define sqlite3_total_changes64 sqlite3_api->total_changes64 +/* Version 3.37.0 and later */ +#define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages +/* Version 3.38.0 and later */ +#define sqlite3_error_offset sqlite3_api->error_offset +#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value +#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct +#define sqlite3_vtab_in sqlite3_api->vtab_in +#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first +#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next +/* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE +#define sqlite3_deserialize sqlite3_api->deserialize +#define sqlite3_serialize sqlite3_api->serialize +#endif +#define sqlite3_db_name sqlite3_api->db_name +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ + +/************** End of sqlite3ext.h ******************************************/ +/************** Continuing where we left off in loadext.c ********************/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Some API routines are omitted when various features are +** excluded from a build of SQLite. Substitute a NULL pointer +** for any missing APIs. +*/ +#ifndef SQLITE_ENABLE_COLUMN_METADATA +# define sqlite3_column_database_name 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_AUTHORIZATION +# define sqlite3_set_authorizer 0 +#endif + +#ifdef SQLITE_OMIT_UTF16 +# define sqlite3_bind_text16 0 +# define sqlite3_collation_needed16 0 +# define sqlite3_column_decltype16 0 +# define sqlite3_column_name16 0 +# define sqlite3_column_text16 0 +# define sqlite3_complete16 0 +# define sqlite3_create_collation16 0 +# define sqlite3_create_function16 0 +# define sqlite3_errmsg16 0 +# define sqlite3_open16 0 +# define sqlite3_prepare16 0 +# define sqlite3_prepare16_v2 0 +# define sqlite3_prepare16_v3 0 +# define sqlite3_result_error16 0 +# define sqlite3_result_text16 0 +# define sqlite3_result_text16be 0 +# define sqlite3_result_text16le 0 +# define sqlite3_value_text16 0 +# define sqlite3_value_text16be 0 +# define sqlite3_value_text16le 0 +# define sqlite3_column_database_name16 0 +# define sqlite3_column_table_name16 0 +# define sqlite3_column_origin_name16 0 +#endif + +#ifdef SQLITE_OMIT_COMPLETE +# define sqlite3_complete 0 +# define sqlite3_complete16 0 +#endif + +#ifdef SQLITE_OMIT_DECLTYPE +# define sqlite3_column_decltype16 0 +# define sqlite3_column_decltype 0 +#endif + +#ifdef SQLITE_OMIT_PROGRESS_CALLBACK +# define sqlite3_progress_handler 0 +#endif + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# define sqlite3_create_module 0 +# define sqlite3_create_module_v2 0 +# define sqlite3_declare_vtab 0 +# define sqlite3_vtab_config 0 +# define sqlite3_vtab_on_conflict 0 +# define sqlite3_vtab_collation 0 +#endif + +#ifdef SQLITE_OMIT_SHARED_CACHE +# define sqlite3_enable_shared_cache 0 +#endif + +#if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED) +# define sqlite3_profile 0 +# define sqlite3_trace 0 +#endif + +#ifdef SQLITE_OMIT_GET_TABLE +# define sqlite3_free_table 0 +# define sqlite3_get_table 0 +#endif + +#ifdef SQLITE_OMIT_INCRBLOB +#define sqlite3_bind_zeroblob 0 +#define sqlite3_blob_bytes 0 +#define sqlite3_blob_close 0 +#define sqlite3_blob_open 0 +#define sqlite3_blob_read 0 +#define sqlite3_blob_write 0 +#define sqlite3_blob_reopen 0 +#endif + +#if defined(SQLITE_OMIT_TRACE) +# define sqlite3_trace_v2 0 +#endif + +/* +** The following structure contains pointers to all SQLite API routines. +** A pointer to this structure is passed into extensions when they are +** loaded so that the extension can make calls back into the SQLite +** library. +** +** When adding new APIs, add them to the bottom of this structure +** in order to preserve backwards compatibility. +** +** Extensions that use newer APIs should first call the +** sqlite3_libversion_number() to make sure that the API they +** intend to use is supported by the library. Extensions should +** also check to make sure that the pointer to the function is +** not NULL before calling it. +*/ +static const sqlite3_api_routines sqlite3Apis = { + sqlite3_aggregate_context, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_aggregate_count, +#else + 0, +#endif + sqlite3_bind_blob, + sqlite3_bind_double, + sqlite3_bind_int, + sqlite3_bind_int64, + sqlite3_bind_null, + sqlite3_bind_parameter_count, + sqlite3_bind_parameter_index, + sqlite3_bind_parameter_name, + sqlite3_bind_text, + sqlite3_bind_text16, + sqlite3_bind_value, + sqlite3_busy_handler, + sqlite3_busy_timeout, + sqlite3_changes, + sqlite3_close, + sqlite3_collation_needed, + sqlite3_collation_needed16, + sqlite3_column_blob, + sqlite3_column_bytes, + sqlite3_column_bytes16, + sqlite3_column_count, + sqlite3_column_database_name, + sqlite3_column_database_name16, + sqlite3_column_decltype, + sqlite3_column_decltype16, + sqlite3_column_double, + sqlite3_column_int, + sqlite3_column_int64, + sqlite3_column_name, + sqlite3_column_name16, + sqlite3_column_origin_name, + sqlite3_column_origin_name16, + sqlite3_column_table_name, + sqlite3_column_table_name16, + sqlite3_column_text, + sqlite3_column_text16, + sqlite3_column_type, + sqlite3_column_value, + sqlite3_commit_hook, + sqlite3_complete, + sqlite3_complete16, + sqlite3_create_collation, + sqlite3_create_collation16, + sqlite3_create_function, + sqlite3_create_function16, + sqlite3_create_module, + sqlite3_data_count, + sqlite3_db_handle, + sqlite3_declare_vtab, + sqlite3_enable_shared_cache, + sqlite3_errcode, + sqlite3_errmsg, + sqlite3_errmsg16, + sqlite3_exec, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_expired, +#else + 0, +#endif + sqlite3_finalize, + sqlite3_free, + sqlite3_free_table, + sqlite3_get_autocommit, + sqlite3_get_auxdata, + sqlite3_get_table, + 0, /* Was sqlite3_global_recover(), but that function is deprecated */ + sqlite3_interrupt, + sqlite3_last_insert_rowid, + sqlite3_libversion, + sqlite3_libversion_number, + sqlite3_malloc, + sqlite3_mprintf, + sqlite3_open, + sqlite3_open16, + sqlite3_prepare, + sqlite3_prepare16, + sqlite3_profile, + sqlite3_progress_handler, + sqlite3_realloc, + sqlite3_reset, + sqlite3_result_blob, + sqlite3_result_double, + sqlite3_result_error, + sqlite3_result_error16, + sqlite3_result_int, + sqlite3_result_int64, + sqlite3_result_null, + sqlite3_result_text, + sqlite3_result_text16, + sqlite3_result_text16be, + sqlite3_result_text16le, + sqlite3_result_value, + sqlite3_rollback_hook, + sqlite3_set_authorizer, + sqlite3_set_auxdata, + sqlite3_snprintf, + sqlite3_step, + sqlite3_table_column_metadata, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_thread_cleanup, +#else + 0, +#endif + sqlite3_total_changes, + sqlite3_trace, +#ifndef SQLITE_OMIT_DEPRECATED + sqlite3_transfer_bindings, +#else + 0, +#endif + sqlite3_update_hook, + sqlite3_user_data, + sqlite3_value_blob, + sqlite3_value_bytes, + sqlite3_value_bytes16, + sqlite3_value_double, + sqlite3_value_int, + sqlite3_value_int64, + sqlite3_value_numeric_type, + sqlite3_value_text, + sqlite3_value_text16, + sqlite3_value_text16be, + sqlite3_value_text16le, + sqlite3_value_type, + sqlite3_vmprintf, + /* + ** The original API set ends here. All extensions can call any + ** of the APIs above provided that the pointer is not NULL. But + ** before calling APIs that follow, extension should check the + ** sqlite3_libversion_number() to make sure they are dealing with + ** a library that is new enough to support that API. + ************************************************************************* + */ + sqlite3_overload_function, + + /* + ** Added after 3.3.13 + */ + sqlite3_prepare_v2, + sqlite3_prepare16_v2, + sqlite3_clear_bindings, + + /* + ** Added for 3.4.1 + */ + sqlite3_create_module_v2, + + /* + ** Added for 3.5.0 + */ + sqlite3_bind_zeroblob, + sqlite3_blob_bytes, + sqlite3_blob_close, + sqlite3_blob_open, + sqlite3_blob_read, + sqlite3_blob_write, + sqlite3_create_collation_v2, + sqlite3_file_control, + sqlite3_memory_highwater, + sqlite3_memory_used, +#ifdef SQLITE_MUTEX_OMIT + 0, + 0, + 0, + 0, + 0, +#else + sqlite3_mutex_alloc, + sqlite3_mutex_enter, + sqlite3_mutex_free, + sqlite3_mutex_leave, + sqlite3_mutex_try, +#endif + sqlite3_open_v2, + sqlite3_release_memory, + sqlite3_result_error_nomem, + sqlite3_result_error_toobig, + sqlite3_sleep, + sqlite3_soft_heap_limit, + sqlite3_vfs_find, + sqlite3_vfs_register, + sqlite3_vfs_unregister, + + /* + ** Added for 3.5.8 + */ + sqlite3_threadsafe, + sqlite3_result_zeroblob, + sqlite3_result_error_code, + sqlite3_test_control, + sqlite3_randomness, + sqlite3_context_db_handle, + + /* + ** Added for 3.6.0 + */ + sqlite3_extended_result_codes, + sqlite3_limit, + sqlite3_next_stmt, + sqlite3_sql, + sqlite3_status, + + /* + ** Added for 3.7.4 + */ + sqlite3_backup_finish, + sqlite3_backup_init, + sqlite3_backup_pagecount, + sqlite3_backup_remaining, + sqlite3_backup_step, +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + sqlite3_compileoption_get, + sqlite3_compileoption_used, +#else + 0, + 0, +#endif + sqlite3_create_function_v2, + sqlite3_db_config, + sqlite3_db_mutex, + sqlite3_db_status, + sqlite3_extended_errcode, + sqlite3_log, + sqlite3_soft_heap_limit64, + sqlite3_sourceid, + sqlite3_stmt_status, + sqlite3_strnicmp, +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + sqlite3_unlock_notify, +#else + 0, +#endif +#ifndef SQLITE_OMIT_WAL + sqlite3_wal_autocheckpoint, + sqlite3_wal_checkpoint, + sqlite3_wal_hook, +#else + 0, + 0, + 0, +#endif + sqlite3_blob_reopen, + sqlite3_vtab_config, + sqlite3_vtab_on_conflict, + sqlite3_close_v2, + sqlite3_db_filename, + sqlite3_db_readonly, + sqlite3_db_release_memory, + sqlite3_errstr, + sqlite3_stmt_busy, + sqlite3_stmt_readonly, + sqlite3_stricmp, + sqlite3_uri_boolean, + sqlite3_uri_int64, + sqlite3_uri_parameter, + sqlite3_vsnprintf, + sqlite3_wal_checkpoint_v2, + /* Version 3.8.7 and later */ + sqlite3_auto_extension, + sqlite3_bind_blob64, + sqlite3_bind_text64, + sqlite3_cancel_auto_extension, + sqlite3_load_extension, + sqlite3_malloc64, + sqlite3_msize, + sqlite3_realloc64, + sqlite3_reset_auto_extension, + sqlite3_result_blob64, + sqlite3_result_text64, + sqlite3_strglob, + /* Version 3.8.11 and later */ + (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup, + sqlite3_value_free, + sqlite3_result_zeroblob64, + sqlite3_bind_zeroblob64, + /* Version 3.9.0 and later */ + sqlite3_value_subtype, + sqlite3_result_subtype, + /* Version 3.10.0 and later */ + sqlite3_status64, + sqlite3_strlike, + sqlite3_db_cacheflush, + /* Version 3.12.0 and later */ + sqlite3_system_errno, + /* Version 3.14.0 and later */ + sqlite3_trace_v2, + sqlite3_expanded_sql, + /* Version 3.18.0 and later */ + sqlite3_set_last_insert_rowid, + /* Version 3.20.0 and later */ + sqlite3_prepare_v3, + sqlite3_prepare16_v3, + sqlite3_bind_pointer, + sqlite3_result_pointer, + sqlite3_value_pointer, + /* Version 3.22.0 and later */ + sqlite3_vtab_nochange, + sqlite3_value_nochange, + sqlite3_vtab_collation, + /* Version 3.24.0 and later */ + sqlite3_keyword_count, + sqlite3_keyword_name, + sqlite3_keyword_check, + sqlite3_str_new, + sqlite3_str_finish, + sqlite3_str_appendf, + sqlite3_str_vappendf, + sqlite3_str_append, + sqlite3_str_appendall, + sqlite3_str_appendchar, + sqlite3_str_reset, + sqlite3_str_errcode, + sqlite3_str_length, + sqlite3_str_value, + /* Version 3.25.0 and later */ + sqlite3_create_window_function, + /* Version 3.26.0 and later */ +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3_normalized_sql, +#else + 0, +#endif + /* Version 3.28.0 and later */ + sqlite3_stmt_isexplain, + sqlite3_value_frombind, + /* Version 3.30.0 and later */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_drop_modules, +#else + 0, +#endif + /* Version 3.31.0 and later */ + sqlite3_hard_heap_limit64, + sqlite3_uri_key, + sqlite3_filename_database, + sqlite3_filename_journal, + sqlite3_filename_wal, + /* Version 3.32.0 and later */ + sqlite3_create_filename, + sqlite3_free_filename, + sqlite3_database_file_object, + /* Version 3.34.0 and later */ + sqlite3_txn_state, + /* Version 3.36.1 and later */ + sqlite3_changes64, + sqlite3_total_changes64, + /* Version 3.37.0 and later */ + sqlite3_autovacuum_pages, + /* Version 3.38.0 and later */ + sqlite3_error_offset, +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_vtab_rhs_value, + sqlite3_vtab_distinct, + sqlite3_vtab_in, + sqlite3_vtab_in_first, + sqlite3_vtab_in_next, +#else + 0, + 0, + 0, + 0, + 0, +#endif + /* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE + sqlite3_deserialize, + sqlite3_serialize, +#else + 0, + 0, +#endif + sqlite3_db_name +}; + +/* True if x is the directory separator character +*/ +#if SQLITE_OS_WIN +# define DirSep(X) ((X)=='/'||(X)=='\\') +#else +# define DirSep(X) ((X)=='/') +#endif + +/* +** Attempt to load an SQLite extension library contained in the file +** zFile. The entry point is zProc. zProc may be 0 in which case a +** default entry point name (sqlite3_extension_init) is used. Use +** of the default name is recommended. +** +** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. +** +** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with +** error message text. The calling function should free this memory +** by calling sqlite3DbFree(db, ). +*/ +static int sqlite3LoadExtension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + sqlite3_vfs *pVfs = db->pVfs; + void *handle; + sqlite3_loadext_entry xInit; + char *zErrmsg = 0; + const char *zEntry; + char *zAltEntry = 0; + void **aHandle; + u64 nMsg = strlen(zFile); + int ii; + int rc; + + /* Shared library endings to try if zFile cannot be loaded as written */ + static const char *azEndings[] = { +#if SQLITE_OS_WIN + "dll" +#elif defined(__APPLE__) + "dylib" +#else + "so" +#endif + }; + + + if( pzErrMsg ) *pzErrMsg = 0; + + /* Ticket #1863. To avoid a creating security problems for older + ** applications that relink against newer versions of SQLite, the + ** ability to run load_extension is turned off by default. One + ** must call either sqlite3_enable_load_extension(db) or + ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0) + ** to turn on extension loading. + */ + if( (db->flags & SQLITE_LoadExtension)==0 ){ + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("not authorized"); + } + return SQLITE_ERROR; + } + + zEntry = zProc ? zProc : "sqlite3_extension_init"; + + /* tag-20210611-1. Some dlopen() implementations will segfault if given + ** an oversize filename. Most filesystems have a pathname limit of 4K, + ** so limit the extension filename length to about twice that. + ** https://sqlite.org/forum/forumpost/08a0d6d9bf */ + if( nMsg>SQLITE_MAX_PATHLEN ) goto extension_not_found; + + handle = sqlite3OsDlOpen(pVfs, zFile); +#if SQLITE_OS_UNIX || SQLITE_OS_WIN + for(ii=0; ii sqlite3_example_init + ** C:/lib/mathfuncs.dll ==> sqlite3_mathfuncs_init + */ + if( xInit==0 && zProc==0 ){ + int iFile, iEntry, c; + int ncFile = sqlite3Strlen30(zFile); + zAltEntry = sqlite3_malloc64(ncFile+30); + if( zAltEntry==0 ){ + sqlite3OsDlClose(pVfs, handle); + return SQLITE_NOMEM_BKPT; + } + memcpy(zAltEntry, "sqlite3_", 8); + for(iFile=ncFile-1; iFile>=0 && !DirSep(zFile[iFile]); iFile--){} + iFile++; + if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; + for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ + if( sqlite3Isalpha(c) ){ + zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; + } + } + memcpy(zAltEntry+iEntry, "_init", 6); + zEntry = zAltEntry; + xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry); + } + if( xInit==0 ){ + if( pzErrMsg ){ + nMsg += strlen(zEntry) + 300; + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); + if( zErrmsg ){ + assert( nMsg<0x7fffffff ); /* zErrmsg would be NULL if not so */ + sqlite3_snprintf((int)nMsg, zErrmsg, + "no entry point [%s] in shared library [%s]", zEntry, zFile); + sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); + } + } + sqlite3OsDlClose(pVfs, handle); + sqlite3_free(zAltEntry); + return SQLITE_ERROR; + } + sqlite3_free(zAltEntry); + rc = xInit(db, &zErrmsg, &sqlite3Apis); + if( rc ){ + if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK; + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); + } + sqlite3_free(zErrmsg); + sqlite3OsDlClose(pVfs, handle); + return SQLITE_ERROR; + } + + /* Append the new shared library handle to the db->aExtension array. */ + aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); + if( aHandle==0 ){ + return SQLITE_NOMEM_BKPT; + } + if( db->nExtension>0 ){ + memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension); + } + sqlite3DbFree(db, db->aExtension); + db->aExtension = aHandle; + + db->aExtension[db->nExtension++] = handle; + return SQLITE_OK; + +extension_not_found: + if( pzErrMsg ){ + nMsg += 300; + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); + if( zErrmsg ){ + assert( nMsg<0x7fffffff ); /* zErrmsg would be NULL if not so */ + sqlite3_snprintf((int)nMsg, zErrmsg, + "unable to open shared library [%.*s]", SQLITE_MAX_PATHLEN, zFile); + sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); + } + } + return SQLITE_ERROR; +} +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +){ + int rc; + sqlite3_mutex_enter(db->mutex); + rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Call this routine when the database connection is closing in order +** to clean up loaded extensions +*/ +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){ + int i; + assert( sqlite3_mutex_held(db->mutex) ); + for(i=0; inExtension; i++){ + sqlite3OsDlClose(db->pVfs, db->aExtension[i]); + } + sqlite3DbFree(db, db->aExtension); +} + +/* +** Enable or disable extension loading. Extension loading is disabled by +** default so as not to open security holes in older applications. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ + sqlite3_mutex_enter(db->mutex); + if( onoff ){ + db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; + }else{ + db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + } + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +/* +** The following object holds the list of automatically loaded +** extensions. +** +** This list is shared across threads. The SQLITE_MUTEX_STATIC_MAIN +** mutex must be held while accessing this list. +*/ +typedef struct sqlite3AutoExtList sqlite3AutoExtList; +static SQLITE_WSD struct sqlite3AutoExtList { + u32 nExt; /* Number of entries in aExt[] */ + void (**aExt)(void); /* Pointers to the extension init functions */ +} sqlite3Autoext = { 0, 0 }; + +/* The "wsdAutoext" macro will resolve to the autoextension +** state vector. If writable static data is unsupported on the target, +** we have to locate the state vector at run-time. In the more common +** case where writable static data is supported, wsdStat can refer directly +** to the "sqlite3Autoext" state vector declared above. +*/ +#ifdef SQLITE_OMIT_WSD +# define wsdAutoextInit \ + sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext) +# define wsdAutoext x[0] +#else +# define wsdAutoextInit +# define wsdAutoext sqlite3Autoext +#endif + + +/* +** Register a statically linked extension that is automatically +** loaded by every new database connection. +*/ +SQLITE_API int sqlite3_auto_extension( + void (*xInit)(void) +){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ){ + return rc; + }else +#endif + { + u32 i; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); +#endif + wsdAutoextInit; + sqlite3_mutex_enter(mutex); + for(i=0; i=0; i--){ + if( wsdAutoext.aExt[i]==xInit ){ + wsdAutoext.nExt--; + wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; + n++; + break; + } + } + sqlite3_mutex_leave(mutex); + return n; +} + +/* +** Reset the automatic extension loading mechanism. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void){ +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize()==SQLITE_OK ) +#endif + { +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); +#endif + wsdAutoextInit; + sqlite3_mutex_enter(mutex); + sqlite3_free(wsdAutoext.aExt); + wsdAutoext.aExt = 0; + wsdAutoext.nExt = 0; + sqlite3_mutex_leave(mutex); + } +} + +/* +** Load all automatic extensions. +** +** If anything goes wrong, set an error in the database connection. +*/ +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ + u32 i; + int go = 1; + int rc; + sqlite3_loadext_entry xInit; + + wsdAutoextInit; + if( wsdAutoext.nExt==0 ){ + /* Common case: early out without every having to acquire a mutex */ + return; + } + for(i=0; go; i++){ + char *zErrmsg; +#if SQLITE_THREADSAFE + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); +#endif +#ifdef SQLITE_OMIT_LOAD_EXTENSION + const sqlite3_api_routines *pThunk = 0; +#else + const sqlite3_api_routines *pThunk = &sqlite3Apis; +#endif + sqlite3_mutex_enter(mutex); + if( i>=wsdAutoext.nExt ){ + xInit = 0; + go = 0; + }else{ + xInit = (sqlite3_loadext_entry)wsdAutoext.aExt[i]; + } + sqlite3_mutex_leave(mutex); + zErrmsg = 0; + if( xInit && (rc = xInit(db, &zErrmsg, pThunk))!=0 ){ + sqlite3ErrorWithMsg(db, rc, + "automatic extension loading failed: %s", zErrmsg); + go = 0; + } + sqlite3_free(zErrmsg); + } +} + +/************** End of loadext.c *********************************************/ +/************** Begin file pragma.c ******************************************/ +/* +** 2003 April 6 +** +** 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 contains code used to implement the PRAGMA command. +*/ +/* #include "sqliteInt.h" */ + +#if !defined(SQLITE_ENABLE_LOCKING_STYLE) +# if defined(__APPLE__) +# define SQLITE_ENABLE_LOCKING_STYLE 1 +# else +# define SQLITE_ENABLE_LOCKING_STYLE 0 +# endif +#endif + +/*************************************************************************** +** The "pragma.h" include file is an automatically generated file that +** that includes the PragType_XXXX macro definitions and the aPragmaName[] +** object. This ensures that the aPragmaName[] table is arranged in +** lexicographical order to facility a binary search of the pragma name. +** Do not edit pragma.h directly. Edit and rerun the script in at +** ../tool/mkpragmatab.tcl. */ +/************** Include pragma.h in the middle of pragma.c *******************/ +/************** Begin file pragma.h ******************************************/ +/* DO NOT EDIT! +** This file is automatically generated by the script at +** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit +** that script and rerun it. +*/ + +/* The various pragma types */ +#define PragTyp_KEY 255 +#define PragTyp_ACTIVATE_EXTENSIONS 0 +#define PragTyp_ANALYSIS_LIMIT 1 +#define PragTyp_HEADER_VALUE 2 +#define PragTyp_AUTO_VACUUM 3 +#define PragTyp_FLAG 4 +#define PragTyp_BUSY_TIMEOUT 5 +#define PragTyp_CACHE_SIZE 6 +#define PragTyp_CACHE_SPILL 7 +#define PragTyp_CASE_SENSITIVE_LIKE 8 +#define PragTyp_COLLATION_LIST 9 +#define PragTyp_COMPILE_OPTIONS 10 +#define PragTyp_DATA_STORE_DIRECTORY 11 +#define PragTyp_DATABASE_LIST 12 +#define PragTyp_DEFAULT_CACHE_SIZE 13 +#define PragTyp_ENCODING 14 +#define PragTyp_FOREIGN_KEY_CHECK 15 +#define PragTyp_FOREIGN_KEY_LIST 16 +#define PragTyp_FUNCTION_LIST 17 +#define PragTyp_HARD_HEAP_LIMIT 18 +#define PragTyp_INCREMENTAL_VACUUM 19 +#define PragTyp_INDEX_INFO 20 +#define PragTyp_INDEX_LIST 21 +#define PragTyp_INTEGRITY_CHECK 22 +#define PragTyp_JOURNAL_MODE 23 +#define PragTyp_JOURNAL_SIZE_LIMIT 24 +#define PragTyp_LOCK_PROXY_FILE 25 +#define PragTyp_LOCKING_MODE 26 +#define PragTyp_PAGE_COUNT 27 +#define PragTyp_MMAP_SIZE 28 +#define PragTyp_MODULE_LIST 29 +#define PragTyp_OPTIMIZE 30 +#define PragTyp_PAGE_SIZE 31 +#define PragTyp_PRAGMA_LIST 32 +#define PragTyp_SECURE_DELETE 33 +#define PragTyp_SHRINK_MEMORY 34 +#define PragTyp_SOFT_HEAP_LIMIT 35 +#define PragTyp_SYNCHRONOUS 36 +#define PragTyp_TABLE_INFO 37 +#define PragTyp_TABLE_LIST 38 +#define PragTyp_TEMP_STORE 39 +#define PragTyp_TEMP_STORE_DIRECTORY 40 +#define PragTyp_THREADS 41 +#define PragTyp_WAL_AUTOCHECKPOINT 42 +#define PragTyp_WAL_CHECKPOINT 43 +#define PragTyp_LOCK_STATUS 44 +#define PragTyp_STATS 45 + +/* Property flags associated with various pragma. */ +#define PragFlg_NeedSchema 0x01 /* Force schema load before running */ +#define PragFlg_NoColumns 0x02 /* OP_ResultRow called with zero columns */ +#define PragFlg_NoColumns1 0x04 /* zero columns if RHS argument is present */ +#define PragFlg_ReadOnly 0x08 /* Read-only HEADER_VALUE */ +#define PragFlg_Result0 0x10 /* Acts as query when no argument */ +#define PragFlg_Result1 0x20 /* Acts as query when has one argument */ +#define PragFlg_SchemaOpt 0x40 /* Schema restricts name search if present */ +#define PragFlg_SchemaReq 0x80 /* Schema required - "main" is default */ + +/* Names of columns for pragmas that return multi-column result +** or that return single-column results where the name of the +** result column is different from the name of the pragma +*/ +static const char *const pragCName[] = { + /* 0 */ "id", /* Used by: foreign_key_list */ + /* 1 */ "seq", + /* 2 */ "table", + /* 3 */ "from", + /* 4 */ "to", + /* 5 */ "on_update", + /* 6 */ "on_delete", + /* 7 */ "match", + /* 8 */ "cid", /* Used by: table_xinfo */ + /* 9 */ "name", + /* 10 */ "type", + /* 11 */ "notnull", + /* 12 */ "dflt_value", + /* 13 */ "pk", + /* 14 */ "hidden", + /* table_info reuses 8 */ + /* 15 */ "schema", /* Used by: table_list */ + /* 16 */ "name", + /* 17 */ "type", + /* 18 */ "ncol", + /* 19 */ "wr", + /* 20 */ "strict", + /* 21 */ "seqno", /* Used by: index_xinfo */ + /* 22 */ "cid", + /* 23 */ "name", + /* 24 */ "desc", + /* 25 */ "coll", + /* 26 */ "key", + /* 27 */ "name", /* Used by: function_list */ + /* 28 */ "builtin", + /* 29 */ "type", + /* 30 */ "enc", + /* 31 */ "narg", + /* 32 */ "flags", + /* 33 */ "tbl", /* Used by: stats */ + /* 34 */ "idx", + /* 35 */ "wdth", + /* 36 */ "hght", + /* 37 */ "flgs", + /* 38 */ "seq", /* Used by: index_list */ + /* 39 */ "name", + /* 40 */ "unique", + /* 41 */ "origin", + /* 42 */ "partial", + /* 43 */ "table", /* Used by: foreign_key_check */ + /* 44 */ "rowid", + /* 45 */ "parent", + /* 46 */ "fkid", + /* index_info reuses 21 */ + /* 47 */ "seq", /* Used by: database_list */ + /* 48 */ "name", + /* 49 */ "file", + /* 50 */ "busy", /* Used by: wal_checkpoint */ + /* 51 */ "log", + /* 52 */ "checkpointed", + /* collation_list reuses 38 */ + /* 53 */ "database", /* Used by: lock_status */ + /* 54 */ "status", + /* 55 */ "cache_size", /* Used by: default_cache_size */ + /* module_list pragma_list reuses 9 */ + /* 56 */ "timeout", /* Used by: busy_timeout */ +}; + +/* Definitions of all built-in pragmas */ +typedef struct PragmaName { + const char *const zName; /* Name of pragma */ + u8 ePragTyp; /* PragTyp_XXX value */ + u8 mPragFlg; /* Zero or more PragFlg_XXX values */ + u8 iPragCName; /* Start of column names in pragCName[] */ + u8 nPragCName; /* Num of col names. 0 means use pragma name */ + u64 iArg; /* Extra argument */ +} PragmaName; +static const PragmaName aPragmaName[] = { +#if defined(SQLITE_ENABLE_CEROD) + {/* zName: */ "activate_extensions", + /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "analysis_limit", + /* ePragTyp: */ PragTyp_ANALYSIS_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "application_id", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_APPLICATION_ID }, +#endif +#if !defined(SQLITE_OMIT_AUTOVACUUM) + {/* zName: */ "auto_vacuum", + /* ePragTyp: */ PragTyp_AUTO_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) + {/* zName: */ "automatic_index", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_AutoIndex }, +#endif +#endif + {/* zName: */ "busy_timeout", + /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 56, 1, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "cache_size", + /* ePragTyp: */ PragTyp_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "cache_spill", + /* ePragTyp: */ PragTyp_CACHE_SPILL, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA) + {/* zName: */ "case_sensitive_like", + /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "cell_size_check", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CellSizeCk }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "checkpoint_fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CkptFullFSync }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "collation_list", + /* ePragTyp: */ PragTyp_COLLATION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 38, 2, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) + {/* zName: */ "compile_options", + /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "count_changes", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CountRows }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN + {/* zName: */ "data_store_directory", + /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "data_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_ReadOnly|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_DATA_VERSION }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "database_list", + /* ePragTyp: */ PragTyp_DATABASE_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 47, 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, + /* ColNames: */ 55, 1, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + {/* zName: */ "defer_foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_DeferFKs }, +#endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "empty_result_callbacks", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_NullCallback }, +#endif +#if !defined(SQLITE_OMIT_UTF16) + {/* zName: */ "encoding", + /* ePragTyp: */ PragTyp_ENCODING, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + {/* zName: */ "foreign_key_check", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 43, 4, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FOREIGN_KEY) + {/* zName: */ "foreign_key_list", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 0, 8, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) + {/* zName: */ "foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ForeignKeys }, +#endif +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "freelist_count", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_ReadOnly|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_FREE_PAGE_COUNT }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "full_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullColNames }, + {/* zName: */ "fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullFSync }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) + {/* zName: */ "function_list", + /* ePragTyp: */ PragTyp_FUNCTION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 27, 6, + /* iArg: */ 0 }, +#endif +#endif + {/* zName: */ "hard_heap_limit", + /* ePragTyp: */ PragTyp_HARD_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) + {/* zName: */ "hexkey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 2 }, + {/* zName: */ "hexrekey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 3 }, +#endif +/* END SQLCIPHER */ +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_CHECK) + {/* zName: */ "ignore_check_constraints", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_IgnoreChecks }, +#endif +#endif +#if !defined(SQLITE_OMIT_AUTOVACUUM) + {/* zName: */ "incremental_vacuum", + /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "index_info", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 21, 3, + /* iArg: */ 0 }, + {/* zName: */ "index_list", + /* ePragTyp: */ PragTyp_INDEX_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 38, 5, + /* iArg: */ 0 }, + {/* zName: */ "index_xinfo", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 21, 6, + /* iArg: */ 1 }, +#endif +#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) + {/* zName: */ "integrity_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "journal_mode", + /* ePragTyp: */ PragTyp_JOURNAL_MODE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "journal_size_limit", + /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) + {/* zName: */ "key", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +/* END SQLCIPHER */ +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "legacy_alter_table", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_LegacyAlter }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE + {/* zName: */ "lock_proxy_file", + /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + {/* zName: */ "lock_status", + /* ePragTyp: */ PragTyp_LOCK_STATUS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 53, 2, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "locking_mode", + /* ePragTyp: */ PragTyp_LOCKING_MODE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "max_page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "mmap_size", + /* ePragTyp: */ PragTyp_MMAP_SIZE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) +#if !defined(SQLITE_OMIT_VIRTUALTABLE) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) + {/* zName: */ "module_list", + /* ePragTyp: */ PragTyp_MODULE_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 9, 1, + /* iArg: */ 0 }, +#endif +#endif +#endif + {/* zName: */ "optimize", + /* ePragTyp: */ PragTyp_OPTIMIZE, + /* ePragFlg: */ PragFlg_Result1|PragFlg_NeedSchema, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "page_size", + /* ePragTyp: */ PragTyp_PAGE_SIZE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "parser_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ParserTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) + {/* zName: */ "pragma_list", + /* ePragTyp: */ PragTyp_PRAGMA_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 9, 1, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "query_only", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_QueryOnly }, +#endif +#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) + {/* zName: */ "quick_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "read_uncommitted", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReadUncommit }, + {/* zName: */ "recursive_triggers", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_RecTriggers }, +#endif +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) + {/* zName: */ "rekey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 1 }, +#endif +/* END SQLCIPHER */ +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "reverse_unordered_selects", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReverseOrder }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "schema_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_SCHEMA_VERSION }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "secure_delete", + /* ePragTyp: */ PragTyp_SECURE_DELETE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "short_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ShortColNames }, +#endif + {/* zName: */ "shrink_memory", + /* ePragTyp: */ PragTyp_SHRINK_MEMORY, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "soft_heap_limit", + /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "sql_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG) + {/* zName: */ "stats", + /* ePragTyp: */ PragTyp_STATS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 33, 5, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "synchronous", + /* ePragTyp: */ PragTyp_SYNCHRONOUS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + {/* zName: */ "table_info", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 8, 6, + /* iArg: */ 0 }, + {/* zName: */ "table_list", + /* ePragTyp: */ PragTyp_TABLE_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1, + /* ColNames: */ 15, 6, + /* iArg: */ 0 }, + {/* zName: */ "table_xinfo", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 8, 7, + /* iArg: */ 1 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "temp_store", + /* ePragTyp: */ PragTyp_TEMP_STORE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "temp_store_directory", + /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) + {/* zName: */ "textkey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 4 }, + {/* zName: */ "textrekey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 5 }, +#endif +/* END SQLCIPHER */ + {/* zName: */ "threads", + /* ePragTyp: */ PragTyp_THREADS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "trusted_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_TrustedSchema }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) + {/* zName: */ "user_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_USER_VERSION }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) + {/* zName: */ "vdbe_addoptrace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeAddopTrace }, + {/* zName: */ "vdbe_debug", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, + {/* zName: */ "vdbe_eqp", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeEQP }, + {/* zName: */ "vdbe_listing", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeListing }, + {/* zName: */ "vdbe_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeTrace }, +#endif +#endif +#if !defined(SQLITE_OMIT_WAL) + {/* zName: */ "wal_autocheckpoint", + /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "wal_checkpoint", + /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 50, 3, + /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) + {/* zName: */ "writable_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, +#endif +}; +/* Number of pragmas: 68 on by default, 78 total. */ + +/************** End of pragma.h **********************************************/ +/************** Continuing where we left off in pragma.c *********************/ + +/* +** Interpret the given string as a safety level. Return 0 for OFF, +** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or +** unrecognized string argument. The FULL and EXTRA option is disallowed +** if the omitFull parameter it 1. +** +** Note that the values returned are one less that the values that +** should be passed into sqlite3BtreeSetSafetyLevel(). The is done +** to support legacy SQL code. The safety level used to be boolean +** and older scripts may have used numbers 0 for OFF and 1 for ON. +*/ +static u8 getSafetyLevel(const char *z, int omitFull, u8 dflt){ + /* 123456789 123456789 123 */ + static const char zText[] = "onoffalseyestruextrafull"; + static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 15, 20}; + static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 5, 4}; + static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 3, 2}; + /* on no off false yes true extra full */ + int i, n; + if( sqlite3Isdigit(*z) ){ + return (u8)sqlite3Atoi(z); + } + n = sqlite3Strlen30(z); + for(i=0; i=0&&i<=2)?i:0); +} +#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Interpret the given string as a temp db location. Return 1 for file +** backed temporary databases, 2 for the Red-Black tree in memory database +** and 0 to use the compile-time default. +*/ +static int getTempStore(const char *z){ + if( z[0]>='0' && z[0]<='2' ){ + return z[0] - '0'; + }else if( sqlite3StrICmp(z, "file")==0 ){ + return 1; + }else if( sqlite3StrICmp(z, "memory")==0 ){ + return 2; + }else{ + return 0; + } +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** Invalidate temp storage, either when the temp storage is changed +** from default, or when 'file' and the temp_store_directory has changed +*/ +static int invalidateTempStorage(Parse *pParse){ + sqlite3 *db = pParse->db; + if( db->aDb[1].pBt!=0 ){ + if( !db->autoCommit + || sqlite3BtreeTxnState(db->aDb[1].pBt)!=SQLITE_TXN_NONE + ){ + sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " + "from within a transaction"); + return SQLITE_ERROR; + } + sqlite3BtreeClose(db->aDb[1].pBt); + db->aDb[1].pBt = 0; + sqlite3ResetAllSchemasOfConnection(db); + } + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS +/* +** If the TEMP database is open, close it and mark the database schema +** as needing reloading. This must be done when using the SQLITE_TEMP_STORE +** or DEFAULT_TEMP_STORE pragmas. +*/ +static int changeTempStorage(Parse *pParse, const char *zStorageType){ + int ts = getTempStore(zStorageType); + sqlite3 *db = pParse->db; + if( db->temp_store==ts ) return SQLITE_OK; + if( invalidateTempStorage( pParse ) != SQLITE_OK ){ + return SQLITE_ERROR; + } + db->temp_store = (u8)ts; + return SQLITE_OK; +} +#endif /* SQLITE_PAGER_PRAGMAS */ + +/* +** Set result column names for a pragma. +*/ +static void setPragmaResultColumnNames( + Vdbe *v, /* The query under construction */ + const PragmaName *pPragma /* The pragma */ +){ + u8 n = pPragma->nPragCName; + sqlite3VdbeSetNumCols(v, n==0 ? 1 : n); + if( n==0 ){ + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, pPragma->zName, SQLITE_STATIC); + }else{ + int i, j; + for(i=0, j=pPragma->iPragCName; iautoCommit ){ + Db *pDb = db->aDb; + int n = db->nDb; + assert( SQLITE_FullFSync==PAGER_FULLFSYNC ); + assert( SQLITE_CkptFullFSync==PAGER_CKPT_FULLFSYNC ); + assert( SQLITE_CacheSpill==PAGER_CACHESPILL ); + assert( (PAGER_FULLFSYNC | PAGER_CKPT_FULLFSYNC | PAGER_CACHESPILL) + == PAGER_FLAGS_MASK ); + assert( (pDb->safety_level & PAGER_SYNCHRONOUS_MASK)==pDb->safety_level ); + while( (n--) > 0 ){ + if( pDb->pBt ){ + sqlite3BtreeSetPagerFlags(pDb->pBt, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK) ); + } + pDb++; + } + } +} +#else +# define setAllPagerFlags(X) /* no-op */ +#endif + + +/* +** Return a human-readable name for a constraint resolution action. +*/ +#ifndef SQLITE_OMIT_FOREIGN_KEY +static const char *actionName(u8 action){ + const char *zName; + switch( action ){ + case OE_SetNull: zName = "SET NULL"; break; + case OE_SetDflt: zName = "SET DEFAULT"; break; + case OE_Cascade: zName = "CASCADE"; break; + case OE_Restrict: zName = "RESTRICT"; break; + default: zName = "NO ACTION"; + assert( action==OE_None ); break; + } + return zName; +} +#endif + + +/* +** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants +** defined in pager.h. This function returns the associated lowercase +** journal-mode name. +*/ +SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){ + static char * const azModeName[] = { + "delete", "persist", "off", "truncate", "memory" +#ifndef SQLITE_OMIT_WAL + , "wal" +#endif + }; + assert( PAGER_JOURNALMODE_DELETE==0 ); + assert( PAGER_JOURNALMODE_PERSIST==1 ); + assert( PAGER_JOURNALMODE_OFF==2 ); + assert( PAGER_JOURNALMODE_TRUNCATE==3 ); + assert( PAGER_JOURNALMODE_MEMORY==4 ); + assert( PAGER_JOURNALMODE_WAL==5 ); + assert( eMode>=0 && eMode<=ArraySize(azModeName) ); + + if( eMode==ArraySize(azModeName) ) return 0; + return azModeName[eMode]; +} + +/* +** Locate a pragma in the aPragmaName[] array. +*/ +static const PragmaName *pragmaLocate(const char *zName){ + int upr, lwr, mid = 0, rc; + lwr = 0; + upr = ArraySize(aPragmaName)-1; + while( lwr<=upr ){ + mid = (lwr+upr)/2; + rc = sqlite3_stricmp(zName, aPragmaName[mid].zName); + if( rc==0 ) break; + if( rc<0 ){ + upr = mid - 1; + }else{ + lwr = mid + 1; + } + } + return lwr>upr ? 0 : &aPragmaName[mid]; +} + +/* +** Create zero or more entries in the output for the SQL functions +** defined by FuncDef p. +*/ +static void pragmaFunclistLine( + Vdbe *v, /* The prepared statement being created */ + FuncDef *p, /* A particular function definition */ + int isBuiltin, /* True if this is a built-in function */ + int showInternFuncs /* True if showing internal functions */ +){ + u32 mask = + SQLITE_DETERMINISTIC | + SQLITE_DIRECTONLY | + SQLITE_SUBTYPE | + SQLITE_INNOCUOUS | + SQLITE_FUNC_INTERNAL + ; + if( showInternFuncs ) mask = 0xffffffff; + for(; p; p=p->pNext){ + const char *zType; + static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" }; + + assert( SQLITE_FUNC_ENCMASK==0x3 ); + assert( strcmp(azEnc[SQLITE_UTF8],"utf8")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16LE],"utf16le")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16BE],"utf16be")==0 ); + + if( p->xSFunc==0 ) continue; + if( (p->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && showInternFuncs==0 + ){ + continue; + } + if( p->xValue!=0 ){ + zType = "w"; + }else if( p->xFinalize!=0 ){ + zType = "a"; + }else{ + zType = "s"; + } + sqlite3VdbeMultiLoad(v, 1, "sissii", + p->zName, isBuiltin, + zType, azEnc[p->funcFlags&SQLITE_FUNC_ENCMASK], + p->nArg, + (p->funcFlags & mask) ^ SQLITE_INNOCUOUS + ); + } +} + + +/* +** Helper subroutine for PRAGMA integrity_check: +** +** Generate code to output a single-column result row with a value of the +** string held in register 3. Decrement the result count in register 1 +** and halt if the maximum number of result rows have been issued. +*/ +static int integrityCheckResultRow(Vdbe *v){ + int addr; + sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); + addr = sqlite3VdbeAddOp3(v, OP_IfPos, 1, sqlite3VdbeCurrentAddr(v)+2, 1); + VdbeCoverage(v); + sqlite3VdbeAddOp0(v, OP_Halt); + return addr; +} + +/* +** Process a pragma statement. +** +** Pragmas are of this form: +** +** PRAGMA [schema.]id [= value] +** +** The identifier might also be a string. The value is a string, and +** identifier, or a number. If minusFlag is true, then the value is +** a number that was preceded by a minus sign. +** +** If the left side is "database.id" then pId1 is the database name +** and pId2 is the id. If the left side is just "id" then pId1 is the +** id and pId2 is any empty string. +*/ +SQLITE_PRIVATE void sqlite3Pragma( + Parse *pParse, + Token *pId1, /* First part of [schema.]id field */ + Token *pId2, /* Second part of [schema.]id field, or NULL */ + Token *pValue, /* Token for , or NULL */ + int minusFlag /* True if a '-' sign preceded */ +){ + char *zLeft = 0; /* Nul-terminated UTF-8 string */ + char *zRight = 0; /* Nul-terminated UTF-8 string , or NULL */ + const char *zDb = 0; /* The database name */ + Token *pId; /* Pointer to token */ + char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */ + int iDb; /* Database index for */ + int rc; /* return value form SQLITE_FCNTL_PRAGMA */ + sqlite3 *db = pParse->db; /* The database connection */ + Db *pDb; /* The specific database being pragmaed */ + Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */ + const PragmaName *pPragma; /* The pragma */ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + extern int sqlcipher_codec_pragma(sqlite3*, int, Parse *, const char *, const char *); +#endif +/* END SQLCIPHER */ + + if( v==0 ) return; + sqlite3VdbeRunOnlyOnce(v); + pParse->nMem = 2; + + /* Interpret the [schema.] part of the pragma statement. iDb is the + ** index of the database this pragma is being applied to in db.aDb[]. */ + iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); + if( iDb<0 ) return; + pDb = &db->aDb[iDb]; + + /* If the temp database has been explicitly named as part of the + ** pragma, make sure it is open. + */ + if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ + return; + } + + zLeft = sqlite3NameFromToken(db, pId); + if( !zLeft ) return; + if( minusFlag ){ + zRight = sqlite3MPrintf(db, "-%T", pValue); + }else{ + zRight = sqlite3NameFromToken(db, pValue); + } + + assert( pId2 ); + zDb = pId2->n>0 ? pDb->zDbSName : 0; + if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ + goto pragma_out; + } + + /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS + ** connection. If it returns SQLITE_OK, then assume that the VFS + ** handled the pragma and generate a no-op prepared statement. + ** + ** IMPLEMENTATION-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, + ** an SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file + ** object corresponding to the database file to which the pragma + ** statement refers. + ** + ** IMPLEMENTATION-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA + ** file control is an array of pointers to strings (char**) in which the + ** second element of the array is the name of the pragma and the third + ** element is the argument to the pragma or NULL if the pragma has no + ** argument. + */ + aFcntl[0] = 0; + aFcntl[1] = zLeft; + aFcntl[2] = zRight; + aFcntl[3] = 0; + db->busyHandler.nBusy = 0; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); + if( rc==SQLITE_OK ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, aFcntl[0], SQLITE_TRANSIENT); + returnSingleText(v, aFcntl[0]); + sqlite3_free(aFcntl[0]); + goto pragma_out; + } + if( rc!=SQLITE_NOTFOUND ){ + if( aFcntl[0] ){ + sqlite3ErrorMsg(pParse, "%s", aFcntl[0]); + sqlite3_free(aFcntl[0]); + } + pParse->nErr++; + pParse->rc = rc; + + goto pragma_out; + } + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if(sqlcipher_codec_pragma(db, iDb, pParse, zLeft, zRight)) { + /* sqlcipher_codec_pragma executes internal */ + goto pragma_out; + } +#endif +/* END SQLCIPHER */ + + /* Locate the pragma in the lookup table */ + pPragma = pragmaLocate(zLeft); + if( pPragma==0 ){ + /* IMP: R-43042-22504 No error messages are generated if an + ** unknown pragma is issued. */ + goto pragma_out; + } + + /* Make sure the database schema is loaded if the pragma requires that */ + if( (pPragma->mPragFlg & PragFlg_NeedSchema)!=0 ){ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + } + + /* Register the result column names for pragmas that return results */ + if( (pPragma->mPragFlg & PragFlg_NoColumns)==0 + && ((pPragma->mPragFlg & PragFlg_NoColumns1)==0 || zRight==0) + ){ + setPragmaResultColumnNames(v, pPragma); + } + + /* Jump to the appropriate pragma handler */ + switch( pPragma->ePragTyp ){ + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) + /* + ** PRAGMA [schema.]default_cache_size + ** PRAGMA [schema.]default_cache_size=N + ** + ** The first form reports the current persistent setting for the + ** page cache size. The value returned is the maximum number of + ** pages in the page cache. The second form sets both the current + ** page cache size value and the persistent page cache size value + ** stored in the database file. + ** + ** Older versions of SQLite would set the default cache size to a + ** negative number to indicate synchronous=OFF. These days, synchronous + ** is always on by default regardless of the sign of the default cache + ** size. But continue to take the absolute value of the default cache + ** size of historical compatibility. + */ + case PragTyp_DEFAULT_CACHE_SIZE: { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList getCacheSize[] = { + { OP_Transaction, 0, 0, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ + { OP_IfPos, 1, 8, 0}, + { OP_Integer, 0, 2, 0}, + { OP_Subtract, 1, 2, 1}, + { OP_IfPos, 1, 8, 0}, + { OP_Integer, 0, 1, 0}, /* 6 */ + { OP_Noop, 0, 0, 0}, + { OP_ResultRow, 1, 1, 0}, + }; + VdbeOp *aOp; + sqlite3VdbeUsesBtree(v, iDb); + if( !zRight ){ + pParse->nMem += 2; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(getCacheSize)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[6].p1 = SQLITE_DEFAULT_CACHE_SIZE; + }else{ + int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, size); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + break; + } +#endif /* !SQLITE_OMIT_PAGER_PRAGMAS && !SQLITE_OMIT_DEPRECATED */ + +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + /* + ** PRAGMA [schema.]page_size + ** PRAGMA [schema.]page_size=N + ** + ** The first form reports the current setting for the + ** database page size in bytes. The second form sets the + ** database page size value. The value can only be set if + ** the database has not yet been created. + */ + case PragTyp_PAGE_SIZE: { + Btree *pBt = pDb->pBt; + assert( pBt!=0 ); + if( !zRight ){ + int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; + returnSingleInt(v, size); + }else{ + /* Malloc may fail when setting the page-size, as there is an internal + ** buffer that the pager module resizes using sqlite3_realloc(). + */ + db->nextPagesize = sqlite3Atoi(zRight); + if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,0,0) ){ + sqlite3OomFault(db); + } + } + break; + } + + /* + ** PRAGMA [schema.]secure_delete + ** PRAGMA [schema.]secure_delete=ON/OFF/FAST + ** + ** The first form reports the current setting for the + ** secure_delete flag. The second form changes the secure_delete + ** flag setting and reports the new value. + */ + case PragTyp_SECURE_DELETE: { + Btree *pBt = pDb->pBt; + int b = -1; + assert( pBt!=0 ); + if( zRight ){ + if( sqlite3_stricmp(zRight, "fast")==0 ){ + b = 2; + }else{ + b = sqlite3GetBoolean(zRight, 0); + } + } + if( pId2->n==0 && b>=0 ){ + int ii; + for(ii=0; iinDb; ii++){ + sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b); + } + } + b = sqlite3BtreeSecureDelete(pBt, b); + returnSingleInt(v, b); + break; + } + + /* + ** PRAGMA [schema.]max_page_count + ** PRAGMA [schema.]max_page_count=N + ** + ** The first form reports the current setting for the + ** maximum number of pages in the database file. The + ** second form attempts to change this setting. Both + ** forms return the current setting. + ** + ** The absolute value of N is used. This is undocumented and might + ** change. The only purpose is to provide an easy way to test + ** the sqlite3AbsInt32() function. + ** + ** PRAGMA [schema.]page_count + ** + ** Return the number of pages in the specified database. + */ + case PragTyp_PAGE_COUNT: { + int iReg; + i64 x = 0; + sqlite3CodeVerifySchema(pParse, iDb); + iReg = ++pParse->nMem; + if( sqlite3Tolower(zLeft[0])=='p' ){ + sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); + }else{ + if( zRight && sqlite3DecOrHexToI64(zRight,&x)==0 ){ + if( x<0 ) x = 0; + else if( x>0xfffffffe ) x = 0xfffffffe; + }else{ + x = 0; + } + sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, (int)x); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); + break; + } + + /* + ** PRAGMA [schema.]locking_mode + ** PRAGMA [schema.]locking_mode = (normal|exclusive) + */ + case PragTyp_LOCKING_MODE: { + const char *zRet = "normal"; + int eMode = getLockingMode(zRight); + + if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){ + /* Simple "PRAGMA locking_mode;" statement. This is a query for + ** the current default locking mode (which may be different to + ** the locking-mode of the main database). + */ + eMode = db->dfltLockMode; + }else{ + Pager *pPager; + if( pId2->n==0 ){ + /* This indicates that no database name was specified as part + ** of the PRAGMA command. In this case the locking-mode must be + ** set on all attached databases, as well as the main db file. + ** + ** Also, the sqlite3.dfltLockMode variable is set so that + ** any subsequently attached databases also use the specified + ** locking mode. + */ + int ii; + assert(pDb==&db->aDb[0]); + for(ii=2; iinDb; ii++){ + pPager = sqlite3BtreePager(db->aDb[ii].pBt); + sqlite3PagerLockingMode(pPager, eMode); + } + db->dfltLockMode = (u8)eMode; + } + pPager = sqlite3BtreePager(pDb->pBt); + eMode = sqlite3PagerLockingMode(pPager, eMode); + } + + assert( eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ + zRet = "exclusive"; + } + returnSingleText(v, zRet); + break; + } + + /* + ** PRAGMA [schema.]journal_mode + ** PRAGMA [schema.]journal_mode = + ** (delete|persist|off|truncate|memory|wal|off) + */ + case PragTyp_JOURNAL_MODE: { + int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ + int ii; /* Loop counter */ + + if( zRight==0 ){ + /* If there is no "=MODE" part of the pragma, do a query for the + ** current mode */ + eMode = PAGER_JOURNALMODE_QUERY; + }else{ + const char *zMode; + int n = sqlite3Strlen30(zRight); + for(eMode=0; (zMode = sqlite3JournalModename(eMode))!=0; eMode++){ + if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break; + } + if( !zMode ){ + /* If the "=MODE" part does not match any known journal mode, + ** then do a query */ + eMode = PAGER_JOURNALMODE_QUERY; + } + if( eMode==PAGER_JOURNALMODE_OFF && (db->flags & SQLITE_Defensive)!=0 ){ + /* Do not allow journal-mode "OFF" in defensive since the database + ** can become corrupted using ordinary SQL when the journal is off */ + eMode = PAGER_JOURNALMODE_QUERY; + } + } + if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ + /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ + iDb = 0; + pId2->n = 1; + } + for(ii=db->nDb-1; ii>=0; ii--){ + if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ + sqlite3VdbeUsesBtree(v, ii); + sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode); + } + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + break; + } + + /* + ** PRAGMA [schema.]journal_size_limit + ** PRAGMA [schema.]journal_size_limit=N + ** + ** Get or set the size limit on rollback journal files. + */ + case PragTyp_JOURNAL_SIZE_LIMIT: { + Pager *pPager = sqlite3BtreePager(pDb->pBt); + i64 iLimit = -2; + if( zRight ){ + sqlite3DecOrHexToI64(zRight, &iLimit); + if( iLimit<-1 ) iLimit = -1; + } + iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); + returnSingleInt(v, iLimit); + break; + } + +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + + /* + ** PRAGMA [schema.]auto_vacuum + ** PRAGMA [schema.]auto_vacuum=N + ** + ** Get or set the value of the database 'auto-vacuum' parameter. + ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + case PragTyp_AUTO_VACUUM: { + Btree *pBt = pDb->pBt; + assert( pBt!=0 ); + if( !zRight ){ + returnSingleInt(v, sqlite3BtreeGetAutoVacuum(pBt)); + }else{ + int eAuto = getAutoVacuum(zRight); + assert( eAuto>=0 && eAuto<=2 ); + db->nextAutovac = (u8)eAuto; + /* Call SetAutoVacuum() to set initialize the internal auto and + ** incr-vacuum flags. This is required in case this connection + ** creates the database file. It is important that it is created + ** as an auto-vacuum capable db. + */ + rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); + if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ + /* When setting the auto_vacuum mode to either "full" or + ** "incremental", write the value of meta[6] in the database + ** file. Before writing to meta[6], check that meta[3] indicates + ** that this really is an auto-vacuum capable database. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList setMeta6[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE}, + { OP_If, 1, 0, 0}, /* 2 */ + { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ + { OP_SetCookie, 0, BTREE_INCR_VACUUM, 0}, /* 4 */ + }; + VdbeOp *aOp; + int iAddr = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setMeta6)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[2].p2 = iAddr+4; + aOp[4].p1 = iDb; + aOp[4].p3 = eAuto - 1; + sqlite3VdbeUsesBtree(v, iDb); + } + } + break; + } +#endif + + /* + ** PRAGMA [schema.]incremental_vacuum(N) + ** + ** Do N steps of incremental vacuuming on a database. + */ +#ifndef SQLITE_OMIT_AUTOVACUUM + case PragTyp_INCREMENTAL_VACUUM: { + int iLimit = 0, addr; + if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ + iLimit = 0x7fffffff; + } + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3VdbeAddOp2(v, OP_Integer, iLimit, 1); + addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_ResultRow, 1); + sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); + sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr); + break; + } +#endif + +#ifndef SQLITE_OMIT_PAGER_PRAGMAS + /* + ** PRAGMA [schema.]cache_size + ** PRAGMA [schema.]cache_size=N + ** + ** The first form reports the current local setting for the + ** page cache size. The second form sets the local + ** page cache size value. If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + */ + case PragTyp_CACHE_SIZE: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, pDb->pSchema->cache_size); + }else{ + int size = sqlite3Atoi(zRight); + pDb->pSchema->cache_size = size; + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + break; + } + + /* + ** PRAGMA [schema.]cache_spill + ** PRAGMA cache_spill=BOOLEAN + ** PRAGMA [schema.]cache_spill=N + ** + ** The first form reports the current local setting for the + ** page cache spill size. The second form turns cache spill on + ** or off. When turnning cache spill on, the size is set to the + ** current cache_size. The third form sets a spill size that + ** may be different form the cache size. + ** If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + ** + ** If the number of cache_spill pages is less then the number of + ** cache_size pages, no spilling occurs until the page count exceeds + ** the number of cache_size pages. + ** + ** The cache_spill=BOOLEAN setting applies to all attached schemas, + ** not just the schema specified. + */ + case PragTyp_CACHE_SPILL: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, + (db->flags & SQLITE_CacheSpill)==0 ? 0 : + sqlite3BtreeSetSpillSize(pDb->pBt,0)); + }else{ + int size = 1; + if( sqlite3GetInt32(zRight, &size) ){ + sqlite3BtreeSetSpillSize(pDb->pBt, size); + } + if( sqlite3GetBoolean(zRight, size!=0) ){ + db->flags |= SQLITE_CacheSpill; + }else{ + db->flags &= ~(u64)SQLITE_CacheSpill; + } + setAllPagerFlags(db); + } + break; + } + + /* + ** PRAGMA [schema.]mmap_size(N) + ** + ** Used to set mapping size limit. The mapping size limit is + ** used to limit the aggregate size of all memory mapped regions of the + ** database file. If this parameter is set to zero, then memory mapping + ** is not used at all. If N is negative, then the default memory map + ** limit determined by sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) is set. + ** The parameter N is measured in bytes. + ** + ** This value is advisory. The underlying VFS is free to memory map + ** as little or as much as it wants. Except, if N is set to 0 then the + ** upper layers will never invoke the xFetch interfaces to the VFS. + */ + case PragTyp_MMAP_SIZE: { + sqlite3_int64 sz; +#if SQLITE_MAX_MMAP_SIZE>0 + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( zRight ){ + int ii; + sqlite3DecOrHexToI64(zRight, &sz); + if( sz<0 ) sz = sqlite3GlobalConfig.szMmap; + if( pId2->n==0 ) db->szMmap = sz; + for(ii=db->nDb-1; ii>=0; ii--){ + if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ + sqlite3BtreeSetMmapLimit(db->aDb[ii].pBt, sz); + } + } + } + sz = -1; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_MMAP_SIZE, &sz); +#else + sz = 0; + rc = SQLITE_OK; +#endif + if( rc==SQLITE_OK ){ + returnSingleInt(v, sz); + }else if( rc!=SQLITE_NOTFOUND ){ + pParse->nErr++; + pParse->rc = rc; + } + break; + } + + /* + ** PRAGMA temp_store + ** PRAGMA temp_store = "default"|"memory"|"file" + ** + ** Return or set the local value of the temp_store flag. Changing + ** the local value does not make changes to the disk file and the default + ** value will be restored the next time the database is opened. + ** + ** Note that it is possible for the library compile-time options to + ** override this setting + */ + case PragTyp_TEMP_STORE: { + if( !zRight ){ + returnSingleInt(v, db->temp_store); + }else{ + changeTempStorage(pParse, zRight); + } + break; + } + + /* + ** PRAGMA temp_store_directory + ** PRAGMA temp_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the temp_store_directory flag. Changing + ** the value sets a specific directory to be used for temporary files. + ** Setting to a null string reverts to the default temporary directory search. + ** If temporary directory is changed, then invalidateTempStorage. + ** + */ + case PragTyp_TEMP_STORE_DIRECTORY: { + if( !zRight ){ + returnSingleText(v, sqlite3_temp_directory); + }else{ +#ifndef SQLITE_OMIT_WSD + if( zRight[0] ){ + int res; + rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); + if( rc!=SQLITE_OK || res==0 ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + } + if( SQLITE_TEMP_STORE==0 + || (SQLITE_TEMP_STORE==1 && db->temp_store<=1) + || (SQLITE_TEMP_STORE==2 && db->temp_store==1) + ){ + invalidateTempStorage(pParse); + } + sqlite3_free(sqlite3_temp_directory); + if( zRight[0] ){ + sqlite3_temp_directory = sqlite3_mprintf("%s", zRight); + }else{ + sqlite3_temp_directory = 0; + } +#endif /* SQLITE_OMIT_WSD */ + } + break; + } + +#if SQLITE_OS_WIN + /* + ** PRAGMA data_store_directory + ** PRAGMA data_store_directory = ""|"directory_name" + ** + ** Return or set the local value of the data_store_directory flag. Changing + ** the value sets a specific directory to be used for database files that + ** were specified with a relative pathname. Setting to a null string reverts + ** to the default database directory, which for database files specified with + ** a relative path will probably be based on the current directory for the + ** process. Database file specified with an absolute path are not impacted + ** by this setting, regardless of its value. + ** + */ + case PragTyp_DATA_STORE_DIRECTORY: { + if( !zRight ){ + returnSingleText(v, sqlite3_data_directory); + }else{ +#ifndef SQLITE_OMIT_WSD + if( zRight[0] ){ + int res; + rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); + if( rc!=SQLITE_OK || res==0 ){ + sqlite3ErrorMsg(pParse, "not a writable directory"); + goto pragma_out; + } + } + sqlite3_free(sqlite3_data_directory); + if( zRight[0] ){ + sqlite3_data_directory = sqlite3_mprintf("%s", zRight); + }else{ + sqlite3_data_directory = 0; + } +#endif /* SQLITE_OMIT_WSD */ + } + break; + } +#endif + +#if SQLITE_ENABLE_LOCKING_STYLE + /* + ** PRAGMA [schema.]lock_proxy_file + ** PRAGMA [schema.]lock_proxy_file = ":auto:"|"lock_file_path" + ** + ** Return or set the value of the lock_proxy_file flag. Changing + ** the value sets a specific file to be used for database access locks. + ** + */ + case PragTyp_LOCK_PROXY_FILE: { + if( !zRight ){ + Pager *pPager = sqlite3BtreePager(pDb->pBt); + char *proxy_file_path = NULL; + sqlite3_file *pFile = sqlite3PagerFile(pPager); + sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, + &proxy_file_path); + returnSingleText(v, proxy_file_path); + }else{ + Pager *pPager = sqlite3BtreePager(pDb->pBt); + sqlite3_file *pFile = sqlite3PagerFile(pPager); + int res; + if( zRight[0] ){ + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + zRight); + } else { + res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, + NULL); + } + if( res!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "failed to set lock proxy file"); + goto pragma_out; + } + } + break; + } +#endif /* SQLITE_ENABLE_LOCKING_STYLE */ + + /* + ** PRAGMA [schema.]synchronous + ** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL|EXTRA + ** + ** Return or set the local value of the synchronous flag. Changing + ** the local value does not make changes to the disk file and the + ** default value will be restored the next time the database is + ** opened. + */ + case PragTyp_SYNCHRONOUS: { + if( !zRight ){ + returnSingleInt(v, pDb->safety_level-1); + }else{ + if( !db->autoCommit ){ + sqlite3ErrorMsg(pParse, + "Safety level may not be changed inside a transaction"); + }else if( iDb!=1 ){ + int iLevel = (getSafetyLevel(zRight,0,1)+1) & PAGER_SYNCHRONOUS_MASK; + if( iLevel==0 ) iLevel = 1; + pDb->safety_level = iLevel; + pDb->bSyncSet = 1; + setAllPagerFlags(db); + } + } + break; + } +#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ + +#ifndef SQLITE_OMIT_FLAG_PRAGMAS + case PragTyp_FLAG: { + if( zRight==0 ){ + setPragmaResultColumnNames(v, pPragma); + returnSingleInt(v, (db->flags & pPragma->iArg)!=0 ); + }else{ + u64 mask = pPragma->iArg; /* Mask of bits to set or clear. */ + if( db->autoCommit==0 ){ + /* Foreign key support may not be enabled or disabled while not + ** in auto-commit mode. */ + mask &= ~(SQLITE_ForeignKeys); + } +#if SQLITE_USER_AUTHENTICATION + if( db->auth.authLevel==UAUTH_User ){ + /* Do not allow non-admin users to modify the schema arbitrarily */ + mask &= ~(SQLITE_WriteSchema); + } +#endif + + if( sqlite3GetBoolean(zRight, 0) ){ + db->flags |= mask; + }else{ + db->flags &= ~mask; + if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; + if( (mask & SQLITE_WriteSchema)!=0 + && sqlite3_stricmp(zRight, "reset")==0 + ){ + /* IMP: R-60817-01178 If the argument is "RESET" then schema + ** writing is disabled (as with "PRAGMA writable_schema=OFF") and, + ** in addition, the schema is reloaded. */ + sqlite3ResetAllSchemasOfConnection(db); + } + } + + /* Many of the flag-pragmas modify the code generated by the SQL + ** compiler (eg. count_changes). So add an opcode to expire all + ** compiled SQL statements after modifying a pragma value. + */ + sqlite3VdbeAddOp0(v, OP_Expire); + setAllPagerFlags(db); + } + break; + } +#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ + +#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS + /* + ** PRAGMA table_info(
        ) + ** + ** Return a single row for each column of the named table. The columns of + ** the returned data set are: + ** + ** cid: Column id (numbered from left to right, starting at 0) + ** name: Column name + ** type: Column declaration type. + ** notnull: True if 'NOT NULL' is part of column declaration + ** dflt_value: The default value for the column, if any. + ** pk: Non-zero for PK fields. + */ + case PragTyp_TABLE_INFO: if( zRight ){ + Table *pTab; + sqlite3CodeVerifyNamedSchema(pParse, zDb); + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab ){ + int i, k; + int nHidden = 0; + Column *pCol; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + pParse->nMem = 7; + sqlite3ViewGetColumnNames(pParse, pTab); + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + int isHidden = 0; + const Expr *pColExpr; + if( pCol->colFlags & COLFLAG_NOINSERT ){ + if( pPragma->iArg==0 ){ + nHidden++; + continue; + } + if( pCol->colFlags & COLFLAG_VIRTUAL ){ + isHidden = 2; /* GENERATED ALWAYS AS ... VIRTUAL */ + }else if( pCol->colFlags & COLFLAG_STORED ){ + isHidden = 3; /* GENERATED ALWAYS AS ... STORED */ + }else{ assert( pCol->colFlags & COLFLAG_HIDDEN ); + isHidden = 1; /* HIDDEN */ + } + } + if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ + k = 0; + }else if( pPk==0 ){ + k = 1; + }else{ + for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} + } + pColExpr = sqlite3ColumnExpr(pTab,pCol); + assert( pColExpr==0 || pColExpr->op==TK_SPAN || isHidden>=2 ); + assert( pColExpr==0 || !ExprHasProperty(pColExpr, EP_IntValue) + || isHidden>=2 ); + sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", + i-nHidden, + pCol->zCnName, + sqlite3ColumnType(pCol,""), + pCol->notNull ? 1 : 0, + (isHidden>=2 || pColExpr==0) ? 0 : pColExpr->u.zToken, + k, + isHidden); + } + } + } + break; + + /* + ** PRAGMA table_list + ** + ** Return a single row for each table, virtual table, or view in the + ** entire schema. + ** + ** schema: Name of attached database hold this table + ** name: Name of the table itself + ** type: "table", "view", "virtual", "shadow" + ** ncol: Number of columns + ** wr: True for a WITHOUT ROWID table + ** strict: True for a STRICT table + */ + case PragTyp_TABLE_LIST: { + int ii; + pParse->nMem = 6; + sqlite3CodeVerifyNamedSchema(pParse, zDb); + for(ii=0; iinDb; ii++){ + HashElem *k; + Hash *pHash; + int initNCol; + if( zDb && sqlite3_stricmp(zDb, db->aDb[ii].zDbSName)!=0 ) continue; + + /* Ensure that the Table.nCol field is initialized for all views + ** and virtual tables. Each time we initialize a Table.nCol value + ** for a table, that can potentially disrupt the hash table, so restart + ** the initialization scan. + */ + pHash = &db->aDb[ii].pSchema->tblHash; + initNCol = sqliteHashCount(pHash); + while( initNCol-- ){ + for(k=sqliteHashFirst(pHash); 1; k=sqliteHashNext(k) ){ + Table *pTab; + if( k==0 ){ initNCol = 0; break; } + pTab = sqliteHashData(k); + if( pTab->nCol==0 ){ + char *zSql = sqlite3MPrintf(db, "SELECT*FROM\"%w\"", pTab->zName); + if( zSql ){ + sqlite3_stmt *pDummy = 0; + (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); + (void)sqlite3_finalize(pDummy); + sqlite3DbFree(db, zSql); + } + if( db->mallocFailed ){ + sqlite3ErrorMsg(db->pParse, "out of memory"); + db->pParse->rc = SQLITE_NOMEM_BKPT; + } + pHash = &db->aDb[ii].pSchema->tblHash; + break; + } + } + } + + for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k) ){ + Table *pTab = sqliteHashData(k); + const char *zType; + if( zRight && sqlite3_stricmp(zRight, pTab->zName)!=0 ) continue; + if( IsView(pTab) ){ + zType = "view"; + }else if( IsVirtual(pTab) ){ + zType = "virtual"; + }else if( pTab->tabFlags & TF_Shadow ){ + zType = "shadow"; + }else{ + zType = "table"; + } + sqlite3VdbeMultiLoad(v, 1, "sssiii", + db->aDb[ii].zDbSName, + sqlite3PreferredTableName(pTab->zName), + zType, + pTab->nCol, + (pTab->tabFlags & TF_WithoutRowid)!=0, + (pTab->tabFlags & TF_Strict)!=0 + ); + } + } + } + break; + +#ifdef SQLITE_DEBUG + case PragTyp_STATS: { + Index *pIdx; + HashElem *i; + pParse->nMem = 5; + sqlite3CodeVerifySchema(pParse, iDb); + for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + sqlite3VdbeMultiLoad(v, 1, "ssiii", + sqlite3PreferredTableName(pTab->zName), + 0, + pTab->szTabRow, + pTab->nRowLogEst, + pTab->tabFlags); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3VdbeMultiLoad(v, 2, "siiiX", + pIdx->zName, + pIdx->szIdxRow, + pIdx->aiRowLogEst[0], + pIdx->hasStat1); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); + } + } + } + break; +#endif + + case PragTyp_INDEX_INFO: if( zRight ){ + Index *pIdx; + Table *pTab; + pIdx = sqlite3FindIndex(db, zRight, zDb); + if( pIdx==0 ){ + /* If there is no index named zRight, check to see if there is a + ** WITHOUT ROWID table named zRight, and if there is, show the + ** structure of the PRIMARY KEY index for that table. */ + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab && !HasRowid(pTab) ){ + pIdx = sqlite3PrimaryKeyIndex(pTab); + } + } + if( pIdx ){ + int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema); + int i; + int mx; + if( pPragma->iArg ){ + /* PRAGMA index_xinfo (newer version with more rows and columns) */ + mx = pIdx->nColumn; + pParse->nMem = 6; + }else{ + /* PRAGMA index_info (legacy version) */ + mx = pIdx->nKeyCol; + pParse->nMem = 3; + } + pTab = pIdx->pTable; + sqlite3CodeVerifySchema(pParse, iIdxDb); + assert( pParse->nMem<=pPragma->nPragCName ); + for(i=0; iaiColumn[i]; + sqlite3VdbeMultiLoad(v, 1, "iisX", i, cnum, + cnum<0 ? 0 : pTab->aCol[cnum].zCnName); + if( pPragma->iArg ){ + sqlite3VdbeMultiLoad(v, 4, "isiX", + pIdx->aSortOrder[i], + pIdx->azColl[i], + inKeyCol); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); + } + } + } + break; + + case PragTyp_INDEX_LIST: if( zRight ){ + Index *pIdx; + Table *pTab; + int i; + pTab = sqlite3FindTable(db, zRight, zDb); + if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pParse->nMem = 5; + sqlite3CodeVerifySchema(pParse, iTabDb); + for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ + const char *azOrigin[] = { "c", "u", "pk" }; + sqlite3VdbeMultiLoad(v, 1, "isisi", + i, + pIdx->zName, + IsUniqueIndex(pIdx), + azOrigin[pIdx->idxType], + pIdx->pPartIdxWhere!=0); + } + } + } + break; + + case PragTyp_DATABASE_LIST: { + int i; + pParse->nMem = 3; + for(i=0; inDb; i++){ + if( db->aDb[i].pBt==0 ) continue; + assert( db->aDb[i].zDbSName!=0 ); + sqlite3VdbeMultiLoad(v, 1, "iss", + i, + db->aDb[i].zDbSName, + sqlite3BtreeGetFilename(db->aDb[i].pBt)); + } + } + break; + + case PragTyp_COLLATION_LIST: { + int i = 0; + HashElem *p; + pParse->nMem = 2; + for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(p); + sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); + } + } + break; + +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS + case PragTyp_FUNCTION_LIST: { + int i; + HashElem *j; + FuncDef *p; + int showInternFunc = (db->mDbFlags & DBFLAG_InternalFunc)!=0; + pParse->nMem = 6; + for(i=0; iu.pHash ){ + assert( p->funcFlags & SQLITE_FUNC_BUILTIN ); + pragmaFunclistLine(v, p, 1, showInternFunc); + } + } + for(j=sqliteHashFirst(&db->aFunc); j; j=sqliteHashNext(j)){ + p = (FuncDef*)sqliteHashData(j); + assert( (p->funcFlags & SQLITE_FUNC_BUILTIN)==0 ); + pragmaFunclistLine(v, p, 0, showInternFunc); + } + } + break; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + case PragTyp_MODULE_LIST: { + HashElem *j; + pParse->nMem = 1; + for(j=sqliteHashFirst(&db->aModule); j; j=sqliteHashNext(j)){ + Module *pMod = (Module*)sqliteHashData(j); + sqlite3VdbeMultiLoad(v, 1, "s", pMod->zName); + } + } + break; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + case PragTyp_PRAGMA_LIST: { + int i; + for(i=0; iu.tab.pFKey; + if( pFK ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + int i = 0; + pParse->nMem = 8; + sqlite3CodeVerifySchema(pParse, iTabDb); + while(pFK){ + int j; + for(j=0; jnCol; j++){ + sqlite3VdbeMultiLoad(v, 1, "iissssss", + i, + j, + pFK->zTo, + pTab->aCol[pFK->aCol[j].iFrom].zCnName, + pFK->aCol[j].zCol, + actionName(pFK->aAction[1]), /* ON UPDATE */ + actionName(pFK->aAction[0]), /* ON DELETE */ + "NONE"); + } + ++i; + pFK = pFK->pNextFrom; + } + } + } + } + break; +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef SQLITE_OMIT_FOREIGN_KEY +#ifndef SQLITE_OMIT_TRIGGER + case PragTyp_FOREIGN_KEY_CHECK: { + FKey *pFK; /* A foreign key constraint */ + Table *pTab; /* Child table contain "REFERENCES" keyword */ + Table *pParent; /* Parent table that child points to */ + Index *pIdx; /* Index in the parent table */ + int i; /* Loop counter: Foreign key number for pTab */ + int j; /* Loop counter: Field of the foreign key */ + HashElem *k; /* Loop counter: Next table in schema */ + int x; /* result variable */ + int regResult; /* 3 registers to hold a result row */ + int regRow; /* Registers to hold a row from pTab */ + int addrTop; /* Top of a loop checking foreign keys */ + int addrOk; /* Jump here if the key is OK */ + int *aiCols; /* child to parent column mapping */ + + regResult = pParse->nMem+1; + pParse->nMem += 4; + regRow = ++pParse->nMem; + k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); + while( k ){ + if( zRight ){ + pTab = sqlite3LocateTable(pParse, 0, zRight, zDb); + k = 0; + }else{ + pTab = (Table*)sqliteHashData(k); + k = sqliteHashNext(k); + } + if( pTab==0 || !IsOrdinaryTable(pTab) || pTab->u.tab.pFKey==0 ) continue; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zDb = db->aDb[iDb].zDbSName; + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; + sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); + sqlite3VdbeLoadString(v, regResult, pTab->zName); + assert( IsOrdinaryTable(pTab) ); + for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){ + pParent = sqlite3FindTable(db, pFK->zTo, zDb); + if( pParent==0 ) continue; + pIdx = 0; + sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName); + x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0); + if( x==0 ){ + if( pIdx==0 ){ + sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead); + }else{ + sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + } + }else{ + k = 0; + break; + } + } + assert( pParse->nErr>0 || pFK==0 ); + if( pFK ) break; + if( pParse->nTabnTab = i; + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); + assert( IsOrdinaryTable(pTab) ); + for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){ + pParent = sqlite3FindTable(db, pFK->zTo, zDb); + pIdx = 0; + aiCols = 0; + if( pParent ){ + x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); + assert( x==0 || db->mallocFailed ); + } + addrOk = sqlite3VdbeMakeLabel(pParse); + + /* Generate code to read the child key values into registers + ** regRow..regRow+n. If any of the child key values are NULL, this + ** row cannot cause an FK violation. Jump directly to addrOk in + ** this case. */ + if( regRow+pFK->nCol>pParse->nMem ) pParse->nMem = regRow+pFK->nCol; + for(j=0; jnCol; j++){ + int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; + sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); + } + + /* Generate code to query the parent index for a matching parent + ** key. If a match is found, jump to addrOk. */ + if( pIdx ){ + sqlite3VdbeAddOp4(v, OP_Affinity, regRow, pFK->nCol, 0, + sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regRow, pFK->nCol); + VdbeCoverage(v); + }else if( pParent ){ + int jmp = sqlite3VdbeCurrentAddr(v)+2; + sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrOk); + assert( pFK->nCol==1 || db->mallocFailed ); + } + + /* Generate code to report an FK violation to the caller. */ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, regResult+1); + } + sqlite3VdbeMultiLoad(v, regResult+2, "siX", pFK->zTo, i-1); + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4); + sqlite3VdbeResolveLabel(v, addrOk); + sqlite3DbFree(db, aiCols); + } + sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrTop); + } + } + break; +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ +#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ + +#ifndef SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA + /* Reinstall the LIKE and GLOB functions. The variant of LIKE + ** used will be case sensitive or not depending on the RHS. + */ + case PragTyp_CASE_SENSITIVE_LIKE: { + if( zRight ){ + sqlite3RegisterLikeFunctions(db, sqlite3GetBoolean(zRight, 0)); + } + } + break; +#endif /* SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA */ + +#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX +# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 +#endif + +#ifndef SQLITE_OMIT_INTEGRITY_CHECK + /* PRAGMA integrity_check + ** PRAGMA integrity_check(N) + ** PRAGMA quick_check + ** PRAGMA quick_check(N) + ** + ** Verify the integrity of the database. + ** + ** The "quick_check" is reduced version of + ** integrity_check designed to detect most database corruption + ** without the overhead of cross-checking indexes. Quick_check + ** is linear time wherease integrity_check is O(NlogN). + ** + ** The maximum nubmer of errors is 100 by default. A different default + ** can be specified using a numeric parameter N. + ** + ** Or, the parameter N can be the name of a table. In that case, only + ** the one table named is verified. The freelist is only verified if + ** the named table is "sqlite_schema" (or one of its aliases). + ** + ** All schemas are checked by default. To check just a single + ** schema, use the form: + ** + ** PRAGMA schema.integrity_check; + */ + case PragTyp_INTEGRITY_CHECK: { + int i, j, addr, mxErr; + Table *pObjTab = 0; /* Check only this one table, if not NULL */ + + int isQuick = (sqlite3Tolower(zLeft[0])=='q'); + + /* If the PRAGMA command was of the form "PRAGMA .integrity_check", + ** then iDb is set to the index of the database identified by . + ** In this case, the integrity of database iDb only is verified by + ** the VDBE created below. + ** + ** Otherwise, if the command was simply "PRAGMA integrity_check" (or + ** "PRAGMA quick_check"), then iDb is set to 0. In this case, set iDb + ** to -1 here, to indicate that the VDBE should verify the integrity + ** of all attached databases. */ + assert( iDb>=0 ); + assert( iDb==0 || pId2->z ); + if( pId2->z==0 ) iDb = -1; + + /* Initialize the VDBE program */ + pParse->nMem = 6; + + /* Set the maximum error count */ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + if( zRight ){ + if( sqlite3GetInt32(zRight, &mxErr) ){ + if( mxErr<=0 ){ + mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; + } + }else{ + pObjTab = sqlite3LocateTable(pParse, 0, zRight, + iDb>=0 ? db->aDb[iDb].zDbSName : 0); + } + } + sqlite3VdbeAddOp2(v, OP_Integer, mxErr-1, 1); /* reg[1] holds errors left */ + + /* Do an integrity check on each database file */ + for(i=0; inDb; i++){ + HashElem *x; /* For looping over tables in the schema */ + Hash *pTbls; /* Set of all tables in the schema */ + int *aRoot; /* Array of root page numbers of all btrees */ + int cnt = 0; /* Number of entries in aRoot[] */ + int mxIdx = 0; /* Maximum number of indexes for any table */ + + if( OMIT_TEMPDB && i==1 ) continue; + if( iDb>=0 && i!=iDb ) continue; + + sqlite3CodeVerifySchema(pParse, i); + + /* Do an integrity check of the B-Tree + ** + ** Begin by finding the root pages numbers + ** for all tables and indices in the database. + */ + assert( sqlite3SchemaMutexHeld(db, i, 0) ); + pTbls = &db->aDb[i].pSchema->tblHash; + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); /* Current table */ + Index *pIdx; /* An index on pTab */ + int nIdx; /* Number of indexes on pTab */ + if( pObjTab && pObjTab!=pTab ) continue; + if( HasRowid(pTab) ) cnt++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } + if( nIdx>mxIdx ) mxIdx = nIdx; + } + if( cnt==0 ) continue; + if( pObjTab ) cnt++; + aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); + if( aRoot==0 ) break; + cnt = 0; + if( pObjTab ) aRoot[++cnt] = 0; + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx; + if( pObjTab && pObjTab!=pTab ) continue; + if( HasRowid(pTab) ) aRoot[++cnt] = pTab->tnum; + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + aRoot[++cnt] = pIdx->tnum; + } + } + aRoot[0] = cnt; + + /* Make sure sufficient number of registers have been allocated */ + pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); + sqlite3ClearTempRegCache(pParse); + + /* Do the b-tree integrity checks */ + sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); + sqlite3VdbeChangeP5(v, (u8)i); + addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, + sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName), + P4_DYNAMIC); + sqlite3VdbeAddOp3(v, OP_Concat, 2, 3, 3); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, addr); + + /* Make sure all the indices are constructed correctly. + */ + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + Index *pIdx, *pPk; + Index *pPrior = 0; + int loopTop; + int iDataCur, iIdxCur; + int r1 = -1; + int bStrict; + + if( !IsOrdinaryTable(pTab) ) continue; + if( pObjTab && pObjTab!=pTab ) continue; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, + 1, 0, &iDataCur, &iIdxCur); + /* reg[7] counts the number of entries in the table. + ** reg[8+i] counts the number of entries in the i-th index + */ + sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ + } + assert( pParse->nMem>=8+j ); + assert( sqlite3NoTempsInRange(pParse,1,7+j) ); + sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); + loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); + if( !isQuick ){ + /* Sanity check on record header decoding */ + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + VdbeComment((v, "(right-most column)")); + } + /* Verify that all NOT NULL columns really are NOT NULL. At the + ** same time verify the type of the content of STRICT tables */ + bStrict = (pTab->tabFlags & TF_Strict)!=0; + for(j=0; jnCol; j++){ + char *zErr; + Column *pCol = pTab->aCol + j; + int doError, jmp2; + if( j==pTab->iPKey ) continue; + if( pCol->notNull==0 && !bStrict ) continue; + doError = bStrict ? sqlite3VdbeMakeLabel(pParse) : 0; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); + if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){ + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + } + if( pCol->notNull ){ + jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); + zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, + pCol->zCnName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + if( bStrict && pCol->eCType!=COLTYPE_ANY ){ + sqlite3VdbeGoto(v, doError); + }else{ + integrityCheckResultRow(v); + } + sqlite3VdbeJumpHere(v, jmp2); + } + if( (pTab->tabFlags & TF_Strict)!=0 + && pCol->eCType!=COLTYPE_ANY + ){ + jmp2 = sqlite3VdbeAddOp3(v, OP_IsNullOrType, 3, 0, + sqlite3StdTypeMap[pCol->eCType-1]); + VdbeCoverage(v); + zErr = sqlite3MPrintf(db, "non-%s value in %s.%s", + sqlite3StdType[pCol->eCType-1], + pTab->zName, pTab->aCol[j].zCnName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + sqlite3VdbeResolveLabel(v, doError); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, jmp2); + } + } + /* Verify CHECK constraints */ + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ + ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); + if( db->mallocFailed==0 ){ + int addrCkFault = sqlite3VdbeMakeLabel(pParse); + int addrCkOk = sqlite3VdbeMakeLabel(pParse); + char *zErr; + int k; + pParse->iSelfTab = iDataCur + 1; + for(k=pCheck->nExpr-1; k>0; k--){ + sqlite3ExprIfFalse(pParse, pCheck->a[k].pExpr, addrCkFault, 0); + } + sqlite3ExprIfTrue(pParse, pCheck->a[0].pExpr, addrCkOk, + SQLITE_JUMPIFNULL); + sqlite3VdbeResolveLabel(v, addrCkFault); + pParse->iSelfTab = 0; + zErr = sqlite3MPrintf(db, "CHECK constraint failed in %s", + pTab->zName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + integrityCheckResultRow(v); + sqlite3VdbeResolveLabel(v, addrCkOk); + } + sqlite3ExprListDelete(db, pCheck); + } + if( !isQuick ){ /* Omit the remaining tests for quick_check */ + /* Validate index entries for the current row */ + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + int jmp2, jmp3, jmp4, jmp5; + int ckUniq = sqlite3VdbeMakeLabel(pParse); + if( pPk==pIdx ) continue; + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, + pPrior, r1); + pPrior = pIdx; + sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1);/* increment entry count */ + /* Verify that an index entry exists for the current table row */ + jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, + pIdx->nColumn); VdbeCoverage(v); + sqlite3VdbeLoadString(v, 3, "row "); + sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); + sqlite3VdbeLoadString(v, 4, " missing from index "); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp5 = sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp4 = integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, jmp2); + /* For UNIQUE indexes, verify that only one entry exists with the + ** current key. The entry is unique if (1) any column is NULL + ** or (2) the next entry has a different key */ + if( IsUniqueIndex(pIdx) ){ + int uniqOk = sqlite3VdbeMakeLabel(pParse); + int jmp6; + int kk; + for(kk=0; kknKeyCol; kk++){ + int iCol = pIdx->aiColumn[kk]; + assert( iCol!=XN_ROWID && iColnCol ); + if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; + sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); + VdbeCoverage(v); + } + jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); + sqlite3VdbeGoto(v, uniqOk); + sqlite3VdbeJumpHere(v, jmp6); + sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, + pIdx->nKeyCol); VdbeCoverage(v); + sqlite3VdbeLoadString(v, 3, "non-unique entry in index "); + sqlite3VdbeGoto(v, jmp5); + sqlite3VdbeResolveLabel(v, uniqOk); + } + sqlite3VdbeJumpHere(v, jmp4); + sqlite3ResolvePartIdxLabel(pParse, jmp3); + } + } + sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, loopTop-1); + if( !isQuick ){ + sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + if( pPk==pIdx ) continue; + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); + addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+j, 0, 3); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 2, 3); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, addr); + } + } + } + } + { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList endCode[] = { + { OP_AddImm, 1, 0, 0}, /* 0 */ + { OP_IfNotZero, 1, 4, 0}, /* 1 */ + { OP_String8, 0, 3, 0}, /* 2 */ + { OP_ResultRow, 3, 1, 0}, /* 3 */ + { OP_Halt, 0, 0, 0}, /* 4 */ + { OP_String8, 0, 3, 0}, /* 5 */ + { OP_Goto, 0, 3, 0}, /* 6 */ + }; + VdbeOp *aOp; + + aOp = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); + if( aOp ){ + aOp[0].p2 = 1-mxErr; + aOp[2].p4type = P4_STATIC; + aOp[2].p4.z = "ok"; + aOp[5].p4type = P4_STATIC; + aOp[5].p4.z = (char*)sqlite3ErrStr(SQLITE_CORRUPT); + } + sqlite3VdbeChangeP3(v, 0, sqlite3VdbeCurrentAddr(v)-2); + } + } + break; +#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ + +#ifndef SQLITE_OMIT_UTF16 + /* + ** PRAGMA encoding + ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be" + ** + ** In its first form, this pragma returns the encoding of the main + ** database. If the database is not initialized, it is initialized now. + ** + ** The second form of this pragma is a no-op if the main database file + ** has not already been initialized. In this case it sets the default + ** encoding that will be used for the main database file if a new file + ** is created. If an existing main database file is opened, then the + ** default text encoding for the existing database is used. + ** + ** In all cases new databases created using the ATTACH command are + ** created to use the same default text encoding as the main database. If + ** the main database has not been initialized and/or created when ATTACH + ** is executed, this is done before the ATTACH operation. + ** + ** In the second form this pragma sets the text encoding to be used in + ** new database files created using this database handle. It is only + ** useful if invoked immediately after the main database i + */ + case PragTyp_ENCODING: { + static const struct EncName { + char *zName; + u8 enc; + } encnames[] = { + { "UTF8", SQLITE_UTF8 }, + { "UTF-8", SQLITE_UTF8 }, /* Must be element [1] */ + { "UTF-16le", SQLITE_UTF16LE }, /* Must be element [2] */ + { "UTF-16be", SQLITE_UTF16BE }, /* Must be element [3] */ + { "UTF16le", SQLITE_UTF16LE }, + { "UTF16be", SQLITE_UTF16BE }, + { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */ + { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */ + { 0, 0 } + }; + const struct EncName *pEnc; + if( !zRight ){ /* "PRAGMA encoding" */ + if( sqlite3ReadSchema(pParse) ) goto pragma_out; + assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); + assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); + assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); + returnSingleText(v, encnames[ENC(pParse->db)].zName); + }else{ /* "PRAGMA encoding = XXX" */ + /* Only change the value of sqlite.enc if the database handle is not + ** initialized. If the main database exists, the new sqlite.enc value + ** will be overwritten when the schema is next loaded. If it does not + ** already exists, it will be created to use the new encoding value. + */ + if( (db->mDbFlags & DBFLAG_EncodingFixed)==0 ){ + for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ + if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ + u8 enc = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; + SCHEMA_ENC(db) = enc; + sqlite3SetTextEncoding(db, enc); + break; + } + } + if( !pEnc->zName ){ + sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); + } + } + } + } + break; +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + /* + ** PRAGMA [schema.]schema_version + ** PRAGMA [schema.]schema_version = + ** + ** PRAGMA [schema.]user_version + ** PRAGMA [schema.]user_version = + ** + ** PRAGMA [schema.]freelist_count + ** + ** PRAGMA [schema.]data_version + ** + ** PRAGMA [schema.]application_id + ** PRAGMA [schema.]application_id = + ** + ** The pragma's schema_version and user_version are used to set or get + ** the value of the schema-version and user-version, respectively. Both + ** the schema-version and the user-version are 32-bit signed integers + ** stored in the database header. + ** + ** The schema-cookie is usually only manipulated internally by SQLite. It + ** is incremented by SQLite whenever the database schema is modified (by + ** creating or dropping a table or index). The schema version is used by + ** SQLite each time a query is executed to ensure that the internal cache + ** of the schema used when compiling the SQL query matches the schema of + ** the database against which the compiled query is actually executed. + ** Subverting this mechanism by using "PRAGMA schema_version" to modify + ** the schema-version is potentially dangerous and may lead to program + ** crashes or database corruption. Use with caution! + ** + ** The user-version is not used internally by SQLite. It may be used by + ** applications for any purpose. + */ + case PragTyp_HEADER_VALUE: { + int iCookie = pPragma->iArg; /* Which cookie to read or write */ + sqlite3VdbeUsesBtree(v, iDb); + if( zRight && (pPragma->mPragFlg & PragFlg_ReadOnly)==0 ){ + /* Write the specified cookie value */ + static const VdbeOpList setCookie[] = { + { OP_Transaction, 0, 1, 0}, /* 0 */ + { OP_SetCookie, 0, 0, 0}, /* 1 */ + }; + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie, 0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p2 = iCookie; + aOp[1].p3 = sqlite3Atoi(zRight); + aOp[1].p5 = 1; + }else{ + /* Read the specified cookie value */ + static const VdbeOpList readCookie[] = { + { OP_Transaction, 0, 0, 0}, /* 0 */ + { OP_ReadCookie, 0, 1, 0}, /* 1 */ + { OP_ResultRow, 1, 1, 0} + }; + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(readCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(readCookie),readCookie,0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p3 = iCookie; + sqlite3VdbeReusable(v); + } + } + break; +#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + /* + ** PRAGMA compile_options + ** + ** Return the names of all compile-time options used in this build, + ** one option per row. + */ + case PragTyp_COMPILE_OPTIONS: { + int i = 0; + const char *zOpt; + pParse->nMem = 1; + while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ + sqlite3VdbeLoadString(v, 1, zOpt); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + } + sqlite3VdbeReusable(v); + } + break; +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +#ifndef SQLITE_OMIT_WAL + /* + ** PRAGMA [schema.]wal_checkpoint = passive|full|restart|truncate + ** + ** Checkpoint the database. + */ + case PragTyp_WAL_CHECKPOINT: { + int iBt = (pId2->z?iDb:SQLITE_MAX_DB); + int eMode = SQLITE_CHECKPOINT_PASSIVE; + if( zRight ){ + if( sqlite3StrICmp(zRight, "full")==0 ){ + eMode = SQLITE_CHECKPOINT_FULL; + }else if( sqlite3StrICmp(zRight, "restart")==0 ){ + eMode = SQLITE_CHECKPOINT_RESTART; + }else if( sqlite3StrICmp(zRight, "truncate")==0 ){ + eMode = SQLITE_CHECKPOINT_TRUNCATE; + } + } + pParse->nMem = 3; + sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + } + break; + + /* + ** PRAGMA wal_autocheckpoint + ** PRAGMA wal_autocheckpoint = N + ** + ** Configure a database connection to automatically checkpoint a database + ** after accumulating N frames in the log. Or query for the current value + ** of N. + */ + case PragTyp_WAL_AUTOCHECKPOINT: { + if( zRight ){ + sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); + } + returnSingleInt(v, + db->xWalCallback==sqlite3WalDefaultHook ? + SQLITE_PTR_TO_INT(db->pWalArg) : 0); + } + break; +#endif + + /* + ** PRAGMA shrink_memory + ** + ** IMPLEMENTATION-OF: R-23445-46109 This pragma causes the database + ** connection on which it is invoked to free up as much memory as it + ** can, by calling sqlite3_db_release_memory(). + */ + case PragTyp_SHRINK_MEMORY: { + sqlite3_db_release_memory(db); + break; + } + + /* + ** PRAGMA optimize + ** PRAGMA optimize(MASK) + ** PRAGMA schema.optimize + ** PRAGMA schema.optimize(MASK) + ** + ** Attempt to optimize the database. All schemas are optimized in the first + ** two forms, and only the specified schema is optimized in the latter two. + ** + ** The details of optimizations performed by this pragma are expected + ** to change and improve over time. Applications should anticipate that + ** this pragma will perform new optimizations in future releases. + ** + ** The optional argument is a bitmask of optimizations to perform: + ** + ** 0x0001 Debugging mode. Do not actually perform any optimizations + ** but instead return one line of text for each optimization + ** that would have been done. Off by default. + ** + ** 0x0002 Run ANALYZE on tables that might benefit. On by default. + ** See below for additional information. + ** + ** 0x0004 (Not yet implemented) Record usage and performance + ** information from the current session in the + ** database file so that it will be available to "optimize" + ** pragmas run by future database connections. + ** + ** 0x0008 (Not yet implemented) Create indexes that might have + ** been helpful to recent queries + ** + ** The default MASK is and always shall be 0xfffe. 0xfffe means perform all + ** of the optimizations listed above except Debug Mode, including new + ** optimizations that have not yet been invented. If new optimizations are + ** ever added that should be off by default, those off-by-default + ** optimizations will have bitmasks of 0x10000 or larger. + ** + ** DETERMINATION OF WHEN TO RUN ANALYZE + ** + ** In the current implementation, a table is analyzed if only if all of + ** the following are true: + ** + ** (1) MASK bit 0x02 is set. + ** + ** (2) The query planner used sqlite_stat1-style statistics for one or + ** more indexes of the table at some point during the lifetime of + ** the current connection. + ** + ** (3) One or more indexes of the table are currently unanalyzed OR + ** the number of rows in the table has increased by 25 times or more + ** since the last time ANALYZE was run. + ** + ** The rules for when tables are analyzed are likely to change in + ** future releases. + */ + case PragTyp_OPTIMIZE: { + int iDbLast; /* Loop termination point for the schema loop */ + int iTabCur; /* Cursor for a table whose size needs checking */ + HashElem *k; /* Loop over tables of a schema */ + Schema *pSchema; /* The current schema */ + Table *pTab; /* A table in the schema */ + Index *pIdx; /* An index of the table */ + LogEst szThreshold; /* Size threshold above which reanalysis is needd */ + char *zSubSql; /* SQL statement for the OP_SqlExec opcode */ + u32 opMask; /* Mask of operations to perform */ + + if( zRight ){ + opMask = (u32)sqlite3Atoi(zRight); + if( (opMask & 0x02)==0 ) break; + }else{ + opMask = 0xfffe; + } + iTabCur = pParse->nTab++; + for(iDbLast = zDb?iDb:db->nDb-1; iDb<=iDbLast; iDb++){ + if( iDb==1 ) continue; + sqlite3CodeVerifySchema(pParse, iDb); + pSchema = db->aDb[iDb].pSchema; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + + /* If table pTab has not been used in a way that would benefit from + ** having analysis statistics during the current session, then skip it. + ** This also has the effect of skipping virtual tables and views */ + if( (pTab->tabFlags & TF_StatsUsed)==0 ) continue; + + /* Reanalyze if the table is 25 times larger than the last analysis */ + szThreshold = pTab->nRowLogEst + 46; assert( sqlite3LogEst(25)==46 ); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( !pIdx->hasStat1 ){ + szThreshold = 0; /* Always analyze if any index lacks statistics */ + break; + } + } + if( szThreshold ){ + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, + sqlite3VdbeCurrentAddr(v)+2+(opMask&1), szThreshold); + VdbeCoverage(v); + } + zSubSql = sqlite3MPrintf(db, "ANALYZE \"%w\".\"%w\"", + db->aDb[iDb].zDbSName, pTab->zName); + if( opMask & 0x01 ){ + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, r1, 0, zSubSql, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, r1, 1); + }else{ + sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0, zSubSql, P4_DYNAMIC); + } + } + } + sqlite3VdbeAddOp0(v, OP_Expire); + break; + } + + /* + ** PRAGMA busy_timeout + ** PRAGMA busy_timeout = N + ** + ** Call sqlite3_busy_timeout(db, N). Return the current timeout value + ** if one is set. If no busy handler or a different busy handler is set + ** then 0 is returned. Setting the busy_timeout to 0 or negative + ** disables the timeout. + */ + /*case PragTyp_BUSY_TIMEOUT*/ default: { + assert( pPragma->ePragTyp==PragTyp_BUSY_TIMEOUT ); + if( zRight ){ + sqlite3_busy_timeout(db, sqlite3Atoi(zRight)); + } + returnSingleInt(v, db->busyTimeout); + break; + } + + /* + ** PRAGMA soft_heap_limit + ** PRAGMA soft_heap_limit = N + ** + ** IMPLEMENTATION-OF: R-26343-45930 This pragma invokes the + ** sqlite3_soft_heap_limit64() interface with the argument N, if N is + ** specified and is a non-negative integer. + ** IMPLEMENTATION-OF: R-64451-07163 The soft_heap_limit pragma always + ** returns the same integer that would be returned by the + ** sqlite3_soft_heap_limit64(-1) C-language function. + */ + case PragTyp_SOFT_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_soft_heap_limit64(N); + } + returnSingleInt(v, sqlite3_soft_heap_limit64(-1)); + break; + } + + /* + ** PRAGMA hard_heap_limit + ** PRAGMA hard_heap_limit = N + ** + ** Invoke sqlite3_hard_heap_limit64() to query or set the hard heap + ** limit. The hard heap limit can be activated or lowered by this + ** pragma, but not raised or deactivated. Only the + ** sqlite3_hard_heap_limit64() C-language API can raise or deactivate + ** the hard heap limit. This allows an application to set a heap limit + ** constraint that cannot be relaxed by an untrusted SQL script. + */ + case PragTyp_HARD_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_int64 iPrior = sqlite3_hard_heap_limit64(-1); + if( N>0 && (iPrior==0 || iPrior>N) ) sqlite3_hard_heap_limit64(N); + } + returnSingleInt(v, sqlite3_hard_heap_limit64(-1)); + break; + } + + /* + ** PRAGMA threads + ** PRAGMA threads = N + ** + ** Configure the maximum number of worker threads. Return the new + ** maximum, which might be less than requested. + */ + case PragTyp_THREADS: { + sqlite3_int64 N; + if( zRight + && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK + && N>=0 + ){ + sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); + } + returnSingleInt(v, sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); + break; + } + + /* + ** PRAGMA analysis_limit + ** PRAGMA analysis_limit = N + ** + ** Configure the maximum number of rows that ANALYZE will examine + ** in each index that it looks at. Return the new limit. + */ + case PragTyp_ANALYSIS_LIMIT: { + sqlite3_int64 N; + if( zRight + && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK /* IMP: R-40975-20399 */ + && N>=0 + ){ + db->nAnalysisLimit = (int)(N&0x7fffffff); + } + returnSingleInt(v, db->nAnalysisLimit); /* IMP: R-57594-65522 */ + break; + } + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* + ** Report the current state of file logs for all databases + */ + case PragTyp_LOCK_STATUS: { + static const char *const azLockName[] = { + "unlocked", "shared", "reserved", "pending", "exclusive" + }; + int i; + pParse->nMem = 2; + for(i=0; inDb; i++){ + Btree *pBt; + const char *zState = "unknown"; + int j; + if( db->aDb[i].zDbSName==0 ) continue; + pBt = db->aDb[i].pBt; + if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ + zState = "closed"; + }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, + SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ + zState = azLockName[j]; + } + sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); + } + break; + } +#endif + +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + /* Pragma iArg + ** ---------- ------ + ** key 0 + ** rekey 1 + ** hexkey 2 + ** hexrekey 3 + ** textkey 4 + ** textrekey 5 + */ + case PragTyp_KEY: { + if( zRight ){ + char zBuf[40]; + const char *zKey = zRight; + int n; + if( pPragma->iArg==2 || pPragma->iArg==3 ){ + u8 iByte; + int i; + for(i=0, iByte=0; iiArg<4 ? sqlite3Strlen30(zRight) : -1; + } + if( (pPragma->iArg & 1)==0 ){ + rc = sqlite3_key_v2(db, zDb, zKey, n); + }else{ + rc = sqlite3_rekey_v2(db, zDb, zKey, n); + } + if( rc==SQLITE_OK && n!=0 ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "ok", SQLITE_STATIC); + returnSingleText(v, "ok"); + } + } + break; + } +#endif +/* END SQLCIPHER */ +#if defined(SQLITE_ENABLE_CEROD) + case PragTyp_ACTIVATE_EXTENSIONS: if( zRight ){ + if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ + sqlite3_activate_cerod(&zRight[6]); + } + } + break; +#endif + + } /* End of the PRAGMA switch */ + + /* The following block is a no-op unless SQLITE_DEBUG is defined. Its only + ** purpose is to execute assert() statements to verify that if the + ** PragFlg_NoColumns1 flag is set and the caller specified an argument + ** to the PRAGMA, the implementation has not added any OP_ResultRow + ** instructions to the VM. */ + if( (pPragma->mPragFlg & PragFlg_NoColumns1) && zRight ){ + sqlite3VdbeVerifyNoResultRow(v); + } + +pragma_out: + sqlite3DbFree(db, zLeft); + sqlite3DbFree(db, zRight); +} +#ifndef SQLITE_OMIT_VIRTUALTABLE +/***************************************************************************** +** Implementation of an eponymous virtual table that runs a pragma. +** +*/ +typedef struct PragmaVtab PragmaVtab; +typedef struct PragmaVtabCursor PragmaVtabCursor; +struct PragmaVtab { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* The database connection to which it belongs */ + const PragmaName *pName; /* Name of the pragma */ + u8 nHidden; /* Number of hidden columns */ + u8 iHidden; /* Index of the first hidden column */ +}; +struct PragmaVtabCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + sqlite3_stmt *pPragma; /* The pragma statement to run */ + sqlite_int64 iRowid; /* Current rowid */ + char *azArg[2]; /* Value of the argument and schema */ +}; + +/* +** Pragma virtual table module xConnect method. +*/ +static int pragmaVtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + const PragmaName *pPragma = (const PragmaName*)pAux; + PragmaVtab *pTab = 0; + int rc; + int i, j; + char cSep = '('; + StrAccum acc; + char zBuf[200]; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3_str_appendall(&acc, "CREATE TABLE x"); + for(i=0, j=pPragma->iPragCName; inPragCName; i++, j++){ + sqlite3_str_appendf(&acc, "%c\"%s\"", cSep, pragCName[j]); + cSep = ','; + } + if( i==0 ){ + sqlite3_str_appendf(&acc, "(\"%s\"", pPragma->zName); + i++; + } + j = 0; + if( pPragma->mPragFlg & PragFlg_Result1 ){ + sqlite3_str_appendall(&acc, ",arg HIDDEN"); + j++; + } + if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){ + sqlite3_str_appendall(&acc, ",schema HIDDEN"); + j++; + } + sqlite3_str_append(&acc, ")", 1); + sqlite3StrAccumFinish(&acc); + assert( strlen(zBuf) < sizeof(zBuf)-1 ); + rc = sqlite3_declare_vtab(db, zBuf); + if( rc==SQLITE_OK ){ + pTab = (PragmaVtab*)sqlite3_malloc(sizeof(PragmaVtab)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pTab, 0, sizeof(PragmaVtab)); + pTab->pName = pPragma; + pTab->db = db; + pTab->iHidden = i; + pTab->nHidden = j; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Pragma virtual table module xDisconnect method. +*/ +static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ + PragmaVtab *pTab = (PragmaVtab*)pVtab; + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* Figure out the best index to use to search a pragma virtual table. +** +** There are not really any index choices. But we want to encourage the +** query planner to give == constraints on as many hidden parameters as +** possible, and especially on the first hidden parameter. So return a +** high cost if hidden parameters are unconstrained. +*/ +static int pragmaVtabBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + PragmaVtab *pTab = (PragmaVtab*)tab; + const struct sqlite3_index_constraint *pConstraint; + int i, j; + int seen[2]; + + pIdxInfo->estimatedCost = (double)1; + if( pTab->nHidden==0 ){ return SQLITE_OK; } + pConstraint = pIdxInfo->aConstraint; + seen[0] = 0; + seen[1] = 0; + for(i=0; inConstraint; i++, pConstraint++){ + if( pConstraint->usable==0 ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pConstraint->iColumn < pTab->iHidden ) continue; + j = pConstraint->iColumn - pTab->iHidden; + assert( j < 2 ); + seen[j] = i+1; + } + if( seen[0]==0 ){ + pIdxInfo->estimatedCost = (double)2147483647; + pIdxInfo->estimatedRows = 2147483647; + return SQLITE_OK; + } + j = seen[0]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 1; + pIdxInfo->aConstraintUsage[j].omit = 1; + if( seen[1]==0 ) return SQLITE_OK; + pIdxInfo->estimatedCost = (double)20; + pIdxInfo->estimatedRows = 20; + j = seen[1]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 2; + pIdxInfo->aConstraintUsage[j].omit = 1; + return SQLITE_OK; +} + +/* Create a new cursor for the pragma virtual table */ +static int pragmaVtabOpen(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor){ + PragmaVtabCursor *pCsr; + pCsr = (PragmaVtabCursor*)sqlite3_malloc(sizeof(*pCsr)); + if( pCsr==0 ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(PragmaVtabCursor)); + pCsr->base.pVtab = pVtab; + *ppCursor = &pCsr->base; + return SQLITE_OK; +} + +/* Clear all content from pragma virtual table cursor. */ +static void pragmaVtabCursorClear(PragmaVtabCursor *pCsr){ + int i; + sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + for(i=0; iazArg); i++){ + sqlite3_free(pCsr->azArg[i]); + pCsr->azArg[i] = 0; + } +} + +/* Close a pragma virtual table cursor */ +static int pragmaVtabClose(sqlite3_vtab_cursor *cur){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)cur; + pragmaVtabCursorClear(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* Advance the pragma virtual table cursor to the next row */ +static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + int rc = SQLITE_OK; + + /* Increment the xRowid value */ + pCsr->iRowid++; + assert( pCsr->pPragma ); + if( SQLITE_ROW!=sqlite3_step(pCsr->pPragma) ){ + rc = sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + pragmaVtabCursorClear(pCsr); + } + return rc; +} + +/* +** Pragma virtual table module xFilter method. +*/ +static int pragmaVtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + int rc; + int i, j; + StrAccum acc; + char *zSql; + + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + pragmaVtabCursorClear(pCsr); + j = (pTab->pName->mPragFlg & PragFlg_Result1)!=0 ? 0 : 1; + for(i=0; iazArg) ); + assert( pCsr->azArg[j]==0 ); + if( zText ){ + pCsr->azArg[j] = sqlite3_mprintf("%s", zText); + if( pCsr->azArg[j]==0 ){ + return SQLITE_NOMEM; + } + } + } + sqlite3StrAccumInit(&acc, 0, 0, 0, pTab->db->aLimit[SQLITE_LIMIT_SQL_LENGTH]); + sqlite3_str_appendall(&acc, "PRAGMA "); + if( pCsr->azArg[1] ){ + sqlite3_str_appendf(&acc, "%Q.", pCsr->azArg[1]); + } + sqlite3_str_appendall(&acc, pTab->pName->zName); + if( pCsr->azArg[0] ){ + sqlite3_str_appendf(&acc, "=%Q", pCsr->azArg[0]); + } + zSql = sqlite3StrAccumFinish(&acc); + if( zSql==0 ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pPragma, 0); + sqlite3_free(zSql); + if( rc!=SQLITE_OK ){ + pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); + return rc; + } + return pragmaVtabNext(pVtabCursor); +} + +/* +** Pragma virtual table module xEof method. +*/ +static int pragmaVtabEof(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + return (pCsr->pPragma==0); +} + +/* The xColumn method simply returns the corresponding column from +** the PRAGMA. +*/ +static int pragmaVtabColumn( + sqlite3_vtab_cursor *pVtabCursor, + sqlite3_context *ctx, + int i +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + if( iiHidden ){ + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pPragma, i)); + }else{ + sqlite3_result_text(ctx, pCsr->azArg[i-pTab->iHidden],-1,SQLITE_TRANSIENT); + } + return SQLITE_OK; +} + +/* +** Pragma virtual table module xRowid method. +*/ +static int pragmaVtabRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *p){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + *p = pCsr->iRowid; + return SQLITE_OK; +} + +/* The pragma virtual table object */ +static const sqlite3_module pragmaVtabModule = { + 0, /* iVersion */ + 0, /* xCreate - create a table */ + pragmaVtabConnect, /* xConnect - connect to an existing table */ + pragmaVtabBestIndex, /* xBestIndex - Determine search strategy */ + pragmaVtabDisconnect, /* xDisconnect - Disconnect from a table */ + 0, /* xDestroy - Drop a table */ + pragmaVtabOpen, /* xOpen - open a cursor */ + pragmaVtabClose, /* xClose - close a cursor */ + pragmaVtabFilter, /* xFilter - configure scan constraints */ + pragmaVtabNext, /* xNext - advance a cursor */ + pragmaVtabEof, /* xEof */ + pragmaVtabColumn, /* xColumn - read data */ + pragmaVtabRowid, /* xRowid - read data */ + 0, /* xUpdate - write data */ + 0, /* xBegin - begin transaction */ + 0, /* xSync - sync transaction */ + 0, /* xCommit - commit transaction */ + 0, /* xRollback - rollback transaction */ + 0, /* xFindFunction - function overloading */ + 0, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; + +/* +** Check to see if zTabName is really the name of a pragma. If it is, +** then register an eponymous virtual table for that pragma and return +** a pointer to the Module object for the new virtual table. +*/ +SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3 *db, const char *zName){ + const PragmaName *pName; + assert( sqlite3_strnicmp(zName, "pragma_", 7)==0 ); + pName = pragmaLocate(zName+7); + if( pName==0 ) return 0; + if( (pName->mPragFlg & (PragFlg_Result0|PragFlg_Result1))==0 ) return 0; + assert( sqlite3HashFind(&db->aModule, zName)==0 ); + return sqlite3VtabCreateModule(db, zName, &pragmaVtabModule, (void*)pName, 0); +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#endif /* SQLITE_OMIT_PRAGMA */ + +/************** End of pragma.c **********************************************/ +/************** Begin file prepare.c *****************************************/ +/* +** 2005 May 25 +** +** 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 contains the implementation of the sqlite3_prepare() +** interface, and routines that contribute to loading the database schema +** from disk. +*/ +/* #include "sqliteInt.h" */ + +/* +** Fill the InitData structure with an error message that indicates +** that the database is corrupt. +*/ +static void corruptSchema( + InitData *pData, /* Initialization context */ + char **azObj, /* Type and name of object being parsed */ + const char *zExtra /* Error information */ +){ + sqlite3 *db = pData->db; + if( db->mallocFailed ){ + pData->rc = SQLITE_NOMEM_BKPT; + }else if( pData->pzErrMsg[0]!=0 ){ + /* A error message has already been generated. Do not overwrite it */ + }else if( pData->mInitFlags & (INITFLAG_AlterMask) ){ + static const char *azAlterType[] = { + "rename", + "drop column", + "add column" + }; + *pData->pzErrMsg = sqlite3MPrintf(db, + "error in %s %s after %s: %s", azObj[0], azObj[1], + azAlterType[(pData->mInitFlags&INITFLAG_AlterMask)-1], + zExtra + ); + pData->rc = SQLITE_ERROR; + }else if( db->flags & SQLITE_WriteSchema ){ + pData->rc = SQLITE_CORRUPT_BKPT; + }else{ + char *z; + const char *zObj = azObj[1] ? azObj[1] : "?"; + z = sqlite3MPrintf(db, "malformed database schema (%s)", zObj); + if( zExtra && zExtra[0] ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra); + *pData->pzErrMsg = z; + pData->rc = SQLITE_CORRUPT_BKPT; + } +} + +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + +/* forward declaration */ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pReprepare, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +); + + +/* +** This is the callback routine for the code that initializes the +** database. See sqlite3Init() below for additional information. +** This routine is also called from the OP_ParseSchema opcode of the VDBE. +** +** Each callback contains the following information: +** +** argv[0] = type of object: "table", "index", "trigger", or "view". +** argv[1] = name of thing being created +** argv[2] = associated table if an index or trigger +** argv[3] = root page number for table or index. 0 for trigger or view. +** argv[4] = SQL text for the CREATE statement. +** +*/ +SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ + InitData *pData = (InitData*)pInit; + sqlite3 *db = pData->db; + int iDb = pData->iDb; + + assert( argc==5 ); + UNUSED_PARAMETER2(NotUsed, argc); + assert( sqlite3_mutex_held(db->mutex) ); + db->mDbFlags |= DBFLAG_EncodingFixed; + if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ + pData->nInitRow++; + if( db->mallocFailed ){ + corruptSchema(pData, argv, 0); + return 1; + } + + assert( iDb>=0 && iDbnDb ); + if( argv[3]==0 ){ + corruptSchema(pData, argv, 0); + }else if( argv[4] + && 'c'==sqlite3UpperToLower[(unsigned char)argv[4][0]] + && 'r'==sqlite3UpperToLower[(unsigned char)argv[4][1]] ){ + /* Call the parser to process a CREATE TABLE, INDEX or VIEW. + ** But because db->init.busy is set to 1, no VDBE code is generated + ** or executed. All the parser does is build the internal data + ** structures that describe the table, index, or view. + ** + ** No other valid SQL statement, other than the variable CREATE statements, + ** can begin with the letters "C" and "R". Thus, it is not possible run + ** any other kind of statement while parsing the schema, even a corrupt + ** schema. + */ + int rc; + u8 saved_iDb = db->init.iDb; + sqlite3_stmt *pStmt; + TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ + + assert( db->init.busy ); + db->init.iDb = iDb; + if( sqlite3GetUInt32(argv[3], &db->init.newTnum)==0 + || (db->init.newTnum>pData->mxPage && pData->mxPage>0) + ){ + if( sqlite3Config.bExtraSchemaChecks ){ + corruptSchema(pData, argv, "invalid rootpage"); + } + } + db->init.orphanTrigger = 0; + db->init.azInit = (const char**)argv; + pStmt = 0; + TESTONLY(rcp = ) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0); + rc = db->errCode; + assert( (rc&0xFF)==(rcp&0xFF) ); + db->init.iDb = saved_iDb; + /* assert( saved_iDb==0 || (db->mDbFlags & DBFLAG_Vacuum)!=0 ); */ + if( SQLITE_OK!=rc ){ + if( db->init.orphanTrigger ){ + assert( iDb==1 ); + }else{ + if( rc > pData->rc ) pData->rc = rc; + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ + corruptSchema(pData, argv, sqlite3_errmsg(db)); + } + } + } + db->init.azInit = sqlite3StdType; /* Any array of string ptrs will do */ + sqlite3_finalize(pStmt); + }else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){ + corruptSchema(pData, argv, 0); + }else{ + /* If the SQL column is blank it means this is an index that + ** was created to be the PRIMARY KEY or to fulfill a UNIQUE + ** constraint for a CREATE TABLE. The index should have already + ** been created when we processed the CREATE TABLE. All we have + ** to do here is record the root page number for that index. + */ + Index *pIndex; + pIndex = sqlite3FindIndex(db, argv[1], db->aDb[iDb].zDbSName); + if( pIndex==0 ){ + corruptSchema(pData, argv, "orphan index"); + }else + if( sqlite3GetUInt32(argv[3],&pIndex->tnum)==0 + || pIndex->tnum<2 + || pIndex->tnum>pData->mxPage + || sqlite3IndexHasDuplicateRootPage(pIndex) + ){ + if( sqlite3Config.bExtraSchemaChecks ){ + corruptSchema(pData, argv, "invalid rootpage"); + } + } + } + return 0; +} + +/* +** Attempt to read the database schema and initialize internal +** data structures for a single database file. The index of the +** database file is given by iDb. iDb==0 is used for the main +** database. iDb==1 should never be used. iDb>=2 is used for +** auxiliary databases. Return one of the SQLITE_ error codes to +** indicate success or failure. +*/ +SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ + int rc; + int i; +#ifndef SQLITE_OMIT_DEPRECATED + int size; +#endif + Db *pDb; + char const *azArg[6]; + int meta[5]; + InitData initData; + const char *zSchemaTabName; + int openedTransaction = 0; + int mask = ((db->mDbFlags & DBFLAG_EncodingFixed) | ~DBFLAG_EncodingFixed); + + assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 ); + assert( iDb>=0 && iDbnDb ); + assert( db->aDb[iDb].pSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); + + db->init.busy = 1; + + /* Construct the in-memory representation schema tables (sqlite_schema or + ** sqlite_temp_schema) by invoking the parser directly. The appropriate + ** table name will be inserted automatically by the parser so we can just + ** use the abbreviation "x" here. The parser will also automatically tag + ** the schema table as read-only. */ + azArg[0] = "table"; + azArg[1] = zSchemaTabName = SCHEMA_TABLE(iDb); + azArg[2] = azArg[1]; + azArg[3] = "1"; + azArg[4] = "CREATE TABLE x(type text,name text,tbl_name text," + "rootpage int,sql text)"; + azArg[5] = 0; + initData.db = db; + initData.iDb = iDb; + initData.rc = SQLITE_OK; + initData.pzErrMsg = pzErrMsg; + initData.mInitFlags = mFlags; + initData.nInitRow = 0; + initData.mxPage = 0; + sqlite3InitCallback(&initData, 5, (char **)azArg, 0); + db->mDbFlags &= mask; + if( initData.rc ){ + rc = initData.rc; + goto error_out; + } + + /* Create a cursor to hold the database open + */ + pDb = &db->aDb[iDb]; + if( pDb->pBt==0 ){ + assert( iDb==1 ); + DbSetProperty(db, 1, DB_SchemaLoaded); + rc = SQLITE_OK; + goto error_out; + } + + /* If there is not already a read-only (or read-write) transaction opened + ** on the b-tree database, open one now. If a transaction is opened, it + ** will be closed before this function returns. */ + sqlite3BtreeEnter(pDb->pBt); + if( sqlite3BtreeTxnState(pDb->pBt)==SQLITE_TXN_NONE ){ + rc = sqlite3BtreeBeginTrans(pDb->pBt, 0, 0); + if( rc!=SQLITE_OK ){ + sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc)); + goto initone_error_out; + } + openedTransaction = 1; + } + + /* Get the database meta information. + ** + ** Meta values are as follows: + ** meta[0] Schema cookie. Changes with each schema change. + ** meta[1] File format of schema layer. + ** meta[2] Size of the page cache. + ** meta[3] Largest rootpage (auto/incr_vacuum mode) + ** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE + ** meta[5] User version + ** meta[6] Incremental vacuum mode + ** meta[7] unused + ** meta[8] unused + ** meta[9] unused + ** + ** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to + ** the possible values of meta[4]. + */ + for(i=0; ipBt, i+1, (u32 *)&meta[i]); + } + if( (db->flags & SQLITE_ResetDatabase)!=0 ){ + memset(meta, 0, sizeof(meta)); + } + pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1]; + + /* If opening a non-empty database, check the text encoding. For the + ** main database, set sqlite3.enc to the encoding of the main database. + ** For an attached db, it is an error if the encoding is not the same + ** as sqlite3.enc. + */ + if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */ + if( iDb==0 && (db->mDbFlags & DBFLAG_EncodingFixed)==0 ){ + u8 encoding; +#ifndef SQLITE_OMIT_UTF16 + /* If opening the main database, set ENC(db). */ + encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3; + if( encoding==0 ) encoding = SQLITE_UTF8; +#else + encoding = SQLITE_UTF8; +#endif + sqlite3SetTextEncoding(db, encoding); + }else{ + /* If opening an attached database, the encoding much match ENC(db) */ + if( (meta[BTREE_TEXT_ENCODING-1] & 3)!=ENC(db) ){ + sqlite3SetString(pzErrMsg, db, "attached databases must use the same" + " text encoding as main database"); + rc = SQLITE_ERROR; + goto initone_error_out; + } + } + } + pDb->pSchema->enc = ENC(db); + + if( pDb->pSchema->cache_size==0 ){ +#ifndef SQLITE_OMIT_DEPRECATED + size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]); + if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } + pDb->pSchema->cache_size = size; +#else + pDb->pSchema->cache_size = SQLITE_DEFAULT_CACHE_SIZE; +#endif + sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); + } + + /* + ** file_format==1 Version 3.0.0. + ** file_format==2 Version 3.1.3. // ALTER TABLE ADD COLUMN + ** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults + ** file_format==4 Version 3.3.0. // DESC indices. Boolean constants + */ + pDb->pSchema->file_format = (u8)meta[BTREE_FILE_FORMAT-1]; + if( pDb->pSchema->file_format==0 ){ + pDb->pSchema->file_format = 1; + } + if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ + sqlite3SetString(pzErrMsg, db, "unsupported file format"); + rc = SQLITE_ERROR; + goto initone_error_out; + } + + /* Ticket #2804: When we open a database in the newer file format, + ** clear the legacy_file_format pragma flag so that a VACUUM will + ** not downgrade the database and thus invalidate any descending + ** indices that the user might have created. + */ + if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ + db->flags &= ~(u64)SQLITE_LegacyFileFmt; + } + + /* Read the schema information out of the schema tables + */ + assert( db->init.busy ); + initData.mxPage = sqlite3BtreeLastPage(pDb->pBt); + { + char *zSql; + zSql = sqlite3MPrintf(db, + "SELECT*FROM\"%w\".%s ORDER BY rowid", + db->aDb[iDb].zDbSName, zSchemaTabName); +#ifndef SQLITE_OMIT_AUTHORIZATION + { + sqlite3_xauth xAuth; + xAuth = db->xAuth; + db->xAuth = 0; +#endif + rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; + } +#endif + if( rc==SQLITE_OK ) rc = initData.rc; + sqlite3DbFree(db, zSql); +#ifndef SQLITE_OMIT_ANALYZE + if( rc==SQLITE_OK ){ + sqlite3AnalysisLoad(db, iDb); + } +#endif + } + assert( pDb == &(db->aDb[iDb]) ); + if( db->mallocFailed ){ + rc = SQLITE_NOMEM_BKPT; + sqlite3ResetAllSchemasOfConnection(db); + pDb = &db->aDb[iDb]; + }else + if( rc==SQLITE_OK || ((db->flags&SQLITE_NoSchemaError) && rc!=SQLITE_NOMEM)){ + /* Hack: If the SQLITE_NoSchemaError flag is set, then consider + ** the schema loaded, even if errors (other than OOM) occurred. In + ** this situation the current sqlite3_prepare() operation will fail, + ** but the following one will attempt to compile the supplied statement + ** against whatever subset of the schema was loaded before the error + ** occurred. + ** + ** The primary purpose of this is to allow access to the sqlite_schema + ** table even when its contents have been corrupted. + */ + DbSetProperty(db, iDb, DB_SchemaLoaded); + rc = SQLITE_OK; + } + + /* Jump here for an error that occurs after successfully allocating + ** curMain and calling sqlite3BtreeEnter(). For an error that occurs + ** before that point, jump to error_out. + */ +initone_error_out: + if( openedTransaction ){ + sqlite3BtreeCommit(pDb->pBt); + } + sqlite3BtreeLeave(pDb->pBt); + +error_out: + if( rc ){ + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + } + sqlite3ResetOneSchema(db, iDb); + } + db->init.busy = 0; + return rc; +} + +/* +** Initialize all database files - the main database file, the file +** used to store temporary tables, and any additional database files +** created using ATTACH statements. Return a success code. If an +** error occurs, write an error message into *pzErrMsg. +** +** After a database is initialized, the DB_SchemaLoaded bit is set +** bit is set in the flags field of the Db structure. +*/ +SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ + int i, rc; + int commit_internal = !(db->mDbFlags&DBFLAG_SchemaChange); + + assert( sqlite3_mutex_held(db->mutex) ); + assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); + assert( db->init.busy==0 ); + ENC(db) = SCHEMA_ENC(db); + assert( db->nDb>0 ); + /* Do the main schema first */ + if( !DbHasProperty(db, 0, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, 0, pzErrMsg, 0); + if( rc ) return rc; + } + /* All other schemas after the main schema. The "temp" schema must be last */ + for(i=db->nDb-1; i>0; i--){ + assert( i==1 || sqlite3BtreeHoldsMutex(db->aDb[i].pBt) ); + if( !DbHasProperty(db, i, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, i, pzErrMsg, 0); + if( rc ) return rc; + } + } + if( commit_internal ){ + sqlite3CommitInternalChanges(db); + } + return SQLITE_OK; +} + +/* +** This routine is a no-op if the database schema is already initialized. +** Otherwise, the schema is loaded. An error code is returned. +*/ +SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){ + int rc = SQLITE_OK; + sqlite3 *db = pParse->db; + assert( sqlite3_mutex_held(db->mutex) ); + if( !db->init.busy ){ + rc = sqlite3Init(db, &pParse->zErrMsg); + if( rc!=SQLITE_OK ){ + pParse->rc = rc; + pParse->nErr++; + }else if( db->noSharedCache ){ + db->mDbFlags |= DBFLAG_SchemaKnownOk; + } + } + return rc; +} + + +/* +** Check schema cookies in all databases. If any cookie is out +** of date set pParse->rc to SQLITE_SCHEMA. If all schema cookies +** make no changes to pParse->rc. +*/ +static void schemaIsValid(Parse *pParse){ + sqlite3 *db = pParse->db; + int iDb; + int rc; + int cookie; + + assert( pParse->checkSchema ); + assert( sqlite3_mutex_held(db->mutex) ); + for(iDb=0; iDbnDb; iDb++){ + int openedTransaction = 0; /* True if a transaction is opened */ + Btree *pBt = db->aDb[iDb].pBt; /* Btree database to read cookie from */ + if( pBt==0 ) continue; + + /* If there is not already a read-only (or read-write) transaction opened + ** on the b-tree database, open one now. If a transaction is opened, it + ** will be closed immediately after reading the meta-value. */ + if( sqlite3BtreeTxnState(pBt)==SQLITE_TXN_NONE ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + pParse->rc = SQLITE_NOMEM; + } + if( rc!=SQLITE_OK ) return; + openedTransaction = 1; + } + + /* Read the schema cookie from the database. If it does not match the + ** value stored as part of the in-memory schema representation, + ** set Parse.rc to SQLITE_SCHEMA. */ + sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ + sqlite3ResetOneSchema(db, iDb); + pParse->rc = SQLITE_SCHEMA; + } + + /* Close the transaction, if one was opened. */ + if( openedTransaction ){ + sqlite3BtreeCommit(pBt); + } + } +} + +/* +** Convert a schema pointer into the iDb index that indicates +** which database file in db->aDb[] the schema refers to. +** +** If the same database is attached more than once, the first +** attached database is returned. +*/ +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ + int i = -32768; + + /* If pSchema is NULL, then return -32768. This happens when code in + ** expr.c is trying to resolve a reference to a transient table (i.e. one + ** created by a sub-select). In this case the return value of this + ** function should never be used. + ** + ** We return -32768 instead of the more usual -1 simply because using + ** -32768 as the incorrect index into db->aDb[] is much + ** more likely to cause a segfault than -1 (of course there are assert() + ** statements too, but it never hurts to play the odds) and + ** -32768 will still fit into a 16-bit signed integer. + */ + assert( sqlite3_mutex_held(db->mutex) ); + if( pSchema ){ + for(i=0; 1; i++){ + assert( inDb ); + if( db->aDb[i].pSchema==pSchema ){ + break; + } + } + assert( i>=0 && inDb ); + } + return i; +} + +/* +** Free all memory allocations in the pParse object +*/ +SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse *pParse){ + sqlite3 *db = pParse->db; + assert( db!=0 ); + assert( db->pParse==pParse ); + assert( pParse->nested==0 ); +#ifndef SQLITE_OMIT_SHARED_CACHE + sqlite3DbFree(db, pParse->aTableLock); +#endif + while( pParse->pCleanup ){ + ParseCleanup *pCleanup = pParse->pCleanup; + pParse->pCleanup = pCleanup->pNext; + pCleanup->xCleanup(db, pCleanup->pPtr); + sqlite3DbFreeNN(db, pCleanup); + } + sqlite3DbFree(db, pParse->aLabel); + if( pParse->pConstExpr ){ + sqlite3ExprListDelete(db, pParse->pConstExpr); + } + assert( db->lookaside.bDisable >= pParse->disableLookaside ); + db->lookaside.bDisable -= pParse->disableLookaside; + db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; + assert( pParse->db->pParse==pParse ); + db->pParse = pParse->pOuterParse; + pParse->db = 0; + pParse->disableLookaside = 0; +} + +/* +** Add a new cleanup operation to a Parser. The cleanup should happen when +** the parser object is destroyed. But, beware: the cleanup might happen +** immediately. +** +** Use this mechanism for uncommon cleanups. There is a higher setup +** cost for this mechansim (an extra malloc), so it should not be used +** for common cleanups that happen on most calls. But for less +** common cleanups, we save a single NULL-pointer comparison in +** sqlite3ParseObjectReset(), which reduces the total CPU cycle count. +** +** If a memory allocation error occurs, then the cleanup happens immediately. +** When either SQLITE_DEBUG or SQLITE_COVERAGE_TEST are defined, the +** pParse->earlyCleanup flag is set in that case. Calling code show verify +** that test cases exist for which this happens, to guard against possible +** use-after-free errors following an OOM. The preferred way to do this is +** to immediately follow the call to this routine with: +** +** testcase( pParse->earlyCleanup ); +** +** This routine returns a copy of its pPtr input (the third parameter) +** except if an early cleanup occurs, in which case it returns NULL. So +** another way to check for early cleanup is to check the return value. +** Or, stop using the pPtr parameter with this call and use only its +** return value thereafter. Something like this: +** +** pObj = sqlite3ParserAddCleanup(pParse, destructor, pObj); +*/ +SQLITE_PRIVATE void *sqlite3ParserAddCleanup( + Parse *pParse, /* Destroy when this Parser finishes */ + void (*xCleanup)(sqlite3*,void*), /* The cleanup routine */ + void *pPtr /* Pointer to object to be cleaned up */ +){ + ParseCleanup *pCleanup = sqlite3DbMallocRaw(pParse->db, sizeof(*pCleanup)); + if( pCleanup ){ + pCleanup->pNext = pParse->pCleanup; + pParse->pCleanup = pCleanup; + pCleanup->pPtr = pPtr; + pCleanup->xCleanup = xCleanup; + }else{ + xCleanup(pParse->db, pPtr); + pPtr = 0; +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) + pParse->earlyCleanup = 1; +#endif + } + return pPtr; +} + +/* +** Turn bulk memory into a valid Parse object and link that Parse object +** into database connection db. +** +** Call sqlite3ParseObjectReset() to undo this operation. +** +** Caution: Do not confuse this routine with sqlite3ParseObjectInit() which +** is generated by Lemon. +*/ +SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){ + memset(PARSE_HDR(pParse), 0, PARSE_HDR_SZ); + memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); + assert( db->pParse!=pParse ); + pParse->pOuterParse = db->pParse; + db->pParse = pParse; + pParse->db = db; + if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory"); +} + +/* +** Maximum number of times that we will try again to prepare a statement +** that returns SQLITE_ERROR_RETRY. +*/ +#ifndef SQLITE_MAX_PREPARE_RETRY +# define SQLITE_MAX_PREPARE_RETRY 25 +#endif + +/* +** Compile the UTF-8 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pReprepare, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc = SQLITE_OK; /* Result code */ + int i; /* Loop counter */ + Parse sParse; /* Parsing context */ + + /* sqlite3ParseObjectInit(&sParse, db); // inlined for performance */ + memset(PARSE_HDR(&sParse), 0, PARSE_HDR_SZ); + memset(PARSE_TAIL(&sParse), 0, PARSE_TAIL_SZ); + sParse.pOuterParse = db->pParse; + db->pParse = &sParse; + sParse.db = db; + sParse.pReprepare = pReprepare; + assert( ppStmt && *ppStmt==0 ); + if( db->mallocFailed ) sqlite3ErrorMsg(&sParse, "out of memory"); + assert( sqlite3_mutex_held(db->mutex) ); + + /* For a long-term use prepared statement avoid the use of + ** lookaside memory. + */ + if( prepFlags & SQLITE_PREPARE_PERSISTENT ){ + sParse.disableLookaside++; + DisableLookaside; + } + sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; + + /* Check to verify that it is possible to get a read lock on all + ** database schemas. The inability to get a read lock indicates that + ** some other database connection is holding a write-lock, which in + ** turn means that the other connection has made uncommitted changes + ** to the schema. + ** + ** Were we to proceed and prepare the statement against the uncommitted + ** schema changes and if those schema changes are subsequently rolled + ** back and different changes are made in their place, then when this + ** prepared statement goes to run the schema cookie would fail to detect + ** the schema change. Disaster would follow. + ** + ** This thread is currently holding mutexes on all Btrees (because + ** of the sqlite3BtreeEnterAll() in sqlite3LockAndPrepare()) so it + ** is not possible for another thread to start a new schema change + ** while this routine is running. Hence, we do not need to hold + ** locks on the schema, we just need to make sure nobody else is + ** holding them. + ** + ** Note that setting READ_UNCOMMITTED overrides most lock detection, + ** but it does *not* override schema lock detection, so this all still + ** works even if READ_UNCOMMITTED is set. + */ + if( !db->noSharedCache ){ + for(i=0; inDb; i++) { + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + assert( sqlite3BtreeHoldsMutex(pBt) ); + rc = sqlite3BtreeSchemaLocked(pBt); + if( rc ){ + const char *zDb = db->aDb[i].zDbSName; + sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); + testcase( db->flags & SQLITE_ReadUncommit ); + goto end_prepare; + } + } + } + } + + sqlite3VtabUnlockList(db); + + if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ + char *zSqlCopy; + int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; + testcase( nBytes==mxLen ); + testcase( nBytes==mxLen+1 ); + if( nBytes>mxLen ){ + sqlite3ErrorWithMsg(db, SQLITE_TOOBIG, "statement too long"); + rc = sqlite3ApiExit(db, SQLITE_TOOBIG); + goto end_prepare; + } + zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); + if( zSqlCopy ){ + sqlite3RunParser(&sParse, zSqlCopy); + sParse.zTail = &zSql[sParse.zTail-zSqlCopy]; + sqlite3DbFree(db, zSqlCopy); + }else{ + sParse.zTail = &zSql[nBytes]; + } + }else{ + sqlite3RunParser(&sParse, zSql); + } + assert( 0==sParse.nQueryLoop ); + + if( pzTail ){ + *pzTail = sParse.zTail; + } + + if( db->init.busy==0 ){ + sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); + } + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM_BKPT; + sParse.checkSchema = 0; + } + if( sParse.rc!=SQLITE_OK && sParse.rc!=SQLITE_DONE ){ + if( sParse.checkSchema && db->init.busy==0 ){ + schemaIsValid(&sParse); + } + if( sParse.pVdbe ){ + sqlite3VdbeFinalize(sParse.pVdbe); + } + assert( 0==(*ppStmt) ); + rc = sParse.rc; + if( sParse.zErrMsg ){ + sqlite3ErrorWithMsg(db, rc, "%s", sParse.zErrMsg); + sqlite3DbFree(db, sParse.zErrMsg); + }else{ + sqlite3Error(db, rc); + } + }else{ + assert( sParse.zErrMsg==0 ); + *ppStmt = (sqlite3_stmt*)sParse.pVdbe; + rc = SQLITE_OK; + sqlite3ErrorClear(db); + } + + + /* Delete any TriggerPrg structures allocated while parsing this statement. */ + while( sParse.pTriggerPrg ){ + TriggerPrg *pT = sParse.pTriggerPrg; + sParse.pTriggerPrg = pT->pNext; + sqlite3DbFree(db, pT); + } + +end_prepare: + + sqlite3ParseObjectReset(&sParse); + return rc; +} +static int sqlite3LockAndPrepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pOld, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + int cnt = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppStmt = 0; + if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + do{ + /* Make multiple attempts to compile the SQL, until it either succeeds + ** or encounters a permanent error. A schema problem after one schema + ** reset is considered a permanent error. */ + rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail); + assert( rc==SQLITE_OK || *ppStmt==0 ); + if( rc==SQLITE_OK || db->mallocFailed ) break; + }while( (rc==SQLITE_ERROR_RETRY && (cnt++)errMask)==rc ); + db->busyHandler.nBusy = 0; + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** Rerun the compilation of a statement after a schema change. +** +** If the statement is successfully recompiled, return SQLITE_OK. Otherwise, +** if the statement cannot be recompiled because another connection has +** locked the sqlite3_schema table, return SQLITE_LOCKED. If any other error +** occurs, return SQLITE_SCHEMA. +*/ +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ + int rc; + sqlite3_stmt *pNew; + const char *zSql; + sqlite3 *db; + u8 prepFlags; + + assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) ); + zSql = sqlite3_sql((sqlite3_stmt *)p); + assert( zSql!=0 ); /* Reprepare only called for prepare_v2() statements */ + db = sqlite3VdbeDb(p); + assert( sqlite3_mutex_held(db->mutex) ); + prepFlags = sqlite3VdbePrepareFlags(p); + rc = sqlite3LockAndPrepare(db, zSql, -1, prepFlags, p, &pNew, 0); + if( rc ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(db); + } + assert( pNew==0 ); + return rc; + }else{ + assert( pNew!=0 ); + } + sqlite3VdbeSwap((Vdbe*)pNew, p); + sqlite3TransferBindings(pNew, (sqlite3_stmt*)p); + sqlite3VdbeResetStepResult((Vdbe*)pNew); + sqlite3VdbeFinalize((Vdbe*)pNew); + return SQLITE_OK; +} + + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + /* EVIDENCE-OF: R-37923-12173 The sqlite3_prepare_v2() interface works + ** exactly the same as sqlite3_prepare_v3() with a zero prepFlags + ** parameter. + ** + ** Proof in that the 5th parameter to sqlite3LockAndPrepare is 0 */ + rc = sqlite3LockAndPrepare(db,zSql,nBytes,SQLITE_PREPARE_SAVESQL,0, + ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); + return rc; +} +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + /* EVIDENCE-OF: R-56861-42673 sqlite3_prepare_v3() differs from + ** sqlite3_prepare_v2() only in having the extra prepFlags parameter, + ** which is a bit array consisting of zero or more of the + ** SQLITE_PREPARE_* flags. + ** + ** Proof by comparison to the implementation of sqlite3_prepare_v2() + ** directly above. */ + rc = sqlite3LockAndPrepare(db,zSql,nBytes, + SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK), + 0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); + return rc; +} + + +#ifndef SQLITE_OMIT_UTF16 +/* +** Compile the UTF-16 encoded SQL statement zSql into a statement handle. +*/ +static int sqlite3Prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + /* This function currently works by first transforming the UTF-16 + ** encoded string to UTF-8, then invoking sqlite3_prepare(). The + ** tricky bit is figuring out the pointer to return in *pzTail. + */ + char *zSql8; + const char *zTail8 = 0; + int rc = SQLITE_OK; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppStmt = 0; + if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + return SQLITE_MISUSE_BKPT; + } + if( nBytes>=0 ){ + int sz; + const char *z = (const char*)zSql; + for(sz=0; szmutex); + zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); + if( zSql8 ){ + rc = sqlite3LockAndPrepare(db, zSql8, -1, prepFlags, 0, ppStmt, &zTail8); + } + + if( zTail8 && pzTail ){ + /* If sqlite3_prepare returns a tail pointer, we calculate the + ** equivalent pointer into the UTF-16 string by counting the unicode + ** characters between zSql8 and zTail8, and then returning a pointer + ** the same number of characters into the UTF-16 string. + */ + int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8)); + *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); + } + sqlite3DbFree(db, zSql8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Two versions of the official API. Legacy and new use. In the legacy +** version, the original SQL text is not saved in the prepared statement +** and so if a schema change occurs, SQLITE_SCHEMA is returned by +** sqlite3_step(). In the new version, the original SQL text is retained +** and the statement is automatically recompiled if an schema change +** occurs. +*/ +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes,0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes,SQLITE_PREPARE_SAVESQL,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes, + SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK), + ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} + +#endif /* SQLITE_OMIT_UTF16 */ + +/************** End of prepare.c *********************************************/ +/************** Begin file select.c ******************************************/ +/* +** 2001 September 15 +** +** 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 contains C code routines that are called by the parser +** to handle SELECT statements in SQLite. +*/ +/* #include "sqliteInt.h" */ + +/* +** An instance of the following object is used to record information about +** how to process the DISTINCT keyword, to simplify passing that information +** into the selectInnerLoop() routine. +*/ +typedef struct DistinctCtx DistinctCtx; +struct DistinctCtx { + u8 isTnct; /* 0: Not distinct. 1: DISTICT 2: DISTINCT and ORDER BY */ + u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */ + int tabTnct; /* Ephemeral table used for DISTINCT processing */ + int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */ +}; + +/* +** An instance of the following object is used to record information about +** the ORDER BY (or GROUP BY) clause of query is being coded. +** +** The aDefer[] array is used by the sorter-references optimization. For +** example, assuming there is no index that can be used for the ORDER BY, +** for the query: +** +** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10; +** +** it may be more efficient to add just the "a" values to the sorter, and +** retrieve the associated "bigblob" values directly from table t1 as the +** 10 smallest "a" values are extracted from the sorter. +** +** When the sorter-reference optimization is used, there is one entry in the +** aDefer[] array for each database table that may be read as values are +** extracted from the sorter. +*/ +typedef struct SortCtx SortCtx; +struct SortCtx { + ExprList *pOrderBy; /* The ORDER BY (or GROUP BY clause) */ + int nOBSat; /* Number of ORDER BY terms satisfied by indices */ + int iECursor; /* Cursor number for the sorter */ + int regReturn; /* Register holding block-output return address */ + int labelBkOut; /* Start label for the block-output subroutine */ + int addrSortIndex; /* Address of the OP_SorterOpen or OP_OpenEphemeral */ + int labelDone; /* Jump here when done, ex: LIMIT reached */ + int labelOBLopt; /* Jump here when sorter is full */ + u8 sortFlags; /* Zero or more SORTFLAG_* bits */ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + u8 nDefer; /* Number of valid entries in aDefer[] */ + struct DeferredCsr { + Table *pTab; /* Table definition */ + int iCsr; /* Cursor number for table */ + int nKey; /* Number of PK columns for table pTab (>=1) */ + } aDefer[4]; +#endif + struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */ +}; +#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */ + +/* +** Delete all the content of a Select structure. Deallocate the structure +** itself depending on the value of bFree +** +** If bFree==1, call sqlite3DbFree() on the p object. +** If bFree==0, Leave the first Select object unfreed +*/ +static void clearSelect(sqlite3 *db, Select *p, int bFree){ + while( p ){ + Select *pPrior = p->pPrior; + sqlite3ExprListDelete(db, p->pEList); + sqlite3SrcListDelete(db, p->pSrc); + sqlite3ExprDelete(db, p->pWhere); + sqlite3ExprListDelete(db, p->pGroupBy); + sqlite3ExprDelete(db, p->pHaving); + sqlite3ExprListDelete(db, p->pOrderBy); + sqlite3ExprDelete(db, p->pLimit); + if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ + sqlite3WindowListDelete(db, p->pWinDefn); + } + while( p->pWin ){ + assert( p->pWin->ppThis==&p->pWin ); + sqlite3WindowUnlinkFromSelect(p->pWin); + } +#endif + if( bFree ) sqlite3DbFreeNN(db, p); + p = pPrior; + bFree = 1; + } +} + +/* +** Initialize a SelectDest structure. +*/ +SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ + pDest->eDest = (u8)eDest; + pDest->iSDParm = iParm; + pDest->iSDParm2 = 0; + pDest->zAffSdst = 0; + pDest->iSdst = 0; + pDest->nSdst = 0; +} + + +/* +** Allocate a new Select structure and return a pointer to that +** structure. +*/ +SQLITE_PRIVATE Select *sqlite3SelectNew( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* which columns to include in the result */ + SrcList *pSrc, /* the FROM clause -- which tables to scan */ + Expr *pWhere, /* the WHERE clause */ + ExprList *pGroupBy, /* the GROUP BY clause */ + Expr *pHaving, /* the HAVING clause */ + ExprList *pOrderBy, /* the ORDER BY clause */ + u32 selFlags, /* Flag parameters, such as SF_Distinct */ + Expr *pLimit /* LIMIT value. NULL means not used */ +){ + Select *pNew, *pAllocated; + Select standin; + pAllocated = pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); + if( pNew==0 ){ + assert( pParse->db->mallocFailed ); + pNew = &standin; + } + if( pEList==0 ){ + pEList = sqlite3ExprListAppend(pParse, 0, + sqlite3Expr(pParse->db,TK_ASTERISK,0)); + } + pNew->pEList = pEList; + pNew->op = TK_SELECT; + pNew->selFlags = selFlags; + pNew->iLimit = 0; + pNew->iOffset = 0; + pNew->selId = ++pParse->nSelect; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = 0; + if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc)); + pNew->pSrc = pSrc; + pNew->pWhere = pWhere; + pNew->pGroupBy = pGroupBy; + pNew->pHaving = pHaving; + pNew->pOrderBy = pOrderBy; + pNew->pPrior = 0; + pNew->pNext = 0; + pNew->pLimit = pLimit; + pNew->pWith = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + pNew->pWin = 0; + pNew->pWinDefn = 0; +#endif + if( pParse->db->mallocFailed ) { + clearSelect(pParse->db, pNew, pNew!=&standin); + pAllocated = 0; + }else{ + assert( pNew->pSrc!=0 || pParse->nErr>0 ); + } + return pAllocated; +} + + +/* +** Delete the given Select structure and all of its substructures. +*/ +SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ + if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1); +} + +/* +** Return a pointer to the right-most SELECT statement in a compound. +*/ +static Select *findRightmost(Select *p){ + while( p->pNext ) p = p->pNext; + return p; +} + +/* +** Given 1 to 3 identifiers preceding the JOIN keyword, determine the +** type of join. Return an integer constant that expresses that type +** in terms of the following bit values: +** +** JT_INNER +** JT_CROSS +** JT_OUTER +** JT_NATURAL +** JT_LEFT +** JT_RIGHT +** +** A full outer join is the combination of JT_LEFT and JT_RIGHT. +** +** If an illegal or unsupported join type is seen, then still return +** a join type, but put an error in the pParse structure. +** +** These are the valid join types: +** +** +** pA pB pC Return Value +** ------- ----- ----- ------------ +** CROSS - - JT_CROSS +** INNER - - JT_INNER +** LEFT - - JT_LEFT|JT_OUTER +** LEFT OUTER - JT_LEFT|JT_OUTER +** RIGHT - - JT_RIGHT|JT_OUTER +** RIGHT OUTER - JT_RIGHT|JT_OUTER +** FULL - - JT_LEFT|JT_RIGHT|JT_OUTER +** FULL OUTER - JT_LEFT|JT_RIGHT|JT_OUTER +** NATURAL INNER - JT_NATURAL|JT_INNER +** NATURAL LEFT - JT_NATURAL|JT_LEFT|JT_OUTER +** NATURAL LEFT OUTER JT_NATURAL|JT_LEFT|JT_OUTER +** NATURAL RIGHT - JT_NATURAL|JT_RIGHT|JT_OUTER +** NATURAL RIGHT OUTER JT_NATURAL|JT_RIGHT|JT_OUTER +** NATURAL FULL - JT_NATURAL|JT_LEFT|JT_RIGHT +** NATURAL FULL OUTER JT_NATRUAL|JT_LEFT|JT_RIGHT +** +** To preserve historical compatibly, SQLite also accepts a variety +** of other non-standard and in many cases non-sensical join types. +** This routine makes as much sense at it can from the nonsense join +** type and returns a result. Examples of accepted nonsense join types +** include but are not limited to: +** +** INNER CROSS JOIN -> same as JOIN +** NATURAL CROSS JOIN -> same as NATURAL JOIN +** OUTER LEFT JOIN -> same as LEFT JOIN +** LEFT NATURAL JOIN -> same as NATURAL LEFT JOIN +** LEFT RIGHT JOIN -> same as FULL JOIN +** RIGHT OUTER FULL JOIN -> same as FULL JOIN +** CROSS CROSS CROSS JOIN -> same as JOIN +** +** The only restrictions on the join type name are: +** +** * "INNER" cannot appear together with "OUTER", "LEFT", "RIGHT", +** or "FULL". +** +** * "CROSS" cannot appear together with "OUTER", "LEFT", "RIGHT, +** or "FULL". +** +** * If "OUTER" is present then there must also be one of +** "LEFT", "RIGHT", or "FULL" +*/ +SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ + int jointype = 0; + Token *apAll[3]; + Token *p; + /* 0123456789 123456789 123456789 123 */ + static const char zKeyText[] = "naturaleftouterightfullinnercross"; + static const struct { + u8 i; /* Beginning of keyword text in zKeyText[] */ + u8 nChar; /* Length of the keyword in characters */ + u8 code; /* Join type mask */ + } aKeyword[] = { + /* (0) natural */ { 0, 7, JT_NATURAL }, + /* (1) left */ { 6, 4, JT_LEFT|JT_OUTER }, + /* (2) outer */ { 10, 5, JT_OUTER }, + /* (3) right */ { 14, 5, JT_RIGHT|JT_OUTER }, + /* (4) full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, + /* (5) inner */ { 23, 5, JT_INNER }, + /* (6) cross */ { 28, 5, JT_INNER|JT_CROSS }, + }; + int i, j; + apAll[0] = pA; + apAll[1] = pB; + apAll[2] = pC; + for(i=0; i<3 && apAll[i]; i++){ + p = apAll[i]; + for(j=0; jn==aKeyword[j].nChar + && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){ + jointype |= aKeyword[j].code; + break; + } + } + testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 ); + if( j>=ArraySize(aKeyword) ){ + jointype |= JT_ERROR; + break; + } + } + if( + (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || + (jointype & JT_ERROR)!=0 || + (jointype & (JT_OUTER|JT_LEFT|JT_RIGHT))==JT_OUTER + ){ + const char *zSp1 = " "; + const char *zSp2 = " "; + if( pB==0 ){ zSp1++; } + if( pC==0 ){ zSp2++; } + sqlite3ErrorMsg(pParse, "unknown join type: " + "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC); + jointype = JT_INNER; + } + return jointype; +} + +/* +** Return the index of a column in a table. Return -1 if the column +** is not contained in the table. +*/ +SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ + int i; + u8 h = sqlite3StrIHash(zCol); + Column *pCol; + for(pCol=pTab->aCol, i=0; inCol; pCol++, i++){ + if( pCol->hName==h && sqlite3StrICmp(pCol->zCnName, zCol)==0 ) return i; + } + return -1; +} + +/* +** Mark a subquery result column as having been used. +*/ +SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){ + assert( pItem!=0 ); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + if( pItem->fg.isNestedFrom ){ + ExprList *pResults; + assert( pItem->pSelect!=0 ); + pResults = pItem->pSelect->pEList; + assert( pResults!=0 ); + assert( iCol>=0 && iColnExpr ); + pResults->a[iCol].fg.bUsed = 1; + } +} + +/* +** Search the tables iStart..iEnd (inclusive) in pSrc, looking for a +** table that has a column named zCol. The search is left-to-right. +** The first match found is returned. +** +** When found, set *piTab and *piCol to the table index and column index +** of the matching column and return TRUE. +** +** If not found, return FALSE. +*/ +static int tableAndColumnIndex( + SrcList *pSrc, /* Array of tables to search */ + int iStart, /* First member of pSrc->a[] to check */ + int iEnd, /* Last member of pSrc->a[] to check */ + const char *zCol, /* Name of the column we are looking for */ + int *piTab, /* Write index of pSrc->a[] here */ + int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ + int bIgnoreHidden /* Ignore hidden columns */ +){ + int i; /* For looping over tables in pSrc */ + int iCol; /* Index of column matching zCol */ + + assert( iEndnSrc ); + assert( iStart>=0 ); + assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ + + for(i=iStart; i<=iEnd; i++){ + iCol = sqlite3ColumnIndex(pSrc->a[i].pTab, zCol); + if( iCol>=0 + && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) + ){ + if( piTab ){ + sqlite3SrcItemColumnUsed(&pSrc->a[i], iCol); + *piTab = i; + *piCol = iCol; + } + return 1; + } + } + return 0; +} + +/* +** Set the EP_OuterON property on all terms of the given expression. +** And set the Expr.w.iJoin to iTable for every term in the +** expression. +** +** The EP_OuterON property is used on terms of an expression to tell +** the OUTER JOIN processing logic that this term is part of the +** join restriction specified in the ON or USING clause and not a part +** of the more general WHERE clause. These terms are moved over to the +** WHERE clause during join processing but we need to remember that they +** originated in the ON or USING clause. +** +** The Expr.w.iJoin tells the WHERE clause processing that the +** expression depends on table w.iJoin even if that table is not +** explicitly mentioned in the expression. That information is needed +** for cases like this: +** +** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 +** +** The where clause needs to defer the handling of the t1.x=5 +** term until after the t2 loop of the join. In that way, a +** NULL t2 row will be inserted whenever t1.x!=5. If we do not +** defer the handling of t1.x=5, it will be processed immediately +** after the t1 loop and rows with t1.x!=5 will never appear in +** the output, which is incorrect. +*/ +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ + assert( joinFlag==EP_OuterON || joinFlag==EP_InnerON ); + while( p ){ + ExprSetProperty(p, joinFlag); + assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(p, EP_NoReduce); + p->w.iJoin = iTable; + if( p->op==TK_FUNCTION ){ + assert( ExprUseXList(p) ); + if( p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable, joinFlag); + } + } + } + sqlite3SetJoinExpr(p->pLeft, iTable, joinFlag); + p = p->pRight; + } +} + +/* Undo the work of sqlite3SetJoinExpr(). This is used when a LEFT JOIN +** is simplified into an ordinary JOIN, and when an ON expression is +** "pushed down" into the WHERE clause of a subquery. +** +** Convert every term that is marked with EP_OuterON and w.iJoin==iTable into +** an ordinary term that omits the EP_OuterON mark. Or if iTable<0, then +** just clear every EP_OuterON and EP_InnerON mark from the expression tree. +** +** If nullable is true, that means that Expr p might evaluate to NULL even +** if it is a reference to a NOT NULL column. This can happen, for example, +** if the table that p references is on the left side of a RIGHT JOIN. +** If nullable is true, then take care to not remove the EP_CanBeNull bit. +** See forum thread https://sqlite.org/forum/forumpost/b40696f50145d21c +*/ +static void unsetJoinExpr(Expr *p, int iTable, int nullable){ + while( p ){ + if( iTable<0 || (ExprHasProperty(p, EP_OuterON) && p->w.iJoin==iTable) ){ + ExprClearProperty(p, EP_OuterON|EP_InnerON); + if( iTable>=0 ) ExprSetProperty(p, EP_InnerON); + } + if( p->op==TK_COLUMN && p->iTable==iTable && !nullable ){ + ExprClearProperty(p, EP_CanBeNull); + } + if( p->op==TK_FUNCTION ){ + assert( ExprUseXList(p) ); + if( p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + unsetJoinExpr(p->x.pList->a[i].pExpr, iTable, nullable); + } + } + } + unsetJoinExpr(p->pLeft, iTable, nullable); + p = p->pRight; + } +} + +/* +** This routine processes the join information for a SELECT statement. +** +** * A NATURAL join is converted into a USING join. After that, we +** do not need to be concerned with NATURAL joins and we only have +** think about USING joins. +** +** * ON and USING clauses result in extra terms being added to the +** WHERE clause to enforce the specified constraints. The extra +** WHERE clause terms will be tagged with EP_OuterON or +** EP_InnerON so that we know that they originated in ON/USING. +** +** The terms of a FROM clause are contained in the Select.pSrc structure. +** The left most table is the first entry in Select.pSrc. The right-most +** table is the last entry. The join operator is held in the entry to +** the right. Thus entry 1 contains the join operator for the join between +** entries 0 and 1. Any ON or USING clauses associated with the join are +** also attached to the right entry. +** +** This routine returns the number of errors encountered. +*/ +static int sqlite3ProcessJoin(Parse *pParse, Select *p){ + SrcList *pSrc; /* All tables in the FROM clause */ + int i, j; /* Loop counters */ + SrcItem *pLeft; /* Left table being joined */ + SrcItem *pRight; /* Right table being joined */ + + pSrc = p->pSrc; + pLeft = &pSrc->a[0]; + pRight = &pLeft[1]; + for(i=0; inSrc-1; i++, pRight++, pLeft++){ + Table *pRightTab = pRight->pTab; + u32 joinType; + + if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue; + joinType = (pRight->fg.jointype & JT_OUTER)!=0 ? EP_OuterON : EP_InnerON; + + /* If this is a NATURAL join, synthesize an approprate USING clause + ** to specify which columns should be joined. + */ + if( pRight->fg.jointype & JT_NATURAL ){ + IdList *pUsing = 0; + if( pRight->fg.isUsing || pRight->u3.pOn ){ + sqlite3ErrorMsg(pParse, "a NATURAL join may not have " + "an ON or USING clause", 0); + return 1; + } + for(j=0; jnCol; j++){ + char *zName; /* Name of column in the right table */ + + if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; + zName = pRightTab->aCol[j].zCnName; + if( tableAndColumnIndex(pSrc, 0, i, zName, 0, 0, 1) ){ + pUsing = sqlite3IdListAppend(pParse, pUsing, 0); + if( pUsing ){ + assert( pUsing->nId>0 ); + assert( pUsing->a[pUsing->nId-1].zName==0 ); + pUsing->a[pUsing->nId-1].zName = sqlite3DbStrDup(pParse->db, zName); + } + } + } + if( pUsing ){ + pRight->fg.isUsing = 1; + pRight->fg.isSynthUsing = 1; + pRight->u3.pUsing = pUsing; + } + if( pParse->nErr ) return 1; + } + + /* Create extra terms on the WHERE clause for each column named + ** in the USING clause. Example: If the two tables to be joined are + ** A and B and the USING clause names X, Y, and Z, then add this + ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z + ** Report an error if any column mentioned in the USING clause is + ** not contained in both tables to be joined. + */ + if( pRight->fg.isUsing ){ + IdList *pList = pRight->u3.pUsing; + sqlite3 *db = pParse->db; + assert( pList!=0 ); + for(j=0; jnId; j++){ + char *zName; /* Name of the term in the USING clause */ + int iLeft; /* Table on the left with matching column name */ + int iLeftCol; /* Column number of matching column on the left */ + int iRightCol; /* Column number of matching column on the right */ + Expr *pE1; /* Reference to the column on the LEFT of the join */ + Expr *pE2; /* Reference to the column on the RIGHT of the join */ + Expr *pEq; /* Equality constraint. pE1 == pE2 */ + + zName = pList->a[j].zName; + iRightCol = sqlite3ColumnIndex(pRightTab, zName); + if( iRightCol<0 + || tableAndColumnIndex(pSrc, 0, i, zName, &iLeft, &iLeftCol, + pRight->fg.isSynthUsing)==0 + ){ + sqlite3ErrorMsg(pParse, "cannot join using column %s - column " + "not present in both tables", zName); + return 1; + } + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol); + sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol); + if( (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + /* This branch runs if the query contains one or more RIGHT or FULL + ** JOINs. If only a single table on the left side of this join + ** contains the zName column, then this branch is a no-op. + ** But if there are two or more tables on the left side + ** of the join, construct a coalesce() function that gathers all + ** such tables. Raise an error if more than one of those references + ** to zName is not also within a prior USING clause. + ** + ** We really ought to raise an error if there are two or more + ** non-USING references to zName on the left of an INNER or LEFT + ** JOIN. But older versions of SQLite do not do that, so we avoid + ** adding a new error so as to not break legacy applications. + */ + ExprList *pFuncArgs = 0; /* Arguments to the coalesce() */ + static const Token tkCoalesce = { "coalesce", 8 }; + while( tableAndColumnIndex(pSrc, iLeft+1, i, zName, &iLeft, &iLeftCol, + pRight->fg.isSynthUsing)!=0 ){ + if( pSrc->a[iLeft].fg.isUsing==0 + || sqlite3IdListIndex(pSrc->a[iLeft].u3.pUsing, zName)<0 + ){ + sqlite3ErrorMsg(pParse, "ambiguous reference to %s in USING()", + zName); + break; + } + pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol); + sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol); + } + if( pFuncArgs ){ + pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); + pE1 = sqlite3ExprFunction(pParse, pFuncArgs, &tkCoalesce, 0); + } + } + pE2 = sqlite3CreateColumnExpr(db, pSrc, i+1, iRightCol); + sqlite3SrcItemColumnUsed(pRight, iRightCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); + assert( pE2!=0 || pEq==0 ); + if( pEq ){ + ExprSetProperty(pEq, joinType); + assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pEq, EP_NoReduce); + pEq->w.iJoin = pE2->iTable; + } + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pEq); + } + } + + /* Add the ON clause to the end of the WHERE clause, connected by + ** an AND operator. + */ + else if( pRight->u3.pOn ){ + sqlite3SetJoinExpr(pRight->u3.pOn, pRight->iCursor, joinType); + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->u3.pOn); + pRight->u3.pOn = 0; + pRight->fg.isOn = 1; + } + } + return 0; +} + +/* +** An instance of this object holds information (beyond pParse and pSelect) +** needed to load the next result row that is to be added to the sorter. +*/ +typedef struct RowLoadInfo RowLoadInfo; +struct RowLoadInfo { + int regResult; /* Store results in array of registers here */ + u8 ecelFlags; /* Flag argument to ExprCodeExprList() */ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + ExprList *pExtra; /* Extra columns needed by sorter refs */ + int regExtraResult; /* Where to load the extra columns */ +#endif +}; + +/* +** This routine does the work of loading query data into an array of +** registers so that it can be added to the sorter. +*/ +static void innerLoopLoadRow( + Parse *pParse, /* Statement under construction */ + Select *pSelect, /* The query being coded */ + RowLoadInfo *pInfo /* Info needed to complete the row load */ +){ + sqlite3ExprCodeExprList(pParse, pSelect->pEList, pInfo->regResult, + 0, pInfo->ecelFlags); +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pInfo->pExtra ){ + sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0); + sqlite3ExprListDelete(pParse->db, pInfo->pExtra); + } +#endif +} + +/* +** Code the OP_MakeRecord instruction that generates the entry to be +** added into the sorter. +** +** Return the register in which the result is stored. +*/ +static int makeSorterRecord( + Parse *pParse, + SortCtx *pSort, + Select *pSelect, + int regBase, + int nBase +){ + int nOBSat = pSort->nOBSat; + Vdbe *v = pParse->pVdbe; + int regOut = ++pParse->nMem; + if( pSort->pDeferredRowLoad ){ + innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut); + return regOut; +} + +/* +** Generate code that will push the record in registers regData +** through regData+nData-1 onto the sorter. +*/ +static void pushOntoSorter( + Parse *pParse, /* Parser context */ + SortCtx *pSort, /* Information about the ORDER BY clause */ + Select *pSelect, /* The whole SELECT statement */ + int regData, /* First register holding data to be sorted */ + int regOrigData, /* First register holding data before packing */ + int nData, /* Number of elements in the regData data array */ + int nPrefixReg /* No. of reg prior to regData available for use */ +){ + Vdbe *v = pParse->pVdbe; /* Stmt under construction */ + int bSeq = ((pSort->sortFlags & SORTFLAG_UseSorter)==0); + int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */ + int nBase = nExpr + bSeq + nData; /* Fields in sorter record */ + int regBase; /* Regs for sorter record */ + int regRecord = 0; /* Assembled sorter record */ + int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */ + int op; /* Opcode to add sorter record to sorter */ + int iLimit; /* LIMIT counter */ + int iSkip = 0; /* End of the sorter insert loop */ + + assert( bSeq==0 || bSeq==1 ); + + /* Three cases: + ** (1) The data to be sorted has already been packed into a Record + ** by a prior OP_MakeRecord. In this case nData==1 and regData + ** will be completely unrelated to regOrigData. + ** (2) All output columns are included in the sort record. In that + ** case regData==regOrigData. + ** (3) Some output columns are omitted from the sort record due to + ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the + ** SQLITE_ECEL_OMITREF optimization, or due to the + ** SortCtx.pDeferredRowLoad optimiation. In any of these cases + ** regOrigData is 0 to prevent this routine from trying to copy + ** values that might not yet exist. + */ + assert( nData==1 || regData==regOrigData || regOrigData==0 ); + + if( nPrefixReg ){ + assert( nPrefixReg==nExpr+bSeq ); + regBase = regData - nPrefixReg; + }else{ + regBase = pParse->nMem + 1; + pParse->nMem += nBase; + } + assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); + iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; + pSort->labelDone = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, + SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); + if( bSeq ){ + sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); + } + if( nPrefixReg==0 && nData>0 ){ + sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData); + } + if( nOBSat>0 ){ + int regPrevKey; /* The first nOBSat columns of the previous row */ + int addrFirst; /* Address of the OP_IfNot opcode */ + int addrJmp; /* Address of the OP_Jump opcode */ + VdbeOp *pOp; /* Opcode that opens the sorter */ + int nKey; /* Number of sorting key columns, including OP_Sequence */ + KeyInfo *pKI; /* Original KeyInfo on the sorter table */ + + regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); + regPrevKey = pParse->nMem+1; + pParse->nMem += pSort->nOBSat; + nKey = nExpr - pSort->nOBSat + bSeq; + if( bSeq ){ + addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); + }else{ + addrFirst = sqlite3VdbeAddOp1(v, OP_SequenceTest, pSort->iECursor); + } + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); + pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); + if( pParse->db->mallocFailed ) return; + pOp->p2 = nKey + nData; + pKI = pOp->p4.pKeyInfo; + memset(pKI->aSortFlags, 0, pKI->nKeyField); /* Makes OP_Jump testable */ + sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); + testcase( pKI->nAllField > pKI->nKeyField+2 ); + pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, + pKI->nAllField-pKI->nKeyField-1); + pOp = 0; /* Ensure pOp not used after sqltie3VdbeAddOp3() */ + addrJmp = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); + pSort->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); + if( iLimit ){ + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, pSort->labelDone); + VdbeCoverage(v); + } + sqlite3VdbeJumpHere(v, addrFirst); + sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat); + sqlite3VdbeJumpHere(v, addrJmp); + } + if( iLimit ){ + /* At this point the values for the new sorter entry are stored + ** in an array of registers. They need to be composed into a record + ** and inserted into the sorter if either (a) there are currently + ** less than LIMIT+OFFSET items or (b) the new record is smaller than + ** the largest record currently in the sorter. If (b) is true and there + ** are already LIMIT+OFFSET items in the sorter, delete the largest + ** entry before inserting the new one. This way there are never more + ** than LIMIT+OFFSET items in the sorter. + ** + ** If the new record does not need to be inserted into the sorter, + ** jump to the next iteration of the loop. If the pSort->labelOBLopt + ** value is not zero, then it is a label of where to jump. Otherwise, + ** just bypass the row insert logic. See the header comment on the + ** sqlite3WhereOrderByLimitOptLabel() function for additional info. + */ + int iCsr = pSort->iECursor; + sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4); + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Last, iCsr, 0); + iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE, + iCsr, 0, regBase+nOBSat, nExpr-nOBSat); + VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_Delete, iCsr); + } + if( regRecord==0 ){ + regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); + } + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + op = OP_SorterInsert; + }else{ + op = OP_IdxInsert; + } + sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord, + regBase+nOBSat, nBase-nOBSat); + if( iSkip ){ + sqlite3VdbeChangeP2(v, iSkip, + pSort->labelOBLopt ? pSort->labelOBLopt : sqlite3VdbeCurrentAddr(v)); + } +} + +/* +** Add code to implement the OFFSET +*/ +static void codeOffset( + Vdbe *v, /* Generate code into this VM */ + int iOffset, /* Register holding the offset counter */ + int iContinue /* Jump here to skip the current record */ +){ + if( iOffset>0 ){ + sqlite3VdbeAddOp3(v, OP_IfPos, iOffset, iContinue, 1); VdbeCoverage(v); + VdbeComment((v, "OFFSET")); + } +} + +/* +** Add code that will check to make sure the array of registers starting at +** iMem form a distinct entry. This is used by both "SELECT DISTINCT ..." and +** distinct aggregates ("SELECT count(DISTINCT ) ..."). Three strategies +** are available. Which is used depends on the value of parameter eTnctType, +** as follows: +** +** WHERE_DISTINCT_UNORDERED/WHERE_DISTINCT_NOOP: +** Build an ephemeral table that contains all entries seen before and +** skip entries which have been seen before. +** +** Parameter iTab is the cursor number of an ephemeral table that must +** be opened before the VM code generated by this routine is executed. +** The ephemeral cursor table is queried for a record identical to the +** record formed by the current array of registers. If one is found, +** jump to VM address addrRepeat. Otherwise, insert a new record into +** the ephemeral cursor and proceed. +** +** The returned value in this case is a copy of parameter iTab. +** +** WHERE_DISTINCT_ORDERED: +** In this case rows are being delivered sorted order. The ephermal +** table is not required. Instead, the current set of values +** is compared against previous row. If they match, the new row +** is not distinct and control jumps to VM address addrRepeat. Otherwise, +** the VM program proceeds with processing the new row. +** +** The returned value in this case is the register number of the first +** in an array of registers used to store the previous result row so that +** it can be compared to the next. The caller must ensure that this +** register is initialized to NULL. (The fixDistinctOpenEph() routine +** will take care of this initialization.) +** +** WHERE_DISTINCT_UNIQUE: +** In this case it has already been determined that the rows are distinct. +** No special action is required. The return value is zero. +** +** Parameter pEList is the list of expressions used to generated the +** contents of each row. It is used by this routine to determine (a) +** how many elements there are in the array of registers and (b) the +** collation sequences that should be used for the comparisons if +** eTnctType is WHERE_DISTINCT_ORDERED. +*/ +static int codeDistinct( + Parse *pParse, /* Parsing and code generating context */ + int eTnctType, /* WHERE_DISTINCT_* value */ + int iTab, /* A sorting index used to test for distinctness */ + int addrRepeat, /* Jump to here if not distinct */ + ExprList *pEList, /* Expression for each element */ + int regElem /* First element */ +){ + int iRet = 0; + int nResultCol = pEList->nExpr; + Vdbe *v = pParse->pVdbe; + + switch( eTnctType ){ + case WHERE_DISTINCT_ORDERED: { + int i; + int iJump; /* Jump destination */ + int regPrev; /* Previous row content */ + + /* Allocate space for the previous row */ + iRet = regPrev = pParse->nMem+1; + pParse->nMem += nResultCol; + + iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; + for(i=0; ia[i].pExpr); + if( idb->mallocFailed ); + sqlite3VdbeAddOp3(v, OP_Copy, regElem, regPrev, nResultCol-1); + break; + } + + case WHERE_DISTINCT_UNIQUE: { + /* nothing to do */ + break; + } + + default: { + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, regElem, nResultCol); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regElem, nResultCol, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r1, regElem, nResultCol); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3ReleaseTempReg(pParse, r1); + iRet = iTab; + break; + } + } + + return iRet; +} + +/* +** This routine runs after codeDistinct(). It makes necessary +** adjustments to the OP_OpenEphemeral opcode that the codeDistinct() +** routine made use of. This processing must be done separately since +** sometimes codeDistinct is called before the OP_OpenEphemeral is actually +** laid down. +** +** WHERE_DISTINCT_NOOP: +** WHERE_DISTINCT_UNORDERED: +** +** No adjustments necessary. This function is a no-op. +** +** WHERE_DISTINCT_UNIQUE: +** +** The ephemeral table is not needed. So change the +** OP_OpenEphemeral opcode into an OP_Noop. +** +** WHERE_DISTINCT_ORDERED: +** +** The ephemeral table is not needed. But we do need register +** iVal to be initialized to NULL. So change the OP_OpenEphemeral +** into an OP_Null on the iVal register. +*/ +static void fixDistinctOpenEph( + Parse *pParse, /* Parsing and code generating context */ + int eTnctType, /* WHERE_DISTINCT_* value */ + int iVal, /* Value returned by codeDistinct() */ + int iOpenEphAddr /* Address of OP_OpenEphemeral instruction for iTab */ +){ + if( pParse->nErr==0 + && (eTnctType==WHERE_DISTINCT_UNIQUE || eTnctType==WHERE_DISTINCT_ORDERED) + ){ + Vdbe *v = pParse->pVdbe; + sqlite3VdbeChangeToNoop(v, iOpenEphAddr); + if( sqlite3VdbeGetOp(v, iOpenEphAddr+1)->opcode==OP_Explain ){ + sqlite3VdbeChangeToNoop(v, iOpenEphAddr+1); + } + if( eTnctType==WHERE_DISTINCT_ORDERED ){ + /* Change the OP_OpenEphemeral to an OP_Null that sets the MEM_Cleared + ** bit on the first register of the previous value. This will cause the + ** OP_Ne added in codeDistinct() to always fail on the first iteration of + ** the loop even if the first row is all NULLs. */ + VdbeOp *pOp = sqlite3VdbeGetOp(v, iOpenEphAddr); + pOp->opcode = OP_Null; + pOp->p1 = 1; + pOp->p2 = iVal; + } + } +} + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES +/* +** This function is called as part of inner-loop generation for a SELECT +** statement with an ORDER BY that is not optimized by an index. It +** determines the expressions, if any, that the sorter-reference +** optimization should be used for. The sorter-reference optimization +** is used for SELECT queries like: +** +** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10 +** +** If the optimization is used for expression "bigblob", then instead of +** storing values read from that column in the sorter records, the PK of +** the row from table t1 is stored instead. Then, as records are extracted from +** the sorter to return to the user, the required value of bigblob is +** retrieved directly from table t1. If the values are very large, this +** can be more efficient than storing them directly in the sorter records. +** +** The ExprList_item.fg.bSorterRef flag is set for each expression in pEList +** for which the sorter-reference optimization should be enabled. +** Additionally, the pSort->aDefer[] array is populated with entries +** for all cursors required to evaluate all selected expressions. Finally. +** output variable (*ppExtra) is set to an expression list containing +** expressions for all extra PK values that should be stored in the +** sorter records. +*/ +static void selectExprDefer( + Parse *pParse, /* Leave any error here */ + SortCtx *pSort, /* Sorter context */ + ExprList *pEList, /* Expressions destined for sorter */ + ExprList **ppExtra /* Expressions to append to sorter record */ +){ + int i; + int nDefer = 0; + ExprList *pExtra = 0; + for(i=0; inExpr; i++){ + struct ExprList_item *pItem = &pEList->a[i]; + if( pItem->u.x.iOrderByCol==0 ){ + Expr *pExpr = pItem->pExpr; + Table *pTab; + if( pExpr->op==TK_COLUMN + && pExpr->iColumn>=0 + && ALWAYS( ExprUseYTab(pExpr) ) + && (pTab = pExpr->y.pTab)!=0 + && IsOrdinaryTable(pTab) + && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)!=0 + ){ + int j; + for(j=0; jaDefer[j].iCsr==pExpr->iTable ) break; + } + if( j==nDefer ){ + if( nDefer==ArraySize(pSort->aDefer) ){ + continue; + }else{ + int nKey = 1; + int k; + Index *pPk = 0; + if( !HasRowid(pTab) ){ + pPk = sqlite3PrimaryKeyIndex(pTab); + nKey = pPk->nKeyCol; + } + for(k=0; kiTable = pExpr->iTable; + assert( ExprUseYTab(pNew) ); + pNew->y.pTab = pExpr->y.pTab; + pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; + pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); + } + } + pSort->aDefer[nDefer].pTab = pExpr->y.pTab; + pSort->aDefer[nDefer].iCsr = pExpr->iTable; + pSort->aDefer[nDefer].nKey = nKey; + nDefer++; + } + } + pItem->fg.bSorterRef = 1; + } + } + } + pSort->nDefer = (u8)nDefer; + *ppExtra = pExtra; +} +#endif + +/* +** This routine generates the code for the inside of the inner loop +** of a SELECT. +** +** If srcTab is negative, then the p->pEList expressions +** are evaluated in order to get the data for this row. If srcTab is +** zero or more, then data is pulled from srcTab and p->pEList is used only +** to get the number of columns and the collation sequence for each column. +*/ +static void selectInnerLoop( + Parse *pParse, /* The parser context */ + Select *p, /* The complete select statement being coded */ + int srcTab, /* Pull data from this table if non-negative */ + SortCtx *pSort, /* If not NULL, info on how to process ORDER BY */ + DistinctCtx *pDistinct, /* If not NULL, info on how to process DISTINCT */ + SelectDest *pDest, /* How to dispose of the results */ + int iContinue, /* Jump here to continue with next row */ + int iBreak /* Jump here to break out of the inner loop */ +){ + Vdbe *v = pParse->pVdbe; + int i; + int hasDistinct; /* True if the DISTINCT keyword is present */ + int eDest = pDest->eDest; /* How to dispose of results */ + int iParm = pDest->iSDParm; /* First argument to disposal method */ + int nResultCol; /* Number of result columns */ + int nPrefixReg = 0; /* Number of extra registers before regResult */ + RowLoadInfo sRowLoadInfo; /* Info for deferred row loading */ + + /* Usually, regResult is the first cell in an array of memory cells + ** containing the current result row. In this case regOrig is set to the + ** same value. However, if the results are being sent to the sorter, the + ** values for any expressions that are also part of the sort-key are omitted + ** from this array. In this case regOrig is set to zero. */ + int regResult; /* Start of memory holding current results */ + int regOrig; /* Start of memory holding full result (or 0) */ + + assert( v ); + assert( p->pEList!=0 ); + hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP; + if( pSort && pSort->pOrderBy==0 ) pSort = 0; + if( pSort==0 && !hasDistinct ){ + assert( iContinue!=0 ); + codeOffset(v, p->iOffset, iContinue); + } + + /* Pull the requested columns. + */ + nResultCol = p->pEList->nExpr; + + if( pDest->iSdst==0 ){ + if( pSort ){ + nPrefixReg = pSort->pOrderBy->nExpr; + if( !(pSort->sortFlags & SORTFLAG_UseSorter) ) nPrefixReg++; + pParse->nMem += nPrefixReg; + } + pDest->iSdst = pParse->nMem+1; + pParse->nMem += nResultCol; + }else if( pDest->iSdst+nResultCol > pParse->nMem ){ + /* This is an error condition that can result, for example, when a SELECT + ** on the right-hand side of an INSERT contains more result columns than + ** there are columns in the table on the left. The error will be caught + ** and reported later. But we need to make sure enough memory is allocated + ** to avoid other spurious errors in the meantime. */ + pParse->nMem += nResultCol; + } + pDest->nSdst = nResultCol; + regOrig = regResult = pDest->iSdst; + if( srcTab>=0 ){ + for(i=0; ipEList->a[i].zEName)); + } + }else if( eDest!=SRT_Exists ){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + ExprList *pExtra = 0; +#endif + /* If the destination is an EXISTS(...) expression, the actual + ** values returned by the SELECT are not required. + */ + u8 ecelFlags; /* "ecel" is an abbreviation of "ExprCodeExprList" */ + ExprList *pEList; + if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){ + ecelFlags = SQLITE_ECEL_DUP; + }else{ + ecelFlags = 0; + } + if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){ + /* For each expression in p->pEList that is a copy of an expression in + ** the ORDER BY clause (pSort->pOrderBy), set the associated + ** iOrderByCol value to one more than the index of the ORDER BY + ** expression within the sort-key that pushOntoSorter() will generate. + ** This allows the p->pEList field to be omitted from the sorted record, + ** saving space and CPU cycles. */ + ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF); + + for(i=pSort->nOBSat; ipOrderBy->nExpr; i++){ + int j; + if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){ + p->pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat; + } + } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + selectExprDefer(pParse, pSort, p->pEList, &pExtra); + if( pExtra && pParse->db->mallocFailed==0 ){ + /* If there are any extra PK columns to add to the sorter records, + ** allocate extra memory cells and adjust the OpenEphemeral + ** instruction to account for the larger records. This is only + ** required if there are one or more WITHOUT ROWID tables with + ** composite primary keys in the SortCtx.aDefer[] array. */ + VdbeOp *pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); + pOp->p2 += (pExtra->nExpr - pSort->nDefer); + pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer); + pParse->nMem += pExtra->nExpr; + } +#endif + + /* Adjust nResultCol to account for columns that are omitted + ** from the sorter by the optimizations in this branch */ + pEList = p->pEList; + for(i=0; inExpr; i++){ + if( pEList->a[i].u.x.iOrderByCol>0 +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + || pEList->a[i].fg.bSorterRef +#endif + ){ + nResultCol--; + regOrig = 0; + } + } + + testcase( regOrig ); + testcase( eDest==SRT_Set ); + testcase( eDest==SRT_Mem ); + testcase( eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + assert( eDest==SRT_Set || eDest==SRT_Mem + || eDest==SRT_Coroutine || eDest==SRT_Output + || eDest==SRT_Upfrom ); + } + sRowLoadInfo.regResult = regResult; + sRowLoadInfo.ecelFlags = ecelFlags; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + sRowLoadInfo.pExtra = pExtra; + sRowLoadInfo.regExtraResult = regResult + nResultCol; + if( pExtra ) nResultCol += pExtra->nExpr; +#endif + if( p->iLimit + && (ecelFlags & SQLITE_ECEL_OMITREF)!=0 + && nPrefixReg>0 + ){ + assert( pSort!=0 ); + assert( hasDistinct==0 ); + pSort->pDeferredRowLoad = &sRowLoadInfo; + regOrig = 0; + }else{ + innerLoopLoadRow(pParse, p, &sRowLoadInfo); + } + } + + /* If the DISTINCT keyword was present on the SELECT statement + ** and this row has been seen before, then do not make this row + ** part of the result. + */ + if( hasDistinct ){ + int eType = pDistinct->eTnctType; + int iTab = pDistinct->tabTnct; + assert( nResultCol==p->pEList->nExpr ); + iTab = codeDistinct(pParse, eType, iTab, iContinue, p->pEList, regResult); + fixDistinctOpenEph(pParse, eType, iTab, pDistinct->addrTnct); + if( pSort==0 ){ + codeOffset(v, p->iOffset, iContinue); + } + } + + switch( eDest ){ + /* In this mode, write each query result to the key of the temporary + ** table iParm. + */ +#ifndef SQLITE_OMIT_COMPOUND_SELECT + case SRT_Union: { + int r1; + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + + /* Construct a record from the query result, but instead of + ** saving that record, use it as a key to delete elements from + ** the temporary table iParm. + */ + case SRT_Except: { + sqlite3VdbeAddOp3(v, OP_IdxDelete, iParm, regResult, nResultCol); + break; + } +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + + /* Store the result as data using a unique key. + */ + case SRT_Fifo: + case SRT_DistFifo: + case SRT_Table: + case SRT_EphemTab: { + int r1 = sqlite3GetTempRange(pParse, nPrefixReg+1); + testcase( eDest==SRT_Table ); + testcase( eDest==SRT_EphemTab ); + testcase( eDest==SRT_Fifo ); + testcase( eDest==SRT_DistFifo ); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg); +#ifndef SQLITE_OMIT_CTE + if( eDest==SRT_DistFifo ){ + /* If the destination is DistFifo, then cursor (iParm+1) is open + ** on an ephemeral index. If the current row is already present + ** in the index, do not write it to the output. If not, add the + ** current row to the index and proceed with writing it to the + ** output table as well. */ + int addr = sqlite3VdbeCurrentAddr(v) + 4; + sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); + VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm+1, r1,regResult,nResultCol); + assert( pSort==0 ); + } +#endif + if( pSort ){ + assert( regResult==regOrig ); + pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg); + }else{ + int r2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2); + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, r2); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3ReleaseTempReg(pParse, r2); + } + sqlite3ReleaseTempRange(pParse, r1, nPrefixReg+1); + break; + } + + case SRT_Upfrom: { + if( pSort ){ + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); + }else{ + int i2 = pDest->iSDParm2; + int r1 = sqlite3GetTempReg(pParse); + + /* If the UPDATE FROM join is an aggregate that matches no rows, it + ** might still be trying to return one row, because that is what + ** aggregates do. Don't record that empty row in the output table. */ + sqlite3VdbeAddOp2(v, OP_IsNull, regResult, iBreak); VdbeCoverage(v); + + sqlite3VdbeAddOp3(v, OP_MakeRecord, + regResult+(i2<0), nResultCol-(i2<0), r1); + if( i2<0 ){ + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); + }else{ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, i2); + } + } + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)" construct, + ** then there should be a single item on the stack. Write this + ** item into the set table with bogus data. + */ + case SRT_Set: { + if( pSort ){ + /* At first glance you would think we could optimize out the + ** ORDER BY in this case since the order of entries in the set + ** does not matter. But there might be a LIMIT clause, in which + ** case the order does matter */ + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); + }else{ + int r1 = sqlite3GetTempReg(pParse); + assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, + r1, pDest->zAffSdst, nResultCol); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); + sqlite3ReleaseTempReg(pParse, r1); + } + break; + } + + + /* If any row exist in the result set, record that fact and abort. + */ + case SRT_Exists: { + sqlite3VdbeAddOp2(v, OP_Integer, 1, iParm); + /* The LIMIT clause will terminate the loop for us */ + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell or array of + ** memory cells and break out of the scan loop. + */ + case SRT_Mem: { + if( pSort ){ + assert( nResultCol<=pDest->nSdst ); + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); + }else{ + assert( nResultCol==pDest->nSdst ); + assert( regResult==iParm ); + /* The LIMIT clause will jump out of the loop for us */ + } + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + case SRT_Coroutine: /* Send data to a co-routine */ + case SRT_Output: { /* Return the results */ + testcase( eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + if( pSort ){ + pushOntoSorter(pParse, pSort, p, regResult, regOrig, nResultCol, + nPrefixReg); + }else if( eDest==SRT_Coroutine ){ + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + }else{ + sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nResultCol); + } + break; + } + +#ifndef SQLITE_OMIT_CTE + /* Write the results into a priority queue that is order according to + ** pDest->pOrderBy (in pSO). pDest->iSDParm (in iParm) is the cursor for an + ** index with pSO->nExpr+2 columns. Build a key using pSO for the first + ** pSO->nExpr columns, then make sure all keys are unique by adding a + ** final OP_Sequence column. The last column is the record as a blob. + */ + case SRT_DistQueue: + case SRT_Queue: { + int nKey; + int r1, r2, r3; + int addrTest = 0; + ExprList *pSO; + pSO = pDest->pOrderBy; + assert( pSO ); + nKey = pSO->nExpr; + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempRange(pParse, nKey+2); + r3 = r2+nKey+1; + if( eDest==SRT_DistQueue ){ + /* If the destination is DistQueue, then cursor (iParm+1) is open + ** on a second ephemeral index that holds all values every previously + ** added to the queue. */ + addrTest = sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, 0, + regResult, nResultCol); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r3); + if( eDest==SRT_DistQueue ){ + sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r3); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + for(i=0; ia[i].u.x.iOrderByCol - 1, + r2+i); + } + sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2+nKey); + sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey+2, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, r2, nKey+2); + if( addrTest ) sqlite3VdbeJumpHere(v, addrTest); + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempRange(pParse, r2, nKey+2); + break; + } +#endif /* SQLITE_OMIT_CTE */ + + + +#if !defined(SQLITE_OMIT_TRIGGER) + /* Discard the results. This is used for SELECT statements inside + ** the body of a TRIGGER. The purpose of such selects is to call + ** user-defined functions that have side effects. We do not care + ** about the actual results of the select. + */ + default: { + assert( eDest==SRT_Discard ); + break; + } +#endif + } + + /* Jump to the end of the loop if the LIMIT is reached. Except, if + ** there is a sorter, in which case the sorter has already limited + ** the output for us. + */ + if( pSort==0 && p->iLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); + } +} + +/* +** Allocate a KeyInfo object sufficient for an index of N key columns and +** X extra columns. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ + int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*); + KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); + if( p ){ + p->aSortFlags = (u8*)&p->aColl[N+X]; + p->nKeyField = (u16)N; + p->nAllField = (u16)(N+X); + p->enc = ENC(db); + p->db = db; + p->nRef = 1; + memset(&p[1], 0, nExtra); + }else{ + return (KeyInfo*)sqlite3OomFault(db); + } + return p; +} + +/* +** Deallocate a KeyInfo object +*/ +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef--; + if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p); + } +} + +/* +** Make a new pointer to a KeyInfo object +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef++; + } + return p; +} + +#ifdef SQLITE_DEBUG +/* +** Return TRUE if a KeyInfo object can be change. The KeyInfo object +** can only be changed if this is just a single reference to the object. +** +** This routine is used only inside of assert() statements. +*/ +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; } +#endif /* SQLITE_DEBUG */ + +/* +** Given an expression list, generate a KeyInfo structure that records +** the collating sequence for each expression in that expression list. +** +** If the ExprList is an ORDER BY or GROUP BY clause then the resulting +** KeyInfo structure is appropriate for initializing a virtual index to +** implement that clause. If the ExprList is the result set of a SELECT +** then the KeyInfo structure is appropriate for initializing a virtual +** index to implement a DISTINCT test. +** +** Space to hold the KeyInfo structure is obtained from malloc. The calling +** function is responsible for seeing that this structure is eventually +** freed. +*/ +SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* Form the KeyInfo object from this ExprList */ + int iStart, /* Begin with this column of pList */ + int nExtra /* Add this many extra columns to the end */ +){ + int nExpr; + KeyInfo *pInfo; + struct ExprList_item *pItem; + sqlite3 *db = pParse->db; + int i; + + nExpr = pList->nExpr; + pInfo = sqlite3KeyInfoAlloc(db, nExpr-iStart, nExtra+1); + if( pInfo ){ + assert( sqlite3KeyInfoIsWriteable(pInfo) ); + for(i=iStart, pItem=pList->a+iStart; iaColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); + pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags; + } + } + return pInfo; +} + +/* +** Name of the connection operator, used for error messages. +*/ +SQLITE_PRIVATE const char *sqlite3SelectOpName(int id){ + char *z; + switch( id ){ + case TK_ALL: z = "UNION ALL"; break; + case TK_INTERSECT: z = "INTERSECT"; break; + case TK_EXCEPT: z = "EXCEPT"; break; + default: z = "UNION"; break; + } + return z; +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function +** is a no-op. Otherwise, it adds a single row of output to the EQP result, +** where the caption is of the form: +** +** "USE TEMP B-TREE FOR xxx" +** +** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which +** is determined by the zUsage argument. +*/ +static void explainTempTable(Parse *pParse, const char *zUsage){ + ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage)); +} + +/* +** Assign expression b to lvalue a. A second, no-op, version of this macro +** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code +** in sqlite3Select() to assign values to structure member variables that +** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the +** code with #ifndef directives. +*/ +# define explainSetInteger(a, b) a = b + +#else +/* No-op versions of the explainXXX() functions and macros. */ +# define explainTempTable(y,z) +# define explainSetInteger(y,z) +#endif + + +/* +** If the inner loop was generated using a non-null pOrderBy argument, +** then the results were placed in a sorter. After the loop is terminated +** we need to run the sorter and output the results. The following +** routine generates the code needed to do that. +*/ +static void generateSortTail( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + SortCtx *pSort, /* Information on the ORDER BY clause */ + int nColumn, /* Number of columns of data */ + SelectDest *pDest /* Write the sorted results here */ +){ + Vdbe *v = pParse->pVdbe; /* The prepared statement */ + int addrBreak = pSort->labelDone; /* Jump here to exit loop */ + int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */ + int addr; /* Top of output loop. Jump for Next. */ + int addrOnce = 0; + int iTab; + ExprList *pOrderBy = pSort->pOrderBy; + int eDest = pDest->eDest; + int iParm = pDest->iSDParm; + int regRow; + int regRowid; + int iCol; + int nKey; /* Number of key columns in sorter record */ + int iSortTab; /* Sorter cursor to read from */ + int i; + int bSeq; /* True if sorter record includes seq. no. */ + int nRefKey = 0; + struct ExprList_item *aOutEx = p->pEList->a; + + assert( addrBreak<0 ); + if( pSort->labelBkOut ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); + sqlite3VdbeGoto(v, addrBreak); + sqlite3VdbeResolveLabel(v, pSort->labelBkOut); + } + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + /* Open any cursors needed for sorter-reference expressions */ + for(i=0; inDefer; i++){ + Table *pTab = pSort->aDefer[i].pTab; + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3OpenTable(pParse, pSort->aDefer[i].iCsr, iDb, pTab, OP_OpenRead); + nRefKey = MAX(nRefKey, pSort->aDefer[i].nKey); + } +#endif + + iTab = pSort->iECursor; + if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){ + if( eDest==SRT_Mem && p->iOffset ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pDest->iSdst); + } + regRowid = 0; + regRow = pDest->iSdst; + }else{ + regRowid = sqlite3GetTempReg(pParse); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } + } + nKey = pOrderBy->nExpr - pSort->nOBSat; + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + int regSortOut = ++pParse->nMem; + iSortTab = pParse->nTab++; + if( pSort->labelBkOut ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, + nKey+1+nColumn+nRefKey); + if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); + addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); + VdbeCoverage(v); + codeOffset(v, p->iOffset, addrContinue); + sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); + bSeq = 0; + }else{ + addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); + codeOffset(v, p->iOffset, addrContinue); + iSortTab = iTab; + bSeq = 1; + } + for(i=0, iCol=nKey+bSeq-1; inDefer ){ + int iKey = iCol+1; + int regKey = sqlite3GetTempRange(pParse, nRefKey); + + for(i=0; inDefer; i++){ + int iCsr = pSort->aDefer[i].iCsr; + Table *pTab = pSort->aDefer[i].pTab; + int nKey = pSort->aDefer[i].nKey; + + sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, + sqlite3VdbeCurrentAddr(v)+1, regKey); + }else{ + int k; + int iJmp; + assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey ); + for(k=0; k=0; i--){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( aOutEx[i].fg.bSorterRef ){ + sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); + }else +#endif + { + int iRead; + if( aOutEx[i].u.x.iOrderByCol ){ + iRead = aOutEx[i].u.x.iOrderByCol-1; + }else{ + iRead = iCol--; + } + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); + VdbeComment((v, "%s", aOutEx[i].zEName)); + } + } + switch( eDest ){ + case SRT_Table: + case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); + sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case SRT_Set: { + assert( nColumn==sqlite3Strlen30(pDest->zAffSdst) ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid, + pDest->zAffSdst, nColumn); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn); + break; + } + case SRT_Mem: { + /* The LIMIT clause will terminate the loop for us */ + break; + } +#endif + case SRT_Upfrom: { + int i2 = pDest->iSDParm2; + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord,regRow+(i2<0),nColumn-(i2<0),r1); + if( i2<0 ){ + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regRow); + }else{ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regRow, i2); + } + break; + } + default: { + assert( eDest==SRT_Output || eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + testcase( eDest==SRT_Coroutine ); + if( eDest==SRT_Output ){ + sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iSdst, nColumn); + }else{ + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + } + break; + } + } + if( regRowid ){ + if( eDest==SRT_Set ){ + sqlite3ReleaseTempRange(pParse, regRow, nColumn); + }else{ + sqlite3ReleaseTempReg(pParse, regRow); + } + sqlite3ReleaseTempReg(pParse, regRowid); + } + /* The bottom of the loop + */ + sqlite3VdbeResolveLabel(v, addrContinue); + if( pSort->sortFlags & SORTFLAG_UseSorter ){ + sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr); VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); VdbeCoverage(v); + } + if( pSort->regReturn ) sqlite3VdbeAddOp1(v, OP_Return, pSort->regReturn); + sqlite3VdbeResolveLabel(v, addrBreak); +} + +/* +** Return a pointer to a string containing the 'declaration type' of the +** expression pExpr. The string may be treated as static by the caller. +** +** Also try to estimate the size of the returned value and return that +** result in *pEstWidth. +** +** The declaration type is the exact datatype definition extracted from the +** original CREATE TABLE statement if the expression is a column. The +** declaration type for a ROWID field is INTEGER. Exactly when an expression +** is considered a column can be complex in the presence of subqueries. The +** result-set expression in all of the following SELECT statements is +** considered a column by this function. +** +** SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl; +** SELECT (SELECT col FROM tbl); +** SELECT abc FROM (SELECT col AS abc FROM tbl); +** +** The declaration type for any expression other than a column is NULL. +** +** This routine has either 3 or 6 parameters depending on whether or not +** the SQLITE_ENABLE_COLUMN_METADATA compile-time option is used. +*/ +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define columnType(A,B,C,D,E) columnTypeImpl(A,B,C,D,E) +#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ +# define columnType(A,B,C,D,E) columnTypeImpl(A,B) +#endif +static const char *columnTypeImpl( + NameContext *pNC, +#ifndef SQLITE_ENABLE_COLUMN_METADATA + Expr *pExpr +#else + Expr *pExpr, + const char **pzOrigDb, + const char **pzOrigTab, + const char **pzOrigCol +#endif +){ + char const *zType = 0; + int j; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + char const *zOrigDb = 0; + char const *zOrigTab = 0; + char const *zOrigCol = 0; +#endif + + assert( pExpr!=0 ); + assert( pNC->pSrcList!=0 ); + switch( pExpr->op ){ + case TK_COLUMN: { + /* The expression is a column. Locate the table the column is being + ** extracted from in NameContext.pSrcList. This table may be real + ** database table or a subquery. + */ + Table *pTab = 0; /* Table structure column is extracted from */ + Select *pS = 0; /* Select the column is extracted from */ + int iCol = pExpr->iColumn; /* Index of column in pTab */ + while( pNC && !pTab ){ + SrcList *pTabList = pNC->pSrcList; + for(j=0;jnSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); + if( jnSrc ){ + pTab = pTabList->a[j].pTab; + pS = pTabList->a[j].pSelect; + }else{ + pNC = pNC->pNext; + } + } + + if( pTab==0 ){ + /* At one time, code such as "SELECT new.x" within a trigger would + ** cause this condition to run. Since then, we have restructured how + ** trigger code is generated and so this condition is no longer + ** possible. However, it can still be true for statements like + ** the following: + ** + ** CREATE TABLE t1(col INTEGER); + ** SELECT (SELECT t1.col) FROM FROM t1; + ** + ** when columnType() is called on the expression "t1.col" in the + ** sub-select. In this case, set the column type to NULL, even + ** though it should really be "INTEGER". + ** + ** This is not a problem, as the column type of "t1.col" is never + ** used. When columnType() is called on the expression + ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT + ** branch below. */ + break; + } + + assert( pTab && ExprUseYTab(pExpr) && pExpr->y.pTab==pTab ); + if( pS ){ + /* The "table" is actually a sub-select or a view in the FROM clause + ** of the SELECT statement. Return the declaration type and origin + ** data for the result-set column of the sub-select. + */ + if( iColpEList->nExpr +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + && iCol>=0 +#else + && ALWAYS(iCol>=0) +#endif + ){ + /* If iCol is less than zero, then the expression requests the + ** rowid of the sub-select or view. This expression is legal (see + ** test case misc2.2.2) - it always evaluates to NULL. + */ + NameContext sNC; + Expr *p = pS->pEList->a[iCol].pExpr; + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol); + } + }else{ + /* A real table or a CTE table */ + assert( !pS ); +#ifdef SQLITE_ENABLE_COLUMN_METADATA + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==XN_ROWID || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zType = "INTEGER"; + zOrigCol = "rowid"; + }else{ + zOrigCol = pTab->aCol[iCol].zCnName; + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + } + zOrigTab = pTab->zName; + if( pNC->pParse && pTab->pSchema ){ + int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); + zOrigDb = pNC->pParse->db->aDb[iDb].zDbSName; + } +#else + assert( iCol==XN_ROWID || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zType = "INTEGER"; + }else{ + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + } +#endif + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_SELECT: { + /* The expression is a sub-select. Return the declaration type and + ** origin info for the single column in the result set of the SELECT + ** statement. + */ + NameContext sNC; + Select *pS; + Expr *p; + assert( ExprUseXSelect(pExpr) ); + pS = pExpr->x.pSelect; + p = pS->pEList->a[0].pExpr; + sNC.pSrcList = pS->pSrc; + sNC.pNext = pNC; + sNC.pParse = pNC->pParse; + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); + break; + } +#endif + } + +#ifdef SQLITE_ENABLE_COLUMN_METADATA + if( pzOrigDb ){ + assert( pzOrigTab && pzOrigCol ); + *pzOrigDb = zOrigDb; + *pzOrigTab = zOrigTab; + *pzOrigCol = zOrigCol; + } +#endif + return zType; +} + +/* +** Generate code that will tell the VDBE the declaration types of columns +** in the result set. +*/ +static void generateColumnTypes( + Parse *pParse, /* Parser context */ + SrcList *pTabList, /* List of tables */ + ExprList *pEList /* Expressions defining the result set */ +){ +#ifndef SQLITE_OMIT_DECLTYPE + Vdbe *v = pParse->pVdbe; + int i; + NameContext sNC; + sNC.pSrcList = pTabList; + sNC.pParse = pParse; + sNC.pNext = 0; + for(i=0; inExpr; i++){ + Expr *p = pEList->a[i].pExpr; + const char *zType; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + const char *zOrigDb = 0; + const char *zOrigTab = 0; + const char *zOrigCol = 0; + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); + + /* The vdbe must make its own copy of the column-type and other + ** column specific strings, in case the schema is reset before this + ** virtual machine is deleted. + */ + sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT); + sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT); +#else + zType = columnType(&sNC, p, 0, 0, 0); +#endif + sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT); + } +#endif /* !defined(SQLITE_OMIT_DECLTYPE) */ +} + + +/* +** Compute the column names for a SELECT statement. +** +** The only guarantee that SQLite makes about column names is that if the +** column has an AS clause assigning it a name, that will be the name used. +** That is the only documented guarantee. However, countless applications +** developed over the years have made baseless assumptions about column names +** and will break if those assumptions changes. Hence, use extreme caution +** when modifying this routine to avoid breaking legacy. +** +** See Also: sqlite3ColumnsFromExprList() +** +** The PRAGMA short_column_names and PRAGMA full_column_names settings are +** deprecated. The default setting is short=ON, full=OFF. 99.9% of all +** applications should operate this way. Nevertheless, we need to support the +** other modes for legacy: +** +** short=OFF, full=OFF: Column name is the text of the expression has it +** originally appears in the SELECT statement. In +** other words, the zSpan of the result expression. +** +** short=ON, full=OFF: (This is the default setting). If the result +** refers directly to a table column, then the +** result column name is just the table column +** name: COLUMN. Otherwise use zSpan. +** +** full=ON, short=ANY: If the result refers directly to a table column, +** then the result column name with the table name +** prefix, ex: TABLE.COLUMN. Otherwise use zSpan. +*/ +SQLITE_PRIVATE void sqlite3GenerateColumnNames( + Parse *pParse, /* Parser context */ + Select *pSelect /* Generate column names for this SELECT statement */ +){ + Vdbe *v = pParse->pVdbe; + int i; + Table *pTab; + SrcList *pTabList; + ExprList *pEList; + sqlite3 *db = pParse->db; + int fullName; /* TABLE.COLUMN if no AS clause and is a direct table ref */ + int srcName; /* COLUMN or TABLE.COLUMN if no AS clause and is direct */ + +#ifndef SQLITE_OMIT_EXPLAIN + /* If this is an EXPLAIN, skip this step */ + if( pParse->explain ){ + return; + } +#endif + + if( pParse->colNamesSet ) return; + /* Column names are determined by the left-most term of a compound select */ + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + SELECTTRACE(1,pParse,pSelect,("generating column names\n")); + pTabList = pSelect->pSrc; + pEList = pSelect->pEList; + assert( v!=0 ); + assert( pTabList!=0 ); + pParse->colNamesSet = 1; + fullName = (db->flags & SQLITE_FullColNames)!=0; + srcName = (db->flags & SQLITE_ShortColNames)!=0 || fullName; + sqlite3VdbeSetNumCols(v, pEList->nExpr); + for(i=0; inExpr; i++){ + Expr *p = pEList->a[i].pExpr; + + assert( p!=0 ); + assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ + assert( p->op!=TK_COLUMN + || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */ + if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){ + /* An AS clause always takes first priority */ + char *zName = pEList->a[i].zEName; + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); + }else if( srcName && p->op==TK_COLUMN ){ + char *zCol; + int iCol = p->iColumn; + pTab = p->y.pTab; + assert( pTab!=0 ); + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==-1 || (iCol>=0 && iColnCol) ); + if( iCol<0 ){ + zCol = "rowid"; + }else{ + zCol = pTab->aCol[iCol].zCnName; + } + if( fullName ){ + char *zName = 0; + zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC); + }else{ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); + } + }else{ + const char *z = pEList->a[i].zEName; + z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z); + sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC); + } + } + generateColumnTypes(pParse, pTabList, pEList); +} + +/* +** Given an expression list (which is really the list of expressions +** that form the result set of a SELECT statement) compute appropriate +** column names for a table that would hold the expression list. +** +** All column names will be unique. +** +** Only the column names are computed. Column.zType, Column.zColl, +** and other fields of Column are zeroed. +** +** Return SQLITE_OK on success. If a memory allocation error occurs, +** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM. +** +** The only guarantee that SQLite makes about column names is that if the +** column has an AS clause assigning it a name, that will be the name used. +** That is the only documented guarantee. However, countless applications +** developed over the years have made baseless assumptions about column names +** and will break if those assumptions changes. Hence, use extreme caution +** when modifying this routine to avoid breaking legacy. +** +** See Also: sqlite3GenerateColumnNames() +*/ +SQLITE_PRIVATE int sqlite3ColumnsFromExprList( + Parse *pParse, /* Parsing context */ + ExprList *pEList, /* Expr list from which to derive column names */ + i16 *pnCol, /* Write the number of columns here */ + Column **paCol /* Write the new column list here */ +){ + sqlite3 *db = pParse->db; /* Database connection */ + int i, j; /* Loop counters */ + u32 cnt; /* Index added to make the name unique */ + Column *aCol, *pCol; /* For looping over result columns */ + int nCol; /* Number of columns in the result set */ + char *zName; /* Column name */ + int nName; /* Size of name in zName[] */ + Hash ht; /* Hash table of column names */ + Table *pTab; + + sqlite3HashInit(&ht); + if( pEList ){ + nCol = pEList->nExpr; + aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol); + testcase( aCol==0 ); + if( NEVER(nCol>32767) ) nCol = 32767; + }else{ + nCol = 0; + aCol = 0; + } + assert( nCol==(i16)nCol ); + *pnCol = nCol; + *paCol = aCol; + + for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ + struct ExprList_item *pX = &pEList->a[i]; + struct ExprList_item *pCollide; + /* Get an appropriate name for the column + */ + if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){ + /* If the column contains an "AS " phrase, use as the name */ + }else{ + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr); + while( ALWAYS(pColExpr!=0) && pColExpr->op==TK_DOT ){ + pColExpr = pColExpr->pRight; + assert( pColExpr!=0 ); + } + if( pColExpr->op==TK_COLUMN + && ALWAYS( ExprUseYTab(pColExpr) ) + && ALWAYS( pColExpr->y.pTab!=0 ) + ){ + /* For columns use the column name name */ + int iCol = pColExpr->iColumn; + pTab = pColExpr->y.pTab; + if( iCol<0 ) iCol = pTab->iPKey; + zName = iCol>=0 ? pTab->aCol[iCol].zCnName : "rowid"; + }else if( pColExpr->op==TK_ID ){ + assert( !ExprHasProperty(pColExpr, EP_IntValue) ); + zName = pColExpr->u.zToken; + }else{ + /* Use the original text of the column expression as its name */ + assert( zName==pX->zEName ); /* pointer comparison intended */ + } + } + if( zName && !sqlite3IsTrueOrFalse(zName) ){ + zName = sqlite3DbStrDup(db, zName); + }else{ + zName = sqlite3MPrintf(db,"column%d",i+1); + } + + /* Make sure the column name is unique. If the name is not unique, + ** append an integer to the name so that it becomes unique. + */ + cnt = 0; + while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){ + if( pCollide->fg.bUsingTerm ){ + pCol->colFlags |= COLFLAG_NOEXPAND; + } + nName = sqlite3Strlen30(zName); + if( nName>0 ){ + for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} + if( zName[j]==':' ) nName = j; + } + zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); + if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); + } + pCol->zCnName = zName; + pCol->hName = sqlite3StrIHash(zName); + if( pX->fg.bNoExpand ){ + pCol->colFlags |= COLFLAG_NOEXPAND; + } + sqlite3ColumnPropertiesFromName(0, pCol); + if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){ + sqlite3OomFault(db); + } + } + sqlite3HashClear(&ht); + if( db->mallocFailed ){ + for(j=0; jdb; + NameContext sNC; + Column *pCol; + CollSeq *pColl; + int i; + Expr *p; + struct ExprList_item *a; + + assert( pSelect!=0 ); + assert( (pSelect->selFlags & SF_Resolved)!=0 ); + assert( pTab->nCol==pSelect->pEList->nExpr || db->mallocFailed ); + if( db->mallocFailed ) return; + memset(&sNC, 0, sizeof(sNC)); + sNC.pSrcList = pSelect->pSrc; + a = pSelect->pEList->a; + for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ + const char *zType; + i64 n, m; + pTab->tabFlags |= (pCol->colFlags & COLFLAG_NOINSERT); + p = a[i].pExpr; + zType = columnType(&sNC, p, 0, 0, 0); + /* pCol->szEst = ... // Column size est for SELECT tables never used */ + pCol->affinity = sqlite3ExprAffinity(p); + if( zType ){ + m = sqlite3Strlen30(zType); + n = sqlite3Strlen30(pCol->zCnName); + pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+m+2); + if( pCol->zCnName ){ + memcpy(&pCol->zCnName[n+1], zType, m+1); + pCol->colFlags |= COLFLAG_HASTYPE; + }else{ + testcase( pCol->colFlags & COLFLAG_HASTYPE ); + pCol->colFlags &= ~(COLFLAG_HASTYPE|COLFLAG_HASCOLL); + } + } + if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; + pColl = sqlite3ExprCollSeq(pParse, p); + if( pColl ){ + assert( pTab->pIndex==0 ); + sqlite3ColumnSetColl(db, pCol, pColl->zName); + } + } + pTab->szTabRow = 1; /* Any non-zero value works */ +} + +/* +** Given a SELECT statement, generate a Table structure that describes +** the result set of that SELECT. +*/ +SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, char aff){ + Table *pTab; + sqlite3 *db = pParse->db; + u64 savedFlags; + + savedFlags = db->flags; + db->flags &= ~(u64)SQLITE_FullColNames; + db->flags |= SQLITE_ShortColNames; + sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; + if( pParse->nErr ) return 0; + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + pTab = sqlite3DbMallocZero(db, sizeof(Table) ); + if( pTab==0 ){ + return 0; + } + pTab->nTabRef = 1; + pTab->zName = 0; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect, aff); + pTab->iPKey = -1; + if( db->mallocFailed ){ + sqlite3DeleteTable(db, pTab); + return 0; + } + return pTab; +} + +/* +** Get a VDBE for the given parser context. Create a new one if necessary. +** If an error occurs, return NULL and leave a message in pParse. +*/ +SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ + if( pParse->pVdbe ){ + return pParse->pVdbe; + } + if( pParse->pToplevel==0 + && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) + ){ + pParse->okConstFactor = 1; + } + return sqlite3VdbeCreate(pParse); +} + + +/* +** Compute the iLimit and iOffset fields of the SELECT based on the +** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions +** that appear in the original SQL statement after the LIMIT and OFFSET +** keywords. Or NULL if those keywords are omitted. iLimit and iOffset +** are the integer memory register numbers for counters used to compute +** the limit and offset. If there is no limit and/or offset, then +** iLimit and iOffset are negative. +** +** This routine changes the values of iLimit and iOffset only if +** a limit or offset is defined by pLimit->pLeft and pLimit->pRight. iLimit +** and iOffset should have been preset to appropriate default values (zero) +** prior to calling this routine. +** +** The iOffset register (if it exists) is initialized to the value +** of the OFFSET. The iLimit register is initialized to LIMIT. Register +** iOffset+1 is initialized to LIMIT+OFFSET. +** +** Only if pLimit->pLeft!=0 do the limit registers get +** redefined. The UNION ALL operator uses this property to force +** the reuse of the same limit and offset registers across multiple +** SELECT statements. +*/ +static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ + Vdbe *v = 0; + int iLimit = 0; + int iOffset; + int n; + Expr *pLimit = p->pLimit; + + if( p->iLimit ) return; + + /* + ** "LIMIT -1" always shows all rows. There is some + ** controversy about what the correct behavior should be. + ** The current implementation interprets "LIMIT 0" to mean + ** no rows. + */ + if( pLimit ){ + assert( pLimit->op==TK_LIMIT ); + assert( pLimit->pLeft!=0 ); + p->iLimit = iLimit = ++pParse->nMem; + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); + if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){ + sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); + VdbeComment((v, "LIMIT counter")); + if( n==0 ){ + sqlite3VdbeGoto(v, iBreak); + }else if( n>=0 && p->nSelectRow>sqlite3LogEst((u64)n) ){ + p->nSelectRow = sqlite3LogEst((u64)n); + p->selFlags |= SF_FixedLimit; + } + }else{ + sqlite3ExprCode(pParse, pLimit->pLeft, iLimit); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); + VdbeComment((v, "LIMIT counter")); + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v); + } + if( pLimit->pRight ){ + p->iOffset = iOffset = ++pParse->nMem; + pParse->nMem++; /* Allocate an extra register for limit+offset */ + sqlite3ExprCode(pParse, pLimit->pRight, iOffset); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); + VdbeComment((v, "OFFSET counter")); + sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset); + VdbeComment((v, "LIMIT+OFFSET")); + } + } +} + +#ifndef SQLITE_OMIT_COMPOUND_SELECT +/* +** Return the appropriate collating sequence for the iCol-th column of +** the result set for the compound-select statement "p". Return NULL if +** the column has no default collating sequence. +** +** The collating sequence for the compound select is taken from the +** left-most term of the select that has a collating sequence. +*/ +static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ + CollSeq *pRet; + if( p->pPrior ){ + pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); + }else{ + pRet = 0; + } + assert( iCol>=0 ); + /* iCol must be less than p->pEList->nExpr. Otherwise an error would + ** have been thrown during name resolution and we would not have gotten + ** this far */ + if( pRet==0 && ALWAYS(iColpEList->nExpr) ){ + pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); + } + return pRet; +} + +/* +** The select statement passed as the second parameter is a compound SELECT +** with an ORDER BY clause. This function allocates and returns a KeyInfo +** structure suitable for implementing the ORDER BY. +** +** Space to hold the KeyInfo structure is obtained from malloc. The calling +** function is responsible for ensuring that this structure is eventually +** freed. +*/ +static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ + ExprList *pOrderBy = p->pOrderBy; + int nOrderBy = ALWAYS(pOrderBy!=0) ? pOrderBy->nExpr : 0; + sqlite3 *db = pParse->db; + KeyInfo *pRet = sqlite3KeyInfoAlloc(db, nOrderBy+nExtra, 1); + if( pRet ){ + int i; + for(i=0; ia[i]; + Expr *pTerm = pItem->pExpr; + CollSeq *pColl; + + if( pTerm->flags & EP_Collate ){ + pColl = sqlite3ExprCollSeq(pParse, pTerm); + }else{ + pColl = multiSelectCollSeq(pParse, p, pItem->u.x.iOrderByCol-1); + if( pColl==0 ) pColl = db->pDfltColl; + pOrderBy->a[i].pExpr = + sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName); + } + assert( sqlite3KeyInfoIsWriteable(pRet) ); + pRet->aColl[i] = pColl; + pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags; + } + } + + return pRet; +} + +#ifndef SQLITE_OMIT_CTE +/* +** This routine generates VDBE code to compute the content of a WITH RECURSIVE +** query of the form: +** +** AS ( UNION [ALL] ) +** \___________/ \_______________/ +** p->pPrior p +** +** +** There is exactly one reference to the recursive-table in the FROM clause +** of recursive-query, marked with the SrcList->a[].fg.isRecursive flag. +** +** The setup-query runs once to generate an initial set of rows that go +** into a Queue table. Rows are extracted from the Queue table one by +** one. Each row extracted from Queue is output to pDest. Then the single +** extracted row (now in the iCurrent table) becomes the content of the +** recursive-table for a recursive-query run. The output of the recursive-query +** is added back into the Queue table. Then another row is extracted from Queue +** and the iteration continues until the Queue table is empty. +** +** If the compound query operator is UNION then no duplicate rows are ever +** inserted into the Queue table. The iDistinct table keeps a copy of all rows +** that have ever been inserted into Queue and causes duplicates to be +** discarded. If the operator is UNION ALL, then duplicates are allowed. +** +** If the query has an ORDER BY, then entries in the Queue table are kept in +** ORDER BY order and the first entry is extracted for each cycle. Without +** an ORDER BY, the Queue table is just a FIFO. +** +** If a LIMIT clause is provided, then the iteration stops after LIMIT rows +** have been output to pDest. A LIMIT of zero means to output no rows and a +** negative LIMIT means to output all rows. If there is also an OFFSET clause +** with a positive value, then the first OFFSET outputs are discarded rather +** than being sent to pDest. The LIMIT count does not begin until after OFFSET +** rows have been skipped. +*/ +static void generateWithRecursiveQuery( + Parse *pParse, /* Parsing context */ + Select *p, /* The recursive SELECT to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */ + int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */ + Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ + Select *pSetup; /* The setup query */ + Select *pFirstRec; /* Left-most recursive term */ + int addrTop; /* Top of the loop */ + int addrCont, addrBreak; /* CONTINUE and BREAK addresses */ + int iCurrent = 0; /* The Current table */ + int regCurrent; /* Register holding Current table */ + int iQueue; /* The Queue table */ + int iDistinct = 0; /* To ensure unique results if UNION */ + int eDest = SRT_Fifo; /* How to write to Queue */ + SelectDest destQueue; /* SelectDest targetting the Queue table */ + int i; /* Loop counter */ + int rc; /* Result code */ + ExprList *pOrderBy; /* The ORDER BY clause */ + Expr *pLimit; /* Saved LIMIT and OFFSET */ + int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ){ + sqlite3ErrorMsg(pParse, "cannot use window functions in recursive queries"); + return; + } +#endif + + /* Obtain authorization to do a recursive query */ + if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; + + /* Process the LIMIT and OFFSET clauses, if they exist */ + addrBreak = sqlite3VdbeMakeLabel(pParse); + p->nSelectRow = 320; /* 4 billion rows */ + computeLimitRegisters(pParse, p, addrBreak); + pLimit = p->pLimit; + regLimit = p->iLimit; + regOffset = p->iOffset; + p->pLimit = 0; + p->iLimit = p->iOffset = 0; + pOrderBy = p->pOrderBy; + + /* Locate the cursor number of the Current table */ + for(i=0; ALWAYS(inSrc); i++){ + if( pSrc->a[i].fg.isRecursive ){ + iCurrent = pSrc->a[i].iCursor; + break; + } + } + + /* Allocate cursors numbers for Queue and Distinct. The cursor number for + ** the Distinct table must be exactly one greater than Queue in order + ** for the SRT_DistFifo and SRT_DistQueue destinations to work. */ + iQueue = pParse->nTab++; + if( p->op==TK_UNION ){ + eDest = pOrderBy ? SRT_DistQueue : SRT_DistFifo; + iDistinct = pParse->nTab++; + }else{ + eDest = pOrderBy ? SRT_Queue : SRT_Fifo; + } + sqlite3SelectDestInit(&destQueue, eDest, iQueue); + + /* Allocate cursors for Current, Queue, and Distinct. */ + regCurrent = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iCurrent, regCurrent, nCol); + if( pOrderBy ){ + KeyInfo *pKeyInfo = multiSelectOrderByKeyInfo(pParse, p, 1); + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, iQueue, pOrderBy->nExpr+2, 0, + (char*)pKeyInfo, P4_KEYINFO); + destQueue.pOrderBy = pOrderBy; + }else{ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iQueue, nCol); + } + VdbeComment((v, "Queue table")); + if( iDistinct ){ + p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iDistinct, 0); + p->selFlags |= SF_UsesEphemeral; + } + + /* Detach the ORDER BY clause from the compound SELECT */ + p->pOrderBy = 0; + + /* Figure out how many elements of the compound SELECT are part of the + ** recursive query. Make sure no recursive elements use aggregate + ** functions. Mark the recursive elements as UNION ALL even if they + ** are really UNION because the distinctness will be enforced by the + ** iDistinct table. pFirstRec is left pointing to the left-most + ** recursive term of the CTE. + */ + for(pFirstRec=p; ALWAYS(pFirstRec!=0); pFirstRec=pFirstRec->pPrior){ + if( pFirstRec->selFlags & SF_Aggregate ){ + sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported"); + goto end_of_recursive_query; + } + pFirstRec->op = TK_ALL; + if( (pFirstRec->pPrior->selFlags & SF_Recursive)==0 ) break; + } + + /* Store the results of the setup-query in Queue. */ + pSetup = pFirstRec->pPrior; + pSetup->pNext = 0; + ExplainQueryPlan((pParse, 1, "SETUP")); + rc = sqlite3Select(pParse, pSetup, &destQueue); + pSetup->pNext = p; + if( rc ) goto end_of_recursive_query; + + /* Find the next row in the Queue and output that row */ + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iQueue, addrBreak); VdbeCoverage(v); + + /* Transfer the next row in Queue over to Current */ + sqlite3VdbeAddOp1(v, OP_NullRow, iCurrent); /* To reset column cache */ + if( pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Column, iQueue, pOrderBy->nExpr+1, regCurrent); + }else{ + sqlite3VdbeAddOp2(v, OP_RowData, iQueue, regCurrent); + } + sqlite3VdbeAddOp1(v, OP_Delete, iQueue); + + /* Output the single row in Current */ + addrCont = sqlite3VdbeMakeLabel(pParse); + codeOffset(v, regOffset, addrCont); + selectInnerLoop(pParse, p, iCurrent, + 0, 0, pDest, addrCont, addrBreak); + if( regLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak); + VdbeCoverage(v); + } + sqlite3VdbeResolveLabel(v, addrCont); + + /* Execute the recursive SELECT taking the single row in Current as + ** the value for the recursive-table. Store the results in the Queue. + */ + pFirstRec->pPrior = 0; + ExplainQueryPlan((pParse, 1, "RECURSIVE STEP")); + sqlite3Select(pParse, p, &destQueue); + assert( pFirstRec->pPrior==0 ); + pFirstRec->pPrior = pSetup; + + /* Keep running the loop until the Queue is empty */ + sqlite3VdbeGoto(v, addrTop); + sqlite3VdbeResolveLabel(v, addrBreak); + +end_of_recursive_query: + sqlite3ExprListDelete(pParse->db, p->pOrderBy); + p->pOrderBy = pOrderBy; + p->pLimit = pLimit; + return; +} +#endif /* SQLITE_OMIT_CTE */ + +/* Forward references */ +static int multiSelectOrderBy( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +); + +/* +** Handle the special case of a compound-select that originates from a +** VALUES clause. By handling this as a special case, we avoid deep +** recursion, and thus do not need to enforce the SQLITE_LIMIT_COMPOUND_SELECT +** on a VALUES clause. +** +** Because the Select object originates from a VALUES clause: +** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1 +** (2) All terms are UNION ALL +** (3) There is no ORDER BY clause +** +** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES +** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))"). +** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case. +** Since the limit is exactly 1, we only need to evaluate the left-most VALUES. +*/ +static int multiSelectValues( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int nRow = 1; + int rc = 0; + int bShowAll = p->pLimit==0; + assert( p->selFlags & SF_MultiValue ); + do{ + assert( p->selFlags & SF_Values ); + assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) ); + assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ) return -1; +#endif + if( p->pPrior==0 ) break; + assert( p->pPrior->pNext==p ); + p = p->pPrior; + nRow += bShowAll; + }while(1); + ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow, + nRow==1 ? "" : "S")); + while( p ){ + selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1); + if( !bShowAll ) break; + p->nSelectRow = nRow; + p = p->pNext; + } + return rc; +} + +/* +** Return true if the SELECT statement which is known to be the recursive +** part of a recursive CTE still has its anchor terms attached. If the +** anchor terms have already been removed, then return false. +*/ +static int hasAnchor(Select *p){ + while( p && (p->selFlags & SF_Recursive)!=0 ){ p = p->pPrior; } + return p!=0; +} + +/* +** This routine is called to process a compound query form from +** two or more separate queries using UNION, UNION ALL, EXCEPT, or +** INTERSECT +** +** "p" points to the right-most of the two queries. the query on the +** left is p->pPrior. The left query could also be a compound query +** in which case this routine will be called recursively. +** +** The results of the total query are to be written into a destination +** of type eDest with parameter iParm. +** +** Example 1: Consider a three-way compound SQL statement. +** +** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3 +** +** This statement is parsed up as follows: +** +** SELECT c FROM t3 +** | +** `-----> SELECT b FROM t2 +** | +** `------> SELECT a FROM t1 +** +** The arrows in the diagram above represent the Select.pPrior pointer. +** So if this routine is called with p equal to the t3 query, then +** pPrior will be the t2 query. p->op will be TK_UNION in this case. +** +** Notice that because of the way SQLite parses compound SELECTs, the +** individual selects always group from left to right. +*/ +static int multiSelect( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int rc = SQLITE_OK; /* Success code from a subroutine */ + Select *pPrior; /* Another SELECT immediately to our left */ + Vdbe *v; /* Generate code to this VDBE */ + SelectDest dest; /* Alternative data destination */ + Select *pDelete = 0; /* Chain of simple selects to delete */ + sqlite3 *db; /* Database connection */ + + /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only + ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. + */ + assert( p && p->pPrior ); /* Calling function guarantees this much */ + assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); + assert( p->selFlags & SF_Compound ); + db = pParse->db; + pPrior = p->pPrior; + dest = *pDest; + assert( pPrior->pOrderBy==0 ); + assert( pPrior->pLimit==0 ); + + v = sqlite3GetVdbe(pParse); + assert( v!=0 ); /* The VDBE already created by calling function */ + + /* Create the destination temporary table if necessary + */ + if( dest.eDest==SRT_EphemTab ){ + assert( p->pEList ); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iSDParm, p->pEList->nExpr); + dest.eDest = SRT_Table; + } + + /* Special handling for a compound-select that originates as a VALUES clause. + */ + if( p->selFlags & SF_MultiValue ){ + rc = multiSelectValues(pParse, p, &dest); + if( rc>=0 ) goto multi_select_end; + rc = SQLITE_OK; + } + + /* Make sure all SELECTs in the statement have the same number of elements + ** in their result sets. + */ + assert( p->pEList && pPrior->pEList ); + assert( p->pEList->nExpr==pPrior->pEList->nExpr ); + +#ifndef SQLITE_OMIT_CTE + if( (p->selFlags & SF_Recursive)!=0 && hasAnchor(p) ){ + generateWithRecursiveQuery(pParse, p, &dest); + }else +#endif + + /* Compound SELECTs that have an ORDER BY clause are handled separately. + */ + if( p->pOrderBy ){ + return multiSelectOrderBy(pParse, p, pDest); + }else{ + +#ifndef SQLITE_OMIT_EXPLAIN + if( pPrior->pPrior==0 ){ + ExplainQueryPlan((pParse, 1, "COMPOUND QUERY")); + ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY")); + } +#endif + + /* Generate code for the left and right SELECT statements. + */ + switch( p->op ){ + case TK_ALL: { + int addr = 0; + int nLimit = 0; /* Initialize to suppress harmless compiler warning */ + assert( !pPrior->pLimit ); + pPrior->iLimit = p->iLimit; + pPrior->iOffset = p->iOffset; + pPrior->pLimit = p->pLimit; + SELECTTRACE(1, pParse, p, ("multiSelect UNION ALL left...\n")); + rc = sqlite3Select(pParse, pPrior, &dest); + pPrior->pLimit = 0; + if( rc ){ + goto multi_select_end; + } + p->pPrior = 0; + p->iLimit = pPrior->iLimit; + p->iOffset = pPrior->iOffset; + if( p->iLimit ){ + addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v); + VdbeComment((v, "Jump ahead if LIMIT reached")); + if( p->iOffset ){ + sqlite3VdbeAddOp3(v, OP_OffsetLimit, + p->iLimit, p->iOffset+1, p->iOffset); + } + } + ExplainQueryPlan((pParse, 1, "UNION ALL")); + SELECTTRACE(1, pParse, p, ("multiSelect UNION ALL right...\n")); + rc = sqlite3Select(pParse, p, &dest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + if( p->pLimit + && sqlite3ExprIsInteger(p->pLimit->pLeft, &nLimit) + && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) + ){ + p->nSelectRow = sqlite3LogEst((u64)nLimit); + } + if( addr ){ + sqlite3VdbeJumpHere(v, addr); + } + break; + } + case TK_EXCEPT: + case TK_UNION: { + int unionTab; /* Cursor number of the temp table holding result */ + u8 op = 0; /* One of the SRT_ operations to apply to self */ + int priorOp; /* The SRT_ operation to apply to prior selects */ + Expr *pLimit; /* Saved values of p->nLimit */ + int addr; + SelectDest uniondest; + + testcase( p->op==TK_EXCEPT ); + testcase( p->op==TK_UNION ); + priorOp = SRT_Union; + if( dest.eDest==priorOp ){ + /* We can reuse a temporary table generated by a SELECT to our + ** right. + */ + assert( p->pLimit==0 ); /* Not allowed on leftward elements */ + unionTab = dest.iSDParm; + }else{ + /* We will need to create our own temporary table to hold the + ** intermediate results. + */ + unionTab = pParse->nTab++; + assert( p->pOrderBy==0 ); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + } + + + /* Code the SELECT statements to our left + */ + assert( !pPrior->pOrderBy ); + sqlite3SelectDestInit(&uniondest, priorOp, unionTab); + SELECTTRACE(1, pParse, p, ("multiSelect EXCEPT/UNION left...\n")); + rc = sqlite3Select(pParse, pPrior, &uniondest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT statement + */ + if( p->op==TK_EXCEPT ){ + op = SRT_Except; + }else{ + assert( p->op==TK_UNION ); + op = SRT_Union; + } + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + uniondest.eDest = op; + ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", + sqlite3SelectOpName(p->op))); + SELECTTRACE(1, pParse, p, ("multiSelect EXCEPT/UNION right...\n")); + rc = sqlite3Select(pParse, p, &uniondest); + testcase( rc!=SQLITE_OK ); + assert( p->pOrderBy==0 ); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->pOrderBy = 0; + if( p->op==TK_UNION ){ + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + p->iLimit = 0; + p->iOffset = 0; + + /* Convert the data in the temporary table into whatever form + ** it is that we currently need. + */ + assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); + assert( p->pEList || db->mallocFailed ); + if( dest.eDest!=priorOp && db->mallocFailed==0 ){ + int iCont, iBreak, iStart; + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); + iStart = sqlite3VdbeCurrentAddr(v); + selectInnerLoop(pParse, p, unionTab, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); + } + break; + } + default: assert( p->op==TK_INTERSECT ); { + int tab1, tab2; + int iCont, iBreak, iStart; + Expr *pLimit; + int addr; + SelectDest intersectdest; + int r1; + + /* INTERSECT is different from the others since it requires + ** two temporary tables. Hence it has its own case. Begin + ** by allocating the tables we will need. + */ + tab1 = pParse->nTab++; + tab2 = pParse->nTab++; + assert( p->pOrderBy==0 ); + + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + + /* Code the SELECTs to our left into temporary table "tab1". + */ + sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); + SELECTTRACE(1, pParse, p, ("multiSelect INTERSECT left...\n")); + rc = sqlite3Select(pParse, pPrior, &intersectdest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT into temporary table "tab2" + */ + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); + assert( p->addrOpenEphm[1] == -1 ); + p->addrOpenEphm[1] = addr; + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + intersectdest.iSDParm = tab2; + ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", + sqlite3SelectOpName(p->op))); + SELECTTRACE(1, pParse, p, ("multiSelect INTERSECT right...\n")); + rc = sqlite3Select(pParse, p, &intersectdest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + if( p->nSelectRow>pPrior->nSelectRow ){ + p->nSelectRow = pPrior->nSelectRow; + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + + /* Generate code to take the intersection of the two temporary + ** tables. + */ + if( rc ) break; + assert( p->pEList ); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); + r1 = sqlite3GetTempReg(pParse); + iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); + sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, r1); + selectInnerLoop(pParse, p, tab1, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); + sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); + break; + } + } + + #ifndef SQLITE_OMIT_EXPLAIN + if( p->pNext==0 ){ + ExplainQueryPlanPop(pParse); + } + #endif + } + if( pParse->nErr ) goto multi_select_end; + + /* Compute collating sequences used by + ** temporary tables needed to implement the compound select. + ** Attach the KeyInfo structure to all temporary tables. + ** + ** This section is run by the right-most SELECT statement only. + ** SELECT statements to the left always skip this part. The right-most + ** SELECT might also skip this part if it has no ORDER BY clause and + ** no temp tables are required. + */ + if( p->selFlags & SF_UsesEphemeral ){ + int i; /* Loop counter */ + KeyInfo *pKeyInfo; /* Collating sequence for the result set */ + Select *pLoop; /* For looping through SELECT statements */ + CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ + int nCol; /* Number of columns in result set */ + + assert( p->pNext==0 ); + assert( p->pEList!=0 ); + nCol = p->pEList->nExpr; + pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); + if( !pKeyInfo ){ + rc = SQLITE_NOMEM_BKPT; + goto multi_select_end; + } + for(i=0, apColl=pKeyInfo->aColl; ipDfltColl; + } + } + + for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ + for(i=0; i<2; i++){ + int addr = pLoop->addrOpenEphm[i]; + if( addr<0 ){ + /* If [0] is unused then [1] is also unused. So we can + ** always safely abort as soon as the first unused slot is found */ + assert( pLoop->addrOpenEphm[1]<0 ); + break; + } + sqlite3VdbeChangeP2(v, addr, nCol); + sqlite3VdbeChangeP4(v, addr, (char*)sqlite3KeyInfoRef(pKeyInfo), + P4_KEYINFO); + pLoop->addrOpenEphm[i] = -1; + } + } + sqlite3KeyInfoUnref(pKeyInfo); + } + +multi_select_end: + pDest->iSdst = dest.iSdst; + pDest->nSdst = dest.nSdst; + if( pDelete ){ + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3SelectDelete, + pDelete); + } + return rc; +} +#endif /* SQLITE_OMIT_COMPOUND_SELECT */ + +/* +** Error message for when two or more terms of a compound select have different +** size result sets. +*/ +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ + if( p->selFlags & SF_Values ){ + sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms"); + }else{ + sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" + " do not have the same number of result columns", + sqlite3SelectOpName(p->op)); + } +} + +/* +** Code an output subroutine for a coroutine implementation of a +** SELECT statment. +** +** The data to be output is contained in pIn->iSdst. There are +** pIn->nSdst columns to be output. pDest is where the output should +** be sent. +** +** regReturn is the number of the register holding the subroutine +** return address. +** +** If regPrev>0 then it is the first register in a vector that +** records the previous output. mem[regPrev] is a flag that is false +** if there has been no previous output. If regPrev>0 then code is +** generated to suppress duplicates. pKeyInfo is used for comparing +** keys. +** +** If the LIMIT found in p->iLimit is reached, jump immediately to +** iBreak. +*/ +static int generateOutputSubroutine( + Parse *pParse, /* Parsing context */ + Select *p, /* The SELECT statement */ + SelectDest *pIn, /* Coroutine supplying data */ + SelectDest *pDest, /* Where to send the data */ + int regReturn, /* The return address register */ + int regPrev, /* Previous result register. No uniqueness if 0 */ + KeyInfo *pKeyInfo, /* For comparing with previous entry */ + int iBreak /* Jump here if we hit the LIMIT */ +){ + Vdbe *v = pParse->pVdbe; + int iContinue; + int addr; + + addr = sqlite3VdbeCurrentAddr(v); + iContinue = sqlite3VdbeMakeLabel(pParse); + + /* Suppress duplicates for UNION, EXCEPT, and INTERSECT + */ + if( regPrev ){ + int addr1, addr2; + addr1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); + addr2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, + (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr2+2, iContinue, addr2+2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1); + sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); + } + if( pParse->db->mallocFailed ) return 0; + + /* Suppress the first OFFSET entries if there is an OFFSET clause + */ + codeOffset(v, p->iOffset, iContinue); + + assert( pDest->eDest!=SRT_Exists ); + assert( pDest->eDest!=SRT_Table ); + switch( pDest->eDest ){ + /* Store the result as data using a unique key. + */ + case SRT_EphemTab: { + int r1 = sqlite3GetTempReg(pParse); + int r2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1); + sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iSDParm, r2); + sqlite3VdbeAddOp3(v, OP_Insert, pDest->iSDParm, r1, r2); + sqlite3VdbeChangeP5(v, OPFLAG_APPEND); + sqlite3ReleaseTempReg(pParse, r2); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY + /* If we are creating a set for an "expr IN (SELECT ...)". + */ + case SRT_Set: { + int r1; + testcase( pIn->nSdst>1 ); + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, + r1, pDest->zAffSdst, pIn->nSdst); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1, + pIn->iSdst, pIn->nSdst); + sqlite3ReleaseTempReg(pParse, r1); + break; + } + + /* If this is a scalar select that is part of an expression, then + ** store the results in the appropriate memory cell and break out + ** of the scan loop. Note that the select might return multiple columns + ** if it is the RHS of a row-value IN operator. + */ + case SRT_Mem: { + testcase( pIn->nSdst>1 ); + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst); + /* The LIMIT clause will jump out of the loop for us */ + break; + } +#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ + + /* The results are stored in a sequence of registers + ** starting at pDest->iSdst. Then the co-routine yields. + */ + case SRT_Coroutine: { + if( pDest->iSdst==0 ){ + pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst); + pDest->nSdst = pIn->nSdst; + } + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pIn->nSdst); + sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); + break; + } + + /* If none of the above, then the result destination must be + ** SRT_Output. This routine is never called with any other + ** destination other than the ones handled above or SRT_Output. + ** + ** For SRT_Output, results are stored in a sequence of registers. + ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to + ** return the next row of result. + */ + default: { + assert( pDest->eDest==SRT_Output ); + sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iSdst, pIn->nSdst); + break; + } + } + + /* Jump to the end of the loop if the LIMIT is reached. + */ + if( p->iLimit ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); + } + + /* Generate the subroutine return + */ + sqlite3VdbeResolveLabel(v, iContinue); + sqlite3VdbeAddOp1(v, OP_Return, regReturn); + + return addr; +} + +/* +** Alternative compound select code generator for cases when there +** is an ORDER BY clause. +** +** We assume a query of the following form: +** +** ORDER BY +** +** is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea +** is to code both and with the ORDER BY clause as +** co-routines. Then run the co-routines in parallel and merge the results +** into the output. In addition to the two coroutines (called selectA and +** selectB) there are 7 subroutines: +** +** outA: Move the output of the selectA coroutine into the output +** of the compound query. +** +** outB: Move the output of the selectB coroutine into the output +** of the compound query. (Only generated for UNION and +** UNION ALL. EXCEPT and INSERTSECT never output a row that +** appears only in B.) +** +** AltB: Called when there is data from both coroutines and AB. +** +** EofA: Called when data is exhausted from selectA. +** +** EofB: Called when data is exhausted from selectB. +** +** The implementation of the latter five subroutines depend on which +** is used: +** +** +** UNION ALL UNION EXCEPT INTERSECT +** ------------- ----------------- -------------- ----------------- +** AltB: outA, nextA outA, nextA outA, nextA nextA +** +** AeqB: outA, nextA nextA nextA outA, nextA +** +** AgtB: outB, nextB outB, nextB nextB nextB +** +** EofA: outB, nextB outB, nextB halt halt +** +** EofB: outA, nextA outA, nextA outA, nextA halt +** +** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA +** causes an immediate jump to EofA and an EOF on B following nextB causes +** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or +** following nextX causes a jump to the end of the select processing. +** +** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled +** within the output subroutine. The regPrev register set holds the previously +** output value. A comparison is made against this value and the output +** is skipped if the next results would be the same as the previous. +** +** The implementation plan is to implement the two coroutines and seven +** subroutines first, then put the control logic at the bottom. Like this: +** +** goto Init +** coA: coroutine for left query (A) +** coB: coroutine for right query (B) +** outA: output one row of A +** outB: output one row of B (UNION and UNION ALL only) +** EofA: ... +** EofB: ... +** AltB: ... +** AeqB: ... +** AgtB: ... +** Init: initialize coroutine registers +** yield coA +** if eof(A) goto EofA +** yield coB +** if eof(B) goto EofB +** Cmpr: Compare A, B +** Jump AltB, AeqB, AgtB +** End: ... +** +** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not +** actually called using Gosub and they do not Return. EofA and EofB loop +** until all data is exhausted then jump to the "end" labe. AltB, AeqB, +** and AgtB jump to either L2 or to one of EofA or EofB. +*/ +#ifndef SQLITE_OMIT_COMPOUND_SELECT +static int multiSelectOrderBy( + Parse *pParse, /* Parsing context */ + Select *p, /* The right-most of SELECTs to be coded */ + SelectDest *pDest /* What to do with query results */ +){ + int i, j; /* Loop counters */ + Select *pPrior; /* Another SELECT immediately to our left */ + Select *pSplit; /* Left-most SELECT in the right-hand group */ + int nSelect; /* Number of SELECT statements in the compound */ + Vdbe *v; /* Generate code to this VDBE */ + SelectDest destA; /* Destination for coroutine A */ + SelectDest destB; /* Destination for coroutine B */ + int regAddrA; /* Address register for select-A coroutine */ + int regAddrB; /* Address register for select-B coroutine */ + int addrSelectA; /* Address of the select-A coroutine */ + int addrSelectB; /* Address of the select-B coroutine */ + int regOutA; /* Address register for the output-A subroutine */ + int regOutB; /* Address register for the output-B subroutine */ + int addrOutA; /* Address of the output-A subroutine */ + int addrOutB = 0; /* Address of the output-B subroutine */ + int addrEofA; /* Address of the select-A-exhausted subroutine */ + int addrEofA_noB; /* Alternate addrEofA if B is uninitialized */ + int addrEofB; /* Address of the select-B-exhausted subroutine */ + int addrAltB; /* Address of the AB subroutine */ + int regLimitA; /* Limit register for select-A */ + int regLimitB; /* Limit register for select-A */ + int regPrev; /* A range of registers to hold previous output */ + int savedLimit; /* Saved value of p->iLimit */ + int savedOffset; /* Saved value of p->iOffset */ + int labelCmpr; /* Label for the start of the merge algorithm */ + int labelEnd; /* Label for the end of the overall SELECT stmt */ + int addr1; /* Jump instructions that get retargetted */ + int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ + KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ + KeyInfo *pKeyMerge; /* Comparison information for merging rows */ + sqlite3 *db; /* Database connection */ + ExprList *pOrderBy; /* The ORDER BY clause */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + u32 *aPermute; /* Mapping from ORDER BY terms to result set columns */ + + assert( p->pOrderBy!=0 ); + assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */ + db = pParse->db; + v = pParse->pVdbe; + assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ + labelEnd = sqlite3VdbeMakeLabel(pParse); + labelCmpr = sqlite3VdbeMakeLabel(pParse); + + + /* Patch up the ORDER BY clause + */ + op = p->op; + assert( p->pPrior->pOrderBy==0 ); + pOrderBy = p->pOrderBy; + assert( pOrderBy ); + nOrderBy = pOrderBy->nExpr; + + /* For operators other than UNION ALL we have to make sure that + ** the ORDER BY clause covers every term of the result set. Add + ** terms to the ORDER BY clause as necessary. + */ + if( op!=TK_ALL ){ + for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){ + struct ExprList_item *pItem; + for(j=0, pItem=pOrderBy->a; ju.x.iOrderByCol>0 ); + if( pItem->u.x.iOrderByCol==i ) break; + } + if( j==nOrderBy ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return SQLITE_NOMEM_BKPT; + pNew->flags |= EP_IntValue; + pNew->u.iValue = i; + p->pOrderBy = pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); + if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i; + } + } + } + + /* Compute the comparison permutation and keyinfo that is used with + ** the permutation used to determine if the next + ** row of results comes from selectA or selectB. Also add explicit + ** collations to the ORDER BY clause terms so that when the subqueries + ** to the right and the left are evaluated, they use the correct + ** collation. + */ + aPermute = sqlite3DbMallocRawNN(db, sizeof(u32)*(nOrderBy + 1)); + if( aPermute ){ + struct ExprList_item *pItem; + aPermute[0] = nOrderBy; + for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){ + assert( pItem!=0 ); + assert( pItem->u.x.iOrderByCol>0 ); + assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr ); + aPermute[i] = pItem->u.x.iOrderByCol - 1; + } + pKeyMerge = multiSelectOrderByKeyInfo(pParse, p, 1); + }else{ + pKeyMerge = 0; + } + + /* Allocate a range of temporary registers and the KeyInfo needed + ** for the logic that removes duplicate result rows when the + ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL). + */ + if( op==TK_ALL ){ + regPrev = 0; + }else{ + int nExpr = p->pEList->nExpr; + assert( nOrderBy>=nExpr || db->mallocFailed ); + regPrev = pParse->nMem+1; + pParse->nMem += nExpr+1; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev); + pKeyDup = sqlite3KeyInfoAlloc(db, nExpr, 1); + if( pKeyDup ){ + assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); + for(i=0; iaColl[i] = multiSelectCollSeq(pParse, p, i); + pKeyDup->aSortFlags[i] = 0; + } + } + } + + /* Separate the left and the right query from one another + */ + nSelect = 1; + if( (op==TK_ALL || op==TK_UNION) + && OptimizationEnabled(db, SQLITE_BalancedMerge) + ){ + for(pSplit=p; pSplit->pPrior!=0 && pSplit->op==op; pSplit=pSplit->pPrior){ + nSelect++; + assert( pSplit->pPrior->pNext==pSplit ); + } + } + if( nSelect<=3 ){ + pSplit = p; + }else{ + pSplit = p; + for(i=2; ipPrior; } + } + pPrior = pSplit->pPrior; + assert( pPrior!=0 ); + pSplit->pPrior = 0; + pPrior->pNext = 0; + assert( p->pOrderBy == pOrderBy ); + assert( pOrderBy!=0 || db->mallocFailed ); + pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0); + sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER"); + sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); + + /* Compute the limit registers */ + computeLimitRegisters(pParse, p, labelEnd); + if( p->iLimit && op==TK_ALL ){ + regLimitA = ++pParse->nMem; + regLimitB = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit, + regLimitA); + sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB); + }else{ + regLimitA = regLimitB = 0; + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = 0; + + regAddrA = ++pParse->nMem; + regAddrB = ++pParse->nMem; + regOutA = ++pParse->nMem; + regOutB = ++pParse->nMem; + sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA); + sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB); + + ExplainQueryPlan((pParse, 1, "MERGE (%s)", sqlite3SelectOpName(p->op))); + + /* Generate a coroutine to evaluate the SELECT statement to the + ** left of the compound operator - the "A" select. + */ + addrSelectA = sqlite3VdbeCurrentAddr(v) + 1; + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); + VdbeComment((v, "left SELECT")); + pPrior->iLimit = regLimitA; + ExplainQueryPlan((pParse, 1, "LEFT")); + sqlite3Select(pParse, pPrior, &destA); + sqlite3VdbeEndCoroutine(v, regAddrA); + sqlite3VdbeJumpHere(v, addr1); + + /* Generate a coroutine to evaluate the SELECT statement on + ** the right - the "B" select + */ + addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); + VdbeComment((v, "right SELECT")); + savedLimit = p->iLimit; + savedOffset = p->iOffset; + p->iLimit = regLimitB; + p->iOffset = 0; + ExplainQueryPlan((pParse, 1, "RIGHT")); + sqlite3Select(pParse, p, &destB); + p->iLimit = savedLimit; + p->iOffset = savedOffset; + sqlite3VdbeEndCoroutine(v, regAddrB); + + /* Generate a subroutine that outputs the current row of the A + ** select as the next output row of the compound select. + */ + VdbeNoopComment((v, "Output routine for A")); + addrOutA = generateOutputSubroutine(pParse, + p, &destA, pDest, regOutA, + regPrev, pKeyDup, labelEnd); + + /* Generate a subroutine that outputs the current row of the B + ** select as the next output row of the compound select. + */ + if( op==TK_ALL || op==TK_UNION ){ + VdbeNoopComment((v, "Output routine for B")); + addrOutB = generateOutputSubroutine(pParse, + p, &destB, pDest, regOutB, + regPrev, pKeyDup, labelEnd); + } + sqlite3KeyInfoUnref(pKeyDup); + + /* Generate a subroutine to run when the results from select A + ** are exhausted and only data in select B remains. + */ + if( op==TK_EXCEPT || op==TK_INTERSECT ){ + addrEofA_noB = addrEofA = labelEnd; + }else{ + VdbeNoopComment((v, "eof-A subroutine")); + addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); + VdbeCoverage(v); + sqlite3VdbeGoto(v, addrEofA); + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + + /* Generate a subroutine to run when the results from select B + ** are exhausted and only data in select A remains. + */ + if( op==TK_INTERSECT ){ + addrEofB = addrEofA; + if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; + }else{ + VdbeNoopComment((v, "eof-B subroutine")); + addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrEofB); + } + + /* Generate code to handle the case of AB + */ + VdbeNoopComment((v, "A-gt-B subroutine")); + addrAgtB = sqlite3VdbeCurrentAddr(v); + if( op==TK_ALL || op==TK_UNION ){ + sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); + } + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + sqlite3VdbeGoto(v, labelCmpr); + + /* This code runs once to initialize everything. + */ + sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + + /* Implement the main merge loop + */ + sqlite3VdbeResolveLabel(v, labelCmpr); + sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY); + sqlite3VdbeAddOp4(v, OP_Compare, destA.iSdst, destB.iSdst, nOrderBy, + (char*)pKeyMerge, P4_KEYINFO); + sqlite3VdbeChangeP5(v, OPFLAG_PERMUTE); + sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); VdbeCoverage(v); + + /* Jump to the this point in order to terminate the query. + */ + sqlite3VdbeResolveLabel(v, labelEnd); + + /* Reassembly the compound query so that it will be freed correctly + ** by the calling function */ + if( pSplit->pPrior ){ + sqlite3SelectDelete(db, pSplit->pPrior); + } + pSplit->pPrior = pPrior; + pPrior->pNext = pSplit; + sqlite3ExprListDelete(db, pPrior->pOrderBy); + pPrior->pOrderBy = 0; + + /*** TBD: Insert subroutine calls to close cursors on incomplete + **** subqueries ****/ + ExplainQueryPlanPop(pParse); + return pParse->nErr!=0; +} +#endif + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + +/* An instance of the SubstContext object describes an substitution edit +** to be performed on a parse tree. +** +** All references to columns in table iTable are to be replaced by corresponding +** expressions in pEList. +** +** ## About "isOuterJoin": +** +** The isOuterJoin column indicates that the replacement will occur into a +** position in the parent that NULL-able due to an OUTER JOIN. Either the +** target slot in the parent is the right operand of a LEFT JOIN, or one of +** the left operands of a RIGHT JOIN. In either case, we need to potentially +** bypass the substituted expression with OP_IfNullRow. +** +** Suppose the original expression integer constant. Even though the table +** has the nullRow flag set, because the expression is an integer constant, +** it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode +** that checks to see if the nullRow flag is set on the table. If the nullRow +** flag is set, then the value in the register is set to NULL and the original +** expression is bypassed. If the nullRow flag is not set, then the original +** expression runs to populate the register. +** +** Example where this is needed: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); +** CREATE TABLE t2(x INT UNIQUE); +** +** SELECT a,b,m,x FROM t1 LEFT JOIN (SELECT 59 AS m,x FROM t2) ON b=x; +** +** When the subquery on the right side of the LEFT JOIN is flattened, we +** have to add OP_IfNullRow in front of the OP_Integer that implements the +** "m" value of the subquery so that a NULL will be loaded instead of 59 +** when processing a non-matched row of the left. +*/ +typedef struct SubstContext { + Parse *pParse; /* The parsing context */ + int iTable; /* Replace references to this table */ + int iNewTable; /* New table number */ + int isOuterJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ + ExprList *pEList; /* Replacement expressions */ +} SubstContext; + +/* Forward Declarations */ +static void substExprList(SubstContext*, ExprList*); +static void substSelect(SubstContext*, Select*, int); + +/* +** Scan through the expression pExpr. Replace every reference to +** a column in table number iTable with a copy of the iColumn-th +** entry in pEList. (But leave references to the ROWID column +** unchanged.) +** +** This routine is part of the flattening procedure. A subquery +** whose result set is defined by pEList appears as entry in the +** FROM clause of a SELECT such that the VDBE cursor assigned to that +** FORM clause entry is iTable. This routine makes the necessary +** changes to pExpr so that it refers directly to the source table +** of the subquery rather the result set of the subquery. +*/ +static Expr *substExpr( + SubstContext *pSubst, /* Description of the substitution */ + Expr *pExpr /* Expr in which substitution occurs */ +){ + if( pExpr==0 ) return 0; + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) + && pExpr->w.iJoin==pSubst->iTable + ){ + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + pExpr->w.iJoin = pSubst->iNewTable; + } + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pSubst->iTable + && !ExprHasProperty(pExpr, EP_FixedCol) + ){ +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + if( pExpr->iColumn<0 ){ + pExpr->op = TK_NULL; + }else +#endif + { + Expr *pNew; + Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr; + Expr ifNullRow; + assert( pSubst->pEList!=0 && pExpr->iColumnpEList->nExpr ); + assert( pExpr->pRight==0 ); + if( sqlite3ExprIsVector(pCopy) ){ + sqlite3VectorErrorMsg(pSubst->pParse, pCopy); + }else{ + sqlite3 *db = pSubst->pParse->db; + if( pSubst->isOuterJoin && pCopy->op!=TK_COLUMN ){ + memset(&ifNullRow, 0, sizeof(ifNullRow)); + ifNullRow.op = TK_IF_NULL_ROW; + ifNullRow.pLeft = pCopy; + ifNullRow.iTable = pSubst->iNewTable; + ifNullRow.flags = EP_IfNullRow; + pCopy = &ifNullRow; + } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); + pNew = sqlite3ExprDup(db, pCopy, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pNew); + return pExpr; + } + if( pSubst->isOuterJoin ){ + ExprSetProperty(pNew, EP_CanBeNull); + } + if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ + sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, + pExpr->flags & (EP_OuterON|EP_InnerON)); + } + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; + if( pExpr->op==TK_TRUEFALSE ){ + pExpr->u.iValue = sqlite3ExprTruthValue(pExpr); + pExpr->op = TK_INTEGER; + ExprSetProperty(pExpr, EP_IntValue); + } + + /* Ensure that the expression now has an implicit collation sequence, + ** just as it did when it was a column of a view or sub-query. */ + if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){ + CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr); + pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + (pColl ? pColl->zName : "BINARY") + ); + } + ExprClearProperty(pExpr, EP_Collate); + } + } + }else{ + if( pExpr->op==TK_IF_NULL_ROW && pExpr->iTable==pSubst->iTable ){ + pExpr->iTable = pSubst->iNewTable; + } + pExpr->pLeft = substExpr(pSubst, pExpr->pLeft); + pExpr->pRight = substExpr(pSubst, pExpr->pRight); + if( ExprUseXSelect(pExpr) ){ + substSelect(pSubst, pExpr->x.pSelect, 1); + }else{ + substExprList(pSubst, pExpr->x.pList); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + pWin->pFilter = substExpr(pSubst, pWin->pFilter); + substExprList(pSubst, pWin->pPartition); + substExprList(pSubst, pWin->pOrderBy); + } +#endif + } + return pExpr; +} +static void substExprList( + SubstContext *pSubst, /* Description of the substitution */ + ExprList *pList /* List to scan and in which to make substitutes */ +){ + int i; + if( pList==0 ) return; + for(i=0; inExpr; i++){ + pList->a[i].pExpr = substExpr(pSubst, pList->a[i].pExpr); + } +} +static void substSelect( + SubstContext *pSubst, /* Description of the substitution */ + Select *p, /* SELECT statement in which to make substitutions */ + int doPrior /* Do substitutes on p->pPrior too */ +){ + SrcList *pSrc; + SrcItem *pItem; + int i; + if( !p ) return; + do{ + substExprList(pSubst, p->pEList); + substExprList(pSubst, p->pGroupBy); + substExprList(pSubst, p->pOrderBy); + p->pHaving = substExpr(pSubst, p->pHaving); + p->pWhere = substExpr(pSubst, p->pWhere); + pSrc = p->pSrc; + assert( pSrc!=0 ); + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + substSelect(pSubst, pItem->pSelect, 1); + if( pItem->fg.isTabFunc ){ + substExprList(pSubst, pItem->u1.pFuncArg); + } + } + }while( doPrior && (p = p->pPrior)!=0 ); +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** pSelect is a SELECT statement and pSrcItem is one item in the FROM +** clause of that SELECT. +** +** This routine scans the entire SELECT statement and recomputes the +** pSrcItem->colUsed mask. +*/ +static int recomputeColumnsUsedExpr(Walker *pWalker, Expr *pExpr){ + SrcItem *pItem; + if( pExpr->op!=TK_COLUMN ) return WRC_Continue; + pItem = pWalker->u.pSrcItem; + if( pItem->iCursor!=pExpr->iTable ) return WRC_Continue; + if( pExpr->iColumn<0 ) return WRC_Continue; + pItem->colUsed |= sqlite3ExprColUsed(pExpr); + return WRC_Continue; +} +static void recomputeColumnsUsed( + Select *pSelect, /* The complete SELECT statement */ + SrcItem *pSrcItem /* Which FROM clause item to recompute */ +){ + Walker w; + if( NEVER(pSrcItem->pTab==0) ) return; + memset(&w, 0, sizeof(w)); + w.xExprCallback = recomputeColumnsUsedExpr; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.u.pSrcItem = pSrcItem; + pSrcItem->colUsed = 0; + sqlite3WalkSelect(&w, pSelect); +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** Assign new cursor numbers to each of the items in pSrc. For each +** new cursor number assigned, set an entry in the aCsrMap[] array +** to map the old cursor number to the new: +** +** aCsrMap[iOld+1] = iNew; +** +** The array is guaranteed by the caller to be large enough for all +** existing cursor numbers in pSrc. aCsrMap[0] is the array size. +** +** If pSrc contains any sub-selects, call this routine recursively +** on the FROM clause of each such sub-select, with iExcept set to -1. +*/ +static void srclistRenumberCursors( + Parse *pParse, /* Parse context */ + int *aCsrMap, /* Array to store cursor mappings in */ + SrcList *pSrc, /* FROM clause to renumber */ + int iExcept /* FROM clause item to skip */ +){ + int i; + SrcItem *pItem; + for(i=0, pItem=pSrc->a; inSrc; i++, pItem++){ + if( i!=iExcept ){ + Select *p; + assert( pItem->iCursor < aCsrMap[0] ); + if( !pItem->fg.isRecursive || aCsrMap[pItem->iCursor+1]==0 ){ + aCsrMap[pItem->iCursor+1] = pParse->nTab++; + } + pItem->iCursor = aCsrMap[pItem->iCursor+1]; + for(p=pItem->pSelect; p; p=p->pPrior){ + srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1); + } + } + } +} + +/* +** *piCursor is a cursor number. Change it if it needs to be mapped. +*/ +static void renumberCursorDoMapping(Walker *pWalker, int *piCursor){ + int *aCsrMap = pWalker->u.aiCol; + int iCsr = *piCursor; + if( iCsr < aCsrMap[0] && aCsrMap[iCsr+1]>0 ){ + *piCursor = aCsrMap[iCsr+1]; + } +} + +/* +** Expression walker callback used by renumberCursors() to update +** Expr objects to match newly assigned cursor numbers. +*/ +static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ + int op = pExpr->op; + if( op==TK_COLUMN || op==TK_IF_NULL_ROW ){ + renumberCursorDoMapping(pWalker, &pExpr->iTable); + } + if( ExprHasProperty(pExpr, EP_OuterON) ){ + renumberCursorDoMapping(pWalker, &pExpr->w.iJoin); + } + return WRC_Continue; +} + +/* +** Assign a new cursor number to each cursor in the FROM clause (Select.pSrc) +** of the SELECT statement passed as the second argument, and to each +** cursor in the FROM clause of any FROM clause sub-selects, recursively. +** Except, do not assign a new cursor number to the iExcept'th element in +** the FROM clause of (*p). Update all expressions and other references +** to refer to the new cursor numbers. +** +** Argument aCsrMap is an array that may be used for temporary working +** space. Two guarantees are made by the caller: +** +** * the array is larger than the largest cursor number used within the +** select statement passed as an argument, and +** +** * the array entries for all cursor numbers that do *not* appear in +** FROM clauses of the select statement as described above are +** initialized to zero. +*/ +static void renumberCursors( + Parse *pParse, /* Parse context */ + Select *p, /* Select to renumber cursors within */ + int iExcept, /* FROM clause item to skip */ + int *aCsrMap /* Working space */ +){ + Walker w; + srclistRenumberCursors(pParse, aCsrMap, p->pSrc, iExcept); + memset(&w, 0, sizeof(w)); + w.u.aiCol = aCsrMap; + w.xExprCallback = renumberCursorsCb; + w.xSelectCallback = sqlite3SelectWalkNoop; + sqlite3WalkSelect(&w, p); +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** This routine attempts to flatten subqueries as a performance optimization. +** This routine returns 1 if it makes changes and 0 if no flattening occurs. +** +** To understand the concept of flattening, consider the following +** query: +** +** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 +** +** The default way of implementing this query is to execute the +** subquery first and store the results in a temporary table, then +** run the outer query on that temporary table. This requires two +** passes over the data. Furthermore, because the temporary table +** has no indices, the WHERE clause on the outer query cannot be +** optimized. +** +** This routine attempts to rewrite queries such as the above into +** a single flat select, like this: +** +** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 +** +** The code generated for this simplification gives the same result +** but only has to scan the data once. And because indices might +** exist on the table t1, a complete scan of the data might be +** avoided. +** +** Flattening is subject to the following constraints: +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** The subquery and the outer query cannot both be aggregates. +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** (2) If the subquery is an aggregate then +** (2a) the outer query must not be a join and +** (2b) the outer query must not use subqueries +** other than the one FROM-clause subquery that is a candidate +** for flattening. (This is due to ticket [2f7170d73bf9abf80] +** from 2015-02-09.) +** +** (3) If the subquery is the right operand of a LEFT JOIN then +** (3a) the subquery may not be a join and +** (3b) the FROM clause of the subquery may not contain a virtual +** table and +** (3c) the outer query may not be an aggregate. +** (3d) the outer query may not be DISTINCT. +** See also (26) for restrictions on RIGHT JOIN. +** +** (4) The subquery can not be DISTINCT. +** +** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT +** sub-queries that were excluded from this optimization. Restriction +** (4) has since been expanded to exclude all DISTINCT subqueries. +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** If the subquery is aggregate, the outer query may not be DISTINCT. +** +** (7) The subquery must have a FROM clause. TODO: For subqueries without +** A FROM clause, consider adding a FROM clause with the special +** table sqlite_once that consists of a single row containing a +** single NULL. +** +** (8) If the subquery uses LIMIT then the outer query may not be a join. +** +** (9) If the subquery uses LIMIT then the outer query may not be aggregate. +** +** (**) Restriction (10) was removed from the code on 2005-02-05 but we +** accidently carried the comment forward until 2014-09-15. Original +** constraint: "If the subquery is aggregate then the outer query +** may not use LIMIT." +** +** (11) The subquery and the outer query may not both have ORDER BY clauses. +** +** (**) Not implemented. Subsumed into restriction (3). Was previously +** a separate restriction deriving from ticket #350. +** +** (13) The subquery and outer query may not both use LIMIT. +** +** (14) The subquery may not use OFFSET. +** +** (15) If the outer query is part of a compound select, then the +** subquery may not use LIMIT. +** (See ticket #2339 and ticket [02a8e81d44]). +** +** (16) If the outer query is aggregate, then the subquery may not +** use ORDER BY. (Ticket #2942) This used to not matter +** until we introduced the group_concat() function. +** +** (17) If the subquery is a compound select, then +** (17a) all compound operators must be a UNION ALL, and +** (17b) no terms within the subquery compound may be aggregate +** or DISTINCT, and +** (17c) every term within the subquery compound must have a FROM clause +** (17d) the outer query may not be +** (17d1) aggregate, or +** (17d2) DISTINCT +** (17e) the subquery may not contain window functions, and +** (17f) the subquery must not be the RHS of a LEFT JOIN. +** (17g) either the subquery is the first element of the outer +** query or there are no RIGHT or FULL JOINs in any arm +** of the subquery. (This is a duplicate of condition (27b).) +** +** The parent and sub-query may contain WHERE clauses. Subject to +** rules (11), (13) and (14), they may also contain ORDER BY, +** LIMIT and OFFSET clauses. The subquery cannot use any compound +** operator other than UNION ALL because all the other compound +** operators have an implied DISTINCT which is disallowed by +** restriction (4). +** +** Also, each component of the sub-query must return the same number +** of result columns. This is actually a requirement for any compound +** SELECT statement, but all the code here does is make sure that no +** such (illegal) sub-query is flattened. The caller will detect the +** syntax error and return a detailed message. +** +** (18) If the sub-query is a compound select, then all terms of the +** ORDER BY clause of the parent must be copies of a term returned +** by the parent query. +** +** (19) If the subquery uses LIMIT then the outer query may not +** have a WHERE clause. +** +** (20) If the sub-query is a compound select, then it must not use +** an ORDER BY clause. Ticket #3773. We could relax this constraint +** somewhat by saying that the terms of the ORDER BY clause must +** appear as unmodified result columns in the outer query. But we +** have other optimizations in mind to deal with that case. +** +** (21) If the subquery uses LIMIT then the outer query may not be +** DISTINCT. (See ticket [752e1646fc]). +** +** (22) The subquery may not be a recursive CTE. +** +** (23) If the outer query is a recursive CTE, then the sub-query may not be +** a compound query. This restriction is because transforming the +** parent to a compound query confuses the code that handles +** recursive queries in multiSelect(). +** +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** The subquery may not be an aggregate that uses the built-in min() or +** or max() functions. (Without this restriction, a query like: +** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily +** return the value X for which Y was maximal.) +** +** (25) If either the subquery or the parent query contains a window +** function in the select list or ORDER BY clause, flattening +** is not attempted. +** +** (26) The subquery may not be the right operand of a RIGHT JOIN. +** See also (3) for restrictions on LEFT JOIN. +** +** (27) The subquery may not contain a FULL or RIGHT JOIN unless it +** is the first element of the parent query. This must be the +** the case if: +** (27a) the subquery is not compound query, and +** (27b) the subquery is a compound query and the RIGHT JOIN occurs +** in any arm of the compound query. (See also (17g).) +** +** (28) The subquery is not a MATERIALIZED CTE. +** +** (29) Either the subquery is not the right-hand operand of a join with an +** ON or USING clause nor the right-hand operand of a NATURAL JOIN, or +** the right-most table within the FROM clause of the subquery +** is not part of an outer join. +** +** +** In this routine, the "p" parameter is a pointer to the outer query. +** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query +** uses aggregates. +** +** If flattening is not attempted, this routine is a no-op and returns 0. +** If flattening is attempted this routine returns 1. +** +** All of the expression analysis must occur on both the outer query and +** the subquery before this routine runs. +*/ +static int flattenSubquery( + Parse *pParse, /* Parsing context */ + Select *p, /* The parent or outer SELECT statement */ + int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ + int isAgg /* True if outer SELECT uses aggregate functions */ +){ + const char *zSavedAuthContext = pParse->zAuthContext; + Select *pParent; /* Current UNION ALL term of the other query */ + Select *pSub; /* The inner query or "subquery" */ + Select *pSub1; /* Pointer to the rightmost select in sub-query */ + SrcList *pSrc; /* The FROM clause of the outer query */ + SrcList *pSubSrc; /* The FROM clause of the subquery */ + int iParent; /* VDBE cursor number of the pSub result set temp table */ + int iNewParent = -1;/* Replacement table for iParent */ + int isOuterJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ + int i; /* Loop counter */ + Expr *pWhere; /* The WHERE clause */ + SrcItem *pSubitem; /* The subquery */ + sqlite3 *db = pParse->db; + Walker w; /* Walker to persist agginfo data */ + int *aCsrMap = 0; + + /* Check to see if flattening is permitted. Return 0 if not. + */ + assert( p!=0 ); + assert( p->pPrior==0 ); + if( OptimizationDisabled(db, SQLITE_QueryFlattener) ) return 0; + pSrc = p->pSrc; + assert( pSrc && iFrom>=0 && iFromnSrc ); + pSubitem = &pSrc->a[iFrom]; + iParent = pSubitem->iCursor; + pSub = pSubitem->pSelect; + assert( pSub!=0 ); + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin || pSub->pWin ) return 0; /* Restriction (25) */ +#endif + + pSubSrc = pSub->pSrc; + assert( pSubSrc ); + /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, + ** not arbitrary expressions, we allowed some combining of LIMIT and OFFSET + ** because they could be computed at compile-time. But when LIMIT and OFFSET + ** became arbitrary expressions, we were forced to add restrictions (13) + ** and (14). */ + if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ + if( pSub->pLimit && pSub->pLimit->pRight ) return 0; /* Restriction (14) */ + if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){ + return 0; /* Restriction (15) */ + } + if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ + if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (4) */ + if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){ + return 0; /* Restrictions (8)(9) */ + } + if( p->pOrderBy && pSub->pOrderBy ){ + return 0; /* Restriction (11) */ + } + if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */ + if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */ + if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){ + return 0; /* Restriction (21) */ + } + if( pSub->selFlags & (SF_Recursive) ){ + return 0; /* Restrictions (22) */ + } + + /* + ** If the subquery is the right operand of a LEFT JOIN, then the + ** subquery may not be a join itself (3a). Example of why this is not + ** allowed: + ** + ** t1 LEFT OUTER JOIN (t2 JOIN t3) + ** + ** If we flatten the above, we would get + ** + ** (t1 LEFT OUTER JOIN t2) JOIN t3 + ** + ** which is not at all the same thing. + ** + ** If the subquery is the right operand of a LEFT JOIN, then the outer + ** query cannot be an aggregate. (3c) This is an artifact of the way + ** aggregates are processed - there is no mechanism to determine if + ** the LEFT JOIN table should be all-NULL. + ** + ** See also tickets #306, #350, and #3300. + */ + if( (pSubitem->fg.jointype & (JT_OUTER|JT_LTORJ))!=0 ){ + if( pSubSrc->nSrc>1 /* (3a) */ + || isAgg /* (3c) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */ + || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */ + ){ + return 0; + } + isOuterJoin = 1; + } +#ifdef SQLITE_EXTRA_IFNULLROW + else if( iFrom>0 && !isAgg ){ + /* Setting isOuterJoin to -1 causes OP_IfNullRow opcodes to be generated for + ** every reference to any result column from subquery in a join, even + ** though they are not necessary. This will stress-test the OP_IfNullRow + ** opcode. */ + isOuterJoin = -1; + } +#endif + + assert( pSubSrc->nSrc>0 ); /* True by restriction (7) */ + if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + return 0; /* Restriction (27a) */ + } + if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){ + return 0; /* (28) */ + } + + /* Restriction (29): + ** + ** We do not want two constraints on the same term of the flattened + ** query where one constraint has EP_InnerON and the other is EP_OuterON. + ** To prevent this, one or the other of the following conditions must be + ** false: + ** + ** (29a) The right-most entry in the FROM clause of the subquery + ** must not be part of an outer join. + ** + ** (29b) The subquery itself must not be the right operand of a + ** NATURAL join or a join that as an ON or USING clause. + ** + ** These conditions are sufficient to keep an EP_OuterON from being + ** flattened into an EP_InnerON. Restrictions (3a) and (27a) prevent + ** an EP_InnerON from being flattened into an EP_OuterON. + */ + if( pSubSrc->nSrc>=2 + && (pSubSrc->a[pSubSrc->nSrc-1].fg.jointype & JT_OUTER)!=0 + ){ + if( (pSubitem->fg.jointype & JT_NATURAL)!=0 + || pSubitem->fg.isUsing + || NEVER(pSubitem->u3.pOn!=0) /* ON clause already shifted into WHERE */ + || pSubitem->fg.isOn + ){ + return 0; + } + } + + /* Restriction (17): If the sub-query is a compound SELECT, then it must + ** use only the UNION ALL operator. And none of the simple select queries + ** that make up the compound SELECT are allowed to be aggregate or distinct + ** queries. + */ + if( pSub->pPrior ){ + if( pSub->pOrderBy ){ + return 0; /* Restriction (20) */ + } + if( isAgg || (p->selFlags & SF_Distinct)!=0 || isOuterJoin>0 ){ + return 0; /* (17d1), (17d2), or (17f) */ + } + for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ + testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); + testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); + assert( pSub->pSrc!=0 ); + assert( (pSub->selFlags & SF_Recursive)==0 ); + assert( pSub->pEList->nExpr==pSub1->pEList->nExpr ); + if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */ + || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */ + || pSub1->pSrc->nSrc<1 /* (17c) */ +#ifndef SQLITE_OMIT_WINDOWFUNC + || pSub1->pWin /* (17e) */ +#endif + ){ + return 0; + } + if( iFrom>0 && (pSub1->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + /* Without this restriction, the JT_LTORJ flag would end up being + ** omitted on left-hand tables of the right join that is being + ** flattened. */ + return 0; /* Restrictions (17g), (27b) */ + } + testcase( pSub1->pSrc->nSrc>1 ); + } + + /* Restriction (18). */ + if( p->pOrderBy ){ + int ii; + for(ii=0; iipOrderBy->nExpr; ii++){ + if( p->pOrderBy->a[ii].u.x.iOrderByCol==0 ) return 0; + } + } + + /* Restriction (23) */ + if( (p->selFlags & SF_Recursive) ) return 0; + + if( pSrc->nSrc>1 ){ + if( pParse->nSelect>500 ) return 0; + if( OptimizationDisabled(db, SQLITE_FlttnUnionAll) ) return 0; + aCsrMap = sqlite3DbMallocZero(db, ((i64)pParse->nTab+1)*sizeof(int)); + if( aCsrMap ) aCsrMap[0] = pParse->nTab; + } + } + + /***** If we reach this point, flattening is permitted. *****/ + SELECTTRACE(1,pParse,p,("flatten %u.%p from term %d\n", + pSub->selId, pSub, iFrom)); + + /* Authorize the subquery */ + pParse->zAuthContext = pSubitem->zName; + TESTONLY(i =) sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0); + testcase( i==SQLITE_DENY ); + pParse->zAuthContext = zSavedAuthContext; + + /* Delete the transient structures associated with thesubquery */ + pSub1 = pSubitem->pSelect; + sqlite3DbFree(db, pSubitem->zDatabase); + sqlite3DbFree(db, pSubitem->zName); + sqlite3DbFree(db, pSubitem->zAlias); + pSubitem->zDatabase = 0; + pSubitem->zName = 0; + pSubitem->zAlias = 0; + pSubitem->pSelect = 0; + assert( pSubitem->fg.isUsing!=0 || pSubitem->u3.pOn==0 ); + + /* If the sub-query is a compound SELECT statement, then (by restrictions + ** 17 and 18 above) it must be a UNION ALL and the parent query must + ** be of the form: + ** + ** SELECT FROM () + ** + ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block + ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or + ** OFFSET clauses and joins them to the left-hand-side of the original + ** using UNION ALL operators. In this case N is the number of simple + ** select statements in the compound sub-query. + ** + ** Example: + ** + ** SELECT a+1 FROM ( + ** SELECT x FROM tab + ** UNION ALL + ** SELECT y FROM tab + ** UNION ALL + ** SELECT abs(z*2) FROM tab2 + ** ) WHERE a!=5 ORDER BY 1 + ** + ** Transformed into: + ** + ** SELECT x+1 FROM tab WHERE x+1!=5 + ** UNION ALL + ** SELECT y+1 FROM tab WHERE y+1!=5 + ** UNION ALL + ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5 + ** ORDER BY 1 + ** + ** We call this the "compound-subquery flattening". + */ + for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){ + Select *pNew; + ExprList *pOrderBy = p->pOrderBy; + Expr *pLimit = p->pLimit; + Select *pPrior = p->pPrior; + Table *pItemTab = pSubitem->pTab; + pSubitem->pTab = 0; + p->pOrderBy = 0; + p->pPrior = 0; + p->pLimit = 0; + pNew = sqlite3SelectDup(db, p, 0); + p->pLimit = pLimit; + p->pOrderBy = pOrderBy; + p->op = TK_ALL; + pSubitem->pTab = pItemTab; + if( pNew==0 ){ + p->pPrior = pPrior; + }else{ + pNew->selId = ++pParse->nSelect; + if( aCsrMap && ALWAYS(db->mallocFailed==0) ){ + renumberCursors(pParse, pNew, iFrom, aCsrMap); + } + pNew->pPrior = pPrior; + if( pPrior ) pPrior->pNext = pNew; + pNew->pNext = p; + p->pPrior = pNew; + SELECTTRACE(2,pParse,p,("compound-subquery flattener" + " creates %u as peer\n",pNew->selId)); + } + assert( pSubitem->pSelect==0 ); + } + sqlite3DbFree(db, aCsrMap); + if( db->mallocFailed ){ + pSubitem->pSelect = pSub1; + return 1; + } + + /* Defer deleting the Table object associated with the + ** subquery until code generation is + ** complete, since there may still exist Expr.pTab entries that + ** refer to the subquery even after flattening. Ticket #3346. + ** + ** pSubitem->pTab is always non-NULL by test restrictions and tests above. + */ + if( ALWAYS(pSubitem->pTab!=0) ){ + Table *pTabToDel = pSubitem->pTab; + if( pTabToDel->nTabRef==1 ){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + sqlite3ParserAddCleanup(pToplevel, + (void(*)(sqlite3*,void*))sqlite3DeleteTable, + pTabToDel); + testcase( pToplevel->earlyCleanup ); + }else{ + pTabToDel->nTabRef--; + } + pSubitem->pTab = 0; + } + + /* The following loop runs once for each term in a compound-subquery + ** flattening (as described above). If we are doing a different kind + ** of flattening - a flattening other than a compound-subquery flattening - + ** then this loop only runs once. + ** + ** This loop moves all of the FROM elements of the subquery into the + ** the FROM clause of the outer query. Before doing this, remember + ** the cursor number for the original outer query FROM element in + ** iParent. The iParent cursor will never be used. Subsequent code + ** will scan expressions looking for iParent references and replace + ** those references with expressions that resolve to the subquery FROM + ** elements we are now copying in. + */ + pSub = pSub1; + for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ + int nSubSrc; + u8 jointype = 0; + u8 ltorj = pSrc->a[iFrom].fg.jointype & JT_LTORJ; + assert( pSub!=0 ); + pSubSrc = pSub->pSrc; /* FROM clause of subquery */ + nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ + pSrc = pParent->pSrc; /* FROM clause of the outer query */ + + if( pParent==p ){ + jointype = pSubitem->fg.jointype; /* First time through the loop */ + } + + /* The subquery uses a single slot of the FROM clause of the outer + ** query. If the subquery has more than one element in its FROM clause, + ** then expand the outer query to make space for it to hold all elements + ** of the subquery. + ** + ** Example: + ** + ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB; + ** + ** The outer query has 3 slots in its FROM clause. One slot of the + ** outer query (the middle slot) is used by the subquery. The next + ** block of code will expand the outer query FROM clause to 4 slots. + ** The middle slot is expanded to two slots in order to make space + ** for the two elements in the FROM clause of the subquery. + */ + if( nSubSrc>1 ){ + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; + } + + /* Transfer the FROM clause terms from the subquery into the + ** outer query. + */ + for(i=0; ia[i+iFrom]; + if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing); + assert( pItem->fg.isTabFunc==0 ); + *pItem = pSubSrc->a[i]; + pItem->fg.jointype |= ltorj; + iNewParent = pSubSrc->a[i].iCursor; + memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); + } + pSrc->a[iFrom].fg.jointype &= JT_LTORJ; + pSrc->a[iFrom].fg.jointype |= jointype | ltorj; + + /* Now begin substituting subquery result set expressions for + ** references to the iParent in the outer query. + ** + ** Example: + ** + ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; + ** \ \_____________ subquery __________/ / + ** \_____________________ outer query ______________________________/ + ** + ** We look at every expression in the outer query and every place we see + ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". + */ + if( pSub->pOrderBy && (pParent->selFlags & SF_NoopOrderBy)==0 ){ + /* At this point, any non-zero iOrderByCol values indicate that the + ** ORDER BY column expression is identical to the iOrderByCol'th + ** expression returned by SELECT statement pSub. Since these values + ** do not necessarily correspond to columns in SELECT statement pParent, + ** zero them before transfering the ORDER BY clause. + ** + ** Not doing this may cause an error if a subsequent call to this + ** function attempts to flatten a compound sub-query into pParent + ** (the only way this can happen is if the compound sub-query is + ** currently part of pSub->pSrc). See ticket [d11a6e908f]. */ + ExprList *pOrderBy = pSub->pOrderBy; + for(i=0; inExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + assert( pParent->pOrderBy==0 ); + pParent->pOrderBy = pOrderBy; + pSub->pOrderBy = 0; + } + pWhere = pSub->pWhere; + pSub->pWhere = 0; + if( isOuterJoin>0 ){ + sqlite3SetJoinExpr(pWhere, iNewParent, EP_OuterON); + } + if( pWhere ){ + if( pParent->pWhere ){ + pParent->pWhere = sqlite3PExpr(pParse, TK_AND, pWhere, pParent->pWhere); + }else{ + pParent->pWhere = pWhere; + } + } + if( db->mallocFailed==0 ){ + SubstContext x; + x.pParse = pParse; + x.iTable = iParent; + x.iNewTable = iNewParent; + x.isOuterJoin = isOuterJoin; + x.pEList = pSub->pEList; + substSelect(&x, pParent, 0); + } + + /* The flattened query is a compound if either the inner or the + ** outer query is a compound. */ + pParent->selFlags |= pSub->selFlags & SF_Compound; + assert( (pSub->selFlags & SF_Distinct)==0 ); /* restriction (17b) */ + + /* + ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; + ** + ** One is tempted to try to add a and b to combine the limits. But this + ** does not work if either limit is negative. + */ + if( pSub->pLimit ){ + pParent->pLimit = pSub->pLimit; + pSub->pLimit = 0; + } + + /* Recompute the SrcList_item.colUsed masks for the flattened + ** tables. */ + for(i=0; ia[i+iFrom]); + } + } + + /* Finially, delete what is left of the subquery and return + ** success. + */ + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w,pSub1); + sqlite3SelectDelete(db, pSub1); + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After flattening:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + return 1; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +/* +** A structure to keep track of all of the column values that are fixed to +** a known value due to WHERE clause constraints of the form COLUMN=VALUE. +*/ +typedef struct WhereConst WhereConst; +struct WhereConst { + Parse *pParse; /* Parsing context */ + u8 *pOomFault; /* Pointer to pParse->db->mallocFailed */ + int nConst; /* Number for COLUMN=CONSTANT terms */ + int nChng; /* Number of times a constant is propagated */ + int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */ + u32 mExcludeOn; /* Which ON expressions to exclude from considertion. + ** Either EP_OuterON or EP_InnerON|EP_OuterON */ + Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ +}; + +/* +** Add a new entry to the pConst object. Except, do not add duplicate +** pColumn entires. Also, do not add if doing so would not be appropriate. +** +** The caller guarantees the pColumn is a column and pValue is a constant. +** This routine has to do some additional checks before completing the +** insert. +*/ +static void constInsert( + WhereConst *pConst, /* The WhereConst into which we are inserting */ + Expr *pColumn, /* The COLUMN part of the constraint */ + Expr *pValue, /* The VALUE part of the constraint */ + Expr *pExpr /* Overall expression: COLUMN=VALUE or VALUE=COLUMN */ +){ + int i; + assert( pColumn->op==TK_COLUMN ); + assert( sqlite3ExprIsConstant(pValue) ); + + if( ExprHasProperty(pColumn, EP_FixedCol) ) return; + if( sqlite3ExprAffinity(pValue)!=0 ) return; + if( !sqlite3IsBinary(sqlite3ExprCompareCollSeq(pConst->pParse,pExpr)) ){ + return; + } + + /* 2018-10-25 ticket [cf5ed20f] + ** Make sure the same pColumn is not inserted more than once */ + for(i=0; inConst; i++){ + const Expr *pE2 = pConst->apExpr[i*2]; + assert( pE2->op==TK_COLUMN ); + if( pE2->iTable==pColumn->iTable + && pE2->iColumn==pColumn->iColumn + ){ + return; /* Already present. Return without doing anything. */ + } + } + if( sqlite3ExprAffinity(pColumn)==SQLITE_AFF_BLOB ){ + pConst->bHasAffBlob = 1; + } + + pConst->nConst++; + pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, + pConst->nConst*2*sizeof(Expr*)); + if( pConst->apExpr==0 ){ + pConst->nConst = 0; + }else{ + pConst->apExpr[pConst->nConst*2-2] = pColumn; + pConst->apExpr[pConst->nConst*2-1] = pValue; + } +} + +/* +** Find all terms of COLUMN=VALUE or VALUE=COLUMN in pExpr where VALUE +** is a constant expression and where the term must be true because it +** is part of the AND-connected terms of the expression. For each term +** found, add it to the pConst structure. +*/ +static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ + Expr *pRight, *pLeft; + if( NEVER(pExpr==0) ) return; + if( ExprHasProperty(pExpr, pConst->mExcludeOn) ){ + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + return; + } + if( pExpr->op==TK_AND ){ + findConstInWhere(pConst, pExpr->pRight); + findConstInWhere(pConst, pExpr->pLeft); + return; + } + if( pExpr->op!=TK_EQ ) return; + pRight = pExpr->pRight; + pLeft = pExpr->pLeft; + assert( pRight!=0 ); + assert( pLeft!=0 ); + if( pRight->op==TK_COLUMN && sqlite3ExprIsConstant(pLeft) ){ + constInsert(pConst,pRight,pLeft,pExpr); + } + if( pLeft->op==TK_COLUMN && sqlite3ExprIsConstant(pRight) ){ + constInsert(pConst,pLeft,pRight,pExpr); + } +} + +/* +** This is a helper function for Walker callback propagateConstantExprRewrite(). +** +** Argument pExpr is a candidate expression to be replaced by a value. If +** pExpr is equivalent to one of the columns named in pWalker->u.pConst, +** then overwrite it with the corresponding value. Except, do not do so +** if argument bIgnoreAffBlob is non-zero and the affinity of pExpr +** is SQLITE_AFF_BLOB. +*/ +static int propagateConstantExprRewriteOne( + WhereConst *pConst, + Expr *pExpr, + int bIgnoreAffBlob +){ + int i; + if( pConst->pOomFault[0] ) return WRC_Prune; + if( pExpr->op!=TK_COLUMN ) return WRC_Continue; + if( ExprHasProperty(pExpr, EP_FixedCol|pConst->mExcludeOn) ){ + testcase( ExprHasProperty(pExpr, EP_FixedCol) ); + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + return WRC_Continue; + } + for(i=0; inConst; i++){ + Expr *pColumn = pConst->apExpr[i*2]; + if( pColumn==pExpr ) continue; + if( pColumn->iTable!=pExpr->iTable ) continue; + if( pColumn->iColumn!=pExpr->iColumn ) continue; + if( bIgnoreAffBlob && sqlite3ExprAffinity(pColumn)==SQLITE_AFF_BLOB ){ + break; + } + /* A match is found. Add the EP_FixedCol property */ + pConst->nChng++; + ExprClearProperty(pExpr, EP_Leaf); + ExprSetProperty(pExpr, EP_FixedCol); + assert( pExpr->pLeft==0 ); + pExpr->pLeft = sqlite3ExprDup(pConst->pParse->db, pConst->apExpr[i*2+1], 0); + if( pConst->pParse->db->mallocFailed ) return WRC_Prune; + break; + } + return WRC_Prune; +} + +/* +** This is a Walker expression callback. pExpr is a node from the WHERE +** clause of a SELECT statement. This function examines pExpr to see if +** any substitutions based on the contents of pWalker->u.pConst should +** be made to pExpr or its immediate children. +** +** A substitution is made if: +** +** + pExpr is a column with an affinity other than BLOB that matches +** one of the columns in pWalker->u.pConst, or +** +** + pExpr is a binary comparison operator (=, <=, >=, <, >) that +** uses an affinity other than TEXT and one of its immediate +** children is a column that matches one of the columns in +** pWalker->u.pConst. +*/ +static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ + WhereConst *pConst = pWalker->u.pConst; + assert( TK_GT==TK_EQ+1 ); + assert( TK_LE==TK_EQ+2 ); + assert( TK_LT==TK_EQ+3 ); + assert( TK_GE==TK_EQ+4 ); + if( pConst->bHasAffBlob ){ + if( (pExpr->op>=TK_EQ && pExpr->op<=TK_GE) + || pExpr->op==TK_IS + ){ + propagateConstantExprRewriteOne(pConst, pExpr->pLeft, 0); + if( pConst->pOomFault[0] ) return WRC_Prune; + if( sqlite3ExprAffinity(pExpr->pLeft)!=SQLITE_AFF_TEXT ){ + propagateConstantExprRewriteOne(pConst, pExpr->pRight, 0); + } + } + } + return propagateConstantExprRewriteOne(pConst, pExpr, pConst->bHasAffBlob); +} + +/* +** The WHERE-clause constant propagation optimization. +** +** If the WHERE clause contains terms of the form COLUMN=CONSTANT or +** CONSTANT=COLUMN that are top-level AND-connected terms that are not +** part of a ON clause from a LEFT JOIN, then throughout the query +** replace all other occurrences of COLUMN with CONSTANT. +** +** For example, the query: +** +** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=t1.a AND t3.c=t2.b +** +** Is transformed into +** +** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=39 AND t3.c=39 +** +** Return true if any transformations where made and false if not. +** +** Implementation note: Constant propagation is tricky due to affinity +** and collating sequence interactions. Consider this example: +** +** CREATE TABLE t1(a INT,b TEXT); +** INSERT INTO t1 VALUES(123,'0123'); +** SELECT * FROM t1 WHERE a=123 AND b=a; +** SELECT * FROM t1 WHERE a=123 AND b=123; +** +** The two SELECT statements above should return different answers. b=a +** is alway true because the comparison uses numeric affinity, but b=123 +** is false because it uses text affinity and '0123' is not the same as '123'. +** To work around this, the expression tree is not actually changed from +** "b=a" to "b=123" but rather the "a" in "b=a" is tagged with EP_FixedCol +** and the "123" value is hung off of the pLeft pointer. Code generator +** routines know to generate the constant "123" instead of looking up the +** column value. Also, to avoid collation problems, this optimization is +** only attempted if the "a=123" term uses the default BINARY collation. +** +** 2021-05-25 forum post 6a06202608: Another troublesome case is... +** +** CREATE TABLE t1(x); +** INSERT INTO t1 VALUES(10.0); +** SELECT 1 FROM t1 WHERE x=10 AND x LIKE 10; +** +** The query should return no rows, because the t1.x value is '10.0' not '10' +** and '10.0' is not LIKE '10'. But if we are not careful, the first WHERE +** term "x=10" will cause the second WHERE term to become "10 LIKE 10", +** resulting in a false positive. To avoid this, constant propagation for +** columns with BLOB affinity is only allowed if the constant is used with +** operators ==, <=, <, >=, >, or IS in a way that will cause the correct +** type conversions to occur. See logic associated with the bHasAffBlob flag +** for details. +*/ +static int propagateConstants( + Parse *pParse, /* The parsing context */ + Select *p /* The query in which to propagate constants */ +){ + WhereConst x; + Walker w; + int nChng = 0; + x.pParse = pParse; + x.pOomFault = &pParse->db->mallocFailed; + do{ + x.nConst = 0; + x.nChng = 0; + x.apExpr = 0; + x.bHasAffBlob = 0; + if( ALWAYS(p->pSrc!=0) + && p->pSrc->nSrc>0 + && (p->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 + ){ + /* Do not propagate constants on any ON clause if there is a + ** RIGHT JOIN anywhere in the query */ + x.mExcludeOn = EP_InnerON | EP_OuterON; + }else{ + /* Do not propagate constants through the ON clause of a LEFT JOIN */ + x.mExcludeOn = EP_OuterON; + } + findConstInWhere(&x, p->pWhere); + if( x.nConst ){ + memset(&w, 0, sizeof(w)); + w.pParse = pParse; + w.xExprCallback = propagateConstantExprRewrite; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback2 = 0; + w.walkerDepth = 0; + w.u.pConst = &x; + sqlite3WalkExpr(&w, p->pWhere); + sqlite3DbFree(x.pParse->db, x.apExpr); + nChng += x.nChng; + } + }while( x.nChng ); + return nChng; +} + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +# if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** This function is called to determine whether or not it is safe to +** push WHERE clause expression pExpr down to FROM clause sub-query +** pSubq, which contains at least one window function. Return 1 +** if it is safe and the expression should be pushed down, or 0 +** otherwise. +** +** It is only safe to push the expression down if it consists only +** of constants and copies of expressions that appear in the PARTITION +** BY clause of all window function used by the sub-query. It is safe +** to filter out entire partitions, but not rows within partitions, as +** this may change the results of the window functions. +** +** At the time this function is called it is guaranteed that +** +** * the sub-query uses only one distinct window frame, and +** * that the window frame has a PARTITION BY clase. +*/ +static int pushDownWindowCheck(Parse *pParse, Select *pSubq, Expr *pExpr){ + assert( pSubq->pWin->pPartition ); + assert( (pSubq->selFlags & SF_MultiPart)==0 ); + assert( pSubq->pPrior==0 ); + return sqlite3ExprIsConstantOrGroupBy(pParse, pExpr, pSubq->pWin->pPartition); +} +# endif /* SQLITE_OMIT_WINDOWFUNC */ +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** Make copies of relevant WHERE clause terms of the outer query into +** the WHERE clause of subquery. Example: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1) WHERE x=5 AND y=10; +** +** Transformed into: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1 WHERE a=5 AND c-d=10) +** WHERE x=5 AND y=10; +** +** The hope is that the terms added to the inner query will make it more +** efficient. +** +** Do not attempt this optimization if: +** +** (1) (** This restriction was removed on 2017-09-29. We used to +** disallow this optimization for aggregate subqueries, but now +** it is allowed by putting the extra terms on the HAVING clause. +** The added HAVING clause is pointless if the subquery lacks +** a GROUP BY clause. But such a HAVING clause is also harmless +** so there does not appear to be any reason to add extra logic +** to suppress it. **) +** +** (2) The inner query is the recursive part of a common table expression. +** +** (3) The inner query has a LIMIT clause (since the changes to the WHERE +** clause would change the meaning of the LIMIT). +** +** (4) The inner query is the right operand of a LEFT JOIN and the +** expression to be pushed down does not come from the ON clause +** on that LEFT JOIN. +** +** (5) The WHERE clause expression originates in the ON or USING clause +** of a LEFT JOIN where iCursor is not the right-hand table of that +** left join. An example: +** +** SELECT * +** FROM (SELECT 1 AS a1 UNION ALL SELECT 2) AS aa +** JOIN (SELECT 1 AS b2 UNION ALL SELECT 2) AS bb ON (a1=b2) +** LEFT JOIN (SELECT 8 AS c3 UNION ALL SELECT 9) AS cc ON (b2=2); +** +** The correct answer is three rows: (1,1,NULL),(2,2,8),(2,2,9). +** But if the (b2=2) term were to be pushed down into the bb subquery, +** then the (1,1,NULL) row would be suppressed. +** +** (6) Window functions make things tricky as changes to the WHERE clause +** of the inner query could change the window over which window +** functions are calculated. Therefore, do not attempt the optimization +** if: +** +** (6a) The inner query uses multiple incompatible window partitions. +** +** (6b) The inner query is a compound and uses window-functions. +** +** (6c) The WHERE clause does not consist entirely of constants and +** copies of expressions found in the PARTITION BY clause of +** all window-functions used by the sub-query. It is safe to +** filter out entire partitions, as this does not change the +** window over which any window-function is calculated. +** +** (7) The inner query is a Common Table Expression (CTE) that should +** be materialized. (This restriction is implemented in the calling +** routine.) +** +** Return 0 if no changes are made and non-zero if one or more WHERE clause +** terms are duplicated into the subquery. +*/ +static int pushDownWhereTerms( + Parse *pParse, /* Parse context (for malloc() and error reporting) */ + Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ + Expr *pWhere, /* The WHERE clause of the outer query */ + SrcItem *pSrc /* The subquery term of the outer FROM clause */ +){ + Expr *pNew; + int nChng = 0; + if( pWhere==0 ) return 0; + if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ) return 0; + if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ) return 0; + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pSubq->pPrior ){ + Select *pSel; + for(pSel=pSubq; pSel; pSel=pSel->pPrior){ + if( pSel->pWin ) return 0; /* restriction (6b) */ + } + }else{ + if( pSubq->pWin && pSubq->pWin->pPartition==0 ) return 0; + } +#endif + +#ifdef SQLITE_DEBUG + /* Only the first term of a compound can have a WITH clause. But make + ** sure no other terms are marked SF_Recursive in case something changes + ** in the future. + */ + { + Select *pX; + for(pX=pSubq; pX; pX=pX->pPrior){ + assert( (pX->selFlags & (SF_Recursive))==0 ); + } + } +#endif + + if( pSubq->pLimit!=0 ){ + return 0; /* restriction (3) */ + } + while( pWhere->op==TK_AND ){ + nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrc); + pWhere = pWhere->pLeft; + } + +#if 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */ + if( isLeftJoin + && (ExprHasProperty(pWhere,EP_OuterON)==0 + || pWhere->w.iJoin!=iCursor) + ){ + return 0; /* restriction (4) */ + } + if( ExprHasProperty(pWhere,EP_OuterON) + && pWhere->w.iJoin!=iCursor + ){ + return 0; /* restriction (5) */ + } +#endif + + if( sqlite3ExprIsTableConstraint(pWhere, pSrc) ){ + nChng++; + pSubq->selFlags |= SF_PushDown; + while( pSubq ){ + SubstContext x; + pNew = sqlite3ExprDup(pParse->db, pWhere, 0); + unsetJoinExpr(pNew, -1, 1); + x.pParse = pParse; + x.iTable = pSrc->iCursor; + x.iNewTable = pSrc->iCursor; + x.isOuterJoin = 0; + x.pEList = pSubq->pEList; + pNew = substExpr(&x, pNew); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pSubq->pWin && 0==pushDownWindowCheck(pParse, pSubq, pNew) ){ + /* Restriction 6c has prevented push-down in this case */ + sqlite3ExprDelete(pParse->db, pNew); + nChng--; + break; + } +#endif + if( pSubq->selFlags & SF_Aggregate ){ + pSubq->pHaving = sqlite3ExprAnd(pParse, pSubq->pHaving, pNew); + }else{ + pSubq->pWhere = sqlite3ExprAnd(pParse, pSubq->pWhere, pNew); + } + pSubq = pSubq->pPrior; + } + } + return nChng; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +/* +** The pFunc is the only aggregate function in the query. Check to see +** if the query is a candidate for the min/max optimization. +** +** If the query is a candidate for the min/max optimization, then set +** *ppMinMax to be an ORDER BY clause to be used for the optimization +** and return either WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX depending on +** whether pFunc is a min() or max() function. +** +** If the query is not a candidate for the min/max optimization, return +** WHERE_ORDERBY_NORMAL (which must be zero). +** +** This routine must be called after aggregate functions have been +** located but before their arguments have been subjected to aggregate +** analysis. +*/ +static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ + int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ + ExprList *pEList; /* Arguments to agg function */ + const char *zFunc; /* Name of aggregate function pFunc */ + ExprList *pOrderBy; + u8 sortFlags = 0; + + assert( *ppMinMax==0 ); + assert( pFunc->op==TK_AGG_FUNCTION ); + assert( !IsWindowFunc(pFunc) ); + assert( ExprUseXList(pFunc) ); + pEList = pFunc->x.pList; + if( pEList==0 + || pEList->nExpr!=1 + || ExprHasProperty(pFunc, EP_WinFunc) + || OptimizationDisabled(db, SQLITE_MinMaxOpt) + ){ + return eRet; + } + assert( !ExprHasProperty(pFunc, EP_IntValue) ); + zFunc = pFunc->u.zToken; + if( sqlite3StrICmp(zFunc, "min")==0 ){ + eRet = WHERE_ORDERBY_MIN; + if( sqlite3ExprCanBeNull(pEList->a[0].pExpr) ){ + sortFlags = KEYINFO_ORDER_BIGNULL; + } + }else if( sqlite3StrICmp(zFunc, "max")==0 ){ + eRet = WHERE_ORDERBY_MAX; + sortFlags = KEYINFO_ORDER_DESC; + }else{ + return eRet; + } + *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); + assert( pOrderBy!=0 || db->mallocFailed ); + if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags; + return eRet; +} + +/* +** The select statement passed as the first argument is an aggregate query. +** The second argument is the associated aggregate-info object. This +** function tests if the SELECT is of the form: +** +** SELECT count(*) FROM +** +** where table is a database table, not a sub-select or view. If the query +** does match this pattern, then a pointer to the Table object representing +** is returned. Otherwise, NULL is returned. +** +** This routine checks to see if it is safe to use the count optimization. +** A correct answer is still obtained (though perhaps more slowly) if +** this routine returns NULL when it could have returned a table pointer. +** But returning the pointer when NULL should have been returned can +** result in incorrect answers and/or crashes. So, when in doubt, return NULL. +*/ +static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ + Table *pTab; + Expr *pExpr; + + assert( !p->pGroupBy ); + + if( p->pWhere + || p->pEList->nExpr!=1 + || p->pSrc->nSrc!=1 + || p->pSrc->a[0].pSelect + || pAggInfo->nFunc!=1 + ){ + return 0; + } + pTab = p->pSrc->a[0].pTab; + assert( pTab!=0 ); + assert( !IsView(pTab) ); + if( !IsOrdinaryTable(pTab) ) return 0; + pExpr = p->pEList->a[0].pExpr; + assert( pExpr!=0 ); + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; + if( pExpr->pAggInfo!=pAggInfo ) return 0; + if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; + assert( pAggInfo->aFunc[0].pFExpr==pExpr ); + testcase( ExprHasProperty(pExpr, EP_Distinct) ); + testcase( ExprHasProperty(pExpr, EP_WinFunc) ); + if( ExprHasProperty(pExpr, EP_Distinct|EP_WinFunc) ) return 0; + + return pTab; +} + +/* +** If the source-list item passed as an argument was augmented with an +** INDEXED BY clause, then try to locate the specified index. If there +** was such a clause and the named index cannot be found, return +** SQLITE_ERROR and leave an error in pParse. Otherwise, populate +** pFrom->pIndex and return SQLITE_OK. +*/ +SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, SrcItem *pFrom){ + Table *pTab = pFrom->pTab; + char *zIndexedBy = pFrom->u1.zIndexedBy; + Index *pIdx; + assert( pTab!=0 ); + assert( pFrom->fg.isIndexedBy!=0 ); + + for(pIdx=pTab->pIndex; + pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); + pIdx=pIdx->pNext + ); + if( !pIdx ){ + sqlite3ErrorMsg(pParse, "no such index: %s", zIndexedBy, 0); + pParse->checkSchema = 1; + return SQLITE_ERROR; + } + assert( pFrom->fg.isCte==0 ); + pFrom->u2.pIBIndex = pIdx; + return SQLITE_OK; +} + +/* +** Detect compound SELECT statements that use an ORDER BY clause with +** an alternative collating sequence. +** +** SELECT ... FROM t1 EXCEPT SELECT ... FROM t2 ORDER BY .. COLLATE ... +** +** These are rewritten as a subquery: +** +** SELECT * FROM (SELECT ... FROM t1 EXCEPT SELECT ... FROM t2) +** ORDER BY ... COLLATE ... +** +** This transformation is necessary because the multiSelectOrderBy() routine +** above that generates the code for a compound SELECT with an ORDER BY clause +** uses a merge algorithm that requires the same collating sequence on the +** result columns as on the ORDER BY clause. See ticket +** http://www.sqlite.org/src/info/6709574d2a +** +** This transformation is only needed for EXCEPT, INTERSECT, and UNION. +** The UNION ALL operator works fine with multiSelectOrderBy() even when +** there are COLLATE terms in the ORDER BY. +*/ +static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ + int i; + Select *pNew; + Select *pX; + sqlite3 *db; + struct ExprList_item *a; + SrcList *pNewSrc; + Parse *pParse; + Token dummy; + + if( p->pPrior==0 ) return WRC_Continue; + if( p->pOrderBy==0 ) return WRC_Continue; + for(pX=p; pX && (pX->op==TK_ALL || pX->op==TK_SELECT); pX=pX->pPrior){} + if( pX==0 ) return WRC_Continue; + a = p->pOrderBy->a; +#ifndef SQLITE_OMIT_WINDOWFUNC + /* If iOrderByCol is already non-zero, then it has already been matched + ** to a result column of the SELECT statement. This occurs when the + ** SELECT is rewritten for window-functions processing and then passed + ** to sqlite3SelectPrep() and similar a second time. The rewriting done + ** by this function is not required in this case. */ + if( a[0].u.x.iOrderByCol ) return WRC_Continue; +#endif + for(i=p->pOrderBy->nExpr-1; i>=0; i--){ + if( a[i].pExpr->flags & EP_Collate ) break; + } + if( i<0 ) return WRC_Continue; + + /* If we reach this point, that means the transformation is required. */ + + pParse = pWalker->pParse; + db = pParse->db; + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); + if( pNew==0 ) return WRC_Abort; + memset(&dummy, 0, sizeof(dummy)); + pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0); + if( pNewSrc==0 ) return WRC_Abort; + *pNew = *p; + p->pSrc = pNewSrc; + p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0)); + p->op = TK_SELECT; + p->pWhere = 0; + pNew->pGroupBy = 0; + pNew->pHaving = 0; + pNew->pOrderBy = 0; + p->pPrior = 0; + p->pNext = 0; + p->pWith = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + p->pWinDefn = 0; +#endif + p->selFlags &= ~SF_Compound; + assert( (p->selFlags & SF_Converted)==0 ); + p->selFlags |= SF_Converted; + assert( pNew->pPrior!=0 ); + pNew->pPrior->pNext = pNew; + pNew->pLimit = 0; + return WRC_Continue; +} + +/* +** Check to see if the FROM clause term pFrom has table-valued function +** arguments. If it does, leave an error message in pParse and return +** non-zero, since pFrom is not allowed to be a table-valued function. +*/ +static int cannotBeFunction(Parse *pParse, SrcItem *pFrom){ + if( pFrom->fg.isTabFunc ){ + sqlite3ErrorMsg(pParse, "'%s' is not a function", pFrom->zName); + return 1; + } + return 0; +} + +#ifndef SQLITE_OMIT_CTE +/* +** Argument pWith (which may be NULL) points to a linked list of nested +** WITH contexts, from inner to outermost. If the table identified by +** FROM clause element pItem is really a common-table-expression (CTE) +** then return a pointer to the CTE definition for that table. Otherwise +** return NULL. +** +** If a non-NULL value is returned, set *ppContext to point to the With +** object that the returned CTE belongs to. +*/ +static struct Cte *searchWith( + With *pWith, /* Current innermost WITH clause */ + SrcItem *pItem, /* FROM clause element to resolve */ + With **ppContext /* OUT: WITH clause return value belongs to */ +){ + const char *zName = pItem->zName; + With *p; + assert( pItem->zDatabase==0 ); + assert( zName!=0 ); + for(p=pWith; p; p=p->pOuter){ + int i; + for(i=0; inCte; i++){ + if( sqlite3StrICmp(zName, p->a[i].zName)==0 ){ + *ppContext = p; + return &p->a[i]; + } + } + if( p->bView ) break; + } + return 0; +} + +/* The code generator maintains a stack of active WITH clauses +** with the inner-most WITH clause being at the top of the stack. +** +** This routine pushes the WITH clause passed as the second argument +** onto the top of the stack. If argument bFree is true, then this +** WITH clause will never be popped from the stack but should instead +** be freed along with the Parse object. In other cases, when +** bFree==0, the With object will be freed along with the SELECT +** statement with which it is associated. +** +** This routine returns a copy of pWith. Or, if bFree is true and +** the pWith object is destroyed immediately due to an OOM condition, +** then this routine return NULL. +** +** If bFree is true, do not continue to use the pWith pointer after +** calling this routine, Instead, use only the return value. +*/ +SQLITE_PRIVATE With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ + if( pWith ){ + if( bFree ){ + pWith = (With*)sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3WithDelete, + pWith); + if( pWith==0 ) return 0; + } + if( pParse->nErr==0 ){ + assert( pParse->pWith!=pWith ); + pWith->pOuter = pParse->pWith; + pParse->pWith = pWith; + } + } + return pWith; +} + +/* +** This function checks if argument pFrom refers to a CTE declared by +** a WITH clause on the stack currently maintained by the parser (on the +** pParse->pWith linked list). And if currently processing a CTE +** CTE expression, through routine checks to see if the reference is +** a recursive reference to the CTE. +** +** If pFrom matches a CTE according to either of these two above, pFrom->pTab +** and other fields are populated accordingly. +** +** Return 0 if no match is found. +** Return 1 if a match is found. +** Return 2 if an error condition is detected. +*/ +static int resolveFromTermToCte( + Parse *pParse, /* The parsing context */ + Walker *pWalker, /* Current tree walker */ + SrcItem *pFrom /* The FROM clause term to check */ +){ + Cte *pCte; /* Matched CTE (or NULL if no match) */ + With *pWith; /* The matching WITH */ + + assert( pFrom->pTab==0 ); + if( pParse->pWith==0 ){ + /* There are no WITH clauses in the stack. No match is possible */ + return 0; + } + if( pParse->nErr ){ + /* Prior errors might have left pParse->pWith in a goofy state, so + ** go no further. */ + return 0; + } + if( pFrom->zDatabase!=0 ){ + /* The FROM term contains a schema qualifier (ex: main.t1) and so + ** it cannot possibly be a CTE reference. */ + return 0; + } + if( pFrom->fg.notCte ){ + /* The FROM term is specifically excluded from matching a CTE. + ** (1) It is part of a trigger that used to have zDatabase but had + ** zDatabase removed by sqlite3FixTriggerStep(). + ** (2) This is the first term in the FROM clause of an UPDATE. + */ + return 0; + } + pCte = searchWith(pParse->pWith, pFrom, &pWith); + if( pCte ){ + sqlite3 *db = pParse->db; + Table *pTab; + ExprList *pEList; + Select *pSel; + Select *pLeft; /* Left-most SELECT statement */ + Select *pRecTerm; /* Left-most recursive term */ + int bMayRecursive; /* True if compound joined by UNION [ALL] */ + With *pSavedWith; /* Initial value of pParse->pWith */ + int iRecTab = -1; /* Cursor for recursive table */ + CteUse *pCteUse; + + /* If pCte->zCteErr is non-NULL at this point, then this is an illegal + ** recursive reference to CTE pCte. Leave an error in pParse and return + ** early. If pCte->zCteErr is NULL, then this is not a recursive reference. + ** In this case, proceed. */ + if( pCte->zCteErr ){ + sqlite3ErrorMsg(pParse, pCte->zCteErr, pCte->zName); + return 2; + } + if( cannotBeFunction(pParse, pFrom) ) return 2; + + assert( pFrom->pTab==0 ); + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return 2; + pCteUse = pCte->pUse; + if( pCteUse==0 ){ + pCte->pUse = pCteUse = sqlite3DbMallocZero(db, sizeof(pCteUse[0])); + if( pCteUse==0 + || sqlite3ParserAddCleanup(pParse,sqlite3DbFree,pCteUse)==0 + ){ + sqlite3DbFree(db, pTab); + return 2; + } + pCteUse->eM10d = pCte->eM10d; + } + pFrom->pTab = pTab; + pTab->nTabRef = 1; + pTab->zName = sqlite3DbStrDup(db, pCte->zName); + pTab->iPKey = -1; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; + pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); + if( db->mallocFailed ) return 2; + pFrom->pSelect->selFlags |= SF_CopyCte; + assert( pFrom->pSelect ); + if( pFrom->fg.isIndexedBy ){ + sqlite3ErrorMsg(pParse, "no such index: \"%s\"", pFrom->u1.zIndexedBy); + return 2; + } + pFrom->fg.isCte = 1; + pFrom->u2.pCteUse = pCteUse; + pCteUse->nUse++; + if( pCteUse->nUse>=2 && pCteUse->eM10d==M10d_Any ){ + pCteUse->eM10d = M10d_Yes; + } + + /* Check if this is a recursive CTE. */ + pRecTerm = pSel = pFrom->pSelect; + bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION ); + while( bMayRecursive && pRecTerm->op==pSel->op ){ + int i; + SrcList *pSrc = pRecTerm->pSrc; + assert( pRecTerm->pPrior!=0 ); + for(i=0; inSrc; i++){ + SrcItem *pItem = &pSrc->a[i]; + if( pItem->zDatabase==0 + && pItem->zName!=0 + && 0==sqlite3StrICmp(pItem->zName, pCte->zName) + ){ + pItem->pTab = pTab; + pTab->nTabRef++; + pItem->fg.isRecursive = 1; + if( pRecTerm->selFlags & SF_Recursive ){ + sqlite3ErrorMsg(pParse, + "multiple references to recursive table: %s", pCte->zName + ); + return 2; + } + pRecTerm->selFlags |= SF_Recursive; + if( iRecTab<0 ) iRecTab = pParse->nTab++; + pItem->iCursor = iRecTab; + } + } + if( (pRecTerm->selFlags & SF_Recursive)==0 ) break; + pRecTerm = pRecTerm->pPrior; + } + + pCte->zCteErr = "circular reference: %s"; + pSavedWith = pParse->pWith; + pParse->pWith = pWith; + if( pSel->selFlags & SF_Recursive ){ + int rc; + assert( pRecTerm!=0 ); + assert( (pRecTerm->selFlags & SF_Recursive)==0 ); + assert( pRecTerm->pNext!=0 ); + assert( (pRecTerm->pNext->selFlags & SF_Recursive)!=0 ); + assert( pRecTerm->pWith==0 ); + pRecTerm->pWith = pSel->pWith; + rc = sqlite3WalkSelect(pWalker, pRecTerm); + pRecTerm->pWith = 0; + if( rc ){ + pParse->pWith = pSavedWith; + return 2; + } + }else{ + if( sqlite3WalkSelect(pWalker, pSel) ){ + pParse->pWith = pSavedWith; + return 2; + } + } + pParse->pWith = pWith; + + for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); + pEList = pLeft->pEList; + if( pCte->pCols ){ + if( pEList && pEList->nExpr!=pCte->pCols->nExpr ){ + sqlite3ErrorMsg(pParse, "table %s has %d values for %d columns", + pCte->zName, pEList->nExpr, pCte->pCols->nExpr + ); + pParse->pWith = pSavedWith; + return 2; + } + pEList = pCte->pCols; + } + + sqlite3ColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); + if( bMayRecursive ){ + if( pSel->selFlags & SF_Recursive ){ + pCte->zCteErr = "multiple recursive references: %s"; + }else{ + pCte->zCteErr = "recursive reference in a subquery: %s"; + } + sqlite3WalkSelect(pWalker, pSel); + } + pCte->zCteErr = 0; + pParse->pWith = pSavedWith; + return 1; /* Success */ + } + return 0; /* No match */ +} +#endif + +#ifndef SQLITE_OMIT_CTE +/* +** If the SELECT passed as the second argument has an associated WITH +** clause, pop it from the stack stored as part of the Parse object. +** +** This function is used as the xSelectCallback2() callback by +** sqlite3SelectExpand() when walking a SELECT tree to resolve table +** names and other FROM clause elements. +*/ +SQLITE_PRIVATE void sqlite3SelectPopWith(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + if( OK_IF_ALWAYS_TRUE(pParse->pWith) && p->pPrior==0 ){ + With *pWith = findRightmost(p)->pWith; + if( pWith!=0 ){ + assert( pParse->pWith==pWith || pParse->nErr ); + pParse->pWith = pWith->pOuter; + } + } +} +#endif + +/* +** The SrcList_item structure passed as the second argument represents a +** sub-query in the FROM clause of a SELECT statement. This function +** allocates and populates the SrcList_item.pTab object. If successful, +** SQLITE_OK is returned. Otherwise, if an OOM error is encountered, +** SQLITE_NOMEM. +*/ +SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ + Select *pSel = pFrom->pSelect; + Table *pTab; + + assert( pSel ); + pFrom->pTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table)); + if( pTab==0 ) return SQLITE_NOMEM; + pTab->nTabRef = 1; + if( pFrom->zAlias ){ + pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias); + }else{ + pTab->zName = sqlite3MPrintf(pParse->db, "%!S", pFrom); + } + while( pSel->pPrior ){ pSel = pSel->pPrior; } + sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); + pTab->iPKey = -1; + pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); +#ifndef SQLITE_ALLOW_ROWID_IN_VIEW + /* The usual case - do not allow ROWID on a subquery */ + pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; +#else + pTab->tabFlags |= TF_Ephemeral; /* Legacy compatibility mode */ +#endif + return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; +} + + +/* +** Check the N SrcItem objects to the right of pBase. (N might be zero!) +** If any of those SrcItem objects have a USING clause containing zName +** then return true. +** +** If N is zero, or none of the N SrcItem objects to the right of pBase +** contains a USING clause, or if none of the USING clauses contain zName, +** then return false. +*/ +static int inAnyUsingClause( + const char *zName, /* Name we are looking for */ + SrcItem *pBase, /* The base SrcItem. Looking at pBase[1] and following */ + int N /* How many SrcItems to check */ +){ + while( N>0 ){ + N--; + pBase++; + if( pBase->fg.isUsing==0 ) continue; + if( NEVER(pBase->u3.pUsing==0) ) continue; + if( sqlite3IdListIndex(pBase->u3.pUsing, zName)>=0 ) return 1; + } + return 0; +} + + +/* +** This routine is a Walker callback for "expanding" a SELECT statement. +** "Expanding" means to do the following: +** +** (1) Make sure VDBE cursor numbers have been assigned to every +** element of the FROM clause. +** +** (2) Fill in the pTabList->a[].pTab fields in the SrcList that +** defines FROM clause. When views appear in the FROM clause, +** fill pTabList->a[].pSelect with a copy of the SELECT statement +** that implements the view. A copy is made of the view's SELECT +** statement so that we can freely modify or delete that statement +** without worrying about messing up the persistent representation +** of the view. +** +** (3) Add terms to the WHERE clause to accommodate the NATURAL keyword +** on joins and the ON and USING clause of joins. +** +** (4) Scan the list of columns in the result set (pEList) looking +** for instances of the "*" operator or the TABLE.* operator. +** If found, expand each "*" to be every column in every table +** and TABLE.* to be every column in TABLE. +** +*/ +static int selectExpander(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i, j, k, rc; + SrcList *pTabList; + ExprList *pEList; + SrcItem *pFrom; + sqlite3 *db = pParse->db; + Expr *pE, *pRight, *pExpr; + u16 selFlags = p->selFlags; + u32 elistFlags = 0; + + p->selFlags |= SF_Expanded; + if( db->mallocFailed ){ + return WRC_Abort; + } + assert( p->pSrc!=0 ); + if( (selFlags & SF_Expanded)!=0 ){ + return WRC_Prune; + } + if( pWalker->eCode ){ + /* Renumber selId because it has been copied from a view */ + p->selId = ++pParse->nSelect; + } + pTabList = p->pSrc; + pEList = p->pEList; + if( pParse->pWith && (p->selFlags & SF_View) ){ + if( p->pWith==0 ){ + p->pWith = (With*)sqlite3DbMallocZero(db, sizeof(With)); + if( p->pWith==0 ){ + return WRC_Abort; + } + } + p->pWith->bView = 1; + } + sqlite3WithPush(pParse, p->pWith, 0); + + /* Make sure cursor numbers have been assigned to all entries in + ** the FROM clause of the SELECT statement. + */ + sqlite3SrcListAssignCursors(pParse, pTabList); + + /* Look up every table named in the FROM clause of the select. If + ** an entry of the FROM clause is a subquery instead of a table or view, + ** then create a transient table structure to describe the subquery. + */ + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab; + assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); + if( pFrom->pTab ) continue; + assert( pFrom->fg.isRecursive==0 ); + if( pFrom->zName==0 ){ +#ifndef SQLITE_OMIT_SUBQUERY + Select *pSel = pFrom->pSelect; + /* A sub-query in the FROM clause of a SELECT */ + assert( pSel!=0 ); + assert( pFrom->pTab==0 ); + if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort; + if( sqlite3ExpandSubquery(pParse, pFrom) ) return WRC_Abort; +#endif +#ifndef SQLITE_OMIT_CTE + }else if( (rc = resolveFromTermToCte(pParse, pWalker, pFrom))!=0 ){ + if( rc>1 ) return WRC_Abort; + pTab = pFrom->pTab; + assert( pTab!=0 ); +#endif + }else{ + /* An ordinary table or view name in the FROM clause */ + assert( pFrom->pTab==0 ); + pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); + if( pTab==0 ) return WRC_Abort; + if( pTab->nTabRef>=0xffff ){ + sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535", + pTab->zName); + pFrom->pTab = 0; + return WRC_Abort; + } + pTab->nTabRef++; + if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){ + return WRC_Abort; + } +#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) + if( !IsOrdinaryTable(pTab) ){ + i16 nCol; + u8 eCodeOrig = pWalker->eCode; + if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; + assert( pFrom->pSelect==0 ); + if( IsView(pTab) ){ + if( (db->flags & SQLITE_EnableView)==0 + && pTab->pSchema!=db->aDb[1].pSchema + ){ + sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", + pTab->zName); + } + pFrom->pSelect = sqlite3SelectDup(db, pTab->u.view.pSelect, 0); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + else if( ALWAYS(IsVirtual(pTab)) + && pFrom->fg.fromDDL + && ALWAYS(pTab->u.vtab.p!=0) + && pTab->u.vtab.p->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) + ){ + sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"", + pTab->zName); + } + assert( SQLITE_VTABRISK_Normal==1 && SQLITE_VTABRISK_High==2 ); +#endif + nCol = pTab->nCol; + pTab->nCol = -1; + pWalker->eCode = 1; /* Turn on Select.selId renumbering */ + sqlite3WalkSelect(pWalker, pFrom->pSelect); + pWalker->eCode = eCodeOrig; + pTab->nCol = nCol; + } +#endif + } + + /* Locate the index named by the INDEXED BY clause, if any. */ + if( pFrom->fg.isIndexedBy && sqlite3IndexedByLookup(pParse, pFrom) ){ + return WRC_Abort; + } + } + + /* Process NATURAL keywords, and ON and USING clauses of joins. + */ + assert( db->mallocFailed==0 || pParse->nErr!=0 ); + if( pParse->nErr || sqlite3ProcessJoin(pParse, p) ){ + return WRC_Abort; + } + + /* For every "*" that occurs in the column list, insert the names of + ** all columns in all tables. And for every TABLE.* insert the names + ** of all columns in TABLE. The parser inserted a special expression + ** with the TK_ASTERISK operator for each "*" that it found in the column + ** list. The following code just has to locate the TK_ASTERISK + ** expressions and expand each one to the list of all columns in + ** all tables. + ** + ** The first loop just checks to see if there are any "*" operators + ** that need expanding. + */ + for(k=0; knExpr; k++){ + pE = pEList->a[k].pExpr; + if( pE->op==TK_ASTERISK ) break; + assert( pE->op!=TK_DOT || pE->pRight!=0 ); + assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) ); + if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break; + elistFlags |= pE->flags; + } + if( knExpr ){ + /* + ** If we get here it means the result set contains one or more "*" + ** operators that need to be expanded. Loop through each expression + ** in the result set and expand them one by one. + */ + struct ExprList_item *a = pEList->a; + ExprList *pNew = 0; + int flags = pParse->db->flags; + int longNames = (flags & SQLITE_FullColNames)!=0 + && (flags & SQLITE_ShortColNames)==0; + + for(k=0; knExpr; k++){ + pE = a[k].pExpr; + elistFlags |= pE->flags; + pRight = pE->pRight; + assert( pE->op!=TK_DOT || pRight!=0 ); + if( pE->op!=TK_ASTERISK + && (pE->op!=TK_DOT || pRight->op!=TK_ASTERISK) + ){ + /* This particular expression does not need to be expanded. + */ + pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); + if( pNew ){ + pNew->a[pNew->nExpr-1].zEName = a[k].zEName; + pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName; + a[k].zEName = 0; + } + a[k].pExpr = 0; + }else{ + /* This expression is a "*" or a "TABLE.*" and needs to be + ** expanded. */ + int tableSeen = 0; /* Set to 1 when TABLE matches */ + char *zTName = 0; /* text of name of TABLE */ + if( pE->op==TK_DOT ){ + assert( pE->pLeft!=0 ); + assert( !ExprHasProperty(pE->pLeft, EP_IntValue) ); + zTName = pE->pLeft->u.zToken; + } + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; /* Table for this data source */ + ExprList *pNestedFrom; /* Result-set of a nested FROM clause */ + char *zTabName; /* AS name for this data source */ + const char *zSchemaName = 0; /* Schema name for this data source */ + int iDb; /* Schema index for this data src */ + IdList *pUsing; /* USING clause for pFrom[1] */ + + if( (zTabName = pFrom->zAlias)==0 ){ + zTabName = pTab->zName; + } + if( db->mallocFailed ) break; + assert( (int)pFrom->fg.isNestedFrom == IsNestedFrom(pFrom->pSelect) ); + if( pFrom->fg.isNestedFrom ){ + assert( pFrom->pSelect!=0 ); + pNestedFrom = pFrom->pSelect->pEList; + assert( pNestedFrom!=0 ); + assert( pNestedFrom->nExpr==pTab->nCol ); + }else{ + if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ + continue; + } + pNestedFrom = 0; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; + } + if( i+1nSrc + && pFrom[1].fg.isUsing + && (selFlags & SF_NestedFrom)!=0 + ){ + int ii; + pUsing = pFrom[1].u3.pUsing; + for(ii=0; iinId; ii++){ + const char *zUName = pUsing->a[ii].zName; + pRight = sqlite3Expr(db, TK_ID, zUName); + pNew = sqlite3ExprListAppend(pParse, pNew, pRight); + if( pNew ){ + struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + assert( pX->zEName==0 ); + pX->zEName = sqlite3MPrintf(db,"..%s", zUName); + pX->fg.eEName = ENAME_TAB; + pX->fg.bUsingTerm = 1; + } + } + }else{ + pUsing = 0; + } + for(j=0; jnCol; j++){ + char *zName = pTab->aCol[j].zCnName; + struct ExprList_item *pX; /* Newly added ExprList term */ + + assert( zName ); + if( zTName + && pNestedFrom + && sqlite3MatchEName(&pNestedFrom->a[j], 0, zTName, 0)==0 + ){ + continue; + } + + /* If a column is marked as 'hidden', omit it from the expanded + ** result-set list unless the SELECT has the SF_IncludeHidden + ** bit set. + */ + if( (p->selFlags & SF_IncludeHidden)==0 + && IsHiddenColumn(&pTab->aCol[j]) + ){ + continue; + } + if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + && zTName==0 + && (selFlags & (SF_NestedFrom))==0 + ){ + continue; + } + tableSeen = 1; + + if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){ + if( pFrom->fg.isUsing + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0 + ){ + /* In a join with a USING clause, omit columns in the + ** using clause from the table on the right. */ + continue; + } + } + pRight = sqlite3Expr(db, TK_ID, zName); + if( (pTabList->nSrc>1 + && ( (pFrom->fg.jointype & JT_LTORJ)==0 + || (selFlags & SF_NestedFrom)!=0 + || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) + ) + ) + || IN_RENAME_OBJECT + ){ + Expr *pLeft; + pLeft = sqlite3Expr(db, TK_ID, zTabName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + if( IN_RENAME_OBJECT && pE->pLeft ){ + sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft); + } + if( zSchemaName ){ + pLeft = sqlite3Expr(db, TK_ID, zSchemaName); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); + } + }else{ + pExpr = pRight; + } + pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); + if( pNew==0 ){ + break; /* OOM */ + } + pX = &pNew->a[pNew->nExpr-1]; + assert( pX->zEName==0 ); + if( (selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ + if( pNestedFrom ){ + pX->zEName = sqlite3DbStrDup(db, pNestedFrom->a[j].zEName); + testcase( pX->zEName==0 ); + }else{ + pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", + zSchemaName, zTabName, zName); + testcase( pX->zEName==0 ); + } + pX->fg.eEName = ENAME_TAB; + if( (pFrom->fg.isUsing + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0) + || (pUsing && sqlite3IdListIndex(pUsing, zName)>=0) + || (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + ){ + pX->fg.bNoExpand = 1; + } + }else if( longNames ){ + pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); + pX->fg.eEName = ENAME_NAME; + }else{ + pX->zEName = sqlite3DbStrDup(db, zName); + pX->fg.eEName = ENAME_NAME; + } + } + } + if( !tableSeen ){ + if( zTName ){ + sqlite3ErrorMsg(pParse, "no such table: %s", zTName); + }else{ + sqlite3ErrorMsg(pParse, "no tables specified"); + } + } + } + } + sqlite3ExprListDelete(db, pEList); + p->pEList = pNew; + } + if( p->pEList ){ + if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns in result set"); + return WRC_Abort; + } + if( (elistFlags & (EP_HasFunc|EP_Subquery))!=0 ){ + p->selFlags |= SF_ComplexResult; + } + } +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After result-set wildcard expansion:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + return WRC_Continue; +} + +#if SQLITE_DEBUG +/* +** Always assert. This xSelectCallback2 implementation proves that the +** xSelectCallback2 is never invoked. +*/ +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + assert( 0 ); +} +#endif +/* +** This routine "expands" a SELECT statement and all of its subqueries. +** For additional information on what it means to "expand" a SELECT +** statement, see the comment on the selectExpand worker callback above. +** +** Expanding a SELECT statement is the first step in processing a +** SELECT statement. The SELECT statement must be expanded before +** name resolution is performed. +** +** If anything goes wrong, an error message is written into pParse. +** The calling function can detect the problem by looking at pParse->nErr +** and/or pParse->db->mallocFailed. +*/ +static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ + Walker w; + w.xExprCallback = sqlite3ExprWalkNoop; + w.pParse = pParse; + if( OK_IF_ALWAYS_TRUE(pParse->hasCompound) ){ + w.xSelectCallback = convertCompoundSelectToSubquery; + w.xSelectCallback2 = 0; + sqlite3WalkSelect(&w, pSelect); + } + w.xSelectCallback = selectExpander; + w.xSelectCallback2 = sqlite3SelectPopWith; + w.eCode = 0; + sqlite3WalkSelect(&w, pSelect); +} + + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo() +** interface. +** +** For each FROM-clause subquery, add Column.zType and Column.zColl +** information to the Table structure that represents the result set +** of that subquery. +** +** The Table structure that represents the result set was constructed +** by selectExpander() but the type and collation information was omitted +** at that point because identifiers had not yet been resolved. This +** routine is called after identifier resolution. +*/ +static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ + Parse *pParse; + int i; + SrcList *pTabList; + SrcItem *pFrom; + + assert( p->selFlags & SF_Resolved ); + if( p->selFlags & SF_HasTypeInfo ) return; + p->selFlags |= SF_HasTypeInfo; + pParse = pWalker->pParse; + pTabList = p->pSrc; + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + assert( pTab!=0 ); + if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ + /* A sub-query in the FROM clause of a SELECT */ + Select *pSel = pFrom->pSelect; + if( pSel ){ + while( pSel->pPrior ) pSel = pSel->pPrior; + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, + SQLITE_AFF_NONE); + } + } + } +} +#endif + + +/* +** This routine adds datatype and collating sequence information to +** the Table structures of all FROM-clause subqueries in a +** SELECT statement. +** +** Use this routine after name resolution. +*/ +static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ +#ifndef SQLITE_OMIT_SUBQUERY + Walker w; + w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback2 = selectAddSubqueryTypeInfo; + w.xExprCallback = sqlite3ExprWalkNoop; + w.pParse = pParse; + sqlite3WalkSelect(&w, pSelect); +#endif +} + + +/* +** This routine sets up a SELECT statement for processing. The +** following is accomplished: +** +** * VDBE Cursor numbers are assigned to all FROM-clause terms. +** * Ephemeral Table objects are created for all FROM-clause subqueries. +** * ON and USING clauses are shifted into WHERE statements +** * Wildcards "*" and "TABLE.*" in result sets are expanded. +** * Identifiers in expression are matched to tables. +** +** This routine acts recursively on all subqueries within the SELECT. +*/ +SQLITE_PRIVATE void sqlite3SelectPrep( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + NameContext *pOuterNC /* Name context for container */ +){ + assert( p!=0 || pParse->db->mallocFailed ); + assert( pParse->db->pParse==pParse ); + if( pParse->db->mallocFailed ) return; + if( p->selFlags & SF_HasTypeInfo ) return; + sqlite3SelectExpand(pParse, p); + if( pParse->nErr ) return; + sqlite3ResolveSelectNames(pParse, p, pOuterNC); + if( pParse->nErr ) return; + sqlite3SelectAddTypeInfo(pParse, p); +} + +/* +** Reset the aggregate accumulator. +** +** The aggregate accumulator is a set of memory cells that hold +** intermediate results while calculating an aggregate. This +** routine generates code that stores NULLs in all of those memory +** cells. +*/ +static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pFunc; + int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + assert( pParse->db->pParse==pParse ); + assert( pParse->db->mallocFailed==0 || pParse->nErr!=0 ); + if( nReg==0 ) return; + if( pParse->nErr ) 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; inColumn; i++){ + assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg + && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg ); + } + for(i=0; inFunc; 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; inFunc; i++, pFunc++){ + if( pFunc->iDistinct>=0 ){ + Expr *pE = pFunc->pFExpr; + assert( ExprUseXList(pE) ); + if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ + sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " + "argument"); + pFunc->iDistinct = -1; + }else{ + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pE->x.pList,0,0); + pFunc->iDistAddr = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + pFunc->iDistinct, 0, 0, (char*)pKeyInfo, P4_KEYINFO); + ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s(DISTINCT)", + pFunc->pFunc->zName)); + } + } + } +} + +/* +** Invoke the OP_AggFinalize opcode for every aggregate function +** in the AggInfo structure. +*/ +static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ + Vdbe *v = pParse->pVdbe; + int i; + struct AggInfo_func *pF; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + ExprList *pList; + assert( ExprUseXList(pF->pFExpr) ); + pList = pF->pFExpr->x.pList; + sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); + } +} + + +/* +** Update the accumulator memory cells for an aggregate based on +** the current cursor position. +** +** If regAcc is non-zero and there are no min() or max() aggregates +** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator +** registers if register regAcc contains 0. The caller will take care +** of setting and clearing regAcc. +*/ +static void updateAccumulator( + Parse *pParse, + int regAcc, + AggInfo *pAggInfo, + int eDistinctType +){ + Vdbe *v = pParse->pVdbe; + int i; + int regHit = 0; + int addrHitTest = 0; + struct AggInfo_func *pF; + struct AggInfo_col *pC; + + pAggInfo->directMode = 1; + for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + int nArg; + int addrNext = 0; + int regAgg; + ExprList *pList; + assert( ExprUseXList(pF->pFExpr) ); + assert( !IsWindowFunc(pF->pFExpr) ); + pList = pF->pFExpr->x.pList; + if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){ + Expr *pFilter = pF->pFExpr->y.pWin->pFilter; + if( pAggInfo->nAccumulator + && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + && regAcc + ){ + /* If regAcc==0, there there exists some min() or max() function + ** without a FILTER clause that will ensure the magnet registers + ** are populated. */ + if( regHit==0 ) regHit = ++pParse->nMem; + /* If this is the first row of the group (regAcc contains 0), clear the + ** "magnet" register regHit so that the accumulator registers + ** are populated if the FILTER clause jumps over the the + ** invocation of min() or max() altogether. Or, if this is not + ** the first row (regAcc contains 1), set the magnet register so that + ** the accumulators are not populated unless the min()/max() is invoked + ** and indicates that they should be. */ + sqlite3VdbeAddOp2(v, OP_Copy, regAcc, regHit); + } + addrNext = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); + } + if( pList ){ + nArg = pList->nExpr; + regAgg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); + }else{ + nArg = 0; + regAgg = 0; + } + if( pF->iDistinct>=0 && pList ){ + if( addrNext==0 ){ + addrNext = sqlite3VdbeMakeLabel(pParse); + } + pF->iDistinct = codeDistinct(pParse, eDistinctType, + pF->iDistinct, addrNext, pList, regAgg); + } + if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + CollSeq *pColl = 0; + struct ExprList_item *pItem; + int j; + assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */ + for(j=0, pItem=pList->a; !pColl && jpExpr); + } + if( !pColl ){ + pColl = pParse->db->pDfltColl; + } + if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; + sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, pF->iMem); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + sqlite3ReleaseTempRange(pParse, regAgg, nArg); + if( addrNext ){ + sqlite3VdbeResolveLabel(v, addrNext); + } + } + if( regHit==0 && pAggInfo->nAccumulator ){ + regHit = regAcc; + } + if( regHit ){ + addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); + } + for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ + sqlite3ExprCode(pParse, pC->pCExpr, pC->iMem); + } + + pAggInfo->directMode = 0; + if( addrHitTest ){ + sqlite3VdbeJumpHereOrPopInst(v, addrHitTest); + } +} + +/* +** Add a single OP_Explain instruction to the VDBE to explain a simple +** count(*) query ("SELECT count(*) FROM pTab"). +*/ +#ifndef SQLITE_OMIT_EXPLAIN +static void explainSimpleCount( + Parse *pParse, /* Parse context */ + Table *pTab, /* Table being queried */ + Index *pIdx /* Index used to optimize scan, or NULL */ +){ + if( pParse->explain==2 ){ + int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx))); + sqlite3VdbeExplain(pParse, 0, "SCAN %s%s%s", + pTab->zName, + bCover ? " USING COVERING INDEX " : "", + bCover ? pIdx->zName : "" + ); + } +} +#else +# define explainSimpleCount(a,b,c) +#endif + +/* +** sqlite3WalkExpr() callback used by havingToWhere(). +** +** If the node passed to the callback is a TK_AND node, return +** WRC_Continue to tell sqlite3WalkExpr() to iterate through child nodes. +** +** Otherwise, return WRC_Prune. In this case, also check if the +** sub-expression matches the criteria for being moved to the WHERE +** clause. If so, add it to the WHERE clause and replace the sub-expression +** within the HAVING expression with a constant "1". +*/ +static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ + if( pExpr->op!=TK_AND ){ + Select *pS = pWalker->u.pSelect; + /* This routine is called before the HAVING clause of the current + ** SELECT is analyzed for aggregates. So if pExpr->pAggInfo is set + ** here, it indicates that the expression is a correlated reference to a + ** column from an outer aggregate query, or an aggregate function that + ** belongs to an outer query. Do not move the expression to the WHERE + ** clause in this obscure case, as doing so may corrupt the outer Select + ** statements AggInfo structure. */ + if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) + && ExprAlwaysFalse(pExpr)==0 + && pExpr->pAggInfo==0 + ){ + sqlite3 *db = pWalker->pParse->db; + Expr *pNew = sqlite3Expr(db, TK_INTEGER, "1"); + if( pNew ){ + Expr *pWhere = pS->pWhere; + SWAP(Expr, *pNew, *pExpr); + pNew = sqlite3ExprAnd(pWalker->pParse, pWhere, pNew); + pS->pWhere = pNew; + pWalker->eCode = 1; + } + } + return WRC_Prune; + } + return WRC_Continue; +} + +/* +** Transfer eligible terms from the HAVING clause of a query, which is +** processed after grouping, to the WHERE clause, which is processed before +** grouping. For example, the query: +** +** SELECT * FROM WHERE a=? GROUP BY b HAVING b=? AND c=? +** +** can be rewritten as: +** +** SELECT * FROM WHERE a=? AND b=? GROUP BY b HAVING c=? +** +** A term of the HAVING expression is eligible for transfer if it consists +** entirely of constants and expressions that are also GROUP BY terms that +** use the "BINARY" collation sequence. +*/ +static void havingToWhere(Parse *pParse, Select *p){ + Walker sWalker; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = havingToWhereExprCb; + sWalker.u.pSelect = p; + sqlite3WalkExpr(&sWalker, p->pHaving); +#if TREETRACE_ENABLED + if( sWalker.eCode && (sqlite3TreeTrace & 0x100)!=0 ){ + SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif +} + +/* +** Check to see if the pThis entry of pTabList is a self-join of a prior view. +** If it is, then return the SrcList_item for the prior view. If it is not, +** then return 0. +*/ +static SrcItem *isSelfJoinView( + SrcList *pTabList, /* Search for self-joins in this FROM clause */ + SrcItem *pThis /* Search for prior reference to this subquery */ +){ + SrcItem *pItem; + assert( pThis->pSelect!=0 ); + if( pThis->pSelect->selFlags & SF_PushDown ) return 0; + for(pItem = pTabList->a; pItempSelect==0 ) continue; + if( pItem->fg.viaCoroutine ) continue; + if( pItem->zName==0 ) continue; + assert( pItem->pTab!=0 ); + assert( pThis->pTab!=0 ); + if( pItem->pTab->pSchema!=pThis->pTab->pSchema ) continue; + if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; + pS1 = pItem->pSelect; + if( pItem->pTab->pSchema==0 && pThis->pSelect->selId!=pS1->selId ){ + /* The query flattener left two different CTE tables with identical + ** names in the same FROM clause. */ + continue; + } + if( pItem->pSelect->selFlags & SF_PushDown ){ + /* The view was modified by some other optimization such as + ** pushDownWhereTerms() */ + continue; + } + return pItem; + } + return 0; +} + +/* +** Deallocate a single AggInfo object +*/ +static void agginfoFree(sqlite3 *db, AggInfo *p){ + sqlite3DbFree(db, p->aCol); + sqlite3DbFree(db, p->aFunc); + sqlite3DbFreeNN(db, p); +} + +#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION +/* +** Attempt to transform a query of the form +** +** SELECT count(*) FROM (SELECT x FROM t1 UNION ALL SELECT y FROM t2) +** +** Into this: +** +** SELECT (SELECT count(*) FROM t1)+(SELECT count(*) FROM t2) +** +** The transformation only works if all of the following are true: +** +** * The subquery is a UNION ALL of two or more terms +** * The subquery does not have a LIMIT clause +** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries +** * The outer query is a simple count(*) with no WHERE clause or other +** extraneous syntax. +** +** Return TRUE if the optimization is undertaken. +*/ +static int countOfViewOptimization(Parse *pParse, Select *p){ + Select *pSub, *pPrior; + Expr *pExpr; + Expr *pCount; + sqlite3 *db; + if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */ + if( p->pEList->nExpr!=1 ) return 0; /* Single result column */ + if( p->pWhere ) return 0; + if( p->pGroupBy ) return 0; + pExpr = p->pEList->a[0].pExpr; + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ + assert( ExprUseUToken(pExpr) ); + if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ + assert( ExprUseXList(pExpr) ); + if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */ + if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ + pSub = p->pSrc->a[0].pSelect; + if( pSub==0 ) return 0; /* The FROM is a subquery */ + if( pSub->pPrior==0 ) return 0; /* Must be a compound ry */ + do{ + if( pSub->op!=TK_ALL && pSub->pPrior ) return 0; /* Must be UNION ALL */ + if( pSub->pWhere ) return 0; /* No WHERE clause */ + if( pSub->pLimit ) return 0; /* No LIMIT clause */ + if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */ + pSub = pSub->pPrior; /* Repeat over compound */ + }while( pSub ); + + /* If we reach this point then it is OK to perform the transformation */ + + db = pParse->db; + pCount = pExpr; + pExpr = 0; + pSub = p->pSrc->a[0].pSelect; + p->pSrc->a[0].pSelect = 0; + sqlite3SrcListDelete(db, p->pSrc); + p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc)); + while( pSub ){ + Expr *pTerm; + pPrior = pSub->pPrior; + pSub->pPrior = 0; + pSub->pNext = 0; + pSub->selFlags |= SF_Aggregate; + pSub->selFlags &= ~SF_Compound; + pSub->nSelectRow = 0; + sqlite3ExprListDelete(db, pSub->pEList); + pTerm = pPrior ? sqlite3ExprDup(db, pCount, 0) : pCount; + pSub->pEList = sqlite3ExprListAppend(pParse, 0, pTerm); + pTerm = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, pTerm, pSub); + if( pExpr==0 ){ + pExpr = pTerm; + }else{ + pExpr = sqlite3PExpr(pParse, TK_PLUS, pTerm, pExpr); + } + pSub = pPrior; + } + p->pEList->a[0].pExpr = pExpr; + p->selFlags &= ~SF_Aggregate; + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + return 1; +} +#endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ + +/* +** If any term of pSrc, or any SF_NestedFrom sub-query, is not the same +** as pSrcItem but has the same alias as p0, then return true. +** Otherwise return false. +*/ +static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + SrcItem *p1 = &pSrc->a[i]; + if( p1==p0 ) continue; + if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ + return 1; + } + if( p1->pSelect + && (p1->pSelect->selFlags & SF_NestedFrom)!=0 + && sameSrcAlias(p0, p1->pSelect->pSrc) + ){ + return 1; + } + } + return 0; +} + +/* +** Generate code for the SELECT statement given in the p argument. +** +** The results are returned according to the SelectDest structure. +** See comments in sqliteInt.h for further information. +** +** This routine returns the number of errors. If any errors are +** encountered, then an appropriate error message is left in +** pParse->zErrMsg. +** +** This routine does NOT free the Select structure passed in. The +** calling function needs to do that. +*/ +SQLITE_PRIVATE int sqlite3Select( + Parse *pParse, /* The parser context */ + Select *p, /* The SELECT statement being coded. */ + SelectDest *pDest /* What to do with the query results */ +){ + int i, j; /* Loop counters */ + WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ + Vdbe *v; /* The virtual machine under construction */ + int isAgg; /* True for select lists like "count(*)" */ + ExprList *pEList = 0; /* List of columns to extract. */ + SrcList *pTabList; /* List of tables to select from */ + Expr *pWhere; /* The WHERE clause. May be NULL */ + ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ + Expr *pHaving; /* The HAVING clause. May be NULL */ + AggInfo *pAggInfo = 0; /* Aggregate information */ + int rc = 1; /* Value to return from this function */ + DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */ + SortCtx sSort; /* Info on how to code the ORDER BY clause */ + int iEnd; /* Address of the end of the query */ + sqlite3 *db; /* The database connection */ + ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */ + u8 minMaxFlag; /* Flag for min/max queries */ + + db = pParse->db; + assert( pParse==db->pParse ); + v = sqlite3GetVdbe(pParse); + if( p==0 || pParse->nErr ){ + return 1; + } + assert( db->mallocFailed==0 ); + if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; +#if TREETRACE_ENABLED + SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); + if( sqlite3TreeTrace & 0x10100 ){ + if( (sqlite3TreeTrace & 0x10001)==0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Select() at %s:%d", + __FILE__, __LINE__); + } + sqlite3ShowSelect(p); + } +#endif + + assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue ); + assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue ); + if( IgnorableDistinct(pDest) ){ + assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || + pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard || + pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo ); + /* All of these destinations are also able to ignore the ORDER BY clause */ + if( p->pOrderBy ){ +#if TREETRACE_ENABLED + SELECTTRACE(1,pParse,p, ("dropping superfluous ORDER BY:\n")); + if( sqlite3TreeTrace & 0x100 ){ + sqlite3TreeViewExprList(0, p->pOrderBy, 0, "ORDERBY"); + } +#endif + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprListDelete, + p->pOrderBy); + testcase( pParse->earlyCleanup ); + p->pOrderBy = 0; + } + p->selFlags &= ~SF_Distinct; + p->selFlags |= SF_NoopOrderBy; + } + sqlite3SelectPrep(pParse, p, 0); + if( pParse->nErr ){ + goto select_end; + } + assert( db->mallocFailed==0 ); + assert( p->pEList!=0 ); +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x104 ){ + SELECTTRACE(0x104,pParse,p, ("after name resolution:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + /* If the SF_UFSrcCheck flag is set, then this function is being called + ** as part of populating the temp table for an UPDATE...FROM statement. + ** In this case, it is an error if the target object (pSrc->a[0]) name + ** or alias is duplicated within FROM clause (pSrc->a[1..n]). + ** + ** Postgres disallows this case too. The reason is that some other + ** systems handle this case differently, and not all the same way, + ** which is just confusing. To avoid this, we follow PG's lead and + ** disallow it altogether. */ + if( p->selFlags & SF_UFSrcCheck ){ + SrcItem *p0 = &p->pSrc->a[0]; + if( sameSrcAlias(p0, p->pSrc) ){ + sqlite3ErrorMsg(pParse, + "target object/alias may not appear in FROM clause: %s", + p0->zAlias ? p0->zAlias : p0->pTab->zName + ); + goto select_end; + } + + /* Clear the SF_UFSrcCheck flag. The check has already been performed, + ** and leaving this flag set can cause errors if a compound sub-query + ** in p->pSrc is flattened into this query and this function called + ** again as part of compound SELECT processing. */ + p->selFlags &= ~SF_UFSrcCheck; + } + + if( pDest->eDest==SRT_Output ){ + sqlite3GenerateColumnNames(pParse, p); + } + +#ifndef SQLITE_OMIT_WINDOWFUNC + if( sqlite3WindowRewrite(pParse, p) ){ + assert( pParse->nErr ); + goto select_end; + } +#if TREETRACE_ENABLED + if( p->pWin && (sqlite3TreeTrace & 0x108)!=0 ){ + SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif +#endif /* SQLITE_OMIT_WINDOWFUNC */ + pTabList = p->pSrc; + isAgg = (p->selFlags & SF_Aggregate)!=0; + memset(&sSort, 0, sizeof(sSort)); + sSort.pOrderBy = p->pOrderBy; + + /* Try to do various optimizations (flattening subqueries, and strength + ** reduction of join operators) in the FROM clause up into the main query + */ +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + for(i=0; !p->pPrior && inSrc; i++){ + SrcItem *pItem = &pTabList->a[i]; + Select *pSub = pItem->pSelect; + Table *pTab = pItem->pTab; + + /* The expander should have already created transient Table objects + ** even for FROM clause elements such as subqueries that do not correspond + ** to a real table */ + assert( pTab!=0 ); + + /* Convert LEFT JOIN into JOIN if there are terms of the right table + ** of the LEFT JOIN used in the WHERE clause. + */ + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==JT_LEFT + && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor) + && OptimizationEnabled(db, SQLITE_SimplifyJoin) + ){ + SELECTTRACE(0x100,pParse,p, + ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); + pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); + assert( pItem->iCursor>=0 ); + unsetJoinExpr(p->pWhere, pItem->iCursor, + pTabList->a[0].fg.jointype & JT_LTORJ); + } + + /* No futher action if this term of the FROM clause is no a subquery */ + if( pSub==0 ) continue; + + /* Catch mismatch in the declared columns of a view and the number of + ** columns in the SELECT on the RHS */ + if( pTab->nCol!=pSub->pEList->nExpr ){ + sqlite3ErrorMsg(pParse, "expected %d columns for '%s' but got %d", + pTab->nCol, pTab->zName, pSub->pEList->nExpr); + goto select_end; + } + + /* Do not try to flatten an aggregate subquery. + ** + ** Flattening an aggregate subquery is only possible if the outer query + ** is not a join. But if the outer query is not a join, then the subquery + ** will be implemented as a co-routine and there is no advantage to + ** flattening in that case. + */ + if( (pSub->selFlags & SF_Aggregate)!=0 ) continue; + assert( pSub->pGroupBy==0 ); + + /* If a FROM-clause subquery has an ORDER BY clause that is not + ** really doing anything, then delete it now so that it does not + ** interfere with query flattening. See the discussion at + ** https://sqlite.org/forum/forumpost/2d76f2bcf65d256a + ** + ** Beware of these cases where the ORDER BY clause may not be safely + ** omitted: + ** + ** (1) There is also a LIMIT clause + ** (2) The subquery was added to help with window-function + ** processing + ** (3) The subquery is in the FROM clause of an UPDATE + ** (4) The outer query uses an aggregate function other than + ** the built-in count(), min(), or max(). + ** (5) The ORDER BY isn't going to accomplish anything because + ** one of: + ** (a) The outer query has a different ORDER BY clause + ** (b) The subquery is part of a join + ** See forum post 062d576715d277c8 + */ + if( pSub->pOrderBy!=0 + && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */ + && pSub->pLimit==0 /* Condition (1) */ + && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ + && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */ + && OptimizationEnabled(db, SQLITE_OmitOrderBy) + ){ + SELECTTRACE(0x100,pParse,p, + ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprListDelete, + pSub->pOrderBy); + pSub->pOrderBy = 0; + } + + /* If the outer query contains a "complex" result set (that is, + ** if the result set of the outer query uses functions or subqueries) + ** and if the subquery contains an ORDER BY clause and if + ** it will be implemented as a co-routine, then do not flatten. This + ** restriction allows SQL constructs like this: + ** + ** SELECT expensive_function(x) + ** FROM (SELECT x FROM tab ORDER BY y LIMIT 10); + ** + ** The expensive_function() is only computed on the 10 rows that + ** are output, rather than every row of the table. + ** + ** The requirement that the outer query have a complex result set + ** means that flattening does occur on simpler SQL constraints without + ** the expensive_function() like: + ** + ** SELECT x FROM (SELECT x FROM tab ORDER BY y LIMIT 10); + */ + if( pSub->pOrderBy!=0 + && i==0 + && (p->selFlags & SF_ComplexResult)!=0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0) + ){ + continue; + } + + if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; + /* This subquery can be absorbed into its parent. */ + i = -1; + } + pTabList = p->pSrc; + if( db->mallocFailed ) goto select_end; + if( !IgnorableOrderby(pDest) ){ + sSort.pOrderBy = p->pOrderBy; + } + } +#endif + +#ifndef SQLITE_OMIT_COMPOUND_SELECT + /* Handle compound SELECT statements using the separate multiSelect() + ** procedure. + */ + if( p->pPrior ){ + rc = multiSelect(pParse, p, pDest); +#if TREETRACE_ENABLED + SELECTTRACE(0x1,pParse,p,("end compound-select processing\n")); + if( (sqlite3TreeTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + if( p->pNext==0 ) ExplainQueryPlanPop(pParse); + return rc; + } +#endif + + /* Do the WHERE-clause constant propagation optimization if this is + ** a join. No need to speed time on this operation for non-join queries + ** as the equivalent optimization will be handled by query planner in + ** sqlite3WhereBegin(). + */ + if( p->pWhere!=0 + && p->pWhere->op==TK_AND + && OptimizationEnabled(db, SQLITE_PropagateConst) + && propagateConstants(pParse, p) + ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After constant propagation:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + }else{ + SELECTTRACE(0x100,pParse,p,("Constant propagation not helpful\n")); + } + +#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION + if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView) + && countOfViewOptimization(pParse, p) + ){ + if( db->mallocFailed ) goto select_end; + pEList = p->pEList; + pTabList = p->pSrc; + } +#endif + + /* For each term in the FROM clause, do two things: + ** (1) Authorized unreferenced tables + ** (2) Generate code for all sub-queries + */ + for(i=0; inSrc; i++){ + SrcItem *pItem = &pTabList->a[i]; + SrcItem *pPrior; + SelectDest dest; + Select *pSub; +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + const char *zSavedAuthContext; +#endif + + /* Issue SQLITE_READ authorizations with a fake column name for any + ** tables that are referenced but from which no values are extracted. + ** Examples of where these kinds of null SQLITE_READ authorizations + ** would occur: + ** + ** SELECT count(*) FROM t1; -- SQLITE_READ t1."" + ** SELECT t1.* FROM t1, t2; -- SQLITE_READ t2."" + ** + ** The fake column name is an empty string. It is possible for a table to + ** have a column named by the empty string, in which case there is no way to + ** distinguish between an unreferenced table and an actual reference to the + ** "" column. The original design was for the fake column name to be a NULL, + ** which would be unambiguous. But legacy authorization callbacks might + ** assume the column name is non-NULL and segfault. The use of an empty + ** string for the fake column name seems safer. + */ + if( pItem->colUsed==0 && pItem->zName!=0 ){ + sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); + } + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + /* Generate code for all sub-queries in the FROM clause + */ + pSub = pItem->pSelect; + if( pSub==0 ) continue; + + /* The code for a subquery should only be generated once. */ + assert( pItem->addrFillSub==0 ); + + /* Increment Parse.nHeight by the height of the largest expression + ** tree referred to by this, the parent select. The child select + ** may contain expression trees of at most + ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit + ** more conservative than necessary, but much easier than enforcing + ** an exact limit. + */ + pParse->nHeight += sqlite3SelectExprHeight(p); + + /* Make copies of constant WHERE-clause terms in the outer query down + ** inside the subquery. This can help the subquery to run more efficiently. + */ + if( OptimizationEnabled(db, SQLITE_PushDown) + && (pItem->fg.isCte==0 + || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) + && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem) + ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p, + ("After WHERE-clause push-down into subquery %d:\n", pSub->selId)); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + assert( pItem->pSelect && (pItem->pSelect->selFlags & SF_PushDown)!=0 ); + }else{ + SELECTTRACE(0x100,pParse,p,("Push-down not possible\n")); + } + + zSavedAuthContext = pParse->zAuthContext; + pParse->zAuthContext = pItem->zName; + + /* Generate code to implement the subquery + ** + ** The subquery is implemented as a co-routine if all of the following are + ** true: + ** + ** (1) the subquery is guaranteed to be the outer loop (so that + ** it does not need to be computed more than once), and + ** (2) the subquery is not a CTE that should be materialized + ** (3) the subquery is not part of a left operand for a RIGHT JOIN + */ + if( i==0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0) /* (1) */ + && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (2) */ + && (pTabList->a[0].fg.jointype & JT_LTORJ)==0 /* (3) */ + ){ + /* Implement a co-routine that will return a single row of the result + ** set on each invocation. + */ + int addrTop = sqlite3VdbeCurrentAddr(v)+1; + + pItem->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + VdbeComment((v, "%!S", pItem)); + pItem->addrFillSub = addrTop; + sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); + ExplainQueryPlan((pParse, 1, "CO-ROUTINE %!S", pItem)); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = pSub->nSelectRow; + pItem->fg.viaCoroutine = 1; + pItem->regResult = dest.iSdst; + sqlite3VdbeEndCoroutine(v, pItem->regReturn); + sqlite3VdbeJumpHere(v, addrTop-1); + sqlite3ClearTempRegCache(pParse); + }else if( pItem->fg.isCte && pItem->u2.pCteUse->addrM9e>0 ){ + /* This is a CTE for which materialization code has already been + ** generated. Invoke the subroutine to compute the materialization, + ** the make the pItem->iCursor be a copy of the ephemerial table that + ** holds the result of the materialization. */ + CteUse *pCteUse = pItem->u2.pCteUse; + sqlite3VdbeAddOp2(v, OP_Gosub, pCteUse->regRtn, pCteUse->addrM9e); + if( pItem->iCursor!=pCteUse->iCur ){ + sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pCteUse->iCur); + VdbeComment((v, "%!S", pItem)); + } + pSub->nSelectRow = pCteUse->nRowEst; + }else if( (pPrior = isSelfJoinView(pTabList, pItem))!=0 ){ + /* This view has already been materialized by a prior entry in + ** this same FROM clause. Reuse it. */ + if( pPrior->addrFillSub ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pPrior->regReturn, pPrior->addrFillSub); + } + sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor); + pSub->nSelectRow = pPrior->pSelect->nSelectRow; + }else{ + /* Materialize the view. If the view is not correlated, generate a + ** subroutine to do the materialization so that subsequent uses of + ** the same view can reuse the materialization. */ + int topAddr; + int onceAddr = 0; + + pItem->regReturn = ++pParse->nMem; + topAddr = sqlite3VdbeAddOp0(v, OP_Goto); + pItem->addrFillSub = topAddr+1; + pItem->fg.isMaterialized = 1; + if( pItem->fg.isCorrelated==0 ){ + /* If the subquery is not correlated and if we are not inside of + ** a trigger, then we only need to compute the value of the subquery + ** once. */ + onceAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + VdbeComment((v, "materialize %!S", pItem)); + }else{ + VdbeNoopComment((v, "materialize %!S", pItem)); + } + sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); + ExplainQueryPlan((pParse, 1, "MATERIALIZE %!S", pItem)); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = pSub->nSelectRow; + if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); + sqlite3VdbeAddOp2(v, OP_Return, pItem->regReturn, topAddr+1); + VdbeComment((v, "end %!S", pItem)); + sqlite3VdbeJumpHere(v, topAddr); + sqlite3ClearTempRegCache(pParse); + if( pItem->fg.isCte && pItem->fg.isCorrelated==0 ){ + CteUse *pCteUse = pItem->u2.pCteUse; + pCteUse->addrM9e = pItem->addrFillSub; + pCteUse->regRtn = pItem->regReturn; + pCteUse->iCur = pItem->iCursor; + pCteUse->nRowEst = pSub->nSelectRow; + } + } + if( db->mallocFailed ) goto select_end; + pParse->nHeight -= sqlite3SelectExprHeight(p); + pParse->zAuthContext = zSavedAuthContext; +#endif + } + + /* Various elements of the SELECT copied into local variables for + ** convenience */ + pEList = p->pEList; + pWhere = p->pWhere; + pGroupBy = p->pGroupBy; + pHaving = p->pHaving; + sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + + /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and + ** if the select-list is the same as the ORDER BY list, then this query + ** can be rewritten as a GROUP BY. In other words, this: + ** + ** SELECT DISTINCT xyz FROM ... ORDER BY xyz + ** + ** is transformed to: + ** + ** SELECT xyz FROM ... GROUP BY xyz ORDER BY xyz + ** + ** The second form is preferred as a single index (or temp-table) may be + ** used for both the ORDER BY and DISTINCT processing. As originally + ** written the query must use a temp-table for at least one of the ORDER + ** BY and DISTINCT, and an index or separate temp-table for the other. + */ + if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct + && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && p->pWin==0 +#endif + ){ + p->selFlags &= ~SF_Distinct; + pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); + p->selFlags |= SF_Aggregate; + /* Notice that even thought SF_Distinct has been cleared from p->selFlags, + ** the sDistinct.isTnct is still set. Hence, isTnct represents the + ** original setting of the SF_Distinct flag, not the current setting */ + assert( sDistinct.isTnct ); + sDistinct.isTnct = 2; + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + } + + /* If there is an ORDER BY clause, then create an ephemeral index to + ** do the sorting. But this sorting ephemeral index might end up + ** being unused if the data can be extracted in pre-sorted order. + ** If that is the case, then the OP_OpenEphemeral instruction will be + ** changed to an OP_Noop once we figure out that the sorting index is + ** not needed. The sSort.addrSortIndex variable is used to facilitate + ** that change. + */ + if( sSort.pOrderBy ){ + KeyInfo *pKeyInfo; + pKeyInfo = sqlite3KeyInfoFromExprList( + pParse, sSort.pOrderBy, 0, pEList->nExpr); + sSort.iECursor = pParse->nTab++; + sSort.addrSortIndex = + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + sSort.iECursor, sSort.pOrderBy->nExpr+1+pEList->nExpr, 0, + (char*)pKeyInfo, P4_KEYINFO + ); + }else{ + sSort.addrSortIndex = -1; + } + + /* If the output is destined for a temporary table, open that table. + */ + if( pDest->eDest==SRT_EphemTab ){ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); + if( p->selFlags & SF_NestedFrom ){ + /* Delete or NULL-out result columns that will never be used */ + int ii; + for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){ + sqlite3ExprDelete(db, pEList->a[ii].pExpr); + sqlite3DbFree(db, pEList->a[ii].zEName); + pEList->nExpr--; + } + for(ii=0; iinExpr; ii++){ + if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL; + } + } + } + + /* Set the limiter. + */ + iEnd = sqlite3VdbeMakeLabel(pParse); + if( (p->selFlags & SF_FixedLimit)==0 ){ + p->nSelectRow = 320; /* 4 billion rows */ + } + computeLimitRegisters(pParse, p, iEnd); + if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ + sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen); + sSort.sortFlags |= SORTFLAG_UseSorter; + } + + /* Open an ephemeral index to use for the distinct set. + */ + if( p->selFlags & SF_Distinct ){ + sDistinct.tabTnct = pParse->nTab++; + sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + sDistinct.tabTnct, 0, 0, + (char*)sqlite3KeyInfoFromExprList(pParse, p->pEList,0,0), + P4_KEYINFO); + sqlite3VdbeChangeP5(v, BTREE_UNORDERED); + sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED; + }else{ + sDistinct.eTnctType = WHERE_DISTINCT_NOOP; + } + + if( !isAgg && pGroupBy==0 ){ + /* No aggregate functions and no GROUP BY clause */ + u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0) + | (p->selFlags & SF_FixedLimit); +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin = p->pWin; /* Main window object (or NULL) */ + if( pWin ){ + sqlite3WindowCodeInit(pParse, p); + } +#endif + assert( WHERE_USE_LIMIT==SF_FixedLimit ); + + + /* Begin the database scan. */ + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy, + p->pEList, p, wctrlFlags, p->nSelectRow); + if( pWInfo==0 ) goto select_end; + if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){ + p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo); + } + if( sDistinct.isTnct && sqlite3WhereIsDistinct(pWInfo) ){ + sDistinct.eTnctType = sqlite3WhereIsDistinct(pWInfo); + } + if( sSort.pOrderBy ){ + sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo); + sSort.labelOBLopt = sqlite3WhereOrderByLimitOptLabel(pWInfo); + if( sSort.nOBSat==sSort.pOrderBy->nExpr ){ + sSort.pOrderBy = 0; + } + } + SELECTTRACE(1,pParse,p,("WhereBegin returns\n")); + + /* If sorting index that was created by a prior OP_OpenEphemeral + ** instruction ended up not being needed, then change the OP_OpenEphemeral + ** into an OP_Noop. + */ + if( sSort.addrSortIndex>=0 && sSort.pOrderBy==0 ){ + sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); + } + + assert( p->pEList==pEList ); +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pWin ){ + int addrGosub = sqlite3VdbeMakeLabel(pParse); + int iCont = sqlite3VdbeMakeLabel(pParse); + int iBreak = sqlite3VdbeMakeLabel(pParse); + int regGosub = ++pParse->nMem; + + sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub); + + sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak); + sqlite3VdbeResolveLabel(v, addrGosub); + VdbeNoopComment((v, "inner-loop subroutine")); + sSort.labelOBLopt = 0; + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp1(v, OP_Return, regGosub); + VdbeComment((v, "end inner-loop subroutine")); + sqlite3VdbeResolveLabel(v, iBreak); + }else +#endif /* SQLITE_OMIT_WINDOWFUNC */ + { + /* Use the standard inner loop. */ + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, + sqlite3WhereContinueLabel(pWInfo), + sqlite3WhereBreakLabel(pWInfo)); + + /* End the database scan loop. + */ + SELECTTRACE(1,pParse,p,("WhereEnd\n")); + sqlite3WhereEnd(pWInfo); + } + }else{ + /* This case when there exist aggregate functions or a GROUP BY clause + ** or both */ + NameContext sNC; /* Name context for processing aggregate information */ + int iAMem; /* First Mem address for storing current GROUP BY */ + int iBMem; /* First Mem address for previous GROUP BY */ + int iUseFlag; /* Mem address holding flag indicating that at least + ** one row of the input to the aggregator has been + ** processed */ + int iAbortFlag; /* Mem address which causes query abort if positive */ + int groupBySort; /* Rows come from source in GROUP BY order */ + int addrEnd; /* End of processing for this SELECT */ + int sortPTab = 0; /* Pseudotable used to decode sorting results */ + int sortOut = 0; /* Output register from the sorter */ + int orderByGrp = 0; /* True if the GROUP BY and ORDER BY are the same */ + + /* Remove any and all aliases between the result set and the + ** GROUP BY clause. + */ + if( pGroupBy ){ + int k; /* Loop counter */ + struct ExprList_item *pItem; /* For looping over expression in a list */ + + for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){ + pItem->u.x.iAlias = 0; + } + for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){ + pItem->u.x.iAlias = 0; + } + assert( 66==sqlite3LogEst(100) ); + if( p->nSelectRow>66 ) p->nSelectRow = 66; + + /* If there is both a GROUP BY and an ORDER BY clause and they are + ** identical, then it may be possible to disable the ORDER BY clause + ** on the grounds that the GROUP BY will cause elements to come out + ** in the correct order. It also may not - the GROUP BY might use a + ** database index that causes rows to be grouped together as required + ** but not actually sorted. Either way, record the fact that the + ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp + ** variable. */ + if( sSort.pOrderBy && pGroupBy->nExpr==sSort.pOrderBy->nExpr ){ + int ii; + /* The GROUP BY processing doesn't care whether rows are delivered in + ** ASC or DESC order - only that each group is returned contiguously. + ** So set the ASC/DESC flags in the GROUP BY to match those in the + ** ORDER BY to maximize the chances of rows being delivered in an + ** order that makes the ORDER BY redundant. */ + for(ii=0; iinExpr; ii++){ + u8 sortFlags; + sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC; + pGroupBy->a[ii].fg.sortFlags = sortFlags; + } + if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ + orderByGrp = 1; + } + } + }else{ + assert( 0==sqlite3LogEst(1) ); + p->nSelectRow = 0; + } + + /* Create a label to jump to when we want to abort the query */ + addrEnd = sqlite3VdbeMakeLabel(pParse); + + /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in + ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the + ** SELECT statement. + */ + pAggInfo = sqlite3DbMallocZero(db, sizeof(*pAggInfo) ); + if( pAggInfo ){ + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))agginfoFree, pAggInfo); + testcase( pParse->earlyCleanup ); + } + if( db->mallocFailed ){ + goto select_end; + } + pAggInfo->selId = p->selId; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + sNC.uNC.pAggInfo = pAggInfo; + VVA_ONLY( sNC.ncFlags = NC_UAggInfo; ) + pAggInfo->mnReg = pParse->nMem+1; + pAggInfo->nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; + pAggInfo->pGroupBy = pGroupBy; + sqlite3ExprAnalyzeAggList(&sNC, pEList); + sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy); + if( pHaving ){ + if( pGroupBy ){ + assert( pWhere==p->pWhere ); + assert( pHaving==p->pHaving ); + assert( pGroupBy==p->pGroupBy ); + havingToWhere(pParse, p); + pWhere = p->pWhere; + } + sqlite3ExprAnalyzeAggregates(&sNC, pHaving); + } + pAggInfo->nAccumulator = pAggInfo->nColumn; + if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){ + minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pFExpr, &pMinMaxOrderBy); + }else{ + minMaxFlag = WHERE_ORDERBY_NORMAL; + } + for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pFExpr; + assert( ExprUseXList(pExpr) ); + sNC.ncFlags |= NC_InAggFunc; + sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( !IsWindowFunc(pExpr) ); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pWin->pFilter); + } +#endif + sNC.ncFlags &= ~NC_InAggFunc; + } + pAggInfo->mxReg = pParse->nMem; + if( db->mallocFailed ) goto select_end; +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ + int ii; + SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); + sqlite3TreeViewSelect(0, p, 0); + if( minMaxFlag ){ + sqlite3DebugPrintf("MIN/MAX Optimization (0x%02x) adds:\n", minMaxFlag); + sqlite3TreeViewExprList(0, pMinMaxOrderBy, 0, "ORDERBY"); + } + for(ii=0; iinColumn; ii++){ + sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", + ii, pAggInfo->aCol[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0); + } + for(ii=0; iinFunc; ii++){ + sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", + ii, pAggInfo->aFunc[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pFExpr, 0); + } + } +#endif + + + /* Processing for aggregates with GROUP BY is very different and + ** much more complex than aggregates without a GROUP BY. + */ + if( pGroupBy ){ + KeyInfo *pKeyInfo; /* Keying information for the group by clause */ + int addr1; /* A-vs-B comparision jump */ + int addrOutputRow; /* Start of subroutine that outputs a result row */ + int regOutputRow; /* Return address register for output subroutine */ + int addrSetAbort; /* Set the abort flag and return */ + int addrTopOfLoop; /* Top of the input loop */ + int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */ + int addrReset; /* Subroutine for resetting the accumulator */ + int regReset; /* Return address register for reset subroutine */ + ExprList *pDistinct = 0; + u16 distFlag = 0; + int eDist = WHERE_DISTINCT_NOOP; + + if( pAggInfo->nFunc==1 + && pAggInfo->aFunc[0].iDistinct>=0 + && ALWAYS(pAggInfo->aFunc[0].pFExpr!=0) + && ALWAYS(ExprUseXList(pAggInfo->aFunc[0].pFExpr)) + && pAggInfo->aFunc[0].pFExpr->x.pList!=0 + ){ + Expr *pExpr = pAggInfo->aFunc[0].pFExpr->x.pList->a[0].pExpr; + pExpr = sqlite3ExprDup(db, pExpr, 0); + pDistinct = sqlite3ExprListDup(db, pGroupBy, 0); + pDistinct = sqlite3ExprListAppend(pParse, pDistinct, pExpr); + distFlag = pDistinct ? (WHERE_WANT_DISTINCT|WHERE_AGG_DISTINCT) : 0; + } + + /* If there is a GROUP BY clause we might need a sorting index to + ** implement it. Allocate that sorting index now. If it turns out + ** that we do not need it after all, the OP_SorterOpen instruction + ** will be converted into a Noop. + */ + pAggInfo->sortingIdx = pParse->nTab++; + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pGroupBy, + 0, pAggInfo->nColumn); + addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, + pAggInfo->sortingIdx, pAggInfo->nSortingColumn, + 0, (char*)pKeyInfo, P4_KEYINFO); + + /* Initialize memory locations used by GROUP BY aggregate processing + */ + iUseFlag = ++pParse->nMem; + iAbortFlag = ++pParse->nMem; + regOutputRow = ++pParse->nMem; + addrOutputRow = sqlite3VdbeMakeLabel(pParse); + regReset = ++pParse->nMem; + addrReset = sqlite3VdbeMakeLabel(pParse); + iAMem = pParse->nMem + 1; + pParse->nMem += pGroupBy->nExpr; + iBMem = pParse->nMem + 1; + pParse->nMem += pGroupBy->nExpr; + sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag); + VdbeComment((v, "clear abort flag")); + sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1); + + /* Begin a loop that will extract all source rows in GROUP BY order. + ** This might involve two separate loops with an OP_Sort in between, or + ** it might be a single loop that uses an index to extract information + ** in the right order to begin with. + */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, pDistinct, + 0, (sDistinct.isTnct==2 ? WHERE_DISTINCTBY : WHERE_GROUPBY) + | (orderByGrp ? WHERE_SORTBYGROUP : 0) | distFlag, 0 + ); + if( pWInfo==0 ){ + sqlite3ExprListDelete(db, pDistinct); + goto select_end; + } + eDist = sqlite3WhereIsDistinct(pWInfo); + SELECTTRACE(1,pParse,p,("WhereBegin returns\n")); + if( sqlite3WhereIsOrdered(pWInfo)==pGroupBy->nExpr ){ + /* The optimizer is able to deliver rows in group by order so + ** we do not have to sort. The OP_OpenEphemeral table will be + ** cancelled later because we still need to use the pKeyInfo + */ + groupBySort = 0; + }else{ + /* Rows are coming out in undetermined order. We have to push + ** each row into a sorting index, terminate the first loop, + ** then loop over the sorting index in order to get the output + ** in sorted order + */ + int regBase; + int regRecord; + int nCol; + int nGroupBy; + + explainTempTable(pParse, + (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ? + "DISTINCT" : "GROUP BY"); + + groupBySort = 1; + nGroupBy = pGroupBy->nExpr; + nCol = nGroupBy; + j = nGroupBy; + for(i=0; inColumn; i++){ + if( pAggInfo->aCol[i].iSorterColumn>=j ){ + nCol++; + j++; + } + } + regBase = sqlite3GetTempRange(pParse, nCol); + sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); + j = nGroupBy; + for(i=0; inColumn; i++){ + struct AggInfo_col *pCol = &pAggInfo->aCol[i]; + if( pCol->iSorterColumn>=j ){ + int r1 = j + regBase; + sqlite3ExprCodeGetColumnOfTable(v, + pCol->pTab, pCol->iTable, pCol->iColumn, r1); + j++; + } + } + regRecord = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); + sqlite3ReleaseTempReg(pParse, regRecord); + sqlite3ReleaseTempRange(pParse, regBase, nCol); + SELECTTRACE(1,pParse,p,("WhereEnd\n")); + sqlite3WhereEnd(pWInfo); + pAggInfo->sortingIdxPTab = sortPTab = pParse->nTab++; + sortOut = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); + sqlite3VdbeAddOp2(v, OP_SorterSort, pAggInfo->sortingIdx, addrEnd); + VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); + pAggInfo->useSortingIdx = 1; + } + + /* If the index or temporary table used by the GROUP BY sort + ** will naturally deliver rows in the order required by the ORDER BY + ** clause, cancel the ephemeral table open coded earlier. + ** + ** This is an optimization - the correct answer should result regardless. + ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER to + ** disable this optimization for testing purposes. */ + if( orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder) + && (groupBySort || sqlite3WhereIsSorted(pWInfo)) + ){ + sSort.pOrderBy = 0; + sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); + } + + /* Evaluate the current GROUP BY terms and store in b0, b1, b2... + ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth) + ** Then compare the current GROUP BY terms against the GROUP BY terms + ** from the previous row currently stored in a0, a1, a2... + */ + addrTopOfLoop = sqlite3VdbeCurrentAddr(v); + if( groupBySort ){ + sqlite3VdbeAddOp3(v, OP_SorterData, pAggInfo->sortingIdx, + sortOut, sortPTab); + } + for(j=0; jnExpr; j++){ + if( groupBySort ){ + sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); + }else{ + pAggInfo->directMode = 1; + sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); + } + } + sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, + (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addr1+1, 0, addr1+1); VdbeCoverage(v); + + /* Generate code that runs whenever the GROUP BY changes. + ** Changes in the GROUP BY are detected by the previous code + ** block. If there were no changes, this block is skipped. + ** + ** This code copies current group by terms in b0,b1,b2,... + ** over to a0,a1,a2. It then calls the output subroutine + ** and resets the aggregate accumulator registers in preparation + ** for the next GROUP BY batch. + */ + sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); + sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); + VdbeComment((v, "output one row")); + sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v); + VdbeComment((v, "check abort flag")); + sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + VdbeComment((v, "reset accumulator")); + + /* Update the aggregate accumulators based on the content of + ** the current row + */ + sqlite3VdbeJumpHere(v, addr1); + updateAccumulator(pParse, iUseFlag, pAggInfo, eDist); + sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); + VdbeComment((v, "indicate data in accumulator")); + + /* End of the loop + */ + if( groupBySort ){ + sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx,addrTopOfLoop); + VdbeCoverage(v); + }else{ + SELECTTRACE(1,pParse,p,("WhereEnd\n")); + sqlite3WhereEnd(pWInfo); + sqlite3VdbeChangeToNoop(v, addrSortingIdx); + } + sqlite3ExprListDelete(db, pDistinct); + + /* Output the final row of result + */ + sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); + VdbeComment((v, "output final row")); + + /* Jump over the subroutines + */ + sqlite3VdbeGoto(v, addrEnd); + + /* Generate a subroutine that outputs a single row of the result + ** set. This subroutine first looks at the iUseFlag. If iUseFlag + ** is less than or equal to zero, the subroutine is a no-op. If + ** the processing calls for the query to abort, this subroutine + ** increments the iAbortFlag memory location before returning in + ** order to signal the caller to abort. + */ + addrSetAbort = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag); + VdbeComment((v, "set abort flag")); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + sqlite3VdbeResolveLabel(v, addrOutputRow); + addrOutputRow = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + VdbeCoverage(v); + VdbeComment((v, "Groupby result generator entry point")); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + finalizeAggFunctions(pParse, pAggInfo); + sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); + selectInnerLoop(pParse, p, -1, &sSort, + &sDistinct, pDest, + addrOutputRow+1, addrSetAbort); + sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); + VdbeComment((v, "end groupby result generator")); + + /* Generate a subroutine that will reset the group-by accumulator + */ + sqlite3VdbeResolveLabel(v, addrReset); + resetAccumulator(pParse, pAggInfo); + sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); + VdbeComment((v, "indicate accumulator empty")); + sqlite3VdbeAddOp1(v, OP_Return, regReset); + + if( distFlag!=0 && eDist!=WHERE_DISTINCT_NOOP ){ + struct AggInfo_func *pF = &pAggInfo->aFunc[0]; + fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); + } + } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ + else { + Table *pTab; + if( (pTab = isSimpleCount(p, pAggInfo))!=0 ){ + /* If isSimpleCount() returns a pointer to a Table structure, then + ** the SQL statement is of the form: + ** + ** SELECT count(*) FROM + ** + ** where the Table structure returned represents table . + ** + ** This statement is so common that it is optimized specially. The + ** OP_Count instruction is executed either on the intkey table that + ** contains the data for table or on one of its indexes. It + ** is better to execute the op on an index, as indexes are almost + ** always spread across less pages than their corresponding tables. + */ + const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */ + Index *pIdx; /* Iterator variable */ + KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */ + Index *pBest = 0; /* Best index found so far */ + Pgno iRoot = pTab->tnum; /* Root page of scanned b-tree */ + + sqlite3CodeVerifySchema(pParse, iDb); + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + + /* Search for the index that has the lowest scan cost. + ** + ** (2011-04-15) Do not do a full scan of an unordered index. + ** + ** (2013-10-03) Do not count the entries in a partial index. + ** + ** In practice the KeyInfo structure will not be used. It is only + ** passed to keep OP_OpenRead happy. + */ + if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab); + if( !p->pSrc->a[0].fg.notIndexed ){ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->bUnordered==0 + && pIdx->szIdxRowszTabRow + && pIdx->pPartIdxWhere==0 + && (!pBest || pIdx->szIdxRowszIdxRow) + ){ + pBest = pIdx; + } + } + } + if( pBest ){ + iRoot = pBest->tnum; + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pBest); + } + + /* Open a read-only cursor, execute the OP_Count, close the cursor. */ + sqlite3VdbeAddOp4Int(v, OP_OpenRead, iCsr, (int)iRoot, iDb, 1); + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO); + } + sqlite3VdbeAddOp2(v, OP_Count, iCsr, pAggInfo->aFunc[0].iMem); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + explainSimpleCount(pParse, pTab, pBest); + }else{ + int regAcc = 0; /* "populate accumulators" flag */ + ExprList *pDistinct = 0; + u16 distFlag = 0; + int eDist; + + /* If there are accumulator registers but no min() or max() functions + ** without FILTER clauses, allocate register regAcc. Register regAcc + ** will contain 0 the first time the inner loop runs, and 1 thereafter. + ** The code generated by updateAccumulator() uses this to ensure + ** that the accumulator registers are (a) updated only once if + ** there are no min() or max functions or (b) always updated for the + ** first row visited by the aggregate, so that they are updated at + ** least once even if the FILTER clause means the min() or max() + ** function visits zero rows. */ + if( pAggInfo->nAccumulator ){ + for(i=0; inFunc; i++){ + if( ExprHasProperty(pAggInfo->aFunc[i].pFExpr, EP_WinFunc) ){ + continue; + } + if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ + break; + } + } + if( i==pAggInfo->nFunc ){ + regAcc = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc); + } + }else if( pAggInfo->nFunc==1 && pAggInfo->aFunc[0].iDistinct>=0 ){ + assert( ExprUseXList(pAggInfo->aFunc[0].pFExpr) ); + pDistinct = pAggInfo->aFunc[0].pFExpr->x.pList; + distFlag = pDistinct ? (WHERE_WANT_DISTINCT|WHERE_AGG_DISTINCT) : 0; + } + + /* This case runs if the aggregate has no GROUP BY clause. The + ** processing is much simpler since there is only a single row + ** of output. + */ + assert( p->pGroupBy==0 ); + resetAccumulator(pParse, pAggInfo); + + /* If this query is a candidate for the min/max optimization, then + ** minMaxFlag will have been previously set to either + ** WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX and pMinMaxOrderBy will + ** be an appropriate ORDER BY expression for the optimization. + */ + assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 ); + assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 ); + + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy, + pDistinct, 0, minMaxFlag|distFlag, 0); + if( pWInfo==0 ){ + goto select_end; + } + SELECTTRACE(1,pParse,p,("WhereBegin returns\n")); + eDist = sqlite3WhereIsDistinct(pWInfo); + updateAccumulator(pParse, regAcc, pAggInfo, eDist); + if( eDist!=WHERE_DISTINCT_NOOP ){ + struct AggInfo_func *pF = pAggInfo->aFunc; + if( pF ){ + fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); + } + } + + if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); + if( minMaxFlag ){ + sqlite3WhereMinMaxOptEarlyOut(v, pWInfo); + } + SELECTTRACE(1,pParse,p,("WhereEnd\n")); + sqlite3WhereEnd(pWInfo); + finalizeAggFunctions(pParse, pAggInfo); + } + + sSort.pOrderBy = 0; + sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL); + selectInnerLoop(pParse, p, -1, 0, 0, + pDest, addrEnd, addrEnd); + } + sqlite3VdbeResolveLabel(v, addrEnd); + + } /* endif aggregate query */ + + if( sDistinct.eTnctType==WHERE_DISTINCT_UNORDERED ){ + explainTempTable(pParse, "DISTINCT"); + } + + /* If there is an ORDER BY clause, then we need to sort the results + ** and send them to the callback one by one. + */ + if( sSort.pOrderBy ){ + explainTempTable(pParse, + sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); + assert( p->pEList==pEList ); + generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest); + } + + /* Jump here to skip this query + */ + sqlite3VdbeResolveLabel(v, iEnd); + + /* The SELECT has been coded. If there is an error in the Parse structure, + ** set the return code to 1. Otherwise 0. */ + rc = (pParse->nErr>0); + + /* Control jumps to here if an error is encountered above, or upon + ** successful coding of the SELECT. + */ +select_end: + assert( db->mallocFailed==0 || db->mallocFailed==1 ); + assert( db->mallocFailed==0 || pParse->nErr!=0 ); + sqlite3ExprListDelete(db, pMinMaxOrderBy); +#ifdef SQLITE_DEBUG + if( pAggInfo && !db->mallocFailed ){ + for(i=0; inColumn; i++){ + Expr *pExpr = pAggInfo->aCol[i].pCExpr; + assert( pExpr!=0 ); + assert( pExpr->pAggInfo==pAggInfo ); + assert( pExpr->iAgg==i ); + } + for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pFExpr; + assert( pExpr!=0 ); + assert( pExpr->pAggInfo==pAggInfo ); + assert( pExpr->iAgg==i ); + } + } +#endif + +#if TREETRACE_ENABLED + SELECTTRACE(0x1,pParse,p,("end processing\n")); + if( (sqlite3TreeTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + ExplainQueryPlanPop(pParse); + return rc; +} + +/************** End of select.c **********************************************/ +/************** Begin file table.c *******************************************/ +/* +** 2001 September 15 +** +** 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 contains the sqlite3_get_table() and sqlite3_free_table() +** interface routines. These are just wrappers around the main +** interface routine of sqlite3_exec(). +** +** These routines are in a separate files so that they will not be linked +** if they are not used. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_GET_TABLE + +/* +** This structure is used to pass data from sqlite3_get_table() through +** to the callback function is uses to build the result. +*/ +typedef struct TabResult { + char **azResult; /* Accumulated output */ + char *zErrMsg; /* Error message text, if an error occurs */ + u32 nAlloc; /* Slots allocated for azResult[] */ + u32 nRow; /* Number of rows in the result */ + u32 nColumn; /* Number of columns in the result */ + u32 nData; /* Slots used in azResult[]. (nRow+1)*nColumn */ + int rc; /* Return code from sqlite3_exec() */ +} TabResult; + +/* +** This routine is called once for each row in the result table. Its job +** is to fill in the TabResult structure appropriately, allocating new +** memory as necessary. +*/ +static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ + TabResult *p = (TabResult*)pArg; /* Result accumulator */ + int need; /* Slots needed in p->azResult[] */ + int i; /* Loop counter */ + char *z; /* A single column of result */ + + /* Make sure there is enough space in p->azResult to hold everything + ** we need to remember from this invocation of the callback. + */ + if( p->nRow==0 && argv!=0 ){ + need = nCol*2; + }else{ + need = nCol; + } + if( p->nData + need > p->nAlloc ){ + char **azNew; + p->nAlloc = p->nAlloc*2 + need; + azNew = sqlite3Realloc( p->azResult, sizeof(char*)*p->nAlloc ); + if( azNew==0 ) goto malloc_failed; + p->azResult = azNew; + } + + /* If this is the first row, then generate an extra row containing + ** the names of all columns. + */ + if( p->nRow==0 ){ + p->nColumn = nCol; + for(i=0; iazResult[p->nData++] = z; + } + }else if( (int)p->nColumn!=nCol ){ + sqlite3_free(p->zErrMsg); + p->zErrMsg = sqlite3_mprintf( + "sqlite3_get_table() called with two or more incompatible queries" + ); + p->rc = SQLITE_ERROR; + return 1; + } + + /* Copy over the row data + */ + if( argv!=0 ){ + for(i=0; iazResult[p->nData++] = z; + } + p->nRow++; + } + return 0; + +malloc_failed: + p->rc = SQLITE_NOMEM_BKPT; + return 1; +} + +/* +** Query the database. But instead of invoking a callback for each row, +** malloc() for space to hold the result and return the entire results +** at the conclusion of the call. +** +** The result that is written to ***pazResult is held in memory obtained +** from malloc(). But the caller cannot free this memory directly. +** Instead, the entire table should be passed to sqlite3_free_table() when +** the calling procedure is finished using it. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* The database on which the SQL executes */ + const char *zSql, /* The SQL to be executed */ + char ***pazResult, /* Write the result table here */ + int *pnRow, /* Write the number of rows in the result here */ + int *pnColumn, /* Write the number of columns of result here */ + char **pzErrMsg /* Write error messages here */ +){ + int rc; + TabResult res; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || pazResult==0 ) return SQLITE_MISUSE_BKPT; +#endif + *pazResult = 0; + if( pnColumn ) *pnColumn = 0; + if( pnRow ) *pnRow = 0; + if( pzErrMsg ) *pzErrMsg = 0; + res.zErrMsg = 0; + res.nRow = 0; + res.nColumn = 0; + res.nData = 1; + res.nAlloc = 20; + res.rc = SQLITE_OK; + res.azResult = sqlite3_malloc64(sizeof(char*)*res.nAlloc ); + if( res.azResult==0 ){ + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + res.azResult[0] = 0; + rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); + assert( sizeof(res.azResult[0])>= sizeof(res.nData) ); + res.azResult[0] = SQLITE_INT_TO_PTR(res.nData); + if( (rc&0xff)==SQLITE_ABORT ){ + sqlite3_free_table(&res.azResult[1]); + if( res.zErrMsg ){ + if( pzErrMsg ){ + sqlite3_free(*pzErrMsg); + *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg); + } + sqlite3_free(res.zErrMsg); + } + db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ + return res.rc; + } + sqlite3_free(res.zErrMsg); + if( rc!=SQLITE_OK ){ + sqlite3_free_table(&res.azResult[1]); + return rc; + } + if( res.nAlloc>res.nData ){ + char **azNew; + azNew = sqlite3Realloc( res.azResult, sizeof(char*)*res.nData ); + if( azNew==0 ){ + sqlite3_free_table(&res.azResult[1]); + db->errCode = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + res.azResult = azNew; + } + *pazResult = &res.azResult[1]; + if( pnColumn ) *pnColumn = res.nColumn; + if( pnRow ) *pnRow = res.nRow; + return rc; +} + +/* +** This routine frees the space the sqlite3_get_table() malloced. +*/ +SQLITE_API void sqlite3_free_table( + char **azResult /* Result returned from sqlite3_get_table() */ +){ + if( azResult ){ + int i, n; + azResult--; + assert( azResult!=0 ); + n = SQLITE_PTR_TO_INT(azResult[0]); + for(i=1; ipNext; + + sqlite3ExprDelete(db, pTmp->pWhere); + sqlite3ExprListDelete(db, pTmp->pExprList); + sqlite3SelectDelete(db, pTmp->pSelect); + sqlite3IdListDelete(db, pTmp->pIdList); + sqlite3UpsertDelete(db, pTmp->pUpsert); + sqlite3SrcListDelete(db, pTmp->pFrom); + sqlite3DbFree(db, pTmp->zSpan); + + sqlite3DbFree(db, pTmp); + } +} + +/* +** Given table pTab, return a list of all the triggers attached to +** the table. The list is connected by Trigger.pNext pointers. +** +** All of the triggers on pTab that are in the same database as pTab +** are already attached to pTab->pTrigger. But there might be additional +** triggers on pTab in the TEMP schema. This routine prepends all +** TEMP triggers on pTab to the beginning of the pTab->pTrigger list +** and returns the combined list. +** +** To state it another way: This routine returns a list of all triggers +** that fire off of pTab. The list will include any TEMP triggers on +** pTab as well as the triggers lised in pTab->pTrigger. +*/ +SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ + Schema *pTmpSchema; /* Schema of the pTab table */ + Trigger *pList; /* List of triggers to return */ + HashElem *p; /* Loop variable for TEMP triggers */ + + assert( pParse->disableTriggers==0 ); + pTmpSchema = pParse->db->aDb[1].pSchema; + p = sqliteHashFirst(&pTmpSchema->trigHash); + pList = pTab->pTrigger; + while( p ){ + Trigger *pTrig = (Trigger *)sqliteHashData(p); + if( pTrig->pTabSchema==pTab->pSchema + && pTrig->table + && 0==sqlite3StrICmp(pTrig->table, pTab->zName) + && pTrig->pTabSchema!=pTmpSchema + ){ + pTrig->pNext = pList; + pList = pTrig; + }else if( pTrig->op==TK_RETURNING ){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + assert( pParse->db->pVtabCtx==0 ); +#endif + assert( pParse->bReturning ); + assert( &(pParse->u1.pReturning->retTrig) == pTrig ); + pTrig->table = pTab->zName; + pTrig->pTabSchema = pTab->pSchema; + pTrig->pNext = pList; + pList = pTrig; + } + p = sqliteHashNext(p); + } +#if 0 + if( pList ){ + Trigger *pX; + printf("Triggers for %s:", pTab->zName); + for(pX=pList; pX; pX=pX->pNext){ + printf(" %s", pX->zName); + } + printf("\n"); + fflush(stdout); + } +#endif + return pList; +} + +/* +** This is called by the parser when it sees a CREATE TRIGGER statement +** up to the point of the BEGIN before the trigger actions. A Trigger +** structure is generated based on the information available and stored +** in pParse->pNewTrigger. After the trigger actions have been parsed, the +** sqlite3FinishTrigger() function is called to complete the trigger +** construction process. +*/ +SQLITE_PRIVATE void sqlite3BeginTrigger( + Parse *pParse, /* The parse context of the CREATE TRIGGER statement */ + Token *pName1, /* The name of the trigger */ + Token *pName2, /* The name of the trigger */ + int tr_tm, /* One of TK_BEFORE, TK_AFTER, TK_INSTEAD */ + int op, /* One of TK_INSERT, TK_UPDATE, TK_DELETE */ + IdList *pColumns, /* column list if this is an UPDATE OF trigger */ + SrcList *pTableName,/* The name of the table/view the trigger applies to */ + Expr *pWhen, /* WHEN clause */ + int isTemp, /* True if the TEMPORARY keyword is present */ + int noErr /* Suppress errors if the trigger already exists */ +){ + Trigger *pTrigger = 0; /* The new trigger */ + Table *pTab; /* Table that the trigger fires off of */ + char *zName = 0; /* Name of the trigger */ + sqlite3 *db = pParse->db; /* The database connection */ + int iDb; /* The database to store the trigger in */ + Token *pName; /* The unqualified db name */ + DbFixer sFix; /* State vector for the DB fixer */ + + assert( pName1!=0 ); /* pName1->z might be NULL, but not pName1 itself */ + assert( pName2!=0 ); + assert( op==TK_INSERT || op==TK_UPDATE || op==TK_DELETE ); + assert( op>0 && op<0xff ); + if( isTemp ){ + /* If TEMP was specified, then the trigger name may not be qualified. */ + if( pName2->n>0 ){ + sqlite3ErrorMsg(pParse, "temporary trigger may not have qualified name"); + goto trigger_cleanup; + } + iDb = 1; + pName = pName1; + }else{ + /* Figure out the db that the trigger will be created in */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ){ + goto trigger_cleanup; + } + } + if( !pTableName || db->mallocFailed ){ + goto trigger_cleanup; + } + + /* A long-standing parser bug is that this syntax was allowed: + ** + ** CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab .... + ** ^^^^^^^^ + ** + ** To maintain backwards compatibility, ignore the database + ** name on pTableName if we are reparsing out of the schema table + */ + if( db->init.busy && iDb!=1 ){ + sqlite3DbFree(db, pTableName->a[0].zDatabase); + pTableName->a[0].zDatabase = 0; + } + + /* If the trigger name was unqualified, and the table is a temp table, + ** then set iDb to 1 to create the trigger in the temporary database. + ** If sqlite3SrcListLookup() returns 0, indicating the table does not + ** exist, the error is caught by the block below. + */ + pTab = sqlite3SrcListLookup(pParse, pTableName); + if( db->init.busy==0 && pName2->n==0 && pTab + && pTab->pSchema==db->aDb[1].pSchema ){ + iDb = 1; + } + + /* Ensure the table name matches database name and that the table exists */ + if( db->mallocFailed ) goto trigger_cleanup; + assert( pTableName->nSrc==1 ); + sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName); + if( sqlite3FixSrcList(&sFix, pTableName) ){ + goto trigger_cleanup; + } + pTab = sqlite3SrcListLookup(pParse, pTableName); + if( !pTab ){ + /* The table does not exist. */ + goto trigger_orphan_error; + } + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables"); + goto trigger_orphan_error; + } + + /* Check that the trigger name is not reserved and that no trigger of the + ** specified name exists */ + zName = sqlite3NameFromToken(db, pName); + if( zName==0 ){ + assert( db->mallocFailed ); + goto trigger_cleanup; + } + if( sqlite3CheckObjectName(pParse, zName, "trigger", pTab->zName) ){ + goto trigger_cleanup; + } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !IN_RENAME_OBJECT ){ + if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),zName) ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "trigger %T already exists", pName); + }else{ + assert( !db->init.busy ); + sqlite3CodeVerifySchema(pParse, iDb); + } + goto trigger_cleanup; + } + } + + /* Do not create a trigger on a system table */ + if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); + goto trigger_cleanup; + } + + /* INSTEAD of triggers are only for views and views only support INSTEAD + ** of triggers. + */ + if( IsView(pTab) && tr_tm!=TK_INSTEAD ){ + sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", + (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName->a); + goto trigger_orphan_error; + } + if( !IsView(pTab) && tr_tm==TK_INSTEAD ){ + sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF" + " trigger on table: %S", pTableName->a); + goto trigger_orphan_error; + } + +#ifndef SQLITE_OMIT_AUTHORIZATION + if( !IN_RENAME_OBJECT ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + int code = SQLITE_CREATE_TRIGGER; + const char *zDb = db->aDb[iTabDb].zDbSName; + const char *zDbTrig = isTemp ? db->aDb[1].zDbSName : zDb; + if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; + if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){ + goto trigger_cleanup; + } + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb),0,zDb)){ + goto trigger_cleanup; + } + } +#endif + + /* INSTEAD OF triggers can only appear on views and BEFORE triggers + ** cannot appear on views. So we might as well translate every + ** INSTEAD OF trigger into a BEFORE trigger. It simplifies code + ** elsewhere. + */ + if (tr_tm == TK_INSTEAD){ + tr_tm = TK_BEFORE; + } + + /* Build the Trigger object */ + pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); + if( pTrigger==0 ) goto trigger_cleanup; + pTrigger->zName = zName; + zName = 0; + pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName); + pTrigger->pSchema = db->aDb[iDb].pSchema; + pTrigger->pTabSchema = pTab->pSchema; + pTrigger->op = (u8)op; + pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER; + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, pTrigger->table, pTableName->a[0].zName); + pTrigger->pWhen = pWhen; + pWhen = 0; + }else{ + pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); + } + pTrigger->pColumns = pColumns; + pColumns = 0; + assert( pParse->pNewTrigger==0 ); + pParse->pNewTrigger = pTrigger; + +trigger_cleanup: + sqlite3DbFree(db, zName); + sqlite3SrcListDelete(db, pTableName); + sqlite3IdListDelete(db, pColumns); + sqlite3ExprDelete(db, pWhen); + if( !pParse->pNewTrigger ){ + sqlite3DeleteTrigger(db, pTrigger); + }else{ + assert( pParse->pNewTrigger==pTrigger ); + } + return; + +trigger_orphan_error: + if( db->init.iDb==1 ){ + /* Ticket #3810. + ** Normally, whenever a table is dropped, all associated triggers are + ** dropped too. But if a TEMP trigger is created on a non-TEMP table + ** and the table is dropped by a different database connection, the + ** trigger is not visible to the database connection that does the + ** drop so the trigger cannot be dropped. This results in an + ** "orphaned trigger" - a trigger whose associated table is missing. + ** + ** 2020-11-05 see also https://sqlite.org/forum/forumpost/157dc791df + */ + db->init.orphanTrigger = 1; + } + goto trigger_cleanup; +} + +/* +** This routine is called after all of the trigger actions have been parsed +** in order to complete the process of building the trigger. +*/ +SQLITE_PRIVATE void sqlite3FinishTrigger( + Parse *pParse, /* Parser context */ + TriggerStep *pStepList, /* The triggered program */ + Token *pAll /* Token that describes the complete CREATE TRIGGER */ +){ + Trigger *pTrig = pParse->pNewTrigger; /* Trigger being finished */ + char *zName; /* Name of trigger */ + sqlite3 *db = pParse->db; /* The database */ + DbFixer sFix; /* Fixer object */ + int iDb; /* Database containing the trigger */ + Token nameToken; /* Trigger name for error reporting */ + + pParse->pNewTrigger = 0; + if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup; + zName = pTrig->zName; + iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); + pTrig->step_list = pStepList; + while( pStepList ){ + pStepList->pTrig = pTrig; + pStepList = pStepList->pNext; + } + sqlite3TokenInit(&nameToken, pTrig->zName); + sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken); + if( sqlite3FixTriggerStep(&sFix, pTrig->step_list) + || sqlite3FixExpr(&sFix, pTrig->pWhen) + ){ + goto triggerfinish_cleanup; + } + +#ifndef SQLITE_OMIT_ALTERTABLE + if( IN_RENAME_OBJECT ){ + assert( !db->init.busy ); + pParse->pNewTrigger = pTrig; + pTrig = 0; + }else +#endif + + /* if we are not initializing, + ** build the sqlite_schema entry + */ + if( !db->init.busy ){ + Vdbe *v; + char *z; + + /* Make an entry in the sqlite_schema table */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto triggerfinish_cleanup; + sqlite3BeginWriteOperation(pParse, 0, iDb); + z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); + testcase( z==0 ); + sqlite3NestedParse(pParse, + "INSERT INTO %Q." LEGACY_SCHEMA_TABLE + " VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", + db->aDb[iDb].zDbSName, zName, + pTrig->table, z); + sqlite3DbFree(db, z); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddParseSchemaOp(v, iDb, + sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName), 0); + } + + if( db->init.busy ){ + Trigger *pLink = pTrig; + Hash *pHash = &db->aDb[iDb].pSchema->trigHash; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( pLink!=0 ); + pTrig = sqlite3HashInsert(pHash, zName, pTrig); + if( pTrig ){ + sqlite3OomFault(db); + }else if( pLink->pSchema==pLink->pTabSchema ){ + Table *pTab; + pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table); + assert( pTab!=0 ); + pLink->pNext = pTab->pTrigger; + pTab->pTrigger = pLink; + } + } + +triggerfinish_cleanup: + sqlite3DeleteTrigger(db, pTrig); + assert( IN_RENAME_OBJECT || !pParse->pNewTrigger ); + sqlite3DeleteTriggerStep(db, pStepList); +} + +/* +** Duplicate a range of text from an SQL statement, then convert all +** whitespace characters into ordinary space characters. +*/ +static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ + char *z = sqlite3DbSpanDup(db, zStart, zEnd); + int i; + if( z ) for(i=0; z[i]; i++) if( sqlite3Isspace(z[i]) ) z[i] = ' '; + return z; +} + +/* +** Turn a SELECT statement (that the pSelect parameter points to) into +** a trigger step. Return a pointer to a TriggerStep structure. +** +** The parser calls this routine when it finds a SELECT statement in +** body of a TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep( + sqlite3 *db, /* Database connection */ + Select *pSelect, /* The SELECT statement */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep)); + if( pTriggerStep==0 ) { + sqlite3SelectDelete(db, pSelect); + return 0; + } + pTriggerStep->op = TK_SELECT; + pTriggerStep->pSelect = pSelect; + pTriggerStep->orconf = OE_Default; + pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd); + return pTriggerStep; +} + +/* +** Allocate space to hold a new trigger step. The allocated space +** holds both the TriggerStep object and the TriggerStep.target.z string. +** +** If an OOM error occurs, NULL is returned and db->mallocFailed is set. +*/ +static TriggerStep *triggerStepAllocate( + Parse *pParse, /* Parser context */ + u8 op, /* Trigger opcode */ + Token *pName, /* The target name */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + if( pParse->nErr ) return 0; + pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); + if( pTriggerStep ){ + char *z = (char*)&pTriggerStep[1]; + memcpy(z, pName->z, pName->n); + sqlite3Dequote(z); + pTriggerStep->zTarget = z; + pTriggerStep->op = op; + pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenMap(pParse, pTriggerStep->zTarget, pName); + } + } + return pTriggerStep; +} + +/* +** Build a trigger step out of an INSERT statement. Return a pointer +** to the new trigger step. +** +** The parser calls this routine when it sees an INSERT inside the +** body of a trigger. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( + Parse *pParse, /* Parser */ + Token *pTableName, /* Name of the table into which we insert */ + IdList *pColumn, /* List of columns in pTableName to insert into */ + Select *pSelect, /* A SELECT statement that supplies values */ + u8 orconf, /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ + Upsert *pUpsert, /* ON CONFLICT clauses for upsert */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + assert(pSelect != 0 || db->mallocFailed); + + pTriggerStep = triggerStepAllocate(pParse, TK_INSERT, pTableName,zStart,zEnd); + if( pTriggerStep ){ + if( IN_RENAME_OBJECT ){ + pTriggerStep->pSelect = pSelect; + pSelect = 0; + }else{ + pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + } + pTriggerStep->pIdList = pColumn; + pTriggerStep->pUpsert = pUpsert; + pTriggerStep->orconf = orconf; + if( pUpsert ){ + sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget); + } + }else{ + testcase( pColumn ); + sqlite3IdListDelete(db, pColumn); + testcase( pUpsert ); + sqlite3UpsertDelete(db, pUpsert); + } + sqlite3SelectDelete(db, pSelect); + + return pTriggerStep; +} + +/* +** Construct a trigger step that implements an UPDATE statement and return +** a pointer to that trigger step. The parser calls this routine when it +** sees an UPDATE statement inside the body of a CREATE TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( + Parse *pParse, /* Parser */ + Token *pTableName, /* Name of the table to be updated */ + SrcList *pFrom, /* FROM clause for an UPDATE-FROM, or NULL */ + ExprList *pEList, /* The SET clause: list of column and new values */ + Expr *pWhere, /* The WHERE clause */ + u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + pTriggerStep = triggerStepAllocate(pParse, TK_UPDATE, pTableName,zStart,zEnd); + if( pTriggerStep ){ + if( IN_RENAME_OBJECT ){ + pTriggerStep->pExprList = pEList; + pTriggerStep->pWhere = pWhere; + pTriggerStep->pFrom = pFrom; + pEList = 0; + pWhere = 0; + pFrom = 0; + }else{ + pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE); + pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + pTriggerStep->pFrom = sqlite3SrcListDup(db, pFrom, EXPRDUP_REDUCE); + } + pTriggerStep->orconf = orconf; + } + sqlite3ExprListDelete(db, pEList); + sqlite3ExprDelete(db, pWhere); + sqlite3SrcListDelete(db, pFrom); + return pTriggerStep; +} + +/* +** Construct a trigger step that implements a DELETE statement and return +** a pointer to that trigger step. The parser calls this routine when it +** sees a DELETE statement inside the body of a CREATE TRIGGER. +*/ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep( + Parse *pParse, /* Parser */ + Token *pTableName, /* The table from which rows are deleted */ + Expr *pWhere, /* The WHERE clause */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ + sqlite3 *db = pParse->db; + TriggerStep *pTriggerStep; + + pTriggerStep = triggerStepAllocate(pParse, TK_DELETE, pTableName,zStart,zEnd); + if( pTriggerStep ){ + if( IN_RENAME_OBJECT ){ + pTriggerStep->pWhere = pWhere; + pWhere = 0; + }else{ + pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); + } + pTriggerStep->orconf = OE_Default; + } + sqlite3ExprDelete(db, pWhere); + return pTriggerStep; +} + +/* +** Recursively delete a Trigger structure +*/ +SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ + if( pTrigger==0 || pTrigger->bReturning ) return; + sqlite3DeleteTriggerStep(db, pTrigger->step_list); + sqlite3DbFree(db, pTrigger->zName); + sqlite3DbFree(db, pTrigger->table); + sqlite3ExprDelete(db, pTrigger->pWhen); + sqlite3IdListDelete(db, pTrigger->pColumns); + sqlite3DbFree(db, pTrigger); +} + +/* +** This function is called to drop a trigger from the database schema. +** +** This may be called directly from the parser and therefore identifies +** the trigger by name. The sqlite3DropTriggerPtr() routine does the +** same job as this routine except it takes a pointer to the trigger +** instead of the trigger name. +**/ +SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){ + Trigger *pTrigger = 0; + int i; + const char *zDb; + const char *zName; + sqlite3 *db = pParse->db; + + if( db->mallocFailed ) goto drop_trigger_cleanup; + if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + goto drop_trigger_cleanup; + } + + assert( pName->nSrc==1 ); + zDb = pName->a[0].zDatabase; + zName = pName->a[0].zName; + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDb && sqlite3DbIsNamed(db, j, zDb)==0 ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName); + if( pTrigger ) break; + } + if( !pTrigger ){ + if( !noErr ){ + sqlite3ErrorMsg(pParse, "no such trigger: %S", pName->a); + }else{ + sqlite3CodeVerifyNamedSchema(pParse, zDb); + } + pParse->checkSchema = 1; + goto drop_trigger_cleanup; + } + sqlite3DropTriggerPtr(pParse, pTrigger); + +drop_trigger_cleanup: + sqlite3SrcListDelete(db, pName); +} + +/* +** Return a pointer to the Table structure for the table that a trigger +** is set on. +*/ +static Table *tableOfTrigger(Trigger *pTrigger){ + return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table); +} + + +/* +** Drop a trigger given a pointer to that trigger. +*/ +SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ + Table *pTable; + Vdbe *v; + sqlite3 *db = pParse->db; + int iDb; + + iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema); + assert( iDb>=0 && iDbnDb ); + pTable = tableOfTrigger(pTrigger); + assert( (pTable && pTable->pSchema==pTrigger->pSchema) || iDb==1 ); +#ifndef SQLITE_OMIT_AUTHORIZATION + if( pTable ){ + int code = SQLITE_DROP_TRIGGER; + const char *zDb = db->aDb[iDb].zDbSName; + const char *zTab = SCHEMA_TABLE(iDb); + if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; + if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || + sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ + return; + } + } +#endif + + /* Generate code to destroy the database record of the trigger. + */ + if( (v = sqlite3GetVdbe(pParse))!=0 ){ + sqlite3NestedParse(pParse, + "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", + db->aDb[iDb].zDbSName, pTrigger->zName + ); + sqlite3ChangeCookie(pParse, iDb); + sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); + } +} + +/* +** Remove a trigger from the hash tables of the sqlite* pointer. +*/ +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ + Trigger *pTrigger; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &(db->aDb[iDb].pSchema->trigHash); + pTrigger = sqlite3HashInsert(pHash, zName, 0); + if( ALWAYS(pTrigger) ){ + if( pTrigger->pSchema==pTrigger->pTabSchema ){ + Table *pTab = tableOfTrigger(pTrigger); + if( pTab ){ + Trigger **pp; + for(pp=&pTab->pTrigger; *pp; pp=&((*pp)->pNext)){ + if( *pp==pTrigger ){ + *pp = (*pp)->pNext; + break; + } + } + } + } + sqlite3DeleteTrigger(db, pTrigger); + db->mDbFlags |= DBFLAG_SchemaChange; + } +} + +/* +** pEList is the SET clause of an UPDATE statement. Each entry +** in pEList is of the format =. If any of the entries +** in pEList have an which matches an identifier in pIdList, +** then return TRUE. If pIdList==NULL, then it is considered a +** wildcard that matches anything. Likewise if pEList==NULL then +** it matches anything so always return true. Return false only +** if there is no match. +*/ +static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ + int e; + if( pIdList==0 || NEVER(pEList==0) ) return 1; + for(e=0; enExpr; e++){ + if( sqlite3IdListIndex(pIdList, pEList->a[e].zEName)>=0 ) return 1; + } + return 0; +} + +/* +** Return true if any TEMP triggers exist +*/ +static int tempTriggersExist(sqlite3 *db){ + if( NEVER(db->aDb[1].pSchema==0) ) return 0; + if( sqliteHashFirst(&db->aDb[1].pSchema->trigHash)==0 ) return 0; + return 1; +} + +/* +** Return a list of all triggers on table pTab if there exists at least +** one trigger that must be fired when an operation of type 'op' is +** performed on the table, and, if that operation is an UPDATE, if at +** least one of the columns in pChanges is being modified. +*/ +static SQLITE_NOINLINE Trigger *triggersReallyExist( + Parse *pParse, /* Parse context */ + Table *pTab, /* The table the contains the triggers */ + int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ + ExprList *pChanges, /* Columns that change in an UPDATE statement */ + int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +){ + int mask = 0; + Trigger *pList = 0; + Trigger *p; + + pList = sqlite3TriggerList(pParse, pTab); + assert( pList==0 || IsVirtual(pTab)==0 + || (pList->bReturning && pList->pNext==0) ); + if( pList!=0 ){ + p = pList; + if( (pParse->db->flags & SQLITE_EnableTrigger)==0 + && pTab->pTrigger!=0 + ){ + /* The SQLITE_DBCONFIG_ENABLE_TRIGGER setting is off. That means that + ** only TEMP triggers are allowed. Truncate the pList so that it + ** includes only TEMP triggers */ + if( pList==pTab->pTrigger ){ + pList = 0; + goto exit_triggers_exist; + } + while( ALWAYS(p->pNext) && p->pNext!=pTab->pTrigger ) p = p->pNext; + p->pNext = 0; + p = pList; + } + do{ + if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){ + mask |= p->tr_tm; + }else if( p->op==TK_RETURNING ){ + /* The first time a RETURNING trigger is seen, the "op" value tells + ** us what time of trigger it should be. */ + assert( sqlite3IsToplevel(pParse) ); + p->op = op; + if( IsVirtual(pTab) ){ + if( op!=TK_INSERT ){ + sqlite3ErrorMsg(pParse, + "%s RETURNING is not available on virtual tables", + op==TK_DELETE ? "DELETE" : "UPDATE"); + } + p->tr_tm = TRIGGER_BEFORE; + }else{ + p->tr_tm = TRIGGER_AFTER; + } + mask |= p->tr_tm; + }else if( p->bReturning && p->op==TK_INSERT && op==TK_UPDATE + && sqlite3IsToplevel(pParse) ){ + /* Also fire a RETURNING trigger for an UPSERT */ + mask |= p->tr_tm; + } + p = p->pNext; + }while( p ); + } +exit_triggers_exist: + if( pMask ){ + *pMask = mask; + } + return (mask ? pList : 0); +} +SQLITE_PRIVATE Trigger *sqlite3TriggersExist( + Parse *pParse, /* Parse context */ + Table *pTab, /* The table the contains the triggers */ + int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ + ExprList *pChanges, /* Columns that change in an UPDATE statement */ + int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +){ + assert( pTab!=0 ); + if( (pTab->pTrigger==0 && !tempTriggersExist(pParse->db)) + || pParse->disableTriggers + ){ + if( pMask ) *pMask = 0; + return 0; + } + return triggersReallyExist(pParse,pTab,op,pChanges,pMask); +} + +/* +** Convert the pStep->zTarget string into a SrcList and return a pointer +** to that SrcList. +** +** This routine adds a specific database name, if needed, to the target when +** forming the SrcList. This prevents a trigger in one database from +** referring to a target in another database. An exception is when the +** trigger is in TEMP in which case it can refer to any other database it +** wants. +*/ +SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc( + Parse *pParse, /* The parsing context */ + TriggerStep *pStep /* The trigger containing the target token */ +){ + sqlite3 *db = pParse->db; + SrcList *pSrc; /* SrcList to be returned */ + char *zName = sqlite3DbStrDup(db, pStep->zTarget); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + assert( pSrc==0 || pSrc->nSrc==1 ); + assert( zName || pSrc==0 ); + if( pSrc ){ + Schema *pSchema = pStep->pTrig->pSchema; + pSrc->a[0].zName = zName; + if( pSchema!=db->aDb[1].pSchema ){ + pSrc->a[0].pSchema = pSchema; + } + if( pStep->pFrom ){ + SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0); + if( pDup && pDup->nSrc>1 && !IN_RENAME_OBJECT ){ + Select *pSubquery; + Token as; + pSubquery = sqlite3SelectNew(pParse,0,pDup,0,0,0,0,SF_NestedFrom,0); + as.n = 0; + as.z = 0; + pDup = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); + } + pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup); + } + }else{ + sqlite3DbFree(db, zName); + } + return pSrc; +} + +/* +** Return true if the pExpr term from the RETURNING clause argument +** list is of the form "*". Raise an error if the terms if of the +** form "table.*". +*/ +static int isAsteriskTerm( + Parse *pParse, /* Parsing context */ + Expr *pTerm /* A term in the RETURNING clause */ +){ + assert( pTerm!=0 ); + if( pTerm->op==TK_ASTERISK ) return 1; + if( pTerm->op!=TK_DOT ) return 0; + assert( pTerm->pRight!=0 ); + assert( pTerm->pLeft!=0 ); + if( pTerm->pRight->op!=TK_ASTERISK ) return 0; + sqlite3ErrorMsg(pParse, "RETURNING may not use \"TABLE.*\" wildcards"); + return 1; +} + +/* The input list pList is the list of result set terms from a RETURNING +** clause. The table that we are returning from is pTab. +** +** This routine makes a copy of the pList, and at the same time expands +** any "*" wildcards to be the complete set of columns from pTab. +*/ +static ExprList *sqlite3ExpandReturning( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* The arguments to RETURNING */ + Table *pTab /* The table being updated */ +){ + ExprList *pNew = 0; + sqlite3 *db = pParse->db; + int i; + + for(i=0; inExpr; i++){ + Expr *pOldExpr = pList->a[i].pExpr; + if( NEVER(pOldExpr==0) ) continue; + if( isAsteriskTerm(pParse, pOldExpr) ){ + int jj; + for(jj=0; jjnCol; jj++){ + Expr *pNewExpr; + if( IsHiddenColumn(pTab->aCol+jj) ) continue; + pNewExpr = sqlite3Expr(db, TK_ID, pTab->aCol[jj].zCnName); + pNew = sqlite3ExprListAppend(pParse, pNew, pNewExpr); + if( !db->mallocFailed ){ + struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; + pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName); + pItem->fg.eEName = ENAME_NAME; + } + } + }else{ + Expr *pNewExpr = sqlite3ExprDup(db, pOldExpr, 0); + pNew = sqlite3ExprListAppend(pParse, pNew, pNewExpr); + if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){ + struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; + pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName); + pItem->fg.eEName = pList->a[i].fg.eEName; + } + } + } + return pNew; +} + +/* +** Generate code for the RETURNING trigger. Unlike other triggers +** that invoke a subprogram in the bytecode, the code for RETURNING +** is generated in-line. +*/ +static void codeReturningTrigger( + Parse *pParse, /* Parse context */ + Trigger *pTrigger, /* The trigger step that defines the RETURNING */ + Table *pTab, /* The table to code triggers from */ + int regIn /* The first in an array of registers */ +){ + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + ExprList *pNew; + Returning *pReturning; + Select sSelect; + SrcList sFrom; + + assert( v!=0 ); + assert( pParse->bReturning ); + assert( db->pParse==pParse ); + pReturning = pParse->u1.pReturning; + assert( pTrigger == &(pReturning->retTrig) ); + memset(&sSelect, 0, sizeof(sSelect)); + memset(&sFrom, 0, sizeof(sFrom)); + sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0); + sSelect.pSrc = &sFrom; + sFrom.nSrc = 1; + sFrom.a[0].pTab = pTab; + sFrom.a[0].iCursor = -1; + sqlite3SelectPrep(pParse, &sSelect, 0); + if( pParse->nErr==0 ){ + assert( db->mallocFailed==0 ); + sqlite3GenerateColumnNames(pParse, &sSelect); + } + sqlite3ExprListDelete(db, sSelect.pEList); + pNew = sqlite3ExpandReturning(pParse, pReturning->pReturnEL, pTab); + if( !db->mallocFailed ){ + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + if( pReturning->nRetCol==0 ){ + pReturning->nRetCol = pNew->nExpr; + pReturning->iRetCur = pParse->nTab++; + } + sNC.pParse = pParse; + sNC.uNC.iBaseReg = regIn; + sNC.ncFlags = NC_UBaseReg; + pParse->eTriggerOp = pTrigger->op; + pParse->pTriggerTab = pTab; + if( sqlite3ResolveExprListNames(&sNC, pNew)==SQLITE_OK + && ALWAYS(!db->mallocFailed) + ){ + int i; + int nCol = pNew->nExpr; + int reg = pParse->nMem+1; + pParse->nMem += nCol+2; + pReturning->iRetReg = reg; + for(i=0; ia[i].pExpr; + assert( pCol!=0 ); /* Due to !db->mallocFailed ~9 lines above */ + sqlite3ExprCodeFactorable(pParse, pCol, reg+i); + if( sqlite3ExprAffinity(pCol)==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, reg+i); + } + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, i, reg+i); + sqlite3VdbeAddOp2(v, OP_NewRowid, pReturning->iRetCur, reg+i+1); + sqlite3VdbeAddOp3(v, OP_Insert, pReturning->iRetCur, reg+i, reg+i+1); + } + } + sqlite3ExprListDelete(db, pNew); + pParse->eTriggerOp = 0; + pParse->pTriggerTab = 0; +} + + + +/* +** Generate VDBE code for the statements inside the body of a single +** trigger. +*/ +static int codeTriggerProgram( + Parse *pParse, /* The parser context */ + TriggerStep *pStepList, /* List of statements inside the trigger body */ + int orconf /* Conflict algorithm. (OE_Abort, etc) */ +){ + TriggerStep *pStep; + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + + assert( pParse->pTriggerTab && pParse->pToplevel ); + assert( pStepList ); + assert( v!=0 ); + for(pStep=pStepList; pStep; pStep=pStep->pNext){ + /* Figure out the ON CONFLICT policy that will be used for this step + ** of the trigger program. If the statement that caused this trigger + ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use + ** the ON CONFLICT policy that was specified as part of the trigger + ** step statement. Example: + ** + ** CREATE TRIGGER AFTER INSERT ON t1 BEGIN; + ** INSERT OR REPLACE INTO t2 VALUES(new.a, new.b); + ** END; + ** + ** INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy + ** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy + */ + pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf; + assert( pParse->okConstFactor==0 ); + +#ifndef SQLITE_OMIT_TRACE + if( pStep->zSpan ){ + sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0, + sqlite3MPrintf(db, "-- %s", pStep->zSpan), + P4_DYNAMIC); + } +#endif + + switch( pStep->op ){ + case TK_UPDATE: { + sqlite3Update(pParse, + sqlite3TriggerStepSrc(pParse, pStep), + sqlite3ExprListDup(db, pStep->pExprList, 0), + sqlite3ExprDup(db, pStep->pWhere, 0), + pParse->eOrconf, 0, 0, 0 + ); + sqlite3VdbeAddOp0(v, OP_ResetCount); + break; + } + case TK_INSERT: { + sqlite3Insert(pParse, + sqlite3TriggerStepSrc(pParse, pStep), + sqlite3SelectDup(db, pStep->pSelect, 0), + sqlite3IdListDup(db, pStep->pIdList), + pParse->eOrconf, + sqlite3UpsertDup(db, pStep->pUpsert) + ); + sqlite3VdbeAddOp0(v, OP_ResetCount); + break; + } + case TK_DELETE: { + sqlite3DeleteFrom(pParse, + sqlite3TriggerStepSrc(pParse, pStep), + sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0 + ); + sqlite3VdbeAddOp0(v, OP_ResetCount); + break; + } + default: assert( pStep->op==TK_SELECT ); { + SelectDest sDest; + Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0); + sqlite3SelectDestInit(&sDest, SRT_Discard, 0); + sqlite3Select(pParse, pSelect, &sDest); + sqlite3SelectDelete(db, pSelect); + break; + } + } + } + + return 0; +} + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* +** This function is used to add VdbeComment() annotations to a VDBE +** program. It is not used in production code, only for debugging. +*/ +static const char *onErrorText(int onError){ + switch( onError ){ + case OE_Abort: return "abort"; + case OE_Rollback: return "rollback"; + case OE_Fail: return "fail"; + case OE_Replace: return "replace"; + case OE_Ignore: return "ignore"; + case OE_Default: return "default"; + } + return "n/a"; +} +#endif + +/* +** Parse context structure pFrom has just been used to create a sub-vdbe +** (trigger program). If an error has occurred, transfer error information +** from pFrom to pTo. +*/ +static void transferParseError(Parse *pTo, Parse *pFrom){ + assert( pFrom->zErrMsg==0 || pFrom->nErr ); + assert( pTo->zErrMsg==0 || pTo->nErr ); + if( pTo->nErr==0 ){ + pTo->zErrMsg = pFrom->zErrMsg; + pTo->nErr = pFrom->nErr; + pTo->rc = pFrom->rc; + }else{ + sqlite3DbFree(pFrom->db, pFrom->zErrMsg); + } +} + +/* +** Create and populate a new TriggerPrg object with a sub-program +** implementing trigger pTrigger with ON CONFLICT policy orconf. +*/ +static TriggerPrg *codeRowTrigger( + Parse *pParse, /* Current parse context */ + Trigger *pTrigger, /* Trigger to code */ + Table *pTab, /* The table pTrigger is attached to */ + int orconf /* ON CONFLICT policy to code trigger program with */ +){ + Parse *pTop = sqlite3ParseToplevel(pParse); + sqlite3 *db = pParse->db; /* Database handle */ + TriggerPrg *pPrg; /* Value to return */ + Expr *pWhen = 0; /* Duplicate of trigger WHEN expression */ + Vdbe *v; /* Temporary VM */ + NameContext sNC; /* Name context for sub-vdbe */ + SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */ + int iEndTrigger = 0; /* Label to jump to if WHEN is false */ + Parse sSubParse; /* Parse context for sub-vdbe */ + + assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); + assert( pTop->pVdbe ); + + /* Allocate the TriggerPrg and SubProgram objects. To ensure that they + ** are freed if an error occurs, link them into the Parse.pTriggerPrg + ** list of the top-level Parse object sooner rather than later. */ + pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg)); + if( !pPrg ) return 0; + pPrg->pNext = pTop->pTriggerPrg; + pTop->pTriggerPrg = pPrg; + pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram)); + if( !pProgram ) return 0; + sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram); + pPrg->pTrigger = pTrigger; + pPrg->orconf = orconf; + pPrg->aColmask[0] = 0xffffffff; + pPrg->aColmask[1] = 0xffffffff; + + /* Allocate and populate a new Parse context to use for coding the + ** trigger sub-program. */ + sqlite3ParseObjectInit(&sSubParse, db); + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = &sSubParse; + sSubParse.pTriggerTab = pTab; + sSubParse.pToplevel = pTop; + sSubParse.zAuthContext = pTrigger->zName; + sSubParse.eTriggerOp = pTrigger->op; + sSubParse.nQueryLoop = pParse->nQueryLoop; + sSubParse.disableVtab = pParse->disableVtab; + + v = sqlite3GetVdbe(&sSubParse); + if( v ){ + VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)", + pTrigger->zName, onErrorText(orconf), + (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"), + (pTrigger->op==TK_UPDATE ? "UPDATE" : ""), + (pTrigger->op==TK_INSERT ? "INSERT" : ""), + (pTrigger->op==TK_DELETE ? "DELETE" : ""), + pTab->zName + )); +#ifndef SQLITE_OMIT_TRACE + if( pTrigger->zName ){ + sqlite3VdbeChangeP4(v, -1, + sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC + ); + } +#endif + + /* If one was specified, code the WHEN clause. If it evaluates to false + ** (or NULL) the sub-vdbe is immediately halted by jumping to the + ** OP_Halt inserted at the end of the program. */ + if( pTrigger->pWhen ){ + pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0); + if( db->mallocFailed==0 + && SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) + ){ + iEndTrigger = sqlite3VdbeMakeLabel(&sSubParse); + sqlite3ExprIfFalse(&sSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); + } + sqlite3ExprDelete(db, pWhen); + } + + /* Code the trigger program into the sub-vdbe. */ + codeTriggerProgram(&sSubParse, pTrigger->step_list, orconf); + + /* Insert an OP_Halt at the end of the sub-program. */ + if( iEndTrigger ){ + sqlite3VdbeResolveLabel(v, iEndTrigger); + } + sqlite3VdbeAddOp0(v, OP_Halt); + VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf))); + transferParseError(pParse, &sSubParse); + + if( pParse->nErr==0 ){ + assert( db->mallocFailed==0 ); + pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg); + } + pProgram->nMem = sSubParse.nMem; + pProgram->nCsr = sSubParse.nTab; + pProgram->token = (void *)pTrigger; + pPrg->aColmask[0] = sSubParse.oldmask; + pPrg->aColmask[1] = sSubParse.newmask; + sqlite3VdbeDelete(v); + }else{ + transferParseError(pParse, &sSubParse); + } + + assert( !sSubParse.pTriggerPrg && !sSubParse.nMaxArg ); + sqlite3ParseObjectReset(&sSubParse); + return pPrg; +} + +/* +** Return a pointer to a TriggerPrg object containing the sub-program for +** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such +** TriggerPrg object exists, a new object is allocated and populated before +** being returned. +*/ +static TriggerPrg *getRowTrigger( + Parse *pParse, /* Current parse context */ + Trigger *pTrigger, /* Trigger to code */ + Table *pTab, /* The table trigger pTrigger is attached to */ + int orconf /* ON CONFLICT algorithm. */ +){ + Parse *pRoot = sqlite3ParseToplevel(pParse); + TriggerPrg *pPrg; + + assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) ); + + /* It may be that this trigger has already been coded (or is in the + ** process of being coded). If this is the case, then an entry with + ** a matching TriggerPrg.pTrigger field will be present somewhere + ** in the Parse.pTriggerPrg list. Search for such an entry. */ + for(pPrg=pRoot->pTriggerPrg; + pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf); + pPrg=pPrg->pNext + ); + + /* If an existing TriggerPrg could not be located, create a new one. */ + if( !pPrg ){ + pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf); + pParse->db->errByteOffset = -1; + } + + return pPrg; +} + +/* +** Generate code for the trigger program associated with trigger p on +** table pTab. The reg, orconf and ignoreJump parameters passed to this +** function are the same as those described in the header function for +** sqlite3CodeRowTrigger() +*/ +SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( + Parse *pParse, /* Parse context */ + Trigger *p, /* Trigger to code */ + Table *pTab, /* The table to code triggers from */ + int reg, /* Reg array containing OLD.* and NEW.* values */ + int orconf, /* ON CONFLICT policy */ + int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */ + TriggerPrg *pPrg; + pPrg = getRowTrigger(pParse, p, pTab, orconf); + assert( pPrg || pParse->nErr ); + + /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program + ** is a pointer to the sub-vdbe containing the trigger program. */ + if( pPrg ){ + int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers)); + + sqlite3VdbeAddOp4(v, OP_Program, reg, ignoreJump, ++pParse->nMem, + (const char *)pPrg->pProgram, P4_SUBPROGRAM); + VdbeComment( + (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf))); + + /* Set the P5 operand of the OP_Program instruction to non-zero if + ** recursive invocation of this trigger program is disallowed. Recursive + ** invocation is disallowed if (a) the sub-program is really a trigger, + ** not a foreign key action, and (b) the flag to enable recursive triggers + ** is clear. */ + sqlite3VdbeChangeP5(v, (u8)bRecursive); + } +} + +/* +** This is called to code the required FOR EACH ROW triggers for an operation +** on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE) +** is given by the op parameter. The tr_tm parameter determines whether the +** BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then +** parameter pChanges is passed the list of columns being modified. +** +** If there are no triggers that fire at the specified time for the specified +** operation on pTab, this function is a no-op. +** +** The reg argument is the address of the first in an array of registers +** that contain the values substituted for the new.* and old.* references +** in the trigger program. If N is the number of columns in table pTab +** (a copy of pTab->nCol), then registers are populated as follows: +** +** Register Contains +** ------------------------------------------------------ +** reg+0 OLD.rowid +** reg+1 OLD.* value of left-most column of pTab +** ... ... +** reg+N OLD.* value of right-most column of pTab +** reg+N+1 NEW.rowid +** reg+N+2 NEW.* value of left-most column of pTab +** ... ... +** reg+N+N+1 NEW.* value of right-most column of pTab +** +** For ON DELETE triggers, the registers containing the NEW.* values will +** never be accessed by the trigger program, so they are not allocated or +** populated by the caller (there is no data to populate them with anyway). +** Similarly, for ON INSERT triggers the values stored in the OLD.* registers +** are never accessed, and so are not allocated by the caller. So, for an +** ON INSERT trigger, the value passed to this function as parameter reg +** is not a readable register, although registers (reg+N) through +** (reg+N+N+1) are. +** +** Parameter orconf is the default conflict resolution algorithm for the +** trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump +** is the instruction that control should jump to if a trigger program +** raises an IGNORE exception. +*/ +SQLITE_PRIVATE void sqlite3CodeRowTrigger( + Parse *pParse, /* Parse context */ + Trigger *pTrigger, /* List of triggers on table pTab */ + int op, /* One of TK_UPDATE, TK_INSERT, TK_DELETE */ + ExprList *pChanges, /* Changes list for any UPDATE OF triggers */ + int tr_tm, /* One of TRIGGER_BEFORE, TRIGGER_AFTER */ + Table *pTab, /* The table to code triggers from */ + int reg, /* The first in an array of registers (see above) */ + int orconf, /* ON CONFLICT policy */ + int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */ +){ + Trigger *p; /* Used to iterate through pTrigger list */ + + assert( op==TK_UPDATE || op==TK_INSERT || op==TK_DELETE ); + assert( tr_tm==TRIGGER_BEFORE || tr_tm==TRIGGER_AFTER ); + assert( (op==TK_UPDATE)==(pChanges!=0) ); + + for(p=pTrigger; p; p=p->pNext){ + + /* Sanity checking: The schema for the trigger and for the table are + ** always defined. The trigger must be in the same schema as the table + ** or else it must be a TEMP trigger. */ + assert( p->pSchema!=0 ); + assert( p->pTabSchema!=0 ); + assert( p->pSchema==p->pTabSchema + || p->pSchema==pParse->db->aDb[1].pSchema ); + + /* Determine whether we should code this trigger. One of two choices: + ** 1. The trigger is an exact match to the current DML statement + ** 2. This is a RETURNING trigger for INSERT but we are currently + ** doing the UPDATE part of an UPSERT. + */ + if( (p->op==op || (p->bReturning && p->op==TK_INSERT && op==TK_UPDATE)) + && p->tr_tm==tr_tm + && checkColumnOverlap(p->pColumns, pChanges) + ){ + if( !p->bReturning ){ + sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump); + }else if( sqlite3IsToplevel(pParse) ){ + codeReturningTrigger(pParse, p, pTab, reg); + } + } + } +} + +/* +** Triggers may access values stored in the old.* or new.* pseudo-table. +** This function returns a 32-bit bitmask indicating which columns of the +** old.* or new.* tables actually are used by triggers. This information +** may be used by the caller, for example, to avoid having to load the entire +** old.* record into memory when executing an UPDATE or DELETE command. +** +** Bit 0 of the returned mask is set if the left-most column of the +** table may be accessed using an [old|new].reference. Bit 1 is set if +** the second leftmost column value is required, and so on. If there +** are more than 32 columns in the table, and at least one of the columns +** with an index greater than 32 may be accessed, 0xffffffff is returned. +** +** It is not possible to determine if the old.rowid or new.rowid column is +** accessed by triggers. The caller must always assume that it is. +** +** Parameter isNew must be either 1 or 0. If it is 0, then the mask returned +** applies to the old.* table. If 1, the new.* table. +** +** Parameter tr_tm must be a mask with one or both of the TRIGGER_BEFORE +** and TRIGGER_AFTER bits set. Values accessed by BEFORE triggers are only +** included in the returned mask if the TRIGGER_BEFORE bit is set in the +** tr_tm parameter. Similarly, values accessed by AFTER triggers are only +** included in the returned mask if the TRIGGER_AFTER bit is set in tr_tm. +*/ +SQLITE_PRIVATE u32 sqlite3TriggerColmask( + Parse *pParse, /* Parse context */ + Trigger *pTrigger, /* List of triggers on table pTab */ + ExprList *pChanges, /* Changes list for any UPDATE OF triggers */ + int isNew, /* 1 for new.* ref mask, 0 for old.* ref mask */ + int tr_tm, /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ + Table *pTab, /* The table to code triggers from */ + int orconf /* Default ON CONFLICT policy for trigger steps */ +){ + const int op = pChanges ? TK_UPDATE : TK_DELETE; + u32 mask = 0; + Trigger *p; + + assert( isNew==1 || isNew==0 ); + for(p=pTrigger; p; p=p->pNext){ + if( p->op==op + && (tr_tm&p->tr_tm) + && checkColumnOverlap(p->pColumns,pChanges) + ){ + if( p->bReturning ){ + mask = 0xffffffff; + }else{ + TriggerPrg *pPrg; + pPrg = getRowTrigger(pParse, p, pTab, orconf); + if( pPrg ){ + mask |= pPrg->aColmask[isNew]; + } + } + } + } + + return mask; +} + +#endif /* !defined(SQLITE_OMIT_TRIGGER) */ + +/************** End of trigger.c *********************************************/ +/************** Begin file update.c ******************************************/ +/* +** 2001 September 15 +** +** 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 contains C code routines that are called by the parser +** to handle UPDATE statements. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Forward declaration */ +static void updateVirtualTable( + Parse *pParse, /* The parsing context */ + SrcList *pSrc, /* The virtual table to be modified */ + Table *pTab, /* The virtual table */ + ExprList *pChanges, /* The columns to change in the UPDATE statement */ + Expr *pRowidExpr, /* Expression used to recompute the rowid */ + int *aXRef, /* Mapping from columns of pTab to entries in pChanges */ + Expr *pWhere, /* WHERE clause of the UPDATE statement */ + int onError /* ON CONFLICT strategy */ +); +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** The most recently coded instruction was an OP_Column to retrieve the +** i-th column of table pTab. This routine sets the P4 parameter of the +** OP_Column to the default value, if any. +** +** The default value of a column is specified by a DEFAULT clause in the +** column definition. This was either supplied by the user when the table +** was created, or added later to the table definition by an ALTER TABLE +** command. If the latter, then the row-records in the table btree on disk +** may not contain a value for the column and the default value, taken +** from the P4 parameter of the OP_Column instruction, is returned instead. +** If the former, then all row-records are guaranteed to include a value +** for the column and the P4 value is not required. +** +** Column definitions created by an ALTER TABLE command may only have +** literal default values specified: a number, null or a string. (If a more +** complicated default expression value was provided, it is evaluated +** when the ALTER TABLE is executed and one of the literal values written +** into the sqlite_schema table.) +** +** Therefore, the P4 parameter is only required if the default value for +** the column is a literal number, string or null. The sqlite3ValueFromExpr() +** function is capable of transforming these types of expressions into +** sqlite3_value objects. +** +** If column as REAL affinity and the table is an ordinary b-tree table +** (not a virtual table) then the value might have been stored as an +** integer. In that case, add an OP_RealAffinity opcode to make sure +** it has been converted into REAL. +*/ +SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ + assert( pTab!=0 ); + if( !IsView(pTab) ){ + sqlite3_value *pValue = 0; + u8 enc = ENC(sqlite3VdbeDb(v)); + Column *pCol = &pTab->aCol[i]; + VdbeComment((v, "%s.%s", pTab->zName, pCol->zCnName)); + assert( inCol ); + sqlite3ValueFromExpr(sqlite3VdbeDb(v), + sqlite3ColumnExpr(pTab,pCol), enc, + pCol->affinity, &pValue); + if( pValue ){ + sqlite3VdbeAppendP4(v, pValue, P4_MEM); + } + } +#ifndef SQLITE_OMIT_FLOATING_POINT + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } +#endif +} + +/* +** Check to see if column iCol of index pIdx references any of the +** columns defined by aXRef and chngRowid. Return true if it does +** and false if not. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexColumnIsBeingUpdated( + Index *pIdx, /* The index to check */ + int iCol, /* Which column of the index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + i16 iIdxCol = pIdx->aiColumn[iCol]; + assert( iIdxCol!=XN_ROWID ); /* Cannot index rowid */ + if( iIdxCol>=0 ){ + return aXRef[iIdxCol]>=0; + } + assert( iIdxCol==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->a[iCol].pExpr!=0 ); + return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr, + aXRef,chngRowid); +} + +/* +** Check to see if index pIdx is a partial index whose conditional +** expression might change values due to an UPDATE. Return true if +** the index is subject to change and false if the index is guaranteed +** to be unchanged. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexWhereClauseMightChange( + Index *pIdx, /* The index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + if( pIdx->pPartIdxWhere==0 ) return 0; + return sqlite3ExprReferencesUpdatedColumn(pIdx->pPartIdxWhere, + aXRef, chngRowid); +} + +/* +** Allocate and return a pointer to an expression of type TK_ROW with +** Expr.iColumn set to value (iCol+1). The resolver will modify the +** expression to be a TK_COLUMN reading column iCol of the first +** table in the source-list (pSrc->a[0]). +*/ +static Expr *exprRowColumn(Parse *pParse, int iCol){ + Expr *pRet = sqlite3PExpr(pParse, TK_ROW, 0, 0); + if( pRet ) pRet->iColumn = iCol+1; + return pRet; +} + +/* +** Assuming both the pLimit and pOrderBy parameters are NULL, this function +** generates VM code to run the query: +** +** SELECT , pChanges FROM pTabList WHERE pWhere +** +** and write the results to the ephemeral table already opened as cursor +** iEph. None of pChanges, pTabList or pWhere are modified or consumed by +** this function, they must be deleted by the caller. +** +** Or, if pLimit and pOrderBy are not NULL, and pTab is not a view: +** +** SELECT , pChanges FROM pTabList +** WHERE pWhere +** GROUP BY +** ORDER BY pOrderBy LIMIT pLimit +** +** If pTab is a view, the GROUP BY clause is omitted. +** +** Exactly how results are written to table iEph, and exactly what +** the in the query above are is determined by the type +** of table pTabList->a[0].pTab. +** +** If the table is a WITHOUT ROWID table, then argument pPk must be its +** PRIMARY KEY. In this case are the primary key columns +** of the table, in order. The results of the query are written to ephemeral +** table iEph as index keys, using OP_IdxInsert. +** +** If the table is actually a view, then are all columns of +** the view. The results are written to the ephemeral table iEph as records +** with automatically assigned integer keys. +** +** If the table is a virtual or ordinary intkey table, then +** is its rowid. For a virtual table, the results are written to iEph as +** records with automatically assigned integer keys For intkey tables, the +** rowid value in is used as the integer key, and the +** remaining fields make up the table record. +*/ +static void updateFromSelect( + Parse *pParse, /* Parse context */ + int iEph, /* Cursor for open eph. table */ + Index *pPk, /* PK if table 0 is WITHOUT ROWID */ + ExprList *pChanges, /* List of expressions to return */ + SrcList *pTabList, /* List of tables to select from */ + Expr *pWhere, /* WHERE clause for query */ + ExprList *pOrderBy, /* ORDER BY clause */ + Expr *pLimit /* LIMIT clause */ +){ + int i; + SelectDest dest; + Select *pSelect = 0; + ExprList *pList = 0; + ExprList *pGrp = 0; + Expr *pLimit2 = 0; + ExprList *pOrderBy2 = 0; + sqlite3 *db = pParse->db; + Table *pTab = pTabList->a[0].pTab; + SrcList *pSrc; + Expr *pWhere2; + int eDest; + +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( pOrderBy && pLimit==0 ) { + sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on UPDATE"); + return; + } + pOrderBy2 = sqlite3ExprListDup(db, pOrderBy, 0); + pLimit2 = sqlite3ExprDup(db, pLimit, 0); +#else + UNUSED_PARAMETER(pOrderBy); + UNUSED_PARAMETER(pLimit); +#endif + + pSrc = sqlite3SrcListDup(db, pTabList, 0); + pWhere2 = sqlite3ExprDup(db, pWhere, 0); + + assert( pTabList->nSrc>1 ); + if( pSrc ){ + pSrc->a[0].fg.notCte = 1; + pSrc->a[0].iCursor = -1; + pSrc->a[0].pTab->nTabRef--; + pSrc->a[0].pTab = 0; + } + if( pPk ){ + for(i=0; inKeyCol; i++){ + Expr *pNew = exprRowColumn(pParse, pPk->aiColumn[i]); +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( pLimit ){ + pGrp = sqlite3ExprListAppend(pParse, pGrp, sqlite3ExprDup(db, pNew, 0)); + } +#endif + pList = sqlite3ExprListAppend(pParse, pList, pNew); + } + eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom; + }else if( IsView(pTab) ){ + for(i=0; inCol; i++){ + pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i)); + } + eDest = SRT_Table; + }else{ + eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom; + pList = sqlite3ExprListAppend(pParse, 0, sqlite3PExpr(pParse,TK_ROW,0,0)); +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( pLimit ){ + pGrp = sqlite3ExprListAppend(pParse, 0, sqlite3PExpr(pParse,TK_ROW,0,0)); + } +#endif + } + assert( pChanges!=0 || pParse->db->mallocFailed ); + if( pChanges ){ + for(i=0; inExpr; i++){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3ExprDup(db, pChanges->a[i].pExpr, 0) + ); + } + } + pSelect = sqlite3SelectNew(pParse, pList, + pSrc, pWhere2, pGrp, 0, pOrderBy2, SF_UFSrcCheck|SF_IncludeHidden, pLimit2 + ); + if( pSelect ) pSelect->selFlags |= SF_OrderByReqd; + sqlite3SelectDestInit(&dest, eDest, iEph); + dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1); + sqlite3Select(pParse, pSelect, &dest); + sqlite3SelectDelete(db, pSelect); +} + +/* +** Process an UPDATE statement. +** +** UPDATE OR IGNORE tbl SET a=b, c=d FROM tbl2... WHERE e<5 AND f NOT NULL; +** \_______/ \_/ \______/ \_____/ \________________/ +** onError | pChanges | pWhere +** \_______________________/ +** pTabList +*/ +SQLITE_PRIVATE void sqlite3Update( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* The table in which we should change things */ + ExprList *pChanges, /* Things to be changed */ + Expr *pWhere, /* The WHERE clause. May be null */ + int onError, /* How to handle constraint errors */ + ExprList *pOrderBy, /* ORDER BY clause. May be null */ + Expr *pLimit, /* LIMIT clause. May be null */ + Upsert *pUpsert /* ON CONFLICT clause, or null */ +){ + int i, j, k; /* Loop counters */ + Table *pTab; /* The table to be updated */ + int addrTop = 0; /* VDBE instruction address of the start of the loop */ + WhereInfo *pWInfo = 0; /* Information about the WHERE clause */ + Vdbe *v; /* The virtual database engine */ + Index *pIdx; /* For looping over indices */ + Index *pPk; /* The PRIMARY KEY index for WITHOUT ROWID tables */ + int nIdx; /* Number of indices that need updating */ + int nAllIdx; /* Total number of indexes */ + int iBaseCur; /* Base cursor number */ + int iDataCur; /* Cursor for the canonical data btree */ + int iIdxCur; /* Cursor for the first index */ + sqlite3 *db; /* The database structure */ + int *aRegIdx = 0; /* Registers for to each index and the main table */ + int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the + ** an expression for the i-th column of the table. + ** aXRef[i]==-1 if the i-th column is not changed. */ + u8 *aToOpen; /* 1 for tables and indices to be opened */ + u8 chngPk; /* PRIMARY KEY changed in a WITHOUT ROWID table */ + u8 chngRowid; /* Rowid changed in a normal table */ + u8 chngKey; /* Either chngPk or chngRowid */ + Expr *pRowidExpr = 0; /* Expression defining the new record number */ + int iRowidExpr = -1; /* Index of "rowid=" (or IPK) assignment in pChanges */ + AuthContext sContext; /* The authorization context */ + NameContext sNC; /* The name-context to resolve expressions in */ + int iDb; /* Database containing the table being updated */ + int eOnePass; /* ONEPASS_XXX value from where.c */ + int hasFK; /* True if foreign key processing is required */ + int labelBreak; /* Jump here to break out of UPDATE loop */ + int labelContinue; /* Jump here to continue next step of UPDATE loop */ + int flags; /* Flags for sqlite3WhereBegin() */ + +#ifndef SQLITE_OMIT_TRIGGER + int isView; /* True when updating a view (INSTEAD OF trigger) */ + Trigger *pTrigger; /* List of triggers on pTab, if required */ + int tmask; /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +#endif + int newmask; /* Mask of NEW.* columns accessed by BEFORE triggers */ + int iEph = 0; /* Ephemeral table holding all primary key values */ + int nKey = 0; /* Number of elements in regKey for WITHOUT ROWID */ + int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + int addrOpen = 0; /* Address of OP_OpenEphemeral */ + int iPk = 0; /* First of nPk cells holding PRIMARY KEY value */ + i16 nPk = 0; /* Number of components of the PRIMARY KEY */ + int bReplace = 0; /* True if REPLACE conflict resolution might happen */ + int bFinishSeek = 1; /* The OP_FinishSeek opcode is needed */ + int nChangeFrom = 0; /* If there is a FROM, pChanges->nExpr, else 0 */ + + /* Register Allocations */ + int regRowCount = 0; /* A count of rows changed */ + int regOldRowid = 0; /* The old rowid */ + int regNewRowid = 0; /* The new rowid */ + int regNew = 0; /* Content of the NEW.* table in triggers */ + int regOld = 0; /* Content of OLD.* table in triggers */ + int regRowSet = 0; /* Rowset of rows to be updated */ + int regKey = 0; /* composite PRIMARY KEY value */ + + memset(&sContext, 0, sizeof(sContext)); + db = pParse->db; + assert( db->pParse==pParse ); + if( pParse->nErr ){ + goto update_cleanup; + } + assert( db->mallocFailed==0 ); + + /* Locate the table which we want to update. + */ + pTab = sqlite3SrcListLookup(pParse, pTabList); + if( pTab==0 ) goto update_cleanup; + iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + + /* Figure out if we have any triggers and if the table being + ** updated is a view. + */ +#ifndef SQLITE_OMIT_TRIGGER + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask); + isView = IsView(pTab); + assert( pTrigger || tmask==0 ); +#else +# define pTrigger 0 +# define isView 0 +# define tmask 0 +#endif +#ifdef SQLITE_OMIT_VIEW +# undef isView +# define isView 0 +#endif + +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Update() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere, + onError, pOrderBy, pLimit, pUpsert, pTrigger); + } +#endif + + /* If there was a FROM clause, set nChangeFrom to the number of expressions + ** in the change-list. Otherwise, set it to 0. There cannot be a FROM + ** clause if this function is being called to generate code for part of + ** an UPSERT statement. */ + nChangeFrom = (pTabList->nSrc>1) ? pChanges->nExpr : 0; + assert( nChangeFrom==0 || pUpsert==0 ); + +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( !isView && nChangeFrom==0 ){ + pWhere = sqlite3LimitWhere( + pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE" + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + goto update_cleanup; + } + if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + goto update_cleanup; + } + + /* Allocate a cursors for the main database table and for all indices. + ** The index cursors might not be used, but if they are used they + ** need to occur right after the database cursor. So go ahead and + ** allocate enough space, just in case. + */ + iBaseCur = iDataCur = pParse->nTab++; + iIdxCur = iDataCur+1; + pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + testcase( pPk!=0 && pPk!=pTab->pIndex ); + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + if( pPk==pIdx ){ + iDataCur = pParse->nTab; + } + pParse->nTab++; + } + if( pUpsert ){ + /* On an UPSERT, reuse the same cursors already opened by INSERT */ + iDataCur = pUpsert->iDataCur; + iIdxCur = pUpsert->iIdxCur; + pParse->nTab = iBaseCur; + } + pTabList->a[0].iCursor = iDataCur; + + /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. + ** Initialize aXRef[] and aToOpen[] to their default values. + */ + aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx+1) + nIdx+2 ); + if( aXRef==0 ) goto update_cleanup; + aRegIdx = aXRef+pTab->nCol; + aToOpen = (u8*)(aRegIdx+nIdx+1); + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + for(i=0; inCol; i++) aXRef[i] = -1; + + /* Initialize the name-context */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + sNC.uNC.pUpsert = pUpsert; + sNC.ncFlags = NC_UUpsert; + + /* Begin generating code. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto update_cleanup; + + /* Resolve the column names in all the expressions of the + ** of the UPDATE statement. Also find the column index + ** for each column to be updated in the pChanges array. For each + ** column to be updated, make sure we have authorization to change + ** that column. + */ + chngRowid = chngPk = 0; + for(i=0; inExpr; i++){ + u8 hCol = sqlite3StrIHash(pChanges->a[i].zEName); + /* If this is an UPDATE with a FROM clause, do not resolve expressions + ** here. The call to sqlite3Select() below will do that. */ + if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ + goto update_cleanup; + } + for(j=0; jnCol; j++){ + if( pTab->aCol[j].hName==hCol + && sqlite3StrICmp(pTab->aCol[j].zCnName, pChanges->a[i].zEName)==0 + ){ + if( j==pTab->iPKey ){ + chngRowid = 1; + pRowidExpr = pChanges->a[i].pExpr; + iRowidExpr = i; + }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ + chngPk = 1; + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "cannot UPDATE generated column \"%s\"", + pTab->aCol[j].zCnName); + goto update_cleanup; + } +#endif + aXRef[j] = i; + break; + } + } + if( j>=pTab->nCol ){ + if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){ + j = -1; + chngRowid = 1; + pRowidExpr = pChanges->a[i].pExpr; + iRowidExpr = i; + }else{ + sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName); + pParse->checkSchema = 1; + goto update_cleanup; + } + } +#ifndef SQLITE_OMIT_AUTHORIZATION + { + int rc; + rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, + j<0 ? "ROWID" : pTab->aCol[j].zCnName, + db->aDb[iDb].zDbSName); + if( rc==SQLITE_DENY ){ + goto update_cleanup; + }else if( rc==SQLITE_IGNORE ){ + aXRef[j] = -1; + } + } +#endif + } + assert( (chngRowid & chngPk)==0 ); + assert( chngRowid==0 || chngRowid==1 ); + assert( chngPk==0 || chngPk==1 ); + chngKey = chngRowid + chngPk; + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Mark generated columns as changing if their generator expressions + ** reference any changing column. The actual aXRef[] value for + ** generated expressions is not used, other than to check to see that it + ** is non-negative, so the value of aXRef[] for generated columns can be + ** set to any non-negative number. We use 99999 so that the value is + ** obvious when looking at aXRef[] in a symbolic debugger. + */ + if( pTab->tabFlags & TF_HasGenerated ){ + int bProgress; + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + do{ + bProgress = 0; + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ) continue; + if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue; + if( sqlite3ExprReferencesUpdatedColumn( + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + aXRef, chngRowid) + ){ + aXRef[i] = 99999; + bProgress = 1; + } + } + }while( bProgress ); + } +#endif + + /* The SET expressions are not actually used inside the WHERE loop. + ** So reset the colUsed mask. Unless this is a virtual table. In that + ** case, set all bits of the colUsed mask (to ensure that the virtual + ** table implementation makes all columns available). + */ + pTabList->a[0].colUsed = IsVirtual(pTab) ? ALLBITS : 0; + + hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngKey); + + /* There is one entry in the aRegIdx[] array for each index on the table + ** being updated. Fill in aRegIdx[] with a register number that will hold + ** the key for accessing each index. + */ + if( onError==OE_Replace ) bReplace = 1; + for(nAllIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nAllIdx++){ + int reg; + if( chngKey || hasFK>1 || pIdx==pPk + || indexWhereClauseMightChange(pIdx,aXRef,chngRowid) + ){ + reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + }else{ + reg = 0; + for(i=0; inKeyCol; i++){ + if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ + reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + if( onError==OE_Default && pIdx->onError==OE_Replace ){ + bReplace = 1; + } + break; + } + } + } + if( reg==0 ) aToOpen[nAllIdx+1] = 0; + aRegIdx[nAllIdx] = reg; + } + aRegIdx[nAllIdx] = ++pParse->nMem; /* Register storing the table record */ + if( bReplace ){ + /* If REPLACE conflict resolution might be invoked, open cursors on all + ** indexes in case they are needed to delete records. */ + memset(aToOpen, 1, nIdx+1); + } + + if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb); + + /* Allocate required registers. */ + if( !IsVirtual(pTab) ){ + /* For now, regRowSet and aRegIdx[nAllIdx] share the same register. + ** If regRowSet turns out to be needed, then aRegIdx[nAllIdx] will be + ** reallocated. aRegIdx[nAllIdx] is the register in which the main + ** table record is written. regRowSet holds the RowSet for the + ** two-pass update algorithm. */ + assert( aRegIdx[nAllIdx]==pParse->nMem ); + regRowSet = aRegIdx[nAllIdx]; + regOldRowid = regNewRowid = ++pParse->nMem; + if( chngPk || pTrigger || hasFK ){ + regOld = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + if( chngKey || pTrigger || hasFK ){ + regNewRowid = ++pParse->nMem; + } + regNew = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + + /* Start the view context. */ + if( isView ){ + sqlite3AuthContextPush(pParse, &sContext, pTab->zName); + } + + /* If we are trying to update a view, realize that view into + ** an ephemeral table. + */ +#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) + if( nChangeFrom==0 && isView ){ + sqlite3MaterializeView(pParse, pTab, + pWhere, pOrderBy, pLimit, iDataCur + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + + /* Resolve the column names in all the expressions in the + ** WHERE clause. + */ + if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pWhere) ){ + goto update_cleanup; + } + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Virtual tables must be handled separately */ + if( IsVirtual(pTab) ){ + updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, + pWhere, onError); + goto update_cleanup; + } +#endif + + /* Jump to labelBreak to abandon further processing of this UPDATE */ + labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse); + + /* Not an UPSERT. Normal processing. Begin by + ** initialize the count of updated rows */ + if( (db->flags&SQLITE_CountRows)!=0 + && !pParse->pTriggerTab + && !pParse->nested + && !pParse->bReturning + && pUpsert==0 + ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + + if( nChangeFrom==0 && HasRowid(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid); + iEph = pParse->nTab++; + addrOpen = sqlite3VdbeAddOp3(v, OP_OpenEphemeral, iEph, 0, regRowSet); + }else{ + assert( pPk!=0 || HasRowid(pTab) ); + nPk = pPk ? pPk->nKeyCol : 0; + iPk = pParse->nMem+1; + pParse->nMem += nPk; + pParse->nMem += nChangeFrom; + regKey = ++pParse->nMem; + if( pUpsert==0 ){ + int nEphCol = nPk + nChangeFrom + (isView ? pTab->nCol : 0); + iEph = pParse->nTab++; + if( pPk ) sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1); + addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nEphCol); + if( pPk ){ + KeyInfo *pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pPk); + if( pKeyInfo ){ + pKeyInfo->nAllField = nEphCol; + sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); + } + } + if( nChangeFrom ){ + updateFromSelect( + pParse, iEph, pPk, pChanges, pTabList, pWhere, pOrderBy, pLimit + ); +#ifndef SQLITE_OMIT_SUBQUERY + if( isView ) iDataCur = iEph; +#endif + } + } + } + + if( nChangeFrom ){ + sqlite3MultiWrite(pParse); + eOnePass = ONEPASS_OFF; + nKey = nPk; + regKey = iPk; + }else{ + if( pUpsert ){ + /* If this is an UPSERT, then all cursors have already been opened by + ** the outer INSERT and the data cursor should be pointing at the row + ** that is to be updated. So bypass the code that searches for the + ** row(s) to be updated. + */ + pWInfo = 0; + eOnePass = ONEPASS_SINGLE; + sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); + bFinishSeek = 0; + }else{ + /* Begin the database scan. + ** + ** Do not consider a single-pass strategy for a multi-row update if + ** there are any triggers or foreign keys to process, or rows may + ** be deleted as a result of REPLACE conflict handling. Any of these + ** things might disturb a cursor being used to scan through the table + ** or index, causing a single-pass approach to malfunction. */ + flags = WHERE_ONEPASS_DESIRED; + if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){ + flags |= WHERE_ONEPASS_MULTIROW; + } + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,0,0,flags,iIdxCur); + if( pWInfo==0 ) goto update_cleanup; + + /* A one-pass strategy that might update more than one row may not + ** be used if any column of the index used for the scan is being + ** updated. Otherwise, if there is an index on "b", statements like + ** the following could create an infinite loop: + ** + ** UPDATE t1 SET b=b+1 WHERE b>? + ** + ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI + ** strategy that uses an index for which one or more columns are being + ** updated. */ + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); + if( eOnePass!=ONEPASS_SINGLE ){ + sqlite3MultiWrite(pParse); + if( eOnePass==ONEPASS_MULTI ){ + int iCur = aiCurOnePass[1]; + if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){ + eOnePass = ONEPASS_OFF; + } + assert( iCur!=iDataCur || !HasRowid(pTab) ); + } + } + } + + if( HasRowid(pTab) ){ + /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF + ** mode, write the rowid into the FIFO. In either of the one-pass modes, + ** leave it in register regOldRowid. */ + sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); + if( eOnePass==ONEPASS_OFF ){ + aRegIdx[nAllIdx] = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_Insert, iEph, regRowSet, regOldRowid); + }else{ + if( ALWAYS(addrOpen) ) sqlite3VdbeChangeToNoop(v, addrOpen); + } + }else{ + /* Read the PK of the current row into an array of registers. In + ** ONEPASS_OFF mode, serialize the array into a record and store it in + ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change + ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table + ** is not required) and leave the PK fields in the array of registers. */ + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, + pPk->aiColumn[i], iPk+i); + } + if( eOnePass ){ + if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); + nKey = nPk; + regKey = iPk; + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, + sqlite3IndexAffinityStr(db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk); + } + } + } + + if( pUpsert==0 ){ + if( nChangeFrom==0 && eOnePass!=ONEPASS_MULTI ){ + sqlite3WhereEnd(pWInfo); + } + + if( !isView ){ + int addrOnce = 0; + + /* Open every index that needs updating. */ + if( eOnePass!=ONEPASS_OFF ){ + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0; + } + + if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, + aToOpen, 0, 0); + if( addrOnce ){ + sqlite3VdbeJumpHereOrPopInst(v, addrOnce); + } + } + + /* Top of the update loop */ + if( eOnePass!=ONEPASS_OFF ){ + if( aiCurOnePass[0]!=iDataCur + && aiCurOnePass[1]!=iDataCur +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + && !isView +#endif + ){ + assert( pPk ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey); + VdbeCoverage(v); + } + if( eOnePass!=ONEPASS_SINGLE ){ + labelContinue = sqlite3VdbeMakeLabel(pParse); + } + sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); + VdbeCoverageIf(v, pPk==0); + VdbeCoverageIf(v, pPk!=0); + }else if( pPk || nChangeFrom ){ + labelContinue = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); + addrTop = sqlite3VdbeCurrentAddr(v); + if( nChangeFrom ){ + if( !isView ){ + if( pPk ){ + for(i=0; i=0 ); + if( nChangeFrom==0 ){ + sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, iEph, iRowidExpr, regNewRowid); + } + sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); + } + + /* Compute the old pre-UPDATE content of the row being changed, if that + ** information is needed */ + if( chngPk || hasFK || pTrigger ){ + u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0); + oldmask |= sqlite3TriggerColmask(pParse, + pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError + ); + for(i=0; inCol; i++){ + u32 colFlags = pTab->aCol[i].colFlags; + k = sqlite3TableColumnToStorage(pTab, i) + regOld; + if( oldmask==0xffffffff + || (i<32 && (oldmask & MASKBIT32(i))!=0) + || (colFlags & COLFLAG_PRIMKEY)!=0 + ){ + testcase( oldmask!=0xffffffff && i==31 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + } + } + if( chngRowid==0 && pPk==0 ){ + sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid); + } + } + + /* Populate the array of registers beginning at regNew with the new + ** row data. This array is used to check constants, create the new + ** table and index records, and as the values for any new.* references + ** made by triggers. + ** + ** If there are one or more BEFORE triggers, then do not populate the + ** registers associated with columns that are (a) not modified by + ** this UPDATE statement and (b) not accessed by new.* references. The + ** values for registers not modified by the UPDATE must be reloaded from + ** the database after the BEFORE triggers are fired anyway (as the trigger + ** may have modified them). So not loading those that are not going to + ** be used eliminates some redundant opcodes. + */ + newmask = sqlite3TriggerColmask( + pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError + ); + for(i=0, k=regNew; inCol; i++, k++){ + if( i==pTab->iPKey ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + }else if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)!=0 ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; + }else{ + j = aXRef[i]; + if( j>=0 ){ + if( nChangeFrom ){ + int nOff = (isView ? pTab->nCol : nPk); + assert( eOnePass==ONEPASS_OFF ); + sqlite3VdbeAddOp3(v, OP_Column, iEph, nOff+j, k); + }else{ + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k); + } + }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ + /* This branch loads the value of a column that will not be changed + ** into a register. This is done if there are no BEFORE triggers, or + ** if there are one or more BEFORE triggers that use this value via + ** a new.* reference in a trigger program. + */ + testcase( i==31 ); + testcase( i==32 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + bFinishSeek = 0; + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + } + } + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } +#endif + + /* Fire any BEFORE UPDATE triggers. This happens before constraints are + ** verified. One could argue that this is wrong. + */ + if( tmask&TRIGGER_BEFORE ){ + sqlite3TableAffinity(v, pTab, regNew); + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); + + if( !isView ){ + /* The row-trigger may have deleted the row being updated. In this + ** case, jump to the next row. No updates or AFTER triggers are + ** required. This behavior - what happens when the row being updated + ** is deleted or renamed by a BEFORE trigger - is left undefined in the + ** documentation. + */ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); + VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); + VdbeCoverage(v); + } + + /* After-BEFORE-trigger-reload-loop: + ** If it did not delete it, the BEFORE trigger may still have modified + ** some of the columns of the row being updated. Load the values for + ** all columns not modified by the update statement into their registers + ** in case this has happened. Only unmodified columns are reloaded. + ** The values computed for modified columns use the values before the + ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) + ** for an example. + */ + for(i=0, k=regNew; inCol; i++, k++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; + }else if( aXRef[i]<0 && i!=pTab->iPKey ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + } + } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } +#endif + } + } + + if( !isView ){ + /* Do constraint checks. */ + assert( regOldRowid>0 ); + sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, + regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, + aXRef, 0); + + /* If REPLACE conflict handling may have been used, or if the PK of the + ** row is changing, then the GenerateConstraintChecks() above may have + ** moved cursor iDataCur. Reseek it. */ + if( bReplace || chngKey ){ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); + } + VdbeCoverage(v); + } + + /* Do FK constraint checks. */ + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); + } + + /* Delete the index entries associated with the current record. */ + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); + + /* We must run the OP_FinishSeek opcode to resolve a prior + ** OP_DeferredSeek if there is any possibility that there have been + ** no OP_Column opcodes since the OP_DeferredSeek was issued. But + ** we want to avoid the OP_FinishSeek if possible, as running it + ** costs CPU cycles. */ + if( bFinishSeek ){ + sqlite3VdbeAddOp1(v, OP_FinishSeek, iDataCur); + } + + /* If changing the rowid value, or if there are foreign key constraints + ** to process, delete the old record. Otherwise, add a noop OP_Delete + ** to invoke the pre-update hook. + ** + ** That (regNew==regnewRowid+1) is true is also important for the + ** pre-update hook. If the caller invokes preupdate_new(), the returned + ** value is copied from memory cell (regNewRowid+1+iCol), where iCol + ** is the column index supplied by the user. + */ + assert( regNew==regNewRowid+1 ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeAddOp3(v, OP_Delete, iDataCur, + OPFLAG_ISUPDATE | ((hasFK>1 || chngKey) ? 0 : OPFLAG_ISNOOP), + regNewRowid + ); + if( eOnePass==ONEPASS_MULTI ){ + assert( hasFK==0 && chngKey==0 ); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } + if( !pParse->nested ){ + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } +#else + if( hasFK>1 || chngKey ){ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); + } +#endif + + if( hasFK ){ + sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); + } + + /* Insert the new index entries and the new record. */ + sqlite3CompleteInsertion( + pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, + OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0), + 0, 0 + ); + + /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to + ** handle rows (possibly in other tables) that refer via a foreign key + ** to the row just updated. */ + if( hasFK ){ + sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey); + } + } + + /* Increment the row counter + */ + if( regRowCount ){ + sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); + } + + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); + + /* Repeat the above with the next record to be updated, until + ** all record selected by the WHERE clause have been updated. + */ + if( eOnePass==ONEPASS_SINGLE ){ + /* Nothing to do at end-of-loop for a single-pass */ + }else if( eOnePass==ONEPASS_MULTI ){ + sqlite3VdbeResolveLabel(v, labelContinue); + sqlite3WhereEnd(pWInfo); + }else{ + sqlite3VdbeResolveLabel(v, labelContinue); + sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); + } + sqlite3VdbeResolveLabel(v, labelBreak); + + /* Update the sqlite_sequence table by storing the content of the + ** maximum rowid counter values recorded while inserting into + ** autoincrement tables. + */ + if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){ + sqlite3AutoincrementEnd(pParse); + } + + /* + ** Return the number of rows that were changed, if we are tracking + ** that information. + */ + if( regRowCount ){ + sqlite3CodeChangeCount(v, regRowCount, "rows updated"); + } + +update_cleanup: + sqlite3AuthContextPop(&sContext); + sqlite3DbFree(db, aXRef); /* Also frees aRegIdx[] and aToOpen[] */ + sqlite3SrcListDelete(db, pTabList); + sqlite3ExprListDelete(db, pChanges); + sqlite3ExprDelete(db, pWhere); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + sqlite3ExprListDelete(db, pOrderBy); + sqlite3ExprDelete(db, pLimit); +#endif + return; +} +/* Make sure "isView" and other macros defined above are undefined. Otherwise +** they may interfere with compilation of other functions in this file +** (or in another file, if this file becomes part of the amalgamation). */ +#ifdef isView + #undef isView +#endif +#ifdef pTrigger + #undef pTrigger +#endif + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Generate code for an UPDATE of a virtual table. +** +** There are two possible strategies - the default and the special +** "onepass" strategy. Onepass is only used if the virtual table +** implementation indicates that pWhere may match at most one row. +** +** The default strategy is to create an ephemeral table that contains +** for each row to be changed: +** +** (A) The original rowid of that row. +** (B) The revised rowid for the row. +** (C) The content of every column in the row. +** +** Then loop through the contents of this ephemeral table executing a +** VUpdate for each row. When finished, drop the ephemeral table. +** +** The "onepass" strategy does not use an ephemeral table. Instead, it +** stores the same values (A, B and C above) in a register array and +** makes a single invocation of VUpdate. +*/ +static void updateVirtualTable( + Parse *pParse, /* The parsing context */ + SrcList *pSrc, /* The virtual table to be modified */ + Table *pTab, /* The virtual table */ + ExprList *pChanges, /* The columns to change in the UPDATE statement */ + Expr *pRowid, /* Expression used to recompute the rowid */ + int *aXRef, /* Mapping from columns of pTab to entries in pChanges */ + Expr *pWhere, /* WHERE clause of the UPDATE statement */ + int onError /* ON CONFLICT strategy */ +){ + Vdbe *v = pParse->pVdbe; /* Virtual machine under construction */ + int ephemTab; /* Table holding the result of the SELECT */ + int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* Database connection */ + const char *pVTab = (const char*)sqlite3GetVTable(db, pTab); + WhereInfo *pWInfo = 0; + int nArg = 2 + pTab->nCol; /* Number of arguments to VUpdate */ + int regArg; /* First register in VUpdate arg array */ + int regRec; /* Register in which to assemble record */ + int regRowid; /* Register for ephem table rowid */ + int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */ + int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ + int eOnePass; /* True to use onepass strategy */ + int addr; /* Address of OP_OpenEphemeral */ + + /* Allocate nArg registers in which to gather the arguments for VUpdate. Then + ** create and open the ephemeral table in which the records created from + ** these arguments will be temporarily stored. */ + assert( v ); + ephemTab = pParse->nTab++; + addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); + regArg = pParse->nMem + 1; + pParse->nMem += nArg; + if( pSrc->nSrc>1 ){ + Index *pPk = 0; + Expr *pRow; + ExprList *pList; + if( HasRowid(pTab) ){ + if( pRowid ){ + pRow = sqlite3ExprDup(db, pRowid, 0); + }else{ + pRow = sqlite3PExpr(pParse, TK_ROW, 0, 0); + } + }else{ + i16 iPk; /* PRIMARY KEY column */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol==1 ); + iPk = pPk->aiColumn[0]; + if( aXRef[iPk]>=0 ){ + pRow = sqlite3ExprDup(db, pChanges->a[aXRef[iPk]].pExpr, 0); + }else{ + pRow = exprRowColumn(pParse, iPk); + } + } + pList = sqlite3ExprListAppend(pParse, 0, pRow); + + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0) + ); + }else{ + pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i)); + } + } + + updateFromSelect(pParse, ephemTab, pPk, pList, pSrc, pWhere, 0, 0); + sqlite3ExprListDelete(db, pList); + eOnePass = ONEPASS_OFF; + }else{ + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; + + /* Start scanning the virtual table */ + pWInfo = sqlite3WhereBegin( + pParse, pSrc, pWhere, 0, 0, 0, WHERE_ONEPASS_DESIRED, 0 + ); + if( pWInfo==0 ) return; + + /* Populate the argument registers. */ + for(i=0; inCol; i++){ + assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ); + if( aXRef[i]>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); + }else{ + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* For sqlite3_vtab_nochange() */ + } + } + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } + }else{ + Index *pPk; /* PRIMARY KEY index */ + i16 iPk; /* PRIMARY KEY column */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol==1 ); + iPk = pPk->aiColumn[0]; + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1); + } + + eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + + /* There is no ONEPASS_MULTI on virtual tables */ + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + + if( eOnePass ){ + /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded + ** above. */ + sqlite3VdbeChangeToNoop(v, addr); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + }else{ + /* Create a record from the argument register contents and insert it into + ** the ephemeral table. */ + sqlite3MultiWrite(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); +#if defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_NULL_TRIM) + /* Signal an assert() within OP_MakeRecord that it is allowed to + ** accept no-change records with serial_type 10 */ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); +#endif + sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + } + } + + + if( eOnePass==ONEPASS_OFF ){ + /* End the virtual table scan */ + if( pSrc->nSrc==1 ){ + sqlite3WhereEnd(pWInfo); + } + + /* Begin scannning through the ephemeral table. */ + addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); + + /* Extract arguments from the current row of the ephemeral table and + ** invoke the VUpdate method. */ + for(i=0; ipNextUpsert; + sqlite3ExprListDelete(db, p->pUpsertTarget); + sqlite3ExprDelete(db, p->pUpsertTargetWhere); + sqlite3ExprListDelete(db, p->pUpsertSet); + sqlite3ExprDelete(db, p->pUpsertWhere); + sqlite3DbFree(db, p->pToFree); + sqlite3DbFree(db, p); + p = pNext; + }while( p ); +} +SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){ + if( p ) upsertDelete(db, p); +} + + +/* +** Duplicate an Upsert object. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){ + if( p==0 ) return 0; + return sqlite3UpsertNew(db, + sqlite3ExprListDup(db, p->pUpsertTarget, 0), + sqlite3ExprDup(db, p->pUpsertTargetWhere, 0), + sqlite3ExprListDup(db, p->pUpsertSet, 0), + sqlite3ExprDup(db, p->pUpsertWhere, 0), + sqlite3UpsertDup(db, p->pNextUpsert) + ); +} + +/* +** Create a new Upsert object. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertNew( + sqlite3 *db, /* Determines which memory allocator to use */ + ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */ + Expr *pTargetWhere, /* Optional WHERE clause on the target */ + ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */ + Expr *pWhere, /* WHERE clause for the ON CONFLICT UPDATE */ + Upsert *pNext /* Next ON CONFLICT clause in the list */ +){ + Upsert *pNew; + pNew = sqlite3DbMallocZero(db, sizeof(Upsert)); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pTarget); + sqlite3ExprDelete(db, pTargetWhere); + sqlite3ExprListDelete(db, pSet); + sqlite3ExprDelete(db, pWhere); + sqlite3UpsertDelete(db, pNext); + return 0; + }else{ + pNew->pUpsertTarget = pTarget; + pNew->pUpsertTargetWhere = pTargetWhere; + pNew->pUpsertSet = pSet; + pNew->pUpsertWhere = pWhere; + pNew->isDoUpdate = pSet!=0; + pNew->pNextUpsert = pNext; + } + return pNew; +} + +/* +** Analyze the ON CONFLICT clause described by pUpsert. Resolve all +** symbols in the conflict-target. +** +** Return SQLITE_OK if everything works, or an error code is something +** is wrong. +*/ +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( + Parse *pParse, /* The parsing context */ + SrcList *pTabList, /* Table into which we are inserting */ + Upsert *pUpsert /* The ON CONFLICT clauses */ +){ + Table *pTab; /* That table into which we are inserting */ + int rc; /* Result code */ + int iCursor; /* Cursor used by pTab */ + Index *pIdx; /* One of the indexes of pTab */ + ExprList *pTarget; /* The conflict-target clause */ + Expr *pTerm; /* One term of the conflict-target clause */ + NameContext sNC; /* Context for resolving symbolic names */ + Expr sCol[2]; /* Index column converted into an Expr */ + int nClause = 0; /* Counter of ON CONFLICT clauses */ + + assert( pTabList->nSrc==1 ); + assert( pTabList->a[0].pTab!=0 ); + assert( pUpsert!=0 ); + assert( pUpsert->pUpsertTarget!=0 ); + + /* Resolve all symbolic names in the conflict-target clause, which + ** includes both the list of columns and the optional partial-index + ** WHERE clause. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + for(; pUpsert && pUpsert->pUpsertTarget; + pUpsert=pUpsert->pNextUpsert, nClause++){ + rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); + if( rc ) return rc; + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); + if( rc ) return rc; + + /* Check to see if the conflict target matches the rowid. */ + pTab = pTabList->a[0].pTab; + pTarget = pUpsert->pUpsertTarget; + iCursor = pTabList->a[0].iCursor; + if( HasRowid(pTab) + && pTarget->nExpr==1 + && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN + && pTerm->iColumn==XN_ROWID + ){ + /* The conflict-target is the rowid of the primary table */ + assert( pUpsert->pUpsertIdx==0 ); + continue; + } + + /* Initialize sCol[0..1] to be an expression parse tree for a + ** single column of an index. The sCol[0] node will be the TK_COLLATE + ** operator and sCol[1] will be the TK_COLUMN operator. Code below + ** will populate the specific collation and column number values + ** prior to comparing against the conflict-target expression. + */ + memset(sCol, 0, sizeof(sCol)); + sCol[0].op = TK_COLLATE; + sCol[0].pLeft = &sCol[1]; + sCol[1].op = TK_COLUMN; + sCol[1].iTable = pTabList->a[0].iCursor; + + /* Check for matches against other indexes */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int ii, jj, nn; + if( !IsUniqueIndex(pIdx) ) continue; + if( pTarget->nExpr!=pIdx->nKeyCol ) continue; + if( pIdx->pPartIdxWhere ){ + if( pUpsert->pUpsertTargetWhere==0 ) continue; + if( sqlite3ExprCompare(pParse, pUpsert->pUpsertTargetWhere, + pIdx->pPartIdxWhere, iCursor)!=0 ){ + continue; + } + } + nn = pIdx->nKeyCol; + for(ii=0; iiazColl[ii]; + if( pIdx->aiColumn[ii]==XN_EXPR ){ + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->nExpr>ii ); + pExpr = pIdx->aColExpr->a[ii].pExpr; + if( pExpr->op!=TK_COLLATE ){ + sCol[0].pLeft = pExpr; + pExpr = &sCol[0]; + } + }else{ + sCol[0].pLeft = &sCol[1]; + sCol[1].iColumn = pIdx->aiColumn[ii]; + pExpr = &sCol[0]; + } + for(jj=0; jja[jj].pExpr,pExpr,iCursor)<2 ){ + break; /* Column ii of the index matches column jj of target */ + } + } + if( jj>=nn ){ + /* The target contains no match for column jj of the index */ + break; + } + } + if( iipUpsertIdx = pIdx; + break; + } + if( pUpsert->pUpsertIdx==0 ){ + char zWhich[16]; + if( nClause==0 && pUpsert->pNextUpsert==0 ){ + zWhich[0] = 0; + }else{ + sqlite3_snprintf(sizeof(zWhich),zWhich,"%r ", nClause+1); + } + sqlite3ErrorMsg(pParse, "%sON CONFLICT clause does not match any " + "PRIMARY KEY or UNIQUE constraint", zWhich); + return SQLITE_ERROR; + } + } + return SQLITE_OK; +} + +/* +** Return true if pUpsert is the last ON CONFLICT clause with a +** conflict target, or if pUpsert is followed by another ON CONFLICT +** clause that targets the INTEGER PRIMARY KEY. +*/ +SQLITE_PRIVATE int sqlite3UpsertNextIsIPK(Upsert *pUpsert){ + Upsert *pNext; + if( NEVER(pUpsert==0) ) return 0; + pNext = pUpsert->pNextUpsert; + if( pNext==0 ) return 1; + if( pNext->pUpsertTarget==0 ) return 1; + if( pNext->pUpsertIdx==0 ) return 1; + return 0; +} + +/* +** Given the list of ON CONFLICT clauses described by pUpsert, and +** a particular index pIdx, return a pointer to the particular ON CONFLICT +** clause that applies to the index. Or, if the index is not subject to +** any ON CONFLICT clause, return NULL. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertOfIndex(Upsert *pUpsert, Index *pIdx){ + while( + pUpsert + && pUpsert->pUpsertTarget!=0 + && pUpsert->pUpsertIdx!=pIdx + ){ + pUpsert = pUpsert->pNextUpsert; + } + return pUpsert; +} + +/* +** Generate bytecode that does an UPDATE as part of an upsert. +** +** If pIdx is NULL, then the UNIQUE constraint that failed was the IPK. +** In this case parameter iCur is a cursor open on the table b-tree that +** currently points to the conflicting table row. Otherwise, if pIdx +** is not NULL, then pIdx is the constraint that failed and iCur is a +** cursor points to the conflicting row. +*/ +SQLITE_PRIVATE void sqlite3UpsertDoUpdate( + Parse *pParse, /* The parsing and code-generating context */ + Upsert *pUpsert, /* The ON CONFLICT clause for the upsert */ + Table *pTab, /* The table being updated */ + Index *pIdx, /* The UNIQUE constraint that failed */ + int iCur /* Cursor for pIdx (or pTab if pIdx==NULL) */ +){ + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + SrcList *pSrc; /* FROM clause for the UPDATE */ + int iDataCur; + int i; + Upsert *pTop = pUpsert; + + assert( v!=0 ); + assert( pUpsert!=0 ); + iDataCur = pUpsert->iDataCur; + pUpsert = sqlite3UpsertOfIndex(pTop, pIdx); + VdbeNoopComment((v, "Begin DO UPDATE of UPSERT")); + if( pIdx && iCur!=iDataCur ){ + if( HasRowid(pTab) ){ + int regRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_IdxRowid, iCur, regRowid); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iDataCur, 0, regRowid); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regRowid); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk = pParse->nMem+1; + pParse->nMem += nPk; + for(i=0; iaiColumn[i]>=0 ); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i); + VdbeComment((v, "%s.%s", pIdx->zName, + pTab->aCol[pPk->aiColumn[i]].zCnName)); + } + sqlite3VdbeVerifyAbortable(v, OE_Abort); + i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk); + VdbeCoverage(v); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, + "corrupt database", P4_STATIC); + sqlite3MayAbort(pParse); + sqlite3VdbeJumpHere(v, i); + } + } + /* pUpsert does not own pTop->pUpsertSrc - the outer INSERT statement does. + ** So we have to make a copy before passing it down into sqlite3Update() */ + pSrc = sqlite3SrcListDup(db, pTop->pUpsertSrc, 0); + /* excluded.* columns of type REAL need to be converted to a hard real */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, pTop->regData+i); + } + } + sqlite3Update(pParse, pSrc, sqlite3ExprListDup(db,pUpsert->pUpsertSet,0), + sqlite3ExprDup(db,pUpsert->pUpsertWhere,0), OE_Abort, 0, 0, pUpsert); + VdbeNoopComment((v, "End DO UPDATE of UPSERT")); +} + +#endif /* SQLITE_OMIT_UPSERT */ + +/************** End of upsert.c **********************************************/ +/************** Begin file vacuum.c ******************************************/ +/* +** 2003 April 6 +** +** 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 contains code used to implement the VACUUM command. +** +** Most of the code in this file may be omitted by defining the +** SQLITE_OMIT_VACUUM macro. +*/ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ + +#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) + +/* +** Execute zSql on database db. +** +** If zSql returns rows, then each row will have exactly one +** column. (This will only happen if zSql begins with "SELECT".) +** Take each row of result and call execSql() again recursively. +** +** The execSqlF() routine does the same thing, except it accepts +** a format string as its third argument +*/ +static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ + sqlite3_stmt *pStmt; + int rc; + + /* printf("SQL: [%s]\n", zSql); fflush(stdout); */ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + const char *zSubSql = (const char*)sqlite3_column_text(pStmt,0); + assert( sqlite3_strnicmp(zSql,"SELECT",6)==0 ); + /* The secondary SQL must be one of CREATE TABLE, CREATE INDEX, + ** or INSERT. Historically there have been attacks that first + ** corrupt the sqlite_schema.sql field with other kinds of statements + ** then run VACUUM to get those statements to execute at inappropriate + ** times. */ + if( zSubSql + && (strncmp(zSubSql,"CRE",3)==0 || strncmp(zSubSql,"INS",3)==0) + ){ + rc = execSql(db, pzErrMsg, zSubSql); + if( rc!=SQLITE_OK ) break; + } + } + assert( rc!=SQLITE_ROW ); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + if( rc ){ + sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); + } + (void)sqlite3_finalize(pStmt); + return rc; +} +static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ + char *z; + va_list ap; + int rc; + va_start(ap, zSql); + z = sqlite3VMPrintf(db, zSql, ap); + va_end(ap); + if( z==0 ) return SQLITE_NOMEM; + rc = execSql(db, pzErrMsg, z); + sqlite3DbFree(db, z); + return rc; +} + +/* +** The VACUUM command is used to clean up the database, +** collapse free space, etc. It is modelled after the VACUUM command +** in PostgreSQL. The VACUUM command works as follows: +** +** (1) Create a new transient database file +** (2) Copy all content from the database being vacuumed into +** the new transient database file +** (3) Copy content from the transient database back into the +** original database. +** +** The transient database requires temporary disk space approximately +** equal to the size of the original database. The copy operation of +** step (3) requires additional temporary disk space approximately equal +** to the size of the original database for the rollback journal. +** Hence, temporary disk space that is approximately 2x the size of the +** original database is required. Every page of the database is written +** approximately 3 times: Once for step (2) and twice for step (3). +** Two writes per page are required in step (3) because the original +** database content must be written into the rollback journal prior to +** overwriting the database with the vacuumed content. +** +** Only 1x temporary space and only 1x writes would be required if +** the copy of step (3) were replaced by deleting the original database +** and renaming the transient database as the original. But that will +** not work if other processes are attached to the original database. +** And a power loss in between deleting the original and renaming the +** transient would cause the database file to appear to be deleted +** following reboot. +*/ +SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ + Vdbe *v = sqlite3GetVdbe(pParse); + int iDb = 0; + if( v==0 ) goto build_vacuum_end; + if( pParse->nErr ) goto build_vacuum_end; + if( pNm ){ +#ifndef SQLITE_BUG_COMPATIBLE_20160819 + /* Default behavior: Report an error if the argument to VACUUM is + ** not recognized */ + iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); + if( iDb<0 ) goto build_vacuum_end; +#else + /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments + ** to VACUUM are silently ignored. This is a back-out of a bug fix that + ** occurred on 2016-08-19 (https://www.sqlite.org/src/info/083f9e6270). + ** The buggy behavior is required for binary compatibility with some + ** legacy applications. */ + iDb = sqlite3FindDb(pParse->db, pNm); + if( iDb<0 ) iDb = 0; +#endif + } + if( iDb!=1 ){ + int iIntoReg = 0; + if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + iIntoReg = ++pParse->nMem; + sqlite3ExprCode(pParse, pInto, iIntoReg); + } + sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg); + sqlite3VdbeUsesBtree(v, iDb); + } +build_vacuum_end: + sqlite3ExprDelete(pParse->db, pInto); + return; +} + +/* +** This routine implements the OP_Vacuum opcode of the VDBE. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( + char **pzErrMsg, /* Write error message here */ + sqlite3 *db, /* Database connection */ + int iDb, /* Which attached DB to vacuum */ + sqlite3_value *pOut /* Write results here, if not NULL. VACUUM INTO */ +){ + int rc = SQLITE_OK; /* Return code from service routines */ + Btree *pMain; /* The database being vacuumed */ + Btree *pTemp; /* The temporary database we vacuum into */ + u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u64 saved_flags; /* Saved value of db->flags */ + i64 saved_nChange; /* Saved value of db->nChange */ + i64 saved_nTotalChange; /* Saved value of db->nTotalChange */ + u32 saved_openFlags; /* Saved value of db->openFlags */ + u8 saved_mTrace; /* Saved trace settings */ + Db *pDb = 0; /* Database to detach at end of vacuum */ + int isMemDb; /* True if vacuuming a :memory: database */ + int nRes; /* Bytes of reserved space at the end of each page */ + int nDb; /* Number of attached databases */ + const char *zDbMain; /* Schema name of database to vacuum */ + const char *zOut; /* Name of output file */ + + if( !db->autoCommit ){ + sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); + return SQLITE_ERROR; /* IMP: R-12218-18073 */ + } + if( db->nVdbeActive>1 ){ + sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); + return SQLITE_ERROR; /* IMP: R-15610-35227 */ + } + saved_openFlags = db->openFlags; + if( pOut ){ + if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ + sqlite3SetString(pzErrMsg, db, "non-text filename"); + return SQLITE_ERROR; + } + zOut = (const char*)sqlite3_value_text(pOut); + db->openFlags &= ~SQLITE_OPEN_READONLY; + db->openFlags |= SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE; + }else{ + zOut = ""; + } + + /* Save the current value of the database flags so that it can be + ** restored before returning. Then set the writable-schema flag, and + ** disable CHECK and foreign key constraints. */ + saved_flags = db->flags; + saved_mDbFlags = db->mDbFlags; + saved_nChange = db->nChange; + saved_nTotalChange = db->nTotalChange; + saved_mTrace = db->mTrace; + db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; + db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder + | SQLITE_Defensive | SQLITE_CountRows); + db->mTrace = 0; + + zDbMain = db->aDb[iDb].zDbSName; + pMain = db->aDb[iDb].pBt; + isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain)); + + /* Attach the temporary database as 'vacuum_db'. The synchronous pragma + ** can be set to 'off' for this file, as it is not recovered if a crash + ** occurs anyway. The integrity of the database is maintained by a + ** (possibly synchronous) transaction opened on the main database before + ** sqlite3BtreeCopyFile() is called. + ** + ** An optimisation would be to use a non-journaled pager. + ** (Later:) I tried setting "PRAGMA vacuum_db.journal_mode=OFF" but + ** that actually made the VACUUM run slower. Very little journalling + ** actually occurs when doing a vacuum since the vacuum_db is initially + ** empty. Only the journal header is written. Apparently it takes more + ** time to parse and run the PRAGMA to turn journalling off than it does + ** to write the journal header file. + */ + nDb = db->nDb; + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); + db->openFlags = saved_openFlags; + if( rc!=SQLITE_OK ) goto end_of_vacuum; + assert( (db->nDb-1)==nDb ); + pDb = &db->aDb[nDb]; + assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); + pTemp = pDb->pBt; + if( pOut ){ + sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + i64 sz = 0; + if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ + rc = SQLITE_ERROR; + sqlite3SetString(pzErrMsg, db, "output file already exists"); + goto end_of_vacuum; + } + db->mDbFlags |= DBFLAG_VacuumInto; + } + nRes = sqlite3BtreeGetRequestedReserve(pMain); + + /* A VACUUM cannot change the pagesize of an encrypted database. */ +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + if( db->nextPagesize ){ + extern void sqlcipherCodecGetKey(sqlite3*, int, void**, int*); + int nKey; + char *zKey; + sqlcipherCodecGetKey(db, iDb, (void**)&zKey, &nKey); + if( nKey ) db->nextPagesize = 0; + } +#endif +/* END SQLCIPHER */ + + sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); + sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); + sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL); + + /* Begin a transaction and take an exclusive lock on the main database + ** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below, + ** to ensure that we do not try to change the page-size on a WAL database. + */ + rc = execSql(db, pzErrMsg, "BEGIN"); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + rc = sqlite3BtreeBeginTrans(pMain, pOut==0 ? 2 : 0, 0); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + + /* Do not attempt to change the page size for a WAL database */ + if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain)) + ==PAGER_JOURNALMODE_WAL + && pOut==0 + ){ + db->nextPagesize = 0; + } + + if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0) + || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0)) + || NEVER(db->mallocFailed) + ){ + rc = SQLITE_NOMEM_BKPT; + goto end_of_vacuum; + } + +#ifndef SQLITE_OMIT_AUTOVACUUM + sqlite3BtreeSetAutoVacuum(pTemp, db->nextAutovac>=0 ? db->nextAutovac : + sqlite3BtreeGetAutoVacuum(pMain)); +#endif + + /* Query the schema of the main database. Create a mirror schema + ** in the temporary database. + */ + db->init.iDb = nDb; /* force new CREATE statements into vacuum_db */ + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_schema" + " WHERE type='table'AND name<>'sqlite_sequence'" + " AND coalesce(rootpage,1)>0", + zDbMain + ); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_schema" + " WHERE type='index'", + zDbMain + ); + if( rc!=SQLITE_OK ) goto end_of_vacuum; + db->init.iDb = 0; + + /* Loop through the tables in the main database. For each, do + ** an "INSERT INTO vacuum_db.xxx SELECT * FROM main.xxx;" to copy + ** the contents to the temporary database. + */ + rc = execSqlF(db, pzErrMsg, + "SELECT'INSERT INTO vacuum_db.'||quote(name)" + "||' SELECT*FROM\"%w\".'||quote(name)" + "FROM vacuum_db.sqlite_schema " + "WHERE type='table'AND coalesce(rootpage,1)>0", + zDbMain + ); + assert( (db->mDbFlags & DBFLAG_Vacuum)!=0 ); + db->mDbFlags &= ~DBFLAG_Vacuum; + if( rc!=SQLITE_OK ) goto end_of_vacuum; + + /* Copy the triggers, views, and virtual tables from the main database + ** over to the temporary database. None of these objects has any + ** associated storage, so all we have to do is copy their entries + ** from the schema table. + */ + rc = execSqlF(db, pzErrMsg, + "INSERT INTO vacuum_db.sqlite_schema" + " SELECT*FROM \"%w\".sqlite_schema" + " WHERE type IN('view','trigger')" + " OR(type='table'AND rootpage=0)", + zDbMain + ); + if( rc ) goto end_of_vacuum; + + /* At this point, there is a write transaction open on both the + ** vacuum database and the main database. Assuming no error occurs, + ** both transactions are closed by this block - the main database + ** transaction by sqlite3BtreeCopyFile() and the other by an explicit + ** call to sqlite3BtreeCommit(). + */ + { + u32 meta; + int i; + + /* This array determines which meta meta values are preserved in the + ** vacuum. Even entries are the meta value number and odd entries + ** are an increment to apply to the meta value after the vacuum. + ** The increment is used to increase the schema cookie so that other + ** connections to the same database will know to reread the schema. + */ + static const unsigned char aCopy[] = { + BTREE_SCHEMA_VERSION, 1, /* Add one to the old schema cookie */ + BTREE_DEFAULT_CACHE_SIZE, 0, /* Preserve the default page cache size */ + BTREE_TEXT_ENCODING, 0, /* Preserve the text encoding */ + BTREE_USER_VERSION, 0, /* Preserve the user version */ + BTREE_APPLICATION_ID, 0, /* Preserve the application id */ + }; + + assert( SQLITE_TXN_WRITE==sqlite3BtreeTxnState(pTemp) ); + assert( pOut!=0 || SQLITE_TXN_WRITE==sqlite3BtreeTxnState(pMain) ); + + /* Copy Btree meta values */ + for(i=0; iflags */ + db->init.iDb = 0; + db->mDbFlags = saved_mDbFlags; + db->flags = saved_flags; + db->nChange = saved_nChange; + db->nTotalChange = saved_nTotalChange; + db->mTrace = saved_mTrace; + sqlite3BtreeSetPageSize(pMain, -1, 0, 1); + + /* Currently there is an SQL level transaction open on the vacuum + ** database. No locks are held on any other files (since the main file + ** was committed at the btree level). So it safe to end the transaction + ** by manually setting the autoCommit flag to true and detaching the + ** vacuum database. The vacuum_db journal file is deleted when the pager + ** is closed by the DETACH. + */ + db->autoCommit = 1; + + if( pDb ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + pDb->pSchema = 0; + } + + /* This both clears the schemas and reduces the size of the db->aDb[] + ** array. */ + sqlite3ResetAllSchemasOfConnection(db); + + return rc; +} + +#endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */ + +/************** End of vacuum.c **********************************************/ +/************** Begin file vtab.c ********************************************/ +/* +** 2006 June 10 +** +** 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 contains code used to help implement virtual tables. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* #include "sqliteInt.h" */ + +/* +** Before a virtual table xCreate() or xConnect() method is invoked, the +** sqlite3.pVtabCtx member variable is set to point to an instance of +** this struct allocated on the stack. It is used by the implementation of +** the sqlite3_declare_vtab() and sqlite3_vtab_config() APIs, both of which +** are invoked only from within xCreate and xConnect methods. +*/ +struct VtabCtx { + VTable *pVTable; /* The virtual table being constructed */ + Table *pTab; /* The Table object to which the virtual table belongs */ + VtabCtx *pPrior; /* Parent context (if any) */ + int bDeclared; /* True after sqlite3_declare_vtab() is called */ +}; + +/* +** Construct and install a Module object for a virtual table. When this +** routine is called, it is guaranteed that all appropriate locks are held +** and the module is not already part of the connection. +** +** If there already exists a module with zName, replace it with the new one. +** If pModule==0, then delete the module zName if it exists. +*/ +SQLITE_PRIVATE Module *sqlite3VtabCreateModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + Module *pMod; + Module *pDel; + char *zCopy; + if( pModule==0 ){ + zCopy = (char*)zName; + pMod = 0; + }else{ + int nName = sqlite3Strlen30(zName); + pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); + if( pMod==0 ){ + sqlite3OomFault(db); + return 0; + } + zCopy = (char *)(&pMod[1]); + memcpy(zCopy, zName, nName+1); + pMod->zName = zCopy; + pMod->pModule = pModule; + pMod->pAux = pAux; + pMod->xDestroy = xDestroy; + pMod->pEpoTab = 0; + pMod->nRefModule = 1; + } + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + if( pDel ){ + if( pDel==pMod ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pMod = 0; + }else{ + sqlite3VtabEponymousTableClear(db, pDel); + sqlite3VtabModuleUnref(db, pDel); + } + } + return pMod; +} + +/* +** The actual function that does the work of creating a new module. +** This function implements the sqlite3_create_module() and +** sqlite3_create_module_v2() interfaces. +*/ +static int createModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + int rc = SQLITE_OK; + + sqlite3_mutex_enter(db->mutex); + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); + rc = sqlite3ApiExit(db, rc); + if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); + sqlite3_mutex_leave(db->mutex); + return rc; +} + + +/* +** External API function used to create a new virtual-table module. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux /* Context pointer for xCreate/xConnect */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + return createModule(db, zName, pModule, pAux, 0); +} + +/* +** External API function used to create a new virtual-table module. +*/ +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + return createModule(db, zName, pModule, pAux, xDestroy); +} + +/* +** External API to drop all virtual-table modules, except those named +** on the azNames list. +*/ +SQLITE_API int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ + HashElem *pThis, *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ + Module *pMod = (Module*)sqliteHashData(pThis); + pNext = sqliteHashNext(pThis); + if( azNames ){ + int ii; + for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){} + if( azNames[ii]!=0 ) continue; + } + createModule(db, pMod->zName, 0, 0, 0); + } + return SQLITE_OK; +} + +/* +** Decrement the reference count on a Module object. Destroy the +** module when the reference count reaches zero. +*/ +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ + assert( pMod->nRefModule>0 ); + pMod->nRefModule--; + if( pMod->nRefModule==0 ){ + if( pMod->xDestroy ){ + pMod->xDestroy(pMod->pAux); + } + assert( pMod->pEpoTab==0 ); + sqlite3DbFree(db, pMod); + } +} + +/* +** Lock the virtual table so that it cannot be disconnected. +** Locks nest. Every lock should have a corresponding unlock. +** If an unlock is omitted, resources leaks will occur. +** +** If a disconnect is attempted while a virtual table is locked, +** the disconnect is deferred until all locks have been removed. +*/ +SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){ + pVTab->nRef++; +} + + +/* +** pTab is a pointer to a Table structure representing a virtual-table. +** Return a pointer to the VTable object used by connection db to access +** this virtual-table, if one has been created, or NULL otherwise. +*/ +SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){ + VTable *pVtab; + assert( IsVirtual(pTab) ); + for(pVtab=pTab->u.vtab.p; pVtab && pVtab->db!=db; pVtab=pVtab->pNext); + return pVtab; +} + +/* +** Decrement the ref-count on a virtual table object. When the ref-count +** reaches zero, call the xDisconnect() method to delete the object. +*/ +SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){ + sqlite3 *db = pVTab->db; + + assert( db ); + assert( pVTab->nRef>0 ); + assert( db->eOpenState==SQLITE_STATE_OPEN + || db->eOpenState==SQLITE_STATE_ZOMBIE ); + + pVTab->nRef--; + if( pVTab->nRef==0 ){ + sqlite3_vtab *p = pVTab->pVtab; + sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod); + if( p ){ + p->pModule->xDisconnect(p); + } + sqlite3DbFree(db, pVTab); + } +} + +/* +** Table p is a virtual table. This function moves all elements in the +** p->u.vtab.p list to the sqlite3.pDisconnect lists of their associated +** database connections to be disconnected at the next opportunity. +** Except, if argument db is not NULL, then the entry associated with +** connection db is left in the p->u.vtab.p list. +*/ +static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ + VTable *pRet = 0; + VTable *pVTable; + + assert( IsVirtual(p) ); + pVTable = p->u.vtab.p; + p->u.vtab.p = 0; + + /* Assert that the mutex (if any) associated with the BtShared database + ** that contains table p is held by the caller. See header comments + ** above function sqlite3VtabUnlockList() for an explanation of why + ** this makes it safe to access the sqlite3.pDisconnect list of any + ** database connection that may have an entry in the p->u.vtab.p list. + */ + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); + + while( pVTable ){ + sqlite3 *db2 = pVTable->db; + VTable *pNext = pVTable->pNext; + assert( db2 ); + if( db2==db ){ + pRet = pVTable; + p->u.vtab.p = pRet; + pRet->pNext = 0; + }else{ + pVTable->pNext = db2->pDisconnect; + db2->pDisconnect = pVTable; + } + pVTable = pNext; + } + + assert( !db || pRet ); + return pRet; +} + +/* +** Table *p is a virtual table. This function removes the VTable object +** for table *p associated with database connection db from the linked +** list in p->pVTab. It also decrements the VTable ref count. This is +** used when closing database connection db to free all of its VTable +** objects without disturbing the rest of the Schema object (which may +** be being used by other shared-cache connections). +*/ +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ + VTable **ppVTab; + + assert( IsVirtual(p) ); + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3_mutex_held(db->mutex) ); + + for(ppVTab=&p->u.vtab.p; *ppVTab; ppVTab=&(*ppVTab)->pNext){ + if( (*ppVTab)->db==db ){ + VTable *pVTab = *ppVTab; + *ppVTab = pVTab->pNext; + sqlite3VtabUnlock(pVTab); + break; + } + } +} + + +/* +** Disconnect all the virtual table objects in the sqlite3.pDisconnect list. +** +** This function may only be called when the mutexes associated with all +** shared b-tree databases opened using connection db are held by the +** caller. This is done to protect the sqlite3.pDisconnect list. The +** sqlite3.pDisconnect list is accessed only as follows: +** +** 1) By this function. In this case, all BtShared mutexes and the mutex +** associated with the database handle itself must be held. +** +** 2) By function vtabDisconnectAll(), when it adds a VTable entry to +** the sqlite3.pDisconnect list. In this case either the BtShared mutex +** associated with the database the virtual table is stored in is held +** or, if the virtual table is stored in a non-sharable database, then +** the database handle mutex is held. +** +** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously +** by multiple threads. It is thread-safe. +*/ +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ + VTable *p = db->pDisconnect; + + assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert( sqlite3_mutex_held(db->mutex) ); + + if( p ){ + db->pDisconnect = 0; + sqlite3ExpirePreparedStatements(db, 0); + do { + VTable *pNext = p->pNext; + sqlite3VtabUnlock(p); + p = pNext; + }while( p ); + } +} + +/* +** Clear any and all virtual-table information from the Table record. +** This routine is called, for example, just before deleting the Table +** record. +** +** Since it is a virtual-table, the Table structure contains a pointer +** to the head of a linked list of VTable structures. Each VTable +** structure is associated with a single sqlite3* user of the schema. +** The reference count of the VTable structure associated with database +** connection db is decremented immediately (which may lead to the +** structure being xDisconnected and free). Any other VTable structures +** in the list are moved to the sqlite3.pDisconnect list of the associated +** database connection. +*/ +SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ + assert( IsVirtual(p) ); + if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p); + if( p->u.vtab.azArg ){ + int i; + for(i=0; iu.vtab.nArg; i++){ + if( i!=1 ) sqlite3DbFree(db, p->u.vtab.azArg[i]); + } + sqlite3DbFree(db, p->u.vtab.azArg); + } +} + +/* +** Add a new module argument to pTable->u.vtab.azArg[]. +** The string is not copied - the pointer is stored. The +** string will be freed automatically when the table is +** deleted. +*/ +static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ + sqlite3_int64 nBytes; + char **azModuleArg; + sqlite3 *db = pParse->db; + + assert( IsVirtual(pTable) ); + nBytes = sizeof(char *)*(2+pTable->u.vtab.nArg); + if( pTable->u.vtab.nArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName); + } + azModuleArg = sqlite3DbRealloc(db, pTable->u.vtab.azArg, nBytes); + if( azModuleArg==0 ){ + sqlite3DbFree(db, zArg); + }else{ + int i = pTable->u.vtab.nArg++; + azModuleArg[i] = zArg; + azModuleArg[i+1] = 0; + pTable->u.vtab.azArg = azModuleArg; + } +} + +/* +** The parser calls this routine when it first sees a CREATE VIRTUAL TABLE +** statement. The module name has been parsed, but the optional list +** of parameters that follow the module name are still pending. +*/ +SQLITE_PRIVATE void sqlite3VtabBeginParse( + Parse *pParse, /* Parsing context */ + Token *pName1, /* Name of new table, or database name */ + Token *pName2, /* Name of new table or NULL */ + Token *pModuleName, /* Name of the module for the virtual table */ + int ifNotExists /* No error if the table already exists */ +){ + Table *pTable; /* The new virtual table */ + sqlite3 *db; /* Database connection */ + + sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, ifNotExists); + pTable = pParse->pNewTable; + if( pTable==0 ) return; + assert( 0==pTable->pIndex ); + pTable->eTabType = TABTYP_VTAB; + + db = pParse->db; + + assert( pTable->u.vtab.nArg==0 ); + addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName)); + addModuleArgument(pParse, pTable, 0); + addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName)); + assert( (pParse->sNameToken.z==pName2->z && pName2->z!=0) + || (pParse->sNameToken.z==pName1->z && pName2->z==0) + ); + pParse->sNameToken.n = (int)( + &pModuleName->z[pModuleName->n] - pParse->sNameToken.z + ); + +#ifndef SQLITE_OMIT_AUTHORIZATION + /* Creating a virtual table invokes the authorization callback twice. + ** The first invocation, to obtain permission to INSERT a row into the + ** sqlite_schema table, has already been made by sqlite3StartTable(). + ** The second call, to obtain permission to create the table, is made now. + */ + if( pTable->u.vtab.azArg ){ + int iDb = sqlite3SchemaToIndex(db, pTable->pSchema); + assert( iDb>=0 ); /* The database the table is being created in */ + sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, + pTable->u.vtab.azArg[0], pParse->db->aDb[iDb].zDbSName); + } +#endif +} + +/* +** This routine takes the module argument that has been accumulating +** in pParse->zArg[] and appends it to the list of arguments on the +** virtual table currently under construction in pParse->pTable. +*/ +static void addArgumentToVtab(Parse *pParse){ + if( pParse->sArg.z && pParse->pNewTable ){ + const char *z = (const char*)pParse->sArg.z; + int n = pParse->sArg.n; + sqlite3 *db = pParse->db; + addModuleArgument(pParse, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); + } +} + +/* +** The parser calls this routine after the CREATE VIRTUAL TABLE statement +** has been completely parsed. +*/ +SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ + Table *pTab = pParse->pNewTable; /* The table being constructed */ + sqlite3 *db = pParse->db; /* The database connection */ + + if( pTab==0 ) return; + assert( IsVirtual(pTab) ); + addArgumentToVtab(pParse); + pParse->sArg.z = 0; + if( pTab->u.vtab.nArg<1 ) return; + + /* If the CREATE VIRTUAL TABLE statement is being entered for the + ** first time (in other words if the virtual table is actually being + ** created now instead of just being read out of sqlite_schema) then + ** do additional initialization work and store the statement text + ** in the sqlite_schema table. + */ + if( !db->init.busy ){ + char *zStmt; + char *zWhere; + int iDb; + int iReg; + Vdbe *v; + + sqlite3MayAbort(pParse); + + /* Compute the complete text of the CREATE VIRTUAL TABLE statement */ + if( pEnd ){ + pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n; + } + zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); + + /* A slot for the record has already been allocated in the + ** schema table. We just need to update that slot with all + ** the information we've collected. + ** + ** The VM register number pParse->regRowid holds the rowid of an + ** entry in the sqlite_schema table tht was created for this vtab + ** by sqlite3StartTable(). + */ + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3NestedParse(pParse, + "UPDATE %Q." LEGACY_SCHEMA_TABLE " " + "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " + "WHERE rowid=#%d", + db->aDb[iDb].zDbSName, + pTab->zName, + pTab->zName, + zStmt, + pParse->regRowid + ); + v = sqlite3GetVdbe(pParse); + sqlite3ChangeCookie(pParse, iDb); + + sqlite3VdbeAddOp0(v, OP_Expire); + zWhere = sqlite3MPrintf(db, "name=%Q AND sql=%Q", pTab->zName, zStmt); + sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere, 0); + sqlite3DbFree(db, zStmt); + + iReg = ++pParse->nMem; + sqlite3VdbeLoadString(v, iReg, pTab->zName); + sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg); + }else{ + /* If we are rereading the sqlite_schema table create the in-memory + ** record of the table. */ + Table *pOld; + Schema *pSchema = pTab->pSchema; + const char *zName = pTab->zName; + assert( zName!=0 ); + sqlite3MarkAllShadowTablesOf(db, pTab); + pOld = sqlite3HashInsert(&pSchema->tblHash, zName, pTab); + if( pOld ){ + sqlite3OomFault(db); + assert( pTab==pOld ); /* Malloc must have failed inside HashInsert() */ + return; + } + pParse->pNewTable = 0; + } +} + +/* +** The parser calls this routine when it sees the first token +** of an argument to the module name in a CREATE VIRTUAL TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse *pParse){ + addArgumentToVtab(pParse); + pParse->sArg.z = 0; + pParse->sArg.n = 0; +} + +/* +** The parser calls this routine for each token after the first token +** in an argument to the module name in a CREATE VIRTUAL TABLE statement. +*/ +SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){ + Token *pArg = &pParse->sArg; + if( pArg->z==0 ){ + pArg->z = p->z; + pArg->n = p->n; + }else{ + assert(pArg->z <= p->z); + pArg->n = (int)(&p->z[p->n] - pArg->z); + } +} + +/* +** Invoke a virtual table constructor (either xCreate or xConnect). The +** pointer to the function to invoke is passed as the fourth parameter +** to this procedure. +*/ +static int vtabCallConstructor( + sqlite3 *db, + Table *pTab, + Module *pMod, + int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**), + char **pzErr +){ + VtabCtx sCtx; + VTable *pVTable; + int rc; + const char *const*azArg; + int nArg = pTab->u.vtab.nArg; + char *zErr = 0; + char *zModuleName; + int iDb; + VtabCtx *pCtx; + + assert( IsVirtual(pTab) ); + azArg = (const char *const*)pTab->u.vtab.azArg; + + /* Check that the virtual-table is not already being initialized */ + for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){ + if( pCtx->pTab==pTab ){ + *pzErr = sqlite3MPrintf(db, + "vtable constructor called recursively: %s", pTab->zName + ); + return SQLITE_LOCKED; + } + } + + zModuleName = sqlite3DbStrDup(db, pTab->zName); + if( !zModuleName ){ + return SQLITE_NOMEM_BKPT; + } + + pVTable = sqlite3MallocZero(sizeof(VTable)); + if( !pVTable ){ + sqlite3OomFault(db); + sqlite3DbFree(db, zModuleName); + return SQLITE_NOMEM_BKPT; + } + pVTable->db = db; + pVTable->pMod = pMod; + pVTable->eVtabRisk = SQLITE_VTABRISK_Normal; + + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pTab->u.vtab.azArg[1] = db->aDb[iDb].zDbSName; + + /* Invoke the virtual table constructor */ + assert( &db->pVtabCtx ); + assert( xConstruct ); + sCtx.pTab = pTab; + sCtx.pVTable = pVTable; + sCtx.pPrior = db->pVtabCtx; + sCtx.bDeclared = 0; + db->pVtabCtx = &sCtx; + rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr); + db->pVtabCtx = sCtx.pPrior; + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + assert( sCtx.pTab==pTab ); + + if( SQLITE_OK!=rc ){ + if( zErr==0 ){ + *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName); + }else { + *pzErr = sqlite3MPrintf(db, "%s", zErr); + sqlite3_free(zErr); + } + sqlite3DbFree(db, pVTable); + }else if( ALWAYS(pVTable->pVtab) ){ + /* Justification of ALWAYS(): A correct vtab constructor must allocate + ** the sqlite3_vtab object if successful. */ + memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); + pVTable->pVtab->pModule = pMod->pModule; + pMod->nRefModule++; + pVTable->nRef = 1; + if( sCtx.bDeclared==0 ){ + const char *zFormat = "vtable constructor did not declare schema: %s"; + *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName); + sqlite3VtabUnlock(pVTable); + rc = SQLITE_ERROR; + }else{ + int iCol; + u16 oooHidden = 0; + /* If everything went according to plan, link the new VTable structure + ** into the linked list headed by pTab->u.vtab.p. 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->u.vtab.p; + pTab->u.vtab.p = pVTable; + + for(iCol=0; iColnCol; iCol++){ + char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); + int nType; + int i = 0; + nType = sqlite3Strlen30(zType); + for(i=0; i0 ){ + assert(zType[i-1]==' '); + zType[i-1] = '\0'; + } + pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN; + pTab->tabFlags |= TF_HasHidden; + oooHidden = TF_OOOHidden; + }else{ + pTab->tabFlags |= oooHidden; + } + } + } + } + + sqlite3DbFree(db, zModuleName); + return rc; +} + +/* +** This function is invoked by the parser to call the xConnect() method +** of the virtual table pTab. If an error occurs, an error code is returned +** and an error left in pParse. +** +** This call is a no-op if table pTab is not a virtual table. +*/ +SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ + sqlite3 *db = pParse->db; + const char *zMod; + Module *pMod; + int rc; + + assert( pTab ); + assert( IsVirtual(pTab) ); + if( sqlite3GetVTable(db, pTab) ){ + return SQLITE_OK; + } + + /* Locate the required virtual table module */ + zMod = pTab->u.vtab.azArg[0]; + pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); + + if( !pMod ){ + const char *zModule = pTab->u.vtab.azArg[0]; + sqlite3ErrorMsg(pParse, "no such module: %s", zModule); + rc = SQLITE_ERROR; + }else{ + char *zErr = 0; + rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + pParse->rc = rc; + } + sqlite3DbFree(db, zErr); + } + + return rc; +} +/* +** Grow the db->aVTrans[] array so that there is room for at least one +** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise. +*/ +static int growVTrans(sqlite3 *db){ + const int ARRAY_INCR = 5; + + /* Grow the sqlite3.aVTrans array if required */ + if( (db->nVTrans%ARRAY_INCR)==0 ){ + VTable **aVTrans; + sqlite3_int64 nBytes = sizeof(sqlite3_vtab*)* + ((sqlite3_int64)db->nVTrans + ARRAY_INCR); + aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes); + if( !aVTrans ){ + return SQLITE_NOMEM_BKPT; + } + memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR); + db->aVTrans = aVTrans; + } + + return SQLITE_OK; +} + +/* +** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should +** have already been reserved using growVTrans(). +*/ +static void addToVTrans(sqlite3 *db, VTable *pVTab){ + /* Add pVtab to the end of sqlite3.aVTrans */ + db->aVTrans[db->nVTrans++] = pVTab; + sqlite3VtabLock(pVTab); +} + +/* +** This function is invoked by the vdbe to call the xCreate method +** of the virtual table named zTab in database iDb. +** +** If an error occurs, *pzErr is set to point to an English language +** description of the error and an SQLITE_XXX error code is returned. +** In this case the caller must call sqlite3DbFree(db, ) on *pzErr. +*/ +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){ + int rc = SQLITE_OK; + Table *pTab; + Module *pMod; + const char *zMod; + + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + assert( pTab && IsVirtual(pTab) && !pTab->u.vtab.p ); + + /* Locate the required virtual table module */ + zMod = pTab->u.vtab.azArg[0]; + pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); + + /* If the module has been registered and includes a Create method, + ** invoke it now. If the module has not been registered, return an + ** error. Otherwise, do nothing. + */ + if( pMod==0 || pMod->pModule->xCreate==0 || pMod->pModule->xDestroy==0 ){ + *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod); + rc = SQLITE_ERROR; + }else{ + rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr); + } + + /* Justification of ALWAYS(): The xConstructor method is required to + ** create a valid sqlite3_vtab if it returns SQLITE_OK. */ + if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){ + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + addToVTrans(db, sqlite3GetVTable(db, pTab)); + } + } + + return rc; +} + +/* +** This function is used to set the schema of a virtual table. It is only +** valid to call this function from within the xCreate() or xConnect() of a +** virtual table module. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ + VtabCtx *pCtx; + int rc = SQLITE_OK; + Table *pTab; + Parse sParse; + int initBusy; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + pCtx = db->pVtabCtx; + if( !pCtx || pCtx->bDeclared ){ + sqlite3Error(db, SQLITE_MISUSE); + sqlite3_mutex_leave(db->mutex); + return SQLITE_MISUSE_BKPT; + } + pTab = pCtx->pTab; + assert( IsVirtual(pTab) ); + + sqlite3ParseObjectInit(&sParse, db); + sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; + sParse.disableTriggers = 1; + /* We should never be able to reach this point while loading the + ** schema. Nevertheless, defend against that (turn off db->init.busy) + ** in case a bug arises. */ + assert( db->init.busy==0 ); + initBusy = db->init.busy; + db->init.busy = 0; + sParse.nQueryLoop = 1; + if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable) + && ALWAYS(sParse.pNewTable!=0) + && ALWAYS(!db->mallocFailed) + && IsOrdinaryTable(sParse.pNewTable) + ){ + assert( sParse.zErrMsg==0 ); + if( !pTab->aCol ){ + Table *pNew = sParse.pNewTable; + Index *pIdx; + pTab->aCol = pNew->aCol; + sqlite3ExprListDelete(db, pNew->u.tab.pDfltList); + pTab->nNVCol = pTab->nCol = pNew->nCol; + pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); + pNew->nCol = 0; + pNew->aCol = 0; + assert( pTab->pIndex==0 ); + assert( HasRowid(pNew) || sqlite3PrimaryKeyIndex(pNew)!=0 ); + if( !HasRowid(pNew) + && pCtx->pVTable->pMod->pModule->xUpdate!=0 + && sqlite3PrimaryKeyIndex(pNew)->nKeyCol!=1 + ){ + /* WITHOUT ROWID virtual tables must either be read-only (xUpdate==0) + ** or else must have a single-column PRIMARY KEY */ + rc = SQLITE_ERROR; + } + pIdx = pNew->pIndex; + if( pIdx ){ + assert( pIdx->pNext==0 ); + pTab->pIndex = pIdx; + pNew->pIndex = 0; + pIdx->pTable = pTab; + } + } + pCtx->bDeclared = 1; + }else{ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, + (sParse.zErrMsg ? "%s" : 0), sParse.zErrMsg); + sqlite3DbFree(db, sParse.zErrMsg); + rc = SQLITE_ERROR; + } + sParse.eParseMode = PARSE_MODE_NORMAL; + + if( sParse.pVdbe ){ + sqlite3VdbeFinalize(sParse.pVdbe); + } + sqlite3DeleteTable(db, sParse.pNewTable); + sqlite3ParseObjectReset(&sParse); + db->init.busy = initBusy; + + assert( (rc&0xff)==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This function is invoked by the vdbe to call the xDestroy method +** of the virtual table named zTab in database iDb. This occurs +** when a DROP TABLE is mentioned. +** +** This call is a no-op if zTab is not a virtual table. +*/ +SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ + int rc = SQLITE_OK; + Table *pTab; + + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + if( ALWAYS(pTab!=0) + && ALWAYS(IsVirtual(pTab)) + && ALWAYS(pTab->u.vtab.p!=0) + ){ + VTable *p; + int (*xDestroy)(sqlite3_vtab *); + for(p=pTab->u.vtab.p; p; p=p->pNext){ + assert( p->pVtab ); + if( p->pVtab->nRef>0 ){ + return SQLITE_LOCKED; + } + } + p = vtabDisconnectAll(db, pTab); + xDestroy = p->pMod->pModule->xDestroy; + if( xDestroy==0 ) xDestroy = p->pMod->pModule->xDisconnect; + assert( xDestroy!=0 ); + pTab->nTabRef++; + rc = xDestroy(p->pVtab); + /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */ + if( rc==SQLITE_OK ){ + assert( pTab->u.vtab.p==p && p->pNext==0 ); + p->pVtab = 0; + pTab->u.vtab.p = 0; + sqlite3VtabUnlock(p); + } + sqlite3DeleteTable(db, pTab); + } + + return rc; +} + +/* +** This function invokes either the xRollback or xCommit method +** of each of the virtual tables in the sqlite3.aVTrans array. The method +** called is identified by the second argument, "offset", which is +** the offset of the method to call in the sqlite3_module structure. +** +** The array is cleared after invoking the callbacks. +*/ +static void callFinaliser(sqlite3 *db, int offset){ + int i; + if( db->aVTrans ){ + VTable **aVTrans = db->aVTrans; + db->aVTrans = 0; + for(i=0; inVTrans; i++){ + VTable *pVTab = aVTrans[i]; + sqlite3_vtab *p = pVTab->pVtab; + if( p ){ + int (*x)(sqlite3_vtab *); + x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset); + if( x ) x(p); + } + pVTab->iSavepoint = 0; + sqlite3VtabUnlock(pVTab); + } + sqlite3DbFree(db, aVTrans); + db->nVTrans = 0; + } +} + +/* +** Invoke the xSync method of all virtual tables in the sqlite3.aVTrans +** array. Return the error code for the first error that occurs, or +** SQLITE_OK if all xSync operations are successful. +** +** If an error message is available, leave it in p->zErrMsg. +*/ +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe *p){ + int i; + int rc = SQLITE_OK; + VTable **aVTrans = db->aVTrans; + + db->aVTrans = 0; + for(i=0; rc==SQLITE_OK && inVTrans; i++){ + int (*x)(sqlite3_vtab *); + sqlite3_vtab *pVtab = aVTrans[i]->pVtab; + if( pVtab && (x = pVtab->pModule->xSync)!=0 ){ + rc = x(pVtab); + sqlite3VtabImportErrmsg(p, pVtab); + } + } + db->aVTrans = aVTrans; + return rc; +} + +/* +** Invoke the xRollback method of all virtual tables in the +** sqlite3.aVTrans array. Then clear the array itself. +*/ +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){ + callFinaliser(db, offsetof(sqlite3_module,xRollback)); + return SQLITE_OK; +} + +/* +** Invoke the xCommit method of all virtual tables in the +** sqlite3.aVTrans array. Then clear the array itself. +*/ +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){ + callFinaliser(db, offsetof(sqlite3_module,xCommit)); + return SQLITE_OK; +} + +/* +** If the virtual table pVtab supports the transaction interface +** (xBegin/xRollback/xCommit and optionally xSync) and a transaction is +** not currently open, invoke the xBegin method now. +** +** If the xBegin call is successful, place the sqlite3_vtab pointer +** in the sqlite3.aVTrans array. +*/ +SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ + int rc = SQLITE_OK; + const sqlite3_module *pModule; + + /* Special case: If db->aVTrans is NULL and db->nVTrans is greater + ** than zero, then this function is being called from within a + ** virtual module xSync() callback. It is illegal to write to + ** virtual module tables in this case, so return SQLITE_LOCKED. + */ + if( sqlite3VtabInSync(db) ){ + return SQLITE_LOCKED; + } + if( !pVTab ){ + return SQLITE_OK; + } + pModule = pVTab->pVtab->pModule; + + if( pModule->xBegin ){ + int i; + + /* If pVtab is already in the aVTrans array, return early */ + for(i=0; inVTrans; i++){ + if( db->aVTrans[i]==pVTab ){ + return SQLITE_OK; + } + } + + /* Invoke the xBegin method. If successful, add the vtab to the + ** sqlite3.aVTrans[] array. */ + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + rc = pModule->xBegin(pVTab->pVtab); + if( rc==SQLITE_OK ){ + int iSvpt = db->nStatement + db->nSavepoint; + addToVTrans(db, pVTab); + if( iSvpt && pModule->xSavepoint ){ + pVTab->iSavepoint = iSvpt; + rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1); + } + } + } + } + return rc; +} + +/* +** Invoke either the xSavepoint, xRollbackTo or xRelease method of all +** virtual tables that currently have an open transaction. Pass iSavepoint +** as the second argument to the virtual table method invoked. +** +** If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is +** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is +** SAVEPOINT_RELEASE, then the xRelease method of each virtual table with +** an open transaction is invoked. +** +** If any virtual table method returns an error code other than SQLITE_OK, +** processing is abandoned and the error returned to the caller of this +** function immediately. If all calls to virtual table methods are successful, +** SQLITE_OK is returned. +*/ +SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ + int rc = SQLITE_OK; + + assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); + assert( iSavepoint>=-1 ); + if( db->aVTrans ){ + int i; + for(i=0; rc==SQLITE_OK && inVTrans; i++){ + VTable *pVTab = db->aVTrans[i]; + const sqlite3_module *pMod = pVTab->pMod->pModule; + if( pVTab->pVtab && pMod->iVersion>=2 ){ + int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); + switch( op ){ + case SAVEPOINT_BEGIN: + xMethod = pMod->xSavepoint; + pVTab->iSavepoint = iSavepoint+1; + break; + case SAVEPOINT_ROLLBACK: + xMethod = pMod->xRollbackTo; + break; + default: + xMethod = pMod->xRelease; + break; + } + if( xMethod && pVTab->iSavepoint>iSavepoint ){ + rc = xMethod(pVTab->pVtab, iSavepoint); + } + sqlite3VtabUnlock(pVTab); + } + } + } + return rc; +} + +/* +** The first parameter (pDef) is a function implementation. The +** second parameter (pExpr) is the first argument to this function. +** If pExpr is a column in a virtual table, then let the virtual +** table implementation have an opportunity to overload the function. +** +** This routine is used to allow virtual table implementations to +** overload MATCH, LIKE, GLOB, and REGEXP operators. +** +** Return either the pDef argument (indicating no change) or a +** new FuncDef structure that is marked as ephemeral using the +** SQLITE_FUNC_EPHEM flag. +*/ +SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( + sqlite3 *db, /* Database connection for reporting malloc problems */ + FuncDef *pDef, /* Function to possibly overload */ + int nArg, /* Number of arguments to the function */ + Expr *pExpr /* First argument to the function */ +){ + Table *pTab; + sqlite3_vtab *pVtab; + sqlite3_module *pMod; + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**) = 0; + void *pArg = 0; + FuncDef *pNew; + int rc = 0; + + /* Check to see the left operand is a column in a virtual table */ + if( NEVER(pExpr==0) ) return pDef; + if( pExpr->op!=TK_COLUMN ) return pDef; + assert( ExprUseYTab(pExpr) ); + pTab = pExpr->y.pTab; + if( pTab==0 ) return pDef; + if( !IsVirtual(pTab) ) return pDef; + pVtab = sqlite3GetVTable(db, pTab)->pVtab; + assert( pVtab!=0 ); + assert( pVtab->pModule!=0 ); + pMod = (sqlite3_module *)pVtab->pModule; + if( pMod->xFindFunction==0 ) return pDef; + + /* Call the xFindFunction method on the virtual table implementation + ** to see if the implementation wants to overload this function. + ** + ** Though undocumented, we have historically always invoked xFindFunction + ** with an all lower-case function name. Continue in this tradition to + ** avoid any chance of an incompatibility. + */ +#ifdef SQLITE_DEBUG + { + int i; + for(i=0; pDef->zName[i]; i++){ + unsigned char x = (unsigned char)pDef->zName[i]; + assert( x==sqlite3UpperToLower[x] ); + } + } +#endif + rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg); + if( rc==0 ){ + return pDef; + } + + /* Create a new ephemeral function definition for the overloaded + ** function */ + pNew = sqlite3DbMallocZero(db, sizeof(*pNew) + + sqlite3Strlen30(pDef->zName) + 1); + if( pNew==0 ){ + return pDef; + } + *pNew = *pDef; + pNew->zName = (const char*)&pNew[1]; + memcpy((char*)&pNew[1], pDef->zName, sqlite3Strlen30(pDef->zName)+1); + pNew->xSFunc = xSFunc; + pNew->pUserData = pArg; + pNew->funcFlags |= SQLITE_FUNC_EPHEM; + return pNew; +} + +/* +** Make sure virtual table pTab is contained in the pParse->apVirtualLock[] +** array so that an OP_VBegin will get generated for it. Add pTab to the +** array if it is missing. If pTab is already in the array, this routine +** is a no-op. +*/ +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ + Parse *pToplevel = sqlite3ParseToplevel(pParse); + int i, n; + Table **apVtabLock; + + assert( IsVirtual(pTab) ); + for(i=0; inVtabLock; i++){ + if( pTab==pToplevel->apVtabLock[i] ) return; + } + n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); + apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n); + if( apVtabLock ){ + pToplevel->apVtabLock = apVtabLock; + pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; + }else{ + sqlite3OomFault(pToplevel->db); + } +} + +/* +** Check to see if virtual table module pMod can be have an eponymous +** virtual table instance. If it can, create one if one does not already +** exist. Return non-zero if either the eponymous virtual table instance +** exists when this routine returns or if an attempt to create it failed +** and an error message was left in pParse. +** +** An eponymous virtual table instance is one that is named after its +** module, and more importantly, does not require a CREATE VIRTUAL TABLE +** statement in order to come into existance. Eponymous virtual table +** instances always exist. They cannot be DROP-ed. +** +** Any virtual table module for which xConnect and xCreate are the same +** method can have an eponymous virtual table instance. +*/ +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ + const sqlite3_module *pModule = pMod->pModule; + Table *pTab; + char *zErr = 0; + int rc; + sqlite3 *db = pParse->db; + if( pMod->pEpoTab ) return 1; + if( pModule->xCreate!=0 && pModule->xCreate!=pModule->xConnect ) return 0; + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return 0; + pTab->zName = sqlite3DbStrDup(db, pMod->zName); + if( pTab->zName==0 ){ + sqlite3DbFree(db, pTab); + return 0; + } + pMod->pEpoTab = pTab; + pTab->nTabRef = 1; + pTab->eTabType = TABTYP_VTAB; + pTab->pSchema = db->aDb[0].pSchema; + assert( pTab->u.vtab.nArg==0 ); + pTab->iPKey = -1; + pTab->tabFlags |= TF_Eponymous; + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(pParse, pTab, 0); + addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); + rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); + if( rc ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + sqlite3DbFree(db, zErr); + sqlite3VtabEponymousTableClear(db, pMod); + } + return 1; +} + +/* +** Erase the eponymous virtual table instance associated with +** virtual table module pMod, if it exists. +*/ +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ + Table *pTab = pMod->pEpoTab; + if( pTab!=0 ){ + /* Mark the table as Ephemeral prior to deleting it, so that the + ** sqlite3DeleteTable() routine will know that it is not stored in + ** the schema. */ + pTab->tabFlags |= TF_Ephemeral; + sqlite3DeleteTable(db, pTab); + pMod->pEpoTab = 0; + } +} + +/* +** Return the ON CONFLICT resolution mode in effect for the virtual +** table update operation currently in progress. +** +** The results of this routine are undefined unless it is called from +** within an xUpdate method. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ + static const unsigned char aMap[] = { + SQLITE_ROLLBACK, SQLITE_ABORT, SQLITE_FAIL, SQLITE_IGNORE, SQLITE_REPLACE + }; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + assert( OE_Rollback==1 && OE_Abort==2 && OE_Fail==3 ); + assert( OE_Ignore==4 && OE_Replace==5 ); + assert( db->vtabOnConflict>=1 && db->vtabOnConflict<=5 ); + return (int)aMap[db->vtabOnConflict-1]; +} + +/* +** Call from within the xCreate() or xConnect() methods to provide +** the SQLite core with additional information about the behavior +** of the virtual table being implemented. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ + va_list ap; + int rc = SQLITE_OK; + VtabCtx *p; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + p = db->pVtabCtx; + if( !p ){ + rc = SQLITE_MISUSE_BKPT; + }else{ + assert( p->pTab==0 || IsVirtual(p->pTab) ); + va_start(ap, op); + switch( op ){ + case SQLITE_VTAB_CONSTRAINT_SUPPORT: { + p->pVTable->bConstraint = (u8)va_arg(ap, int); + break; + } + case SQLITE_VTAB_INNOCUOUS: { + p->pVTable->eVtabRisk = SQLITE_VTABRISK_Low; + break; + } + case SQLITE_VTAB_DIRECTONLY: { + p->pVTable->eVtabRisk = SQLITE_VTABRISK_High; + break; + } + default: { + rc = SQLITE_MISUSE_BKPT; + break; + } + } + va_end(ap); + } + + if( rc!=SQLITE_OK ) sqlite3Error(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/************** End of vtab.c ************************************************/ +/************** Begin file wherecode.c ***************************************/ +/* +** 2015-06-06 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was split off from where.c on 2015-06-06 in order to reduce the +** size of where.c and make it easier to edit. This file contains the routines +** that actually generate the bulk of the WHERE loop code. The original where.c +** file retains the code that does query planning and analysis. +*/ +/* #include "sqliteInt.h" */ +/************** Include whereInt.h in the middle of wherecode.c **************/ +/************** Begin file whereInt.h ****************************************/ +/* +** 2013-11-12 +** +** 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 contains structure and macro definitions for the query +** planner logic in "where.c". These definitions are broken out into +** a separate source file for easier editing. +*/ +#ifndef SQLITE_WHEREINT_H +#define SQLITE_WHEREINT_H + + +/* Forward references +*/ +typedef struct WhereClause WhereClause; +typedef struct WhereMaskSet WhereMaskSet; +typedef struct WhereOrInfo WhereOrInfo; +typedef struct WhereAndInfo WhereAndInfo; +typedef struct WhereLevel WhereLevel; +typedef struct WhereLoop WhereLoop; +typedef struct WherePath WherePath; +typedef struct WhereTerm WhereTerm; +typedef struct WhereLoopBuilder WhereLoopBuilder; +typedef struct WhereScan WhereScan; +typedef struct WhereOrCost WhereOrCost; +typedef struct WhereOrSet WhereOrSet; +typedef struct WhereMemBlock WhereMemBlock; +typedef struct WhereRightJoin WhereRightJoin; + +/* +** This object is a header on a block of allocated memory that will be +** automatically freed when its WInfo oject is destructed. +*/ +struct WhereMemBlock { + WhereMemBlock *pNext; /* Next block in the chain */ + u64 sz; /* Bytes of space */ +}; + +/* +** Extra information attached to a WhereLevel that is a RIGHT JOIN. +*/ +struct WhereRightJoin { + int iMatch; /* Cursor used to determine prior matched rows */ + int regBloom; /* Bloom filter for iRJMatch */ + int regReturn; /* Return register for the interior subroutine */ + int addrSubrtn; /* Starting address for the interior subroutine */ + int endSubrtn; /* The last opcode in the interior subroutine */ +}; + +/* +** This object contains information needed to implement a single nested +** loop in WHERE clause. +** +** Contrast this object with WhereLoop. This object describes the +** implementation of the loop. WhereLoop describes the algorithm. +** This object contains a pointer to the WhereLoop algorithm as one of +** its elements. +** +** The WhereInfo object contains a single instance of this object for +** each term in the FROM clause (which is to say, for each of the +** nested loops as implemented). The order of WhereLevel objects determines +** the loop nested order, with WhereInfo.a[0] being the outer loop and +** WhereInfo.a[WhereInfo.nLevel-1] being the inner loop. +*/ +struct WhereLevel { + int iLeftJoin; /* Memory cell used to implement LEFT OUTER JOIN */ + int iTabCur; /* The VDBE cursor used to access the table */ + int iIdxCur; /* The VDBE cursor used to access pIdx */ + int addrBrk; /* Jump here to break out of the loop */ + int addrNxt; /* Jump here to start the next IN combination */ + int addrSkip; /* Jump here for next iteration of skip-scan */ + int addrCont; /* Jump here to continue with the next loop cycle */ + int addrFirst; /* First instruction of interior of the loop */ + int addrBody; /* Beginning of the body of this loop */ + int regBignull; /* big-null flag reg. True if a NULL-scan is needed */ + int addrBignull; /* Jump here for next part of big-null scan */ +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ + int addrLikeRep; /* LIKE range processing address */ +#endif + int regFilter; /* Bloom filter */ + WhereRightJoin *pRJ; /* Extra information for RIGHT JOIN */ + u8 iFrom; /* Which entry in the FROM clause */ + u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ + int p1, p2; /* Operands of the opcode used to end the loop */ + union { /* Information that depends on pWLoop->wsFlags */ + struct { + int nIn; /* Number of entries in aInLoop[] */ + struct InLoop { + int iCur; /* The VDBE cursor used by this IN operator */ + int addrInTop; /* Top of the IN loop */ + int iBase; /* Base register of multi-key index record */ + int nPrefix; /* Number of prior entires in the key */ + u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */ + } *aInLoop; /* Information about each nested IN operator */ + } in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */ + Index *pCoveringIdx; /* Possible covering index for WHERE_MULTI_OR */ + } u; + struct WhereLoop *pWLoop; /* The selected WhereLoop object */ + Bitmask notReady; /* FROM entries not usable at this level */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + int addrVisit; /* Address at which row is visited */ +#endif +}; + +/* +** Each instance of this object represents an algorithm for evaluating one +** term of a join. Every term of the FROM clause will have at least +** one corresponding WhereLoop object (unless INDEXED BY constraints +** prevent a query solution - which is an error) and many terms of the +** FROM clause will have multiple WhereLoop objects, each describing a +** potential way of implementing that FROM-clause term, together with +** dependencies and cost estimates for using the chosen algorithm. +** +** Query planning consists of building up a collection of these WhereLoop +** objects, then computing a particular sequence of WhereLoop objects, with +** one WhereLoop object per FROM clause term, that satisfy all dependencies +** and that minimize the overall cost. +*/ +struct WhereLoop { + Bitmask prereq; /* Bitmask of other loops that must run first */ + Bitmask maskSelf; /* Bitmask identifying table iTab */ +#ifdef SQLITE_DEBUG + char cId; /* Symbolic ID of this loop for debugging use */ +#endif + u8 iTab; /* Position in FROM clause of table for this loop */ + u8 iSortIdx; /* Sorting index number. 0==None */ + LogEst rSetup; /* One-time setup cost (ex: create transient index) */ + LogEst rRun; /* Cost of running each loop */ + LogEst nOut; /* Estimated number of output rows */ + union { + struct { /* Information for internal btree tables */ + u16 nEq; /* Number of equality constraints */ + u16 nBtm; /* Size of BTM vector */ + u16 nTop; /* Size of TOP vector */ + u16 nDistinctCol; /* Index columns used to sort for DISTINCT */ + Index *pIndex; /* Index used, or NULL */ + } btree; + struct { /* Information for virtual tables */ + int idxNum; /* Index number */ + u32 needFree : 1; /* True if sqlite3_free(idxStr) is needed */ + u32 bOmitOffset : 1; /* True to let virtual table handle offset */ + i8 isOrdered; /* True if satisfies ORDER BY */ + u16 omitMask; /* Terms that may be omitted */ + char *idxStr; /* Index identifier string */ + u32 mHandleIn; /* Terms to handle as IN(...) instead of == */ + } vtab; + } u; + u32 wsFlags; /* WHERE_* flags describing the plan */ + u16 nLTerm; /* Number of entries in aLTerm[] */ + u16 nSkip; /* Number of NULL aLTerm[] entries */ + /**** whereLoopXfer() copies fields above ***********************/ +# define WHERE_LOOP_XFER_SZ offsetof(WhereLoop,nLSlot) + u16 nLSlot; /* Number of slots allocated for aLTerm[] */ + WhereTerm **aLTerm; /* WhereTerms used */ + WhereLoop *pNextLoop; /* Next WhereLoop object in the WhereClause */ + WhereTerm *aLTermSpace[3]; /* Initial aLTerm[] space */ +}; + +/* This object holds the prerequisites and the cost of running a +** subquery on one operand of an OR operator in the WHERE clause. +** See WhereOrSet for additional information +*/ +struct WhereOrCost { + Bitmask prereq; /* Prerequisites */ + LogEst rRun; /* Cost of running this subquery */ + LogEst nOut; /* Number of outputs for this subquery */ +}; + +/* The WhereOrSet object holds a set of possible WhereOrCosts that +** correspond to the subquery(s) of OR-clause processing. Only the +** best N_OR_COST elements are retained. +*/ +#define N_OR_COST 3 +struct WhereOrSet { + u16 n; /* Number of valid a[] entries */ + WhereOrCost a[N_OR_COST]; /* Set of best costs */ +}; + +/* +** Each instance of this object holds a sequence of WhereLoop objects +** that implement some or all of a query plan. +** +** Think of each WhereLoop object as a node in a graph with arcs +** showing dependencies and costs for travelling between nodes. (That is +** not a completely accurate description because WhereLoop costs are a +** vector, not a scalar, and because dependencies are many-to-one, not +** one-to-one as are graph nodes. But it is a useful visualization aid.) +** Then a WherePath object is a path through the graph that visits some +** or all of the WhereLoop objects once. +** +** The "solver" works by creating the N best WherePath objects of length +** 1. Then using those as a basis to compute the N best WherePath objects +** of length 2. And so forth until the length of WherePaths equals the +** number of nodes in the FROM clause. The best (lowest cost) WherePath +** at the end is the chosen query plan. +*/ +struct WherePath { + Bitmask maskLoop; /* Bitmask of all WhereLoop objects in this path */ + Bitmask revLoop; /* aLoop[]s that should be reversed for ORDER BY */ + LogEst nRow; /* Estimated number of rows generated by this path */ + LogEst rCost; /* Total cost of this path */ + LogEst rUnsorted; /* Total cost of this path ignoring sorting costs */ + i8 isOrdered; /* No. of ORDER BY terms satisfied. -1 for unknown */ + WhereLoop **aLoop; /* Array of WhereLoop objects implementing this path */ +}; + +/* +** The query generator uses an array of instances of this structure to +** help it analyze the subexpressions of the WHERE clause. Each WHERE +** clause subexpression is separated from the others by AND operators, +** usually, or sometimes subexpressions separated by OR. +** +** All WhereTerms are collected into a single WhereClause structure. +** The following identity holds: +** +** WhereTerm.pWC->a[WhereTerm.idx] == WhereTerm +** +** When a term is of the form: +** +** X +** +** where X is a column name and is one of certain operators, +** then WhereTerm.leftCursor and WhereTerm.u.leftColumn record the +** cursor number and column number for X. WhereTerm.eOperator records +** the using a bitmask encoding defined by WO_xxx below. The +** use of a bitmask encoding for the operator allows us to search +** quickly for terms that match any of several different operators. +** +** A WhereTerm might also be two or more subterms connected by OR: +** +** (t1.X ) OR (t1.Y ) OR .... +** +** In this second case, wtFlag has the TERM_ORINFO bit set and eOperator==WO_OR +** and the WhereTerm.u.pOrInfo field points to auxiliary information that +** is collected about the OR clause. +** +** If a term in the WHERE clause does not match either of the two previous +** categories, then eOperator==0. The WhereTerm.pExpr field is still set +** to the original subexpression content and wtFlags is set up appropriately +** but no other fields in the WhereTerm object are meaningful. +** +** When eOperator!=0, prereqRight and prereqAll record sets of cursor numbers, +** but they do so indirectly. A single WhereMaskSet structure translates +** cursor number into bits and the translated bit is stored in the prereq +** fields. The translation is used in order to maximize the number of +** bits that will fit in a Bitmask. The VDBE cursor numbers might be +** spread out over the non-negative integers. For example, the cursor +** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45. The WhereMaskSet +** translates these sparse cursor numbers into consecutive integers +** beginning with 0 in order to make the best possible use of the available +** bits in the Bitmask. So, in the example above, the cursor numbers +** would be mapped into integers 0 through 7. +** +** The number of terms in a join is limited by the number of bits +** in prereqRight and prereqAll. The default is 64 bits, hence SQLite +** is only able to process joins with 64 or fewer tables. +*/ +struct WhereTerm { + Expr *pExpr; /* Pointer to the subexpression that is this term */ + WhereClause *pWC; /* The clause this term is part of */ + LogEst truthProb; /* Probability of truth for this expression */ + u16 wtFlags; /* TERM_xxx bit flags. See below */ + u16 eOperator; /* A WO_xx value describing */ + u8 nChild; /* Number of children that must disable us */ + u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */ + int iParent; /* Disable pWC->a[iParent] when this term disabled */ + int leftCursor; /* Cursor number of X in "X " */ + union { + struct { + int leftColumn; /* Column number of X in "X " */ + int iField; /* Field in (?,?,?) IN (SELECT...) vector */ + } x; /* Opcode other than OP_OR or OP_AND */ + WhereOrInfo *pOrInfo; /* Extra information if (eOperator & WO_OR)!=0 */ + WhereAndInfo *pAndInfo; /* Extra information if (eOperator& WO_AND)!=0 */ + } u; + Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */ + Bitmask prereqAll; /* Bitmask of tables referenced by pExpr */ +}; + +/* +** Allowed values of WhereTerm.wtFlags +*/ +#define TERM_DYNAMIC 0x0001 /* Need to call sqlite3ExprDelete(db, pExpr) */ +#define TERM_VIRTUAL 0x0002 /* Added by the optimizer. Do not code */ +#define TERM_CODED 0x0004 /* This term is already coded */ +#define TERM_COPIED 0x0008 /* Has a child */ +#define TERM_ORINFO 0x0010 /* Need to free the WhereTerm.u.pOrInfo object */ +#define TERM_ANDINFO 0x0020 /* Need to free the WhereTerm.u.pAndInfo obj */ +#define TERM_OK 0x0040 /* Used during OR-clause processing */ +#define TERM_VNULL 0x0080 /* Manufactured x>NULL or x<=NULL term */ +#define TERM_LIKEOPT 0x0100 /* Virtual terms from the LIKE optimization */ +#define TERM_LIKECOND 0x0200 /* Conditionally this LIKE operator term */ +#define TERM_LIKE 0x0400 /* The original LIKE operator */ +#define TERM_IS 0x0800 /* Term.pExpr is an IS operator */ +#define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ +#define TERM_HEURTRUTH 0x2000 /* Heuristic truthProb used */ +#ifdef SQLITE_ENABLE_STAT4 +# define TERM_HIGHTRUTH 0x4000 /* Term excludes few rows */ +#else +# define TERM_HIGHTRUTH 0 /* Only used with STAT4 */ +#endif +#define TERM_SLICE 0x8000 /* One slice of a row-value/vector comparison */ + +/* +** An instance of the WhereScan object is used as an iterator for locating +** terms in the WHERE clause that are useful to the query planner. +*/ +struct WhereScan { + WhereClause *pOrigWC; /* Original, innermost WhereClause */ + WhereClause *pWC; /* WhereClause currently being scanned */ + const char *zCollName; /* Required collating sequence, if not NULL */ + Expr *pIdxExpr; /* Search for this index expression */ + int k; /* Resume scanning at this->pWC->a[this->k] */ + u32 opMask; /* Acceptable operators */ + char idxaff; /* Must match this affinity, if zCollName!=NULL */ + unsigned char iEquiv; /* Current slot in aiCur[] and aiColumn[] */ + unsigned char nEquiv; /* Number of entries in aiCur[] and aiColumn[] */ + int aiCur[11]; /* Cursors in the equivalence class */ + i16 aiColumn[11]; /* Corresponding column number in the eq-class */ +}; + +/* +** An instance of the following structure holds all information about a +** WHERE clause. Mostly this is a container for one or more WhereTerms. +** +** Explanation of pOuter: For a WHERE clause of the form +** +** a AND ((b AND c) OR (d AND e)) AND f +** +** There are separate WhereClause objects for the whole clause and for +** the subclauses "(b AND c)" and "(d AND e)". The pOuter field of the +** subclauses points to the WhereClause object for the whole clause. +*/ +struct WhereClause { + WhereInfo *pWInfo; /* WHERE clause processing context */ + WhereClause *pOuter; /* Outer conjunction */ + u8 op; /* Split operator. TK_AND or TK_OR */ + u8 hasOr; /* True if any a[].eOperator is WO_OR */ + int nTerm; /* Number of terms */ + int nSlot; /* Number of entries in a[] */ + int nBase; /* Number of terms through the last non-Virtual */ + WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */ +#if defined(SQLITE_SMALL_STACK) + WhereTerm aStatic[1]; /* Initial static space for a[] */ +#else + WhereTerm aStatic[8]; /* Initial static space for a[] */ +#endif +}; + +/* +** A WhereTerm with eOperator==WO_OR has its u.pOrInfo pointer set to +** a dynamically allocated instance of the following structure. +*/ +struct WhereOrInfo { + WhereClause wc; /* Decomposition into subterms */ + Bitmask indexable; /* Bitmask of all indexable tables in the clause */ +}; + +/* +** A WhereTerm with eOperator==WO_AND has its u.pAndInfo pointer set to +** a dynamically allocated instance of the following structure. +*/ +struct WhereAndInfo { + WhereClause wc; /* The subexpression broken out */ +}; + +/* +** An instance of the following structure keeps track of a mapping +** between VDBE cursor numbers and bits of the bitmasks in WhereTerm. +** +** The VDBE cursor numbers are small integers contained in +** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE +** clause, the cursor numbers might not begin with 0 and they might +** contain gaps in the numbering sequence. But we want to make maximum +** use of the bits in our bitmasks. This structure provides a mapping +** from the sparse cursor numbers into consecutive integers beginning +** with 0. +** +** If WhereMaskSet.ix[A]==B it means that The A-th bit of a Bitmask +** corresponds VDBE cursor number B. The A-th bit of a bitmask is 1<3, 5->1, 8->2, 29->0, +** 57->5, 73->4. Or one of 719 other combinations might be used. It +** does not really matter. What is important is that sparse cursor +** numbers all get mapped into bit numbers that begin with 0 and contain +** no gaps. +*/ +struct WhereMaskSet { + int bVarSelect; /* Used by sqlite3WhereExprUsage() */ + int n; /* Number of assigned cursor values */ + int ix[BMS]; /* Cursor assigned to each bit */ +}; + +/* +** This object is a convenience wrapper holding all information needed +** to construct WhereLoop objects for a particular query. +*/ +struct WhereLoopBuilder { + WhereInfo *pWInfo; /* Information about this WHERE */ + WhereClause *pWC; /* WHERE clause terms */ + WhereLoop *pNew; /* Template WhereLoop */ + WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ +#ifdef SQLITE_ENABLE_STAT4 + UnpackedRecord *pRec; /* Probe for stat4 (if required) */ + int nRecValid; /* Number of valid fields currently in pRec */ +#endif + unsigned char bldFlags1; /* First set of SQLITE_BLDF_* flags */ + unsigned char bldFlags2; /* Second set of SQLITE_BLDF_* flags */ + unsigned int iPlanLimit; /* Search limiter */ +}; + +/* Allowed values for WhereLoopBuider.bldFlags */ +#define SQLITE_BLDF1_INDEXED 0x0001 /* An index is used */ +#define SQLITE_BLDF1_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ + +#define SQLITE_BLDF2_2NDPASS 0x0004 /* Second builder pass needed */ + +/* The WhereLoopBuilder.iPlanLimit is used to limit the number of +** index+constraint combinations the query planner will consider for a +** particular query. If this parameter is unlimited, then certain +** pathological queries can spend excess time in the sqlite3WhereBegin() +** routine. The limit is high enough that is should not impact real-world +** queries. +** +** SQLITE_QUERY_PLANNER_LIMIT is the baseline limit. The limit is +** increased by SQLITE_QUERY_PLANNER_LIMIT_INCR before each term of the FROM +** clause is processed, so that every table in a join is guaranteed to be +** able to propose a some index+constraint combinations even if the initial +** baseline limit was exhausted by prior tables of the join. +*/ +#ifndef SQLITE_QUERY_PLANNER_LIMIT +# define SQLITE_QUERY_PLANNER_LIMIT 20000 +#endif +#ifndef SQLITE_QUERY_PLANNER_LIMIT_INCR +# define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 +#endif + +/* +** Each instance of this object records a change to a single node +** in an expression tree to cause that node to point to a column +** of an index rather than an expression or a virtual column. All +** such transformations need to be undone at the end of WHERE clause +** processing. +*/ +typedef struct WhereExprMod WhereExprMod; +struct WhereExprMod { + WhereExprMod *pNext; /* Next translation on a list of them all */ + Expr *pExpr; /* The Expr node that was transformed */ + Expr orig; /* Original value of the Expr node */ +}; + +/* +** The WHERE clause processing routine has two halves. The +** first part does the start of the WHERE loop and the second +** half does the tail of the WHERE loop. An instance of +** this structure is returned by the first half and passed +** into the second half to give some continuity. +** +** An instance of this object holds the complete state of the query +** planner. +*/ +struct WhereInfo { + Parse *pParse; /* Parsing and code generating context */ + SrcList *pTabList; /* List of tables in the join */ + ExprList *pOrderBy; /* The ORDER BY clause or NULL */ + ExprList *pResultSet; /* Result set of the query */ + Expr *pWhere; /* The complete WHERE clause */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + Select *pLimit; /* Used to access LIMIT expr/registers for vtabs */ +#endif + int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ + int iContinue; /* Jump here to continue with next record */ + int iBreak; /* Jump here to break out of the loop */ + int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ + u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ + u8 nLevel; /* Number of nested loop */ + i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ + u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ + u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ + unsigned bDeferredSeek :1; /* Uses OP_DeferredSeek */ + unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ + unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ + unsigned sorted :1; /* True if really sorted (not just grouped) */ + LogEst nRowOut; /* Estimated number of output rows */ + int iTop; /* The very beginning of the WHERE loop */ + int iEndWhere; /* End of the WHERE clause itself */ + WhereLoop *pLoops; /* List of all WhereLoop objects */ + WhereExprMod *pExprMods; /* Expression modifications */ + WhereMemBlock *pMemToFree;/* Memory to free when this object destroyed */ + Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ + WhereClause sWC; /* Decomposition of the WHERE clause */ + WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ + WhereLevel a[1]; /* Information about each nest loop in WHERE */ +}; + +/* +** Private interfaces - callable only by other where.c routines. +** +** where.c: +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); +#ifdef WHERETRACE_ENABLED +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC); +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm); +SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC); +#endif +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +); +SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte); +SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte); + +/* wherecode.c: */ +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +); +SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter( + const Parse *pParse, /* Parse context */ + const WhereInfo *pWInfo, /* WHERE clause */ + const WhereLevel *pLevel /* Bloom filter on this level */ +); +#else +# define sqlite3WhereExplainOneScan(u,v,w,x) 0 +# define sqlite3WhereExplainBloomFilter(u,v,w) 0 +#endif /* SQLITE_OMIT_EXPLAIN */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +); +#else +# define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) +#endif +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ + Bitmask notReady /* Which tables are currently available */ +); +SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( + WhereInfo *pWInfo, + int iLevel, + WhereLevel *pLevel +); + +/* whereexpr.c: */ +SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*); +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8); +SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause*, Select*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet*, Expr*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*); +SQLITE_PRIVATE void sqlite3WhereExprAnalyze(SrcList*, WhereClause*); +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*); + + + + + +/* +** Bitmasks for the operators on WhereTerm objects. These are all +** operators that are of interest to the query planner. An +** OR-ed combination of these values can be used when searching for +** particular WhereTerms within a WhereClause. +** +** Value constraints: +** WO_EQ == SQLITE_INDEX_CONSTRAINT_EQ +** WO_LT == SQLITE_INDEX_CONSTRAINT_LT +** WO_LE == SQLITE_INDEX_CONSTRAINT_LE +** WO_GT == SQLITE_INDEX_CONSTRAINT_GT +** WO_GE == SQLITE_INDEX_CONSTRAINT_GE +*/ +#define WO_IN 0x0001 +#define WO_EQ 0x0002 +#define WO_LT (WO_EQ<<(TK_LT-TK_EQ)) +#define WO_LE (WO_EQ<<(TK_LE-TK_EQ)) +#define WO_GT (WO_EQ<<(TK_GT-TK_EQ)) +#define WO_GE (WO_EQ<<(TK_GE-TK_EQ)) +#define WO_AUX 0x0040 /* Op useful to virtual tables only */ +#define WO_IS 0x0080 +#define WO_ISNULL 0x0100 +#define WO_OR 0x0200 /* Two or more OR-connected terms */ +#define WO_AND 0x0400 /* Two or more AND-connected terms */ +#define WO_EQUIV 0x0800 /* Of the form A==B, both columns */ +#define WO_NOOP 0x1000 /* This term does not restrict search space */ +#define WO_ROWVAL 0x2000 /* A row-value term */ + +#define WO_ALL 0x3fff /* Mask of all possible WO_* values */ +#define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */ + +/* +** These are definitions of bits in the WhereLoop.wsFlags field. +** The particular combination of bits in each WhereLoop help to +** determine the algorithm that WhereLoop represents. +*/ +#define WHERE_COLUMN_EQ 0x00000001 /* x=EXPR */ +#define WHERE_COLUMN_RANGE 0x00000002 /* xEXPR */ +#define WHERE_COLUMN_IN 0x00000004 /* x IN (...) */ +#define WHERE_COLUMN_NULL 0x00000008 /* x IS NULL */ +#define WHERE_CONSTRAINT 0x0000000f /* Any of the WHERE_COLUMN_xxx values */ +#define WHERE_TOP_LIMIT 0x00000010 /* xEXPR or x>=EXPR constraint */ +#define WHERE_BOTH_LIMIT 0x00000030 /* Both x>EXPR and xaiColumn[i]; + if( i==XN_EXPR ) return ""; + if( i==XN_ROWID ) return "rowid"; + return pIdx->pTable->aCol[i].zCnName; +} + +/* +** This routine is a helper for explainIndexRange() below +** +** pStr holds the text of an expression that we are building up one term +** at a time. This routine adds a new term to the end of the expression. +** Terms are separated by AND so add the "AND" text for second and subsequent +** terms only. +*/ +static void explainAppendTerm( + StrAccum *pStr, /* The text expression being built */ + Index *pIdx, /* Index to read column names from */ + int nTerm, /* Number of terms */ + int iTerm, /* Zero-based index of first term. */ + int bAnd, /* Non-zero to append " AND " */ + const char *zOp /* Name of the operator */ +){ + int i; + + assert( nTerm>=1 ); + if( bAnd ) sqlite3_str_append(pStr, " AND ", 5); + + if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); + for(i=0; i1 ) sqlite3_str_append(pStr, ")", 1); + + sqlite3_str_append(pStr, zOp, 1); + + if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); + for(i=0; i1 ) sqlite3_str_append(pStr, ")", 1); +} + +/* +** Argument pLevel describes a strategy for scanning table pTab. This +** function appends text to pStr that describes the subset of table +** rows scanned by the strategy in the form of an SQL expression. +** +** For example, if the query: +** +** SELECT * FROM t1 WHERE a=1 AND b>2; +** +** is run and there is an index on (a, b), then this function returns a +** string similar to: +** +** "a=? AND b>?" +*/ +static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ + Index *pIndex = pLoop->u.btree.pIndex; + u16 nEq = pLoop->u.btree.nEq; + u16 nSkip = pLoop->nSkip; + int i, j; + + if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; + sqlite3_str_append(pStr, " (", 2); + for(i=0; i=nSkip ? "%s=?" : "ANY(%s)", z); + } + + j = i; + if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nBtm, j, i, ">"); + i = 1; + } + if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<"); + } + sqlite3_str_append(pStr, ")", 1); +} + +/* +** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN +** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was +** defined at compile-time. If it is not a no-op, a single OP_Explain opcode +** is added to the output to describe the table scan strategy in pLevel. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +){ + int ret = 0; +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) + if( sqlite3ParseToplevel(pParse)->explain==2 ) +#endif + { + SrcItem *pItem = &pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + int isSearch; /* True for a SEARCH. False for SCAN. */ + WhereLoop *pLoop; /* The controlling WhereLoop object */ + u32 flags; /* Flags that describe this loop */ + char *zMsg; /* Text to add to EQP output */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + pLoop = pLevel->pWLoop; + flags = pLoop->wsFlags; + if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_OR_SUBCLAUSE) ) return 0; + + isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 + || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) + || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + str.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3_str_appendf(&str, "%s %S", isSearch ? "SEARCH" : "SCAN", pItem); + if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ + const char *zFmt = 0; + Index *pIdx; + + assert( pLoop->u.btree.pIndex!=0 ); + pIdx = pLoop->u.btree.pIndex; + assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); + if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ + if( isSearch ){ + zFmt = "PRIMARY KEY"; + } + }else if( flags & WHERE_PARTIALIDX ){ + zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; + }else if( flags & WHERE_AUTO_INDEX ){ + zFmt = "AUTOMATIC COVERING INDEX"; + }else if( flags & WHERE_IDX_ONLY ){ + zFmt = "COVERING INDEX %s"; + }else{ + zFmt = "INDEX %s"; + } + if( zFmt ){ + sqlite3_str_append(&str, " USING ", 7); + sqlite3_str_appendf(&str, zFmt, pIdx->zName); + explainIndexRange(&str, pLoop); + } + }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ + char cRangeOp; +#if 0 /* Better output, but breaks many tests */ + const Table *pTab = pItem->pTab; + const char *zRowid = pTab->iPKey>=0 ? pTab->aCol[pTab->iPKey].zCnName: + "rowid"; +#else + const char *zRowid = "rowid"; +#endif + sqlite3_str_appendf(&str, " USING INTEGER PRIMARY KEY (%s", zRowid); + if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ + cRangeOp = '='; + }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ + sqlite3_str_appendf(&str, ">? AND %s", zRowid); + cRangeOp = '<'; + }else if( flags&WHERE_BTM_LIMIT ){ + cRangeOp = '>'; + }else{ + assert( flags&WHERE_TOP_LIMIT); + cRangeOp = '<'; + } + sqlite3_str_appendf(&str, "%c?)", cRangeOp); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ + sqlite3_str_appendf(&str, " VIRTUAL TABLE INDEX %d:%s", + pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); + } +#endif + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&str, " LEFT-JOIN"); + } +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS + if( pLoop->nOut>=10 ){ + sqlite3_str_appendf(&str, " (~%llu rows)", + sqlite3LogEstToInt(pLoop->nOut)); + }else{ + sqlite3_str_append(&str, " (~1 row)", 9); + } +#endif + zMsg = sqlite3StrAccumFinish(&str); + sqlite3ExplainBreakpoint("",zMsg); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), + pParse->addrExplain, 0, zMsg,P4_DYNAMIC); + } + return ret; +} + +/* +** Add a single OP_Explain opcode that describes a Bloom filter. +** +** Or if not processing EXPLAIN QUERY PLAN and not in a SQLITE_DEBUG and/or +** SQLITE_ENABLE_STMT_SCANSTATUS build, then OP_Explain opcodes are not +** required and this routine is a no-op. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter( + const Parse *pParse, /* Parse context */ + const WhereInfo *pWInfo, /* WHERE clause */ + const WhereLevel *pLevel /* Bloom filter on this level */ +){ + int ret = 0; + SrcItem *pItem = &pWInfo->pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + char *zMsg; /* Text to add to EQP output */ + int i; /* Loop counter */ + WhereLoop *pLoop; /* The where loop */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + str.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3_str_appendf(&str, "BLOOM FILTER ON %S (", pItem); + pLoop = pLevel->pWLoop; + if( pLoop->wsFlags & WHERE_IPK ){ + const Table *pTab = pItem->pTab; + if( pTab->iPKey>=0 ){ + sqlite3_str_appendf(&str, "%s=?", pTab->aCol[pTab->iPKey].zCnName); + }else{ + sqlite3_str_appendf(&str, "rowid=?"); + } + }else{ + for(i=pLoop->nSkip; iu.btree.nEq; i++){ + const char *z = explainIndexColumnName(pLoop->u.btree.pIndex, i); + if( i>pLoop->nSkip ) sqlite3_str_append(&str, " AND ", 5); + sqlite3_str_appendf(&str, "%s=?", z); + } + } + sqlite3_str_append(&str, ")", 1); + zMsg = sqlite3StrAccumFinish(&str); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), + pParse->addrExplain, 0, zMsg,P4_DYNAMIC); + return ret; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Configure the VM passed as the first argument with an +** sqlite3_stmt_scanstatus() entry corresponding to the scan used to +** implement level pLvl. Argument pSrclist is a pointer to the FROM +** clause that the scan reads data from. +** +** If argument addrExplain is not 0, it must be the address of an +** OP_Explain instruction that describes the same loop. +*/ +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +){ + const char *zObj = 0; + WhereLoop *pLoop = pLvl->pWLoop; + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ + zObj = pLoop->u.btree.pIndex->zName; + }else{ + zObj = pSrclist->a[pLvl->iFrom].zName; + } + sqlite3VdbeScanStatus( + v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj + ); +} +#endif + + +/* +** Disable a term in the WHERE clause. Except, do not disable the term +** if it controls a LEFT OUTER JOIN and it did not originate in the ON +** or USING clause of that join. +** +** Consider the term t2.z='ok' in the following queries: +** +** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' +** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' +** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' +** +** The t2.z='ok' is disabled in the in (2) because it originates +** in the ON clause. The term is disabled in (3) because it is not part +** of a LEFT OUTER JOIN. In (1), the term is not disabled. +** +** Disabling a term causes that term to not be tested in the inner loop +** of the join. Disabling is an optimization. When terms are satisfied +** by indices, we disable them to prevent redundant tests in the inner +** loop. We would get the correct results if nothing were ever disabled, +** but joins might run a little slower. The trick is to disable as much +** as we can without disabling too much. If we disabled in (1), we'd get +** the wrong answer. See ticket #813. +** +** If all the children of a term are disabled, then that term is also +** automatically disabled. In this way, terms get disabled if derived +** virtual terms are tested first. For example: +** +** x GLOB 'abc*' AND x>='abc' AND x<'acd' +** \___________/ \______/ \_____/ +** parent child1 child2 +** +** Only the parent term was in the original WHERE clause. The child1 +** and child2 terms were added by the LIKE optimization. If both of +** the virtual child terms are valid, then testing of the parent can be +** skipped. +** +** Usually the parent term is marked as TERM_CODED. But if the parent +** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead. +** The TERM_LIKECOND marking indicates that the term should be coded inside +** a conditional such that is only evaluated on the second pass of a +** LIKE-optimization loop, when scanning BLOBs instead of strings. +*/ +static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ + int nLoop = 0; + assert( pTerm!=0 ); + while( (pTerm->wtFlags & TERM_CODED)==0 + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_OuterON)) + && (pLevel->notReady & pTerm->prereqAll)==0 + ){ + if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ + pTerm->wtFlags |= TERM_LIKECOND; + }else{ + pTerm->wtFlags |= TERM_CODED; + } +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace & 0x20000 ){ + sqlite3DebugPrintf("DISABLE-"); + sqlite3WhereTermPrint(pTerm, (int)(pTerm - (pTerm->pWC->a))); + } +#endif + if( pTerm->iParent<0 ) break; + pTerm = &pTerm->pWC->a[pTerm->iParent]; + assert( pTerm!=0 ); + pTerm->nChild--; + if( pTerm->nChild!=0 ) break; + nLoop++; + } +} + +/* +** Code an OP_Affinity opcode to apply the column affinity string zAff +** to the n registers starting at base. +** +** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which +** are no-ops) at the beginning and end of zAff are ignored. If all entries +** in zAff are SQLITE_AFF_BLOB or SQLITE_AFF_NONE, then no code gets generated. +** +** This routine makes its own copy of zAff so that the caller is free +** to modify zAff after this routine returns. +*/ +static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ + Vdbe *v = pParse->pVdbe; + if( zAff==0 ){ + assert( pParse->db->mallocFailed ); + return; + } + assert( v!=0 ); + + /* Adjust base and n to skip over SQLITE_AFF_BLOB and SQLITE_AFF_NONE + ** entries at the beginning and end of the affinity string. + */ + assert( SQLITE_AFF_NONE0 && zAff[0]<=SQLITE_AFF_BLOB ){ + n--; + base++; + zAff++; + } + while( n>1 && zAff[n-1]<=SQLITE_AFF_BLOB ){ + n--; + } + + /* Code the OP_Affinity opcode if there is anything left to do. */ + if( n>0 ){ + sqlite3VdbeAddOp4(v, OP_Affinity, base, n, 0, zAff, n); + } +} + +/* +** Expression pRight, which is the RHS of a comparison operation, is +** either a vector of n elements or, if n==1, a scalar expression. +** Before the comparison operation, affinity zAff is to be applied +** to the pRight values. This function modifies characters within the +** affinity string to SQLITE_AFF_BLOB if either: +** +** * the comparison will be performed with no affinity, or +** * the affinity change in zAff is guaranteed not to change the value. +*/ +static void updateRangeAffinityStr( + Expr *pRight, /* RHS of comparison */ + int n, /* Number of vector elements in comparison */ + char *zAff /* Affinity string to modify */ +){ + int i; + for(i=0; idb; + Expr *pNew; + pNew = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed==0 ){ + ExprList *pOrigRhs; /* Original unmodified RHS */ + ExprList *pOrigLhs; /* Original unmodified LHS */ + ExprList *pRhs = 0; /* New RHS after modifications */ + ExprList *pLhs = 0; /* New LHS after mods */ + int i; /* Loop counter */ + Select *pSelect; /* Pointer to the SELECT on the RHS */ + + assert( ExprUseXSelect(pNew) ); + pOrigRhs = pNew->x.pSelect->pEList; + assert( pNew->pLeft!=0 ); + assert( ExprUseXList(pNew->pLeft) ); + pOrigLhs = pNew->pLeft->x.pList; + for(i=iEq; inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iField; + assert( (pLoop->aLTerm[i]->eOperator & (WO_OR|WO_AND))==0 ); + iField = pLoop->aLTerm[i]->u.x.iField - 1; + if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */ + pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr); + pOrigRhs->a[iField].pExpr = 0; + assert( pOrigLhs->a[iField].pExpr!=0 ); + pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr); + pOrigLhs->a[iField].pExpr = 0; + } + } + sqlite3ExprListDelete(db, pOrigRhs); + sqlite3ExprListDelete(db, pOrigLhs); + pNew->pLeft->x.pList = pLhs; + pNew->x.pSelect->pEList = pRhs; + if( pLhs && pLhs->nExpr==1 ){ + /* Take care here not to generate a TK_VECTOR containing only a + ** single value. Since the parser never creates such a vector, some + ** of the subroutines do not handle this case. */ + Expr *p = pLhs->a[0].pExpr; + pLhs->a[0].pExpr = 0; + sqlite3ExprDelete(db, pNew->pLeft); + pNew->pLeft = p; + } + pSelect = pNew->x.pSelect; + if( pSelect->pOrderBy ){ + /* If the SELECT statement has an ORDER BY clause, zero the + ** iOrderByCol variables. These are set to non-zero when an + ** ORDER BY term exactly matches one of the terms of the + ** result-set. Since the result-set of the SELECT statement may + ** have been modified or reordered, these variables are no longer + ** set correctly. Since setting them is just an optimization, + ** it's easiest just to zero them here. */ + ExprList *pOrderBy = pSelect->pOrderBy; + for(i=0; inExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + } + +#if 0 + printf("For indexing, change the IN expr:\n"); + sqlite3TreeViewExpr(0, pX, 0); + printf("Into:\n"); + sqlite3TreeViewExpr(0, pNew, 0); +#endif + } + return pNew; +} + + +/* +** Generate code for a single equality term of the WHERE clause. An equality +** term can be either X=expr or X IN (...). pTerm is the term to be +** coded. +** +** The current value for the constraint is left in a register, the index +** of which is returned. An attempt is made store the result in iTarget but +** this is only guaranteed for TK_ISNULL and TK_IN constraints. If the +** constraint is a TK_EQ or TK_IS, then the current value might be left in +** some other register and it is the caller's responsibility to compensate. +** +** For a constraint of the form X=expr, the expression is evaluated in +** straight-line code. For constraints of the form X IN (...) +** this routine sets up a loop that will iterate over all values of X. +*/ +static int codeEqualityTerm( + Parse *pParse, /* The parsing context */ + WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ + WhereLevel *pLevel, /* The level of the FROM clause we are working on */ + int iEq, /* Index of the equality term within this level */ + int bRev, /* True for reverse-order IN operations */ + int iTarget /* Attempt to leave results in this register */ +){ + Expr *pX = pTerm->pExpr; + Vdbe *v = pParse->pVdbe; + int iReg; /* Register holding results */ + + assert( pLevel->pWLoop->aLTerm[iEq]==pTerm ); + assert( iTarget>0 ); + if( pX->op==TK_EQ || pX->op==TK_IS ){ + iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); + }else if( pX->op==TK_ISNULL ){ + iReg = iTarget; + sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); +#ifndef SQLITE_OMIT_SUBQUERY + }else{ + int eType = IN_INDEX_NOOP; + int iTab; + struct InLoop *pIn; + WhereLoop *pLoop = pLevel->pWLoop; + int i; + int nEq = 0; + int *aiMap = 0; + + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && pLoop->u.btree.pIndex!=0 + && pLoop->u.btree.pIndex->aSortOrder[iEq] + ){ + testcase( iEq==0 ); + testcase( bRev ); + bRev = !bRev; + } + assert( pX->op==TK_IN ); + iReg = iTarget; + + for(i=0; iaLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ + disableTerm(pLevel, pTerm); + return iTarget; + } + } + for(i=iEq;inLTerm; i++){ + assert( pLoop->aLTerm[i]!=0 ); + if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; + } + + iTab = 0; + if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); + }else{ + Expr *pExpr = pTerm->pExpr; + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + pExpr->iTable = iTab; + } + sqlite3ExprDelete(db, pX); + }else{ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + } + pX = pExpr; + } + + if( eType==IN_INDEX_INDEX_DESC ){ + testcase( bRev ); + bRev = !bRev; + } + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); + + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + pLoop->wsFlags |= WHERE_IN_ABLE; + if( pLevel->u.in.nIn==0 ){ + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + } + if( iEq>0 && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 ){ + pLoop->wsFlags |= WHERE_IN_EARLYOUT; + } + + i = pLevel->u.in.nIn; + pLevel->u.in.nIn += nEq; + pLevel->u.in.aInLoop = + sqlite3WhereRealloc(pTerm->pWC->pWInfo, + pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + pIn = pLevel->u.in.aInLoop; + if( pIn ){ + int iMap = 0; /* Index in aiMap[] */ + pIn += i; + for(i=iEq;inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iOut = iReg + i - iEq; + if( eType==IN_INDEX_ROWID ){ + pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); + }else{ + int iCol = aiMap ? aiMap[iMap++] : 0; + pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); + } + sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); + if( i==iEq ){ + pIn->iCur = iTab; + pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; + if( iEq>0 ){ + pIn->iBase = iReg - i; + pIn->nPrefix = i; + }else{ + pIn->nPrefix = 0; + } + }else{ + pIn->eEndLoopOp = OP_Noop; + } + pIn++; + } + } + testcase( iEq>0 + && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 + && (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ); + if( iEq>0 + && (pLoop->wsFlags & (WHERE_IN_SEEKSCAN|WHERE_VIRTUALTABLE))==0 + ){ + sqlite3VdbeAddOp3(v, OP_SeekHit, pLevel->iIdxCur, 0, iEq); + } + }else{ + pLevel->u.in.nIn = 0; + } + sqlite3DbFree(pParse->db, aiMap); +#endif + } + + /* As an optimization, try to disable the WHERE clause term that is + ** driving the index as it will always be true. The correct answer is + ** obtained regardless, but we might get the answer with fewer CPU cycles + ** by omitting the term. + ** + ** But do not disable the term unless we are certain that the term is + ** not a transitive constraint. For an example of where that does not + ** work, see https://sqlite.org/forum/forumpost/eb8613976a (2021-05-04) + */ + if( (pLevel->pWLoop->wsFlags & WHERE_TRANSCONS)==0 + || (pTerm->eOperator & WO_EQUIV)==0 + ){ + disableTerm(pLevel, pTerm); + } + + return iReg; +} + +/* +** Generate code that will evaluate all == and IN constraints for an +** index scan. +** +** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). +** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 +** The index has as many as three equality constraints, but in this +** example, the third "c" value is an inequality. So only two +** constraints are coded. This routine will generate code to evaluate +** a==5 and b IN (1,2,3). The current values for a and b will be stored +** in consecutive registers and the index of the first register is returned. +** +** In the example above nEq==2. But this subroutine works for any value +** of nEq including 0. If nEq==0, this routine is nearly a no-op. +** The only thing it does is allocate the pLevel->iMem memory cell and +** compute the affinity string. +** +** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints +** are == or IN and are covered by the nEq. nExtraReg is 1 if there is +** an inequality constraint (such as the "c>=5 AND c<10" in the example) that +** occurs after the nEq quality constraints. +** +** This routine allocates a range of nEq+nExtraReg memory cells and returns +** the index of the first memory cell in that range. The code that +** calls this routine will use that memory range to store keys for +** start and termination conditions of the loop. +** key value of the loop. If one or more IN operators appear, then +** this routine allocates an additional nEq memory cells for internal +** use. +** +** Before returning, *pzAff is set to point to a buffer containing a +** copy of the column affinity string of the index allocated using +** sqlite3DbMalloc(). Except, entries in the copy of the string associated +** with equality constraints that use BLOB or NONE affinity are set to +** SQLITE_AFF_BLOB. This is to deal with SQL such as the following: +** +** CREATE TABLE t1(a TEXT PRIMARY KEY, b); +** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; +** +** In the example above, the index on t1(a) has TEXT affinity. But since +** the right hand side of the equality constraint (t2.b) has BLOB/NONE affinity, +** no conversion should be attempted before using a t2.b value as part of +** a key to search the index. Hence the first byte in the returned affinity +** string in this example would be set to SQLITE_AFF_BLOB. +*/ +static int codeAllEqualityTerms( + Parse *pParse, /* Parsing context */ + WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ + int bRev, /* Reverse the order of IN operators */ + int nExtraReg, /* Number of extra registers to allocate */ + char **pzAff /* OUT: Set to point to affinity string */ +){ + u16 nEq; /* The number of == or IN constraints to code */ + u16 nSkip; /* Number of left-most columns to skip */ + Vdbe *v = pParse->pVdbe; /* The vm under construction */ + Index *pIdx; /* The index being used for this loop */ + WhereTerm *pTerm; /* A single constraint term */ + WhereLoop *pLoop; /* The WhereLoop object */ + int j; /* Loop counter */ + int regBase; /* Base register */ + int nReg; /* Number of registers to allocate */ + char *zAff; /* Affinity string to return */ + + /* This module is only called on query plans that use an index. */ + pLoop = pLevel->pWLoop; + assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); + nEq = pLoop->u.btree.nEq; + nSkip = pLoop->nSkip; + pIdx = pLoop->u.btree.pIndex; + assert( pIdx!=0 ); + + /* Figure out how many memory cells we will need then allocate them. + */ + regBase = pParse->nMem + 1; + nReg = pLoop->u.btree.nEq + nExtraReg; + pParse->nMem += nReg; + + zAff = sqlite3DbStrDup(pParse->db,sqlite3IndexAffinityStr(pParse->db,pIdx)); + assert( zAff!=0 || pParse->db->mallocFailed ); + + if( nSkip ){ + int iIdxCur = pLevel->iIdxCur; + sqlite3VdbeAddOp3(v, OP_Null, 0, regBase, regBase+nSkip-1); + sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); + j = sqlite3VdbeAddOp0(v, OP_Goto); + assert( pLevel->addrSkip==0 ); + pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), + iIdxCur, 0, regBase, nSkip); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + sqlite3VdbeJumpHere(v, j); + for(j=0; jaiColumn[j]==XN_EXPR ); + VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); + } + } + + /* Evaluate the equality constraints + */ + assert( zAff==0 || (int)strlen(zAff)>=nEq ); + for(j=nSkip; jaLTerm[j]; + assert( pTerm!=0 ); + /* The following testcase is true for indices with redundant columns. + ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ + testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); + if( r1!=regBase+j ){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, regBase); + regBase = r1; + }else{ + sqlite3VdbeAddOp2(v, OP_Copy, r1, regBase+j); + } + } + } + for(j=nSkip; jaLTerm[j]; + if( pTerm->eOperator & WO_IN ){ + if( pTerm->pExpr->flags & EP_xIsSelect ){ + /* No affinity ever needs to be (or should be) applied to a value + ** from the RHS of an "? IN (SELECT ...)" expression. The + ** sqlite3FindInIndex() routine has already ensured that the + ** affinity of the comparison has been applied to the value. */ + if( zAff ) zAff[j] = SQLITE_AFF_BLOB; + } + }else if( (pTerm->eOperator & WO_ISNULL)==0 ){ + Expr *pRight = pTerm->pExpr->pRight; + if( (pTerm->wtFlags & TERM_IS)==0 && sqlite3ExprCanBeNull(pRight) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); + VdbeCoverage(v); + } + if( pParse->nErr==0 ){ + assert( pParse->db->mallocFailed==0 ); + if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ + zAff[j] = SQLITE_AFF_BLOB; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ + zAff[j] = SQLITE_AFF_BLOB; + } + } + } + } + *pzAff = zAff; + return regBase; +} + +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS +/* +** If the most recently coded instruction is a constant range constraint +** (a string literal) that originated from the LIKE optimization, then +** set P3 and P5 on the OP_String opcode so that the string will be cast +** to a BLOB at appropriate times. +** +** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range +** expression: "x>='ABC' AND x<'abd'". But this requires that the range +** scan loop run twice, once for strings and a second time for BLOBs. +** The OP_String opcodes on the second pass convert the upper and lower +** bound string constants to blobs. This routine makes the necessary changes +** to the OP_String opcodes for that to happen. +** +** Except, of course, if SQLITE_LIKE_DOESNT_MATCH_BLOBS is defined, then +** only the one pass through the string space is required, so this routine +** becomes a no-op. +*/ +static void whereLikeOptimizationStringFixup( + Vdbe *v, /* prepared statement under construction */ + WhereLevel *pLevel, /* The loop that contains the LIKE operator */ + WhereTerm *pTerm /* The upper or lower bound just coded */ +){ + if( pTerm->wtFlags & TERM_LIKEOPT ){ + VdbeOp *pOp; + assert( pLevel->iLikeRepCntr>0 ); + pOp = sqlite3VdbeGetOp(v, -1); + assert( pOp!=0 ); + assert( pOp->opcode==OP_String8 + || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); + pOp->p3 = (int)(pLevel->iLikeRepCntr>>1); /* Register holding counter */ + pOp->p5 = (u8)(pLevel->iLikeRepCntr&1); /* ASC or DESC */ + } +} +#else +# define whereLikeOptimizationStringFixup(A,B,C) +#endif + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Information is passed from codeCursorHint() down to individual nodes of +** the expression tree (by sqlite3WalkExpr()) using an instance of this +** structure. +*/ +struct CCurHint { + int iTabCur; /* Cursor for the main table */ + int iIdxCur; /* Cursor for the index, if pIdx!=0. Unused otherwise */ + Index *pIdx; /* The index used to access the table */ +}; + +/* +** This function is called for every node of an expression that is a candidate +** for a cursor hint on an index cursor. For TK_COLUMN nodes that reference +** the table CCurHint.iTabCur, verify that the same column can be +** accessed through the index. If it cannot, then set pWalker->eCode to 1. +*/ +static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ + struct CCurHint *pHint = pWalker->u.pCCurHint; + assert( pHint->pIdx!=0 ); + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pHint->iTabCur + && sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + } + return WRC_Continue; +} + +/* +** Test whether or not expression pExpr, which was part of a WHERE clause, +** should be included in the cursor-hint for a table that is on the rhs +** of a LEFT JOIN. Set Walker.eCode to non-zero before returning if the +** expression is not suitable. +** +** An expression is unsuitable if it might evaluate to non NULL even if +** a TK_COLUMN node that does affect the value of the expression is set +** to NULL. For example: +** +** col IS NULL +** col IS NOT NULL +** coalesce(col, 1) +** CASE WHEN col THEN 0 ELSE 1 END +*/ +static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_IS + || pExpr->op==TK_ISNULL || pExpr->op==TK_ISNOT + || pExpr->op==TK_NOTNULL || pExpr->op==TK_CASE + ){ + pWalker->eCode = 1; + }else if( pExpr->op==TK_FUNCTION ){ + int d1; + char d2[4]; + if( 0==sqlite3IsLikeFunction(pWalker->pParse->db, pExpr, &d1, d2) ){ + pWalker->eCode = 1; + } + } + + return WRC_Continue; +} + + +/* +** This function is called on every node of an expression tree used as an +** argument to the OP_CursorHint instruction. If the node is a TK_COLUMN +** that accesses any table other than the one identified by +** CCurHint.iTabCur, then do the following: +** +** 1) allocate a register and code an OP_Column instruction to read +** the specified column into the new register, and +** +** 2) transform the expression node to a TK_REGISTER node that reads +** from the newly populated register. +** +** Also, if the node is a TK_COLUMN that does access the table idenified +** by pCCurHint.iTabCur, and an index is being used (which we will +** know because CCurHint.pIdx!=0) then transform the TK_COLUMN into +** an access of the index rather than the original table. +*/ +static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ + int rc = WRC_Continue; + struct CCurHint *pHint = pWalker->u.pCCurHint; + if( pExpr->op==TK_COLUMN ){ + if( pExpr->iTable!=pHint->iTabCur ){ + int reg = ++pWalker->pParse->nMem; /* Register for column value */ + sqlite3ExprCode(pWalker->pParse, pExpr, reg); + pExpr->op = TK_REGISTER; + pExpr->iTable = reg; + }else if( pHint->pIdx!=0 ){ + pExpr->iTable = pHint->iIdxCur; + pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn); + assert( pExpr->iColumn>=0 ); + } + }else if( pExpr->op==TK_AGG_FUNCTION ){ + /* An aggregate function in the WHERE clause of a query means this must + ** be a correlated sub-query, and expression pExpr is an aggregate from + ** the parent context. Do not walk the function arguments in this case. + ** + ** todo: It should be possible to replace this node with a TK_REGISTER + ** expression, as the result of the expression must be stored in a + ** register at this point. The same holds for TK_AGG_COLUMN nodes. */ + rc = WRC_Prune; + } + return rc; +} + +/* +** Insert an OP_CursorHint instruction if it is appropriate to do so. +*/ +static void codeCursorHint( + SrcItem *pTabItem, /* FROM clause item */ + WhereInfo *pWInfo, /* The where clause */ + WhereLevel *pLevel, /* Which loop to provide hints for */ + WhereTerm *pEndRange /* Hint this end-of-scan boundary term if not NULL */ +){ + Parse *pParse = pWInfo->pParse; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + Expr *pExpr = 0; + WhereLoop *pLoop = pLevel->pWLoop; + int iCur; + WhereClause *pWC; + WhereTerm *pTerm; + int i, j; + struct CCurHint sHint; + Walker sWalker; + + if( OptimizationDisabled(db, SQLITE_CursorHints) ) return; + iCur = pLevel->iTabCur; + assert( iCur==pWInfo->pTabList->a[pLevel->iFrom].iCursor ); + sHint.iTabCur = iCur; + sHint.iIdxCur = pLevel->iIdxCur; + sHint.pIdx = pLoop->u.btree.pIndex; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.u.pCCurHint = &sHint; + pWC = &pWInfo->sWC; + for(i=0; inBase; i++){ + pTerm = &pWC->a[i]; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( pTerm->prereqAll & pLevel->notReady ) continue; + + /* Any terms specified as part of the ON(...) clause for any LEFT + ** JOIN for which the current table is not the rhs are omitted + ** from the cursor-hint. + ** + ** If this table is the rhs of a LEFT JOIN, "IS" or "IS NULL" terms + ** that were specified as part of the WHERE clause must be excluded. + ** This is to address the following: + ** + ** SELECT ... t1 LEFT JOIN t2 ON (t1.a=t2.b) WHERE t2.c IS NULL; + ** + ** Say there is a single row in t2 that matches (t1.a=t2.b), but its + ** t2.c values is not NULL. If the (t2.c IS NULL) constraint is + ** pushed down to the cursor, this row is filtered out, causing + ** SQLite to synthesize a row of NULL values. Which does match the + ** WHERE clause, and so the query returns a row. Which is incorrect. + ** + ** For the same reason, WHERE terms such as: + ** + ** WHERE 1 = (t2.c IS NULL) + ** + ** are also excluded. See codeCursorHintIsOrFunction() for details. + */ + if( pTabItem->fg.jointype & JT_LEFT ){ + Expr *pExpr = pTerm->pExpr; + if( !ExprHasProperty(pExpr, EP_OuterON) + || pExpr->w.iJoin!=pTabItem->iCursor + ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintIsOrFunction; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + }else{ + if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) continue; + } + + /* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize + ** the cursor. These terms are not needed as hints for a pure range + ** scan (that has no == terms) so omit them. */ + if( pLoop->u.btree.nEq==0 && pTerm!=pEndRange ){ + for(j=0; jnLTerm && pLoop->aLTerm[j]!=pTerm; j++){} + if( jnLTerm ) continue; + } + + /* No subqueries or non-deterministic functions allowed */ + if( sqlite3ExprContainsSubquery(pTerm->pExpr) ) continue; + + /* For an index scan, make sure referenced columns are actually in + ** the index. */ + if( sHint.pIdx!=0 ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintCheckExpr; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + + /* If we survive all prior tests, that means this term is worth hinting */ + pExpr = sqlite3ExprAnd(pParse, pExpr, sqlite3ExprDup(db, pTerm->pExpr, 0)); + } + if( pExpr!=0 ){ + sWalker.xExprCallback = codeCursorHintFixExpr; + sqlite3WalkExpr(&sWalker, pExpr); + sqlite3VdbeAddOp4(v, OP_CursorHint, + (sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0, + (const char*)pExpr, P4_EXPR); + } +} +#else +# define codeCursorHint(A,B,C,D) /* No-op */ +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +/* +** Cursor iCur is open on an intkey b-tree (a table). Register iRowid contains +** a rowid value just read from cursor iIdxCur, open on index pIdx. This +** function generates code to do a deferred seek of cursor iCur to the +** rowid stored in register iRowid. +** +** Normally, this is just: +** +** OP_DeferredSeek $iCur $iRowid +** +** Which causes a seek on $iCur to the row with rowid $iRowid. +** +** However, if the scan currently being coded is a branch of an OR-loop and +** the statement currently being coded is a SELECT, then additional information +** is added that might allow OP_Column to omit the seek and instead do its +** lookup on the index, thus avoiding an expensive seek operation. To +** enable this optimization, the P3 of OP_DeferredSeek is set to iIdxCur +** and P4 is set to an array of integers containing one entry for each column +** in the table. For each table column, if the column is the i'th +** column of the index, then the corresponding array entry is set to (i+1). +** If the column does not appear in the index at all, the array entry is set +** to 0. The OP_Column opcode can check this array to see if the column it +** wants is in the index and if it is, it will substitute the index cursor +** and column number and continue with those new values, rather than seeking +** the table cursor. +*/ +static void codeDeferredSeek( + WhereInfo *pWInfo, /* Where clause context */ + Index *pIdx, /* Index scan is using */ + int iCur, /* Cursor for IPK b-tree */ + int iIdxCur /* Index cursor */ +){ + Parse *pParse = pWInfo->pParse; /* Parse context */ + Vdbe *v = pParse->pVdbe; /* Vdbe to generate code within */ + + assert( iIdxCur>0 ); + assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); + + pWInfo->bDeferredSeek = 1; + sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); + if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN)) + && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) + ){ + int i; + Table *pTab = pIdx->pTable; + u32 *ai = (u32*)sqlite3DbMallocZero(pParse->db, sizeof(u32)*(pTab->nCol+1)); + if( ai ){ + ai[0] = pTab->nCol; + for(i=0; inColumn-1; i++){ + int x1, x2; + assert( pIdx->aiColumn[i]nCol ); + x1 = pIdx->aiColumn[i]; + x2 = sqlite3TableColumnToStorage(pTab, x1); + testcase( x1!=x2 ); + if( x1>=0 ) ai[x2+1] = i+1; + } + sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); + } + } +} + +/* +** If the expression passed as the second argument is a vector, generate +** code to write the first nReg elements of the vector into an array +** of registers starting with iReg. +** +** If the expression is not a vector, then nReg must be passed 1. In +** this case, generate code to evaluate the expression and leave the +** result in register iReg. +*/ +static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ + assert( nReg>0 ); + if( p && sqlite3ExprIsVector(p) ){ +#ifndef SQLITE_OMIT_SUBQUERY + if( ExprUseXSelect(p) ){ + Vdbe *v = pParse->pVdbe; + int iSelect; + assert( p->op==TK_SELECT ); + iSelect = sqlite3CodeSubselect(pParse, p); + sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); + }else +#endif + { + int i; + const ExprList *pList; + assert( ExprUseXList(p) ); + pList = p->x.pList; + assert( nReg<=pList->nExpr ); + for(i=0; ia[i].pExpr, iReg+i); + } + } + }else{ + assert( nReg==1 || pParse->nErr ); + sqlite3ExprCode(pParse, p, iReg); + } +} + +/* An instance of the IdxExprTrans object carries information about a +** mapping from an expression on table columns into a column in an index +** down through the Walker. +*/ +typedef struct IdxExprTrans { + Expr *pIdxExpr; /* The index expression */ + int iTabCur; /* The cursor of the corresponding table */ + int iIdxCur; /* The cursor for the index */ + int iIdxCol; /* The column for the index */ + int iTabCol; /* The column for the table */ + WhereInfo *pWInfo; /* Complete WHERE clause information */ + sqlite3 *db; /* Database connection (for malloc()) */ +} IdxExprTrans; + +/* +** Preserve pExpr on the WhereETrans list of the WhereInfo. +*/ +static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ + WhereExprMod *pNew; + pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); + if( pNew==0 ) return; + pNew->pNext = pTrans->pWInfo->pExprMods; + pTrans->pWInfo->pExprMods = pNew; + pNew->pExpr = pExpr; + memcpy(&pNew->orig, pExpr, sizeof(*pExpr)); +} + +/* The walker node callback used to transform matching expressions into +** a reference to an index column for an index on an expression. +** +** If pExpr matches, then transform it into a reference to the index column +** that contains the value of pExpr. +*/ +static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + pExpr = sqlite3ExprSkipCollate(pExpr); + preserveExpr(pX, pExpr); + pExpr->affExpr = sqlite3ExprAffinity(pExpr); + pExpr->op = TK_COLUMN; + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + testcase( ExprHasProperty(pExpr, EP_Unlikely) ); + ExprClearProperty(pExpr, EP_Skip|EP_Unlikely|EP_WinFunc|EP_Subrtn); + pExpr->y.pTab = 0; + return WRC_Prune; + }else{ + return WRC_Continue; + } +} + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* A walker node callback that translates a column reference to a table +** into a corresponding column reference of an index. +*/ +static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ + assert( ExprUseYTab(pExpr) && pExpr->y.pTab!=0 ); + preserveExpr(pX, pExpr); + pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + pExpr->y.pTab = 0; + } + } + return WRC_Continue; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + +/* +** For an indexes on expression X, locate every instance of expression X +** in pExpr and change that subexpression into a reference to the appropriate +** column of the index. +** +** 2019-10-24: Updated to also translate references to a VIRTUAL column in +** the table into references to the corresponding (stored) column of the +** index. +*/ +static void whereIndexExprTrans( + Index *pIdx, /* The Index */ + int iTabCur, /* Cursor of the table that is being indexed */ + int iIdxCur, /* Cursor of the index itself */ + WhereInfo *pWInfo /* Transform expressions in this WHERE clause */ +){ + int iIdxCol; /* Column number of the index */ + ExprList *aColExpr; /* Expressions that are indexed */ + Table *pTab; + Walker w; + IdxExprTrans x; + aColExpr = pIdx->aColExpr; + if( aColExpr==0 && !pIdx->bHasVCol ){ + /* The index does not reference any expressions or virtual columns + ** so no translations are needed. */ + return; + } + pTab = pIdx->pTable; + memset(&w, 0, sizeof(w)); + w.u.pIdxTrans = &x; + x.iTabCur = iTabCur; + x.iIdxCur = iIdxCur; + x.pWInfo = pWInfo; + x.db = pWInfo->pParse->db; + for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ + i16 iRef = pIdx->aiColumn[iIdxCol]; + if( iRef==XN_EXPR ){ + assert( aColExpr!=0 && aColExpr->a[iIdxCol].pExpr!=0 ); + x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; + if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue; + w.xExprCallback = whereIndexExprTransNode; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( iRef>=0 + && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 + && ((pTab->aCol[iRef].colFlags & COLFLAG_HASCOLL)==0 + || sqlite3StrICmp(sqlite3ColumnColl(&pTab->aCol[iRef]), + sqlite3StrBINARY)==0) + ){ + /* Check to see if there are direct references to generated columns + ** that are contained in the index. Pulling the generated column + ** out of the index is an optimization only - the main table is always + ** available if the index cannot be used. To avoid unnecessary + ** complication, omit this optimization if the collating sequence for + ** the column is non-standard */ + x.iTabCol = iRef; + w.xExprCallback = whereIndexExprTransColumn; +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + }else{ + continue; + } + x.iIdxCol = iIdxCol; + sqlite3WalkExpr(&w, pWInfo->pWhere); + sqlite3WalkExprList(&w, pWInfo->pOrderBy); + sqlite3WalkExprList(&w, pWInfo->pResultSet); + } +} + +/* +** The pTruth expression is always true because it is the WHERE clause +** a partial index that is driving a query loop. Look through all of the +** WHERE clause terms on the query, and if any of those terms must be +** true because pTruth is true, then mark those WHERE clause terms as +** coded. +*/ +static void whereApplyPartialIndexConstraints( + Expr *pTruth, + int iTabCur, + WhereClause *pWC +){ + int i; + WhereTerm *pTerm; + while( pTruth->op==TK_AND ){ + whereApplyPartialIndexConstraints(pTruth->pLeft, iTabCur, pWC); + pTruth = pTruth->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + if( pTerm->wtFlags & TERM_CODED ) continue; + pExpr = pTerm->pExpr; + if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } +} + +/* +** This routine is called right after An OP_Filter has been generated and +** before the corresponding index search has been performed. This routine +** checks to see if there are additional Bloom filters in inner loops that +** can be checked prior to doing the index lookup. If there are available +** inner-loop Bloom filters, then evaluate those filters now, before the +** index lookup. The idea is that a Bloom filter check is way faster than +** an index lookup, and the Bloom filter might return false, meaning that +** the index lookup can be skipped. +** +** We know that an inner loop uses a Bloom filter because it has the +** WhereLevel.regFilter set. If an inner-loop Bloom filter is checked, +** then clear the WhereLevel.regFilter value to prevent the Bloom filter +** from being checked a second time when the inner loop is evaluated. +*/ +static SQLITE_NOINLINE void filterPullDown( + Parse *pParse, /* Parsing context */ + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + int addrNxt, /* Jump here to bypass inner loops */ + Bitmask notReady /* Loops that are not ready */ +){ + while( ++iLevel < pWInfo->nLevel ){ + WhereLevel *pLevel = &pWInfo->a[iLevel]; + WhereLoop *pLoop = pLevel->pWLoop; + if( pLevel->regFilter==0 ) continue; + if( pLevel->pWLoop->nSkip ) continue; + /* ,--- Because sqlite3ConstructBloomFilter() has will not have set + ** vvvvv--' pLevel->regFilter if this were true. */ + if( NEVER(pLoop->prereq & notReady) ) continue; + assert( pLevel->addrBrk==0 ); + pLevel->addrBrk = addrNxt; + if( pLoop->wsFlags & WHERE_IPK ){ + WhereTerm *pTerm = pLoop->aLTerm[0]; + int regRowid; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + regRowid = sqlite3GetTempReg(pParse); + regRowid = codeEqualityTerm(pParse, pTerm, pLevel, 0, 0, regRowid); + sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, + addrNxt, regRowid, 1); + VdbeCoverage(pParse->pVdbe); + }else{ + u16 nEq = pLoop->u.btree.nEq; + int r1; + char *zStartAff; + + assert( pLoop->wsFlags & WHERE_INDEXED ); + assert( (pLoop->wsFlags & WHERE_COLUMN_IN)==0 ); + r1 = codeAllEqualityTerms(pParse,pLevel,0,0,&zStartAff); + codeApplyAffinity(pParse, r1, nEq, zStartAff); + sqlite3DbFree(pParse->db, zStartAff); + sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, + addrNxt, r1, nEq); + VdbeCoverage(pParse->pVdbe); + } + pLevel->regFilter = 0; + pLevel->addrBrk = 0; + } +} + +/* +** Generate code for the start of the iLevel-th loop in the WHERE clause +** implementation described by pWInfo. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ + Bitmask notReady /* Which tables are currently available */ +){ + int j, k; /* Loop counters */ + int iCur; /* The VDBE cursor for the table */ + int addrNxt; /* Where to jump to continue with the next IN case */ + int bRev; /* True if we need to scan in reverse order */ + WhereLoop *pLoop; /* The WhereLoop object being coded */ + WhereClause *pWC; /* Decomposition of the entire WHERE clause */ + WhereTerm *pTerm; /* A WHERE clause term */ + sqlite3 *db; /* Database connection */ + SrcItem *pTabItem; /* FROM clause term being coded */ + int addrBrk; /* Jump here to break out of the loop */ + int addrHalt; /* addrBrk for the outermost loop */ + int addrCont; /* Jump here to continue with next cycle */ + int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ + int iReleaseReg = 0; /* Temp register to free before returning */ + Index *pIdx = 0; /* Index used by loop (if any) */ + int iLoop; /* Iteration of constraint generator loop */ + + pWC = &pWInfo->sWC; + db = pParse->db; + pLoop = pLevel->pWLoop; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + iCur = pTabItem->iCursor; + pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); + bRev = (pWInfo->revMask>>iLevel)&1; + VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n", + iLevel, pWInfo->nLevel, (u64)notReady, pLevel->iFrom); + sqlite3WhereLoopPrint(pLoop, pWC); + } + if( sqlite3WhereTrace & 0x20000 ){ + if( iLevel==0 ){ + sqlite3DebugPrintf("WHERE clause being coded:\n"); + sqlite3TreeViewExpr(0, pWInfo->pWhere, 0); + } + sqlite3DebugPrintf("All WHERE-clause terms before coding:\n"); + sqlite3WhereClausePrint(pWC); + } +#endif + + /* Create labels for the "break" and "continue" instructions + ** for the current loop. Jump to addrBrk to break out of a loop. + ** Jump to cont to go immediately to the next iteration of the + ** loop. + ** + ** When there is an IN operator, we also have a "addrNxt" label that + ** means to continue with the next IN value combination. When + ** there are no IN operators in the constraints, the "addrNxt" label + ** is the same as "addrBrk". + */ + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); + + /* If this is the right table of a LEFT OUTER JOIN, allocate and + ** initialize a memory cell that records if this table matches any + ** row of the left table of the join. + */ + assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN)) + || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0 + ); + if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ + pLevel->iLeftJoin = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); + VdbeComment((v, "init LEFT JOIN no-match flag")); + } + + /* Compute a safe address to jump to if we discover that the table for + ** this loop is empty and can never contribute content. */ + for(j=iLevel; j>0; j--){ + if( pWInfo->a[j].iLeftJoin ) break; + if( pWInfo->a[j].pRJ ) break; + } + addrHalt = pWInfo->a[j].addrBrk; + + /* Special case of a FROM clause subquery implemented as a co-routine */ + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + VdbeCoverage(v); + VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); + pLevel->op = OP_Goto; + }else + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + /* Case 1: The table is a virtual-table. Use the VFilter and VNext + ** to access the data. + */ + int iReg; /* P3 Value for OP_VFilter */ + int addrNotFound; + int nConstraint = pLoop->nLTerm; + + iReg = sqlite3GetTempRange(pParse, nConstraint+2); + addrNotFound = pLevel->addrBrk; + for(j=0; jaLTerm[j]; + if( NEVER(pTerm==0) ) continue; + if( pTerm->eOperator & WO_IN ){ + if( SMASKBIT32(j) & pLoop->u.vtab.mHandleIn ){ + int iTab = pParse->nTab++; + int iCache = ++pParse->nMem; + sqlite3CodeRhsOfIN(pParse, pTerm->pExpr, iTab); + sqlite3VdbeAddOp3(v, OP_VInitIn, iTab, iTarget, iCache); + }else{ + codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); + addrNotFound = pLevel->addrNxt; + } + }else{ + Expr *pRight = pTerm->pExpr->pRight; + codeExprOrVector(pParse, pRight, iTarget, 1); + if( pTerm->eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET + && pLoop->u.vtab.bOmitOffset + ){ + assert( pTerm->eOperator==WO_AUX ); + assert( pWInfo->pLimit!=0 ); + assert( pWInfo->pLimit->iOffset>0 ); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWInfo->pLimit->iOffset); + VdbeComment((v,"Zero OFFSET counter")); + } + } + } + sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); + sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); + sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, + pLoop->u.vtab.idxStr, + pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC); + VdbeCoverage(v); + pLoop->u.vtab.needFree = 0; + /* An OOM inside of AddOp4(OP_VFilter) instruction above might have freed + ** the u.vtab.idxStr. NULL it out to prevent a use-after-free */ + if( db->mallocFailed ) pLoop->u.vtab.idxStr = 0; + pLevel->p1 = iCur; + pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + + for(j=0; jaLTerm[j]; + if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ + disableTerm(pLevel, pTerm); + continue; + } + if( (pTerm->eOperator & WO_IN)!=0 + && (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0 + && !db->mallocFailed + ){ + Expr *pCompare; /* The comparison operator */ + Expr *pRight; /* RHS of the comparison */ + VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ + int iIn; /* IN loop corresponding to the j-th constraint */ + + /* Reload the constraint value into reg[iReg+j+2]. The same value + ** was loaded into the same register prior to the OP_VFilter, but + ** the xFilter implementation might have changed the datatype or + ** encoding of the value in the register, so it *must* be reloaded. + */ + for(iIn=0; ALWAYS(iInu.in.nIn); iIn++){ + pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop); + if( (pOp->opcode==OP_Column && pOp->p3==iReg+j+2) + || (pOp->opcode==OP_Rowid && pOp->p2==iReg+j+2) + ){ + testcase( pOp->opcode==OP_Rowid ); + sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); + break; + } + } + + /* Generate code that will continue to the next row if + ** the IN constraint is not satisfied + */ + pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); + if( !db->mallocFailed ){ + int iFld = pTerm->u.x.iField; + Expr *pLeft = pTerm->pExpr->pLeft; + assert( pLeft!=0 ); + if( iFld>0 ){ + assert( pLeft->op==TK_VECTOR ); + assert( ExprUseXList(pLeft) ); + assert( iFld<=pLeft->x.pList->nExpr ); + pCompare->pLeft = pLeft->x.pList->a[iFld-1].pExpr; + }else{ + pCompare->pLeft = pLeft; + } + pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); + if( pRight ){ + pRight->iTable = iReg+j+2; + sqlite3ExprIfFalse( + pParse, pCompare, pLevel->addrCont, SQLITE_JUMPIFNULL + ); + } + pCompare->pLeft = 0; + } + sqlite3ExprDelete(db, pCompare); + } + } + + /* These registers need to be preserved in case there is an IN operator + ** loop. So we could deallocate the registers here (and potentially + ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems + ** simpler and safer to simply not reuse the registers. + ** + ** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); + */ + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 + ){ + /* Case 2: We can directly reference a single row using an + ** equality comparison against the ROWID field. Or + ** we reference multiple rows using a "rowid IN (...)" + ** construct. + */ + assert( pLoop->u.btree.nEq==1 ); + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + iReleaseReg = ++pParse->nMem; + iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); + if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); + addrNxt = pLevel->addrNxt; + if( pLevel->regFilter ){ + sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, + iRowidReg, 1); + VdbeCoverage(v); + filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady); + } + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); + VdbeCoverage(v); + pLevel->op = OP_Noop; + }else if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 + ){ + /* Case 3: We have an inequality comparison against the ROWID field. + */ + int testOp = OP_Noop; + int start; + int memEndValue = 0; + WhereTerm *pStart, *pEnd; + + j = 0; + pStart = pEnd = 0; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; + if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; + assert( pStart!=0 || pEnd!=0 ); + if( bRev ){ + pTerm = pStart; + pStart = pEnd; + pEnd = pTerm; + } + codeCursorHint(pTabItem, pWInfo, pLevel, pEnd); + if( pStart ){ + Expr *pX; /* The expression that defines the start bound */ + int r1, rTemp; /* Registers for holding the start boundary */ + int op; /* Cursor seek operation */ + + /* The following constant maps TK_xx codes into corresponding + ** seek opcodes. It depends on a particular ordering of TK_xx + */ + const u8 aMoveOp[] = { + /* TK_GT */ OP_SeekGT, + /* TK_LE */ OP_SeekLE, + /* TK_LT */ OP_SeekLT, + /* TK_GE */ OP_SeekGE + }; + assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ + assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ + assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ + + assert( (pStart->wtFlags & TERM_VNULL)==0 ); + testcase( pStart->wtFlags & TERM_VIRTUAL ); + pX = pStart->pExpr; + assert( pX!=0 ); + testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ + if( sqlite3ExprIsVector(pX->pRight) ){ + r1 = rTemp = sqlite3GetTempReg(pParse); + codeExprOrVector(pParse, pX->pRight, r1, 1); + testcase( pX->op==TK_GT ); + testcase( pX->op==TK_GE ); + testcase( pX->op==TK_LT ); + testcase( pX->op==TK_LE ); + op = aMoveOp[((pX->op - TK_GT - 1) & 0x3) | 0x1]; + assert( pX->op!=TK_GT || op==OP_SeekGE ); + assert( pX->op!=TK_GE || op==OP_SeekGE ); + assert( pX->op!=TK_LT || op==OP_SeekLE ); + assert( pX->op!=TK_LE || op==OP_SeekLE ); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); + disableTerm(pLevel, pStart); + op = aMoveOp[(pX->op - TK_GT)]; + } + sqlite3VdbeAddOp3(v, op, iCur, addrBrk, r1); + VdbeComment((v, "pk")); + VdbeCoverageIf(v, pX->op==TK_GT); + VdbeCoverageIf(v, pX->op==TK_LE); + VdbeCoverageIf(v, pX->op==TK_LT); + VdbeCoverageIf(v, pX->op==TK_GE); + sqlite3ReleaseTempReg(pParse, rTemp); + }else{ + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrHalt); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + } + if( pEnd ){ + Expr *pX; + pX = pEnd->pExpr; + assert( pX!=0 ); + assert( (pEnd->wtFlags & TERM_VNULL)==0 ); + testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ + testcase( pEnd->wtFlags & TERM_VIRTUAL ); + memEndValue = ++pParse->nMem; + codeExprOrVector(pParse, pX->pRight, memEndValue, 1); + if( 0==sqlite3ExprIsVector(pX->pRight) + && (pX->op==TK_LT || pX->op==TK_GT) + ){ + testOp = bRev ? OP_Le : OP_Ge; + }else{ + testOp = bRev ? OP_Lt : OP_Gt; + } + if( 0==sqlite3ExprIsVector(pX->pRight) ){ + disableTerm(pLevel, pEnd); + } + } + start = sqlite3VdbeCurrentAddr(v); + pLevel->op = bRev ? OP_Prev : OP_Next; + pLevel->p1 = iCur; + pLevel->p2 = start; + assert( pLevel->p5==0 ); + if( testOp!=OP_Noop ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); + sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); + VdbeCoverageIf(v, testOp==OP_Le); + VdbeCoverageIf(v, testOp==OP_Lt); + VdbeCoverageIf(v, testOp==OP_Ge); + VdbeCoverageIf(v, testOp==OP_Gt); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); + } + }else if( pLoop->wsFlags & WHERE_INDEXED ){ + /* Case 4: A scan using an index. + ** + ** The WHERE clause may contain zero or more equality + ** terms ("==" or "IN" operators) that refer to the N + ** left-most columns of the index. It may also contain + ** inequality constraints (>, <, >= or <=) on the indexed + ** column that immediately follows the N equalities. Only + ** the right-most column can be an inequality - the rest must + ** use the "==" and "IN" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all + ** optimized: + ** + ** x=5 + ** x=5 AND y=10 + ** x=5 AND y<10 + ** x=5 AND y>5 AND y<10 + ** x=5 AND y=5 AND z<=10 + ** + ** The z<10 term of the following cannot be used, only + ** the x=5 term: + ** + ** x=5 AND z<10 + ** + ** N may be zero if there are inequality constraints. + ** If there are no inequality constraints, then N is at + ** least one. + ** + ** This case is also used when there are no WHERE clause + ** constraints but an index is selected anyway, in order + ** to force the output order to conform to an ORDER BY. + */ + static const u8 aStartOp[] = { + 0, + 0, + OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ + OP_Last, /* 3: (!start_constraints && startEq && bRev) */ + OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ + OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ + OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ + OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ + }; + static const u8 aEndOp[] = { + OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ + OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ + OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ + OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ + }; + u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ + u16 nBtm = pLoop->u.btree.nBtm; /* Length of BTM vector */ + u16 nTop = pLoop->u.btree.nTop; /* Length of TOP vector */ + int regBase; /* Base register holding constraint values */ + WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ + WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ + int startEq; /* True if range start uses ==, >= or <= */ + int endEq; /* True if range end uses ==, >= or <= */ + int start_constraints; /* Start of range is constrained */ + int nConstraint; /* Number of constraint terms */ + int iIdxCur; /* The VDBE cursor for the index */ + int nExtraReg = 0; /* Number of extra registers needed */ + int op; /* Instruction opcode */ + char *zStartAff; /* Affinity for start of range constraint */ + char *zEndAff = 0; /* Affinity for end of range constraint */ + u8 bSeekPastNull = 0; /* True to seek past initial nulls */ + u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + int omitTable; /* True if we use the index only */ + int regBignull = 0; /* big-null flag register */ + int addrSeekScan = 0; /* Opcode of the OP_SeekScan, if any */ + + pIdx = pLoop->u.btree.pIndex; + iIdxCur = pLevel->iIdxCur; + assert( nEq>=pLoop->nSkip ); + + /* Find any inequality constraint terms for the start and end + ** of the range. + */ + j = nEq; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ + pRangeStart = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nBtm); + /* Like optimization range constraints always occur in pairs */ + assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || + (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); + } + if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ + pRangeEnd = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nTop); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){ + assert( pRangeStart!=0 ); /* LIKE opt constraints */ + assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */ + pLevel->iLikeRepCntr = (u32)++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, (int)pLevel->iLikeRepCntr); + VdbeComment((v, "LIKE loop counter")); + pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v); + /* iLikeRepCntr actually stores 2x the counter register number. The + ** bottom bit indicates whether the search order is ASC or DESC. */ + testcase( bRev ); + testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC ); + assert( (bRev & ~1)==0 ); + pLevel->iLikeRepCntr <<=1; + pLevel->iLikeRepCntr |= bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC); + } +#endif + if( pRangeStart==0 ){ + j = pIdx->aiColumn[nEq]; + if( (j>=0 && pIdx->pTable->aCol[j].notNull==0) || j==XN_EXPR ){ + bSeekPastNull = 1; + } + } + } + assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + + /* If the WHERE_BIGNULL_SORT flag is set, then index column nEq uses + ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS + ** FIRST). In both cases separate ordered scans are made of those + ** index entries for which the column is null and for those for which + ** it is not. For an ASC sort, the non-NULL entries are scanned first. + ** For DESC, NULL entries are scanned first. + */ + if( (pLoop->wsFlags & (WHERE_TOP_LIMIT|WHERE_BTM_LIMIT))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)!=0 + ){ + assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); + assert( pRangeEnd==0 && pRangeStart==0 ); + testcase( pLoop->nSkip>0 ); + nExtraReg = 1; + bSeekPastNull = 1; + pLevel->regBignull = regBignull = ++pParse->nMem; + if( pLevel->iLeftJoin ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, regBignull); + } + pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); + } + + /* If we are doing a reverse order scan on an ascending index, or + ** a forward order scan on a descending index, interchange the + ** start and end terms (pRangeStart and pRangeEnd). + */ + if( (nEqnColumn && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) ){ + SWAP(WhereTerm *, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); + SWAP(u8, nBtm, nTop); + } + + if( iLevel>0 && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)!=0 ){ + /* In case OP_SeekScan is used, ensure that the index cursor does not + ** point to a valid row for the first iteration of this loop. */ + sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur); + } + + /* Generate code to evaluate all constraint terms using == or IN + ** and store the values of those terms in an array of registers + ** starting at regBase. + */ + codeCursorHint(pTabItem, pWInfo, pLevel, pRangeEnd); + regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); + assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); + if( zStartAff && nTop ){ + zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); + } + addrNxt = (regBignull ? pLevel->addrBignull : pLevel->addrNxt); + + testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); + testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); + startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); + endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); + start_constraints = pRangeStart || nEq>0; + + /* Seek the index cursor to the start of the range. */ + nConstraint = nEq; + if( pRangeStart ){ + Expr *pRight = pRangeStart->pExpr->pRight; + codeExprOrVector(pParse, pRight, regBase+nEq, nBtm); + whereLikeOptimizationStringFixup(v, pLevel, pRangeStart); + if( (pRangeStart->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zStartAff ){ + updateRangeAffinityStr(pRight, nBtm, &zStartAff[nEq]); + } + nConstraint += nBtm; + testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeStart); + }else{ + startEq = 1; + } + bSeekPastNull = 0; + }else if( bSeekPastNull ){ + startEq = 0; + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + start_constraints = 1; + nConstraint++; + }else if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + start_constraints = 1; + nConstraint++; + } + codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); + if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ + /* The skip-scan logic inside the call to codeAllEqualityConstraints() + ** above has already left the cursor sitting on the correct row, + ** so no further seeking is needed */ + }else{ + if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); + VdbeComment((v, "NULL-scan pass ctr")); + } + if( pLevel->regFilter ){ + sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, + regBase, nEq); + VdbeCoverage(v); + filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady); + } + + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; + assert( op!=0 ); + if( (pLoop->wsFlags & WHERE_IN_SEEKSCAN)!=0 && op==OP_SeekGE ){ + assert( regBignull==0 ); + /* TUNING: The OP_SeekScan opcode seeks to reduce the number + ** of expensive seek operations by replacing a single seek with + ** 1 or more step operations. The question is, how many steps + ** should we try before giving up and going with a seek. The cost + ** of a seek is proportional to the logarithm of the of the number + ** of entries in the tree, so basing the number of steps to try + ** on the estimated number of rows in the btree seems like a good + ** guess. */ + addrSeekScan = sqlite3VdbeAddOp1(v, OP_SeekScan, + (pIdx->aiRowLogEst[0]+9)/10); + VdbeCoverage(v); + } + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + + assert( bSeekPastNull==0 || bStopAtNull==0 ); + if( regBignull ){ + assert( bSeekPastNull==1 || bStopAtNull==1 ); + assert( bSeekPastNull==!bStopAtNull ); + assert( bStopAtNull==startEq ); + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint-startEq); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + assert( op==OP_Rewind || op==OP_Last || op==OP_SeekGE || op==OP_SeekLE); + } + } + + /* Load the value for the inequality constraint at the end of the + ** range (if any). + */ + nConstraint = nEq; + assert( pLevel->p2==0 ); + if( pRangeEnd ){ + Expr *pRight = pRangeEnd->pExpr->pRight; + if( addrSeekScan ){ + /* For a seek-scan that has a range on the lowest term of the index, + ** we have to make the top of the loop be code that sets the end + ** condition of the range. Otherwise, the OP_SeekScan might jump + ** over that initialization, leaving the range-end value set to the + ** range-start value, resulting in a wrong answer. + ** See ticket 5981a8c041a3c2f3 (2021-11-02). + */ + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + } + codeExprOrVector(pParse, pRight, regBase+nEq, nTop); + whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); + if( (pRangeEnd->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zEndAff ){ + updateRangeAffinityStr(pRight, nTop, zEndAff); + codeApplyAffinity(pParse, regBase+nEq, nTop, zEndAff); + }else{ + assert( pParse->db->mallocFailed ); + } + nConstraint += nTop; + testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); + + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeEnd); + }else{ + endEq = 1; + } + }else if( bStopAtNull ){ + if( regBignull==0 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + } + nConstraint++; + } + sqlite3DbFree(db, zStartAff); + sqlite3DbFree(db, zEndAff); + + /* Top of the loop body */ + if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(v); + + /* Check if the index cursor is past the end of the range. */ + if( nConstraint ){ + if( regBignull ){ + /* Except, skip the end-of-range check while doing the NULL-scan */ + sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); + VdbeComment((v, "If NULL-scan 2nd pass")); + VdbeCoverage(v); + } + op = aEndOp[bRev*2 + endEq]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + if( addrSeekScan ) sqlite3VdbeJumpHere(v, addrSeekScan); + } + if( regBignull ){ + /* During a NULL-scan, check to see if we have reached the end of + ** the NULLs */ + assert( bSeekPastNull==!bStopAtNull ); + assert( bSeekPastNull+bStopAtNull==1 ); + assert( nConstraint+bSeekPastNull>0 ); + sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); + VdbeComment((v, "If NULL-scan 1st pass")); + VdbeCoverage(v); + op = aEndOp[bRev*2 + bSeekPastNull]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint+bSeekPastNull); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } + + if( (pLoop->wsFlags & WHERE_IN_EARLYOUT)!=0 ){ + sqlite3VdbeAddOp3(v, OP_SeekHit, iIdxCur, nEq, nEq); + } + + /* Seek the table cursor, if required */ + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0; + if( omitTable ){ + /* pIdx is a covering index. No need to access the main table. */ + }else if( HasRowid(pIdx->pTable) ){ + codeDeferredSeek(pWInfo, pIdx, iCur, iIdxCur); + }else if( iCur!=iIdxCur ){ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); + } + sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, + iRowidReg, pPk->nKeyCol); VdbeCoverage(v); + } + + if( pLevel->iLeftJoin==0 ){ + /* If pIdx is an index on one or more expressions, then look through + ** all the expressions in pWInfo and try to transform matching expressions + ** into reference to index columns. Also attempt to translate references + ** to virtual columns in the table into references to (stored) columns + ** of the index. + ** + ** Do not do this for the RHS of a LEFT JOIN. This is because the + ** expression may be evaluated after OP_NullRow has been executed on + ** the cursor. In this case it is important to do the full evaluation, + ** as the result of the expression may not be NULL, even if all table + ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f + */ + if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ){ + whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + } + + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index. + ** + ** 2019-11-02 ticket 623eff57e76d45f6: This optimization does not work + ** for a LEFT JOIN. + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + }else{ + testcase( pIdx->pPartIdxWhere ); + /* The following assert() is not a requirement, merely an observation: + ** The OR-optimization doesn't work for the right hand table of + ** a LEFT JOIN: */ + assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ); + } + + /* Record the instruction used to terminate the loop. */ + if( pLoop->wsFlags & WHERE_ONEROW ){ + pLevel->op = OP_Noop; + }else if( bRev ){ + pLevel->op = OP_Prev; + }else{ + pLevel->op = OP_Next; + } + pLevel->p1 = iIdxCur; + pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; + if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + }else{ + assert( pLevel->p5==0 ); + } + if( omitTable ) pIdx = 0; + }else + +#ifndef SQLITE_OMIT_OR_OPTIMIZATION + if( pLoop->wsFlags & WHERE_MULTI_OR ){ + /* Case 5: Two or more separately indexed terms connected by OR + ** + ** Example: + ** + ** CREATE TABLE t1(a,b,c,d); + ** CREATE INDEX i1 ON t1(a); + ** CREATE INDEX i2 ON t1(b); + ** CREATE INDEX i3 ON t1(c); + ** + ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) + ** + ** In the example, there are three indexed terms connected by OR. + ** The top of the loop looks like this: + ** + ** Null 1 # Zero the rowset in reg 1 + ** + ** Then, for each indexed term, the following. The arguments to + ** RowSetTest are such that the rowid of the current row is inserted + ** into the RowSet. If it is already present, control skips the + ** Gosub opcode and jumps straight to the code generated by WhereEnd(). + ** + ** sqlite3WhereBegin() + ** RowSetTest # Insert rowid into rowset + ** Gosub 2 A + ** sqlite3WhereEnd() + ** + ** Following the above, code to terminate the loop. Label A, the target + ** of the Gosub above, jumps to the instruction right after the Goto. + ** + ** Null 1 # Zero the rowset in reg 1 + ** Goto B # The loop is finished. + ** + ** A: # Return data, whatever. + ** + ** Return 2 # Jump back to the Gosub + ** + ** B: + ** + ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then + ** use an ephemeral index instead of a RowSet to record the primary + ** keys of the rows we have already seen. + ** + */ + WhereClause *pOrWc; /* The OR-clause broken out into subterms */ + SrcList *pOrTab; /* Shortened table list or OR-clause generation */ + Index *pCov = 0; /* Potential covering index (or NULL) */ + int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ + + int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ + int regRowset = 0; /* Register for RowSet object */ + int regRowid = 0; /* Register holding rowid */ + int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */ + int iRetInit; /* Address of regReturn init */ + int untestedTerms = 0; /* Some terms not completely tested */ + int ii; /* Loop counter */ + Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ + Table *pTab = pTabItem->pTab; + + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->eOperator & WO_OR ); + assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); + pOrWc = &pTerm->u.pOrInfo->wc; + pLevel->op = OP_Return; + pLevel->p1 = regReturn; + + /* Set up a new SrcList in pOrTab containing the table being scanned + ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. + ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). + */ + if( pWInfo->nLevel>1 ){ + int nNotReady; /* The number of notReady tables */ + SrcItem *origSrc; /* Original list of tables */ + nNotReady = pWInfo->nLevel - iLevel - 1; + pOrTab = sqlite3StackAllocRaw(db, + sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); + if( pOrTab==0 ) return notReady; + pOrTab->nAlloc = (u8)(nNotReady + 1); + pOrTab->nSrc = pOrTab->nAlloc; + memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); + origSrc = pWInfo->pTabList->a; + for(k=1; k<=nNotReady; k++){ + memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); + } + }else{ + pOrTab = pWInfo->pTabList; + } + + /* Initialize the rowset register to contain NULL. An SQL NULL is + ** equivalent to an empty rowset. Or, create an ephemeral index + ** capable of holding primary keys in the case of a WITHOUT ROWID. + ** + ** Also initialize regReturn to contain the address of the instruction + ** immediately following the OP_Return at the bottom of the loop. This + ** is required in a few obscure LEFT JOIN cases where control jumps + ** over the top of the loop into the body of it. In this case the + ** correct response for the end-of-loop code (the OP_Return) is to + ** fall through to the next instruction, just as an OP_Next does if + ** called on an uninitialized cursor. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + if( HasRowid(pTab) ){ + regRowset = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + regRowset = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + regRowid = ++pParse->nMem; + } + iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); + + /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y + ** Then for every term xN, evaluate as the subexpression: xN AND y + ** That way, terms in y that are factored into the disjunction will + ** be picked up by the recursive calls to sqlite3WhereBegin() below. + ** + ** Actually, each subexpression is converted to "xN AND w" where w is + ** the "interesting" terms of z - terms that did not originate in the + ** ON or USING clause of a LEFT JOIN, and terms that are usable as + ** indices. + ** + ** This optimization also only applies if the (x1 OR x2 OR ...) term + ** is not contained in the ON clause of a LEFT JOIN. + ** See ticket http://www.sqlite.org/src/info/f2369304e4 + ** + ** 2022-02-04: Do not push down slices of a row-value comparison. + ** In other words, "w" or "y" may not be a slice of a vector. Otherwise, + ** the initialization of the right-hand operand of the vector comparison + ** might not occur, or might occur only in an OR branch that is not + ** taken. dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1. + ** + ** 2022-03-03: Do not push down expressions that involve subqueries. + ** The subquery might get coded as a subroutine. Any table-references + ** in the subquery might be resolved to index-references for the index on + ** the OR branch in which the subroutine is coded. But if the subroutine + ** is invoked from a different OR branch that uses a different index, such + ** index-references will not work. tag-20220303a + ** https://sqlite.org/forum/forumpost/36937b197273d403 + */ + if( pWC->nTerm>1 ){ + int iTerm; + for(iTerm=0; iTermnTerm; iTerm++){ + Expr *pExpr = pWC->a[iTerm].pExpr; + if( &pWC->a[iTerm] == pTerm ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL ); + testcase( pWC->a[iTerm].wtFlags & TERM_CODED ); + testcase( pWC->a[iTerm].wtFlags & TERM_SLICE ); + if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED|TERM_SLICE))!=0 ){ + continue; + } + if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; + if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20220303a */ + pExpr = sqlite3ExprDup(db, pExpr, 0); + pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr); + } + if( pAndExpr ){ + /* The extra 0x10000 bit on the opcode is masked off and does not + ** become part of the new Expr.op. However, it does make the + ** op==TK_AND comparison inside of sqlite3PExpr() false, and this + ** prevents sqlite3PExpr() from applying the AND short-circuit + ** optimization, which we do not want here. */ + pAndExpr = sqlite3PExpr(pParse, TK_AND|0x10000, 0, pAndExpr); + } + } + + /* Run a separate WHERE clause for each term of the OR clause. After + ** eliminating duplicates from other WHERE clauses, the action for each + ** sub-WHERE clause is to to invoke the main loop body as a subroutine. + */ + ExplainQueryPlan((pParse, 1, "MULTI-INDEX OR")); + for(ii=0; iinTerm; ii++){ + WhereTerm *pOrTerm = &pOrWc->a[ii]; + if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ + WhereInfo *pSubWInfo; /* Info for single OR-term scan */ + Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ + Expr *pDelete; /* Local copy of OR clause term */ + int jmp1 = 0; /* Address of jump operation */ + testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pOrExpr, EP_OuterON) + ); /* See TH3 vtab25.400 and ticket 614b25314c766238 */ + pDelete = pOrExpr = sqlite3ExprDup(db, pOrExpr, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDelete); + continue; + } + if( pAndExpr ){ + pAndExpr->pLeft = pOrExpr; + pOrExpr = pAndExpr; + } + /* Loop through table entries that match term pOrTerm. */ + ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); + WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, 0, + WHERE_OR_SUBCLAUSE, iCovCur); + assert( pSubWInfo || pParse->nErr ); + if( pSubWInfo ){ + WhereLoop *pSubLoop; + int addrExplain = sqlite3WhereExplainOneScan( + pParse, pOrTab, &pSubWInfo->a[0], 0 + ); + sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); + + /* This is the sub-WHERE clause body. First skip over + ** duplicate rows from prior sub-WHERE clauses, and record the + ** rowid (or PRIMARY KEY) for the current row so that the same + ** row will be skipped in subsequent sub-WHERE clauses. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); + if( HasRowid(pTab) ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, regRowid); + jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, + regRowid, iSet); + VdbeCoverage(v); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk; + int r; + + /* Read the PK into an array of temp registers. */ + r = sqlite3GetTempRange(pParse, nPk); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); + } + + /* Check if the temp table already contains this key. If so, + ** the row has already been included in the result set and + ** can be ignored (by jumping past the Gosub below). Otherwise, + ** insert the key into the temp table and proceed with processing + ** the row. + ** + ** Use some of the same optimizations as OP_RowSetTest: If iSet + ** is zero, assume that the key cannot already be present in + ** the temp table. And if iSet is -1, assume that there is no + ** need to insert the key into the temp table, as it will never + ** be tested for. */ + if( iSet ){ + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); + VdbeCoverage(v); + } + if( iSet>=0 ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, regRowset, regRowid, + r, nPk); + if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + + /* Release the array of temp registers */ + sqlite3ReleaseTempRange(pParse, r, nPk); + } + } + + /* Invoke the main loop body as a subroutine */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + + /* Jump here (skipping the main loop body subroutine) if the + ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ + if( jmp1 ) sqlite3VdbeJumpHere(v, jmp1); + + /* The pSubWInfo->untestedTerms flag means that this OR term + ** contained one or more AND term from a notReady table. The + ** terms from the notReady table could not be tested and will + ** need to be tested later. + */ + if( pSubWInfo->untestedTerms ) untestedTerms = 1; + + /* If all of the OR-connected terms are optimized using the same + ** index, and the index is opened using the same cursor number + ** by each call to sqlite3WhereBegin() made by this loop, it may + ** be possible to use that index as a covering index. + ** + ** If the call to sqlite3WhereBegin() above resulted in a scan that + ** uses an index, and this is either the first OR-connected term + ** processed or the index is the same as that used by all previous + ** terms, set pCov to the candidate covering index. Otherwise, set + ** pCov to NULL to indicate that no candidate covering index will + ** be available. + */ + pSubLoop = pSubWInfo->a[0].pWLoop; + assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 + && (ii==0 || pSubLoop->u.btree.pIndex==pCov) + && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) + ){ + assert( pSubWInfo->a[0].iIdxCur==iCovCur ); + pCov = pSubLoop->u.btree.pIndex; + }else{ + pCov = 0; + } + if( sqlite3WhereUsesDeferredSeek(pSubWInfo) ){ + pWInfo->bDeferredSeek = 1; + } + + /* Finish the loop through table entries that match term pOrTerm. */ + sqlite3WhereEnd(pSubWInfo); + ExplainQueryPlanPop(pParse); + } + sqlite3ExprDelete(db, pDelete); + } + } + ExplainQueryPlanPop(pParse); + assert( pLevel->pWLoop==pLoop ); + assert( (pLoop->wsFlags & WHERE_MULTI_OR)!=0 ); + assert( (pLoop->wsFlags & WHERE_IN_ABLE)==0 ); + pLevel->u.pCoveringIdx = pCov; + if( pCov ) pLevel->iIdxCur = iCovCur; + if( pAndExpr ){ + pAndExpr->pLeft = 0; + sqlite3ExprDelete(db, pAndExpr); + } + sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeGoto(v, pLevel->addrBrk); + sqlite3VdbeResolveLabel(v, iLoopBody); + + /* Set the P2 operand of the OP_Return opcode that will end the current + ** loop to point to this spot, which is the top of the next containing + ** loop. The byte-code formatter will use that P2 value as a hint to + ** indent everything in between the this point and the final OP_Return. + ** See tag-20220407a in vdbe.c and shell.c */ + assert( pLevel->op==OP_Return ); + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + + if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); } + if( !untestedTerms ) disableTerm(pLevel, pTerm); + }else +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + + { + /* Case 6: There is no usable index. We must do a complete + ** scan of the entire table. + */ + static const u8 aStep[] = { OP_Next, OP_Prev }; + static const u8 aStart[] = { OP_Rewind, OP_Last }; + assert( bRev==0 || bRev==1 ); + if( pTabItem->fg.isRecursive ){ + /* Tables marked isRecursive have only a single row that is stored in + ** a pseudo-cursor. No need to Rewind or Next such cursors. */ + pLevel->op = OP_Noop; + }else{ + codeCursorHint(pTabItem, pWInfo, pLevel, 0); + pLevel->op = aStep[bRev]; + pLevel->p1 = iCur; + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrHalt); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + } + } + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); +#endif + + /* Insert code to test every subexpression that can be completely + ** computed using the current set of tables. + ** + ** This loop may run between one and three times, depending on the + ** constraints to be generated. The value of stack variable iLoop + ** determines the constraints coded by each iteration, as follows: + ** + ** iLoop==1: Code only expressions that are entirely covered by pIdx. + ** iLoop==2: Code remaining expressions that do not contain correlated + ** sub-queries. + ** iLoop==3: Code all remaining expressions. + ** + ** An effort is made to skip unnecessary iterations of the loop. + */ + iLoop = (pIdx ? 1 : 2); + do{ + int iNext = 0; /* Next value for iLoop */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE; + int skipLikeAddr = 0; + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + testcase( pWInfo->untestedTerms==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ); + pWInfo->untestedTerms = 1; + continue; + } + pE = pTerm->pExpr; + assert( pE!=0 ); + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ){ + if( !ExprHasProperty(pE,EP_OuterON|EP_InnerON) ){ + /* Defer processing WHERE clause constraints until after outer + ** join processing. tag-20220513a */ + continue; + }else if( (pTabItem->fg.jointype & JT_LEFT)==JT_LEFT + && !ExprHasProperty(pE,EP_OuterON) ){ + continue; + }else{ + Bitmask m = sqlite3WhereGetMask(&pWInfo->sMaskSet, pE->w.iJoin); + if( m & pLevel->notReady ){ + /* An ON clause that is not ripe */ + continue; + } + } + } + if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ + iNext = 2; + continue; + } + if( iLoop<3 && (pTerm->wtFlags & TERM_VARSELECT) ){ + if( iNext==0 ) iNext = 3; + continue; + } + + if( (pTerm->wtFlags & TERM_LIKECOND)!=0 ){ + /* If the TERM_LIKECOND flag is set, that means that the range search + ** is sufficient to guarantee that the LIKE operator is true, so we + ** can skip the call to the like(A,B) function. But this only works + ** for strings. So do not skip the call to the function on the pass + ** that compares BLOBs. */ +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + continue; +#else + u32 x = pLevel->iLikeRepCntr; + if( x>0 ){ + skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1)); + VdbeCoverageIf(v, (x&1)==1); + VdbeCoverageIf(v, (x&1)==0); + } +#endif + } +#ifdef WHERETRACE_ENABLED /* 0xffff */ + if( sqlite3WhereTrace ){ + VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", + pWC->nTerm-j, pTerm, iLoop)); + } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding auxiliary constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } +#endif + sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); + if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); + pTerm->wtFlags |= TERM_CODED; + } + iLoop = iNext; + }while( iLoop>0 ); + + /* Insert code to test for implied constraints based on transitivity + ** of the "==" operator. + ** + ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" + ** and we are coding the t1 loop and the t2 loop has not yet coded, + ** then we cannot use the "t1.a=t2.b" constraint, but we can code + ** the implied "t1.a=123" constraint. + */ + for(pTerm=pWC->a, j=pWC->nBase; j>0; j--, pTerm++){ + Expr *pE, sEAlt; + WhereTerm *pAlt; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; + if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; + if( pTerm->leftCursor!=iCur ) continue; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ) continue; + pE = pTerm->pExpr; +#ifdef WHERETRACE_ENABLED /* 0x800 */ + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("Coding transitive constraint:\n"); + sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + } +#endif + assert( !ExprHasProperty(pE, EP_OuterON) ); + assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.x.leftColumn, notReady, + WO_EQ|WO_IN|WO_IS, 0); + if( pAlt==0 ) continue; + if( pAlt->wtFlags & (TERM_CODED) ) continue; + if( (pAlt->eOperator & WO_IN) + && ExprUseXSelect(pAlt->pExpr) + && (pAlt->pExpr->x.pSelect->pEList->nExpr>1) + ){ + continue; + } + testcase( pAlt->eOperator & WO_EQ ); + testcase( pAlt->eOperator & WO_IS ); + testcase( pAlt->eOperator & WO_IN ); + VdbeModuleComment((v, "begin transitive constraint")); + sEAlt = *pAlt->pExpr; + sEAlt.pLeft = pE->pLeft; + sqlite3ExprIfFalse(pParse, &sEAlt, addrCont, SQLITE_JUMPIFNULL); + pAlt->wtFlags |= TERM_CODED; + } + + /* For a RIGHT OUTER JOIN, record the fact that the current row has + ** been matched at least once. + */ + if( pLevel->pRJ ){ + Table *pTab; + int nPk; + int r; + int jmp1 = 0; + WhereRightJoin *pRJ = pLevel->pRJ; + + /* pTab is the right-hand table of the RIGHT JOIN. Generate code that + ** will record that the current row of that table has been matched at + ** least once. This is accomplished by storing the PK for the row in + ** both the iMatch index and the regBloom Bloom filter. + */ + pTab = pWInfo->pTabList->a[pLevel->iFrom].pTab; + if( HasRowid(pTab) ){ + r = sqlite3GetTempRange(pParse, 2); + sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r+1); + nPk = 1; + }else{ + int iPk; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + nPk = pPk->nKeyCol; + r = sqlite3GetTempRange(pParse, nPk+1); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+1+iPk); + } + } + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, 0, r+1, nPk); + VdbeCoverage(v); + VdbeComment((v, "match against %s", pTab->zName)); + sqlite3VdbeAddOp3(v, OP_MakeRecord, r+1, nPk, r); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pRJ->iMatch, r, r+1, nPk); + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pRJ->regBloom, 0, r+1, nPk); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3VdbeJumpHere(v, jmp1); + sqlite3ReleaseTempRange(pParse, r, nPk+1); + } + + /* For a LEFT OUTER JOIN, generate code that will record the fact that + ** at least one row of the right table has matched the left table. + */ + if( pLevel->iLeftJoin ){ + pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); + VdbeComment((v, "record LEFT JOIN hit")); + if( pLevel->pRJ==0 ){ + goto code_outer_join_constraints; /* WHERE clause constraints */ + } + } + + if( pLevel->pRJ ){ + /* Create a subroutine used to process all interior loops and code + ** of the RIGHT JOIN. During normal operation, the subroutine will + ** be in-line with the rest of the code. But at the end, a separate + ** loop will run that invokes this subroutine for unmatched rows + ** of pTab, with all tables to left begin set to NULL. + */ + WhereRightJoin *pRJ = pLevel->pRJ; + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pRJ->regReturn); + pRJ->addrSubrtn = sqlite3VdbeCurrentAddr(v); + assert( pParse->withinRJSubrtn < 255 ); + pParse->withinRJSubrtn++; + + /* WHERE clause constraints must be deferred until after outer join + ** row elimination has completed, since WHERE clause constraints apply + ** to the results of the OUTER JOIN. The following loop generates the + ** appropriate WHERE clause constraint checks. tag-20220513a. + */ + code_outer_join_constraints: + for(pTerm=pWC->a, j=0; jnBase; j++, pTerm++){ + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + assert( pWInfo->untestedTerms ); + continue; + } + if( pTabItem->fg.jointype & JT_LTORJ ) continue; + assert( pTerm->pExpr ); + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + pTerm->wtFlags |= TERM_CODED; + } + } + +#if WHERETRACE_ENABLED /* 0x20800 */ + if( sqlite3WhereTrace & 0x20000 ){ + sqlite3DebugPrintf("All WHERE-clause terms after coding level %d:\n", + iLevel); + sqlite3WhereClausePrint(pWC); + } + if( sqlite3WhereTrace & 0x800 ){ + sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n", + iLevel, (u64)pLevel->notReady); + } +#endif + return pLevel->notReady; +} + +/* +** Generate the code for the loop that finds all non-matched terms +** for a RIGHT JOIN. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( + WhereInfo *pWInfo, + int iLevel, + WhereLevel *pLevel +){ + Parse *pParse = pWInfo->pParse; + Vdbe *v = pParse->pVdbe; + WhereRightJoin *pRJ = pLevel->pRJ; + Expr *pSubWhere = 0; + WhereClause *pWC = &pWInfo->sWC; + WhereInfo *pSubWInfo; + WhereLoop *pLoop = pLevel->pWLoop; + SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + SrcList sFrom; + Bitmask mAll = 0; + int k; + + ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTabItem->pTab->zName)); + sqlite3VdbeNoJumpsOutsideSubrtn(v, pRJ->addrSubrtn, pRJ->endSubrtn, + pRJ->regReturn); + for(k=0; ka[k].pWLoop->maskSelf; + sqlite3VdbeAddOp1(v, OP_NullRow, pWInfo->a[k].iTabCur); + iIdxCur = pWInfo->a[k].iIdxCur; + if( iIdxCur ){ + sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur); + } + } + if( (pTabItem->fg.jointype & JT_LTORJ)==0 ){ + mAll |= pLoop->maskSelf; + for(k=0; knTerm; k++){ + WhereTerm *pTerm = &pWC->a[k]; + if( (pTerm->wtFlags & (TERM_VIRTUAL|TERM_SLICE))!=0 + && pTerm->eOperator!=WO_ROWVAL + ){ + break; + } + if( pTerm->prereqAll & ~mAll ) continue; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) ) continue; + pSubWhere = sqlite3ExprAnd(pParse, pSubWhere, + sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); + } + } + sFrom.nSrc = 1; + sFrom.nAlloc = 1; + memcpy(&sFrom.a[0], pTabItem, sizeof(SrcItem)); + sFrom.a[0].fg.jointype = 0; + assert( pParse->withinRJSubrtn < 100 ); + pParse->withinRJSubrtn++; + pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0, + WHERE_RIGHT_JOIN, 0); + if( pSubWInfo ){ + int iCur = pLevel->iTabCur; + int r = ++pParse->nMem; + int nPk; + int jmp; + int addrCont = sqlite3WhereContinueLabel(pSubWInfo); + Table *pTab = pTabItem->pTab; + if( HasRowid(pTab) ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, r); + nPk = 1; + }else{ + int iPk; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + nPk = pPk->nKeyCol; + pParse->nMem += nPk - 1; + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); + } + } + jmp = sqlite3VdbeAddOp4Int(v, OP_Filter, pRJ->regBloom, 0, r, nPk); + VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, addrCont, r, nPk); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, jmp); + sqlite3VdbeAddOp2(v, OP_Gosub, pRJ->regReturn, pRJ->addrSubrtn); + sqlite3WhereEnd(pSubWInfo); + } + sqlite3ExprDelete(pParse->db, pSubWhere); + ExplainQueryPlanPop(pParse); + assert( pParse->withinRJSubrtn>0 ); + pParse->withinRJSubrtn--; +} + +/************** End of wherecode.c *******************************************/ +/************** Begin file whereexpr.c ***************************************/ +/* +** 2015-06-08 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was originally part of where.c but was split out to improve +** readability and editabiliity. This file contains utility routines for +** analyzing Expr objects in the WHERE clause. +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* Forward declarations */ +static void exprAnalyze(SrcList*, WhereClause*, int); + +/* +** Deallocate all memory associated with a WhereOrInfo object. +*/ +static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Deallocate all memory associated with a WhereAndInfo object. +*/ +static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Add a single new WhereTerm entry to the WhereClause object pWC. +** The new WhereTerm object is constructed from Expr p and with wtFlags. +** The index in pWC->a[] of the new WhereTerm is returned on success. +** 0 is returned if the new WhereTerm could not be added due to a memory +** allocation error. The memory allocation failure will be recorded in +** the db->mallocFailed flag so that higher-level functions can detect it. +** +** This routine will increase the size of the pWC->a[] array as necessary. +** +** If the wtFlags argument includes TERM_DYNAMIC, then responsibility +** for freeing the expression p is assumed by the WhereClause object pWC. +** This is true even if this routine fails to allocate a new WhereTerm. +** +** WARNING: This routine might reallocate the space used to store +** WhereTerms. All pointers to WhereTerms should be invalidated after +** calling this routine. Such pointers may be reinitialized by referencing +** the pWC->a[] array. +*/ +static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ + WhereTerm *pTerm; + int idx; + testcase( wtFlags & TERM_VIRTUAL ); + if( pWC->nTerm>=pWC->nSlot ){ + WhereTerm *pOld = pWC->a; + sqlite3 *db = pWC->pWInfo->pParse->db; + pWC->a = sqlite3WhereMalloc(pWC->pWInfo, sizeof(pWC->a[0])*pWC->nSlot*2 ); + if( pWC->a==0 ){ + if( wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, p); + } + pWC->a = pOld; + return 0; + } + memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); + pWC->nSlot = pWC->nSlot*2; + } + pTerm = &pWC->a[idx = pWC->nTerm++]; + if( (wtFlags & TERM_VIRTUAL)==0 ) pWC->nBase = pWC->nTerm; + if( p && ExprHasProperty(p, EP_Unlikely) ){ + pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; + }else{ + pTerm->truthProb = 1; + } + pTerm->pExpr = sqlite3ExprSkipCollateAndLikely(p); + pTerm->wtFlags = wtFlags; + pTerm->pWC = pWC; + pTerm->iParent = -1; + memset(&pTerm->eOperator, 0, + sizeof(WhereTerm) - offsetof(WhereTerm,eOperator)); + return idx; +} + +/* +** Return TRUE if the given operator is one of the operators that is +** allowed for an indexable WHERE clause term. The allowed operators are +** "=", "<", ">", "<=", ">=", "IN", "IS", and "IS NULL" +*/ +static int allowedOp(int op){ + assert( TK_GT>TK_EQ && TK_GTTK_EQ && TK_LTTK_EQ && TK_LE=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; +} + +/* +** Commute a comparison operator. Expressions of the form "X op Y" +** are converted into "Y op X". +*/ +static u16 exprCommute(Parse *pParse, Expr *pExpr){ + if( pExpr->pLeft->op==TK_VECTOR + || pExpr->pRight->op==TK_VECTOR + || sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight) != + sqlite3BinaryCompareCollSeq(pParse, pExpr->pRight, pExpr->pLeft) + ){ + pExpr->flags ^= EP_Commuted; + } + SWAP(Expr*,pExpr->pRight,pExpr->pLeft); + if( pExpr->op>=TK_GT ){ + assert( TK_LT==TK_GT+2 ); + assert( TK_GE==TK_LE+2 ); + assert( TK_GT>TK_EQ ); + assert( TK_GTop>=TK_GT && pExpr->op<=TK_GE ); + pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; + } + return 0; +} + +/* +** Translate from TK_xx operator to WO_xx bitmask. +*/ +static u16 operatorMask(int op){ + u16 c; + assert( allowedOp(op) ); + if( op==TK_IN ){ + c = WO_IN; + }else if( op==TK_ISNULL ){ + c = WO_ISNULL; + }else if( op==TK_IS ){ + c = WO_IS; + }else{ + assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); + c = (u16)(WO_EQ<<(op-TK_EQ)); + } + assert( op!=TK_ISNULL || c==WO_ISNULL ); + assert( op!=TK_IN || c==WO_IN ); + assert( op!=TK_EQ || c==WO_EQ ); + assert( op!=TK_LT || c==WO_LT ); + assert( op!=TK_LE || c==WO_LE ); + assert( op!=TK_GT || c==WO_GT ); + assert( op!=TK_GE || c==WO_GE ); + assert( op!=TK_IS || c==WO_IS ); + return c; +} + + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION +/* +** Check to see if the given expression is a LIKE or GLOB operator that +** can be optimized using inequality constraints. Return TRUE if it is +** so and false if not. +** +** In order for the operator to be optimizible, the RHS must be a string +** literal that does not begin with a wildcard. The LHS must be a column +** that may only be NULL, a string, or a BLOB, never a number. (This means +** that virtual tables cannot participate in the LIKE optimization.) The +** collating sequence for the column on the LHS must be appropriate for +** the operator. +*/ +static int isLikeOrGlob( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* Test this expression */ + Expr **ppPrefix, /* Pointer to TK_STRING expression with pattern prefix */ + int *pisComplete, /* True if the only wildcard is % in the last character */ + int *pnoCase /* True if uppercase is equivalent to lowercase */ +){ + const u8 *z = 0; /* String on RHS of LIKE operator */ + Expr *pRight, *pLeft; /* Right and left size of LIKE operator */ + ExprList *pList; /* List of operands to the LIKE operator */ + u8 c; /* One character in z[] */ + int cnt; /* Number of non-wildcard prefix characters */ + u8 wc[4]; /* Wildcard characters */ + sqlite3 *db = pParse->db; /* Database connection */ + sqlite3_value *pVal = 0; + int op; /* Opcode of pRight */ + int rc; /* Result code to return */ + + if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, (char*)wc) ){ + return 0; + } +#ifdef SQLITE_EBCDIC + if( *pnoCase ) return 0; +#endif + assert( ExprUseXList(pExpr) ); + pList = pExpr->x.pList; + pLeft = pList->a[1].pExpr; + + pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); + op = pRight->op; + if( op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ + Vdbe *pReprepare = pParse->pReprepare; + int iCol = pRight->iColumn; + pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_BLOB); + if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ + z = sqlite3_value_text(pVal); + } + sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); + assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); + }else if( op==TK_STRING ){ + assert( !ExprHasProperty(pRight, EP_IntValue) ); + z = (u8*)pRight->u.zToken; + } + if( z ){ + + /* Count the number of prefix characters prior to the first wildcard */ + cnt = 0; + while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ + cnt++; + if( c==wc[3] && z[cnt]!=0 ) cnt++; + } + + /* The optimization is possible only if (1) the pattern does not begin + ** with a wildcard and if (2) the non-wildcard prefix does not end with + ** an (illegal 0xff) character, or (3) the pattern does not consist of + ** a single escape character. The second condition is necessary so + ** that we can increment the prefix key to find an upper bound for the + ** range search. The third is because the caller assumes that the pattern + ** consists of at least one character after all escapes have been + ** removed. */ + if( cnt!=0 && 255!=(u8)z[cnt-1] && (cnt>1 || z[0]!=wc[3]) ){ + Expr *pPrefix; + + /* A "complete" match if the pattern ends with "*" or "%" */ + *pisComplete = c==wc[0] && z[cnt+1]==0; + + /* Get the pattern prefix. Remove all escapes from the prefix. */ + pPrefix = sqlite3Expr(db, TK_STRING, (char*)z); + if( pPrefix ){ + int iFrom, iTo; + char *zNew; + assert( !ExprHasProperty(pPrefix, EP_IntValue) ); + zNew = pPrefix->u.zToken; + zNew[cnt] = 0; + for(iFrom=iTo=0; iFrom0 ); + + /* If the LHS is not an ordinary column with TEXT affinity, then the + ** pattern prefix boundaries (both the start and end boundaries) must + ** not look like a number. Otherwise the pattern might be treated as + ** a number, which will invalidate the LIKE optimization. + ** + ** Getting this right has been a persistent source of bugs in the + ** LIKE optimization. See, for example: + ** 2018-09-10 https://sqlite.org/src/info/c94369cae9b561b1 + ** 2019-05-02 https://sqlite.org/src/info/b043a54c3de54b28 + ** 2019-06-10 https://sqlite.org/src/info/fd76310a5e843e07 + ** 2019-06-14 https://sqlite.org/src/info/ce8717f0885af975 + ** 2019-09-03 https://sqlite.org/src/info/0f0428096f17252a + */ + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || (ALWAYS( ExprUseYTab(pLeft) ) + && pLeft->y.pTab + && IsVirtual(pLeft->y.pTab)) /* Might be numeric */ + ){ + int isNum; + double rDummy; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + if( isNum<=0 ){ + if( iTo==1 && zNew[0]=='-' ){ + isNum = +1; + }else{ + zNew[iTo-1]++; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + zNew[iTo-1]--; + } + } + if( isNum>0 ){ + sqlite3ExprDelete(db, pPrefix); + sqlite3ValueFree(pVal); + return 0; + } + } + } + *ppPrefix = pPrefix; + + /* If the RHS pattern is a bound parameter, make arrangements to + ** reprepare the statement when that parameter is rebound */ + if( op==TK_VARIABLE ){ + Vdbe *v = pParse->pVdbe; + sqlite3VdbeSetVarmask(v, pRight->iColumn); + assert( !ExprHasProperty(pRight, EP_IntValue) ); + if( *pisComplete && pRight->u.zToken[1] ){ + /* If the rhs of the LIKE expression is a variable, and the current + ** value of the variable means there is no need to invoke the LIKE + ** function, then no OP_Variable will be added to the program. + ** This causes problems for the sqlite3_bind_parameter_name() + ** API. To work around them, add a dummy OP_Variable here. + */ + int r1 = sqlite3GetTempReg(pParse); + sqlite3ExprCodeTarget(pParse, pRight, r1); + sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); + sqlite3ReleaseTempReg(pParse, r1); + } + } + }else{ + z = 0; + } + } + + rc = (z!=0); + sqlite3ValueFree(pVal); + return rc; +} +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Check to see if the pExpr expression is a form that needs to be passed +** to the xBestIndex method of virtual tables. Forms of interest include: +** +** Expression Virtual Table Operator +** ----------------------- --------------------------------- +** 1. column MATCH expr SQLITE_INDEX_CONSTRAINT_MATCH +** 2. column GLOB expr SQLITE_INDEX_CONSTRAINT_GLOB +** 3. column LIKE expr SQLITE_INDEX_CONSTRAINT_LIKE +** 4. column REGEXP expr SQLITE_INDEX_CONSTRAINT_REGEXP +** 5. column != expr SQLITE_INDEX_CONSTRAINT_NE +** 6. expr != column SQLITE_INDEX_CONSTRAINT_NE +** 7. column IS NOT expr SQLITE_INDEX_CONSTRAINT_ISNOT +** 8. expr IS NOT column SQLITE_INDEX_CONSTRAINT_ISNOT +** 9. column IS NOT NULL SQLITE_INDEX_CONSTRAINT_ISNOTNULL +** +** In every case, "column" must be a column of a virtual table. If there +** is a match, set *ppLeft to the "column" expression, set *ppRight to the +** "expr" expression (even though in forms (6) and (8) the column is on the +** right and the expression is on the left). Also set *peOp2 to the +** appropriate virtual table operator. The return value is 1 or 2 if there +** is a match. The usual return is 1, but if the RHS is also a column +** of virtual table in forms (5) or (7) then return 2. +** +** If the expression matches none of the patterns above, return 0. +*/ +static int isAuxiliaryVtabOperator( + sqlite3 *db, /* Parsing context */ + Expr *pExpr, /* Test this expression */ + unsigned char *peOp2, /* OUT: 0 for MATCH, or else an op2 value */ + Expr **ppLeft, /* Column expression to left of MATCH/op2 */ + Expr **ppRight /* Expression to left of MATCH/op2 */ +){ + if( pExpr->op==TK_FUNCTION ){ + static const struct Op2 { + const char *zOp; + unsigned char eOp2; + } aOp[] = { + { "match", SQLITE_INDEX_CONSTRAINT_MATCH }, + { "glob", SQLITE_INDEX_CONSTRAINT_GLOB }, + { "like", SQLITE_INDEX_CONSTRAINT_LIKE }, + { "regexp", SQLITE_INDEX_CONSTRAINT_REGEXP } + }; + ExprList *pList; + Expr *pCol; /* Column reference */ + int i; + + assert( ExprUseXList(pExpr) ); + pList = pExpr->x.pList; + if( pList==0 || pList->nExpr!=2 ){ + return 0; + } + + /* Built-in operators MATCH, GLOB, LIKE, and REGEXP attach to a + ** virtual table on their second argument, which is the same as + ** the left-hand side operand in their in-fix form. + ** + ** vtab_column MATCH expression + ** MATCH(expression,vtab_column) + */ + pCol = pList->a[1].pExpr; + assert( pCol->op!=TK_COLUMN || ExprUseYTab(pCol) ); + testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); + if( ExprIsVtab(pCol) ){ + for(i=0; iu.zToken, aOp[i].zOp)==0 ){ + *peOp2 = aOp[i].eOp2; + *ppRight = pList->a[0].pExpr; + *ppLeft = pCol; + return 1; + } + } + } + + /* We can also match against the first column of overloaded + ** functions where xFindFunction returns a value of at least + ** SQLITE_INDEX_CONSTRAINT_FUNCTION. + ** + ** OVERLOADED(vtab_column,expression) + ** + ** Historically, xFindFunction expected to see lower-case function + ** names. But for this use case, xFindFunction is expected to deal + ** with function names in an arbitrary case. + */ + pCol = pList->a[0].pExpr; + assert( pCol->op!=TK_COLUMN || ExprUseYTab(pCol) ); + testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); + if( ExprIsVtab(pCol) ){ + sqlite3_vtab *pVtab; + sqlite3_module *pMod; + void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); + void *pNotUsed; + pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab; + assert( pVtab!=0 ); + assert( pVtab->pModule!=0 ); + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pMod = (sqlite3_module *)pVtab->pModule; + if( pMod->xFindFunction!=0 ){ + i = pMod->xFindFunction(pVtab,2, pExpr->u.zToken, &xNotUsed, &pNotUsed); + if( i>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){ + *peOp2 = i; + *ppRight = pList->a[1].pExpr; + *ppLeft = pCol; + return 1; + } + } + } + }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ + int res = 0; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + assert( pLeft->op!=TK_COLUMN || ExprUseYTab(pLeft) ); + testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); + if( ExprIsVtab(pLeft) ){ + res++; + } + assert( pRight==0 || pRight->op!=TK_COLUMN || ExprUseYTab(pRight) ); + testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); + if( pRight && ExprIsVtab(pRight) ){ + res++; + SWAP(Expr*, pLeft, pRight); + } + *ppLeft = pLeft; + *ppRight = pRight; + if( pExpr->op==TK_NE ) *peOp2 = SQLITE_INDEX_CONSTRAINT_NE; + if( pExpr->op==TK_ISNOT ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOT; + if( pExpr->op==TK_NOTNULL ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOTNULL; + return res; + } + return 0; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** If the pBase expression originated in the ON or USING clause of +** a join, then transfer the appropriate markings over to derived. +*/ +static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ + if( pDerived && ExprHasProperty(pBase, EP_OuterON|EP_InnerON) ){ + pDerived->flags |= pBase->flags & (EP_OuterON|EP_InnerON); + pDerived->w.iJoin = pBase->w.iJoin; + } +} + +/* +** Mark term iChild as being a child of term iParent +*/ +static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ + pWC->a[iChild].iParent = iParent; + pWC->a[iChild].truthProb = pWC->a[iParent].truthProb; + pWC->a[iParent].nChild++; +} + +/* +** Return the N-th AND-connected subterm of pTerm. Or if pTerm is not +** a conjunction, then return just pTerm when N==0. If N is exceeds +** the number of available subterms, return NULL. +*/ +static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ + if( pTerm->eOperator!=WO_AND ){ + return N==0 ? pTerm : 0; + } + if( Nu.pAndInfo->wc.nTerm ){ + return &pTerm->u.pAndInfo->wc.a[N]; + } + return 0; +} + +/* +** Subterms pOne and pTwo are contained within WHERE clause pWC. The +** two subterms are in disjunction - they are OR-ed together. +** +** If these two terms are both of the form: "A op B" with the same +** A and B values but different operators and if the operators are +** compatible (if one is = and the other is <, for example) then +** add a new virtual AND term to pWC that is the combination of the +** two. +** +** Some examples: +** +** x x<=y +** x=y OR x=y --> x=y +** x<=y OR x x<=y +** +** The following is NOT generated: +** +** xy --> x!=y +*/ +static void whereCombineDisjuncts( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* The complete WHERE clause */ + WhereTerm *pOne, /* First disjunct */ + WhereTerm *pTwo /* Second disjunct */ +){ + u16 eOp = pOne->eOperator | pTwo->eOperator; + sqlite3 *db; /* Database connection (for malloc) */ + Expr *pNew; /* New virtual expression */ + int op; /* Operator for the combined expression */ + int idxNew; /* Index in pWC of the next virtual term */ + + if( (pOne->wtFlags | pTwo->wtFlags) & TERM_VNULL ) return; + if( (pOne->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (pTwo->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (eOp & (WO_EQ|WO_LT|WO_LE))!=eOp + && (eOp & (WO_EQ|WO_GT|WO_GE))!=eOp ) return; + assert( pOne->pExpr->pLeft!=0 && pOne->pExpr->pRight!=0 ); + assert( pTwo->pExpr->pLeft!=0 && pTwo->pExpr->pRight!=0 ); + if( sqlite3ExprCompare(0,pOne->pExpr->pLeft, pTwo->pExpr->pLeft, -1) ) return; + if( sqlite3ExprCompare(0,pOne->pExpr->pRight, pTwo->pExpr->pRight,-1) )return; + /* If we reach this point, it means the two subterms can be combined */ + if( (eOp & (eOp-1))!=0 ){ + if( eOp & (WO_LT|WO_LE) ){ + eOp = WO_LE; + }else{ + assert( eOp & (WO_GT|WO_GE) ); + eOp = WO_GE; + } + } + db = pWC->pWInfo->pParse->db; + pNew = sqlite3ExprDup(db, pOne->pExpr, 0); + if( pNew==0 ) return; + for(op=TK_EQ; eOp!=(WO_EQ<<(op-TK_EQ)); op++){ assert( opop = op; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); +} + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Analyze a term that consists of two or more OR-connected +** subterms. So in: +** +** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13) +** ^^^^^^^^^^^^^^^^^^^^ +** +** This routine analyzes terms such as the middle term in the above example. +** A WhereOrTerm object is computed and attached to the term under +** analysis, regardless of the outcome of the analysis. Hence: +** +** WhereTerm.wtFlags |= TERM_ORINFO +** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object +** +** The term being analyzed must have two or more of OR-connected subterms. +** A single subterm might be a set of AND-connected sub-subterms. +** Examples of terms under analysis: +** +** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5 +** (B) x=expr1 OR expr2=x OR x=expr3 +** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15) +** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*') +** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6) +** (F) x>A OR (x=A AND y>=B) +** +** CASE 1: +** +** If all subterms are of the form T.C=expr for some single column of C and +** a single table T (as shown in example B above) then create a new virtual +** term that is an equivalent IN expression. In other words, if the term +** being analyzed is: +** +** x = expr1 OR expr2 = x OR x = expr3 +** +** then create a new virtual term like this: +** +** x IN (expr1,expr2,expr3) +** +** CASE 2: +** +** If there are exactly two disjuncts and one side has x>A and the other side +** has x=A (for the same x and A) then add a new virtual conjunct term to the +** WHERE clause of the form "x>=A". Example: +** +** x>A OR (x=A AND y>B) adds: x>=A +** +** The added conjunct can sometimes be helpful in query planning. +** +** CASE 3: +** +** If all subterms are indexable by a single table T, then set +** +** WhereTerm.eOperator = WO_OR +** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T +** +** A subterm is "indexable" if it is of the form +** "T.C " where C is any column of table T and +** is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN". +** A subterm is also indexable if it is an AND of two or more +** subsubterms at least one of which is indexable. Indexable AND +** subterms have their eOperator set to WO_AND and they have +** u.pAndInfo set to a dynamically allocated WhereAndTerm object. +** +** From another point of view, "indexable" means that the subterm could +** potentially be used with an index if an appropriate index exists. +** This analysis does not consider whether or not the index exists; that +** is decided elsewhere. This analysis only looks at whether subterms +** appropriate for indexing exist. +** +** All examples A through E above satisfy case 3. But if a term +** also satisfies case 1 (such as B) we know that the optimizer will +** always prefer case 1, so in that case we pretend that case 3 is not +** satisfied. +** +** It might be the case that multiple tables are indexable. For example, +** (E) above is indexable on tables P, Q, and R. +** +** Terms that satisfy case 3 are candidates for lookup by using +** separate indices to find rowids for each subterm and composing +** the union of all rowids using a RowSet object. This is similar +** to "bitmap indices" in other database engines. +** +** OTHERWISE: +** +** If none of cases 1, 2, or 3 apply, then leave the eOperator set to +** zero. This term is not useful for search. +*/ +static void exprAnalyzeOrTerm( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the complete WHERE clause */ + int idxTerm /* Index of the OR-term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + Parse *pParse = pWInfo->pParse; /* Parser context */ + sqlite3 *db = pParse->db; /* Database connection */ + WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */ + Expr *pExpr = pTerm->pExpr; /* The expression of the term */ + int i; /* Loop counters */ + WhereClause *pOrWc; /* Breakup of pTerm into subterms */ + WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */ + WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */ + Bitmask chngToIN; /* Tables that might satisfy case 1 */ + Bitmask indexable; /* Tables that are indexable, satisfying case 2 */ + + /* + ** Break the OR clause into its separate subterms. The subterms are + ** stored in a WhereClause structure containing within the WhereOrInfo + ** object that is attached to the original OR clause term. + */ + assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 ); + assert( pExpr->op==TK_OR ); + pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo)); + if( pOrInfo==0 ) return; + pTerm->wtFlags |= TERM_ORINFO; + pOrWc = &pOrInfo->wc; + memset(pOrWc->aStatic, 0, sizeof(pOrWc->aStatic)); + sqlite3WhereClauseInit(pOrWc, pWInfo); + sqlite3WhereSplit(pOrWc, pExpr, TK_OR); + sqlite3WhereExprAnalyze(pSrc, pOrWc); + if( db->mallocFailed ) return; + assert( pOrWc->nTerm>=2 ); + + /* + ** Compute the set of tables that might satisfy cases 1 or 3. + */ + indexable = ~(Bitmask)0; + chngToIN = ~(Bitmask)0; + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){ + if( (pOrTerm->eOperator & WO_SINGLE)==0 ){ + WhereAndInfo *pAndInfo; + assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 ); + chngToIN = 0; + pAndInfo = sqlite3DbMallocRawNN(db, sizeof(*pAndInfo)); + if( pAndInfo ){ + WhereClause *pAndWC; + WhereTerm *pAndTerm; + int j; + Bitmask b = 0; + pOrTerm->u.pAndInfo = pAndInfo; + pOrTerm->wtFlags |= TERM_ANDINFO; + pOrTerm->eOperator = WO_AND; + pOrTerm->leftCursor = -1; + pAndWC = &pAndInfo->wc; + memset(pAndWC->aStatic, 0, sizeof(pAndWC->aStatic)); + sqlite3WhereClauseInit(pAndWC, pWC->pWInfo); + sqlite3WhereSplit(pAndWC, pOrTerm->pExpr, TK_AND); + sqlite3WhereExprAnalyze(pSrc, pAndWC); + pAndWC->pOuter = pWC; + if( !db->mallocFailed ){ + for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ + assert( pAndTerm->pExpr ); + if( allowedOp(pAndTerm->pExpr->op) + || pAndTerm->eOperator==WO_AUX + ){ + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); + } + } + } + indexable &= b; + } + }else if( pOrTerm->wtFlags & TERM_COPIED ){ + /* Skip this term for now. We revisit it when we process the + ** corresponding TERM_VIRTUAL term */ + }else{ + Bitmask b; + b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); + if( pOrTerm->wtFlags & TERM_VIRTUAL ){ + WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); + } + indexable &= b; + if( (pOrTerm->eOperator & WO_EQ)==0 ){ + chngToIN = 0; + }else{ + chngToIN &= b; + } + } + } + + /* + ** Record the set of tables that satisfy case 3. The set might be + ** empty. + */ + pOrInfo->indexable = indexable; + pTerm->eOperator = WO_OR; + pTerm->leftCursor = -1; + if( indexable ){ + pWC->hasOr = 1; + } + + /* For a two-way OR, attempt to implementation case 2. + */ + if( indexable && pOrWc->nTerm==2 ){ + int iOne = 0; + WhereTerm *pOne; + while( (pOne = whereNthSubterm(&pOrWc->a[0],iOne++))!=0 ){ + int iTwo = 0; + WhereTerm *pTwo; + while( (pTwo = whereNthSubterm(&pOrWc->a[1],iTwo++))!=0 ){ + whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); + } + } + } + + /* + ** chngToIN holds a set of tables that *might* satisfy case 1. But + ** we have to do some additional checking to see if case 1 really + ** is satisfied. + ** + ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means + ** that there is no possibility of transforming the OR clause into an + ** IN operator because one or more terms in the OR clause contain + ** something other than == on a column in the single table. The 1-bit + ** case means that every term of the OR clause is of the form + ** "table.column=expr" for some single table. The one bit that is set + ** will correspond to the common table. We still need to check to make + ** sure the same column is used on all terms. The 2-bit case is when + ** the all terms are of the form "table1.column=table2.column". It + ** might be possible to form an IN operator with either table1.column + ** or table2.column as the LHS if either is common to every term of + ** the OR clause. + ** + ** Note that terms of the form "table.column1=table.column2" (the + ** same table on both sizes of the ==) cannot be optimized. + */ + if( chngToIN ){ + int okToChngToIN = 0; /* True if the conversion to IN is valid */ + int iColumn = -1; /* Column index on lhs of IN operator */ + int iCursor = -1; /* Table cursor common to all terms */ + int j = 0; /* Loop counter */ + + /* Search for a table and column that appears on one side or the + ** other of the == operator in every subterm. That table and column + ** will be recorded in iCursor and iColumn. There might not be any + ** such table and column. Set okToChngToIN if an appropriate table + ** and column is found but leave okToChngToIN false if not found. + */ + for(j=0; j<2 && !okToChngToIN; j++){ + Expr *pLeft = 0; + pOrTerm = pOrWc->a; + for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + pOrTerm->wtFlags &= ~TERM_OK; + if( pOrTerm->leftCursor==iCursor ){ + /* This is the 2-bit case and we are on the second iteration and + ** current term is from the first iteration. So skip this term. */ + assert( j==1 ); + continue; + } + if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, + pOrTerm->leftCursor))==0 ){ + /* This term must be of the form t1.a==t2.b where t2 is in the + ** chngToIN set but t1 is not. This term will be either preceded + ** or follwed by an inverted copy (t2.b==t1.a). Skip this term + ** and use its inversion. */ + testcase( pOrTerm->wtFlags & TERM_COPIED ); + testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); + assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) ); + continue; + } + assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 ); + iColumn = pOrTerm->u.x.leftColumn; + iCursor = pOrTerm->leftCursor; + pLeft = pOrTerm->pExpr->pLeft; + break; + } + if( i<0 ){ + /* No candidate table+column was found. This can only occur + ** on the second iteration */ + assert( j==1 ); + assert( IsPowerOfTwo(chngToIN) ); + assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); + break; + } + testcase( j==1 ); + + /* We have found a candidate table and column. Check to see if that + ** table and column is common to every term in the OR clause */ + okToChngToIN = 1; + for(; i>=0 && okToChngToIN; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 ); + if( pOrTerm->leftCursor!=iCursor ){ + pOrTerm->wtFlags &= ~TERM_OK; + }else if( pOrTerm->u.x.leftColumn!=iColumn || (iColumn==XN_EXPR + && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) + )){ + okToChngToIN = 0; + }else{ + int affLeft, affRight; + /* If the right-hand side is also a column, then the affinities + ** of both right and left sides must be such that no type + ** conversions are required on the right. (Ticket #2249) + */ + affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight); + affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft); + if( affRight!=0 && affRight!=affLeft ){ + okToChngToIN = 0; + }else{ + pOrTerm->wtFlags |= TERM_OK; + } + } + } + } + + /* At this point, okToChngToIN is true if original pTerm satisfies + ** case 1. In that case, construct a new virtual term that is + ** pTerm converted into an IN operator. + */ + if( okToChngToIN ){ + Expr *pDup; /* A transient duplicate expression */ + ExprList *pList = 0; /* The RHS of the IN operator */ + Expr *pLeft = 0; /* The LHS of the IN operator */ + Expr *pNew; /* The complete IN operator */ + + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){ + if( (pOrTerm->wtFlags & TERM_OK)==0 ) continue; + assert( pOrTerm->eOperator & WO_EQ ); + assert( (pOrTerm->eOperator & (WO_OR|WO_AND))==0 ); + assert( pOrTerm->leftCursor==iCursor ); + assert( pOrTerm->u.x.leftColumn==iColumn ); + pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0); + pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup); + pLeft = pOrTerm->pExpr->pLeft; + } + assert( pLeft!=0 ); + pDup = sqlite3ExprDup(db, pLeft, 0); + pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0); + if( pNew ){ + int idxNew; + transferJoinMarkings(pNew, pExpr); + assert( ExprUseXList(pNew) ); + pNew->x.pList = pList; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + /* pTerm = &pWC->a[idxTerm]; // would be needed if pTerm where reused */ + markTermAsChild(pWC, idxNew, idxTerm); + }else{ + sqlite3ExprListDelete(db, pList); + } + } + } +} +#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */ + +/* +** We already know that pExpr is a binary operator where both operands are +** column references. This routine checks to see if pExpr is an equivalence +** relation: +** 1. The SQLITE_Transitive optimization must be enabled +** 2. Must be either an == or an IS operator +** 3. Not originating in the ON clause of an OUTER JOIN +** 4. The affinities of A and B must be compatible +** 5a. Both operands use the same collating sequence OR +** 5b. The overall collating sequence is BINARY +** If this routine returns TRUE, that means that the RHS can be substituted +** for the LHS anyplace else in the WHERE clause where the LHS column occurs. +** This is an optimization. No harm comes from returning 0. But if 1 is +** returned when it should not be, then incorrect answers might result. +*/ +static int termIsEquivalence(Parse *pParse, Expr *pExpr){ + char aff1, aff2; + CollSeq *pColl; + if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; + if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; + aff1 = sqlite3ExprAffinity(pExpr->pLeft); + aff2 = sqlite3ExprAffinity(pExpr->pRight); + if( aff1!=aff2 + && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) + ){ + return 0; + } + pColl = sqlite3ExprCompareCollSeq(pParse, pExpr); + if( sqlite3IsBinary(pColl) ) return 1; + return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); +} + +/* +** Recursively walk the expressions of a SELECT statement and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ + Bitmask mask = 0; + while( pS ){ + SrcList *pSrc = pS->pSrc; + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pEList); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pGroupBy); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pWhere); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pHaving); + if( ALWAYS(pSrc!=0) ){ + int i; + for(i=0; inSrc; i++){ + mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); + if( pSrc->a[i].fg.isUsing==0 ){ + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].u3.pOn); + } + if( pSrc->a[i].fg.isTabFunc ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg); + } + } + } + pS = pS->pPrior; + } + return mask; +} + +/* +** Expression pExpr is one operand of a comparison operator that might +** be useful for indexing. This routine checks to see if pExpr appears +** in any index. Return TRUE (1) if pExpr is an indexed term and return +** FALSE (0) if not. If TRUE is returned, also set aiCurCol[0] to the cursor +** number of the table that is indexed and aiCurCol[1] to the column number +** of the column that is indexed, or XN_EXPR (-2) if an expression is being +** indexed. +** +** If pExpr is a TK_COLUMN column reference, then this routine always returns +** true even if that particular column is not indexed, because the column +** might be added to an automatic index later. +*/ +static SQLITE_NOINLINE int exprMightBeIndexed2( + SrcList *pFrom, /* The FROM clause */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + int *aiCurCol, /* Write the referenced table cursor and column here */ + Expr *pExpr /* An operand of a comparison operator */ +){ + Index *pIdx; + int i; + int iCur; + for(i=0; mPrereq>1; i++, mPrereq>>=1){} + iCur = pFrom->a[i].iCursor; + for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->aColExpr==0 ) continue; + for(i=0; inKeyCol; i++){ + if( pIdx->aiColumn[i]!=XN_EXPR ) continue; + if( sqlite3ExprCompareSkip(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){ + aiCurCol[0] = iCur; + aiCurCol[1] = XN_EXPR; + return 1; + } + } + } + return 0; +} +static int exprMightBeIndexed( + SrcList *pFrom, /* The FROM clause */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + int *aiCurCol, /* Write the referenced table cursor & column here */ + Expr *pExpr, /* An operand of a comparison operator */ + int op /* The specific comparison operator */ +){ + /* If this expression is a vector to the left or right of a + ** inequality constraint (>, <, >= or <=), perform the processing + ** on the first element of the vector. */ + assert( TK_GT+1==TK_LE && TK_GT+2==TK_LT && TK_GT+3==TK_GE ); + assert( TK_ISop==TK_VECTOR && (op>=TK_GT && ALWAYS(op<=TK_GE)) ){ + assert( ExprUseXList(pExpr) ); + pExpr = pExpr->x.pList->a[0].pExpr; + + } + + if( pExpr->op==TK_COLUMN ){ + aiCurCol[0] = pExpr->iTable; + aiCurCol[1] = pExpr->iColumn; + return 1; + } + if( mPrereq==0 ) return 0; /* No table references */ + if( (mPrereq&(mPrereq-1))!=0 ) return 0; /* Refs more than one table */ + return exprMightBeIndexed2(pFrom,mPrereq,aiCurCol,pExpr); +} + + +/* +** The input to this routine is an WhereTerm structure with only the +** "pExpr" field filled in. The job of this routine is to analyze the +** subexpression and populate all the other fields of the WhereTerm +** structure. +** +** If the expression is of the form " X" it gets commuted +** to the standard form of "X ". +** +** If the expression is of the form "X Y" where both X and Y are +** columns, then the original expression is unchanged and a new virtual +** term of the form "Y X" is added to the WHERE clause and +** analyzed separately. The original term is marked with TERM_COPIED +** and the new term is marked with TERM_DYNAMIC (because it's pExpr +** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it +** is a commuted copy of a prior term.) The original term has nChild=1 +** and the copy has idxParent set to the index of the original term. +*/ +static void exprAnalyze( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the WHERE clause */ + int idxTerm /* Index of the term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + WhereTerm *pTerm; /* The term to be analyzed */ + WhereMaskSet *pMaskSet; /* Set of table index masks */ + Expr *pExpr; /* The expression to be analyzed */ + Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ + Bitmask prereqAll; /* Prerequesites of pExpr */ + Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ + Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ + int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ + int noCase = 0; /* uppercase equivalent to lowercase */ + int op; /* Top-level operator. pExpr->op */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection */ + unsigned char eOp2 = 0; /* op2 value for LIKE/REGEXP/GLOB */ + int nLeft; /* Number of elements on left side vector */ + + if( db->mallocFailed ){ + return; + } + assert( pWC->nTerm > idxTerm ); + pTerm = &pWC->a[idxTerm]; + pMaskSet = &pWInfo->sMaskSet; + pExpr = pTerm->pExpr; + assert( pExpr!=0 ); /* Because malloc() has not failed */ + assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); + pMaskSet->bVarSelect = 0; + prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); + op = pExpr->op; + if( op==TK_IN ){ + assert( pExpr->pRight==0 ); + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + if( ExprUseXSelect(pExpr) ){ + pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); + }else{ + pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); + } + prereqAll = prereqLeft | pTerm->prereqRight; + }else{ + pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); + if( pExpr->pLeft==0 + || ExprHasProperty(pExpr, EP_xIsSelect|EP_IfNullRow) + || pExpr->x.pList!=0 + ){ + prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); + }else{ + prereqAll = prereqLeft | pTerm->prereqRight; + } + } + if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT; + +#ifdef SQLITE_DEBUG + if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){ + printf("\n*** Incorrect prereqAll computed for:\n"); + sqlite3TreeViewExpr(0,pExpr,0); + assert( 0 ); + } +#endif + + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) ){ + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iJoin); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + prereqAll |= x; + extraRight = x-1; /* ON clause terms may not be used with an index + ** on left table of a LEFT JOIN. Ticket #3015 */ + if( (prereqAll>>1)>=x ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + }else if( (prereqAll>>1)>=x ){ + /* The ON clause of an INNER JOIN references a table to its right. + ** Most other SQL database engines raise an error. But SQLite versions + ** 3.0 through 3.38 just put the ON clause constraint into the WHERE + ** clause and carried on. Beginning with 3.39, raise an error only + ** if there is a RIGHT or FULL JOIN in the query. This makes SQLite + ** more like other systems, and also preserves legacy. */ + if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + ExprClearProperty(pExpr, EP_InnerON); + } + } + pTerm->prereqAll = prereqAll; + pTerm->leftCursor = -1; + pTerm->iParent = -1; + pTerm->eOperator = 0; + if( allowedOp(op) ){ + int aiCurCol[2]; + Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft); + Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); + u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV; + + if( pTerm->u.x.iField>0 ){ + assert( op==TK_IN ); + assert( pLeft->op==TK_VECTOR ); + assert( ExprUseXList(pLeft) ); + pLeft = pLeft->x.pList->a[pTerm->u.x.iField-1].pExpr; + } + + if( exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op) ){ + pTerm->leftCursor = aiCurCol[0]; + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + pTerm->u.x.leftColumn = aiCurCol[1]; + pTerm->eOperator = operatorMask(op) & opMask; + } + if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; + if( pRight + && exprMightBeIndexed(pSrc, pTerm->prereqRight, aiCurCol, pRight, op) + && !ExprHasProperty(pRight, EP_FixedCol) + ){ + WhereTerm *pNew; + Expr *pDup; + u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */ + assert( pTerm->u.x.iField==0 ); + if( pTerm->leftCursor>=0 ){ + int idxNew; + pDup = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDup); + return; + } + idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); + if( idxNew==0 ) return; + pNew = &pWC->a[idxNew]; + markTermAsChild(pWC, idxNew, idxTerm); + if( op==TK_IS ) pNew->wtFlags |= TERM_IS; + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + + if( termIsEquivalence(pParse, pDup) ){ + pTerm->eOperator |= WO_EQUIV; + eExtraOp = WO_EQUIV; + } + }else{ + pDup = pExpr; + pNew = pTerm; + } + pNew->wtFlags |= exprCommute(pParse, pDup); + pNew->leftCursor = aiCurCol[0]; + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + pNew->u.x.leftColumn = aiCurCol[1]; + testcase( (prereqLeft | extraRight) != prereqLeft ); + pNew->prereqRight = prereqLeft | extraRight; + pNew->prereqAll = prereqAll; + pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; + }else + if( op==TK_ISNULL + && !ExprHasProperty(pExpr,EP_OuterON) + && 0==sqlite3ExprCanBeNull(pLeft) + ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pExpr->op = TK_TRUEFALSE; + pExpr->u.zToken = "false"; + ExprSetProperty(pExpr, EP_IsFalse); + pTerm->prereqAll = 0; + pTerm->eOperator = 0; + } + } + +#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION + /* If a term is the BETWEEN operator, create two new virtual terms + ** that define the range that the BETWEEN implements. For example: + ** + ** a BETWEEN b AND c + ** + ** is converted into: + ** + ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c) + ** + ** The two new terms are added onto the end of the WhereClause object. + ** The new terms are "dynamic" and are children of the original BETWEEN + ** term. That means that if the BETWEEN term is coded, the children are + ** skipped. Or, if the children are satisfied by an index, the original + ** BETWEEN term is skipped. + */ + else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){ + ExprList *pList; + int i; + static const u8 ops[] = {TK_GE, TK_LE}; + assert( ExprUseXList(pExpr) ); + pList = pExpr->x.pList; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + for(i=0; i<2; i++){ + Expr *pNewExpr; + int idxNew; + pNewExpr = sqlite3PExpr(pParse, ops[i], + sqlite3ExprDup(db, pExpr->pLeft, 0), + sqlite3ExprDup(db, pList->a[i].pExpr, 0)); + transferJoinMarkings(pNewExpr, pExpr); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + pTerm = &pWC->a[idxTerm]; + markTermAsChild(pWC, idxNew, idxTerm); + } + } +#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */ + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) + /* Analyze a term that is composed of two or more subterms connected by + ** an OR operator. + */ + else if( pExpr->op==TK_OR ){ + assert( pWC->op==TK_AND ); + exprAnalyzeOrTerm(pSrc, pWC, idxTerm); + pTerm = &pWC->a[idxTerm]; + } +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + /* The form "x IS NOT NULL" can sometimes be evaluated more efficiently + ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a + ** virtual term of that form. + ** + ** The virtual term must be tagged with TERM_VNULL. + */ + else if( pExpr->op==TK_NOTNULL ){ + if( pExpr->pLeft->op==TK_COLUMN + && pExpr->pLeft->iColumn>=0 + && !ExprHasProperty(pExpr, EP_OuterON) + ){ + Expr *pNewExpr; + Expr *pLeft = pExpr->pLeft; + int idxNew; + WhereTerm *pNewTerm; + + pNewExpr = sqlite3PExpr(pParse, TK_GT, + sqlite3ExprDup(db, pLeft, 0), + sqlite3ExprAlloc(db, TK_NULL, 0, 0)); + + idxNew = whereClauseInsert(pWC, pNewExpr, + TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); + if( idxNew ){ + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = 0; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.x.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_GT; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + } + } + + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION + /* Add constraints to reduce the search space on a LIKE or GLOB + ** operator. + ** + ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints + ** + ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%' + ** + ** The last character of the prefix "abc" is incremented to form the + ** termination condition "abd". If case is not significant (the default + ** for LIKE) then the lower-bound is made all uppercase and the upper- + ** bound is made all lowercase so that the bounds also work when comparing + ** BLOBs. + */ + else if( pExpr->op==TK_FUNCTION + && pWC->op==TK_AND + && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) + ){ + Expr *pLeft; /* LHS of LIKE/GLOB operator */ + Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */ + Expr *pNewExpr1; + Expr *pNewExpr2; + int idxNew1; + int idxNew2; + const char *zCollSeqName; /* Name of collating sequence */ + const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; + + assert( ExprUseXList(pExpr) ); + pLeft = pExpr->x.pList->a[1].pExpr; + pStr2 = sqlite3ExprDup(db, pStr1, 0); + assert( pStr1==0 || !ExprHasProperty(pStr1, EP_IntValue) ); + assert( pStr2==0 || !ExprHasProperty(pStr2, EP_IntValue) ); + + + /* Convert the lower bound to upper-case and the upper bound to + ** lower-case (upper-case is less than lower-case in ASCII) so that + ** the range constraints also work for BLOBs + */ + if( noCase && !pParse->db->mallocFailed ){ + int i; + char c; + pTerm->wtFlags |= TERM_LIKE; + for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ + pStr1->u.zToken[i] = sqlite3Toupper(c); + pStr2->u.zToken[i] = sqlite3Tolower(c); + } + } + + if( !db->mallocFailed ){ + u8 c, *pC; /* Last character before the first wildcard */ + pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; + c = *pC; + if( noCase ){ + /* The point is to increment the last character before the first + ** wildcard. But if we increment '@', that will push it into the + ** alphabetic range where case conversions will mess up the + ** inequality. To avoid this, make sure to also run the full + ** LIKE on all candidate expressions by clearing the isComplete flag + */ + if( c=='A'-1 ) isComplete = 0; + c = sqlite3UpperToLower[c]; + } + *pC = c + 1; + } + zCollSeqName = noCase ? "NOCASE" : sqlite3StrBINARY; + pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr1 = sqlite3PExpr(pParse, TK_GE, + sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), + pStr1); + transferJoinMarkings(pNewExpr1, pExpr); + idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); + testcase( idxNew1==0 ); + exprAnalyze(pSrc, pWC, idxNew1); + pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr2 = sqlite3PExpr(pParse, TK_LT, + sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), + pStr2); + transferJoinMarkings(pNewExpr2, pExpr); + idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); + testcase( idxNew2==0 ); + exprAnalyze(pSrc, pWC, idxNew2); + pTerm = &pWC->a[idxTerm]; + if( isComplete ){ + markTermAsChild(pWC, idxNew1, idxTerm); + markTermAsChild(pWC, idxNew2, idxTerm); + } + } +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + + /* If there is a vector == or IS term - e.g. "(a, b) == (?, ?)" - create + ** new terms for each component comparison - "a = ?" and "b = ?". The + ** new terms completely replace the original vector comparison, which is + ** no longer used. + ** + ** This is only required if at least one side of the comparison operation + ** is not a sub-select. + ** + ** tag-20220128a + */ + if( (pExpr->op==TK_EQ || pExpr->op==TK_IS) + && (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1 + && sqlite3ExprVectorSize(pExpr->pRight)==nLeft + && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 + || (pExpr->pRight->flags & EP_xIsSelect)==0) + && pWC->op==TK_AND + ){ + int i; + for(i=0; ipLeft, i, nLeft); + Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i, nLeft); + + pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight); + transferJoinMarkings(pNew, pExpr); + idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_SLICE); + exprAnalyze(pSrc, pWC, idxNew); + } + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */ + pTerm->eOperator = WO_ROWVAL; + } + + /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create + ** a virtual term for each vector component. The expression object + ** used by each such virtual term is pExpr (the full vector IN(...) + ** expression). The WhereTerm.u.x.iField variable identifies the index within + ** the vector on the LHS that the virtual term represents. + ** + ** This only works if the RHS is a simple SELECT (not a compound) that does + ** not use window functions. + */ + else if( pExpr->op==TK_IN + && pTerm->u.x.iField==0 + && pExpr->pLeft->op==TK_VECTOR + && ALWAYS( ExprUseXSelect(pExpr) ) + && pExpr->x.pSelect->pPrior==0 +#ifndef SQLITE_OMIT_WINDOWFUNC + && pExpr->x.pSelect->pWin==0 +#endif + && pWC->op==TK_AND + ){ + int i; + for(i=0; ipLeft); i++){ + int idxNew; + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL|TERM_SLICE); + pWC->a[idxNew].u.x.iField = i+1; + exprAnalyze(pSrc, pWC, idxNew); + markTermAsChild(pWC, idxNew, idxTerm); + } + } + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Add a WO_AUX auxiliary term to the constraint set if the + ** current expression is of the form "column OP expr" where OP + ** is an operator that gets passed into virtual tables but which is + ** not normally optimized for ordinary tables. In other words, OP + ** is one of MATCH, LIKE, GLOB, REGEXP, !=, IS, IS NOT, or NOT NULL. + ** This information is used by the xBestIndex methods of + ** virtual tables. The native query optimizer does not attempt + ** to do anything with MATCH functions. + */ + else if( pWC->op==TK_AND ){ + Expr *pRight = 0, *pLeft = 0; + int res = isAuxiliaryVtabOperator(db, pExpr, &eOp2, &pLeft, &pRight); + while( res-- > 0 ){ + int idxNew; + WhereTerm *pNewTerm; + Bitmask prereqColumn, prereqExpr; + + prereqExpr = sqlite3WhereExprUsage(pMaskSet, pRight); + prereqColumn = sqlite3WhereExprUsage(pMaskSet, pLeft); + if( (prereqExpr & prereqColumn)==0 ){ + Expr *pNewExpr; + pNewExpr = sqlite3PExpr(pParse, TK_MATCH, + 0, sqlite3ExprDup(db, pRight, 0)); + if( ExprHasProperty(pExpr, EP_OuterON) && pNewExpr ){ + ExprSetProperty(pNewExpr, EP_OuterON); + pNewExpr->w.iJoin = pExpr->w.iJoin; + } + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = prereqExpr; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.x.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_AUX; + pNewTerm->eMatchOp = eOp2; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + SWAP(Expr*, pLeft, pRight); + } + } +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + /* Prevent ON clause terms of a LEFT JOIN from being used to drive + ** an index for tables to the left of the join. + */ + testcase( pTerm!=&pWC->a[idxTerm] ); + pTerm = &pWC->a[idxTerm]; + pTerm->prereqRight |= extraRight; +} + +/*************************************************************************** +** Routines with file scope above. Interface to the rest of the where.c +** subsystem follows. +***************************************************************************/ + +/* +** This routine identifies subexpressions in the WHERE clause where +** each subexpression is separated by the AND operator or some other +** operator specified in the op parameter. The WhereClause structure +** is filled with pointers to subexpressions. For example: +** +** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) +** \________/ \_______________/ \________________/ +** slot[0] slot[1] slot[2] +** +** The original WHERE clause in pExpr is unaltered. All this routine +** does is make slot[] entries point to substructure within pExpr. +** +** In the previous sentence and in the diagram, "slot[]" refers to +** the WhereClause.a[] array. The slot[] array grows as needed to contain +** all terms of the WHERE clause. +*/ +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr); + pWC->op = op; + assert( pE2!=0 || pExpr==0 ); + if( pE2==0 ) return; + if( pE2->op!=op ){ + whereClauseInsert(pWC, pExpr, 0); + }else{ + sqlite3WhereSplit(pWC, pE2->pLeft, op); + sqlite3WhereSplit(pWC, pE2->pRight, op); + } +} + +/* +** Add either a LIMIT (if eMatchOp==SQLITE_INDEX_CONSTRAINT_LIMIT) or +** OFFSET (if eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET) term to the +** where-clause passed as the first argument. The value for the term +** is found in register iReg. +** +** In the common case where the value is a simple integer +** (example: "LIMIT 5 OFFSET 10") then the expression codes as a +** TK_INTEGER so that it will be available to sqlite3_vtab_rhs_value(). +** If not, then it codes as a TK_REGISTER expression. +*/ +static void whereAddLimitExpr( + WhereClause *pWC, /* Add the constraint to this WHERE clause */ + int iReg, /* Register that will hold value of the limit/offset */ + Expr *pExpr, /* Expression that defines the limit/offset */ + int iCsr, /* Cursor to which the constraint applies */ + int eMatchOp /* SQLITE_INDEX_CONSTRAINT_LIMIT or _OFFSET */ +){ + Parse *pParse = pWC->pWInfo->pParse; + sqlite3 *db = pParse->db; + Expr *pNew; + int iVal = 0; + + if( sqlite3ExprIsInteger(pExpr, &iVal) && iVal>=0 ){ + Expr *pVal = sqlite3Expr(db, TK_INTEGER, 0); + if( pVal==0 ) return; + ExprSetProperty(pVal, EP_IntValue); + pVal->u.iValue = iVal; + pNew = sqlite3PExpr(pParse, TK_MATCH, 0, pVal); + }else{ + Expr *pVal = sqlite3Expr(db, TK_REGISTER, 0); + if( pVal==0 ) return; + pVal->iTable = iReg; + pNew = sqlite3PExpr(pParse, TK_MATCH, 0, pVal); + } + if( pNew ){ + WhereTerm *pTerm; + int idx; + idx = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_VIRTUAL); + pTerm = &pWC->a[idx]; + pTerm->leftCursor = iCsr; + pTerm->eOperator = WO_AUX; + pTerm->eMatchOp = eMatchOp; + } +} + +/* +** Possibly add terms corresponding to the LIMIT and OFFSET clauses of the +** SELECT statement passed as the second argument. These terms are only +** added if: +** +** 1. The SELECT statement has a LIMIT clause, and +** 2. The SELECT statement is not an aggregate or DISTINCT query, and +** 3. The SELECT statement has exactly one object in its from clause, and +** that object is a virtual table, and +** 4. There are no terms in the WHERE clause that will not be passed +** to the virtual table xBestIndex method. +** 5. The ORDER BY clause, if any, will be made available to the xBestIndex +** method. +** +** LIMIT and OFFSET terms are ignored by most of the planner code. They +** exist only so that they may be passed to the xBestIndex method of the +** single virtual table in the FROM clause of the SELECT. +*/ +SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ + assert( p==0 || (p->pGroupBy==0 && (p->selFlags & SF_Aggregate)==0) ); + if( (p && p->pLimit) /* 1 */ + && (p->selFlags & (SF_Distinct|SF_Aggregate))==0 /* 2 */ + && (p->pSrc->nSrc==1 && IsVirtual(p->pSrc->a[0].pTab)) /* 3 */ + ){ + ExprList *pOrderBy = p->pOrderBy; + int iCsr = p->pSrc->a[0].iCursor; + int ii; + + /* Check condition (4). Return early if it is not met. */ + for(ii=0; iinTerm; ii++){ + if( pWC->a[ii].wtFlags & TERM_CODED ){ + /* This term is a vector operation that has been decomposed into + ** other, subsequent terms. It can be ignored. See tag-20220128a */ + assert( pWC->a[ii].wtFlags & TERM_VIRTUAL ); + assert( pWC->a[ii].eOperator==WO_ROWVAL ); + continue; + } + if( pWC->a[ii].leftCursor!=iCsr ) return; + } + + /* Check condition (5). Return early if it is not met. */ + if( pOrderBy ){ + for(ii=0; iinExpr; ii++){ + Expr *pExpr = pOrderBy->a[ii].pExpr; + if( pExpr->op!=TK_COLUMN ) return; + if( pExpr->iTable!=iCsr ) return; + if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return; + } + } + + /* All conditions are met. Add the terms to the where-clause object. */ + assert( p->pLimit->op==TK_LIMIT ); + whereAddLimitExpr(pWC, p->iLimit, p->pLimit->pLeft, + iCsr, SQLITE_INDEX_CONSTRAINT_LIMIT); + if( p->iOffset>0 ){ + whereAddLimitExpr(pWC, p->iOffset, p->pLimit->pRight, + iCsr, SQLITE_INDEX_CONSTRAINT_OFFSET); + } + } +} + +/* +** Initialize a preallocated WhereClause structure. +*/ +SQLITE_PRIVATE void sqlite3WhereClauseInit( + WhereClause *pWC, /* The WhereClause to be initialized */ + WhereInfo *pWInfo /* The WHERE processing context */ +){ + pWC->pWInfo = pWInfo; + pWC->hasOr = 0; + pWC->pOuter = 0; + pWC->nTerm = 0; + pWC->nBase = 0; + pWC->nSlot = ArraySize(pWC->aStatic); + pWC->a = pWC->aStatic; +} + +/* +** Deallocate a WhereClause structure. The WhereClause structure +** itself is not freed. This routine is the inverse of +** sqlite3WhereClauseInit(). +*/ +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ + sqlite3 *db = pWC->pWInfo->pParse->db; + assert( pWC->nTerm>=pWC->nBase ); + if( pWC->nTerm>0 ){ + WhereTerm *a = pWC->a; + WhereTerm *aLast = &pWC->a[pWC->nTerm-1]; +#ifdef SQLITE_DEBUG + int i; + /* Verify that every term past pWC->nBase is virtual */ + for(i=pWC->nBase; inTerm; i++){ + assert( (pWC->a[i].wtFlags & TERM_VIRTUAL)!=0 ); + } +#endif + while(1){ + assert( a->eMatchOp==0 || a->eOperator==WO_AUX ); + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & (TERM_ORINFO|TERM_ANDINFO) ){ + if( a->wtFlags & TERM_ORINFO ){ + assert( (a->wtFlags & TERM_ANDINFO)==0 ); + whereOrInfoDelete(db, a->u.pOrInfo); + }else{ + assert( (a->wtFlags & TERM_ANDINFO)!=0 ); + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( a==aLast ) break; + a++; + } + } +} + + +/* +** These routines walk (recursively) an expression tree and generate +** a bitmask indicating which tables are used in that expression +** tree. +** +** sqlite3WhereExprUsage(MaskSet, Expr) -> +** +** Return a Bitmask of all tables referenced by Expr. Expr can be +** be NULL, in which case 0 is returned. +** +** sqlite3WhereExprUsageNN(MaskSet, Expr) -> +** +** Same as sqlite3WhereExprUsage() except that Expr must not be +** NULL. The "NN" suffix on the name stands for "Not Null". +** +** sqlite3WhereExprListUsage(MaskSet, ExprList) -> +** +** Return a Bitmask of all tables referenced by every expression +** in the expression list ExprList. ExprList can be NULL, in which +** case 0 is returned. +** +** sqlite3WhereExprUsageFull(MaskSet, ExprList) -> +** +** Internal use only. Called only by sqlite3WhereExprUsageNN() for +** complex expressions that require pushing register values onto +** the stack. Many calls to sqlite3WhereExprUsageNN() do not need +** the more complex analysis done by this routine. Hence, the +** computations done by this routine are broken out into a separate +** "no-inline" function to avoid the stack push overhead in the +** common case where it is not needed. +*/ +static SQLITE_NOINLINE Bitmask sqlite3WhereExprUsageFull( + WhereMaskSet *pMaskSet, + Expr *p +){ + Bitmask mask; + mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0; + if( p->pLeft ) mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pLeft); + if( p->pRight ){ + mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pRight); + assert( p->x.pList==0 ); + }else if( ExprUseXSelect(p) ){ + if( ExprHasProperty(p, EP_VarSelect) ) pMaskSet->bVarSelect = 1; + mask |= exprSelectUsage(pMaskSet, p->x.pSelect); + }else if( p->x.pList ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && ExprUseYWin(p) ){ + assert( p->y.pWin!=0 ); + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition); + mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter); + } +#endif + return mask; +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ + if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ + return sqlite3WhereGetMask(pMaskSet, p->iTable); + }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + assert( p->op!=TK_IF_NULL_ROW ); + return 0; + } + return sqlite3WhereExprUsageFull(pMaskSet, p); +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ + return p ? sqlite3WhereExprUsageNN(pMaskSet,p) : 0; +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){ + int i; + Bitmask mask = 0; + if( pList ){ + for(i=0; inExpr; i++){ + mask |= sqlite3WhereExprUsage(pMaskSet, pList->a[i].pExpr); + } + } + return mask; +} + + +/* +** Call exprAnalyze on all terms in a WHERE clause. +** +** Note that exprAnalyze() might add new virtual terms onto the +** end of the WHERE clause. We do not want to analyze these new +** virtual terms, so start analyzing at the end and work forward +** so that the added virtual terms are never processed. +*/ +SQLITE_PRIVATE void sqlite3WhereExprAnalyze( + SrcList *pTabList, /* the FROM clause */ + WhereClause *pWC /* the WHERE clause to be analyzed */ +){ + int i; + for(i=pWC->nTerm-1; i>=0; i--){ + exprAnalyze(pTabList, pWC, i); + } +} + +/* +** For table-valued-functions, transform the function arguments into +** new WHERE clause terms. +** +** Each function argument translates into an equality constraint against +** a HIDDEN column in the table. +*/ +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( + Parse *pParse, /* Parsing context */ + SrcItem *pItem, /* The FROM clause term to process */ + WhereClause *pWC /* Xfer function arguments to here */ +){ + Table *pTab; + int j, k; + ExprList *pArgs; + Expr *pColRef; + Expr *pTerm; + if( pItem->fg.isTabFunc==0 ) return; + pTab = pItem->pTab; + assert( pTab!=0 ); + pArgs = pItem->u1.pFuncArg; + if( pArgs==0 ) return; + for(j=k=0; jnExpr; j++){ + Expr *pRhs; + u32 joinType; + while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} + if( k>=pTab->nCol ){ + sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", + pTab->zName, j); + return; + } + pColRef = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); + if( pColRef==0 ) return; + pColRef->iTable = pItem->iCursor; + pColRef->iColumn = k++; + assert( ExprUseYTab(pColRef) ); + pColRef->y.pTab = pTab; + pItem->colUsed |= sqlite3ExprColUsed(pColRef); + pRhs = sqlite3PExpr(pParse, TK_UPLUS, + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); + pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); + if( pItem->fg.jointype & (JT_LEFT|JT_LTORJ) ){ + joinType = EP_OuterON; + }else{ + joinType = EP_InnerON; + } + sqlite3SetJoinExpr(pTerm, pItem->iCursor, joinType); + whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); + } +} + +/************** End of whereexpr.c *******************************************/ +/************** Begin file where.c *******************************************/ +/* +** 2001 September 15 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. This module is responsible for +** generating the code that loops through a table looking for applicable +** rows. Indices are selected and used to speed the search when doing +** so is applicable. Because this module is responsible for selecting +** indices, you might also think of this module as the "query optimizer". +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* +** Extra information appended to the end of sqlite3_index_info but not +** visible to the xBestIndex function, at least not directly. The +** sqlite3_vtab_collation() interface knows how to reach it, however. +** +** This object is not an API and can be changed from one release to the +** next. As long as allocateIndexInfo() and sqlite3_vtab_collation() +** agree on the structure, all will be well. +*/ +typedef struct HiddenIndexInfo HiddenIndexInfo; +struct HiddenIndexInfo { + WhereClause *pWC; /* The Where clause being analyzed */ + Parse *pParse; /* The parsing context */ + int eDistinct; /* Value to return from sqlite3_vtab_distinct() */ + u32 mIn; /* Mask of terms that are IN (...) */ + u32 mHandleIn; /* Terms that vtab will handle as IN (...) */ + sqlite3_value *aRhs[1]; /* RHS values for constraints. MUST BE LAST + ** because extra space is allocated to hold up + ** to nTerm such values */ +}; + +/* Forward declaration of methods */ +static int whereLoopResize(sqlite3*, WhereLoop*, int); + +/* +** Return the estimated number of output rows from a WHERE clause +*/ +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ + return pWInfo->nRowOut; +} + +/* +** Return one of the WHERE_DISTINCT_xxxxx values to indicate how this +** WHERE clause returns outputs for DISTINCT processing. +*/ +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){ + return pWInfo->eDistinct; +} + +/* +** Return the number of ORDER BY terms that are satisfied by the +** WHERE clause. A return of 0 means that the output must be +** completely sorted. A return equal to the number of ORDER BY +** terms means that no sorting is needed at all. A return that +** is positive but less than the number of ORDER BY terms means that +** block sorting is required. +*/ +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ + return pWInfo->nOBSat; +} + +/* +** In the ORDER BY LIMIT optimization, if the inner-most loop is known +** to emit rows in increasing order, and if the last row emitted by the +** inner-most loop did not fit within the sorter, then we can skip all +** subsequent rows for the current iteration of the inner loop (because they +** will not fit in the sorter either) and continue with the second inner +** loop - the loop immediately outside the inner-most. +** +** When a row does not fit in the sorter (because the sorter already +** holds LIMIT+OFFSET rows that are smaller), then a jump is made to the +** label returned by this function. +** +** If the ORDER BY LIMIT optimization applies, the jump destination should +** be the continuation for the second-inner-most loop. If the ORDER BY +** LIMIT optimization does not apply, then the jump destination should +** be the continuation for the inner-most loop. +** +** It is always safe for this routine to return the continuation of the +** inner-most loop, in the sense that a correct answer will result. +** Returning the continuation the second inner loop is an optimization +** that might make the code run a little faster, but should not change +** the final answer. +*/ +SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){ + WhereLevel *pInner; + if( !pWInfo->bOrderedInnerLoop ){ + /* The ORDER BY LIMIT optimization does not apply. Jump to the + ** continuation of the inner-most loop. */ + return pWInfo->iContinue; + } + pInner = &pWInfo->a[pWInfo->nLevel-1]; + assert( pInner->addrNxt!=0 ); + return pInner->pRJ ? pWInfo->iContinue : pInner->addrNxt; +} + +/* +** While generating code for the min/max optimization, after handling +** the aggregate-step call to min() or max(), check to see if any +** additional looping is required. If the output order is such that +** we are certain that the correct answer has already been found, then +** code an OP_Goto to by pass subsequent processing. +** +** Any extra OP_Goto that is coded here is an optimization. The +** correct answer should be obtained regardless. This OP_Goto just +** makes the answer appear faster. +*/ +SQLITE_PRIVATE void sqlite3WhereMinMaxOptEarlyOut(Vdbe *v, WhereInfo *pWInfo){ + WhereLevel *pInner; + int i; + if( !pWInfo->bOrderedInnerLoop ) return; + if( pWInfo->nOBSat==0 ) return; + for(i=pWInfo->nLevel-1; i>=0; i--){ + pInner = &pWInfo->a[i]; + if( (pInner->pWLoop->wsFlags & WHERE_COLUMN_IN)!=0 ){ + sqlite3VdbeGoto(v, pInner->addrNxt); + return; + } + } + sqlite3VdbeGoto(v, pWInfo->iBreak); +} + +/* +** Return the VDBE address or label to jump to in order to continue +** immediately with the next row of a WHERE clause. +*/ +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo *pWInfo){ + assert( pWInfo->iContinue!=0 ); + return pWInfo->iContinue; +} + +/* +** Return the VDBE address or label to jump to in order to break +** out of a WHERE loop. +*/ +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ + return pWInfo->iBreak; +} + +/* +** Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to +** operate directly on the rowids returned by a WHERE clause. Return +** ONEPASS_SINGLE (1) if the statement can operation directly because only +** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass +** optimization can be used on multiple +** +** If the ONEPASS optimization is used (if this routine returns true) +** then also write the indices of open cursors used by ONEPASS +** into aiCur[0] and aiCur[1]. iaCur[0] gets the cursor of the data +** table and iaCur[1] gets the cursor used by an auxiliary index. +** Either value may be -1, indicating that cursor is not used. +** Any cursors returned will have been opened for writing. +** +** aiCur[0] and aiCur[1] both get -1 if the where-clause logic is +** unable to use the ONEPASS optimization. +*/ +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ + memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2); +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace && pWInfo->eOnePass!=ONEPASS_OFF ){ + sqlite3DebugPrintf("%s cursors: %d %d\n", + pWInfo->eOnePass==ONEPASS_SINGLE ? "ONEPASS_SINGLE" : "ONEPASS_MULTI", + aiCur[0], aiCur[1]); + } +#endif + return pWInfo->eOnePass; +} + +/* +** Return TRUE if the WHERE loop uses the OP_DeferredSeek opcode to move +** the data cursor to the row selected by the index cursor. +*/ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo *pWInfo){ + return pWInfo->bDeferredSeek; +} + +/* +** Move the content of pSrc into pDest +*/ +static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ + pDest->n = pSrc->n; + memcpy(pDest->a, pSrc->a, pDest->n*sizeof(pDest->a[0])); +} + +/* +** Try to insert a new prerequisite/cost entry into the WhereOrSet pSet. +** +** The new entry might overwrite an existing entry, or it might be +** appended, or it might be discarded. Do whatever is the right thing +** so that pSet keeps the N_OR_COST best entries seen so far. +*/ +static int whereOrInsert( + WhereOrSet *pSet, /* The WhereOrSet to be updated */ + Bitmask prereq, /* Prerequisites of the new entry */ + LogEst rRun, /* Run-cost of the new entry */ + LogEst nOut /* Number of outputs for the new entry */ +){ + u16 i; + WhereOrCost *p; + for(i=pSet->n, p=pSet->a; i>0; i--, p++){ + if( rRun<=p->rRun && (prereq & p->prereq)==prereq ){ + goto whereOrInsert_done; + } + if( p->rRun<=rRun && (p->prereq & prereq)==p->prereq ){ + return 0; + } + } + if( pSet->na[pSet->n++]; + p->nOut = nOut; + }else{ + p = pSet->a; + for(i=1; in; i++){ + if( p->rRun>pSet->a[i].rRun ) p = pSet->a + i; + } + if( p->rRun<=rRun ) return 0; + } +whereOrInsert_done: + p->prereq = prereq; + p->rRun = rRun; + if( p->nOut>nOut ) p->nOut = nOut; + return 1; +} + +/* +** Return the bitmask for the given cursor number. Return 0 if +** iCursor is not in the set. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ + int i; + assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); + assert( pMaskSet->n>0 || pMaskSet->ix[0]<0 ); + assert( iCursor>=-1 ); + if( pMaskSet->ix[0]==iCursor ){ + return 1; + } + for(i=1; in; i++){ + if( pMaskSet->ix[i]==iCursor ){ + return MASKBIT(i); + } + } + return 0; +} + +/* Allocate memory that is automatically freed when pWInfo is freed. +*/ +SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte){ + WhereMemBlock *pBlock; + pBlock = sqlite3DbMallocRawNN(pWInfo->pParse->db, nByte+sizeof(*pBlock)); + if( pBlock ){ + pBlock->pNext = pWInfo->pMemToFree; + pBlock->sz = nByte; + pWInfo->pMemToFree = pBlock; + pBlock++; + } + return (void*)pBlock; +} +SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte){ + void *pNew = sqlite3WhereMalloc(pWInfo, nByte); + if( pNew && pOld ){ + WhereMemBlock *pOldBlk = (WhereMemBlock*)pOld; + pOldBlk--; + assert( pOldBlk->szsz); + } + return pNew; +} + +/* +** Create a new mask for cursor iCursor. +** +** There is one cursor per table in the FROM clause. The number of +** tables in the FROM clause is limited by a test early in the +** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[] +** array will never overflow. +*/ +static void createMask(WhereMaskSet *pMaskSet, int iCursor){ + assert( pMaskSet->n < ArraySize(pMaskSet->ix) ); + pMaskSet->ix[pMaskSet->n++] = iCursor; +} + +/* +** If the right-hand branch of the expression is a TK_COLUMN, then return +** a pointer to the right-hand branch. Otherwise, return NULL. +*/ +static Expr *whereRightSubexprIsColumn(Expr *p){ + p = sqlite3ExprSkipCollateAndLikely(p->pRight); + if( ALWAYS(p!=0) && p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ + return p; + } + return 0; +} + +/* +** Advance to the next WhereTerm that matches according to the criteria +** established when the pScan object was initialized by whereScanInit(). +** Return NULL if there are no more matching WhereTerms. +*/ +static WhereTerm *whereScanNext(WhereScan *pScan){ + int iCur; /* The cursor on the LHS of the term */ + i16 iColumn; /* The column on the LHS of the term. -1 for IPK */ + Expr *pX; /* An expression being tested */ + WhereClause *pWC; /* Shorthand for pScan->pWC */ + WhereTerm *pTerm; /* The term being tested */ + int k = pScan->k; /* Where to start scanning */ + + assert( pScan->iEquiv<=pScan->nEquiv ); + pWC = pScan->pWC; + while(1){ + iColumn = pScan->aiColumn[pScan->iEquiv-1]; + iCur = pScan->aiCur[pScan->iEquiv-1]; + assert( pWC!=0 ); + assert( iCur>=0 ); + do{ + for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 || pTerm->leftCursor<0 ); + if( pTerm->leftCursor==iCur + && pTerm->u.x.leftColumn==iColumn + && (iColumn!=XN_EXPR + || sqlite3ExprCompareSkip(pTerm->pExpr->pLeft, + pScan->pIdxExpr,iCur)==0) + && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_OuterON)) + ){ + if( (pTerm->eOperator & WO_EQUIV)!=0 + && pScan->nEquivaiCur) + && (pX = whereRightSubexprIsColumn(pTerm->pExpr))!=0 + ){ + int j; + for(j=0; jnEquiv; j++){ + if( pScan->aiCur[j]==pX->iTable + && pScan->aiColumn[j]==pX->iColumn ){ + break; + } + } + if( j==pScan->nEquiv ){ + pScan->aiCur[j] = pX->iTable; + pScan->aiColumn[j] = pX->iColumn; + pScan->nEquiv++; + } + } + if( (pTerm->eOperator & pScan->opMask)!=0 ){ + /* Verify the affinity and collating sequence match */ + if( pScan->zCollName && (pTerm->eOperator & WO_ISNULL)==0 ){ + CollSeq *pColl; + Parse *pParse = pWC->pWInfo->pParse; + pX = pTerm->pExpr; + if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ + continue; + } + assert(pX->pLeft); + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + if( pColl==0 ) pColl = pParse->db->pDfltColl; + if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ + continue; + } + } + if( (pTerm->eOperator & (WO_EQ|WO_IS))!=0 + && (pX = pTerm->pExpr->pRight, ALWAYS(pX!=0)) + && pX->op==TK_COLUMN + && pX->iTable==pScan->aiCur[0] + && pX->iColumn==pScan->aiColumn[0] + ){ + testcase( pTerm->eOperator & WO_IS ); + continue; + } + pScan->pWC = pWC; + pScan->k = k+1; +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace & 0x20000 ){ + int ii; + sqlite3DebugPrintf("SCAN-TERM %p: nEquiv=%d", + pTerm, pScan->nEquiv); + for(ii=0; iinEquiv; ii++){ + sqlite3DebugPrintf(" {%d:%d}", + pScan->aiCur[ii], pScan->aiColumn[ii]); + } + sqlite3DebugPrintf("\n"); + } +#endif + return pTerm; + } + } + } + pWC = pWC->pOuter; + k = 0; + }while( pWC!=0 ); + if( pScan->iEquiv>=pScan->nEquiv ) break; + pWC = pScan->pOrigWC; + k = 0; + pScan->iEquiv++; + } + return 0; +} + +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + +/* +** Initialize a WHERE clause scanner object. Return a pointer to the +** first match. Return NULL if there are no matches. +** +** The scanner will be searching the WHERE clause pWC. It will look +** for terms of the form "X " where X is column iColumn of table +** iCur. Or if pIdx!=0 then X is column iColumn of index pIdx. pIdx +** must be one of the indexes of table iCur. +** +** The must be one of the operators described by opMask. +** +** If the search is for X and the WHERE clause contains terms of the +** form X=Y then this routine might also return terms of the form +** "Y ". The number of levels of transitivity is limited, +** but is enough to handle most commonly occurring SQL statements. +** +** If X is not the INTEGER PRIMARY KEY then X must be compatible with +** index pIdx. +*/ +static WhereTerm *whereScanInit( + WhereScan *pScan, /* The WhereScan object being initialized */ + WhereClause *pWC, /* The WHERE clause to be scanned */ + int iCur, /* Cursor to scan for */ + int iColumn, /* Column to scan for */ + u32 opMask, /* Operator(s) to scan for */ + Index *pIdx /* Must be compatible with this index */ +){ + pScan->pOrigWC = pWC; + pScan->pWC = pWC; + pScan->pIdxExpr = 0; + pScan->idxaff = 0; + pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; + if( pIdx ){ + int j = iColumn; + iColumn = pIdx->aiColumn[j]; + if( iColumn==pIdx->pTable->iPKey ){ + iColumn = XN_ROWID; + }else if( iColumn>=0 ){ + pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; + pScan->zCollName = pIdx->azColl[j]; + }else if( iColumn==XN_EXPR ){ + pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); + } + }else if( iColumn==XN_EXPR ){ + return 0; + } + pScan->aiColumn[0] = iColumn; + return whereScanNext(pScan); +} + +/* +** Search for a term in the WHERE clause that is of the form "X " +** where X is a reference to the iColumn of table iCur or of index pIdx +** if pIdx!=0 and is one of the WO_xx operator codes specified by +** the op parameter. Return a pointer to the term. Return 0 if not found. +** +** If pIdx!=0 then it must be one of the indexes of table iCur. +** Search for terms matching the iColumn-th column of pIdx +** rather than the iColumn-th column of table iCur. +** +** The term returned might by Y= if there is another constraint in +** the WHERE clause that specifies that X=Y. Any such constraints will be +** identified by the WO_EQUIV bit in the pTerm->eOperator field. The +** aiCur[]/iaColumn[] arrays hold X and all its equivalents. There are 11 +** slots in aiCur[]/aiColumn[] so that means we can look for X plus up to 10 +** other equivalent values. Hence a search for X will return if X=A1 +** and A1=A2 and A2=A3 and ... and A9=A10 and A10=. +** +** If there are multiple terms in the WHERE clause of the form "X " +** then try for the one with no dependencies on - in other words where +** is a constant expression of some kind. Only return entries of +** the form "X Y" where Y is a column in another table if no terms of +** the form "X " exist. If no terms with a constant RHS +** exist, try to return a term that does not use WO_EQUIV. +*/ +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +){ + WhereTerm *pResult = 0; + WhereTerm *p; + WhereScan scan; + + p = whereScanInit(&scan, pWC, iCur, iColumn, op, pIdx); + op &= WO_EQ|WO_IS; + while( p ){ + if( (p->prereqRight & notReady)==0 ){ + if( p->prereqRight==0 && (p->eOperator&op)!=0 ){ + testcase( p->eOperator & WO_IS ); + return p; + } + if( pResult==0 ) pResult = p; + } + p = whereScanNext(&scan); + } + return pResult; +} + +/* +** This function searches pList for an entry that matches the iCol-th column +** of index pIdx. +** +** If such an expression is found, its index in pList->a[] is returned. If +** no expression is found, -1 is returned. +*/ +static int findIndexCol( + Parse *pParse, /* Parse context */ + ExprList *pList, /* Expression list to search */ + int iBase, /* Cursor for table associated with pIdx */ + Index *pIdx, /* Index to match column of */ + int iCol /* Column of index to match */ +){ + int i; + const char *zColl = pIdx->azColl[iCol]; + + for(i=0; inExpr; i++){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr); + if( ALWAYS(p!=0) + && (p->op==TK_COLUMN || p->op==TK_AGG_COLUMN) + && p->iColumn==pIdx->aiColumn[iCol] + && p->iTable==iBase + ){ + CollSeq *pColl = sqlite3ExprNNCollSeq(pParse, pList->a[i].pExpr); + if( 0==sqlite3StrICmp(pColl->zName, zColl) ){ + return i; + } + } + } + + return -1; +} + +/* +** Return TRUE if the iCol-th column of index pIdx is NOT NULL +*/ +static int indexColumnNotNull(Index *pIdx, int iCol){ + int j; + assert( pIdx!=0 ); + assert( iCol>=0 && iColnColumn ); + j = pIdx->aiColumn[iCol]; + if( j>=0 ){ + return pIdx->pTable->aCol[j].notNull; + }else if( j==(-1) ){ + return 1; + }else{ + assert( j==(-2) ); + return 0; /* Assume an indexed expression can always yield a NULL */ + + } +} + +/* +** Return true if the DISTINCT expression-list passed as the third argument +** is redundant. +** +** A DISTINCT list is redundant if any subset of the columns in the +** DISTINCT list are collectively unique and individually non-null. +*/ +static int isDistinctRedundant( + Parse *pParse, /* Parsing context */ + SrcList *pTabList, /* The FROM clause */ + WhereClause *pWC, /* The WHERE clause */ + ExprList *pDistinct /* The result set that needs to be DISTINCT */ +){ + Table *pTab; + Index *pIdx; + int i; + int iBase; + + /* If there is more than one table or sub-select in the FROM clause of + ** this query, then it will not be possible to show that the DISTINCT + ** clause is redundant. */ + if( pTabList->nSrc!=1 ) return 0; + iBase = pTabList->a[0].iCursor; + pTab = pTabList->a[0].pTab; + + /* If any of the expressions is an IPK column on table iBase, then return + ** true. Note: The (p->iTable==iBase) part of this test may be false if the + ** current SELECT is a correlated sub-query. + */ + for(i=0; inExpr; i++){ + Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr); + if( NEVER(p==0) ) continue; + if( p->op!=TK_COLUMN && p->op!=TK_AGG_COLUMN ) continue; + if( p->iTable==iBase && p->iColumn<0 ) return 1; + } + + /* Loop through all indices on the table, checking each to see if it makes + ** the DISTINCT qualifier redundant. It does so if: + ** + ** 1. The index is itself UNIQUE, and + ** + ** 2. All of the columns in the index are either part of the pDistinct + ** list, or else the WHERE clause contains a term of the form "col=X", + ** where X is a constant value. The collation sequences of the + ** comparison and select-list expressions must match those of the index. + ** + ** 3. All of those index columns for which the WHERE clause does not + ** contain a "col=X" term are subject to a NOT NULL constraint. + */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( !IsUniqueIndex(pIdx) ) continue; + if( pIdx->pPartIdxWhere ) continue; + for(i=0; inKeyCol; i++){ + if( 0==sqlite3WhereFindTerm(pWC, iBase, i, ~(Bitmask)0, WO_EQ, pIdx) ){ + if( findIndexCol(pParse, pDistinct, iBase, pIdx, i)<0 ) break; + if( indexColumnNotNull(pIdx, i)==0 ) break; + } + } + if( i==pIdx->nKeyCol ){ + /* This index implies that the DISTINCT qualifier is redundant. */ + return 1; + } + } + + return 0; +} + + +/* +** Estimate the logarithm of the input value to base 2. +*/ +static LogEst estLog(LogEst N){ + return N<=10 ? 0 : sqlite3LogEst(N) - 33; +} + +/* +** Convert OP_Column opcodes to OP_Copy in previously generated code. +** +** This routine runs over generated VDBE code and translates OP_Column +** opcodes into OP_Copy when the table is being accessed via co-routine +** instead of via table lookup. +** +** If the iAutoidxCur is not zero, then any OP_Rowid instructions on +** cursor iTabCur are transformed into OP_Sequence opcode for the +** iAutoidxCur cursor, in order to generate unique rowids for the +** automatic index being generated. +*/ +static void translateColumnToCopy( + Parse *pParse, /* Parsing context */ + int iStart, /* Translate from this opcode to the end */ + int iTabCur, /* OP_Column/OP_Rowid references to this table */ + int iRegister, /* The first column is in this register */ + int iAutoidxCur /* If non-zero, cursor of autoindex being generated */ +){ + Vdbe *v = pParse->pVdbe; + VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); + int iEnd = sqlite3VdbeCurrentAddr(v); + if( pParse->db->mallocFailed ) return; + for(; iStartp1!=iTabCur ) continue; + if( pOp->opcode==OP_Column ){ + pOp->opcode = OP_Copy; + pOp->p1 = pOp->p2 + iRegister; + pOp->p2 = pOp->p3; + pOp->p3 = 0; + pOp->p5 = 2; /* Cause the MEM_Subtype flag to be cleared */ + }else if( pOp->opcode==OP_Rowid ){ + pOp->opcode = OP_Sequence; + pOp->p1 = iAutoidxCur; +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + if( iAutoidxCur==0 ){ + pOp->opcode = OP_Null; + pOp->p3 = 0; + } +#endif + } + } +} + +/* +** Two routines for printing the content of an sqlite3_index_info +** structure. Used for testing and debugging only. If neither +** SQLITE_TEST or SQLITE_DEBUG are defined, then these routines +** are no-ops. +*/ +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) +static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ + int i; + if( !sqlite3WhereTrace ) return; + for(i=0; inConstraint; i++){ + sqlite3DebugPrintf( + " constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n", + i, + p->aConstraint[i].iColumn, + p->aConstraint[i].iTermOffset, + p->aConstraint[i].op, + p->aConstraint[i].usable, + sqlite3_vtab_collation(p,i)); + } + for(i=0; inOrderBy; i++){ + sqlite3DebugPrintf(" orderby[%d]: col=%d desc=%d\n", + i, + p->aOrderBy[i].iColumn, + p->aOrderBy[i].desc); + } +} +static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ + int i; + if( !sqlite3WhereTrace ) return; + for(i=0; inConstraint; i++){ + sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n", + i, + p->aConstraintUsage[i].argvIndex, + p->aConstraintUsage[i].omit); + } + sqlite3DebugPrintf(" idxNum=%d\n", p->idxNum); + sqlite3DebugPrintf(" idxStr=%s\n", p->idxStr); + sqlite3DebugPrintf(" orderByConsumed=%d\n", p->orderByConsumed); + sqlite3DebugPrintf(" estimatedCost=%g\n", p->estimatedCost); + sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows); +} +#else +#define whereTraceIndexInfoInputs(A) +#define whereTraceIndexInfoOutputs(A) +#endif + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Return TRUE if the WHERE clause term pTerm is of a form where it +** could be used with an index to access pSrc, assuming an appropriate +** index existed. +*/ +static int termCanDriveIndex( + const WhereTerm *pTerm, /* WHERE clause term to check */ + const SrcItem *pSrc, /* Table we are trying to access */ + const Bitmask notReady /* Tables in outer loops of the join */ +){ + char aff; + if( pTerm->leftCursor!=pSrc->iCursor ) return 0; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; + assert( (pSrc->fg.jointype & JT_RIGHT)==0 ); + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + return 0; /* See tag-20191211-001 */ + } + } + if( (pTerm->prereqRight & notReady)!=0 ) return 0; + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + if( pTerm->u.x.leftColumn<0 ) return 0; + aff = pSrc->pTab->aCol[pTerm->u.x.leftColumn].affinity; + if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0; + testcase( pTerm->pExpr->op==TK_IS ); + return 1; +} +#endif + + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Generate code to construct the Index object for an automatic index +** and to set up the WhereLevel object pLevel so that the code generator +** makes use of the automatic index. +*/ +static SQLITE_NOINLINE void constructAutomaticIndex( + Parse *pParse, /* The parsing context */ + const WhereClause *pWC, /* The WHERE clause */ + const SrcItem *pSrc, /* The FROM clause term to get the next index */ + const Bitmask notReady, /* Mask of cursors that are not available */ + WhereLevel *pLevel /* Write new index here */ +){ + int nKeyCol; /* Number of columns in the constructed index */ + WhereTerm *pTerm; /* A single term of the WHERE clause */ + WhereTerm *pWCEnd; /* End of pWC->a[] */ + Index *pIdx; /* Object describing the transient index */ + Vdbe *v; /* Prepared statement under construction */ + int addrInit; /* Address of the initialization bypass jump */ + Table *pTable; /* The table being indexed */ + int addrTop; /* Top of the index fill loop */ + int regRecord; /* Register holding an index record */ + int n; /* Column counter */ + int i; /* Loop counter */ + int mxBitCol; /* Maximum column in pSrc->colUsed */ + CollSeq *pColl; /* Collating sequence to on a column */ + WhereLoop *pLoop; /* The Loop object */ + char *zNotUsed; /* Extra space on the end of pIdx */ + Bitmask idxCols; /* Bitmap of columns used for indexing */ + Bitmask extraCols; /* Bitmap of additional columns */ + u8 sentWarning = 0; /* True if a warnning has been issued */ + Expr *pPartial = 0; /* Partial Index Expression */ + int iContinue = 0; /* Jump here to skip excluded rows */ + SrcItem *pTabItem; /* FROM clause term being indexed */ + int addrCounter = 0; /* Address where integer counter is initialized */ + int regBase; /* Array of registers where record is assembled */ + + /* Generate code to skip over the creation and initialization of the + ** transient index on 2nd and subsequent iterations of the loop. */ + v = pParse->pVdbe; + assert( v!=0 ); + addrInit = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + + /* Count the number of columns that will be added to the index + ** and used to match WHERE clause constraints */ + nKeyCol = 0; + pTable = pSrc->pTab; + pWCEnd = &pWC->a[pWC->nTerm]; + pLoop = pLevel->pWLoop; + idxCols = 0; + for(pTerm=pWC->a; pTermpExpr; + /* Make the automatic index a partial index if there are terms in the + ** WHERE clause (or the ON clause of a LEFT join) that constrain which + ** rows of the target table (pSrc) that can be used. */ + if( (pTerm->wtFlags & TERM_VIRTUAL)==0 + && sqlite3ExprIsTableConstraint(pExpr, pSrc) + ){ + pPartial = sqlite3ExprAnd(pParse, pPartial, + sqlite3ExprDup(pParse->db, pExpr, 0)); + } + if( termCanDriveIndex(pTerm, pSrc, notReady) ){ + int iCol; + Bitmask cMask; + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + iCol = pTerm->u.x.leftColumn; + cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol); + testcase( iCol==BMS ); + testcase( iCol==BMS-1 ); + if( !sentWarning ){ + sqlite3_log(SQLITE_WARNING_AUTOINDEX, + "automatic index on %s(%s)", pTable->zName, + pTable->aCol[iCol].zCnName); + sentWarning = 1; + } + if( (idxCols & cMask)==0 ){ + if( whereLoopResize(pParse->db, pLoop, nKeyCol+1) ){ + goto end_auto_index_create; + } + pLoop->aLTerm[nKeyCol++] = pTerm; + idxCols |= cMask; + } + } + } + assert( nKeyCol>0 || pParse->db->mallocFailed ); + pLoop->u.btree.nEq = pLoop->nLTerm = nKeyCol; + pLoop->wsFlags = WHERE_COLUMN_EQ | WHERE_IDX_ONLY | WHERE_INDEXED + | WHERE_AUTO_INDEX; + + /* Count the number of additional columns needed to create a + ** covering index. A "covering index" is an index that contains all + ** columns that are needed by the query. With a covering index, the + ** original table never needs to be accessed. Automatic indices must + ** be a covering index because the index will not be updated if the + ** original table changes and the index and table cannot both be used + ** if they go out of sync. + */ + extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1)); + mxBitCol = MIN(BMS-1,pTable->nCol); + testcase( pTable->nCol==BMS-1 ); + testcase( pTable->nCol==BMS-2 ); + for(i=0; icolUsed & MASKBIT(BMS-1) ){ + nKeyCol += pTable->nCol - BMS + 1; + } + + /* Construct the Index object to describe this index */ + pIdx = sqlite3AllocateIndexObject(pParse->db, nKeyCol+1, 0, &zNotUsed); + if( pIdx==0 ) goto end_auto_index_create; + pLoop->u.btree.pIndex = pIdx; + pIdx->zName = "auto-index"; + pIdx->pTable = pTable; + n = 0; + idxCols = 0; + for(pTerm=pWC->a; pTermeOperator & (WO_OR|WO_AND))==0 ); + iCol = pTerm->u.x.leftColumn; + cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol); + testcase( iCol==BMS-1 ); + testcase( iCol==BMS ); + if( (idxCols & cMask)==0 ){ + Expr *pX = pTerm->pExpr; + idxCols |= cMask; + pIdx->aiColumn[n] = pTerm->u.x.leftColumn; + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */ + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; + n++; + } + } + } + assert( (u32)n==pLoop->u.btree.nEq ); + + /* Add additional columns needed to make the automatic index into + ** a covering index */ + for(i=0; iaiColumn[n] = i; + pIdx->azColl[n] = sqlite3StrBINARY; + n++; + } + } + if( pSrc->colUsed & MASKBIT(BMS-1) ){ + for(i=BMS-1; inCol; i++){ + pIdx->aiColumn[n] = i; + pIdx->azColl[n] = sqlite3StrBINARY; + n++; + } + } + assert( n==nKeyCol ); + pIdx->aiColumn[n] = XN_ROWID; + pIdx->azColl[n] = sqlite3StrBINARY; + + /* Create the automatic index */ + assert( pLevel->iIdxCur>=0 ); + pLevel->iIdxCur = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "for %s", pTable->zName)); + if( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) ){ + pLevel->regFilter = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Blob, 10000, pLevel->regFilter); + } + + /* Fill the automatic index with content */ + pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield); + VdbeCoverage(v); + VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); + }else{ + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); + } + if( pPartial ){ + iContinue = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); + pLoop->wsFlags |= WHERE_PARTIALIDX; + } + regRecord = sqlite3GetTempReg(pParse); + regBase = sqlite3GenerateIndexKey( + pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0 + ); + if( pLevel->regFilter ){ + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, + regBase, pLoop->u.btree.nEq); + } + sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue); + if( pTabItem->fg.viaCoroutine ){ + sqlite3VdbeChangeP2(v, addrCounter, regBase+n); + testcase( pParse->db->mallocFailed ); + assert( pLevel->iIdxCur>0 ); + translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, + pTabItem->regResult, pLevel->iIdxCur); + sqlite3VdbeGoto(v, addrTop); + pTabItem->fg.viaCoroutine = 0; + }else{ + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); + } + sqlite3VdbeJumpHere(v, addrTop); + sqlite3ReleaseTempReg(pParse, regRecord); + + /* Jump here when skipping the initialization */ + sqlite3VdbeJumpHere(v, addrInit); + +end_auto_index_create: + sqlite3ExprDelete(pParse->db, pPartial); +} +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + +/* +** Generate bytecode that will initialize a Bloom filter that is appropriate +** for pLevel. +** +** If there are inner loops within pLevel that have the WHERE_BLOOMFILTER +** flag set, initialize a Bloomfilter for them as well. Except don't do +** this recursive initialization if the SQLITE_BloomPulldown optimization has +** been turned off. +** +** When the Bloom filter is initialized, the WHERE_BLOOMFILTER flag is cleared +** from the loop, but the regFilter value is set to a register that implements +** the Bloom filter. When regFilter is positive, the +** sqlite3WhereCodeOneLoopStart() will generate code to test the Bloom filter +** and skip the subsequence B-Tree seek if the Bloom filter indicates that +** no matching rows exist. +** +** This routine may only be called if it has previously been determined that +** the loop would benefit from a Bloom filter, and the WHERE_BLOOMFILTER bit +** is set. +*/ +static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( + WhereInfo *pWInfo, /* The WHERE clause */ + int iLevel, /* Index in pWInfo->a[] that is pLevel */ + WhereLevel *pLevel, /* Make a Bloom filter for this FROM term */ + Bitmask notReady /* Loops that are not ready */ +){ + int addrOnce; /* Address of opening OP_Once */ + int addrTop; /* Address of OP_Rewind */ + int addrCont; /* Jump here to skip a row */ + const WhereTerm *pTerm; /* For looping over WHERE clause terms */ + const WhereTerm *pWCEnd; /* Last WHERE clause term */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + Vdbe *v = pParse->pVdbe; /* VDBE under construction */ + WhereLoop *pLoop = pLevel->pWLoop; /* The loop being coded */ + int iCur; /* Cursor for table getting the filter */ + + assert( pLoop!=0 ); + assert( v!=0 ); + assert( pLoop->wsFlags & WHERE_BLOOMFILTER ); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + do{ + const SrcItem *pItem; + const Table *pTab; + u64 sz; + sqlite3WhereExplainBloomFilter(pParse, pWInfo, pLevel); + addrCont = sqlite3VdbeMakeLabel(pParse); + iCur = pLevel->iTabCur; + pLevel->regFilter = ++pParse->nMem; + + /* The Bloom filter is a Blob held in a register. Initialize it + ** to zero-filled blob of at least 80K bits, but maybe more if the + ** estimated size of the table is larger. We could actually + ** measure the size of the table at run-time using OP_Count with + ** P3==1 and use that value to initialize the blob. But that makes + ** testing complicated. By basing the blob size on the value in the + ** sqlite_stat1 table, testing is much easier. + */ + pItem = &pWInfo->pTabList->a[pLevel->iFrom]; + assert( pItem!=0 ); + pTab = pItem->pTab; + assert( pTab!=0 ); + sz = sqlite3LogEstToInt(pTab->nRowLogEst); + if( sz<10000 ){ + sz = 10000; + }else if( sz>10000000 ){ + sz = 10000000; + } + sqlite3VdbeAddOp2(v, OP_Blob, (int)sz, pLevel->regFilter); + + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + pWCEnd = &pWInfo->sWC.a[pWInfo->sWC.nTerm]; + for(pTerm=pWInfo->sWC.a; pTermpExpr; + if( (pTerm->wtFlags & TERM_VIRTUAL)==0 + && sqlite3ExprIsTableConstraint(pExpr, pItem) + ){ + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + } + } + if( pLoop->wsFlags & WHERE_IPK ){ + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, r1); + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, 1); + sqlite3ReleaseTempReg(pParse, r1); + }else{ + Index *pIdx = pLoop->u.btree.pIndex; + int n = pLoop->u.btree.nEq; + int r1 = sqlite3GetTempRange(pParse, n); + int jj; + for(jj=0; jjaiColumn[jj]; + assert( pIdx->pTable==pItem->pTab ); + sqlite3ExprCodeGetColumnOfTable(v, pIdx->pTable, iCur, iCol,r1+jj); + } + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, n); + sqlite3ReleaseTempRange(pParse, r1, n); + } + sqlite3VdbeResolveLabel(v, addrCont); + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrTop); + pLoop->wsFlags &= ~WHERE_BLOOMFILTER; + if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break; + while( ++iLevel < pWInfo->nLevel ){ + const SrcItem *pTabItem; + pLevel = &pWInfo->a[iLevel]; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ) ) continue; + pLoop = pLevel->pWLoop; + if( NEVER(pLoop==0) ) continue; + if( pLoop->prereq & notReady ) continue; + if( (pLoop->wsFlags & (WHERE_BLOOMFILTER|WHERE_COLUMN_IN)) + ==WHERE_BLOOMFILTER + ){ + /* This is a candidate for bloom-filter pull-down (early evaluation). + ** The test that WHERE_COLUMN_IN is omitted is important, as we are + ** not able to do early evaluation of bloom filters that make use of + ** the IN operator */ + break; + } + } + }while( iLevel < pWInfo->nLevel ); + sqlite3VdbeJumpHere(v, addrOnce); +} + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Allocate and populate an sqlite3_index_info structure. It is the +** responsibility of the caller to eventually release the structure +** by passing the pointer returned by this function to freeIndexInfo(). +*/ +static sqlite3_index_info *allocateIndexInfo( + WhereInfo *pWInfo, /* The WHERE clause */ + WhereClause *pWC, /* The WHERE clause being analyzed */ + Bitmask mUnusable, /* Ignore terms with these prereqs */ + SrcItem *pSrc, /* The FROM clause term that is the vtab */ + u16 *pmNoOmit /* Mask of terms not to omit */ +){ + int i, j; + int nTerm; + Parse *pParse = pWInfo->pParse; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_orderby *pIdxOrderBy; + struct sqlite3_index_constraint_usage *pUsage; + struct HiddenIndexInfo *pHidden; + WhereTerm *pTerm; + int nOrderBy; + sqlite3_index_info *pIdxInfo; + u16 mNoOmit = 0; + const Table *pTab; + int eDistinct = 0; + ExprList *pOrderBy = pWInfo->pOrderBy; + + assert( pSrc!=0 ); + pTab = pSrc->pTab; + assert( pTab!=0 ); + assert( IsVirtual(pTab) ); + + /* Find all WHERE clause constraints referring to this virtual table. + ** Mark each term with the TERM_OK flag. Set nTerm to the number of + ** terms found. + */ + for(i=nTerm=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + pTerm->wtFlags &= ~TERM_OK; + if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; + assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); + testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_IS ); + testcase( pTerm->eOperator & WO_ALL ); + if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; + if( pTerm->wtFlags & TERM_VNULL ) continue; + + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + assert( pTerm->u.x.leftColumn>=XN_ROWID ); + assert( pTerm->u.x.leftColumnnCol ); + + /* tag-20191211-002: WHERE-clause constraints are not useful to the + ** right-hand table of a LEFT JOIN nor to the either table of a + ** RIGHT JOIN. See tag-20191211-001 for the + ** equivalent restriction for ordinary tables. */ + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + continue; + } + } + nTerm++; + pTerm->wtFlags |= TERM_OK; + } + + /* If the ORDER BY clause contains only columns in the current + ** virtual table then allocate space for the aOrderBy part of + ** the sqlite3_index_info structure. + */ + nOrderBy = 0; + if( pOrderBy ){ + int n = pOrderBy->nExpr; + for(i=0; ia[i].pExpr; + Expr *pE2; + + /* Skip over constant terms in the ORDER BY clause */ + if( sqlite3ExprIsConstant(pExpr) ){ + continue; + } + + /* Virtual tables are unable to deal with NULLS FIRST */ + if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break; + + /* First case - a direct column references without a COLLATE operator */ + if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){ + assert( pExpr->iColumn>=XN_ROWID && pExpr->iColumnnCol ); + continue; + } + + /* 2nd case - a column reference with a COLLATE operator. Only match + ** of the COLLATE operator matches the collation of the column. */ + if( pExpr->op==TK_COLLATE + && (pE2 = pExpr->pLeft)->op==TK_COLUMN + && pE2->iTable==pSrc->iCursor + ){ + const char *zColl; /* The collating sequence name */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( pExpr->u.zToken!=0 ); + assert( pE2->iColumn>=XN_ROWID && pE2->iColumnnCol ); + pExpr->iColumn = pE2->iColumn; + if( pE2->iColumn<0 ) continue; /* Collseq does not matter for rowid */ + zColl = sqlite3ColumnColl(&pTab->aCol[pE2->iColumn]); + if( zColl==0 ) zColl = sqlite3StrBINARY; + if( sqlite3_stricmp(pExpr->u.zToken, zColl)==0 ) continue; + } + + /* No matches cause a break out of the loop */ + break; + } + if( i==n ){ + nOrderBy = n; + if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){ + eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0); + }else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){ + eDistinct = 1; + } + } + } + + /* Allocate the sqlite3_index_info structure + */ + pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo) + + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm + + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) + + sizeof(sqlite3_value*)*nTerm ); + if( pIdxInfo==0 ){ + sqlite3ErrorMsg(pParse, "out of memory"); + return 0; + } + pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1]; + pIdxCons = (struct sqlite3_index_constraint*)&pHidden->aRhs[nTerm]; + pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; + pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; + pIdxInfo->aConstraint = pIdxCons; + pIdxInfo->aOrderBy = pIdxOrderBy; + pIdxInfo->aConstraintUsage = pUsage; + pHidden->pWC = pWC; + pHidden->pParse = pParse; + pHidden->eDistinct = eDistinct; + pHidden->mIn = 0; + for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + u16 op; + if( (pTerm->wtFlags & TERM_OK)==0 ) continue; + pIdxCons[j].iColumn = pTerm->u.x.leftColumn; + pIdxCons[j].iTermOffset = i; + op = pTerm->eOperator & WO_ALL; + if( op==WO_IN ){ + if( (pTerm->wtFlags & TERM_SLICE)==0 ){ + pHidden->mIn |= SMASKBIT32(j); + } + op = WO_EQ; + } + if( op==WO_AUX ){ + pIdxCons[j].op = pTerm->eMatchOp; + }else if( op & (WO_ISNULL|WO_IS) ){ + if( op==WO_ISNULL ){ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_ISNULL; + }else{ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_IS; + } + }else{ + pIdxCons[j].op = (u8)op; + /* The direct assignment in the previous line is possible only because + ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The + ** following asserts verify this fact. */ + assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); + assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); + assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); + assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); + assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); + assert( pTerm->eOperator&(WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_AUX) ); + + if( op & (WO_LT|WO_LE|WO_GT|WO_GE) + && sqlite3ExprIsVector(pTerm->pExpr->pRight) + ){ + testcase( j!=i ); + if( j<16 ) mNoOmit |= (1 << j); + if( op==WO_LT ) pIdxCons[j].op = WO_LE; + if( op==WO_GT ) pIdxCons[j].op = WO_GE; + } + } + + j++; + } + assert( j==nTerm ); + pIdxInfo->nConstraint = j; + for(i=j=0; ia[i].pExpr; + if( sqlite3ExprIsConstant(pExpr) ) continue; + assert( pExpr->op==TK_COLUMN + || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN + && pExpr->iColumn==pExpr->pLeft->iColumn) ); + pIdxOrderBy[j].iColumn = pExpr->iColumn; + pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC; + j++; + } + pIdxInfo->nOrderBy = j; + + *pmNoOmit = mNoOmit; + return pIdxInfo; +} + +/* +** Free an sqlite3_index_info structure allocated by allocateIndexInfo() +** and possibly modified by xBestIndex methods. +*/ +static void freeIndexInfo(sqlite3 *db, sqlite3_index_info *pIdxInfo){ + HiddenIndexInfo *pHidden; + int i; + assert( pIdxInfo!=0 ); + pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + assert( pHidden->pParse!=0 ); + assert( pHidden->pParse->db==db ); + for(i=0; inConstraint; i++){ + sqlite3ValueFree(pHidden->aRhs[i]); /* IMP: R-14553-25174 */ + pHidden->aRhs[i] = 0; + } + sqlite3DbFree(db, pIdxInfo); +} + +/* +** The table object reference passed as the second argument to this function +** must represent a virtual table. This function invokes the xBestIndex() +** method of the virtual table with the sqlite3_index_info object that +** comes in as the 3rd argument to this function. +** +** If an error occurs, pParse is populated with an error message and an +** appropriate error code is returned. A return of SQLITE_CONSTRAINT from +** xBestIndex is not considered an error. SQLITE_CONSTRAINT indicates that +** the current configuration of "unusable" flags in sqlite3_index_info can +** not result in a valid plan. +** +** Whether or not an error is returned, it is the responsibility of the +** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates +** that this is required. +*/ +static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ + sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; + int rc; + + whereTraceIndexInfoInputs(p); + pParse->db->nSchemaLock++; + rc = pVtab->pModule->xBestIndex(pVtab, p); + pParse->db->nSchemaLock--; + whereTraceIndexInfoOutputs(p); + + if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ + if( rc==SQLITE_NOMEM ){ + sqlite3OomFault(pParse->db); + }else if( !pVtab->zErrMsg ){ + sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc)); + }else{ + sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg); + } + } + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + return rc; +} +#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Estimate the location of a particular key among all keys in an +** index. Store the results in aStat as follows: +** +** aStat[0] Est. number of rows less than pRec +** aStat[1] Est. number of rows equal to pRec +** +** Return the index of the sample that is the smallest sample that +** is greater than or equal to pRec. Note that this index is not an index +** into the aSample[] array - it is an index into a virtual set of samples +** based on the contents of aSample[] and the number of fields in record +** pRec. +*/ +static int whereKeyStats( + Parse *pParse, /* Database connection */ + Index *pIdx, /* Index to consider domain of */ + UnpackedRecord *pRec, /* Vector of values to consider */ + int roundUp, /* Round up if true. Round down if false */ + tRowcnt *aStat /* OUT: stats written here */ +){ + IndexSample *aSample = pIdx->aSample; + int iCol; /* Index of required stats in anEq[] etc. */ + int i; /* Index of first sample >= pRec */ + int iSample; /* Smallest sample larger than or equal to pRec */ + int iMin = 0; /* Smallest sample not yet tested */ + int iTest; /* Next sample to test */ + int res; /* Result of comparison operation */ + int nField; /* Number of fields in pRec */ + tRowcnt iLower = 0; /* anLt[] + anEq[] of largest sample pRec is > */ + +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER( pParse ); +#endif + assert( pRec!=0 ); + assert( pIdx->nSample>0 ); + assert( pRec->nField>0 ); + + /* Do a binary search to find the first sample greater than or equal + ** to pRec. If pRec contains a single field, the set of samples to search + ** is simply the aSample[] array. If the samples in aSample[] contain more + ** than one fields, all fields following the first are ignored. + ** + ** If pRec contains N fields, where N is more than one, then as well as the + ** samples in aSample[] (truncated to N fields), the search also has to + ** consider prefixes of those samples. For example, if the set of samples + ** in aSample is: + ** + ** aSample[0] = (a, 5) + ** aSample[1] = (a, 10) + ** aSample[2] = (b, 5) + ** aSample[3] = (c, 100) + ** aSample[4] = (c, 105) + ** + ** Then the search space should ideally be the samples above and the + ** unique prefixes [a], [b] and [c]. But since that is hard to organize, + ** the code actually searches this set: + ** + ** 0: (a) + ** 1: (a, 5) + ** 2: (a, 10) + ** 3: (a, 10) + ** 4: (b) + ** 5: (b, 5) + ** 6: (c) + ** 7: (c, 100) + ** 8: (c, 105) + ** 9: (c, 105) + ** + ** For each sample in the aSample[] array, N samples are present in the + ** effective sample array. In the above, samples 0 and 1 are based on + ** sample aSample[0]. Samples 2 and 3 on aSample[1] etc. + ** + ** Often, sample i of each block of N effective samples has (i+1) fields. + ** Except, each sample may be extended to ensure that it is greater than or + ** equal to the previous sample in the array. For example, in the above, + ** sample 2 is the first sample of a block of N samples, so at first it + ** appears that it should be 1 field in size. However, that would make it + ** smaller than sample 1, so the binary search would not work. As a result, + ** it is extended to two fields. The duplicates that this creates do not + ** cause any problems. + */ + nField = MIN(pRec->nField, pIdx->nSample); + iCol = 0; + iSample = pIdx->nSample * nField; + do{ + int iSamp; /* Index in aSample[] of test sample */ + int n; /* Number of fields in test sample */ + + iTest = (iMin+iSample)/2; + iSamp = iTest / nField; + if( iSamp>0 ){ + /* The proposed effective sample is a prefix of sample aSample[iSamp]. + ** Specifically, the shortest prefix of at least (1 + iTest%nField) + ** fields that is greater than the previous effective sample. */ + for(n=(iTest % nField) + 1; nnField = n; + res = sqlite3VdbeRecordCompare(aSample[iSamp].n, aSample[iSamp].p, pRec); + if( res<0 ){ + iLower = aSample[iSamp].anLt[n-1] + aSample[iSamp].anEq[n-1]; + iMin = iTest+1; + }else if( res==0 && ndb->mallocFailed==0 ){ + if( res==0 ){ + /* If (res==0) is true, then pRec must be equal to sample i. */ + assert( inSample ); + assert( iCol==nField-1 ); + pRec->nField = nField; + assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) + || pParse->db->mallocFailed + ); + }else{ + /* Unless i==pIdx->nSample, indicating that pRec is larger than + ** all samples in the aSample[] array, pRec must be smaller than the + ** (iCol+1) field prefix of sample i. */ + assert( i<=pIdx->nSample && i>=0 ); + pRec->nField = iCol+1; + assert( i==pIdx->nSample + || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 + || pParse->db->mallocFailed ); + + /* if i==0 and iCol==0, then record pRec is smaller than all samples + ** in the aSample[] array. Otherwise, if (iCol>0) then pRec must + ** be greater than or equal to the (iCol) field prefix of sample i. + ** If (i>0), then pRec must also be greater than sample (i-1). */ + if( iCol>0 ){ + pRec->nField = iCol; + assert( sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)<=0 + || pParse->db->mallocFailed ); + } + if( i>0 ){ + pRec->nField = nField; + assert( sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 + || pParse->db->mallocFailed ); + } + } + } +#endif /* ifdef SQLITE_DEBUG */ + + if( res==0 ){ + /* Record pRec is equal to sample i */ + assert( iCol==nField-1 ); + aStat[0] = aSample[i].anLt[iCol]; + aStat[1] = aSample[i].anEq[iCol]; + }else{ + /* At this point, the (iCol+1) field prefix of aSample[i] is the first + ** sample that is greater than pRec. Or, if i==pIdx->nSample then pRec + ** is larger than all samples in the array. */ + tRowcnt iUpper, iGap; + if( i>=pIdx->nSample ){ + iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); + }else{ + iUpper = aSample[i].anLt[iCol]; + } + + if( iLower>=iUpper ){ + iGap = 0; + }else{ + iGap = iUpper - iLower; + } + if( roundUp ){ + iGap = (iGap*2)/3; + }else{ + iGap = iGap/3; + } + aStat[0] = iLower + iGap; + aStat[1] = pIdx->aAvgEq[nField-1]; + } + + /* Restore the pRec->nField value before returning. */ + pRec->nField = nField; + return i; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** If it is not NULL, pTerm is a term that provides an upper or lower +** bound on a range scan. Without considering pTerm, it is estimated +** that the scan will visit nNew rows. This function returns the number +** estimated to be visited after taking pTerm into account. +** +** If the user explicitly specified a likelihood() value for this term, +** then the return value is the likelihood multiplied by the number of +** input rows. Otherwise, this function assumes that an "IS NOT NULL" term +** has a likelihood of 0.50, and any other term a likelihood of 0.25. +*/ +static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ + LogEst nRet = nNew; + if( pTerm ){ + if( pTerm->truthProb<=0 ){ + nRet += pTerm->truthProb; + }else if( (pTerm->wtFlags & TERM_VNULL)==0 ){ + nRet -= 20; assert( 20==sqlite3LogEst(4) ); + } + } + return nRet; +} + + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Return the affinity for a single column of an index. +*/ +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ + assert( iCol>=0 && iColnColumn ); + if( !pIdx->zColAff ){ + if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; + } + assert( pIdx->zColAff[iCol]!=0 ); + return pIdx->zColAff[iCol]; +} +#endif + + +#ifdef SQLITE_ENABLE_STAT4 +/* +** This function is called to estimate the number of rows visited by a +** range-scan on a skip-scan index. For example: +** +** CREATE INDEX i1 ON t1(a, b, c); +** SELECT * FROM t1 WHERE a=? AND c BETWEEN ? AND ?; +** +** Value pLoop->nOut is currently set to the estimated number of rows +** visited for scanning (a=? AND b=?). This function reduces that estimate +** by some factor to account for the (c BETWEEN ? AND ?) expression based +** on the stat4 data for the index. this scan will be peformed multiple +** times (once for each (a,b) combination that matches a=?) is dealt with +** by the caller. +** +** It does this by scanning through all stat4 samples, comparing values +** extracted from pLower and pUpper with the corresponding column in each +** sample. If L and U are the number of samples found to be less than or +** equal to the values extracted from pLower and pUpper respectively, and +** N is the total number of samples, the pLoop->nOut value is adjusted +** as follows: +** +** nOut = nOut * ( min(U - L, 1) / N ) +** +** If pLower is NULL, or a value cannot be extracted from the term, L is +** set to zero. If pUpper is NULL, or a value cannot be extracted from it, +** U is set to N. +** +** Normally, this function sets *pbDone to 1 before returning. However, +** if no value can be extracted from either pLower or pUpper (and so the +** estimate of the number of rows delivered remains unchanged), *pbDone +** is left as is. +** +** If an error occurs, an SQLite error code is returned. Otherwise, +** SQLITE_OK. +*/ +static int whereRangeSkipScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereTerm *pLower, /* Lower bound on the range. ex: "x>123" Might be NULL */ + WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */ + WhereLoop *pLoop, /* Update the .nOut value of this loop */ + int *pbDone /* Set to true if at least one expr. value extracted */ +){ + Index *p = pLoop->u.btree.pIndex; + int nEq = pLoop->u.btree.nEq; + sqlite3 *db = pParse->db; + int nLower = -1; + int nUpper = p->nSample+1; + int rc = SQLITE_OK; + u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); + CollSeq *pColl; + + sqlite3_value *p1 = 0; /* Value extracted from pLower */ + sqlite3_value *p2 = 0; /* Value extracted from pUpper */ + sqlite3_value *pVal = 0; /* Value extracted from record */ + + pColl = sqlite3LocateCollSeq(pParse, p->azColl[nEq]); + if( pLower ){ + rc = sqlite3Stat4ValueFromExpr(pParse, pLower->pExpr->pRight, aff, &p1); + nLower = 0; + } + if( pUpper && rc==SQLITE_OK ){ + rc = sqlite3Stat4ValueFromExpr(pParse, pUpper->pExpr->pRight, aff, &p2); + nUpper = p2 ? 0 : p->nSample; + } + + if( p1 || p2 ){ + int i; + int nDiff; + for(i=0; rc==SQLITE_OK && inSample; i++){ + rc = sqlite3Stat4Column(db, p->aSample[i].p, p->aSample[i].n, nEq, &pVal); + if( rc==SQLITE_OK && p1 ){ + int res = sqlite3MemCompare(p1, pVal, pColl); + if( res>=0 ) nLower++; + } + if( rc==SQLITE_OK && p2 ){ + int res = sqlite3MemCompare(p2, pVal, pColl); + if( res>=0 ) nUpper++; + } + } + nDiff = (nUpper - nLower); + if( nDiff<=0 ) nDiff = 1; + + /* If there is both an upper and lower bound specified, and the + ** comparisons indicate that they are close together, use the fallback + ** method (assume that the scan visits 1/64 of the rows) for estimating + ** the number of rows visited. Otherwise, estimate the number of rows + ** using the method described in the header comment for this function. */ + if( nDiff!=1 || pUpper==0 || pLower==0 ){ + int nAdjust = (sqlite3LogEst(p->nSample) - sqlite3LogEst(nDiff)); + pLoop->nOut -= nAdjust; + *pbDone = 1; + WHERETRACE(0x10, ("range skip-scan regions: %u..%u adjust=%d est=%d\n", + nLower, nUpper, nAdjust*-1, pLoop->nOut)); + } + + }else{ + assert( *pbDone==0 ); + } + + sqlite3ValueFree(p1); + sqlite3ValueFree(p2); + sqlite3ValueFree(pVal); + + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +/* +** This function is used to estimate the number of rows that will be visited +** by scanning an index for a range of values. The range may have an upper +** bound, a lower bound, or both. The WHERE clause terms that set the upper +** and lower bounds are represented by pLower and pUpper respectively. For +** example, assuming that index p is on t1(a): +** +** ... FROM t1 WHERE a > ? AND a < ? ... +** |_____| |_____| +** | | +** pLower pUpper +** +** If either of the upper or lower bound is not present, then NULL is passed in +** place of the corresponding WhereTerm. +** +** The value in (pBuilder->pNew->u.btree.nEq) is the number of the index +** column subject to the range constraint. Or, equivalently, the number of +** equality constraints optimized by the proposed index scan. For example, +** assuming index p is on t1(a, b), and the SQL query is: +** +** ... FROM t1 WHERE a = ? AND b > ? AND b < ? ... +** +** then nEq is set to 1 (as the range restricted column, b, is the second +** left-most column of the index). Or, if the query is: +** +** ... FROM t1 WHERE a > ? AND a < ? ... +** +** then nEq is set to 0. +** +** When this function is called, *pnOut is set to the sqlite3LogEst() of the +** number of rows that the index scan is expected to visit without +** considering the range constraints. If nEq is 0, then *pnOut is the number of +** rows in the index. Assuming no error occurs, *pnOut is adjusted (reduced) +** to account for the range constraints pLower and pUpper. +** +** In the absence of sqlite_stat4 ANALYZE data, or if such data cannot be +** used, a single range inequality reduces the search space by a factor of 4. +** and a pair of constraints (x>? AND x123" Might be NULL */ + WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */ + WhereLoop *pLoop /* Modify the .nOut and maybe .rRun fields */ +){ + int rc = SQLITE_OK; + int nOut = pLoop->nOut; + LogEst nNew; + +#ifdef SQLITE_ENABLE_STAT4 + Index *p = pLoop->u.btree.pIndex; + int nEq = pLoop->u.btree.nEq; + + if( p->nSample>0 && ALWAYS(nEqnSampleCol) + && OptimizationEnabled(pParse->db, SQLITE_Stat4) + ){ + if( nEq==pBuilder->nRecValid ){ + UnpackedRecord *pRec = pBuilder->pRec; + tRowcnt a[2]; + int nBtm = pLoop->u.btree.nBtm; + int nTop = pLoop->u.btree.nTop; + + /* Variable iLower will be set to the estimate of the number of rows in + ** the index that are less than the lower bound of the range query. The + ** lower bound being the concatenation of $P and $L, where $P is the + ** key-prefix formed by the nEq values matched against the nEq left-most + ** columns of the index, and $L is the value in pLower. + ** + ** Or, if pLower is NULL or $L cannot be extracted from it (because it + ** is not a simple variable or literal value), the lower bound of the + ** range is $P. Due to a quirk in the way whereKeyStats() works, even + ** if $L is available, whereKeyStats() is called for both ($P) and + ** ($P:$L) and the larger of the two returned values is used. + ** + ** Similarly, iUpper is to be set to the estimate of the number of rows + ** less than the upper bound of the range query. Where the upper bound + ** is either ($P) or ($P:$U). Again, even if $U is available, both values + ** of iUpper are requested of whereKeyStats() and the smaller used. + ** + ** The number of rows between the two bounds is then just iUpper-iLower. + */ + tRowcnt iLower; /* Rows less than the lower bound */ + tRowcnt iUpper; /* Rows less than the upper bound */ + int iLwrIdx = -2; /* aSample[] for the lower bound */ + int iUprIdx = -1; /* aSample[] for the upper bound */ + + if( pRec ){ + testcase( pRec->nField!=pBuilder->nRecValid ); + pRec->nField = pBuilder->nRecValid; + } + /* Determine iLower and iUpper using ($P) only. */ + if( nEq==0 ){ + iLower = 0; + iUpper = p->nRowEst0; + }else{ + /* Note: this call could be optimized away - since the same values must + ** have been requested when testing key $P in whereEqualScanEst(). */ + whereKeyStats(pParse, p, pRec, 0, a); + iLower = a[0]; + iUpper = a[0] + a[1]; + } + + assert( pLower==0 || (pLower->eOperator & (WO_GT|WO_GE))!=0 ); + assert( pUpper==0 || (pUpper->eOperator & (WO_LT|WO_LE))!=0 ); + assert( p->aSortOrder!=0 ); + if( p->aSortOrder[nEq] ){ + /* The roles of pLower and pUpper are swapped for a DESC index */ + SWAP(WhereTerm*, pLower, pUpper); + SWAP(int, nBtm, nTop); + } + + /* If possible, improve on the iLower estimate using ($P:$L). */ + if( pLower ){ + int n; /* Values extracted from pExpr */ + Expr *pExpr = pLower->pExpr->pRight; + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nBtm, nEq, &n); + if( rc==SQLITE_OK && n ){ + tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + iLwrIdx = whereKeyStats(pParse, p, pRec, 0, a); + iNew = a[0] + ((pLower->eOperator & mask) ? a[1] : 0); + if( iNew>iLower ) iLower = iNew; + nOut--; + pLower = 0; + } + } + + /* If possible, improve on the iUpper estimate using ($P:$U). */ + if( pUpper ){ + int n; /* Values extracted from pExpr */ + Expr *pExpr = pUpper->pExpr->pRight; + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nTop, nEq, &n); + if( rc==SQLITE_OK && n ){ + tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + iUprIdx = whereKeyStats(pParse, p, pRec, 1, a); + iNew = a[0] + ((pUpper->eOperator & mask) ? a[1] : 0); + if( iNewpRec = pRec; + if( rc==SQLITE_OK ){ + if( iUpper>iLower ){ + nNew = sqlite3LogEst(iUpper - iLower); + /* TUNING: If both iUpper and iLower are derived from the same + ** sample, then assume they are 4x more selective. This brings + ** the estimated selectivity more in line with what it would be + ** if estimated without the use of STAT4 tables. */ + if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); + }else{ + nNew = 10; assert( 10==sqlite3LogEst(2) ); + } + if( nNewwtFlags & TERM_VNULL)==0 ); + nNew = whereRangeAdjust(pLower, nOut); + nNew = whereRangeAdjust(pUpper, nNew); + + /* TUNING: If there is both an upper and lower limit and neither limit + ** has an application-defined likelihood(), assume the range is + ** reduced by an additional 75%. This means that, by default, an open-ended + ** range query (e.g. col > ?) is assumed to match 1/4 of the rows in the + ** index. While a closed range (e.g. col BETWEEN ? AND ?) is estimated to + ** match 1/64 of the index. */ + if( pLower && pLower->truthProb>0 && pUpper && pUpper->truthProb>0 ){ + nNew -= 20; + } + + nOut -= (pLower!=0) + (pUpper!=0); + if( nNew<10 ) nNew = 10; + if( nNewnOut>nOut ){ + WHERETRACE(0x10,("Range scan lowers nOut from %d to %d\n", + pLoop->nOut, nOut)); + } +#endif + pLoop->nOut = (LogEst)nOut; + return rc; +} + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Estimate the number of rows that will be returned based on +** an equality constraint x=VALUE and where that VALUE occurs in +** the histogram data. This only works when x is the left-most +** column of an index and sqlite_stat4 histogram data is available +** for that index. When pExpr==NULL that means the constraint is +** "x IS NULL" instead of "x=VALUE". +** +** Write the estimated row count into *pnRow and return SQLITE_OK. +** If unable to make an estimate, leave *pnRow unchanged and return +** non-zero. +** +** This routine can fail if it is unable to load a collating sequence +** required for string comparison, or if unable to allocate memory +** for a UTF conversion required for comparison. The error is stored +** in the pParse structure. +*/ +static int whereEqualScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereLoopBuilder *pBuilder, + Expr *pExpr, /* Expression for VALUE in the x=VALUE constraint */ + tRowcnt *pnRow /* Write the revised row estimate here */ +){ + Index *p = pBuilder->pNew->u.btree.pIndex; + int nEq = pBuilder->pNew->u.btree.nEq; + UnpackedRecord *pRec = pBuilder->pRec; + int rc; /* Subfunction return code */ + tRowcnt a[2]; /* Statistics */ + int bOk; + + assert( nEq>=1 ); + assert( nEq<=p->nColumn ); + assert( p->aSample!=0 ); + assert( p->nSample>0 ); + assert( pBuilder->nRecValidnRecValid<(nEq-1) ){ + return SQLITE_NOTFOUND; + } + + /* This is an optimization only. The call to sqlite3Stat4ProbeSetValue() + ** below would return the same value. */ + if( nEq>=p->nColumn ){ + *pnRow = 1; + return SQLITE_OK; + } + + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, 1, nEq-1, &bOk); + pBuilder->pRec = pRec; + if( rc!=SQLITE_OK ) return rc; + if( bOk==0 ) return SQLITE_NOTFOUND; + pBuilder->nRecValid = nEq; + + whereKeyStats(pParse, p, pRec, 0, a); + WHERETRACE(0x10,("equality scan regions %s(%d): %d\n", + p->zName, nEq-1, (int)a[1])); + *pnRow = a[1]; + + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + +#ifdef SQLITE_ENABLE_STAT4 +/* +** Estimate the number of rows that will be returned based on +** an IN constraint where the right-hand side of the IN operator +** is a list of values. Example: +** +** WHERE x IN (1,2,3,4) +** +** Write the estimated row count into *pnRow and return SQLITE_OK. +** If unable to make an estimate, leave *pnRow unchanged and return +** non-zero. +** +** This routine can fail if it is unable to load a collating sequence +** required for string comparison, or if unable to allocate memory +** for a UTF conversion required for comparison. The error is stored +** in the pParse structure. +*/ +static int whereInScanEst( + Parse *pParse, /* Parsing & code generating context */ + WhereLoopBuilder *pBuilder, + ExprList *pList, /* The value list on the RHS of "x IN (v1,v2,v3,...)" */ + tRowcnt *pnRow /* Write the revised row estimate here */ +){ + Index *p = pBuilder->pNew->u.btree.pIndex; + i64 nRow0 = sqlite3LogEstToInt(p->aiRowLogEst[0]); + int nRecValid = pBuilder->nRecValid; + int rc = SQLITE_OK; /* Subfunction return code */ + tRowcnt nEst; /* Number of rows for a single term */ + tRowcnt nRowEst = 0; /* New estimate of the number of rows */ + int i; /* Loop counter */ + + assert( p->aSample!=0 ); + for(i=0; rc==SQLITE_OK && inExpr; i++){ + nEst = nRow0; + rc = whereEqualScanEst(pParse, pBuilder, pList->a[i].pExpr, &nEst); + nRowEst += nEst; + pBuilder->nRecValid = nRecValid; + } + + if( rc==SQLITE_OK ){ + if( nRowEst > nRow0 ) nRowEst = nRow0; + *pnRow = nRowEst; + WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst)); + } + assert( pBuilder->nRecValid==nRecValid ); + return rc; +} +#endif /* SQLITE_ENABLE_STAT4 */ + + +#ifdef WHERETRACE_ENABLED +/* +** Print the content of a WhereTerm object +*/ +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ + if( pTerm==0 ){ + sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); + }else{ + char zType[8]; + char zLeft[50]; + memcpy(zType, "....", 5); + if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; + if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) zType[2] = 'L'; + if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C'; + if( pTerm->eOperator & WO_SINGLE ){ + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", + pTerm->leftCursor, pTerm->u.x.leftColumn); + }else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%llx", + pTerm->u.pOrInfo->indexable); + }else{ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); + } + sqlite3DebugPrintf( + "TERM-%-3d %p %s %-12s op=%03x wtFlags=%04x", + iTerm, pTerm, zType, zLeft, pTerm->eOperator, pTerm->wtFlags); + /* The 0x10000 .wheretrace flag causes extra information to be + ** shown about each Term */ + if( sqlite3WhereTrace & 0x10000 ){ + sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx", + pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight); + } + if( (pTerm->eOperator & (WO_OR|WO_AND))==0 && pTerm->u.x.iField ){ + sqlite3DebugPrintf(" iField=%d", pTerm->u.x.iField); + } + if( pTerm->iParent>=0 ){ + sqlite3DebugPrintf(" iParent=%d", pTerm->iParent); + } + sqlite3DebugPrintf("\n"); + sqlite3TreeViewExpr(0, pTerm->pExpr, 0); + } +} +#endif + +#ifdef WHERETRACE_ENABLED +/* +** Show the complete content of a WhereClause +*/ +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ + int i; + for(i=0; inTerm; i++){ + sqlite3WhereTermPrint(&pWC->a[i], i); + } +} +#endif + +#ifdef WHERETRACE_ENABLED +/* +** Print a WhereLoop object for debugging purposes +*/ +SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ + WhereInfo *pWInfo = pWC->pWInfo; + int nb = 1+(pWInfo->pTabList->nSrc+3)/4; + SrcItem *pItem = pWInfo->pTabList->a + p->iTab; + Table *pTab = pItem->pTab; + Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1; + sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, + p->iTab, nb, p->maskSelf, nb, p->prereq & mAll); + sqlite3DebugPrintf(" %12s", + pItem->zAlias ? pItem->zAlias : pTab->zName); + if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + const char *zName; + if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){ + if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){ + int i = sqlite3Strlen30(zName) - 1; + while( zName[i]!='_' ) i--; + zName += i; + } + sqlite3DebugPrintf(".%-16s %2d", zName, p->u.btree.nEq); + }else{ + sqlite3DebugPrintf("%20s",""); + } + }else{ + char *z; + if( p->u.vtab.idxStr ){ + z = sqlite3_mprintf("(%d,\"%s\",%#x)", + p->u.vtab.idxNum, p->u.vtab.idxStr, p->u.vtab.omitMask); + }else{ + z = sqlite3_mprintf("(%d,%x)", p->u.vtab.idxNum, p->u.vtab.omitMask); + } + sqlite3DebugPrintf(" %-19s", z); + sqlite3_free(z); + } + if( p->wsFlags & WHERE_SKIPSCAN ){ + sqlite3DebugPrintf(" f %06x %d-%d", p->wsFlags, p->nLTerm,p->nSkip); + }else{ + sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm); + } + sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); + if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ + int i; + for(i=0; inLTerm; i++){ + sqlite3WhereTermPrint(p->aLTerm[i], i); + } + } +} +#endif + +/* +** Convert bulk memory into a valid WhereLoop that can be passed +** to whereLoopClear harmlessly. +*/ +static void whereLoopInit(WhereLoop *p){ + p->aLTerm = p->aLTermSpace; + p->nLTerm = 0; + p->nLSlot = ArraySize(p->aLTermSpace); + p->wsFlags = 0; +} + +/* +** Clear the WhereLoop.u union. Leave WhereLoop.pLTerm intact. +*/ +static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){ + if( p->wsFlags & (WHERE_VIRTUALTABLE|WHERE_AUTO_INDEX) ){ + if( (p->wsFlags & WHERE_VIRTUALTABLE)!=0 && p->u.vtab.needFree ){ + sqlite3_free(p->u.vtab.idxStr); + p->u.vtab.needFree = 0; + p->u.vtab.idxStr = 0; + }else if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 && p->u.btree.pIndex!=0 ){ + sqlite3DbFree(db, p->u.btree.pIndex->zColAff); + sqlite3DbFreeNN(db, p->u.btree.pIndex); + p->u.btree.pIndex = 0; + } + } +} + +/* +** Deallocate internal memory used by a WhereLoop object +*/ +static void whereLoopClear(sqlite3 *db, WhereLoop *p){ + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); + whereLoopClearUnion(db, p); + whereLoopInit(p); +} + +/* +** Increase the memory allocation for pLoop->aLTerm[] to be at least n. +*/ +static int whereLoopResize(sqlite3 *db, WhereLoop *p, int n){ + WhereTerm **paNew; + if( p->nLSlot>=n ) return SQLITE_OK; + n = (n+7)&~7; + paNew = sqlite3DbMallocRawNN(db, sizeof(p->aLTerm[0])*n); + if( paNew==0 ) return SQLITE_NOMEM_BKPT; + memcpy(paNew, p->aLTerm, sizeof(p->aLTerm[0])*p->nLSlot); + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); + p->aLTerm = paNew; + p->nLSlot = n; + return SQLITE_OK; +} + +/* +** Transfer content from the second pLoop into the first. +*/ +static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ + whereLoopClearUnion(db, pTo); + if( whereLoopResize(db, pTo, pFrom->nLTerm) ){ + memset(pTo, 0, WHERE_LOOP_XFER_SZ); + return SQLITE_NOMEM_BKPT; + } + memcpy(pTo, pFrom, WHERE_LOOP_XFER_SZ); + memcpy(pTo->aLTerm, pFrom->aLTerm, pTo->nLTerm*sizeof(pTo->aLTerm[0])); + if( pFrom->wsFlags & WHERE_VIRTUALTABLE ){ + pFrom->u.vtab.needFree = 0; + }else if( (pFrom->wsFlags & WHERE_AUTO_INDEX)!=0 ){ + pFrom->u.btree.pIndex = 0; + } + return SQLITE_OK; +} + +/* +** Delete a WhereLoop object +*/ +static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ + whereLoopClear(db, p); + sqlite3DbFreeNN(db, p); +} + +/* +** Free a WhereInfo structure +*/ +static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ + assert( pWInfo!=0 ); + sqlite3WhereClauseClear(&pWInfo->sWC); + while( pWInfo->pLoops ){ + WhereLoop *p = pWInfo->pLoops; + pWInfo->pLoops = p->pNextLoop; + whereLoopDelete(db, p); + } + assert( pWInfo->pExprMods==0 ); + while( pWInfo->pMemToFree ){ + WhereMemBlock *pNext = pWInfo->pMemToFree->pNext; + sqlite3DbFreeNN(db, pWInfo->pMemToFree); + pWInfo->pMemToFree = pNext; + } + sqlite3DbFreeNN(db, pWInfo); +} + +/* Undo all Expr node modifications +*/ +static void whereUndoExprMods(WhereInfo *pWInfo){ + while( pWInfo->pExprMods ){ + WhereExprMod *p = pWInfo->pExprMods; + pWInfo->pExprMods = p->pNext; + memcpy(p->pExpr, &p->orig, sizeof(p->orig)); + sqlite3DbFree(pWInfo->pParse->db, p); + } +} + +/* +** Return TRUE if all of the following are true: +** +** (1) X has the same or lower cost, or returns the same or fewer rows, +** than Y. +** (2) X uses fewer WHERE clause terms than Y +** (3) Every WHERE clause term used by X is also used by Y +** (4) X skips at least as many columns as Y +** (5) If X is a covering index, than Y is too +** +** Conditions (2) and (3) mean that X is a "proper subset" of Y. +** If X is a proper subset of Y then Y is a better choice and ought +** to have a lower cost. This routine returns TRUE when that cost +** relationship is inverted and needs to be adjusted. Constraint (4) +** was added because if X uses skip-scan less than Y it still might +** deserve a lower cost even if it is a proper subset of Y. Constraint (5) +** was added because a covering index probably deserves to have a lower cost +** than a non-covering index even if it is a proper subset. +*/ +static int whereLoopCheaperProperSubset( + const WhereLoop *pX, /* First WhereLoop to compare */ + const WhereLoop *pY /* Compare against this WhereLoop */ +){ + int i, j; + if( pX->nLTerm-pX->nSkip >= pY->nLTerm-pY->nSkip ){ + return 0; /* X is not a subset of Y */ + } + if( pX->rRun>pY->rRun && pX->nOut>pY->nOut ) return 0; + if( pY->nSkip > pX->nSkip ) return 0; + for(i=pX->nLTerm-1; i>=0; i--){ + if( pX->aLTerm[i]==0 ) continue; + for(j=pY->nLTerm-1; j>=0; j--){ + if( pY->aLTerm[j]==pX->aLTerm[i] ) break; + } + if( j<0 ) return 0; /* X not a subset of Y since term X[i] not used by Y */ + } + if( (pX->wsFlags&WHERE_IDX_ONLY)!=0 + && (pY->wsFlags&WHERE_IDX_ONLY)==0 ){ + return 0; /* Constraint (5) */ + } + return 1; /* All conditions meet */ +} + +/* +** Try to adjust the cost and number of output rows of WhereLoop pTemplate +** upwards or downwards so that: +** +** (1) pTemplate costs less than any other WhereLoops that are a proper +** subset of pTemplate +** +** (2) pTemplate costs more than any other WhereLoops for which pTemplate +** is a proper subset. +** +** To say "WhereLoop X is a proper subset of Y" means that X uses fewer +** WHERE clause terms than Y and that every WHERE clause term used by X is +** also used by Y. +*/ +static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ + if( (pTemplate->wsFlags & WHERE_INDEXED)==0 ) return; + for(; p; p=p->pNextLoop){ + if( p->iTab!=pTemplate->iTab ) continue; + if( (p->wsFlags & WHERE_INDEXED)==0 ) continue; + if( whereLoopCheaperProperSubset(p, pTemplate) ){ + /* Adjust pTemplate cost downward so that it is cheaper than its + ** subset p. */ + WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", + pTemplate->rRun, pTemplate->nOut, + MIN(p->rRun, pTemplate->rRun), + MIN(p->nOut - 1, pTemplate->nOut))); + pTemplate->rRun = MIN(p->rRun, pTemplate->rRun); + pTemplate->nOut = MIN(p->nOut - 1, pTemplate->nOut); + }else if( whereLoopCheaperProperSubset(pTemplate, p) ){ + /* Adjust pTemplate cost upward so that it is costlier than p since + ** pTemplate is a proper subset of p */ + WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", + pTemplate->rRun, pTemplate->nOut, + MAX(p->rRun, pTemplate->rRun), + MAX(p->nOut + 1, pTemplate->nOut))); + pTemplate->rRun = MAX(p->rRun, pTemplate->rRun); + pTemplate->nOut = MAX(p->nOut + 1, pTemplate->nOut); + } + } +} + +/* +** Search the list of WhereLoops in *ppPrev looking for one that can be +** replaced by pTemplate. +** +** Return NULL if pTemplate does not belong on the WhereLoop list. +** In other words if pTemplate ought to be dropped from further consideration. +** +** If pX is a WhereLoop that pTemplate can replace, then return the +** link that points to pX. +** +** If pTemplate cannot replace any existing element of the list but needs +** to be added to the list as a new entry, then return a pointer to the +** tail of the list. +*/ +static WhereLoop **whereLoopFindLesser( + WhereLoop **ppPrev, + const WhereLoop *pTemplate +){ + WhereLoop *p; + for(p=(*ppPrev); p; ppPrev=&p->pNextLoop, p=*ppPrev){ + if( p->iTab!=pTemplate->iTab || p->iSortIdx!=pTemplate->iSortIdx ){ + /* If either the iTab or iSortIdx values for two WhereLoop are different + ** then those WhereLoops need to be considered separately. Neither is + ** a candidate to replace the other. */ + continue; + } + /* In the current implementation, the rSetup value is either zero + ** or the cost of building an automatic index (NlogN) and the NlogN + ** is the same for compatible WhereLoops. */ + assert( p->rSetup==0 || pTemplate->rSetup==0 + || p->rSetup==pTemplate->rSetup ); + + /* whereLoopAddBtree() always generates and inserts the automatic index + ** case first. Hence compatible candidate WhereLoops never have a larger + ** rSetup. Call this SETUP-INVARIANT */ + assert( p->rSetup>=pTemplate->rSetup ); + + /* Any loop using an appliation-defined index (or PRIMARY KEY or + ** UNIQUE constraint) with one or more == constraints is better + ** than an automatic index. Unless it is a skip-scan. */ + if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 + && (pTemplate->nSkip)==0 + && (pTemplate->wsFlags & WHERE_INDEXED)!=0 + && (pTemplate->wsFlags & WHERE_COLUMN_EQ)!=0 + && (p->prereq & pTemplate->prereq)==pTemplate->prereq + ){ + break; + } + + /* If existing WhereLoop p is better than pTemplate, pTemplate can be + ** discarded. WhereLoop p is better if: + ** (1) p has no more dependencies than pTemplate, and + ** (2) p has an equal or lower cost than pTemplate + */ + if( (p->prereq & pTemplate->prereq)==p->prereq /* (1) */ + && p->rSetup<=pTemplate->rSetup /* (2a) */ + && p->rRun<=pTemplate->rRun /* (2b) */ + && p->nOut<=pTemplate->nOut /* (2c) */ + ){ + return 0; /* Discard pTemplate */ + } + + /* If pTemplate is always better than p, then cause p to be overwritten + ** with pTemplate. pTemplate is better than p if: + ** (1) pTemplate has no more dependences than p, and + ** (2) pTemplate has an equal or lower cost than p. + */ + if( (p->prereq & pTemplate->prereq)==pTemplate->prereq /* (1) */ + && p->rRun>=pTemplate->rRun /* (2a) */ + && p->nOut>=pTemplate->nOut /* (2b) */ + ){ + assert( p->rSetup>=pTemplate->rSetup ); /* SETUP-INVARIANT above */ + break; /* Cause p to be overwritten by pTemplate */ + } + } + return ppPrev; +} + +/* +** Insert or replace a WhereLoop entry using the template supplied. +** +** An existing WhereLoop entry might be overwritten if the new template +** is better and has fewer dependencies. Or the template will be ignored +** and no insert will occur if an existing WhereLoop is faster and has +** fewer dependencies than the template. Otherwise a new WhereLoop is +** added based on the template. +** +** If pBuilder->pOrSet is not NULL then we care about only the +** prerequisites and rRun and nOut costs of the N best loops. That +** information is gathered in the pBuilder->pOrSet object. This special +** processing mode is used only for OR clause processing. +** +** When accumulating multiple loops (when pBuilder->pOrSet is NULL) we +** still might overwrite similar loops with the new template if the +** new template is better. Loops may be overwritten if the following +** conditions are met: +** +** (1) They have the same iTab. +** (2) They have the same iSortIdx. +** (3) The template has same or fewer dependencies than the current loop +** (4) The template has the same or lower cost than the current loop +*/ +static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ + WhereLoop **ppPrev, *p; + WhereInfo *pWInfo = pBuilder->pWInfo; + sqlite3 *db = pWInfo->pParse->db; + int rc; + + /* Stop the search once we hit the query planner search limit */ + if( pBuilder->iPlanLimit==0 ){ + WHERETRACE(0xffffffff,("=== query planner search limit reached ===\n")); + if( pBuilder->pOrSet ) pBuilder->pOrSet->n = 0; + return SQLITE_DONE; + } + pBuilder->iPlanLimit--; + + whereLoopAdjustCost(pWInfo->pLoops, pTemplate); + + /* If pBuilder->pOrSet is defined, then only keep track of the costs + ** and prereqs. + */ + if( pBuilder->pOrSet!=0 ){ + if( pTemplate->nLTerm ){ +#if WHERETRACE_ENABLED + u16 n = pBuilder->pOrSet->n; + int x = +#endif + whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, + pTemplate->nOut); +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + } + return SQLITE_OK; + } + + /* Look for an existing WhereLoop to replace with pTemplate + */ + ppPrev = whereLoopFindLesser(&pWInfo->pLoops, pTemplate); + + if( ppPrev==0 ){ + /* There already exists a WhereLoop on the list that is better + ** than pTemplate, so just ignore pTemplate */ +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(" skip: "); + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + return SQLITE_OK; + }else{ + p = *ppPrev; + } + + /* If we reach this point it means that either p[] should be overwritten + ** with pTemplate[] if p[] exists, or if p==NULL then allocate a new + ** WhereLoop and insert it. + */ +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + if( p!=0 ){ + sqlite3DebugPrintf("replace: "); + sqlite3WhereLoopPrint(p, pBuilder->pWC); + sqlite3DebugPrintf(" with: "); + }else{ + sqlite3DebugPrintf(" add: "); + } + sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); + } +#endif + if( p==0 ){ + /* Allocate a new WhereLoop to add to the end of the list */ + *ppPrev = p = sqlite3DbMallocRawNN(db, sizeof(WhereLoop)); + if( p==0 ) return SQLITE_NOMEM_BKPT; + whereLoopInit(p); + p->pNextLoop = 0; + }else{ + /* We will be overwriting WhereLoop p[]. But before we do, first + ** go through the rest of the list and delete any other entries besides + ** p[] that are also supplated by pTemplate */ + WhereLoop **ppTail = &p->pNextLoop; + WhereLoop *pToDel; + while( *ppTail ){ + ppTail = whereLoopFindLesser(ppTail, pTemplate); + if( ppTail==0 ) break; + pToDel = *ppTail; + if( pToDel==0 ) break; + *ppTail = pToDel->pNextLoop; +#if WHERETRACE_ENABLED /* 0x8 */ + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(" delete: "); + sqlite3WhereLoopPrint(pToDel, pBuilder->pWC); + } +#endif + whereLoopDelete(db, pToDel); + } + } + rc = whereLoopXfer(db, p, pTemplate); + if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ + Index *pIndex = p->u.btree.pIndex; + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ + p->u.btree.pIndex = 0; + } + } + return rc; +} + +/* +** Adjust the WhereLoop.nOut value downward to account for terms of the +** WHERE clause that reference the loop but which are not used by an +** index. +* +** For every WHERE clause term that is not used by the index +** and which has a truth probability assigned by one of the likelihood(), +** likely(), or unlikely() SQL functions, reduce the estimated number +** of output rows by the probability specified. +** +** TUNING: For every WHERE clause term that is not used by the index +** and which does not have an assigned truth probability, heuristics +** described below are used to try to estimate the truth probability. +** TODO --> Perhaps this is something that could be improved by better +** table statistics. +** +** Heuristic 1: Estimate the truth probability as 93.75%. The 93.75% +** value corresponds to -1 in LogEst notation, so this means decrement +** the WhereLoop.nOut field for every such WHERE clause term. +** +** Heuristic 2: If there exists one or more WHERE clause terms of the +** form "x==EXPR" and EXPR is not a constant 0 or 1, then make sure the +** final output row estimate is no greater than 1/4 of the total number +** of rows in the table. In other words, assume that x==EXPR will filter +** out at least 3 out of 4 rows. If EXPR is -1 or 0 or 1, then maybe the +** "x" column is boolean or else -1 or 0 or 1 is a common default value +** on the "x" column and so in that case only cap the output row estimate +** at 1/2 instead of 1/4. +*/ +static void whereLoopOutputAdjust( + WhereClause *pWC, /* The WHERE clause */ + WhereLoop *pLoop, /* The loop to adjust downward */ + LogEst nRow /* Number of rows in the entire table */ +){ + WhereTerm *pTerm, *pX; + Bitmask notAllowed = ~(pLoop->prereq|pLoop->maskSelf); + int i, j; + LogEst iReduce = 0; /* pLoop->nOut should not exceed nRow-iReduce */ + + assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + for(i=pWC->nBase, pTerm=pWC->a; i>0; i--, pTerm++){ + assert( pTerm!=0 ); + if( (pTerm->prereqAll & notAllowed)!=0 ) continue; + if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; + if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) continue; + for(j=pLoop->nLTerm-1; j>=0; j--){ + pX = pLoop->aLTerm[j]; + if( pX==0 ) continue; + if( pX==pTerm ) break; + if( pX->iParent>=0 && (&pWC->a[pX->iParent])==pTerm ) break; + } + if( j<0 ){ + if( pLoop->maskSelf==pTerm->prereqAll ){ + /* If there are extra terms in the WHERE clause not used by an index + ** that depend only on the table being scanned, and that will tend to + ** cause many rows to be omitted, then mark that table as + ** "self-culling". + ** + ** 2022-03-24: Self-culling only applies if either the extra terms + ** are straight comparison operators that are non-true with NULL + ** operand, or if the loop is not an OUTER JOIN. + */ + if( (pTerm->eOperator & 0x3f)!=0 + || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype + & (JT_LEFT|JT_LTORJ))==0 + ){ + pLoop->wsFlags |= WHERE_SELFCULL; + } + } + if( pTerm->truthProb<=0 ){ + /* If a truth probability is specified using the likelihood() hints, + ** then use the probability provided by the application. */ + pLoop->nOut += pTerm->truthProb; + }else{ + /* In the absence of explicit truth probabilities, use heuristics to + ** guess a reasonable truth probability. */ + pLoop->nOut--; + if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 + && (pTerm->wtFlags & TERM_HIGHTRUTH)==0 /* tag-20200224-1 */ + ){ + Expr *pRight = pTerm->pExpr->pRight; + int k = 0; + testcase( pTerm->pExpr->op==TK_IS ); + if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ + k = 10; + }else{ + k = 20; + } + if( iReducewtFlags |= TERM_HEURTRUTH; + iReduce = k; + } + } + } + } + } + if( pLoop->nOut > nRow-iReduce ){ + pLoop->nOut = nRow - iReduce; + } +} + +/* +** Term pTerm is a vector range comparison operation. The first comparison +** in the vector can be optimized using column nEq of the index. This +** function returns the total number of vector elements that can be used +** as part of the range comparison. +** +** For example, if the query is: +** +** WHERE a = ? AND (b, c, d) > (?, ?, ?) +** +** and the index: +** +** CREATE INDEX ... ON (a, b, c, d, e) +** +** then this function would be invoked with nEq=1. The value returned in +** this case is 3. +*/ +static int whereRangeVectorLen( + Parse *pParse, /* Parsing context */ + int iCur, /* Cursor open on pIdx */ + Index *pIdx, /* The index to be used for a inequality constraint */ + int nEq, /* Number of prior equality constraints on same index */ + WhereTerm *pTerm /* The vector inequality constraint */ +){ + int nCmp = sqlite3ExprVectorSize(pTerm->pExpr->pLeft); + int i; + + nCmp = MIN(nCmp, (pIdx->nColumn - nEq)); + for(i=1; ipExpr->pLeft) ); + pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr; + pRhs = pTerm->pExpr->pRight; + if( ExprUseXSelect(pRhs) ){ + pRhs = pRhs->x.pSelect->pEList->a[i].pExpr; + }else{ + pRhs = pRhs->x.pList->a[i].pExpr; + } + + /* Check that the LHS of the comparison is a column reference to + ** the right column of the right source table. And that the sort + ** order of the index column is the same as the sort order of the + ** leftmost index column. */ + if( pLhs->op!=TK_COLUMN + || pLhs->iTable!=iCur + || pLhs->iColumn!=pIdx->aiColumn[i+nEq] + || pIdx->aSortOrder[i+nEq]!=pIdx->aSortOrder[nEq] + ){ + break; + } + + testcase( pLhs->iColumn==XN_ROWID ); + aff = sqlite3CompareAffinity(pRhs, sqlite3ExprAffinity(pLhs)); + idxaff = sqlite3TableColumnAffinity(pIdx->pTable, pLhs->iColumn); + if( aff!=idxaff ) break; + + pColl = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + if( pColl==0 ) break; + if( sqlite3StrICmp(pColl->zName, pIdx->azColl[i+nEq]) ) break; + } + return i; +} + +/* +** Adjust the cost C by the costMult facter T. This only occurs if +** compiled with -DSQLITE_ENABLE_COSTMULT +*/ +#ifdef SQLITE_ENABLE_COSTMULT +# define ApplyCostMultiplier(C,T) C += T +#else +# define ApplyCostMultiplier(C,T) +#endif + +/* +** We have so far matched pBuilder->pNew->u.btree.nEq terms of the +** index pIndex. Try to match one more. +** +** When this function is called, pBuilder->pNew->nOut contains the +** number of rows expected to be visited by filtering using the nEq +** terms only. If it is modified, this value is restored before this +** function returns. +** +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. +*/ +static int whereLoopAddBtreeIndex( + WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ + SrcItem *pSrc, /* FROM clause term being analyzed */ + Index *pProbe, /* An index on pSrc */ + LogEst nInMul /* log(Number of iterations due to IN) */ +){ + WhereInfo *pWInfo = pBuilder->pWInfo; /* WHERE analyse context */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection malloc context */ + WhereLoop *pNew; /* Template WhereLoop under construction */ + WhereTerm *pTerm; /* A WhereTerm under consideration */ + int opMask; /* Valid operators for constraints */ + WhereScan scan; /* Iterator for WHERE terms */ + Bitmask saved_prereq; /* Original value of pNew->prereq */ + u16 saved_nLTerm; /* Original value of pNew->nLTerm */ + u16 saved_nEq; /* Original value of pNew->u.btree.nEq */ + u16 saved_nBtm; /* Original value of pNew->u.btree.nBtm */ + u16 saved_nTop; /* Original value of pNew->u.btree.nTop */ + u16 saved_nSkip; /* Original value of pNew->nSkip */ + u32 saved_wsFlags; /* Original value of pNew->wsFlags */ + LogEst saved_nOut; /* Original value of pNew->nOut */ + int rc = SQLITE_OK; /* Return code */ + LogEst rSize; /* Number of rows in the table */ + LogEst rLogSize; /* Logarithm of table size */ + WhereTerm *pTop = 0, *pBtm = 0; /* Top and bottom range constraints */ + + pNew = pBuilder->pNew; + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; + WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d, nSkip=%d, rRun=%d\n", + pProbe->pTable->zName,pProbe->zName, + pNew->u.btree.nEq, pNew->nSkip, pNew->rRun)); + + assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 ); + assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 ); + if( pNew->wsFlags & WHERE_BTM_LIMIT ){ + opMask = WO_LT|WO_LE; + }else{ + assert( pNew->u.btree.nBtm==0 ); + opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE|WO_ISNULL|WO_IS; + } + if( pProbe->bUnordered ) opMask &= ~(WO_GT|WO_GE|WO_LT|WO_LE); + + assert( pNew->u.btree.nEqnColumn ); + assert( pNew->u.btree.nEqnKeyCol + || pProbe->idxType!=SQLITE_IDXTYPE_PRIMARYKEY ); + + saved_nEq = pNew->u.btree.nEq; + saved_nBtm = pNew->u.btree.nBtm; + saved_nTop = pNew->u.btree.nTop; + saved_nSkip = pNew->nSkip; + saved_nLTerm = pNew->nLTerm; + saved_wsFlags = pNew->wsFlags; + saved_prereq = pNew->prereq; + saved_nOut = pNew->nOut; + pTerm = whereScanInit(&scan, pBuilder->pWC, pSrc->iCursor, saved_nEq, + opMask, pProbe); + pNew->rSetup = 0; + rSize = pProbe->aiRowLogEst[0]; + rLogSize = estLog(rSize); + for(; rc==SQLITE_OK && pTerm!=0; pTerm = whereScanNext(&scan)){ + u16 eOp = pTerm->eOperator; /* Shorthand for pTerm->eOperator */ + LogEst rCostIdx; + LogEst nOutUnadjusted; /* nOut before IN() and WHERE adjustments */ + int nIn = 0; +#ifdef SQLITE_ENABLE_STAT4 + int nRecValid = pBuilder->nRecValid; +#endif + if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) + && indexColumnNotNull(pProbe, saved_nEq) + ){ + continue; /* ignore IS [NOT] NULL constraints on NOT NULL columns */ + } + if( pTerm->prereqRight & pNew->maskSelf ) continue; + + /* Do not allow the upper bound of a LIKE optimization range constraint + ** to mix with a lower range bound from some other source */ + if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; + + /* tag-20191211-001: Do not allow constraints from the WHERE clause to + ** be used by the right table of a LEFT JOIN nor by the left table of a + ** RIGHT JOIN. Only constraints in the ON clause are allowed. + ** See tag-20191211-002 for the vtab equivalent. + ** + ** 2022-06-06: See https://sqlite.org/forum/forumpost/206d99a16dd9212f + ** for an example of a WHERE clause constraints that may not be used on + ** the right table of a RIGHT JOIN because the constraint implies a + ** not-NULL condition on the left table of the RIGHT JOIN. + ** + ** 2022-06-10: The same condition applies to termCanDriveIndex() above. + ** https://sqlite.org/forum/forumpost/51e6959f61 + */ + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + continue; + } + } + + if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ + pBuilder->bldFlags1 |= SQLITE_BLDF1_UNIQUE; + }else{ + pBuilder->bldFlags1 |= SQLITE_BLDF1_INDEXED; + } + pNew->wsFlags = saved_wsFlags; + pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; + pNew->nLTerm = saved_nLTerm; + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTerm; + pNew->prereq = (saved_prereq | pTerm->prereqRight) & ~pNew->maskSelf; + + assert( nInMul==0 + || (pNew->wsFlags & WHERE_COLUMN_NULL)!=0 + || (pNew->wsFlags & WHERE_COLUMN_IN)!=0 + || (pNew->wsFlags & WHERE_SKIPSCAN)!=0 + ); + + if( eOp & WO_IN ){ + Expr *pExpr = pTerm->pExpr; + if( ExprUseXSelect(pExpr) ){ + /* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */ + int i; + nIn = 46; assert( 46==sqlite3LogEst(25) ); + + /* The expression may actually be of the form (x, y) IN (SELECT...). + ** In this case there is a separate term for each of (x) and (y). + ** However, the nIn multiplier should only be applied once, not once + ** for each such term. The following loop checks that pTerm is the + ** first such term in use, and sets nIn back to 0 if it is not. */ + for(i=0; inLTerm-1; i++){ + if( pNew->aLTerm[i] && pNew->aLTerm[i]->pExpr==pExpr ) nIn = 0; + } + }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ + /* "x IN (value, value, ...)" */ + nIn = sqlite3LogEst(pExpr->x.pList->nExpr); + } + if( pProbe->hasStat1 && rLogSize>=10 ){ + LogEst M, logK, x; + /* Let: + ** N = the total number of rows in the table + ** K = the number of entries on the RHS of the IN operator + ** M = the number of rows in the table that match terms to the + ** to the left in the same index. If the IN operator is on + ** the left-most index column, M==N. + ** + ** Given the definitions above, it is better to omit the IN operator + ** from the index lookup and instead do a scan of the M elements, + ** testing each scanned row against the IN operator separately, if: + ** + ** M*log(K) < K*log(N) + ** + ** Our estimates for M, K, and N might be inaccurate, so we build in + ** a safety margin of 2 (LogEst: 10) that favors using the IN operator + ** with the index, as using an index has better worst-case behavior. + ** If we do not have real sqlite_stat1 data, always prefer to use + ** the index. Do not bother with this optimization on very small + ** tables (less than 2 rows) as it is pointless in that case. + */ + M = pProbe->aiRowLogEst[saved_nEq]; + logK = estLog(nIn); + /* TUNING v----- 10 to bias toward indexed IN */ + x = M + logK + 10 - (nIn + rLogSize); + if( x>=0 ){ + WHERETRACE(0x40, + ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d) " + "prefers indexed lookup\n", + saved_nEq, M, logK, nIn, rLogSize, x)); + }else if( nInMul<2 && OptimizationEnabled(db, SQLITE_SeekScan) ){ + WHERETRACE(0x40, + ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d" + " nInMul=%d) prefers skip-scan\n", + saved_nEq, M, logK, nIn, rLogSize, x, nInMul)); + pNew->wsFlags |= WHERE_IN_SEEKSCAN; + }else{ + WHERETRACE(0x40, + ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d" + " nInMul=%d) prefers normal scan\n", + saved_nEq, M, logK, nIn, rLogSize, x, nInMul)); + continue; + } + } + pNew->wsFlags |= WHERE_COLUMN_IN; + }else if( eOp & (WO_EQ|WO_IS) ){ + int iCol = pProbe->aiColumn[saved_nEq]; + pNew->wsFlags |= WHERE_COLUMN_EQ; + assert( saved_nEq==pNew->u.btree.nEq ); + if( iCol==XN_ROWID + || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) + ){ + if( iCol==XN_ROWID || pProbe->uniqNotNull + || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ) + ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags |= WHERE_UNQ_WANTED; + } + } + if( scan.iEquiv>1 ) pNew->wsFlags |= WHERE_TRANSCONS; + }else if( eOp & WO_ISNULL ){ + pNew->wsFlags |= WHERE_COLUMN_NULL; + }else if( eOp & (WO_GT|WO_GE) ){ + testcase( eOp & WO_GT ); + testcase( eOp & WO_GE ); + pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT; + pNew->u.btree.nBtm = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); + pBtm = pTerm; + pTop = 0; + if( pTerm->wtFlags & TERM_LIKEOPT ){ + /* Range constraints that come from the LIKE optimization are + ** always used in pairs. */ + pTop = &pTerm[1]; + assert( (pTop-(pTerm->pWC->a))pWC->nTerm ); + assert( pTop->wtFlags & TERM_LIKEOPT ); + assert( pTop->eOperator==WO_LT ); + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTop; + pNew->wsFlags |= WHERE_TOP_LIMIT; + pNew->u.btree.nTop = 1; + } + }else{ + assert( eOp & (WO_LT|WO_LE) ); + testcase( eOp & WO_LT ); + testcase( eOp & WO_LE ); + pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_TOP_LIMIT; + pNew->u.btree.nTop = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); + pTop = pTerm; + pBtm = (pNew->wsFlags & WHERE_BTM_LIMIT)!=0 ? + pNew->aLTerm[pNew->nLTerm-2] : 0; + } + + /* At this point pNew->nOut is set to the number of rows expected to + ** be visited by the index scan before considering term pTerm, or the + ** values of nIn and nInMul. In other words, assuming that all + ** "x IN(...)" terms are replaced with "x = ?". This block updates + ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ + assert( pNew->nOut==saved_nOut ); + if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + /* Adjust nOut using stat4 data. Or, if there is no stat4 + ** data, using some other estimate. */ + whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); + }else{ + int nEq = ++pNew->u.btree.nEq; + assert( eOp & (WO_ISNULL|WO_EQ|WO_IN|WO_IS) ); + + assert( pNew->nOut==saved_nOut ); + if( pTerm->truthProb<=0 && pProbe->aiColumn[saved_nEq]>=0 ){ + assert( (eOp & WO_IN) || nIn==0 ); + testcase( eOp & WO_IN ); + pNew->nOut += pTerm->truthProb; + pNew->nOut -= nIn; + }else{ +#ifdef SQLITE_ENABLE_STAT4 + tRowcnt nOut = 0; + if( nInMul==0 + && pProbe->nSample + && ALWAYS(pNew->u.btree.nEq<=pProbe->nSampleCol) + && ((eOp & WO_IN)==0 || ExprUseXList(pTerm->pExpr)) + && OptimizationEnabled(db, SQLITE_Stat4) + ){ + Expr *pExpr = pTerm->pExpr; + if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ + testcase( eOp & WO_EQ ); + testcase( eOp & WO_IS ); + testcase( eOp & WO_ISNULL ); + rc = whereEqualScanEst(pParse, pBuilder, pExpr->pRight, &nOut); + }else{ + rc = whereInScanEst(pParse, pBuilder, pExpr->x.pList, &nOut); + } + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if( rc!=SQLITE_OK ) break; /* Jump out of the pTerm loop */ + if( nOut ){ + pNew->nOut = sqlite3LogEst(nOut); + if( nEq==1 + /* TUNING: Mark terms as "low selectivity" if they seem likely + ** to be true for half or more of the rows in the table. + ** See tag-202002240-1 */ + && pNew->nOut+10 > pProbe->aiRowLogEst[0] + ){ +#if WHERETRACE_ENABLED /* 0x01 */ + if( sqlite3WhereTrace & 0x01 ){ + sqlite3DebugPrintf( + "STAT4 determines term has low selectivity:\n"); + sqlite3WhereTermPrint(pTerm, 999); + } +#endif + pTerm->wtFlags |= TERM_HIGHTRUTH; + if( pTerm->wtFlags & TERM_HEURTRUTH ){ + /* If the term has previously been used with an assumption of + ** higher selectivity, then set the flag to rerun the + ** loop computations. */ + pBuilder->bldFlags2 |= SQLITE_BLDF2_2NDPASS; + } + } + if( pNew->nOut>saved_nOut ) pNew->nOut = saved_nOut; + pNew->nOut -= nIn; + } + } + if( nOut==0 ) +#endif + { + pNew->nOut += (pProbe->aiRowLogEst[nEq] - pProbe->aiRowLogEst[nEq-1]); + if( eOp & WO_ISNULL ){ + /* TUNING: If there is no likelihood() value, assume that a + ** "col IS NULL" expression matches twice as many rows + ** as (col=?). */ + pNew->nOut += 10; + } + } + } + } + + /* Set rCostIdx to the cost of visiting selected rows in index. Add + ** it to pNew->rRun, which is currently set to the cost of the index + ** seek only. Then, if this is a non-covering index, add the cost of + ** visiting the rows in the main table. */ + assert( pSrc->pTab->szTabRow>0 ); + rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; + pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); + if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16); + } + ApplyCostMultiplier(pNew->rRun, pProbe->pTable->costMult); + + nOutUnadjusted = pNew->nOut; + pNew->rRun += nInMul + nIn; + pNew->nOut += nInMul + nIn; + whereLoopOutputAdjust(pBuilder->pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + + if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + pNew->nOut = saved_nOut; + }else{ + pNew->nOut = nOutUnadjusted; + } + + if( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 + && pNew->u.btree.nEqnColumn + && (pNew->u.btree.nEqnKeyCol || + pProbe->idxType!=SQLITE_IDXTYPE_PRIMARYKEY) + ){ + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn); + } + pNew->nOut = saved_nOut; +#ifdef SQLITE_ENABLE_STAT4 + pBuilder->nRecValid = nRecValid; +#endif + } + pNew->prereq = saved_prereq; + pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; + pNew->nSkip = saved_nSkip; + pNew->wsFlags = saved_wsFlags; + pNew->nOut = saved_nOut; + pNew->nLTerm = saved_nLTerm; + + /* Consider using a skip-scan if there are no WHERE clause constraints + ** available for the left-most terms of the index, and if the average + ** number of repeats in the left-most terms is at least 18. + ** + ** The magic number 18 is selected on the basis that scanning 17 rows + ** is almost always quicker than an index seek (even though if the index + ** contains fewer than 2^17 rows we assume otherwise in other parts of + ** the code). And, even if it is not, it should not be too much slower. + ** On the other hand, the extra seeks could end up being significantly + ** more expensive. */ + assert( 42==sqlite3LogEst(18) ); + if( saved_nEq==saved_nSkip + && saved_nEq+1nKeyCol + && saved_nEq==pNew->nLTerm + && pProbe->noSkipScan==0 + && pProbe->hasStat1!=0 + && OptimizationEnabled(db, SQLITE_SkipScan) + && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ + && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK + ){ + LogEst nIter; + pNew->u.btree.nEq++; + pNew->nSkip++; + pNew->aLTerm[pNew->nLTerm++] = 0; + pNew->wsFlags |= WHERE_SKIPSCAN; + nIter = pProbe->aiRowLogEst[saved_nEq] - pProbe->aiRowLogEst[saved_nEq+1]; + pNew->nOut -= nIter; + /* TUNING: Because uncertainties in the estimates for skip-scan queries, + ** add a 1.375 fudge factor to make skip-scan slightly less likely. */ + nIter += 5; + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nIter + nInMul); + pNew->nOut = saved_nOut; + pNew->u.btree.nEq = saved_nEq; + pNew->nSkip = saved_nSkip; + pNew->wsFlags = saved_wsFlags; + } + + WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n", + pProbe->pTable->zName, pProbe->zName, saved_nEq, rc)); + return rc; +} + +/* +** Return True if it is possible that pIndex might be useful in +** implementing the ORDER BY clause in pBuilder. +** +** Return False if pBuilder does not contain an ORDER BY clause or +** if there is no way for pIndex to be useful in implementing that +** ORDER BY clause. +*/ +static int indexMightHelpWithOrderBy( + WhereLoopBuilder *pBuilder, + Index *pIndex, + int iCursor +){ + ExprList *pOB; + ExprList *aColExpr; + int ii, jj; + + if( pIndex->bUnordered ) return 0; + if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; + for(ii=0; iinExpr; ii++){ + Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr); + if( NEVER(pExpr==0) ) continue; + if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ + if( pExpr->iColumn<0 ) return 1; + for(jj=0; jjnKeyCol; jj++){ + if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; + } + }else if( (aColExpr = pIndex->aColExpr)!=0 ){ + for(jj=0; jjnKeyCol; jj++){ + if( pIndex->aiColumn[jj]!=XN_EXPR ) continue; + if( sqlite3ExprCompareSkip(pExpr,aColExpr->a[jj].pExpr,iCursor)==0 ){ + return 1; + } + } + } + } + return 0; +} + +/* Check to see if a partial index with pPartIndexWhere can be used +** in the current query. Return true if it can be and false if not. +*/ +static int whereUsablePartialIndex( + int iTab, /* The table for which we want an index */ + u8 jointype, /* The JT_* flags on the join */ + WhereClause *pWC, /* The WHERE clause of the query */ + Expr *pWhere /* The WHERE clause from the partial index */ +){ + int i; + WhereTerm *pTerm; + Parse *pParse; + + if( jointype & JT_LTORJ ) return 0; + pParse = pWC->pWInfo->pParse; + while( pWhere->op==TK_AND ){ + if( !whereUsablePartialIndex(iTab,jointype,pWC,pWhere->pLeft) ) return 0; + pWhere = pWhere->pRight; + } + if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + pExpr = pTerm->pExpr; + if( (!ExprHasProperty(pExpr, EP_OuterON) || pExpr->w.iJoin==iTab) + && ((jointype & JT_OUTER)==0 || ExprHasProperty(pExpr, EP_OuterON)) + && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) + && (pTerm->wtFlags & TERM_VNULL)==0 + ){ + return 1; + } + } + return 0; +} + +/* +** Add all WhereLoop objects for a single table of the join where the table +** is identified by pBuilder->pNew->iTab. That table is guaranteed to be +** a b-tree table, not a virtual table. +** +** The costs (WhereLoop.rRun) of the b-tree loops added by this function +** are calculated as follows: +** +** For a full scan, assuming the table (or index) contains nRow rows: +** +** cost = nRow * 3.0 // full-table scan +** cost = nRow * K // scan of covering index +** cost = nRow * (K+3.0) // scan of non-covering index +** +** where K is a value between 1.1 and 3.0 set based on the relative +** estimated average size of the index and table records. +** +** For an index scan, where nVisit is the number of index rows visited +** by the scan, and nSeek is the number of seek operations required on +** the index b-tree: +** +** cost = nSeek * (log(nRow) + K * nVisit) // covering index +** cost = nSeek * (log(nRow) + (K+3.0) * nVisit) // non-covering index +** +** Normally, nSeek is 1. nSeek values greater than 1 come about if the +** WHERE clause includes "x IN (....)" terms used in place of "x=?". Or when +** implicit "x IN (SELECT x FROM tbl)" terms are added for skip-scans. +** +** The estimated values (nRow, nVisit, nSeek) often contain a large amount +** of uncertainty. For this reason, scoring is designed to pick plans that +** "do the least harm" if the estimates are inaccurate. For example, a +** log(nRow) factor is omitted from a non-covering index scan in order to +** bias the scoring in favor of using an index, since the worst-case +** performance of using an index is far better than the worst-case performance +** of a full table scan. +*/ +static int whereLoopAddBtree( + WhereLoopBuilder *pBuilder, /* WHERE clause information */ + Bitmask mPrereq /* Extra prerequesites for using this table */ +){ + WhereInfo *pWInfo; /* WHERE analysis context */ + Index *pProbe; /* An index we are evaluating */ + Index sPk; /* A fake index object for the primary key */ + LogEst aiRowEstPk[2]; /* The aiRowLogEst[] value for the sPk index */ + i16 aiColumnPk = -1; /* The aColumn[] value for the sPk index */ + SrcList *pTabList; /* The FROM clause */ + SrcItem *pSrc; /* The FROM clause btree term to add */ + WhereLoop *pNew; /* Template WhereLoop object */ + int rc = SQLITE_OK; /* Return code */ + int iSortIdx = 1; /* Index number */ + int b; /* A boolean value */ + LogEst rSize; /* number of rows in the table */ + WhereClause *pWC; /* The parsed WHERE clause */ + Table *pTab; /* Table being queried */ + + pNew = pBuilder->pNew; + pWInfo = pBuilder->pWInfo; + pTabList = pWInfo->pTabList; + pSrc = pTabList->a + pNew->iTab; + pTab = pSrc->pTab; + pWC = pBuilder->pWC; + assert( !IsVirtual(pSrc->pTab) ); + + if( pSrc->fg.isIndexedBy ){ + assert( pSrc->fg.isCte==0 ); + /* An INDEXED BY clause specifies a particular index to use */ + pProbe = pSrc->u2.pIBIndex; + }else if( !HasRowid(pTab) ){ + pProbe = pTab->pIndex; + }else{ + /* There is no INDEXED BY clause. Create a fake Index object in local + ** variable sPk to represent the rowid primary key index. Make this + ** fake index the first in a chain of Index objects with all of the real + ** indices to follow */ + Index *pFirst; /* First of real indices on the table */ + memset(&sPk, 0, sizeof(Index)); + sPk.nKeyCol = 1; + sPk.nColumn = 1; + sPk.aiColumn = &aiColumnPk; + sPk.aiRowLogEst = aiRowEstPk; + sPk.onError = OE_Replace; + sPk.pTable = pTab; + sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; + aiRowEstPk[0] = pTab->nRowLogEst; + aiRowEstPk[1] = 0; + pFirst = pSrc->pTab->pIndex; + if( pSrc->fg.notIndexed==0 ){ + /* The real indices of the table are only considered if the + ** NOT INDEXED qualifier is omitted from the FROM clause */ + sPk.pNext = pFirst; + } + pProbe = &sPk; + } + rSize = pTab->nRowLogEst; + +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX + /* Automatic indexes */ + if( !pBuilder->pOrSet /* Not part of an OR optimization */ + && (pWInfo->wctrlFlags & (WHERE_RIGHT_JOIN|WHERE_OR_SUBCLAUSE))==0 + && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 + && !pSrc->fg.isIndexedBy /* Has no INDEXED BY clause */ + && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ + && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ + && !pSrc->fg.isCorrelated /* Not a correlated subquery */ + && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ + && (pSrc->fg.jointype & JT_RIGHT)==0 /* Not the right tab of a RIGHT JOIN */ + ){ + /* Generate auto-index WhereLoops */ + LogEst rLogSize; /* Logarithm of the number of rows in the table */ + WhereTerm *pTerm; + WhereTerm *pWCEnd = pWC->a + pWC->nTerm; + rLogSize = estLog(rSize); + for(pTerm=pWC->a; rc==SQLITE_OK && pTermprereqRight & pNew->maskSelf ) continue; + if( termCanDriveIndex(pTerm, pSrc, 0) ){ + pNew->u.btree.nEq = 1; + pNew->nSkip = 0; + pNew->u.btree.pIndex = 0; + pNew->nLTerm = 1; + pNew->aLTerm[0] = pTerm; + /* TUNING: One-time cost for computing the automatic index is + ** estimated to be X*N*log2(N) where N is the number of rows in + ** the table being indexed and where X is 7 (LogEst=28) for normal + ** tables or 0.5 (LogEst=-10) for views and subqueries. The value + ** of X is smaller for views and subqueries so that the query planner + ** will be more aggressive about generating automatic indexes for + ** those objects, since there is no opportunity to add schema + ** indexes on subqueries and views. */ + pNew->rSetup = rLogSize + rSize; + if( !IsView(pTab) && (pTab->tabFlags & TF_Ephemeral)==0 ){ + pNew->rSetup += 28; + }else{ + pNew->rSetup -= 10; + } + ApplyCostMultiplier(pNew->rSetup, pTab->costMult); + if( pNew->rSetup<0 ) pNew->rSetup = 0; + /* TUNING: Each index lookup yields 20 rows in the table. This + ** is more than the usual guess of 10 rows, since we have no way + ** of knowing how selective the index will ultimately be. It would + ** not be unreasonable to make this value much larger. */ + pNew->nOut = 43; assert( 43==sqlite3LogEst(20) ); + pNew->rRun = sqlite3LogEstAdd(rLogSize,pNew->nOut); + pNew->wsFlags = WHERE_AUTO_INDEX; + pNew->prereq = mPrereq | pTerm->prereqRight; + rc = whereLoopInsert(pBuilder, pNew); + } + } + } +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + + /* Loop over all indices. If there was an INDEXED BY clause, then only + ** consider index pProbe. */ + for(; rc==SQLITE_OK && pProbe; + pProbe=(pSrc->fg.isIndexedBy ? 0 : pProbe->pNext), iSortIdx++ + ){ + if( pProbe->pPartIdxWhere!=0 + && !whereUsablePartialIndex(pSrc->iCursor, pSrc->fg.jointype, pWC, + pProbe->pPartIdxWhere) + ){ + testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ + continue; /* Partial index inappropriate for this query */ + } + if( pProbe->bNoQuery ) continue; + rSize = pProbe->aiRowLogEst[0]; + pNew->u.btree.nEq = 0; + pNew->u.btree.nBtm = 0; + pNew->u.btree.nTop = 0; + pNew->nSkip = 0; + pNew->nLTerm = 0; + pNew->iSortIdx = 0; + pNew->rSetup = 0; + pNew->prereq = mPrereq; + pNew->nOut = rSize; + pNew->u.btree.pIndex = pProbe; + b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); + + /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ + assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ + /* Integer primary key index */ + pNew->wsFlags = WHERE_IPK; + + /* Full table scan */ + pNew->iSortIdx = b ? iSortIdx : 0; + /* TUNING: Cost of full table scan is 3.0*N. The 3.0 factor is an + ** extra cost designed to discourage the use of full table scans, + ** since index lookups have better worst-case performance if our + ** stat guesses are wrong. Reduce the 3.0 penalty slightly + ** (to 2.75) if we have valid STAT4 information for the table. + ** At 2.75, a full table scan is preferred over using an index on + ** a column with just two distinct values where each value has about + ** an equal number of appearances. Without STAT4 data, we still want + ** to use an index in that case, since the constraint might be for + ** the scarcer of the two values, and in that case an index lookup is + ** better. + */ +#ifdef SQLITE_ENABLE_STAT4 + pNew->rRun = rSize + 16 - 2*((pTab->tabFlags & TF_HasStat4)!=0); +#else + pNew->rRun = rSize + 16; +#endif + ApplyCostMultiplier(pNew->rRun, pTab->costMult); + whereLoopOutputAdjust(pWC, pNew, rSize); + rc = whereLoopInsert(pBuilder, pNew); + pNew->nOut = rSize; + if( rc ) break; + }else{ + Bitmask m; + if( pProbe->isCovering ){ + pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED; + m = 0; + }else{ + m = pSrc->colUsed & pProbe->colNotIdxed; + pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED; + } + + /* Full scan via index */ + if( b + || !HasRowid(pTab) + || pProbe->pPartIdxWhere!=0 + || pSrc->fg.isIndexedBy + || ( m==0 + && pProbe->bUnordered==0 + && (pProbe->szIdxRowszTabRow) + && (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 + && sqlite3GlobalConfig.bUseCis + && OptimizationEnabled(pWInfo->pParse->db, SQLITE_CoverIdxScan) + ) + ){ + pNew->iSortIdx = b ? iSortIdx : 0; + + /* The cost of visiting the index rows is N*K, where K is + ** between 1.1 and 3.0, depending on the relative sizes of the + ** index and table rows. */ + pNew->rRun = rSize + 1 + (15*pProbe->szIdxRow)/pTab->szTabRow; + if( m!=0 ){ + /* If this is a non-covering index scan, add in the cost of + ** doing table lookups. The cost will be 3x the number of + ** lookups. Take into account WHERE clause terms that can be + ** satisfied using just the index, and that do not require a + ** table lookup. */ + LogEst nLookup = rSize + 16; /* Base cost: N*3 */ + int ii; + int iCur = pSrc->iCursor; + WhereClause *pWC2 = &pWInfo->sWC; + for(ii=0; iinTerm; ii++){ + WhereTerm *pTerm = &pWC2->a[ii]; + if( !sqlite3ExprCoveredByIndex(pTerm->pExpr, iCur, pProbe) ){ + break; + } + /* pTerm can be evaluated using just the index. So reduce + ** the expected number of table lookups accordingly */ + if( pTerm->truthProb<=0 ){ + nLookup += pTerm->truthProb; + }else{ + nLookup--; + if( pTerm->eOperator & (WO_EQ|WO_IS) ) nLookup -= 19; + } + } + + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, nLookup); + } + ApplyCostMultiplier(pNew->rRun, pTab->costMult); + whereLoopOutputAdjust(pWC, pNew, rSize); + if( (pSrc->fg.jointype & JT_RIGHT)!=0 && pProbe->aColExpr ){ + /* Do not do an SCAN of a index-on-expression in a RIGHT JOIN + ** because the cursor used to access the index might not be + ** positioned to the correct row during the right-join no-match + ** loop. */ + }else{ + rc = whereLoopInsert(pBuilder, pNew); + } + pNew->nOut = rSize; + if( rc ) break; + } + } + + pBuilder->bldFlags1 = 0; + rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); + if( pBuilder->bldFlags1==SQLITE_BLDF1_INDEXED ){ + /* If a non-unique index is used, or if a prefix of the key for + ** unique index is used (making the index functionally non-unique) + ** then the sqlite_stat1 data becomes important for scoring the + ** plan */ + pTab->tabFlags |= TF_StatsUsed; + } +#ifdef SQLITE_ENABLE_STAT4 + sqlite3Stat4ProbeFree(pBuilder->pRec); + pBuilder->nRecValid = 0; + pBuilder->pRec = 0; +#endif + } + return rc; +} + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* +** Return true if pTerm is a virtual table LIMIT or OFFSET term. +*/ +static int isLimitTerm(WhereTerm *pTerm){ + assert( pTerm->eOperator==WO_AUX || pTerm->eMatchOp==0 ); + return pTerm->eMatchOp>=SQLITE_INDEX_CONSTRAINT_LIMIT + && pTerm->eMatchOp<=SQLITE_INDEX_CONSTRAINT_OFFSET; +} + +/* +** Argument pIdxInfo is already populated with all constraints that may +** be used by the virtual table identified by pBuilder->pNew->iTab. This +** function marks a subset of those constraints usable, invokes the +** xBestIndex method and adds the returned plan to pBuilder. +** +** A constraint is marked usable if: +** +** * Argument mUsable indicates that its prerequisites are available, and +** +** * It is not one of the operators specified in the mExclude mask passed +** as the fourth argument (which in practice is either WO_IN or 0). +** +** Argument mPrereq is a mask of tables that must be scanned before the +** virtual table in question. These are added to the plans prerequisites +** before it is added to pBuilder. +** +** Output parameter *pbIn is set to true if the plan added to pBuilder +** uses one or more WO_IN terms, or false otherwise. +*/ +static int whereLoopAddVirtualOne( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, /* Mask of tables that must be used. */ + Bitmask mUsable, /* Mask of usable tables */ + u16 mExclude, /* Exclude terms using these operators */ + sqlite3_index_info *pIdxInfo, /* Populated object for xBestIndex */ + u16 mNoOmit, /* Do not omit these constraints */ + int *pbIn, /* OUT: True if plan uses an IN(...) op */ + int *pbRetryLimit /* OUT: Retry without LIMIT/OFFSET */ +){ + WhereClause *pWC = pBuilder->pWC; + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_constraint_usage *pUsage = pIdxInfo->aConstraintUsage; + int i; + int mxTerm; + int rc = SQLITE_OK; + WhereLoop *pNew = pBuilder->pNew; + Parse *pParse = pBuilder->pWInfo->pParse; + SrcItem *pSrc = &pBuilder->pWInfo->pTabList->a[pNew->iTab]; + int nConstraint = pIdxInfo->nConstraint; + + assert( (mUsable & mPrereq)==mPrereq ); + *pbIn = 0; + pNew->prereq = mPrereq; + + /* Set the usable flag on the subset of constraints identified by + ** arguments mUsable and mExclude. */ + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; ia[pIdxCons->iTermOffset]; + pIdxCons->usable = 0; + if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight + && (pTerm->eOperator & mExclude)==0 + && (pbRetryLimit || !isLimitTerm(pTerm)) + ){ + pIdxCons->usable = 1; + } + } + + /* Initialize the output fields of the sqlite3_index_info structure */ + memset(pUsage, 0, sizeof(pUsage[0])*nConstraint); + assert( pIdxInfo->needToFreeIdxStr==0 ); + pIdxInfo->idxStr = 0; + pIdxInfo->idxNum = 0; + pIdxInfo->orderByConsumed = 0; + pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; + pIdxInfo->estimatedRows = 25; + pIdxInfo->idxFlags = 0; + pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; + pHidden->mHandleIn = 0; + + /* Invoke the virtual table xBestIndex() method */ + rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); + if( rc ){ + if( rc==SQLITE_CONSTRAINT ){ + /* If the xBestIndex method returns SQLITE_CONSTRAINT, that means + ** that the particular combination of parameters provided is unusable. + ** Make no entries in the loop table. + */ + WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n")); + return SQLITE_OK; + } + return rc; + } + + mxTerm = -1; + assert( pNew->nLSlot>=nConstraint ); + memset(pNew->aLTerm, 0, sizeof(pNew->aLTerm[0])*nConstraint ); + memset(&pNew->u.vtab, 0, sizeof(pNew->u.vtab)); + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; i=0 ){ + WhereTerm *pTerm; + int j = pIdxCons->iTermOffset; + if( iTerm>=nConstraint + || j<0 + || j>=pWC->nTerm + || pNew->aLTerm[iTerm]!=0 + || pIdxCons->usable==0 + ){ + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + testcase( pIdxInfo->needToFreeIdxStr ); + return SQLITE_ERROR; + } + testcase( iTerm==nConstraint-1 ); + testcase( j==0 ); + testcase( j==pWC->nTerm-1 ); + pTerm = &pWC->a[j]; + pNew->prereq |= pTerm->prereqRight; + assert( iTermnLSlot ); + pNew->aLTerm[iTerm] = pTerm; + if( iTerm>mxTerm ) mxTerm = iTerm; + testcase( iTerm==15 ); + testcase( iTerm==16 ); + if( pUsage[i].omit ){ + if( i<16 && ((1<u.vtab.omitMask |= 1<eMatchOp==SQLITE_INDEX_CONSTRAINT_OFFSET ){ + pNew->u.vtab.bOmitOffset = 1; + } + } + if( SMASKBIT32(i) & pHidden->mHandleIn ){ + pNew->u.vtab.mHandleIn |= MASKBIT32(iTerm); + }else if( (pTerm->eOperator & WO_IN)!=0 ){ + /* A virtual table that is constrained by an IN clause may not + ** consume the ORDER BY clause because (1) the order of IN terms + ** is not necessarily related to the order of output terms and + ** (2) Multiple outputs from a single IN value will not merge + ** together. */ + pIdxInfo->orderByConsumed = 0; + pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; + *pbIn = 1; assert( (mExclude & WO_IN)==0 ); + } + + assert( pbRetryLimit || !isLimitTerm(pTerm) ); + if( isLimitTerm(pTerm) && *pbIn ){ + /* If there is an IN(...) term handled as an == (separate call to + ** xFilter for each value on the RHS of the IN) and a LIMIT or + ** OFFSET term handled as well, the plan is unusable. Set output + ** variable *pbRetryLimit to true to tell the caller to retry with + ** LIMIT and OFFSET disabled. */ + if( pIdxInfo->needToFreeIdxStr ){ + sqlite3_free(pIdxInfo->idxStr); + pIdxInfo->idxStr = 0; + pIdxInfo->needToFreeIdxStr = 0; + } + *pbRetryLimit = 1; + return SQLITE_OK; + } + } + } + + pNew->nLTerm = mxTerm+1; + for(i=0; i<=mxTerm; i++){ + if( pNew->aLTerm[i]==0 ){ + /* The non-zero argvIdx values must be contiguous. Raise an + ** error if they are not */ + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + testcase( pIdxInfo->needToFreeIdxStr ); + return SQLITE_ERROR; + } + } + assert( pNew->nLTerm<=pNew->nLSlot ); + pNew->u.vtab.idxNum = pIdxInfo->idxNum; + pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr; + pIdxInfo->needToFreeIdxStr = 0; + pNew->u.vtab.idxStr = pIdxInfo->idxStr; + pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ? + pIdxInfo->nOrderBy : 0); + pNew->rSetup = 0; + pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); + pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); + + /* Set the WHERE_ONEROW flag if the xBestIndex() method indicated + ** that the scan will visit at most one row. Clear it otherwise. */ + if( pIdxInfo->idxFlags & SQLITE_INDEX_SCAN_UNIQUE ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags &= ~WHERE_ONEROW; + } + rc = whereLoopInsert(pBuilder, pNew); + if( pNew->u.vtab.needFree ){ + sqlite3_free(pNew->u.vtab.idxStr); + pNew->u.vtab.needFree = 0; + } + WHERETRACE(0xffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n", + *pbIn, (sqlite3_uint64)mPrereq, + (sqlite3_uint64)(pNew->prereq & ~mPrereq))); + + return rc; +} + +/* +** Return the collating sequence for a constraint passed into xBestIndex. +** +** pIdxInfo must be an sqlite3_index_info structure passed into xBestIndex. +** This routine depends on there being a HiddenIndexInfo structure immediately +** following the sqlite3_index_info structure. +** +** Return a pointer to the collation name: +** +** 1. If there is an explicit COLLATE operator on the constaint, return it. +** +** 2. Else, if the column has an alternative collation, return that. +** +** 3. Otherwise, return "BINARY". +*/ +SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + const char *zRet = 0; + if( iCons>=0 && iConsnConstraint ){ + CollSeq *pC = 0; + int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; + Expr *pX = pHidden->pWC->a[iTerm].pExpr; + if( pX->pLeft ){ + pC = sqlite3ExprCompareCollSeq(pHidden->pParse, pX); + } + zRet = (pC ? pC->zName : sqlite3StrBINARY); + } + return zRet; +} + +/* +** Return true if constraint iCons is really an IN(...) constraint, or +** false otherwise. If iCons is an IN(...) constraint, set (if bHandle!=0) +** or clear (if bHandle==0) the flag to handle it using an iterator. +*/ +SQLITE_API int sqlite3_vtab_in(sqlite3_index_info *pIdxInfo, int iCons, int bHandle){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + u32 m = SMASKBIT32(iCons); + if( m & pHidden->mIn ){ + if( bHandle==0 ){ + pHidden->mHandleIn &= ~m; + }else if( bHandle>0 ){ + pHidden->mHandleIn |= m; + } + return 1; + } + return 0; +} + +/* +** This interface is callable from within the xBestIndex callback only. +** +** If possible, set (*ppVal) to point to an object containing the value +** on the right-hand-side of constraint iCons. +*/ +SQLITE_API int sqlite3_vtab_rhs_value( + sqlite3_index_info *pIdxInfo, /* Copy of first argument to xBestIndex */ + int iCons, /* Constraint for which RHS is wanted */ + sqlite3_value **ppVal /* Write value extracted here */ +){ + HiddenIndexInfo *pH = (HiddenIndexInfo*)&pIdxInfo[1]; + sqlite3_value *pVal = 0; + int rc = SQLITE_OK; + if( iCons<0 || iCons>=pIdxInfo->nConstraint ){ + rc = SQLITE_MISUSE; /* EV: R-30545-25046 */ + }else{ + if( pH->aRhs[iCons]==0 ){ + WhereTerm *pTerm = &pH->pWC->a[pIdxInfo->aConstraint[iCons].iTermOffset]; + rc = sqlite3ValueFromExpr( + pH->pParse->db, pTerm->pExpr->pRight, ENC(pH->pParse->db), + SQLITE_AFF_BLOB, &pH->aRhs[iCons] + ); + testcase( rc!=SQLITE_OK ); + } + pVal = pH->aRhs[iCons]; + } + *ppVal = pVal; + + if( rc==SQLITE_OK && pVal==0 ){ /* IMP: R-19933-32160 */ + rc = SQLITE_NOTFOUND; /* IMP: R-36424-56542 */ + } + + return rc; +} + +/* +** Return true if ORDER BY clause may be handled as DISTINCT. +*/ +SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + assert( pHidden->eDistinct>=0 && pHidden->eDistinct<=3 ); + return pHidden->eDistinct; +} + +#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ + && !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** Cause the prepared statement that is associated with a call to +** xBestIndex to potentiall use all schemas. If the statement being +** prepared is read-only, then just start read transactions on all +** schemas. But if this is a write operation, start writes on all +** schemas. +** +** This is used by the (built-in) sqlite_dbpage virtual table. +*/ +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info *pIdxInfo){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + Parse *pParse = pHidden->pParse; + int nDb = pParse->db->nDb; + int i; + for(i=0; iwriteMask ){ + for(i=0; ipNew->iTab. That table is guaranteed to be a virtual table. +** +** If there are no LEFT or CROSS JOIN joins in the query, both mPrereq and +** mUnusable are set to 0. Otherwise, mPrereq is a mask of all FROM clause +** entries that occur before the virtual table in the FROM clause and are +** separated from it by at least one LEFT or CROSS JOIN. Similarly, the +** mUnusable mask contains all FROM clause entries that occur after the +** virtual table and are separated from it by at least one LEFT or +** CROSS JOIN. +** +** For example, if the query were: +** +** ... FROM t1, t2 LEFT JOIN t3, t4, vt CROSS JOIN t5, t6; +** +** then mPrereq corresponds to (t1, t2) and mUnusable to (t5, t6). +** +** All the tables in mPrereq must be scanned before the current virtual +** table. So any terms for which all prerequisites are satisfied by +** mPrereq may be specified as "usable" in all calls to xBestIndex. +** Conversely, all tables in mUnusable must be scanned after the current +** virtual table, so any terms for which the prerequisites overlap with +** mUnusable should always be configured as "not-usable" for xBestIndex. +*/ +static int whereLoopAddVirtual( + WhereLoopBuilder *pBuilder, /* WHERE clause information */ + Bitmask mPrereq, /* Tables that must be scanned before this one */ + Bitmask mUnusable /* Tables that must be scanned after this one */ +){ + int rc = SQLITE_OK; /* Return code */ + WhereInfo *pWInfo; /* WHERE analysis context */ + Parse *pParse; /* The parsing context */ + WhereClause *pWC; /* The WHERE clause */ + SrcItem *pSrc; /* The FROM clause term to search */ + sqlite3_index_info *p; /* Object to pass to xBestIndex() */ + int nConstraint; /* Number of constraints in p */ + int bIn; /* True if plan uses IN(...) operator */ + WhereLoop *pNew; + Bitmask mBest; /* Tables used by best possible plan */ + u16 mNoOmit; + int bRetry = 0; /* True to retry with LIMIT/OFFSET disabled */ + + assert( (mPrereq & mUnusable)==0 ); + pWInfo = pBuilder->pWInfo; + pParse = pWInfo->pParse; + pWC = pBuilder->pWC; + pNew = pBuilder->pNew; + pSrc = &pWInfo->pTabList->a[pNew->iTab]; + assert( IsVirtual(pSrc->pTab) ); + p = allocateIndexInfo(pWInfo, pWC, mUnusable, pSrc, &mNoOmit); + if( p==0 ) return SQLITE_NOMEM_BKPT; + pNew->rSetup = 0; + pNew->wsFlags = WHERE_VIRTUALTABLE; + pNew->nLTerm = 0; + pNew->u.vtab.needFree = 0; + nConstraint = p->nConstraint; + if( whereLoopResize(pParse->db, pNew, nConstraint) ){ + freeIndexInfo(pParse->db, p); + return SQLITE_NOMEM_BKPT; + } + + /* First call xBestIndex() with all constraints usable. */ + WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName)); + WHERETRACE(0x40, (" VirtualOne: all usable\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, &bRetry + ); + if( bRetry ){ + assert( rc==SQLITE_OK ); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, 0 + ); + } + + /* If the call to xBestIndex() with all terms enabled produced a plan + ** that does not require any source tables (IOW: a plan with mBest==0) + ** and does not use an IN(...) operator, then there is no point in making + ** any further calls to xBestIndex() since they will all return the same + ** result (if the xBestIndex() implementation is sane). */ + if( rc==SQLITE_OK && ((mBest = (pNew->prereq & ~mPrereq))!=0 || bIn) ){ + int seenZero = 0; /* True if a plan with no prereqs seen */ + int seenZeroNoIN = 0; /* Plan with no prereqs and no IN(...) seen */ + Bitmask mPrev = 0; + Bitmask mBestNoIn = 0; + + /* If the plan produced by the earlier call uses an IN(...) term, call + ** xBestIndex again, this time with IN(...) terms disabled. */ + if( bIn ){ + WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn, 0); + assert( bIn==0 ); + mBestNoIn = pNew->prereq & ~mPrereq; + if( mBestNoIn==0 ){ + seenZero = 1; + seenZeroNoIN = 1; + } + } + + /* Call xBestIndex once for each distinct value of (prereqRight & ~mPrereq) + ** in the set of terms that apply to the current virtual table. */ + while( rc==SQLITE_OK ){ + int i; + Bitmask mNext = ALLBITS; + assert( mNext>0 ); + for(i=0; ia[p->aConstraint[i].iTermOffset].prereqRight & ~mPrereq + ); + if( mThis>mPrev && mThisprereq==mPrereq ){ + seenZero = 1; + if( bIn==0 ) seenZeroNoIN = 1; + } + } + + /* If the calls to xBestIndex() in the above loop did not find a plan + ** that requires no source tables at all (i.e. one guaranteed to be + ** usable), make a call here with all source tables disabled */ + if( rc==SQLITE_OK && seenZero==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn, 0); + if( bIn==0 ) seenZeroNoIN = 1; + } + + /* If the calls to xBestIndex() have so far failed to find a plan + ** that requires no source tables at all and does not use an IN(...) + ** operator, make a final call to obtain one here. */ + if( rc==SQLITE_OK && seenZeroNoIN==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn, 0); + } + } + + if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr); + freeIndexInfo(pParse->db, p); + WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc)); + return rc; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** Add WhereLoop entries to handle OR terms. This works for either +** btrees or virtual tables. +*/ +static int whereLoopAddOr( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, + Bitmask mUnusable +){ + WhereInfo *pWInfo = pBuilder->pWInfo; + WhereClause *pWC; + WhereLoop *pNew; + WhereTerm *pTerm, *pWCEnd; + int rc = SQLITE_OK; + int iCur; + WhereClause tempWC; + WhereLoopBuilder sSubBuild; + WhereOrSet sSum, sCur; + SrcItem *pItem; + + pWC = pBuilder->pWC; + pWCEnd = pWC->a + pWC->nTerm; + pNew = pBuilder->pNew; + memset(&sSum, 0, sizeof(sSum)); + pItem = pWInfo->pTabList->a + pNew->iTab; + iCur = pItem->iCursor; + + /* The multi-index OR optimization does not work for RIGHT and FULL JOIN */ + if( pItem->fg.jointype & JT_RIGHT ) return SQLITE_OK; + + for(pTerm=pWC->a; pTermeOperator & WO_OR)!=0 + && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 + ){ + WhereClause * const pOrWC = &pTerm->u.pOrInfo->wc; + WhereTerm * const pOrWCEnd = &pOrWC->a[pOrWC->nTerm]; + WhereTerm *pOrTerm; + int once = 1; + int i, j; + + sSubBuild = *pBuilder; + sSubBuild.pOrSet = &sCur; + + WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm)); + for(pOrTerm=pOrWC->a; pOrTermeOperator & WO_AND)!=0 ){ + sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc; + }else if( pOrTerm->leftCursor==iCur ){ + tempWC.pWInfo = pWC->pWInfo; + tempWC.pOuter = pWC; + tempWC.op = TK_AND; + tempWC.nTerm = 1; + tempWC.nBase = 1; + tempWC.a = pOrTerm; + sSubBuild.pWC = &tempWC; + }else{ + continue; + } + sCur.n = 0; +#ifdef WHERETRACE_ENABLED + WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", + (int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm)); + if( sqlite3WhereTrace & 0x400 ){ + sqlite3WhereClausePrint(sSubBuild.pWC); + } +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pItem->pTab) ){ + rc = whereLoopAddVirtual(&sSubBuild, mPrereq, mUnusable); + }else +#endif + { + rc = whereLoopAddBtree(&sSubBuild, mPrereq); + } + if( rc==SQLITE_OK ){ + rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable); + } + assert( rc==SQLITE_OK || rc==SQLITE_DONE || sCur.n==0 + || rc==SQLITE_NOMEM ); + testcase( rc==SQLITE_NOMEM && sCur.n>0 ); + testcase( rc==SQLITE_DONE ); + if( sCur.n==0 ){ + sSum.n = 0; + break; + }else if( once ){ + whereOrMove(&sSum, &sCur); + once = 0; + }else{ + WhereOrSet sPrev; + whereOrMove(&sPrev, &sSum); + sSum.n = 0; + for(i=0; inLTerm = 1; + pNew->aLTerm[0] = pTerm; + pNew->wsFlags = WHERE_MULTI_OR; + pNew->rSetup = 0; + pNew->iSortIdx = 0; + memset(&pNew->u, 0, sizeof(pNew->u)); + for(i=0; rc==SQLITE_OK && irRun = sSum.a[i].rRun + 1; + pNew->nOut = sSum.a[i].nOut; + pNew->prereq = sSum.a[i].prereq; + rc = whereLoopInsert(pBuilder, pNew); + } + WHERETRACE(0x200, ("End processing OR-clause %p\n", pTerm)); + } + } + return rc; +} + +/* +** Add all WhereLoop objects for all tables +*/ +static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ + WhereInfo *pWInfo = pBuilder->pWInfo; + Bitmask mPrereq = 0; + Bitmask mPrior = 0; + int iTab; + SrcList *pTabList = pWInfo->pTabList; + SrcItem *pItem; + SrcItem *pEnd = &pTabList->a[pWInfo->nLevel]; + sqlite3 *db = pWInfo->pParse->db; + int rc = SQLITE_OK; + int bFirstPastRJ = 0; + int hasRightJoin = 0; + WhereLoop *pNew; + + + /* Loop over the tables in the join, from left to right */ + pNew = pBuilder->pNew; + whereLoopInit(pNew); + pBuilder->iPlanLimit = SQLITE_QUERY_PLANNER_LIMIT; + for(iTab=0, pItem=pTabList->a; pItemiTab = iTab; + pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; + pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); + if( bFirstPastRJ + || (pItem->fg.jointype & (JT_OUTER|JT_CROSS|JT_LTORJ))!=0 + ){ + /* Add prerequisites to prevent reordering of FROM clause terms + ** across CROSS joins and outer joins. The bFirstPastRJ boolean + ** prevents the right operand of a RIGHT JOIN from being swapped with + ** other elements even further to the right. + ** + ** The JT_LTORJ case and the hasRightJoin flag work together to + ** prevent FROM-clause terms from moving from the right side of + ** a LEFT JOIN over to the left side of that join if the LEFT JOIN + ** is itself on the left side of a RIGHT JOIN. + */ + if( pItem->fg.jointype & JT_LTORJ ) hasRightJoin = 1; + mPrereq |= mPrior; + bFirstPastRJ = (pItem->fg.jointype & JT_RIGHT)!=0; + }else if( !hasRightJoin ){ + mPrereq = 0; + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( IsVirtual(pItem->pTab) ){ + SrcItem *p; + for(p=&pItem[1]; pfg.jointype & (JT_OUTER|JT_CROSS)) ){ + mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); + } + } + rc = whereLoopAddVirtual(pBuilder, mPrereq, mUnusable); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + { + rc = whereLoopAddBtree(pBuilder, mPrereq); + } + if( rc==SQLITE_OK && pBuilder->pWC->hasOr ){ + rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); + } + mPrior |= pNew->maskSelf; + if( rc || db->mallocFailed ){ + if( rc==SQLITE_DONE ){ + /* We hit the query planner search limit set by iPlanLimit */ + sqlite3_log(SQLITE_WARNING, "abbreviated query algorithm search"); + rc = SQLITE_OK; + }else{ + break; + } + } + } + + whereLoopClear(db, pNew); + return rc; +} + +/* +** Examine a WherePath (with the addition of the extra WhereLoop of the 6th +** parameters) to see if it outputs rows in the requested ORDER BY +** (or GROUP BY) without requiring a separate sort operation. Return N: +** +** N>0: N terms of the ORDER BY clause are satisfied +** N==0: No terms of the ORDER BY clause are satisfied +** N<0: Unknown yet how many terms of ORDER BY might be satisfied. +** +** Note that processing for WHERE_GROUPBY and WHERE_DISTINCTBY is not as +** strict. With GROUP BY and DISTINCT the only requirement is that +** equivalent rows appear immediately adjacent to one another. GROUP BY +** and DISTINCT do not require rows to appear in any particular order as long +** as equivalent rows are grouped together. Thus for GROUP BY and DISTINCT +** the pOrderBy terms can be matched in any order. With ORDER BY, the +** pOrderBy terms must be matched in strict left-to-right order. +*/ +static i8 wherePathSatisfiesOrderBy( + WhereInfo *pWInfo, /* The WHERE clause */ + ExprList *pOrderBy, /* ORDER BY or GROUP BY or DISTINCT clause to check */ + WherePath *pPath, /* The WherePath to check */ + u16 wctrlFlags, /* WHERE_GROUPBY or _DISTINCTBY or _ORDERBY_LIMIT */ + u16 nLoop, /* Number of entries in pPath->aLoop[] */ + WhereLoop *pLast, /* Add this WhereLoop to the end of pPath->aLoop[] */ + Bitmask *pRevMask /* OUT: Mask of WhereLoops to run in reverse order */ +){ + u8 revSet; /* True if rev is known */ + u8 rev; /* Composite sort order */ + u8 revIdx; /* Index sort order */ + u8 isOrderDistinct; /* All prior WhereLoops are order-distinct */ + u8 distinctColumns; /* True if the loop has UNIQUE NOT NULL columns */ + u8 isMatch; /* iColumn matches a term of the ORDER BY clause */ + u16 eqOpMask; /* Allowed equality operators */ + u16 nKeyCol; /* Number of key columns in pIndex */ + u16 nColumn; /* Total number of ordered columns in the index */ + u16 nOrderBy; /* Number terms in the ORDER BY clause */ + int iLoop; /* Index of WhereLoop in pPath being processed */ + int i, j; /* Loop counters */ + int iCur; /* Cursor number for current WhereLoop */ + int iColumn; /* A column number within table iCur */ + WhereLoop *pLoop = 0; /* Current WhereLoop being processed. */ + WhereTerm *pTerm; /* A single term of the WHERE clause */ + Expr *pOBExpr; /* An expression from the ORDER BY clause */ + CollSeq *pColl; /* COLLATE function from an ORDER BY clause term */ + Index *pIndex; /* The index associated with pLoop */ + sqlite3 *db = pWInfo->pParse->db; /* Database connection */ + Bitmask obSat = 0; /* Mask of ORDER BY terms satisfied so far */ + Bitmask obDone; /* Mask of all ORDER BY terms */ + Bitmask orderDistinctMask; /* Mask of all well-ordered loops */ + Bitmask ready; /* Mask of inner loops */ + + /* + ** We say the WhereLoop is "one-row" if it generates no more than one + ** row of output. A WhereLoop is one-row if all of the following are true: + ** (a) All index columns match with WHERE_COLUMN_EQ. + ** (b) The index is unique + ** Any WhereLoop with an WHERE_COLUMN_EQ constraint on the rowid is one-row. + ** Every one-row WhereLoop will have the WHERE_ONEROW bit set in wsFlags. + ** + ** We say the WhereLoop is "order-distinct" if the set of columns from + ** that WhereLoop that are in the ORDER BY clause are different for every + ** row of the WhereLoop. Every one-row WhereLoop is automatically + ** order-distinct. A WhereLoop that has no columns in the ORDER BY clause + ** is not order-distinct. To be order-distinct is not quite the same as being + ** UNIQUE since a UNIQUE column or index can have multiple rows that + ** are NULL and NULL values are equivalent for the purpose of order-distinct. + ** To be order-distinct, the columns must be UNIQUE and NOT NULL. + ** + ** The rowid for a table is always UNIQUE and NOT NULL so whenever the + ** rowid appears in the ORDER BY clause, the corresponding WhereLoop is + ** automatically order-distinct. + */ + + assert( pOrderBy!=0 ); + if( nLoop && OptimizationDisabled(db, SQLITE_OrderByIdxJoin) ) return 0; + + nOrderBy = pOrderBy->nExpr; + testcase( nOrderBy==BMS-1 ); + if( nOrderBy>BMS-1 ) return 0; /* Cannot optimize overly large ORDER BYs */ + isOrderDistinct = 1; + obDone = MASKBIT(nOrderBy)-1; + orderDistinctMask = 0; + ready = 0; + eqOpMask = WO_EQ | WO_IS | WO_ISNULL; + if( wctrlFlags & (WHERE_ORDERBY_LIMIT|WHERE_ORDERBY_MAX|WHERE_ORDERBY_MIN) ){ + eqOpMask |= WO_IN; + } + for(iLoop=0; isOrderDistinct && obSat0 ) ready |= pLoop->maskSelf; + if( iLoopaLoop[iLoop]; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) continue; + }else{ + pLoop = pLast; + } + if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ + if( pLoop->u.vtab.isOrdered + && ((wctrlFlags&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP))!=WHERE_DISTINCTBY) + ){ + obSat = obDone; + } + break; + }else if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = 0; + } + iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; + + /* Mark off any ORDER BY term X that is a column in the table of + ** the current loop for which there is term in the WHERE + ** clause of the form X IS NULL or X=? that reference only outer + ** loops. + */ + for(i=0; ia[i].pExpr); + if( NEVER(pOBExpr==0) ) continue; + if( pOBExpr->op!=TK_COLUMN && pOBExpr->op!=TK_AGG_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, + ~ready, eqOpMask, 0); + if( pTerm==0 ) continue; + if( pTerm->eOperator==WO_IN ){ + /* IN terms are only valid for sorting in the ORDER BY LIMIT + ** optimization, and then only if they are actually used + ** by the query plan */ + assert( wctrlFlags & + (WHERE_ORDERBY_LIMIT|WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX) ); + for(j=0; jnLTerm && pTerm!=pLoop->aLTerm[j]; j++){} + if( j>=pLoop->nLTerm ) continue; + } + if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ + Parse *pParse = pWInfo->pParse; + CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pOrderBy->a[i].pExpr); + CollSeq *pColl2 = sqlite3ExprCompareCollSeq(pParse, pTerm->pExpr); + assert( pColl1 ); + if( pColl2==0 || sqlite3StrICmp(pColl1->zName, pColl2->zName) ){ + continue; + } + testcase( pTerm->pExpr->op==TK_IS ); + } + obSat |= MASKBIT(i); + } + + if( (pLoop->wsFlags & WHERE_ONEROW)==0 ){ + if( pLoop->wsFlags & WHERE_IPK ){ + pIndex = 0; + nKeyCol = 0; + nColumn = 1; + }else if( (pIndex = pLoop->u.btree.pIndex)==0 || pIndex->bUnordered ){ + return 0; + }else{ + nKeyCol = pIndex->nKeyCol; + nColumn = pIndex->nColumn; + assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); + assert( pIndex->aiColumn[nColumn-1]==XN_ROWID + || !HasRowid(pIndex->pTable)); + /* All relevant terms of the index must also be non-NULL in order + ** for isOrderDistinct to be true. So the isOrderDistint value + ** computed here might be a false positive. Corrections will be + ** made at tag-20210426-1 below */ + isOrderDistinct = IsUniqueIndex(pIndex) + && (pLoop->wsFlags & WHERE_SKIPSCAN)==0; + } + + /* Loop through all columns of the index and deal with the ones + ** that are not constrained by == or IN. + */ + rev = revSet = 0; + distinctColumns = 0; + for(j=0; j=pLoop->u.btree.nEq + || (pLoop->aLTerm[j]==0)==(jnSkip) + ); + if( ju.btree.nEq && j>=pLoop->nSkip ){ + u16 eOp = pLoop->aLTerm[j]->eOperator; + + /* Skip over == and IS and ISNULL terms. (Also skip IN terms when + ** doing WHERE_ORDERBY_LIMIT processing). Except, IS and ISNULL + ** terms imply that the index is not UNIQUE NOT NULL in which case + ** the loop need to be marked as not order-distinct because it can + ** have repeated NULL rows. + ** + ** If the current term is a column of an ((?,?) IN (SELECT...)) + ** expression for which the SELECT returns more than one column, + ** check that it is the only column used by this loop. Otherwise, + ** if it is one of two or more, none of the columns can be + ** considered to match an ORDER BY term. + */ + if( (eOp & eqOpMask)!=0 ){ + if( eOp & (WO_ISNULL|WO_IS) ){ + testcase( eOp & WO_ISNULL ); + testcase( eOp & WO_IS ); + testcase( isOrderDistinct ); + isOrderDistinct = 0; + } + continue; + }else if( ALWAYS(eOp & WO_IN) ){ + /* ALWAYS() justification: eOp is an equality operator due to the + ** ju.btree.nEq constraint above. Any equality other + ** than WO_IN is captured by the previous "if". So this one + ** always has to be WO_IN. */ + Expr *pX = pLoop->aLTerm[j]->pExpr; + for(i=j+1; iu.btree.nEq; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + assert( (pLoop->aLTerm[i]->eOperator & WO_IN) ); + bOnce = 0; + break; + } + } + } + } + + /* Get the column number in the table (iColumn) and sort order + ** (revIdx) for the j-th column of the index. + */ + if( pIndex ){ + iColumn = pIndex->aiColumn[j]; + revIdx = pIndex->aSortOrder[j] & KEYINFO_ORDER_DESC; + if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; + }else{ + iColumn = XN_ROWID; + revIdx = 0; + } + + /* An unconstrained column that might be NULL means that this + ** WhereLoop is not well-ordered. tag-20210426-1 + */ + if( isOrderDistinct ){ + if( iColumn>=0 + && j>=pLoop->u.btree.nEq + && pIndex->pTable->aCol[iColumn].notNull==0 + ){ + isOrderDistinct = 0; + } + if( iColumn==XN_EXPR ){ + isOrderDistinct = 0; + } + } + + /* Find the ORDER BY term that corresponds to the j-th column + ** of the index and mark that ORDER BY term off + */ + isMatch = 0; + for(i=0; bOnce && ia[i].pExpr); + testcase( wctrlFlags & WHERE_GROUPBY ); + testcase( wctrlFlags & WHERE_DISTINCTBY ); + if( NEVER(pOBExpr==0) ) continue; + if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; + if( iColumn>=XN_ROWID ){ + if( pOBExpr->op!=TK_COLUMN && pOBExpr->op!=TK_AGG_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + if( pOBExpr->iColumn!=iColumn ) continue; + }else{ + Expr *pIdxExpr = pIndex->aColExpr->a[j].pExpr; + if( sqlite3ExprCompareSkip(pOBExpr, pIdxExpr, iCur) ){ + continue; + } + } + if( iColumn!=XN_ROWID ){ + pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); + if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; + } + if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = j+1; + } + isMatch = 1; + break; + } + if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ + /* Make sure the sort order is compatible in an ORDER BY clause. + ** Sort order is irrelevant for a GROUP BY clause. */ + if( revSet ){ + if( (rev ^ revIdx) + != (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC) + ){ + isMatch = 0; + } + }else{ + rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC); + if( rev ) *pRevMask |= MASKBIT(iLoop); + revSet = 1; + } + } + if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){ + if( j==pLoop->u.btree.nEq ){ + pLoop->wsFlags |= WHERE_BIGNULL_SORT; + }else{ + isMatch = 0; + } + } + if( isMatch ){ + if( iColumn==XN_ROWID ){ + testcase( distinctColumns==0 ); + distinctColumns = 1; + } + obSat |= MASKBIT(i); + }else{ + /* No match found */ + if( j==0 || jmaskSelf; + for(i=0; ia[i].pExpr; + mTerm = sqlite3WhereExprUsage(&pWInfo->sMaskSet,p); + if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; + if( (mTerm&~orderDistinctMask)==0 ){ + obSat |= MASKBIT(i); + } + } + } + } /* End the loop over all WhereLoops from outer-most down to inner-most */ + if( obSat==obDone ) return (i8)nOrderBy; + if( !isOrderDistinct ){ + for(i=nOrderBy-1; i>0; i--){ + Bitmask m = ALWAYS(iwctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY) ); + assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP ); + return pWInfo->sorted; +} + +#ifdef WHERETRACE_ENABLED +/* For debugging use only: */ +static const char *wherePathName(WherePath *pPath, int nLoop, WhereLoop *pLast){ + static char zName[65]; + int i; + for(i=0; iaLoop[i]->cId; } + if( pLast ) zName[i++] = pLast->cId; + zName[i] = 0; + return zName; +} +#endif + +/* +** Return the cost of sorting nRow rows, assuming that the keys have +** nOrderby columns and that the first nSorted columns are already in +** order. +*/ +static LogEst whereSortingCost( + WhereInfo *pWInfo, + LogEst nRow, + int nOrderBy, + int nSorted +){ + /* TUNING: Estimated cost of a full external sort, where N is + ** the number of rows to sort is: + ** + ** cost = (3.0 * N * log(N)). + ** + ** Or, if the order-by clause has X terms but only the last Y + ** terms are out of order, then block-sorting will reduce the + ** sorting cost to: + ** + ** cost = (3.0 * N * log(N)) * (Y/X) + ** + ** The (Y/X) term is implemented using stack variable rScale + ** below. + */ + LogEst rScale, rSortCost; + assert( nOrderBy>0 && 66==sqlite3LogEst(100) ); + rScale = sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66; + rSortCost = nRow + rScale + 16; + + /* Multiple by log(M) where M is the number of output rows. + ** Use the LIMIT for M if it is smaller. Or if this sort is for + ** a DISTINCT operator, M will be the number of distinct output + ** rows, so fudge it downwards a bit. + */ + if( (pWInfo->wctrlFlags & WHERE_USE_LIMIT)!=0 && pWInfo->iLimitiLimit; + }else if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT) ){ + /* TUNING: In the sort for a DISTINCT operator, assume that the DISTINCT + ** reduces the number of output rows by a factor of 2 */ + if( nRow>10 ){ nRow -= 10; assert( 10==sqlite3LogEst(2) ); } + } + rSortCost += estLog(nRow); + return rSortCost; +} + +/* +** Given the list of WhereLoop objects at pWInfo->pLoops, this routine +** attempts to find the lowest cost path that visits each WhereLoop +** once. This path is then loaded into the pWInfo->a[].pWLoop fields. +** +** Assume that the total number of output rows that will need to be sorted +** will be nRowEst (in the 10*log2 representation). Or, ignore sorting +** costs if nRowEst==0. +** +** Return SQLITE_OK on success or SQLITE_NOMEM of a memory allocation +** error occurs. +*/ +static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ + int mxChoice; /* Maximum number of simultaneous paths tracked */ + int nLoop; /* Number of terms in the join */ + Parse *pParse; /* Parsing context */ + sqlite3 *db; /* The database connection */ + int iLoop; /* Loop counter over the terms of the join */ + int ii, jj; /* Loop counters */ + int mxI = 0; /* Index of next entry to replace */ + int nOrderBy; /* Number of ORDER BY clause terms */ + LogEst mxCost = 0; /* Maximum cost of a set of paths */ + LogEst mxUnsorted = 0; /* Maximum unsorted cost of a set of path */ + int nTo, nFrom; /* Number of valid entries in aTo[] and aFrom[] */ + WherePath *aFrom; /* All nFrom paths at the previous level */ + WherePath *aTo; /* The nTo best paths at the current level */ + WherePath *pFrom; /* An element of aFrom[] that we are working on */ + WherePath *pTo; /* An element of aTo[] that we are working on */ + WhereLoop *pWLoop; /* One of the WhereLoop objects */ + WhereLoop **pX; /* Used to divy up the pSpace memory */ + LogEst *aSortCost = 0; /* Sorting and partial sorting costs */ + char *pSpace; /* Temporary memory used by this routine */ + int nSpace; /* Bytes of space allocated at pSpace */ + + pParse = pWInfo->pParse; + db = pParse->db; + nLoop = pWInfo->nLevel; + /* TUNING: For simple queries, only the best path is tracked. + ** For 2-way joins, the 5 best paths are followed. + ** For joins of 3 or more tables, track the 10 best paths */ + mxChoice = (nLoop<=1) ? 1 : (nLoop==2 ? 5 : 10); + assert( nLoop<=pWInfo->pTabList->nSrc ); + WHERETRACE(0x002, ("---- begin solver. (nRowEst=%d)\n", nRowEst)); + + /* If nRowEst is zero and there is an ORDER BY clause, ignore it. In this + ** case the purpose of this call is to estimate the number of rows returned + ** by the overall query. Once this estimate has been obtained, the caller + ** will invoke this function a second time, passing the estimate as the + ** nRowEst parameter. */ + if( pWInfo->pOrderBy==0 || nRowEst==0 ){ + nOrderBy = 0; + }else{ + nOrderBy = pWInfo->pOrderBy->nExpr; + } + + /* Allocate and initialize space for aTo, aFrom and aSortCost[] */ + nSpace = (sizeof(WherePath)+sizeof(WhereLoop*)*nLoop)*mxChoice*2; + nSpace += sizeof(LogEst) * nOrderBy; + pSpace = sqlite3DbMallocRawNN(db, nSpace); + if( pSpace==0 ) return SQLITE_NOMEM_BKPT; + aTo = (WherePath*)pSpace; + aFrom = aTo+mxChoice; + memset(aFrom, 0, sizeof(aFrom[0])); + pX = (WhereLoop**)(aFrom+mxChoice); + for(ii=mxChoice*2, pFrom=aTo; ii>0; ii--, pFrom++, pX += nLoop){ + pFrom->aLoop = pX; + } + if( nOrderBy ){ + /* If there is an ORDER BY clause and it is not being ignored, set up + ** space for the aSortCost[] array. Each element of the aSortCost array + ** is either zero - meaning it has not yet been initialized - or the + ** cost of sorting nRowEst rows of data where the first X terms of + ** the ORDER BY clause are already in order, where X is the array + ** index. */ + aSortCost = (LogEst*)pX; + memset(aSortCost, 0, sizeof(LogEst) * nOrderBy); + } + assert( aSortCost==0 || &pSpace[nSpace]==(char*)&aSortCost[nOrderBy] ); + assert( aSortCost!=0 || &pSpace[nSpace]==(char*)pX ); + + /* Seed the search with a single WherePath containing zero WhereLoops. + ** + ** TUNING: Do not let the number of iterations go above 28. If the cost + ** of computing an automatic index is not paid back within the first 28 + ** rows, then do not use the automatic index. */ + aFrom[0].nRow = MIN(pParse->nQueryLoop, 48); assert( 48==sqlite3LogEst(28) ); + nFrom = 1; + assert( aFrom[0].isOrdered==0 ); + if( nOrderBy ){ + /* If nLoop is zero, then there are no FROM terms in the query. Since + ** in this case the query may return a maximum of one row, the results + ** are already in the requested order. Set isOrdered to nOrderBy to + ** indicate this. Or, if nLoop is greater than zero, set isOrdered to + ** -1, indicating that the result set may or may not be ordered, + ** depending on the loops added to the current plan. */ + aFrom[0].isOrdered = nLoop>0 ? -1 : nOrderBy; + } + + /* Compute successively longer WherePaths using the previous generation + ** of WherePaths as the basis for the next. Keep track of the mxChoice + ** best paths at each generation */ + for(iLoop=0; iLooppLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + LogEst nOut; /* Rows visited by (pFrom+pWLoop) */ + LogEst rCost; /* Cost of path (pFrom+pWLoop) */ + LogEst rUnsorted; /* Unsorted cost of (pFrom+pWLoop) */ + i8 isOrdered = pFrom->isOrdered; /* isOrdered for (pFrom+pWLoop) */ + Bitmask maskNew; /* Mask of src visited by (..) */ + Bitmask revMask = 0; /* Mask of rev-order loops for (..) */ + + if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<3 ){ + /* Do not use an automatic index if the this loop is expected + ** to run less than 1.25 times. It is tempting to also exclude + ** automatic index usage on an outer loop, but sometimes an automatic + ** index is useful in the outer loop of a correlated subquery. */ + assert( 10==sqlite3LogEst(2) ); + continue; + } + + /* At this point, pWLoop is a candidate to be the next loop. + ** Compute its cost */ + rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow); + rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted); + nOut = pFrom->nRow + pWLoop->nOut; + maskNew = pFrom->maskLoop | pWLoop->maskSelf; + if( isOrdered<0 ){ + isOrdered = wherePathSatisfiesOrderBy(pWInfo, + pWInfo->pOrderBy, pFrom, pWInfo->wctrlFlags, + iLoop, pWLoop, &revMask); + }else{ + revMask = pFrom->revLoop; + } + if( isOrdered>=0 && isOrderedisOrdered^isOrdered)&0x80)==0" is equivalent + ** to (pTo->isOrdered==(-1))==(isOrdered==(-1))" for the range + ** of legal values for isOrdered, -1..64. + */ + for(jj=0, pTo=aTo; jjmaskLoop==maskNew + && ((pTo->isOrdered^isOrdered)&0x80)==0 + ){ + testcase( jj==nTo-1 ); + break; + } + } + if( jj>=nTo ){ + /* None of the existing best-so-far paths match the candidate. */ + if( nTo>=mxChoice + && (rCost>mxCost || (rCost==mxCost && rUnsorted>=mxUnsorted)) + ){ + /* The current candidate is no better than any of the mxChoice + ** paths currently in the best-so-far buffer. So discard + ** this candidate as not viable. */ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf("Skip %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered>=0 ? isOrdered+'0' : '?'); + } +#endif + continue; + } + /* If we reach this points it means that the new candidate path + ** needs to be added to the set of best-so-far paths. */ + if( nTo=0 ? isOrdered+'0' : '?'); + } +#endif + }else{ + /* Control reaches here if best-so-far path pTo=aTo[jj] covers the + ** same set of loops and has the same isOrdered setting as the + ** candidate path. Check to see if the candidate should replace + ** pTo or if the candidate should be skipped. + ** + ** The conditional is an expanded vector comparison equivalent to: + ** (pTo->rCost,pTo->nRow,pTo->rUnsorted) <= (rCost,nOut,rUnsorted) + */ + if( pTo->rCostrCost==rCost + && (pTo->nRownRow==nOut && pTo->rUnsorted<=rUnsorted) + ) + ) + ){ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf( + "Skip %s cost=%-3d,%3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered>=0 ? isOrdered+'0' : '?'); + sqlite3DebugPrintf(" vs %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + } +#endif + /* Discard the candidate path from further consideration */ + testcase( pTo->rCost==rCost ); + continue; + } + testcase( pTo->rCost==rCost+1 ); + /* Control reaches here if the candidate path is better than the + ** pTo path. Replace pTo with the candidate. */ +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + sqlite3DebugPrintf( + "Update %s cost=%-3d,%3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered>=0 ? isOrdered+'0' : '?'); + sqlite3DebugPrintf(" was %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + } +#endif + } + /* pWLoop is a winner. Add it to the set of best so far */ + pTo->maskLoop = pFrom->maskLoop | pWLoop->maskSelf; + pTo->revLoop = revMask; + pTo->nRow = nOut; + pTo->rCost = rCost; + pTo->rUnsorted = rUnsorted; + pTo->isOrdered = isOrdered; + memcpy(pTo->aLoop, pFrom->aLoop, sizeof(WhereLoop*)*iLoop); + pTo->aLoop[iLoop] = pWLoop; + if( nTo>=mxChoice ){ + mxI = 0; + mxCost = aTo[0].rCost; + mxUnsorted = aTo[0].nRow; + for(jj=1, pTo=&aTo[1]; jjrCost>mxCost + || (pTo->rCost==mxCost && pTo->rUnsorted>mxUnsorted) + ){ + mxCost = pTo->rCost; + mxUnsorted = pTo->rUnsorted; + mxI = jj; + } + } + } + } + } + +#ifdef WHERETRACE_ENABLED /* >=2 */ + if( sqlite3WhereTrace & 0x02 ){ + sqlite3DebugPrintf("---- after round %d ----\n", iLoop); + for(ii=0, pTo=aTo; iirCost, pTo->nRow, + pTo->isOrdered>=0 ? (pTo->isOrdered+'0') : '?'); + if( pTo->isOrdered>0 ){ + sqlite3DebugPrintf(" rev=0x%llx\n", pTo->revLoop); + }else{ + sqlite3DebugPrintf("\n"); + } + } + } +#endif + + /* Swap the roles of aFrom and aTo for the next generation */ + pFrom = aTo; + aTo = aFrom; + aFrom = pFrom; + nFrom = nTo; + } + + if( nFrom==0 ){ + sqlite3ErrorMsg(pParse, "no query solution"); + sqlite3DbFreeNN(db, pSpace); + return SQLITE_ERROR; + } + + /* Find the lowest cost path. pFrom will be left pointing to that path */ + pFrom = aFrom; + for(ii=1; iirCost>aFrom[ii].rCost ) pFrom = &aFrom[ii]; + } + assert( pWInfo->nLevel==nLoop ); + /* Load the lowest cost path into pWInfo */ + for(iLoop=0; iLoopa + iLoop; + pLevel->pWLoop = pWLoop = pFrom->aLoop[iLoop]; + pLevel->iFrom = pWLoop->iTab; + pLevel->iTabCur = pWInfo->pTabList->a[pLevel->iFrom].iCursor; + } + if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)!=0 + && (pWInfo->wctrlFlags & WHERE_DISTINCTBY)==0 + && pWInfo->eDistinct==WHERE_DISTINCT_NOOP + && nRowEst + ){ + Bitmask notUsed; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pResultSet, pFrom, + WHERE_DISTINCTBY, nLoop-1, pFrom->aLoop[nLoop-1], ¬Used); + if( rc==pWInfo->pResultSet->nExpr ){ + pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; + } + } + pWInfo->bOrderedInnerLoop = 0; + if( pWInfo->pOrderBy ){ + pWInfo->nOBSat = pFrom->isOrdered; + if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ + if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ + pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; + } + }else{ + pWInfo->revMask = pFrom->revLoop; + if( pWInfo->nOBSat<=0 ){ + pWInfo->nOBSat = 0; + if( nLoop>0 ){ + u32 wsFlags = pFrom->aLoop[nLoop-1]->wsFlags; + if( (wsFlags & WHERE_ONEROW)==0 + && (wsFlags&(WHERE_IPK|WHERE_COLUMN_IN))!=(WHERE_IPK|WHERE_COLUMN_IN) + ){ + Bitmask m = 0; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, pFrom, + WHERE_ORDERBY_LIMIT, nLoop-1, pFrom->aLoop[nLoop-1], &m); + testcase( wsFlags & WHERE_IPK ); + testcase( wsFlags & WHERE_COLUMN_IN ); + if( rc==pWInfo->pOrderBy->nExpr ){ + pWInfo->bOrderedInnerLoop = 1; + pWInfo->revMask = m; + } + } + } + }else if( nLoop + && pWInfo->nOBSat==1 + && (pWInfo->wctrlFlags & (WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX))!=0 + ){ + pWInfo->bOrderedInnerLoop = 1; + } + } + if( (pWInfo->wctrlFlags & WHERE_SORTBYGROUP) + && pWInfo->nOBSat==pWInfo->pOrderBy->nExpr && nLoop>0 + ){ + Bitmask revMask = 0; + int nOrder = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, + pFrom, 0, nLoop-1, pFrom->aLoop[nLoop-1], &revMask + ); + assert( pWInfo->sorted==0 ); + if( nOrder==pWInfo->pOrderBy->nExpr ){ + pWInfo->sorted = 1; + pWInfo->revMask = revMask; + } + } + } + + + pWInfo->nRowOut = pFrom->nRow; + + /* Free temporary memory and return success */ + sqlite3DbFreeNN(db, pSpace); + return SQLITE_OK; +} + +/* +** Most queries use only a single table (they are not joins) and have +** simple == constraints against indexed fields. This routine attempts +** to plan those simple cases using much less ceremony than the +** general-purpose query planner, and thereby yield faster sqlite3_prepare() +** times for the common case. +** +** Return non-zero on success, if this query can be handled by this +** no-frills query planner. Return zero if this query needs the +** general-purpose query planner. +*/ +static int whereShortCut(WhereLoopBuilder *pBuilder){ + WhereInfo *pWInfo; + SrcItem *pItem; + WhereClause *pWC; + WhereTerm *pTerm; + WhereLoop *pLoop; + int iCur; + int j; + Table *pTab; + Index *pIdx; + WhereScan scan; + + pWInfo = pBuilder->pWInfo; + if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; + assert( pWInfo->pTabList->nSrc>=1 ); + pItem = pWInfo->pTabList->a; + pTab = pItem->pTab; + if( IsVirtual(pTab) ) return 0; + if( pItem->fg.isIndexedBy || pItem->fg.notIndexed ){ + testcase( pItem->fg.isIndexedBy ); + testcase( pItem->fg.notIndexed ); + return 0; + } + iCur = pItem->iCursor; + pWC = &pWInfo->sWC; + pLoop = pBuilder->pNew; + pLoop->wsFlags = 0; + pLoop->nSkip = 0; + pTerm = whereScanInit(&scan, pWC, iCur, -1, WO_EQ|WO_IS, 0); + while( pTerm && pTerm->prereqRight ) pTerm = whereScanNext(&scan); + if( pTerm ){ + testcase( pTerm->eOperator & WO_IS ); + pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; + pLoop->aLTerm[0] = pTerm; + pLoop->nLTerm = 1; + pLoop->u.btree.nEq = 1; + /* TUNING: Cost of a rowid lookup is 10 */ + pLoop->rRun = 33; /* 33==sqlite3LogEst(10) */ + }else{ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int opMask; + assert( pLoop->aLTermSpace==pLoop->aLTerm ); + if( !IsUniqueIndex(pIdx) + || pIdx->pPartIdxWhere!=0 + || pIdx->nKeyCol>ArraySize(pLoop->aLTermSpace) + ) continue; + opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; + for(j=0; jnKeyCol; j++){ + pTerm = whereScanInit(&scan, pWC, iCur, j, opMask, pIdx); + while( pTerm && pTerm->prereqRight ) pTerm = whereScanNext(&scan); + if( pTerm==0 ) break; + testcase( pTerm->eOperator & WO_IS ); + pLoop->aLTerm[j] = pTerm; + } + if( j!=pIdx->nKeyCol ) continue; + pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_ONEROW|WHERE_INDEXED; + if( pIdx->isCovering || (pItem->colUsed & pIdx->colNotIdxed)==0 ){ + pLoop->wsFlags |= WHERE_IDX_ONLY; + } + pLoop->nLTerm = j; + pLoop->u.btree.nEq = j; + pLoop->u.btree.pIndex = pIdx; + /* TUNING: Cost of a unique index lookup is 15 */ + pLoop->rRun = 39; /* 39==sqlite3LogEst(15) */ + break; + } + } + if( pLoop->wsFlags ){ + pLoop->nOut = (LogEst)1; + pWInfo->a[0].pWLoop = pLoop; + assert( pWInfo->sMaskSet.n==1 && iCur==pWInfo->sMaskSet.ix[0] ); + pLoop->maskSelf = 1; /* sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); */ + pWInfo->a[0].iTabCur = iCur; + pWInfo->nRowOut = 1; + if( pWInfo->pOrderBy ) pWInfo->nOBSat = pWInfo->pOrderBy->nExpr; + if( pWInfo->wctrlFlags & WHERE_WANT_DISTINCT ){ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + } + if( scan.iEquiv>1 ) pLoop->wsFlags |= WHERE_TRANSCONS; +#ifdef SQLITE_DEBUG + pLoop->cId = '0'; +#endif +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ + sqlite3DebugPrintf("whereShortCut() used to compute solution\n"); + } +#endif + return 1; + } + return 0; +} + +/* +** Helper function for exprIsDeterministic(). +*/ +static int exprNodeIsDeterministic(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_ConstFunc)==0 ){ + pWalker->eCode = 0; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Return true if the expression contains no non-deterministic SQL +** functions. Do not consider non-deterministic SQL functions that are +** part of sub-select statements. +*/ +static int exprIsDeterministic(Expr *p){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 1; + w.xExprCallback = exprNodeIsDeterministic; + w.xSelectCallback = sqlite3SelectWalkFail; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + + +#ifdef WHERETRACE_ENABLED +/* +** Display all WhereLoops in pWInfo +*/ +static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){ + if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ + WhereLoop *p; + int i; + static const char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" + "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; + for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ + p->cId = zLabel[i%(sizeof(zLabel)-1)]; + sqlite3WhereLoopPrint(p, pWC); + } + } +} +# define WHERETRACE_ALL_LOOPS(W,C) showAllWhereLoops(W,C) +#else +# define WHERETRACE_ALL_LOOPS(W,C) +#endif + +/* Attempt to omit tables from a join that do not affect the result. +** For a table to not affect the result, the following must be true: +** +** 1) The query must not be an aggregate. +** 2) The table must be the RHS of a LEFT JOIN. +** 3) Either the query must be DISTINCT, or else the ON or USING clause +** must contain a constraint that limits the scan of the table to +** at most a single row. +** 4) The table must not be referenced by any part of the query apart +** from its own USING or ON clause. +** +** For example, given: +** +** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1); +** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2); +** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3); +** +** then table t2 can be omitted from the following: +** +** SELECT v1, v3 FROM t1 +** LEFT JOIN t2 ON (t1.ipk=t2.ipk) +** LEFT JOIN t3 ON (t1.ipk=t3.ipk) +** +** or from: +** +** SELECT DISTINCT v1, v3 FROM t1 +** LEFT JOIN t2 +** LEFT JOIN t3 ON (t1.ipk=t3.ipk) +*/ +static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( + WhereInfo *pWInfo, + Bitmask notReady +){ + int i; + Bitmask tabUsed; + + /* Preconditions checked by the caller */ + assert( pWInfo->nLevel>=2 ); + assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_OmitNoopJoin) ); + + /* These two preconditions checked by the caller combine to guarantee + ** condition (1) of the header comment */ + assert( pWInfo->pResultSet!=0 ); + assert( 0==(pWInfo->wctrlFlags & WHERE_AGG_DISTINCT) ); + + tabUsed = sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pResultSet); + if( pWInfo->pOrderBy ){ + tabUsed |= sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pOrderBy); + } + for(i=pWInfo->nLevel-1; i>=1; i--){ + WhereTerm *pTerm, *pEnd; + SrcItem *pItem; + WhereLoop *pLoop; + pLoop = pWInfo->a[i].pWLoop; + pItem = &pWInfo->pTabList->a[pLoop->iTab]; + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ) continue; + if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)==0 + && (pLoop->wsFlags & WHERE_ONEROW)==0 + ){ + continue; + } + if( (tabUsed & pLoop->maskSelf)!=0 ) continue; + pEnd = pWInfo->sWC.a + pWInfo->sWC.nTerm; + for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON) + || pTerm->pExpr->w.iJoin!=pItem->iCursor + ){ + break; + } + } + } + if( pTerm drop loop %c not used\n", pLoop->cId)); + notReady &= ~pLoop->maskSelf; + for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } + if( i!=pWInfo->nLevel-1 ){ + int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel); + memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte); + } + pWInfo->nLevel--; + assert( pWInfo->nLevel>0 ); + } + return notReady; +} + +/* +** Check to see if there are any SEARCH loops that might benefit from +** using a Bloom filter. Consider a Bloom filter if: +** +** (1) The SEARCH happens more than N times where N is the number +** of rows in the table that is being considered for the Bloom +** filter. +** (2) Some searches are expected to find zero rows. (This is determined +** by the WHERE_SELFCULL flag on the term.) +** (3) Bloom-filter processing is not disabled. (Checked by the +** caller.) +** (4) The size of the table being searched is known by ANALYZE. +** +** This block of code merely checks to see if a Bloom filter would be +** appropriate, and if so sets the WHERE_BLOOMFILTER flag on the +** WhereLoop. The implementation of the Bloom filter comes further +** down where the code for each WhereLoop is generated. +*/ +static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful( + const WhereInfo *pWInfo +){ + int i; + LogEst nSearch; + + assert( pWInfo->nLevel>=2 ); + assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_BloomFilter) ); + nSearch = pWInfo->a[0].pWLoop->nOut; + for(i=1; inLevel; i++){ + WhereLoop *pLoop = pWInfo->a[i].pWLoop; + const unsigned int reqFlags = (WHERE_SELFCULL|WHERE_COLUMN_EQ); + if( (pLoop->wsFlags & reqFlags)==reqFlags + /* vvvvvv--- Always the case if WHERE_COLUMN_EQ is defined */ + && ALWAYS((pLoop->wsFlags & (WHERE_IPK|WHERE_INDEXED))!=0) + ){ + SrcItem *pItem = &pWInfo->pTabList->a[pLoop->iTab]; + Table *pTab = pItem->pTab; + pTab->tabFlags |= TF_StatsUsed; + if( nSearch > pTab->nRowLogEst + && (pTab->tabFlags & TF_HasStat1)!=0 + ){ + testcase( pItem->fg.jointype & JT_LEFT ); + pLoop->wsFlags |= WHERE_BLOOMFILTER; + pLoop->wsFlags &= ~WHERE_IDX_ONLY; + WHERETRACE(0xffff, ( + "-> use Bloom-filter on loop %c because there are ~%.1e " + "lookups into %s which has only ~%.1e rows\n", + pLoop->cId, (double)sqlite3LogEstToInt(nSearch), pTab->zName, + (double)sqlite3LogEstToInt(pTab->nRowLogEst))); + } + } + nSearch += pLoop->nOut; + } +} + +/* +** Generate the beginning of the loop used for WHERE clause processing. +** The return value is a pointer to an opaque structure that contains +** information needed to terminate the loop. Later, the calling routine +** should invoke sqlite3WhereEnd() with the return value of this function +** in order to complete the WHERE clause processing. +** +** If an error occurs, this routine returns NULL. +** +** The basic idea is to do a nested loop, one loop for each table in +** the FROM clause of a select. (INSERT and UPDATE statements are the +** same as a SELECT with only a single table in the FROM clause.) For +** example, if the SQL is this: +** +** SELECT * FROM t1, t2, t3 WHERE ...; +** +** Then the code generated is conceptually like the following: +** +** foreach row1 in t1 do \ Code generated +** foreach row2 in t2 do |-- by sqlite3WhereBegin() +** foreach row3 in t3 do / +** ... +** end \ Code generated +** end |-- by sqlite3WhereEnd() +** end / +** +** Note that the loops might not be nested in the order in which they +** appear in the FROM clause if a different order is better able to make +** use of indices. Note also that when the IN operator appears in +** the WHERE clause, it might result in additional nested loops for +** scanning through all values on the right-hand side of the IN. +** +** There are Btree cursors associated with each table. t1 uses cursor +** number pTabList->a[0].iCursor. t2 uses the cursor pTabList->a[1].iCursor. +** And so forth. This routine generates code to open those VDBE cursors +** and sqlite3WhereEnd() generates the code to close them. +** +** The code that sqlite3WhereBegin() generates leaves the cursors named +** in pTabList pointing at their appropriate entries. The [...] code +** can use OP_Column and OP_Rowid opcodes on these cursors to extract +** data from the various tables of the loop. +** +** If the WHERE clause is empty, the foreach loops must each scan their +** entire tables. Thus a three-way join is an O(N^3) operation. But if +** the tables have indices and there are terms in the WHERE clause that +** refer to those indices, a complete table scan can be avoided and the +** code will run much faster. Most of the work of this routine is checking +** to see if there are indices that can be used to speed up the loop. +** +** Terms of the WHERE clause are also used to limit which rows actually +** make it to the "..." in the middle of the loop. After each "foreach", +** terms of the WHERE clause that use only terms in that loop and outer +** loops are evaluated and if false a jump is made around all subsequent +** inner loops (or around the "..." if the test occurs within the inner- +** most loop) +** +** OUTER JOINS +** +** An outer join of tables t1 and t2 is conceptally coded as follows: +** +** foreach row1 in t1 do +** flag = 0 +** foreach row2 in t2 do +** start: +** ... +** flag = 1 +** end +** if flag==0 then +** move the row2 cursor to a null row +** goto start +** fi +** end +** +** ORDER BY CLAUSE PROCESSING +** +** pOrderBy is a pointer to the ORDER BY clause (or the GROUP BY clause +** if the WHERE_GROUPBY flag is set in wctrlFlags) of a SELECT statement +** if there is one. If there is no ORDER BY clause or if this routine +** is called from an UPDATE or DELETE statement, then pOrderBy is NULL. +** +** The iIdxCur parameter is the cursor number of an index. If +** WHERE_OR_SUBCLAUSE is set, iIdxCur is the cursor number of an index +** to use for OR clause processing. The WHERE clause should use this +** specific cursor. If WHERE_ONEPASS_DESIRED is set, then iIdxCur is +** the first cursor in an array of cursors for all indices. iIdxCur should +** be used to compute the appropriate cursor depending on which index is +** used. +*/ +SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* FROM clause: A list of all tables to be scanned */ + Expr *pWhere, /* The WHERE clause */ + ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ + ExprList *pResultSet, /* Query result set. Req'd for DISTINCT */ + Select *pLimit, /* Use this LIMIT/OFFSET clause, if any */ + u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */ + int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number + ** If WHERE_USE_LIMIT, then the limit amount */ +){ + int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */ + int nTabList; /* Number of elements in pTabList */ + WhereInfo *pWInfo; /* Will become the return value of this function */ + Vdbe *v = pParse->pVdbe; /* The virtual database engine */ + Bitmask notReady; /* Cursors that are not yet positioned */ + WhereLoopBuilder sWLB; /* The WhereLoop builder */ + WhereMaskSet *pMaskSet; /* The expression mask set */ + WhereLevel *pLevel; /* A single level in pWInfo->a[] */ + WhereLoop *pLoop; /* Pointer to a single WhereLoop object */ + int ii; /* Loop counter */ + sqlite3 *db; /* Database connection */ + int rc; /* Return code */ + u8 bFordelete = 0; /* OPFLAG_FORDELETE or zero, as appropriate */ + + assert( (wctrlFlags & WHERE_ONEPASS_MULTIROW)==0 || ( + (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + )); + + /* Only one of WHERE_OR_SUBCLAUSE or WHERE_USE_LIMIT */ + assert( (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + || (wctrlFlags & WHERE_USE_LIMIT)==0 ); + + /* Variable initialization */ + db = pParse->db; + memset(&sWLB, 0, sizeof(sWLB)); + + /* An ORDER/GROUP BY clause of more than 63 terms cannot be optimized */ + testcase( pOrderBy && pOrderBy->nExpr==BMS-1 ); + if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0; + + /* The number of tables in the FROM clause is limited by the number of + ** bits in a Bitmask + */ + testcase( pTabList->nSrc==BMS ); + if( pTabList->nSrc>BMS ){ + sqlite3ErrorMsg(pParse, "at most %d tables in a join", BMS); + return 0; + } + + /* This function normally generates a nested loop for all tables in + ** pTabList. But if the WHERE_OR_SUBCLAUSE flag is set, then we should + ** only generate code for the first table in pTabList and assume that + ** any cursors associated with subsequent tables are uninitialized. + */ + nTabList = (wctrlFlags & WHERE_OR_SUBCLAUSE) ? 1 : pTabList->nSrc; + + /* Allocate and initialize the WhereInfo structure that will become the + ** return value. A single allocation is used to store the WhereInfo + ** struct, the contents of WhereInfo.a[], the WhereClause structure + ** and the WhereMaskSet structure. Since WhereClause contains an 8-byte + ** field (type Bitmask) it must be aligned on an 8-byte boundary on + ** some architectures. Hence the ROUND8() below. + */ + nByteWInfo = ROUND8P(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); + pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); + if( db->mallocFailed ){ + sqlite3DbFree(db, pWInfo); + pWInfo = 0; + goto whereBeginError; + } + pWInfo->pParse = pParse; + pWInfo->pTabList = pTabList; + pWInfo->pOrderBy = pOrderBy; + pWInfo->pWhere = pWhere; + pWInfo->pResultSet = pResultSet; + pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; + pWInfo->nLevel = nTabList; + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse); + pWInfo->wctrlFlags = wctrlFlags; + pWInfo->iLimit = iAuxArg; + pWInfo->savedNQueryLoop = pParse->nQueryLoop; +#ifndef SQLITE_OMIT_VIRTUALTABLE + pWInfo->pLimit = pLimit; +#endif + memset(&pWInfo->nOBSat, 0, + offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat)); + memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); + assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ + pMaskSet = &pWInfo->sMaskSet; + pMaskSet->n = 0; + pMaskSet->ix[0] = -99; /* Initialize ix[0] to a value that can never be + ** a valid cursor number, to avoid an initial + ** test for pMaskSet->n==0 in sqlite3WhereGetMask() */ + sWLB.pWInfo = pWInfo; + sWLB.pWC = &pWInfo->sWC; + sWLB.pNew = (WhereLoop*)(((char*)pWInfo)+nByteWInfo); + assert( EIGHT_BYTE_ALIGNMENT(sWLB.pNew) ); + whereLoopInit(sWLB.pNew); +#ifdef SQLITE_DEBUG + sWLB.pNew->cId = '*'; +#endif + + /* Split the WHERE clause into separate subexpressions where each + ** subexpression is separated by an AND operator. + */ + sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); + sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); + + /* Special case: No FROM clause + */ + if( nTabList==0 ){ + if( pOrderBy ) pWInfo->nOBSat = pOrderBy->nExpr; + if( (wctrlFlags & WHERE_WANT_DISTINCT)!=0 + && OptimizationEnabled(db, SQLITE_DistinctOpt) + ){ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + } + ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); + }else{ + /* Assign a bit from the bitmask to every term in the FROM clause. + ** + ** The N-th term of the FROM clause is assigned a bitmask of 1<nSrc tables in + ** pTabList, not just the first nTabList tables. nTabList is normally + ** equal to pTabList->nSrc but might be shortened to 1 if the + ** WHERE_OR_SUBCLAUSE flag is set. + */ + ii = 0; + do{ + createMask(pMaskSet, pTabList->a[ii].iCursor); + sqlite3WhereTabFuncArgs(pParse, &pTabList->a[ii], &pWInfo->sWC); + }while( (++ii)nSrc ); + #ifdef SQLITE_DEBUG + { + Bitmask mx = 0; + for(ii=0; iinSrc; ii++){ + Bitmask m = sqlite3WhereGetMask(pMaskSet, pTabList->a[ii].iCursor); + assert( m>=mx ); + mx = m; + } + } + #endif + } + + /* Analyze all of the subexpressions. */ + sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); + sqlite3WhereAddLimit(&pWInfo->sWC, pLimit); + if( pParse->nErr ) goto whereBeginError; + + /* Special case: WHERE terms that do not refer to any tables in the join + ** (constant expressions). Evaluate each such term, and jump over all the + ** generated code if the result is not true. + ** + ** Do not do this if the expression contains non-deterministic functions + ** that are not within a sub-select. This is not strictly required, but + ** preserves SQLite's legacy behaviour in the following two cases: + ** + ** FROM ... WHERE random()>0; -- eval random() once per row + ** FROM ... WHERE (SELECT random())>0; -- eval random() once overall + */ + for(ii=0; iinBase; ii++){ + WhereTerm *pT = &sWLB.pWC->a[ii]; + if( pT->wtFlags & TERM_VIRTUAL ) continue; + if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){ + sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL); + pT->wtFlags |= TERM_CODED; + } + } + + if( wctrlFlags & WHERE_WANT_DISTINCT ){ + if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ + /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via + ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ + wctrlFlags &= ~WHERE_WANT_DISTINCT; + pWInfo->wctrlFlags &= ~WHERE_WANT_DISTINCT; + }else if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ + /* The DISTINCT marking is pointless. Ignore it. */ + pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; + }else if( pOrderBy==0 ){ + /* Try to ORDER BY the result set to make distinct processing easier */ + pWInfo->wctrlFlags |= WHERE_DISTINCTBY; + pWInfo->pOrderBy = pResultSet; + } + } + + /* Construct the WhereLoop objects */ +#if defined(WHERETRACE_ENABLED) + if( sqlite3WhereTrace & 0xffff ){ + sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); + if( wctrlFlags & WHERE_USE_LIMIT ){ + sqlite3DebugPrintf(", limit: %d", iAuxArg); + } + sqlite3DebugPrintf(")\n"); + if( sqlite3WhereTrace & 0x100 ){ + Select sSelect; + memset(&sSelect, 0, sizeof(sSelect)); + sSelect.selFlags = SF_WhereBegin; + sSelect.pSrc = pTabList; + sSelect.pWhere = pWhere; + sSelect.pOrderBy = pOrderBy; + sSelect.pEList = pResultSet; + sqlite3TreeViewSelect(0, &sSelect, 0); + } + } + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3DebugPrintf("---- WHERE clause at start of analysis:\n"); + sqlite3WhereClausePrint(sWLB.pWC); + } +#endif + + if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ + rc = whereLoopAddAll(&sWLB); + if( rc ) goto whereBeginError; + +#ifdef SQLITE_ENABLE_STAT4 + /* If one or more WhereTerm.truthProb values were used in estimating + ** loop parameters, but then those truthProb values were subsequently + ** changed based on STAT4 information while computing subsequent loops, + ** then we need to rerun the whole loop building process so that all + ** loops will be built using the revised truthProb values. */ + if( sWLB.bldFlags2 & SQLITE_BLDF2_2NDPASS ){ + WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); + WHERETRACE(0xffff, + ("**** Redo all loop computations due to" + " TERM_HIGHTRUTH changes ****\n")); + while( pWInfo->pLoops ){ + WhereLoop *p = pWInfo->pLoops; + pWInfo->pLoops = p->pNextLoop; + whereLoopDelete(db, p); + } + rc = whereLoopAddAll(&sWLB); + if( rc ) goto whereBeginError; + } +#endif + WHERETRACE_ALL_LOOPS(pWInfo, sWLB.pWC); + + wherePathSolver(pWInfo, 0); + if( db->mallocFailed ) goto whereBeginError; + if( pWInfo->pOrderBy ){ + wherePathSolver(pWInfo, pWInfo->nRowOut+1); + if( db->mallocFailed ) goto whereBeginError; + } + } + if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ + pWInfo->revMask = ALLBITS; + } + if( pParse->nErr ){ + goto whereBeginError; + } + assert( db->mallocFailed==0 ); +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ + sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); + if( pWInfo->nOBSat>0 ){ + sqlite3DebugPrintf(" ORDERBY=%d,0x%llx", pWInfo->nOBSat, pWInfo->revMask); + } + switch( pWInfo->eDistinct ){ + case WHERE_DISTINCT_UNIQUE: { + sqlite3DebugPrintf(" DISTINCT=unique"); + break; + } + case WHERE_DISTINCT_ORDERED: { + sqlite3DebugPrintf(" DISTINCT=ordered"); + break; + } + case WHERE_DISTINCT_UNORDERED: { + sqlite3DebugPrintf(" DISTINCT=unordered"); + break; + } + } + sqlite3DebugPrintf("\n"); + for(ii=0; iinLevel; ii++){ + sqlite3WhereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); + } + } +#endif + + /* Attempt to omit tables from a join that do not affect the result. + ** See the comment on whereOmitNoopJoin() for further information. + ** + ** This query optimization is factored out into a separate "no-inline" + ** procedure to keep the sqlite3WhereBegin() procedure from becoming + ** too large. If sqlite3WhereBegin() becomes too large, that prevents + ** some C-compiler optimizers from in-lining the + ** sqlite3WhereCodeOneLoopStart() procedure, and it is important to + ** in-line sqlite3WhereCodeOneLoopStart() for performance reasons. + */ + notReady = ~(Bitmask)0; + if( pWInfo->nLevel>=2 + && pResultSet!=0 /* these two combine to guarantee */ + && 0==(wctrlFlags & WHERE_AGG_DISTINCT) /* condition (1) above */ + && OptimizationEnabled(db, SQLITE_OmitNoopJoin) + ){ + notReady = whereOmitNoopJoin(pWInfo, notReady); + nTabList = pWInfo->nLevel; + assert( nTabList>0 ); + } + + /* Check to see if there are any SEARCH loops that might benefit from + ** using a Bloom filter. + */ + if( pWInfo->nLevel>=2 + && OptimizationEnabled(db, SQLITE_BloomFilter) + ){ + whereCheckIfBloomFilterIsUseful(pWInfo); + } + +#if defined(WHERETRACE_ENABLED) + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3DebugPrintf("---- WHERE clause at end of analysis:\n"); + sqlite3WhereClausePrint(sWLB.pWC); + } + WHERETRACE(0xffff,("*** Optimizer Finished ***\n")); +#endif + pWInfo->pParse->nQueryLoop += pWInfo->nRowOut; + + /* If the caller is an UPDATE or DELETE statement that is requesting + ** to use a one-pass algorithm, determine if this is appropriate. + ** + ** A one-pass approach can be used if the caller has requested one + ** and either (a) the scan visits at most one row or (b) each + ** of the following are true: + ** + ** * the caller has indicated that a one-pass approach can be used + ** with multiple rows (by setting WHERE_ONEPASS_MULTIROW), and + ** * the table is not a virtual table, and + ** * either the scan does not use the OR optimization or the caller + ** is a DELETE operation (WHERE_DUPLICATES_OK is only specified + ** for DELETE). + ** + ** The last qualification is because an UPDATE statement uses + ** WhereInfo.aiCurOnePass[1] to determine whether or not it really can + ** use a one-pass approach, and this is not set accurately for scans + ** that use the OR optimization. + */ + assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 ); + if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ + int wsFlags = pWInfo->a[0].pWLoop->wsFlags; + int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); + if( bOnerow || ( + 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) + && !IsVirtual(pTabList->a[0].pTab) + && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) + )){ + pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; + if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){ + if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){ + bFordelete = OPFLAG_FORDELETE; + } + pWInfo->a[0].pWLoop->wsFlags = (wsFlags & ~WHERE_IDX_ONLY); + } + } + } + + /* Open all tables in the pTabList and any indices selected for + ** searching those tables. + */ + for(ii=0, pLevel=pWInfo->a; iia[pLevel->iFrom]; + pTab = pTabItem->pTab; + iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + pLoop = pLevel->pWLoop; + if( (pTab->tabFlags & TF_Ephemeral)!=0 || IsView(pTab) ){ + /* Do nothing */ + }else +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + int iCur = pTabItem->iCursor; + sqlite3VdbeAddOp4(v, OP_VOpen, iCur, 0, 0, pVTab, P4_VTAB); + }else if( IsVirtual(pTab) ){ + /* noop */ + }else +#endif + if( ((pLoop->wsFlags & WHERE_IDX_ONLY)==0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0) + || (pTabItem->fg.jointype & (JT_LTORJ|JT_RIGHT))!=0 + ){ + int op = OP_OpenRead; + if( pWInfo->eOnePass!=ONEPASS_OFF ){ + op = OP_OpenWrite; + pWInfo->aiCurOnePass[0] = pTabItem->iCursor; + }; + sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op); + assert( pTabItem->iCursor==pLevel->iTabCur ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS-1 ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS ); + if( pWInfo->eOnePass==ONEPASS_OFF + && pTab->nColtabFlags & (TF_HasGenerated|TF_WithoutRowid))==0 + && (pLoop->wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))==0 + ){ + /* If we know that only a prefix of the record will be used, + ** it is advantageous to reduce the "column count" field in + ** the P4 operand of the OP_OpenRead/Write opcode. */ + Bitmask b = pTabItem->colUsed; + int n = 0; + for(; b; b=b>>1, n++){} + sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32); + assert( n<=pTab->nCol ); + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + if( pLoop->u.btree.pIndex!=0 ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); + }else +#endif + { + sqlite3VdbeChangeP5(v, bFordelete); + } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, + (const u8*)&pTabItem->colUsed, P4_INT64); +#endif + }else{ + sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + } + if( pLoop->wsFlags & WHERE_INDEXED ){ + Index *pIx = pLoop->u.btree.pIndex; + int iIndexCur; + int op = OP_OpenRead; + /* iAuxArg is always set to a positive value if ONEPASS is possible */ + assert( iAuxArg!=0 || (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 ); + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIx) + && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 + ){ + /* This is one term of an OR-optimization using the PRIMARY KEY of a + ** WITHOUT ROWID table. No need for a separate index */ + iIndexCur = pLevel->iTabCur; + op = 0; + }else if( pWInfo->eOnePass!=ONEPASS_OFF ){ + Index *pJ = pTabItem->pTab->pIndex; + iIndexCur = iAuxArg; + assert( wctrlFlags & WHERE_ONEPASS_DESIRED ); + while( ALWAYS(pJ) && pJ!=pIx ){ + iIndexCur++; + pJ = pJ->pNext; + } + op = OP_OpenWrite; + pWInfo->aiCurOnePass[1] = iIndexCur; + }else if( iAuxArg && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ){ + iIndexCur = iAuxArg; + op = OP_ReopenIdx; + }else{ + iIndexCur = pParse->nTab++; + } + pLevel->iIdxCur = iIndexCur; + assert( pIx!=0 ); + assert( pIx->pSchema==pTab->pSchema ); + assert( iIndexCur>=0 ); + if( op ){ + sqlite3VdbeAddOp3(v, op, iIndexCur, pIx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIx); + if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 + && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 + && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 + && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED + ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); + } + VdbeComment((v, "%s", pIx->zName)); +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + { + u64 colUsed = 0; + int ii, jj; + for(ii=0; iinColumn; ii++){ + jj = pIx->aiColumn[ii]; + if( jj<0 ) continue; + if( jj>63 ) jj = 63; + if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue; + colUsed |= ((u64)1)<<(ii<63 ? ii : 63); + } + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0, + (u8*)&colUsed, P4_INT64); + } +#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */ + } + } + if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); + if( (pTabItem->fg.jointype & JT_RIGHT)!=0 + && (pLevel->pRJ = sqlite3WhereMalloc(pWInfo, sizeof(WhereRightJoin)))!=0 + ){ + WhereRightJoin *pRJ = pLevel->pRJ; + pRJ->iMatch = pParse->nTab++; + pRJ->regBloom = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Blob, 65536, pRJ->regBloom); + pRJ->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, pRJ->regReturn); + assert( pTab==pTabItem->pTab ); + if( HasRowid(pTab) ){ + KeyInfo *pInfo; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, 1); + pInfo = sqlite3KeyInfoAlloc(pParse->db, 1, 0); + if( pInfo ){ + pInfo->aColl[0] = 0; + pInfo->aSortFlags[0] = 0; + sqlite3VdbeAppendP4(v, pInfo, P4_KEYINFO); + } + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + pLoop->wsFlags &= ~WHERE_IDX_ONLY; + /* The nature of RIGHT JOIN processing is such that it messes up + ** the output order. So omit any ORDER BY/GROUP BY elimination + ** optimizations. We need to do an actual sort for RIGHT JOIN. */ + pWInfo->nOBSat = 0; + pWInfo->eDistinct = WHERE_DISTINCT_UNORDERED; + } + } + pWInfo->iTop = sqlite3VdbeCurrentAddr(v); + if( db->mallocFailed ) goto whereBeginError; + + /* Generate the code to do the search. Each iteration of the for + ** loop below generates code for a single nested loop of the VM + ** program. + */ + for(ii=0; iinErr ) goto whereBeginError; + pLevel = &pWInfo->a[ii]; + wsFlags = pLevel->pWLoop->wsFlags; + pSrc = &pTabList->a[pLevel->iFrom]; + if( pSrc->fg.isMaterialized ){ + if( pSrc->fg.isCorrelated ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + }else{ + int iOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + sqlite3VdbeJumpHere(v, iOnce); + } + } + if( (wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))!=0 ){ + if( (wsFlags & WHERE_AUTO_INDEX)!=0 ){ +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX + constructAutomaticIndex(pParse, &pWInfo->sWC, + &pTabList->a[pLevel->iFrom], notReady, pLevel); +#endif + }else{ + sqlite3ConstructBloomFilter(pWInfo, ii, pLevel, notReady); + } + if( db->mallocFailed ) goto whereBeginError; + } + addrExplain = sqlite3WhereExplainOneScan( + pParse, pTabList, pLevel, wctrlFlags + ); + pLevel->addrBody = sqlite3VdbeCurrentAddr(v); + notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); + pWInfo->iContinue = pLevel->addrCont; + if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ + sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); + } + } + + /* Done. */ + VdbeModuleComment((v, "Begin WHERE-core")); + pWInfo->iEndWhere = sqlite3VdbeCurrentAddr(v); + return pWInfo; + + /* Jump here if malloc fails */ +whereBeginError: + if( pWInfo ){ + testcase( pWInfo->pExprMods!=0 ); + whereUndoExprMods(pWInfo); + pParse->nQueryLoop = pWInfo->savedNQueryLoop; + whereInfoFree(db, pWInfo); + } + return 0; +} + +/* +** Part of sqlite3WhereEnd() will rewrite opcodes to reference the +** index rather than the main table. In SQLITE_DEBUG mode, we want +** to trace those changes if PRAGMA vdbe_addoptrace=on. This routine +** does that. +*/ +#ifndef SQLITE_DEBUG +# define OpcodeRewriteTrace(D,K,P) /* no-op */ +#else +# define OpcodeRewriteTrace(D,K,P) sqlite3WhereOpcodeRewriteTrace(D,K,P) + static void sqlite3WhereOpcodeRewriteTrace( + sqlite3 *db, + int pc, + VdbeOp *pOp + ){ + if( (db->flags & SQLITE_VdbeAddopTrace)==0 ) return; + sqlite3VdbePrintOp(0, pc, pOp); + } +#endif + +#ifdef SQLITE_DEBUG +/* +** Return true if cursor iCur is opened by instruction k of the +** bytecode. Used inside of assert() only. +*/ +static int cursorIsOpen(Vdbe *v, int iCur, int k){ + while( k>=0 ){ + VdbeOp *pOp = sqlite3VdbeGetOp(v,k--); + if( pOp->p1!=iCur ) continue; + if( pOp->opcode==OP_Close ) return 0; + if( pOp->opcode==OP_OpenRead ) return 1; + if( pOp->opcode==OP_OpenWrite ) return 1; + if( pOp->opcode==OP_OpenDup ) return 1; + if( pOp->opcode==OP_OpenAutoindex ) return 1; + if( pOp->opcode==OP_OpenEphemeral ) return 1; + } + return 0; +} +#endif /* SQLITE_DEBUG */ + +/* +** Generate the end of the WHERE loop. See comments on +** sqlite3WhereBegin() for additional information. +*/ +SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ + Parse *pParse = pWInfo->pParse; + Vdbe *v = pParse->pVdbe; + int i; + WhereLevel *pLevel; + WhereLoop *pLoop; + SrcList *pTabList = pWInfo->pTabList; + sqlite3 *db = pParse->db; + int iEnd = sqlite3VdbeCurrentAddr(v); + int nRJ = 0; + + /* Generate loop termination code. + */ + VdbeModuleComment((v, "End WHERE-core")); + for(i=pWInfo->nLevel-1; i>=0; i--){ + int addr; + pLevel = &pWInfo->a[i]; + if( pLevel->pRJ ){ + /* Terminate the subroutine that forms the interior of the loop of + ** the RIGHT JOIN table */ + WhereRightJoin *pRJ = pLevel->pRJ; + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + pLevel->addrCont = 0; + pRJ->endSubrtn = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Return, pRJ->regReturn, pRJ->addrSubrtn, 1); + VdbeCoverage(v); + nRJ++; + } + pLoop = pLevel->pWLoop; + if( pLevel->op!=OP_Noop ){ +#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + int addrSeek = 0; + Index *pIdx; + int n; + if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED + && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */ + && (pLoop->wsFlags & WHERE_INDEXED)!=0 + && (pIdx = pLoop->u.btree.pIndex)->hasStat1 + && (n = pLoop->u.btree.nDistinctCol)>0 + && pIdx->aiRowLogEst[n]>=36 + ){ + int r1 = pParse->nMem+1; + int j, op; + for(j=0; jiIdxCur, j, r1+j); + } + pParse->nMem += n+1; + op = pLevel->op==OP_Prev ? OP_SeekLT : OP_SeekGT; + addrSeek = sqlite3VdbeAddOp4Int(v, op, pLevel->iIdxCur, 0, r1, n); + VdbeCoverageIf(v, op==OP_SeekLT); + VdbeCoverageIf(v, op==OP_SeekGT); + sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2); + } +#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ + /* The common case: Advance to the next row */ + if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont); + sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); + sqlite3VdbeChangeP5(v, pLevel->p5); + VdbeCoverage(v); + VdbeCoverageIf(v, pLevel->op==OP_Next); + VdbeCoverageIf(v, pLevel->op==OP_Prev); + VdbeCoverageIf(v, pLevel->op==OP_VNext); + if( pLevel->regBignull ){ + sqlite3VdbeResolveLabel(v, pLevel->addrBignull); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, pLevel->regBignull, pLevel->p2-1); + VdbeCoverage(v); + } +#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); +#endif + }else if( pLevel->addrCont ){ + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + } + if( (pLoop->wsFlags & WHERE_IN_ABLE)!=0 && pLevel->u.in.nIn>0 ){ + struct InLoop *pIn; + int j; + sqlite3VdbeResolveLabel(v, pLevel->addrNxt); + for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ + assert( sqlite3VdbeGetOp(v, pIn->addrInTop+1)->opcode==OP_IsNull + || pParse->db->mallocFailed ); + sqlite3VdbeJumpHere(v, pIn->addrInTop+1); + if( pIn->eEndLoopOp!=OP_Noop ){ + if( pIn->nPrefix ){ + int bEarlyOut = + (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && (pLoop->wsFlags & WHERE_IN_EARLYOUT)!=0; + if( pLevel->iLeftJoin ){ + /* For LEFT JOIN queries, cursor pIn->iCur may not have been + ** opened yet. This occurs for WHERE clauses such as + ** "a = ? AND b IN (...)", where the index is on (a, b). If + ** the RHS of the (a=?) is NULL, then the "b IN (...)" may + ** never have been coded, but the body of the loop run to + ** return the null-row. So, if the cursor is not open yet, + ** jump over the OP_Next or OP_Prev instruction about to + ** be coded. */ + sqlite3VdbeAddOp2(v, OP_IfNotOpen, pIn->iCur, + sqlite3VdbeCurrentAddr(v) + 2 + bEarlyOut); + VdbeCoverage(v); + } + if( bEarlyOut ){ + sqlite3VdbeAddOp4Int(v, OP_IfNoHope, pLevel->iIdxCur, + sqlite3VdbeCurrentAddr(v)+2, + pIn->iBase, pIn->nPrefix); + VdbeCoverage(v); + /* Retarget the OP_IsNull against the left operand of IN so + ** it jumps past the OP_IfNoHope. This is because the + ** OP_IsNull also bypasses the OP_Affinity opcode that is + ** required by OP_IfNoHope. */ + sqlite3VdbeJumpHere(v, pIn->addrInTop+1); + } + } + sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); + VdbeCoverage(v); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Prev); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_Next); + } + sqlite3VdbeJumpHere(v, pIn->addrInTop-1); + } + } + sqlite3VdbeResolveLabel(v, pLevel->addrBrk); + if( pLevel->pRJ ){ + sqlite3VdbeAddOp3(v, OP_Return, pLevel->pRJ->regReturn, 0, 1); + VdbeCoverage(v); + } + if( pLevel->addrSkip ){ + sqlite3VdbeGoto(v, pLevel->addrSkip); + VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName)); + sqlite3VdbeJumpHere(v, pLevel->addrSkip); + sqlite3VdbeJumpHere(v, pLevel->addrSkip-2); + } +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pLevel->addrLikeRep ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, (int)(pLevel->iLikeRepCntr>>1), + pLevel->addrLikeRep); + VdbeCoverage(v); + } +#endif + if( pLevel->iLeftJoin ){ + int ws = pLoop->wsFlags; + addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); + assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 ); + if( (ws & WHERE_IDX_ONLY)==0 ){ + assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor ); + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur); + } + if( (ws & WHERE_INDEXED) + || ((ws & WHERE_MULTI_OR) && pLevel->u.pCoveringIdx) + ){ + if( ws & WHERE_MULTI_OR ){ + Index *pIx = pLevel->u.pCoveringIdx; + int iDb = sqlite3SchemaToIndex(db, pIx->pSchema); + sqlite3VdbeAddOp3(v, OP_ReopenIdx, pLevel->iIdxCur, pIx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIx); + } + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); + } + if( pLevel->op==OP_Return ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst); + }else{ + sqlite3VdbeGoto(v, pLevel->addrFirst); + } + sqlite3VdbeJumpHere(v, addr); + } + VdbeModuleComment((v, "End WHERE-loop%d: %s", i, + pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); + } + + assert( pWInfo->nLevel<=pTabList->nSrc ); + if( pWInfo->pExprMods ) whereUndoExprMods(pWInfo); + for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ + int k, last; + VdbeOp *pOp, *pLastOp; + Index *pIdx = 0; + SrcItem *pTabItem = &pTabList->a[pLevel->iFrom]; + Table *pTab = pTabItem->pTab; + assert( pTab!=0 ); + pLoop = pLevel->pWLoop; + + /* Do RIGHT JOIN processing. Generate code that will output the + ** unmatched rows of the right operand of the RIGHT JOIN with + ** all of the columns of the left operand set to NULL. + */ + if( pLevel->pRJ ){ + sqlite3WhereRightJoinLoop(pWInfo, i, pLevel); + continue; + } + + /* For a co-routine, change all OP_Column references to the table of + ** the co-routine into OP_Copy of result contained in a register. + ** OP_Rowid becomes OP_Null. + */ + if( pTabItem->fg.viaCoroutine ){ + testcase( pParse->db->mallocFailed ); + translateColumnToCopy(pParse, pLevel->addrBody, pLevel->iTabCur, + pTabItem->regResult, 0); + continue; + } + + /* If this scan uses an index, make VDBE code substitutions to read data + ** from the index instead of from the table where possible. In some cases + ** this optimization prevents the table from ever being read, which can + ** yield a significant performance boost. + ** + ** Calls to the code generator in between sqlite3WhereBegin and + ** sqlite3WhereEnd will have created code that references the table + ** directly. This loop scans all that code looking for opcodes + ** that reference the table and converts them into opcodes that + ** reference the index. + */ + if( pLoop->wsFlags & (WHERE_INDEXED|WHERE_IDX_ONLY) ){ + pIdx = pLoop->u.btree.pIndex; + }else if( pLoop->wsFlags & WHERE_MULTI_OR ){ + pIdx = pLevel->u.pCoveringIdx; + } + if( pIdx + && !db->mallocFailed + ){ + if( pWInfo->eOnePass==ONEPASS_OFF || !HasRowid(pIdx->pTable) ){ + last = iEnd; + }else{ + last = pWInfo->iEndWhere; + } + k = pLevel->addrBody + 1; +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeAddopTrace ){ + printf("TRANSLATE opcodes in range %d..%d\n", k, last-1); + } + /* Proof that the "+1" on the k value above is safe */ + pOp = sqlite3VdbeGetOp(v, k - 1); + assert( pOp->opcode!=OP_Column || pOp->p1!=pLevel->iTabCur ); + assert( pOp->opcode!=OP_Rowid || pOp->p1!=pLevel->iTabCur ); + assert( pOp->opcode!=OP_IfNullRow || pOp->p1!=pLevel->iTabCur ); +#endif + pOp = sqlite3VdbeGetOp(v, k); + pLastOp = pOp + (last - k); + assert( pOp<=pLastOp ); + do{ + if( pOp->p1!=pLevel->iTabCur ){ + /* no-op */ + }else if( pOp->opcode==OP_Column +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + || pOp->opcode==OP_Offset +#endif + ){ + int x = pOp->p2; + assert( pIdx->pTable==pTab ); +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + if( pOp->opcode==OP_Offset ){ + /* Do not need to translate the column number */ + }else +#endif + if( !HasRowid(pTab) ){ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + x = pPk->aiColumn[x]; + assert( x>=0 ); + }else{ + testcase( x!=sqlite3StorageColumnToTable(pTab,x) ); + x = sqlite3StorageColumnToTable(pTab,x); + } + x = sqlite3TableColumnToIndex(pIdx, x); + if( x>=0 ){ + pOp->p2 = x; + pOp->p1 = pLevel->iIdxCur; + OpcodeRewriteTrace(db, k, pOp); + }else{ + /* Unable to translate the table reference into an index + ** reference. Verify that this is harmless - that the + ** table being referenced really is open. + */ +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 + || cursorIsOpen(v,pOp->p1,k) + || pOp->opcode==OP_Offset + ); +#else + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 + || cursorIsOpen(v,pOp->p1,k) + ); +#endif + } + }else if( pOp->opcode==OP_Rowid ){ + pOp->p1 = pLevel->iIdxCur; + pOp->opcode = OP_IdxRowid; + OpcodeRewriteTrace(db, k, pOp); + }else if( pOp->opcode==OP_IfNullRow ){ + pOp->p1 = pLevel->iIdxCur; + OpcodeRewriteTrace(db, k, pOp); + } +#ifdef SQLITE_DEBUG + k++; +#endif + }while( (++pOp)flags & SQLITE_VdbeAddopTrace ) printf("TRANSLATE complete\n"); +#endif + } + } + + /* The "break" point is here, just past the end of the outer loop. + ** Set it. + */ + sqlite3VdbeResolveLabel(v, pWInfo->iBreak); + + /* Final cleanup + */ + pParse->nQueryLoop = pWInfo->savedNQueryLoop; + whereInfoFree(db, pWInfo); + pParse->withinRJSubrtn -= nRJ; + return; +} + +/************** End of where.c ***********************************************/ +/************** Begin file window.c ******************************************/ +/* +** 2018 May 08 +** +** 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. +** +************************************************************************* +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_WINDOWFUNC + +/* +** SELECT REWRITING +** +** Any SELECT statement that contains one or more window functions in +** either the select list or ORDER BY clause (the only two places window +** functions may be used) is transformed by function sqlite3WindowRewrite() +** in order to support window function processing. For example, with the +** schema: +** +** CREATE TABLE t1(a, b, c, d, e, f, g); +** +** the statement: +** +** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM t1 ORDER BY e; +** +** is transformed to: +** +** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM ( +** SELECT a, e, c, d, b FROM t1 ORDER BY c, d +** ) ORDER BY e; +** +** The flattening optimization is disabled when processing this transformed +** SELECT statement. This allows the implementation of the window function +** (in this case max()) to process rows sorted in order of (c, d), which +** makes things easier for obvious reasons. More generally: +** +** * FROM, WHERE, GROUP BY and HAVING clauses are all moved to +** the sub-query. +** +** * ORDER BY, LIMIT and OFFSET remain part of the parent query. +** +** * Terminals from each of the expression trees that make up the +** select-list and ORDER BY expressions in the parent query are +** selected by the sub-query. For the purposes of the transformation, +** terminals are column references and aggregate functions. +** +** If there is more than one window function in the SELECT that uses +** the same window declaration (the OVER bit), then a single scan may +** be used to process more than one window function. For example: +** +** SELECT max(b) OVER (PARTITION BY c ORDER BY d), +** min(e) OVER (PARTITION BY c ORDER BY d) +** FROM t1; +** +** is transformed in the same way as the example above. However: +** +** SELECT max(b) OVER (PARTITION BY c ORDER BY d), +** min(e) OVER (PARTITION BY a ORDER BY b) +** FROM t1; +** +** Must be transformed to: +** +** SELECT max(b) OVER (PARTITION BY c ORDER BY d) FROM ( +** SELECT e, min(e) OVER (PARTITION BY a ORDER BY b), c, d, b FROM +** SELECT a, e, c, d, b FROM t1 ORDER BY a, b +** ) ORDER BY c, d +** ) ORDER BY e; +** +** so that both min() and max() may process rows in the order defined by +** their respective window declarations. +** +** INTERFACE WITH SELECT.C +** +** When processing the rewritten SELECT statement, code in select.c calls +** sqlite3WhereBegin() to begin iterating through the results of the +** sub-query, which is always implemented as a co-routine. It then calls +** sqlite3WindowCodeStep() to process rows and finish the scan by calling +** sqlite3WhereEnd(). +** +** sqlite3WindowCodeStep() generates VM code so that, for each row returned +** by the sub-query a sub-routine (OP_Gosub) coded by select.c is invoked. +** When the sub-routine is invoked: +** +** * The results of all window-functions for the row are stored +** in the associated Window.regResult registers. +** +** * The required terminal values are stored in the current row of +** temp table Window.iEphCsr. +** +** In some cases, depending on the window frame and the specific window +** functions invoked, sqlite3WindowCodeStep() caches each entire partition +** in a temp table before returning any rows. In other cases it does not. +** This detail is encapsulated within this file, the code generated by +** select.c is the same in either case. +** +** BUILT-IN WINDOW FUNCTIONS +** +** This implementation features the following built-in window functions: +** +** row_number() +** rank() +** dense_rank() +** percent_rank() +** cume_dist() +** ntile(N) +** lead(expr [, offset [, default]]) +** lag(expr [, offset [, default]]) +** first_value(expr) +** last_value(expr) +** nth_value(expr, N) +** +** These are the same built-in window functions supported by Postgres. +** Although the behaviour of aggregate window functions (functions that +** can be used as either aggregates or window funtions) allows them to +** be implemented using an API, built-in window functions are much more +** esoteric. Additionally, some window functions (e.g. nth_value()) +** may only be implemented by caching the entire partition in memory. +** As such, some built-in window functions use the same API as aggregate +** window functions and some are implemented directly using VDBE +** instructions. Additionally, for those functions that use the API, the +** window frame is sometimes modified before the SELECT statement is +** rewritten. For example, regardless of the specified window frame, the +** row_number() function always uses: +** +** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +** +** See sqlite3WindowUpdate() for details. +** +** As well as some of the built-in window functions, aggregate window +** functions min() and max() are implemented using VDBE instructions if +** the start of the window frame is declared as anything other than +** UNBOUNDED PRECEDING. +*/ + +/* +** Implementation of built-in window function row_number(). Assumes that the +** window frame has been coerced to: +** +** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +*/ +static void row_numberStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ) (*p)++; + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void row_numberValueFunc(sqlite3_context *pCtx){ + i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + sqlite3_result_int64(pCtx, (p ? *p : 0)); +} + +/* +** Context object type used by rank(), dense_rank(), percent_rank() and +** cume_dist(). +*/ +struct CallCount { + i64 nValue; + i64 nStep; + i64 nTotal; +}; + +/* +** Implementation of built-in window function dense_rank(). Assumes that +** the window frame has been set to: +** +** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +*/ +static void dense_rankStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ) p->nStep = 1; + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void dense_rankValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + if( p->nStep ){ + p->nValue++; + p->nStep = 0; + } + sqlite3_result_int64(pCtx, p->nValue); + } +} + +/* +** Implementation of built-in window function nth_value(). This +** implementation is used in "slow mode" only - when the EXCLUDE clause +** is not set to the default value "NO OTHERS". +*/ +struct NthValueCtx { + i64 nStep; + sqlite3_value *pValue; +}; +static void nth_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + i64 iVal; + switch( sqlite3_value_numeric_type(apArg[1]) ){ + case SQLITE_INTEGER: + iVal = sqlite3_value_int64(apArg[1]); + break; + case SQLITE_FLOAT: { + double fVal = sqlite3_value_double(apArg[1]); + if( ((i64)fVal)!=fVal ) goto error_out; + iVal = (i64)fVal; + break; + } + default: + goto error_out; + } + if( iVal<=0 ) goto error_out; + + p->nStep++; + if( iVal==p->nStep ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + return; + + error_out: + sqlite3_result_error( + pCtx, "second argument to nth_value must be a positive integer", -1 + ); +} +static void nth_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, 0); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define nth_valueInvFunc noopStepFunc +#define nth_valueValueFunc noopValueFunc + +static void first_valueStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue==0 ){ + p->pValue = sqlite3_value_dup(apArg[0]); + if( !p->pValue ){ + sqlite3_result_error_nomem(pCtx); + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void first_valueFinalizeFunc(sqlite3_context *pCtx){ + struct NthValueCtx *p; + p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pValue ){ + sqlite3_result_value(pCtx, p->pValue); + sqlite3_value_free(p->pValue); + p->pValue = 0; + } +} +#define first_valueInvFunc noopStepFunc +#define first_valueValueFunc noopValueFunc + +/* +** Implementation of built-in window function rank(). Assumes that +** the window frame has been set to: +** +** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW +*/ +static void rankStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nStep++; + if( p->nValue==0 ){ + p->nValue = p->nStep; + } + } + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); +} +static void rankValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + sqlite3_result_int64(pCtx, p->nValue); + p->nValue = 0; + } +} + +/* +** Implementation of built-in window function percent_rank(). Assumes that +** the window frame has been set to: +** +** GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING +*/ +static void percent_rankStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nTotal++; + } +} +static void percent_rankInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} +static void percent_rankValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nValue = p->nStep; + if( p->nTotal>1 ){ + double r = (double)p->nValue / (double)(p->nTotal-1); + sqlite3_result_double(pCtx, r); + }else{ + sqlite3_result_double(pCtx, 0.0); + } + } +} +#define percent_rankFinalizeFunc percent_rankValueFunc + +/* +** Implementation of built-in window function cume_dist(). Assumes that +** the window frame has been set to: +** +** GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING +*/ +static void cume_distStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + p->nTotal++; + } +} +static void cume_distInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct CallCount *p; + UNUSED_PARAMETER(nArg); assert( nArg==0 ); + UNUSED_PARAMETER(apArg); + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->nStep++; +} +static void cume_distValueFunc(sqlite3_context *pCtx){ + struct CallCount *p; + p = (struct CallCount*)sqlite3_aggregate_context(pCtx, 0); + if( p ){ + double r = (double)(p->nStep) / (double)(p->nTotal); + sqlite3_result_double(pCtx, r); + } +} +#define cume_distFinalizeFunc cume_distValueFunc + +/* +** Context object for ntile() window function. +*/ +struct NtileCtx { + i64 nTotal; /* Total rows in partition */ + i64 nParam; /* Parameter passed to ntile(N) */ + i64 iRow; /* Current row */ +}; + +/* +** Implementation of ntile(). This assumes that the window frame has +** been coerced to: +** +** ROWS CURRENT ROW AND UNBOUNDED FOLLOWING +*/ +static void ntileStepFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NtileCtx *p; + assert( nArg==1 ); UNUSED_PARAMETER(nArg); + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p ){ + if( p->nTotal==0 ){ + p->nParam = sqlite3_value_int64(apArg[0]); + if( p->nParam<=0 ){ + sqlite3_result_error( + pCtx, "argument of ntile must be a positive integer", -1 + ); + } + } + p->nTotal++; + } +} +static void ntileInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct NtileCtx *p; + assert( nArg==1 ); UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + p->iRow++; +} +static void ntileValueFunc(sqlite3_context *pCtx){ + struct NtileCtx *p; + p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->nParam>0 ){ + int nSize = (p->nTotal / p->nParam); + if( nSize==0 ){ + sqlite3_result_int64(pCtx, p->iRow+1); + }else{ + i64 nLarge = p->nTotal - p->nParam*nSize; + i64 iSmall = nLarge*(nSize+1); + i64 iRow = p->iRow; + + assert( (nLarge*(nSize+1) + (p->nParam-nLarge)*nSize)==p->nTotal ); + + if( iRowpVal); + p->pVal = sqlite3_value_dup(apArg[0]); + if( p->pVal==0 ){ + sqlite3_result_error_nomem(pCtx); + }else{ + p->nVal++; + } + } +} +static void last_valueInvFunc( + sqlite3_context *pCtx, + int nArg, + sqlite3_value **apArg +){ + struct LastValueCtx *p; + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(apArg); + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( ALWAYS(p) ){ + p->nVal--; + if( p->nVal==0 ){ + sqlite3_value_free(p->pVal); + p->pVal = 0; + } + } +} +static void last_valueValueFunc(sqlite3_context *pCtx){ + struct LastValueCtx *p; + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, 0); + if( p && p->pVal ){ + sqlite3_result_value(pCtx, p->pVal); + } +} +static void last_valueFinalizeFunc(sqlite3_context *pCtx){ + struct LastValueCtx *p; + p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); + if( p && p->pVal ){ + sqlite3_result_value(pCtx, p->pVal); + sqlite3_value_free(p->pVal); + p->pVal = 0; + } +} + +/* +** Static names for the built-in window function names. These static +** names are used, rather than string literals, so that FuncDef objects +** can be associated with a particular window function by direct +** comparison of the zName pointer. Example: +** +** if( pFuncDef->zName==row_valueName ){ ... } +*/ +static const char row_numberName[] = "row_number"; +static const char dense_rankName[] = "dense_rank"; +static const char rankName[] = "rank"; +static const char percent_rankName[] = "percent_rank"; +static const char cume_distName[] = "cume_dist"; +static const char ntileName[] = "ntile"; +static const char last_valueName[] = "last_value"; +static const char nth_valueName[] = "nth_value"; +static const char first_valueName[] = "first_value"; +static const char leadName[] = "lead"; +static const char lagName[] = "lag"; + +/* +** No-op implementations of xStep() and xFinalize(). Used as place-holders +** for built-in window functions that never call those interfaces. +** +** The noopValueFunc() is called but is expected to do nothing. The +** noopStepFunc() is never called, and so it is marked with NO_TEST to +** let the test coverage routine know not to expect this function to be +** invoked. +*/ +static void noopStepFunc( /*NO_TEST*/ + sqlite3_context *p, /*NO_TEST*/ + int n, /*NO_TEST*/ + sqlite3_value **a /*NO_TEST*/ +){ /*NO_TEST*/ + UNUSED_PARAMETER(p); /*NO_TEST*/ + UNUSED_PARAMETER(n); /*NO_TEST*/ + UNUSED_PARAMETER(a); /*NO_TEST*/ + assert(0); /*NO_TEST*/ +} /*NO_TEST*/ +static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ } + +/* Window functions that use all window interfaces: xStep, xFinal, +** xValue, and xInverse */ +#define WINDOWFUNCALL(name,nArg,extra) { \ + nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + name ## StepFunc, name ## FinalizeFunc, name ## ValueFunc, \ + name ## InvFunc, name ## Name, {0} \ +} + +/* Window functions that are implemented using bytecode and thus have +** no-op routines for their methods */ +#define WINDOWFUNCNOOP(name,nArg,extra) { \ + nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + noopStepFunc, noopValueFunc, noopValueFunc, \ + noopStepFunc, name ## Name, {0} \ +} + +/* Window functions that use all window interfaces: xStep, the +** same routine for xFinalize and xValue and which never call +** xInverse. */ +#define WINDOWFUNCX(name,nArg,extra) { \ + nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + name ## StepFunc, name ## ValueFunc, name ## ValueFunc, \ + noopStepFunc, name ## Name, {0} \ +} + + +/* +** Register those built-in window functions that are not also aggregates. +*/ +SQLITE_PRIVATE void sqlite3WindowFunctions(void){ + static FuncDef aWindowFuncs[] = { + WINDOWFUNCX(row_number, 0, 0), + WINDOWFUNCX(dense_rank, 0, 0), + WINDOWFUNCX(rank, 0, 0), + WINDOWFUNCALL(percent_rank, 0, 0), + WINDOWFUNCALL(cume_dist, 0, 0), + WINDOWFUNCALL(ntile, 1, 0), + WINDOWFUNCALL(last_value, 1, 0), + WINDOWFUNCALL(nth_value, 2, 0), + WINDOWFUNCALL(first_value, 1, 0), + WINDOWFUNCNOOP(lead, 1, 0), + WINDOWFUNCNOOP(lead, 2, 0), + WINDOWFUNCNOOP(lead, 3, 0), + WINDOWFUNCNOOP(lag, 1, 0), + WINDOWFUNCNOOP(lag, 2, 0), + WINDOWFUNCNOOP(lag, 3, 0), + }; + sqlite3InsertBuiltinFuncs(aWindowFuncs, ArraySize(aWindowFuncs)); +} + +static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ + Window *p; + for(p=pList; p; p=p->pNextWin){ + if( sqlite3StrICmp(p->zName, zName)==0 ) break; + } + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such window: %s", zName); + } + return p; +} + +/* +** This function is called immediately after resolving the function name +** for a window function within a SELECT statement. Argument pList is a +** linked list of WINDOW definitions for the current SELECT statement. +** Argument pFunc is the function definition just resolved and pWin +** is the Window object representing the associated OVER clause. This +** function updates the contents of pWin as follows: +** +** * If the OVER clause refered to a named window (as in "max(x) OVER win"), +** search list pList for a matching WINDOW definition, and update pWin +** accordingly. If no such WINDOW clause can be found, leave an error +** in pParse. +** +** * If the function is a built-in window function that requires the +** window to be coerced (see "BUILT-IN WINDOW FUNCTIONS" at the top +** of this file), pWin is updated here. +*/ +SQLITE_PRIVATE void sqlite3WindowUpdate( + Parse *pParse, + Window *pList, /* List of named windows for this SELECT */ + Window *pWin, /* Window frame to update */ + FuncDef *pFunc /* Window function definition */ +){ + if( pWin->zName && pWin->eFrmType==0 ){ + Window *p = windowFind(pParse, pList, pWin->zName); + if( p==0 ) return; + pWin->pPartition = sqlite3ExprListDup(pParse->db, p->pPartition, 0); + pWin->pOrderBy = sqlite3ExprListDup(pParse->db, p->pOrderBy, 0); + pWin->pStart = sqlite3ExprDup(pParse->db, p->pStart, 0); + pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0); + pWin->eStart = p->eStart; + pWin->eEnd = p->eEnd; + pWin->eFrmType = p->eFrmType; + pWin->eExclude = p->eExclude; + }else{ + sqlite3WindowChain(pParse, pWin, pList); + } + if( (pWin->eFrmType==TK_RANGE) + && (pWin->pStart || pWin->pEnd) + && (pWin->pOrderBy==0 || pWin->pOrderBy->nExpr!=1) + ){ + sqlite3ErrorMsg(pParse, + "RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression" + ); + }else + if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ + sqlite3 *db = pParse->db; + if( pWin->pFilter ){ + sqlite3ErrorMsg(pParse, + "FILTER clause may only be used with aggregate window functions" + ); + }else{ + struct WindowUpdate { + const char *zFunc; + int eFrmType; + int eStart; + int eEnd; + } aUp[] = { + { row_numberName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + { dense_rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { rankName, TK_RANGE, TK_UNBOUNDED, TK_CURRENT }, + { percent_rankName, TK_GROUPS, TK_CURRENT, TK_UNBOUNDED }, + { cume_distName, TK_GROUPS, TK_FOLLOWING, TK_UNBOUNDED }, + { ntileName, TK_ROWS, TK_CURRENT, TK_UNBOUNDED }, + { leadName, TK_ROWS, TK_UNBOUNDED, TK_UNBOUNDED }, + { lagName, TK_ROWS, TK_UNBOUNDED, TK_CURRENT }, + }; + int i; + for(i=0; izName==aUp[i].zFunc ){ + sqlite3ExprDelete(db, pWin->pStart); + sqlite3ExprDelete(db, pWin->pEnd); + pWin->pEnd = pWin->pStart = 0; + pWin->eFrmType = aUp[i].eFrmType; + pWin->eStart = aUp[i].eStart; + pWin->eEnd = aUp[i].eEnd; + pWin->eExclude = 0; + if( pWin->eStart==TK_FOLLOWING ){ + pWin->pStart = sqlite3Expr(db, TK_INTEGER, "1"); + } + break; + } + } + } + } + pWin->pWFunc = pFunc; +} + +/* +** Context object passed through sqlite3WalkExprList() to +** selectWindowRewriteExprCb() by selectWindowRewriteEList(). +*/ +typedef struct WindowRewrite WindowRewrite; +struct WindowRewrite { + Window *pWin; + SrcList *pSrc; + ExprList *pSub; + Table *pTab; + Select *pSubSelect; /* Current sub-select, if any */ +}; + +/* +** Callback function used by selectWindowRewriteEList(). If necessary, +** this function appends to the output expression-list and updates +** expression (*ppExpr) in place. +*/ +static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ + struct WindowRewrite *p = pWalker->u.pRewrite; + Parse *pParse = pWalker->pParse; + assert( p!=0 ); + assert( p->pWin!=0 ); + + /* If this function is being called from within a scalar sub-select + ** that used by the SELECT statement being processed, only process + ** TK_COLUMN expressions that refer to it (the outer SELECT). Do + ** not process aggregates or window functions at all, as they belong + ** to the scalar sub-select. */ + if( p->pSubSelect ){ + if( pExpr->op!=TK_COLUMN ){ + return WRC_Continue; + }else{ + int nSrc = p->pSrc->nSrc; + int i; + for(i=0; iiTable==p->pSrc->a[i].iCursor ) break; + } + if( i==nSrc ) return WRC_Continue; + } + } + + switch( pExpr->op ){ + + case TK_FUNCTION: + if( !ExprHasProperty(pExpr, EP_WinFunc) ){ + break; + }else{ + Window *pWin; + for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){ + if( pExpr->y.pWin==pWin ){ + assert( pWin->pOwner==pExpr ); + return WRC_Prune; + } + } + } + /* no break */ deliberate_fall_through + + case TK_AGG_FUNCTION: + case TK_COLUMN: { + int iCol = -1; + if( pParse->db->mallocFailed ) return WRC_Abort; + if( p->pSub ){ + int i; + for(i=0; ipSub->nExpr; i++){ + if( 0==sqlite3ExprCompare(0, p->pSub->a[i].pExpr, pExpr, -1) ){ + iCol = i; + break; + } + } + } + if( iCol<0 ){ + Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); + if( pDup && pDup->op==TK_AGG_FUNCTION ) pDup->op = TK_FUNCTION; + p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); + } + if( p->pSub ){ + int f = pExpr->flags & EP_Collate; + assert( ExprHasProperty(pExpr, EP_Static)==0 ); + ExprSetProperty(pExpr, EP_Static); + sqlite3ExprDelete(pParse->db, pExpr); + ExprClearProperty(pExpr, EP_Static); + memset(pExpr, 0, sizeof(Expr)); + + pExpr->op = TK_COLUMN; + pExpr->iColumn = (iCol<0 ? p->pSub->nExpr-1: iCol); + pExpr->iTable = p->pWin->iEphCsr; + pExpr->y.pTab = p->pTab; + pExpr->flags = f; + } + if( pParse->db->mallocFailed ) return WRC_Abort; + break; + } + + default: /* no-op */ + break; + } + + return WRC_Continue; +} +static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){ + struct WindowRewrite *p = pWalker->u.pRewrite; + Select *pSave = p->pSubSelect; + if( pSave==pSelect ){ + return WRC_Continue; + }else{ + p->pSubSelect = pSelect; + sqlite3WalkSelect(pWalker, pSelect); + p->pSubSelect = pSave; + } + return WRC_Prune; +} + + +/* +** Iterate through each expression in expression-list pEList. For each: +** +** * TK_COLUMN, +** * aggregate function, or +** * window function with a Window object that is not a member of the +** Window list passed as the second argument (pWin). +** +** Append the node to output expression-list (*ppSub). And replace it +** with a TK_COLUMN that reads the (N-1)th element of table +** pWin->iEphCsr, where N is the number of elements in (*ppSub) after +** appending the new one. +*/ +static void selectWindowRewriteEList( + Parse *pParse, + Window *pWin, + SrcList *pSrc, + ExprList *pEList, /* Rewrite expressions in this list */ + Table *pTab, + ExprList **ppSub /* IN/OUT: Sub-select expression-list */ +){ + Walker sWalker; + WindowRewrite sRewrite; + + assert( pWin!=0 ); + memset(&sWalker, 0, sizeof(Walker)); + memset(&sRewrite, 0, sizeof(WindowRewrite)); + + sRewrite.pSub = *ppSub; + sRewrite.pWin = pWin; + sRewrite.pSrc = pSrc; + sRewrite.pTab = pTab; + + sWalker.pParse = pParse; + sWalker.xExprCallback = selectWindowRewriteExprCb; + sWalker.xSelectCallback = selectWindowRewriteSelectCb; + sWalker.u.pRewrite = &sRewrite; + + (void)sqlite3WalkExprList(&sWalker, pEList); + + *ppSub = sRewrite.pSub; +} + +/* +** Append a copy of each expression in expression-list pAppend to +** expression list pList. Return a pointer to the result list. +*/ +static ExprList *exprListAppendList( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + ExprList *pAppend, /* List of values to append. Might be NULL */ + int bIntToNull +){ + if( pAppend ){ + int i; + int nInit = pList ? pList->nExpr : 0; + for(i=0; inExpr; i++){ + sqlite3 *db = pParse->db; + Expr *pDup = sqlite3ExprDup(db, pAppend->a[i].pExpr, 0); + assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDup); + break; + } + if( bIntToNull ){ + int iDummy; + Expr *pSub; + pSub = sqlite3ExprSkipCollateAndLikely(pDup); + if( sqlite3ExprIsInteger(pSub, &iDummy) ){ + pSub->op = TK_NULL; + pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); + pSub->u.zToken = 0; + } + } + pList = sqlite3ExprListAppend(pParse, pList, pDup); + if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags; + } + } + return pList; +} + +/* +** When rewriting a query, if the new subquery in the FROM clause +** contains TK_AGG_FUNCTION nodes that refer to an outer query, +** then we have to increase the Expr->op2 values of those nodes +** due to the extra subquery layer that was added. +** +** See also the incrAggDepth() routine in resolve.c +*/ +static int sqlite3WindowExtraAggFuncDepth(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION + && pExpr->op2>=pWalker->walkerDepth + ){ + pExpr->op2++; + } + return WRC_Continue; +} + +static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_AGG_FUNCTION && pExpr->pAggInfo==0 ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3ErrorMsg(pWalker->pParse, + "misuse of aggregate: %s()", pExpr->u.zToken); + } + return WRC_Continue; +} + +/* +** If the SELECT statement passed as the second argument does not invoke +** any SQL window functions, this function is a no-op. Otherwise, it +** rewrites the SELECT statement so that window function xStep functions +** are invoked in the correct order as described under "SELECT REWRITING" +** at the top of this file. +*/ +SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ + int rc = SQLITE_OK; + if( p->pWin + && p->pPrior==0 + && ALWAYS((p->selFlags & SF_WinRewrite)==0) + && ALWAYS(!IN_RENAME_OBJECT) + ){ + Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3 *db = pParse->db; + Select *pSub = 0; /* The subquery */ + SrcList *pSrc = p->pSrc; + Expr *pWhere = p->pWhere; + ExprList *pGroupBy = p->pGroupBy; + Expr *pHaving = p->pHaving; + ExprList *pSort = 0; + + ExprList *pSublist = 0; /* Expression list for sub-query */ + Window *pMWin = p->pWin; /* Main window object */ + Window *pWin; /* Window object iterator */ + Table *pTab; + Walker w; + + u32 selFlags = p->selFlags; + + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ){ + return sqlite3ErrorToParser(db, SQLITE_NOMEM); + } + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w, p); + if( (p->selFlags & SF_Aggregate)==0 ){ + w.xExprCallback = disallowAggregatesInOrderByCb; + w.xSelectCallback = 0; + sqlite3WalkExprList(&w, p->pOrderBy); + } + + p->pSrc = 0; + p->pWhere = 0; + p->pGroupBy = 0; + p->pHaving = 0; + p->selFlags &= ~SF_Aggregate; + p->selFlags |= SF_WinRewrite; + + /* Create the ORDER BY clause for the sub-select. This is the concatenation + ** of the window PARTITION and ORDER BY clauses. Then, if this makes it + ** redundant, remove the ORDER BY from the parent SELECT. */ + pSort = exprListAppendList(pParse, 0, pMWin->pPartition, 1); + pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy, 1); + if( pSort && p->pOrderBy && p->pOrderBy->nExpr<=pSort->nExpr ){ + int nSave = pSort->nExpr; + pSort->nExpr = p->pOrderBy->nExpr; + if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){ + sqlite3ExprListDelete(db, p->pOrderBy); + p->pOrderBy = 0; + } + pSort->nExpr = nSave; + } + + /* Assign a cursor number for the ephemeral table used to buffer rows. + ** The OpenEphemeral instruction is coded later, after it is known how + ** many columns the table will have. */ + pMWin->iEphCsr = pParse->nTab++; + pParse->nTab += 3; + + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, pTab, &pSublist); + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, pTab, &pSublist); + pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); + + /* Append the PARTITION BY and ORDER BY expressions to the to the + ** sub-select expression list. They are required to figure out where + ** boundaries for partitions and sets of peer rows lie. */ + pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition, 0); + pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy, 0); + + /* Append the arguments passed to each window function to the + ** sub-select expression list. Also allocate two registers for each + ** window function - one for the accumulator, another for interim + ** results. */ + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + ExprList *pArgs; + assert( ExprUseXList(pWin->pOwner) ); + assert( pWin->pWFunc!=0 ); + pArgs = pWin->pOwner->x.pList; + if( pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ + selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pWin->bExprArgs = 1; + }else{ + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pSublist = exprListAppendList(pParse, pSublist, pArgs, 0); + } + if( pWin->pFilter ){ + Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); + pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter); + } + pWin->regAccum = ++pParse->nMem; + pWin->regResult = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + } + + /* If there is no ORDER BY or PARTITION BY clause, and the window + ** function accepts zero arguments, and there are no other columns + ** selected (e.g. "SELECT row_number() OVER () FROM t1"), it is possible + ** that pSublist is still NULL here. Add a constant expression here to + ** keep everything legal in this case. + */ + if( pSublist==0 ){ + pSublist = sqlite3ExprListAppend(pParse, 0, + sqlite3Expr(db, TK_INTEGER, "0") + ); + } + + pSub = sqlite3SelectNew( + pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 + ); + SELECTTRACE(1,pParse,pSub, + ("New window-function subquery in FROM clause of (%u/%p)\n", + p->selId, p)); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + assert( pSub!=0 || p->pSrc==0 ); /* Due to db->mallocFailed test inside + ** of sqlite3DbMallocRawNN() called from + ** sqlite3SrcListAppend() */ + if( p->pSrc ){ + Table *pTab2; + p->pSrc->a[0].pSelect = pSub; + sqlite3SrcListAssignCursors(pParse, p->pSrc); + pSub->selFlags |= SF_Expanded|SF_OrderByReqd; + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); + pSub->selFlags |= (selFlags & SF_Aggregate); + if( pTab2==0 ){ + /* Might actually be some other kind of error, but in that case + ** pParse->nErr will be set, so if SQLITE_NOMEM is set, we will get + ** the correct error message regardless. */ + rc = SQLITE_NOMEM; + }else{ + memcpy(pTab, pTab2, sizeof(Table)); + pTab->tabFlags |= TF_Ephemeral; + p->pSrc->a[0].pTab = pTab; + pTab = pTab2; + memset(&w, 0, sizeof(w)); + w.xExprCallback = sqlite3WindowExtraAggFuncDepth; + w.xSelectCallback = sqlite3WalkerDepthIncrease; + w.xSelectCallback2 = sqlite3WalkerDepthDecrease; + sqlite3WalkSelect(&w, pSub); + } + }else{ + sqlite3SelectDelete(db, pSub); + } + if( db->mallocFailed ) rc = SQLITE_NOMEM; + + /* Defer deleting the temporary table pTab because if an error occurred, + ** there could still be references to that table embedded in the + ** result-set or ORDER BY clause of the SELECT statement p. */ + sqlite3ParserAddCleanup(pParse, sqlite3DbFree, pTab); + } + + assert( rc==SQLITE_OK || pParse->nErr!=0 ); + return rc; +} + +/* +** Unlink the Window object from the Select to which it is attached, +** if it is attached. +*/ +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window *p){ + if( p->ppThis ){ + *p->ppThis = p->pNextWin; + if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; + p->ppThis = 0; + } +} + +/* +** Free the Window object passed as the second argument. +*/ +SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){ + if( p ){ + sqlite3WindowUnlinkFromSelect(p); + sqlite3ExprDelete(db, p->pFilter); + sqlite3ExprListDelete(db, p->pPartition); + sqlite3ExprListDelete(db, p->pOrderBy); + sqlite3ExprDelete(db, p->pEnd); + sqlite3ExprDelete(db, p->pStart); + sqlite3DbFree(db, p->zName); + sqlite3DbFree(db, p->zBase); + sqlite3DbFree(db, p); + } +} + +/* +** Free the linked list of Window objects starting at the second argument. +*/ +SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){ + while( p ){ + Window *pNext = p->pNextWin; + sqlite3WindowDelete(db, p); + p = pNext; + } +} + +/* +** The argument expression is an PRECEDING or FOLLOWING offset. The +** value should be a non-negative integer. If the value is not a +** constant, change it to NULL. The fact that it is then a non-negative +** integer will be caught later. But it is important not to leave +** variable values in the expression tree. +*/ +static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ + if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); + sqlite3ExprDelete(pParse->db, pExpr); + pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); + } + return pExpr; +} + +/* +** Allocate and return a new Window object describing a Window Definition. +*/ +SQLITE_PRIVATE Window *sqlite3WindowAlloc( + Parse *pParse, /* Parsing context */ + int eType, /* Frame type. TK_RANGE, TK_ROWS, TK_GROUPS, or 0 */ + int eStart, /* Start type: CURRENT, PRECEDING, FOLLOWING, UNBOUNDED */ + Expr *pStart, /* Start window size if TK_PRECEDING or FOLLOWING */ + int eEnd, /* End type: CURRENT, FOLLOWING, TK_UNBOUNDED, PRECEDING */ + Expr *pEnd, /* End window size if TK_FOLLOWING or PRECEDING */ + u8 eExclude /* EXCLUDE clause */ +){ + Window *pWin = 0; + int bImplicitFrame = 0; + + /* Parser assures the following: */ + assert( eType==0 || eType==TK_RANGE || eType==TK_ROWS || eType==TK_GROUPS ); + assert( eStart==TK_CURRENT || eStart==TK_PRECEDING + || eStart==TK_UNBOUNDED || eStart==TK_FOLLOWING ); + assert( eEnd==TK_CURRENT || eEnd==TK_FOLLOWING + || eEnd==TK_UNBOUNDED || eEnd==TK_PRECEDING ); + assert( (eStart==TK_PRECEDING || eStart==TK_FOLLOWING)==(pStart!=0) ); + assert( (eEnd==TK_FOLLOWING || eEnd==TK_PRECEDING)==(pEnd!=0) ); + + if( eType==0 ){ + bImplicitFrame = 1; + eType = TK_RANGE; + } + + /* Additionally, the + ** starting boundary type may not occur earlier in the following list than + ** the ending boundary type: + ** + ** UNBOUNDED PRECEDING + ** PRECEDING + ** CURRENT ROW + ** FOLLOWING + ** UNBOUNDED FOLLOWING + ** + ** The parser ensures that "UNBOUNDED PRECEDING" cannot be used as an ending + ** boundary, and than "UNBOUNDED FOLLOWING" cannot be used as a starting + ** frame boundary. + */ + if( (eStart==TK_CURRENT && eEnd==TK_PRECEDING) + || (eStart==TK_FOLLOWING && (eEnd==TK_PRECEDING || eEnd==TK_CURRENT)) + ){ + sqlite3ErrorMsg(pParse, "unsupported frame specification"); + goto windowAllocErr; + } + + pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( pWin==0 ) goto windowAllocErr; + pWin->eFrmType = eType; + pWin->eStart = eStart; + pWin->eEnd = eEnd; + if( eExclude==0 && OptimizationDisabled(pParse->db, SQLITE_WindowFunc) ){ + eExclude = TK_NO; + } + pWin->eExclude = eExclude; + pWin->bImplicitFrame = bImplicitFrame; + pWin->pEnd = sqlite3WindowOffsetExpr(pParse, pEnd); + pWin->pStart = sqlite3WindowOffsetExpr(pParse, pStart); + return pWin; + +windowAllocErr: + sqlite3ExprDelete(pParse->db, pEnd); + sqlite3ExprDelete(pParse->db, pStart); + return 0; +} + +/* +** Attach PARTITION and ORDER BY clauses pPartition and pOrderBy to window +** pWin. Also, if parameter pBase is not NULL, set pWin->zBase to the +** equivalent nul-terminated string. +*/ +SQLITE_PRIVATE Window *sqlite3WindowAssemble( + Parse *pParse, + Window *pWin, + ExprList *pPartition, + ExprList *pOrderBy, + Token *pBase +){ + if( pWin ){ + pWin->pPartition = pPartition; + pWin->pOrderBy = pOrderBy; + if( pBase ){ + pWin->zBase = sqlite3DbStrNDup(pParse->db, pBase->z, pBase->n); + } + }else{ + sqlite3ExprListDelete(pParse->db, pPartition); + sqlite3ExprListDelete(pParse->db, pOrderBy); + } + return pWin; +} + +/* +** Window *pWin has just been created from a WINDOW clause. Tokne pBase +** is the base window. Earlier windows from the same WINDOW clause are +** stored in the linked list starting at pWin->pNextWin. This function +** either updates *pWin according to the base specification, or else +** leaves an error in pParse. +*/ +SQLITE_PRIVATE void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){ + if( pWin->zBase ){ + sqlite3 *db = pParse->db; + Window *pExist = windowFind(pParse, pList, pWin->zBase); + if( pExist ){ + const char *zErr = 0; + /* Check for errors */ + if( pWin->pPartition ){ + zErr = "PARTITION clause"; + }else if( pExist->pOrderBy && pWin->pOrderBy ){ + zErr = "ORDER BY clause"; + }else if( pExist->bImplicitFrame==0 ){ + zErr = "frame specification"; + } + if( zErr ){ + sqlite3ErrorMsg(pParse, + "cannot override %s of window: %s", zErr, pWin->zBase + ); + }else{ + pWin->pPartition = sqlite3ExprListDup(db, pExist->pPartition, 0); + if( pExist->pOrderBy ){ + assert( pWin->pOrderBy==0 ); + pWin->pOrderBy = sqlite3ExprListDup(db, pExist->pOrderBy, 0); + } + sqlite3DbFree(db, pWin->zBase); + pWin->zBase = 0; + } + } + } +} + +/* +** Attach window object pWin to expression p. +*/ +SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ + if( p ){ + assert( p->op==TK_FUNCTION ); + assert( pWin ); + p->y.pWin = pWin; + ExprSetProperty(p, EP_WinFunc); + pWin->pOwner = p; + if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){ + sqlite3ErrorMsg(pParse, + "DISTINCT is not supported for window functions" + ); + } + }else{ + sqlite3WindowDelete(pParse->db, pWin); + } +} + +/* +** Possibly link window pWin into the list at pSel->pWin (window functions +** to be processed as part of SELECT statement pSel). The window is linked +** in if either (a) there are no other windows already linked to this +** SELECT, or (b) the windows already linked use a compatible window frame. +*/ +SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){ + if( pSel ){ + if( 0==pSel->pWin || 0==sqlite3WindowCompare(0, pSel->pWin, pWin, 0) ){ + pWin->pNextWin = pSel->pWin; + if( pSel->pWin ){ + pSel->pWin->ppThis = &pWin->pNextWin; + } + pSel->pWin = pWin; + pWin->ppThis = &pSel->pWin; + }else{ + if( sqlite3ExprListCompare(pWin->pPartition, pSel->pWin->pPartition,-1) ){ + pSel->selFlags |= SF_MultiPart; + } + } + } +} + +/* +** Return 0 if the two window objects are identical, 1 if they are +** different, or 2 if it cannot be determined if the objects are identical +** or not. Identical window objects can be processed in a single scan. +*/ +SQLITE_PRIVATE int sqlite3WindowCompare( + const Parse *pParse, + const Window *p1, + const Window *p2, + int bFilter +){ + int res; + if( NEVER(p1==0) || NEVER(p2==0) ) return 1; + if( p1->eFrmType!=p2->eFrmType ) return 1; + if( p1->eStart!=p2->eStart ) return 1; + if( p1->eEnd!=p2->eEnd ) return 1; + if( p1->eExclude!=p2->eExclude ) return 1; + if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; + if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; + if( (res = sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1)) ){ + return res; + } + if( (res = sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1)) ){ + return res; + } + if( bFilter ){ + if( (res = sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1)) ){ + return res; + } + } + return 0; +} + + +/* +** This is called by code in select.c before it calls sqlite3WhereBegin() +** to begin iterating through the sub-query results. It is used to allocate +** and initialize registers and cursors used by sqlite3WindowCodeStep(). +*/ +SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ + int nEphExpr = pSelect->pSrc->a[0].pSelect->pEList->nExpr; + Window *pMWin = pSelect->pWin; + Window *pWin; + Vdbe *v = sqlite3GetVdbe(pParse); + + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, nEphExpr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); + + /* Allocate registers to use for PARTITION BY values, if any. Initialize + ** said registers to NULL. */ + if( pMWin->pPartition ){ + int nExpr = pMWin->pPartition->nExpr; + pMWin->regPart = pParse->nMem+1; + pParse->nMem += nExpr; + sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nExpr-1); + } + + pMWin->regOne = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regOne); + + if( pMWin->eExclude ){ + pMWin->regStartRowid = ++pParse->nMem; + pMWin->regEndRowid = ++pParse->nMem; + pMWin->csrApp = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->csrApp, pMWin->iEphCsr); + return; + } + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *p = pWin->pWFunc; + if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){ + /* The inline versions of min() and max() require a single ephemeral + ** table and 3 registers. The registers are used as follows: + ** + ** regApp+0: slot to copy min()/max() argument to for MakeRecord + ** regApp+1: integer value used to ensure keys are unique + ** regApp+2: output of MakeRecord + */ + ExprList *pList; + KeyInfo *pKeyInfo; + assert( ExprUseXList(pWin->pOwner) ); + pList = pWin->pOwner->x.pList; + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0); + pWin->csrApp = pParse->nTab++; + pWin->regApp = pParse->nMem+1; + pParse->nMem += 3; + if( pKeyInfo && pWin->pWFunc->zName[1]=='i' ){ + assert( pKeyInfo->aSortFlags[0]==0 ); + pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; + } + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2); + sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } + else if( p->zName==nth_valueName || p->zName==first_valueName ){ + /* Allocate two registers at pWin->regApp. These will be used to + ** store the start and end index of the current frame. */ + pWin->regApp = pParse->nMem+1; + pWin->csrApp = pParse->nTab++; + pParse->nMem += 2; + sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); + } + else if( p->zName==leadName || p->zName==lagName ){ + pWin->csrApp = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); + } + } +} + +#define WINDOW_STARTING_INT 0 +#define WINDOW_ENDING_INT 1 +#define WINDOW_NTH_VALUE_INT 2 +#define WINDOW_STARTING_NUM 3 +#define WINDOW_ENDING_NUM 4 + +/* +** A "PRECEDING " (eCond==0) or "FOLLOWING " (eCond==1) or the +** value of the second argument to nth_value() (eCond==2) has just been +** evaluated and the result left in register reg. This function generates VM +** code to check that the value is a non-negative integer and throws an +** exception if it is not. +*/ +static void windowCheckValue(Parse *pParse, int reg, int eCond){ + static const char *azErr[] = { + "frame starting offset must be a non-negative integer", + "frame ending offset must be a non-negative integer", + "second argument to nth_value must be a positive integer", + "frame starting offset must be a non-negative number", + "frame ending offset must be a non-negative number", + }; + static int aOp[] = { OP_Ge, OP_Ge, OP_Gt, OP_Ge, OP_Ge }; + Vdbe *v = sqlite3GetVdbe(pParse); + int regZero = sqlite3GetTempReg(pParse); + assert( eCond>=0 && eCond=WINDOW_STARTING_NUM ){ + int regString = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + sqlite3VdbeAddOp3(v, OP_Ge, regString, sqlite3VdbeCurrentAddr(v)+2, reg); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC|SQLITE_JUMPIFNULL); + VdbeCoverage(v); + assert( eCond==3 || eCond==4 ); + VdbeCoverageIf(v, eCond==3); + VdbeCoverageIf(v, eCond==4); + }else{ + sqlite3VdbeAddOp2(v, OP_MustBeInt, reg, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + assert( eCond==0 || eCond==1 || eCond==2 ); + VdbeCoverageIf(v, eCond==0); + VdbeCoverageIf(v, eCond==1); + VdbeCoverageIf(v, eCond==2); + } + sqlite3VdbeAddOp3(v, aOp[eCond], regZero, sqlite3VdbeCurrentAddr(v)+2, reg); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC); + VdbeCoverageNeverNullIf(v, eCond==0); /* NULL case captured by */ + VdbeCoverageNeverNullIf(v, eCond==1); /* the OP_MustBeInt */ + VdbeCoverageNeverNullIf(v, eCond==2); + VdbeCoverageNeverNullIf(v, eCond==3); /* NULL case caught by */ + VdbeCoverageNeverNullIf(v, eCond==4); /* the OP_Ge */ + sqlite3MayAbort(pParse); + sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); + sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); + sqlite3ReleaseTempReg(pParse, regZero); +} + +/* +** Return the number of arguments passed to the window-function associated +** with the object passed as the only argument to this function. +*/ +static int windowArgCount(Window *pWin){ + const ExprList *pList; + assert( ExprUseXList(pWin->pOwner) ); + pList = pWin->pOwner->x.pList; + return (pList ? pList->nExpr : 0); +} + +typedef struct WindowCodeArg WindowCodeArg; +typedef struct WindowCsrAndReg WindowCsrAndReg; + +/* +** See comments above struct WindowCodeArg. +*/ +struct WindowCsrAndReg { + int csr; /* Cursor number */ + int reg; /* First in array of peer values */ +}; + +/* +** A single instance of this structure is allocated on the stack by +** sqlite3WindowCodeStep() and a pointer to it passed to the various helper +** routines. This is to reduce the number of arguments required by each +** helper function. +** +** regArg: +** Each window function requires an accumulator register (just as an +** ordinary aggregate function does). This variable is set to the first +** in an array of accumulator registers - one for each window function +** in the WindowCodeArg.pMWin list. +** +** eDelete: +** The window functions implementation sometimes caches the input rows +** that it processes in a temporary table. If it is not zero, this +** variable indicates when rows may be removed from the temp table (in +** order to reduce memory requirements - it would always be safe just +** to leave them there). Possible values for eDelete are: +** +** WINDOW_RETURN_ROW: +** An input row can be discarded after it is returned to the caller. +** +** WINDOW_AGGINVERSE: +** An input row can be discarded after the window functions xInverse() +** callbacks have been invoked in it. +** +** WINDOW_AGGSTEP: +** An input row can be discarded after the window functions xStep() +** callbacks have been invoked in it. +** +** start,current,end +** Consider a window-frame similar to the following: +** +** (ORDER BY a, b GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING) +** +** The windows functions implmentation caches the input rows in a temp +** table, sorted by "a, b" (it actually populates the cache lazily, and +** aggressively removes rows once they are no longer required, but that's +** a mere detail). It keeps three cursors open on the temp table. One +** (current) that points to the next row to return to the query engine +** once its window function values have been calculated. Another (end) +** points to the next row to call the xStep() method of each window function +** on (so that it is 2 groups ahead of current). And a third (start) that +** points to the next row to call the xInverse() method of each window +** function on. +** +** Each cursor (start, current and end) consists of a VDBE cursor +** (WindowCsrAndReg.csr) and an array of registers (starting at +** WindowCodeArg.reg) that always contains a copy of the peer values +** read from the corresponding cursor. +** +** Depending on the window-frame in question, all three cursors may not +** be required. In this case both WindowCodeArg.csr and reg are set to +** 0. +*/ +struct WindowCodeArg { + Parse *pParse; /* Parse context */ + Window *pMWin; /* First in list of functions being processed */ + Vdbe *pVdbe; /* VDBE object */ + int addrGosub; /* OP_Gosub to this address to return one row */ + int regGosub; /* Register used with OP_Gosub(addrGosub) */ + int regArg; /* First in array of accumulator registers */ + int eDelete; /* See above */ + int regRowid; + + WindowCsrAndReg start; + WindowCsrAndReg current; + WindowCsrAndReg end; +}; + +/* +** Generate VM code to read the window frames peer values from cursor csr into +** an array of registers starting at reg. +*/ +static void windowReadPeerValues( + WindowCodeArg *p, + int csr, + int reg +){ + Window *pMWin = p->pMWin; + ExprList *pOrderBy = pMWin->pOrderBy; + if( pOrderBy ){ + Vdbe *v = sqlite3GetVdbe(p->pParse); + ExprList *pPart = pMWin->pPartition; + int iColOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); + int i; + for(i=0; inExpr; i++){ + sqlite3VdbeAddOp3(v, OP_Column, csr, iColOff+i, reg+i); + } + } +} + +/* +** Generate VM code to invoke either xStep() (if bInverse is 0) or +** xInverse (if bInverse is non-zero) for each window function in the +** linked list starting at pMWin. Or, for built-in window functions +** that do not use the standard function API, generate the required +** inline VM code. +** +** If argument csr is greater than or equal to 0, then argument reg is +** the first register in an array of registers guaranteed to be large +** enough to hold the array of arguments for each function. In this case +** the arguments are extracted from the current row of csr into the +** array of registers before invoking OP_AggStep or OP_AggInverse +** +** Or, if csr is less than zero, then the array of registers at reg is +** already populated with all columns from the current row of the sub-query. +** +** If argument regPartSize is non-zero, then it is a register containing the +** number of rows in the current partition. +*/ +static void windowAggStep( + WindowCodeArg *p, + Window *pMWin, /* Linked list of window functions */ + int csr, /* Read arguments from this cursor */ + int bInverse, /* True to invoke xInverse instead of xStep */ + int reg /* Array of registers */ +){ + Parse *pParse = p->pParse; + Vdbe *v = sqlite3GetVdbe(pParse); + Window *pWin; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pWFunc; + int regArg; + int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin); + int i; + + assert( bInverse==0 || pWin->eStart!=TK_UNBOUNDED ); + + /* All OVER clauses in the same window function aggregate step must + ** be the same. */ + assert( pWin==pMWin || sqlite3WindowCompare(pParse,pWin,pMWin,0)!=1 ); + + for(i=0; izName!=nth_valueName ){ + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+i, reg+i); + } + } + regArg = reg; + + if( pMWin->regStartRowid==0 + && (pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) + ){ + int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg); + VdbeCoverage(v); + if( bInverse==0 ){ + sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1, 1); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg, pWin->regApp); + sqlite3VdbeAddOp3(v, OP_MakeRecord, pWin->regApp, 2, pWin->regApp+2); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pWin->csrApp, pWin->regApp+2); + }else{ + sqlite3VdbeAddOp4Int(v, OP_SeekGE, pWin->csrApp, 0, regArg, 1); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp1(v, OP_Delete, pWin->csrApp); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + } + sqlite3VdbeJumpHere(v, addrIsNull); + }else if( pWin->regApp ){ + assert( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName + ); + assert( bInverse==0 || bInverse==1 ); + sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1-bInverse, 1); + }else if( pFunc->xSFunc!=noopStepFunc ){ + int addrIf = 0; + if( pWin->pFilter ){ + int regTmp; + assert( ExprUseXList(pWin->pOwner) ); + assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr ); + assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 ); + regTmp = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); + addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regTmp); + } + + if( pWin->bExprArgs ){ + int iOp = sqlite3VdbeCurrentAddr(v); + int iEnd; + + assert( ExprUseXList(pWin->pOwner) ); + nArg = pWin->pOwner->x.pList->nExpr; + regArg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0); + + for(iEnd=sqlite3VdbeCurrentAddr(v); iOpopcode==OP_Column && pOp->p1==pMWin->iEphCsr ){ + pOp->p1 = csr; + } + } + } + if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + CollSeq *pColl; + assert( nArg>0 ); + assert( ExprUseXList(pWin->pOwner) ); + pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); + sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ); + } + sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, + bInverse, regArg, pWin->regAccum); + sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + if( pWin->bExprArgs ){ + sqlite3ReleaseTempRange(pParse, regArg, nArg); + } + if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); + } + } +} + +/* +** Values that may be passed as the second argument to windowCodeOp(). +*/ +#define WINDOW_RETURN_ROW 1 +#define WINDOW_AGGINVERSE 2 +#define WINDOW_AGGSTEP 3 + +/* +** Generate VM code to invoke either xValue() (bFin==0) or xFinalize() +** (bFin==1) for each window function in the linked list starting at +** pMWin. Or, for built-in window-functions that do not use the standard +** API, generate the equivalent VM code. +*/ +static void windowAggFinal(WindowCodeArg *p, int bFin){ + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + Vdbe *v = sqlite3GetVdbe(pParse); + Window *pWin; + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + if( pMWin->regStartRowid==0 + && (pWin->pWFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->eStart!=TK_UNBOUNDED) + ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + sqlite3VdbeAddOp1(v, OP_Last, pWin->csrApp); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, pWin->csrApp, 0, pWin->regResult); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + }else if( pWin->regApp ){ + assert( pMWin->regStartRowid==0 ); + }else{ + int nArg = windowArgCount(pWin); + if( bFin ){ + sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg); + sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); + sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + }else{ + sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult); + sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); + } + } + } +} + +/* +** Generate code to calculate the current values of all window functions in the +** p->pMWin list by doing a full scan of the current window frame. Store the +** results in the Window.regResult registers, ready to return the upper +** layer. +*/ +static void windowFullScan(WindowCodeArg *p){ + Window *pWin; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; + + int regCRowid = 0; /* Current rowid value */ + int regCPeer = 0; /* Current peer values */ + int regRowid = 0; /* AggStep rowid value */ + int regPeer = 0; /* AggStep peer values */ + + int nPeer; + int lblNext; + int lblBrk; + int addrNext; + int csr; + + VdbeModuleComment((v, "windowFullScan begin")); + + assert( pMWin!=0 ); + csr = pMWin->csrApp; + nPeer = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + + lblNext = sqlite3VdbeMakeLabel(pParse); + lblBrk = sqlite3VdbeMakeLabel(pParse); + + regCRowid = sqlite3GetTempReg(pParse); + regRowid = sqlite3GetTempReg(pParse); + if( nPeer ){ + regCPeer = sqlite3GetTempRange(pParse, nPeer); + regPeer = sqlite3GetTempRange(pParse, nPeer); + } + + sqlite3VdbeAddOp2(v, OP_Rowid, pMWin->iEphCsr, regCRowid); + windowReadPeerValues(p, pMWin->iEphCsr, regCPeer); + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + } + + sqlite3VdbeAddOp3(v, OP_SeekGE, csr, lblBrk, pMWin->regStartRowid); + VdbeCoverage(v); + addrNext = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Rowid, csr, regRowid); + sqlite3VdbeAddOp3(v, OP_Gt, pMWin->regEndRowid, lblBrk, regRowid); + VdbeCoverageNeverNull(v); + + if( pMWin->eExclude==TK_CURRENT ){ + sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, lblNext, regRowid); + VdbeCoverageNeverNull(v); + }else if( pMWin->eExclude!=TK_NO ){ + int addr; + int addrEq = 0; + KeyInfo *pKeyInfo = 0; + + if( pMWin->pOrderBy ){ + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pMWin->pOrderBy, 0, 0); + } + if( pMWin->eExclude==TK_TIES ){ + addrEq = sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, 0, regRowid); + VdbeCoverageNeverNull(v); + } + if( pKeyInfo ){ + windowReadPeerValues(p, csr, regPeer); + sqlite3VdbeAddOp3(v, OP_Compare, regPeer, regCPeer, nPeer); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + addr = sqlite3VdbeCurrentAddr(v)+1; + sqlite3VdbeAddOp3(v, OP_Jump, addr, lblNext, addr); + VdbeCoverageEqNe(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblNext); + } + if( addrEq ) sqlite3VdbeJumpHere(v, addrEq); + } + + windowAggStep(p, pMWin, csr, 0, p->regArg); + + sqlite3VdbeResolveLabel(v, lblNext); + sqlite3VdbeAddOp2(v, OP_Next, csr, addrNext); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addrNext-1); + sqlite3VdbeJumpHere(v, addrNext+1); + sqlite3ReleaseTempReg(pParse, regRowid); + sqlite3ReleaseTempReg(pParse, regCRowid); + if( nPeer ){ + sqlite3ReleaseTempRange(pParse, regPeer, nPeer); + sqlite3ReleaseTempRange(pParse, regCPeer, nPeer); + } + + windowAggFinal(p, 1); + VdbeModuleComment((v, "windowFullScan end")); +} + +/* +** Invoke the sub-routine at regGosub (generated by code in select.c) to +** return the current row of Window.iEphCsr. If all window functions are +** aggregate window functions that use the standard API, a single +** OP_Gosub instruction is all that this routine generates. Extra VM code +** for per-row processing is only generated for the following built-in window +** functions: +** +** nth_value() +** first_value() +** lag() +** lead() +*/ +static void windowReturnOneRow(WindowCodeArg *p){ + Window *pMWin = p->pMWin; + Vdbe *v = p->pVdbe; + + if( pMWin->regStartRowid ){ + windowFullScan(p); + }else{ + Parse *pParse = p->pParse; + Window *pWin; + + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pWFunc; + assert( ExprUseXList(pWin->pOwner) ); + if( pFunc->zName==nth_valueName + || pFunc->zName==first_valueName + ){ + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + + if( pFunc->zName==nth_valueName ){ + sqlite3VdbeAddOp3(v, OP_Column,pMWin->iEphCsr,pWin->iArgCol+1,tmpReg); + windowCheckValue(pParse, tmpReg, 2); + }else{ + sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); + } + sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); + sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); + VdbeCoverageNeverNull(v); + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, 0, tmpReg); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); + } + else if( pFunc->zName==leadName || pFunc->zName==lagName ){ + int nArg = pWin->pOwner->x.pList->nExpr; + int csr = pWin->csrApp; + int lbl = sqlite3VdbeMakeLabel(pParse); + int tmpReg = sqlite3GetTempReg(pParse); + int iEph = pMWin->iEphCsr; + + if( nArg<3 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, iEph,pWin->iArgCol+2,pWin->regResult); + } + sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); + if( nArg<2 ){ + int val = (pFunc->zName==leadName ? 1 : -1); + sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); + }else{ + int op = (pFunc->zName==leadName ? OP_Add : OP_Subtract); + int tmpReg2 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); + sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); + sqlite3ReleaseTempReg(pParse, tmpReg2); + } + + sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); + sqlite3VdbeResolveLabel(v, lbl); + sqlite3ReleaseTempReg(pParse, tmpReg); + } + } + } + sqlite3VdbeAddOp2(v, OP_Gosub, p->regGosub, p->addrGosub); +} + +/* +** Generate code to set the accumulator register for each window function +** in the linked list passed as the second argument to NULL. And perform +** any equivalent initialization required by any built-in window functions +** in the list. +*/ +static int windowInitAccum(Parse *pParse, Window *pMWin){ + Vdbe *v = sqlite3GetVdbe(pParse); + int regArg; + int nArg = 0; + Window *pWin; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pWFunc; + assert( pWin->regAccum ); + sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); + nArg = MAX(nArg, windowArgCount(pWin)); + if( pMWin->regStartRowid==0 ){ + if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } + + if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ + assert( pWin->eStart!=TK_UNBOUNDED ); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); + } + } + } + regArg = pParse->nMem+1; + pParse->nMem += nArg; + return regArg; +} + +/* +** Return true if the current frame should be cached in the ephemeral table, +** even if there are no xInverse() calls required. +*/ +static int windowCacheFrame(Window *pMWin){ + Window *pWin; + if( pMWin->regStartRowid ) return 1; + for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + FuncDef *pFunc = pWin->pWFunc; + if( (pFunc->zName==nth_valueName) + || (pFunc->zName==first_valueName) + || (pFunc->zName==leadName) + || (pFunc->zName==lagName) + ){ + return 1; + } + } + return 0; +} + +/* +** regOld and regNew are each the first register in an array of size +** pOrderBy->nExpr. This function generates code to compare the two +** arrays of registers using the collation sequences and other comparison +** parameters specified by pOrderBy. +** +** If the two arrays are not equal, the contents of regNew is copied to +** regOld and control falls through. Otherwise, if the contents of the arrays +** are equal, an OP_Goto is executed. The address of the OP_Goto is returned. +*/ +static void windowIfNewPeer( + Parse *pParse, + ExprList *pOrderBy, + int regNew, /* First in array of new values */ + int regOld, /* First in array of old values */ + int addr /* Jump here */ +){ + Vdbe *v = sqlite3GetVdbe(pParse); + if( pOrderBy ){ + int nVal = pOrderBy->nExpr; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); + sqlite3VdbeAddOp3(v, OP_Compare, regOld, regNew, nVal); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, + sqlite3VdbeCurrentAddr(v)+1, addr, sqlite3VdbeCurrentAddr(v)+1 + ); + VdbeCoverageEqNe(v); + sqlite3VdbeAddOp3(v, OP_Copy, regNew, regOld, nVal-1); + }else{ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + } +} + +/* +** This function is called as part of generating VM programs for RANGE +** offset PRECEDING/FOLLOWING frame boundaries. Assuming "ASC" order for +** the ORDER BY term in the window, and that argument op is OP_Ge, it generates +** code equivalent to: +** +** if( csr1.peerVal + regVal >= csr2.peerVal ) goto lbl; +** +** The value of parameter op may also be OP_Gt or OP_Le. In these cases the +** operator in the above pseudo-code is replaced with ">" or "<=", respectively. +** +** If the sort-order for the ORDER BY term in the window is DESC, then the +** comparison is reversed. Instead of adding regVal to csr1.peerVal, it is +** subtracted. And the comparison operator is inverted to - ">=" becomes "<=", +** ">" becomes "<", and so on. So, with DESC sort order, if the argument op +** is OP_Ge, the generated code is equivalent to: +** +** if( csr1.peerVal - regVal <= csr2.peerVal ) goto lbl; +** +** A special type of arithmetic is used such that if csr1.peerVal is not +** a numeric type (real or integer), then the result of the addition +** or subtraction is a a copy of csr1.peerVal. +*/ +static void windowCodeRangeTest( + WindowCodeArg *p, + int op, /* OP_Ge, OP_Gt, or OP_Le */ + int csr1, /* Cursor number for cursor 1 */ + int regVal, /* Register containing non-negative number */ + int csr2, /* Cursor number for cursor 2 */ + int lbl /* Jump destination if condition is true */ +){ + Parse *pParse = p->pParse; + Vdbe *v = sqlite3GetVdbe(pParse); + ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for window */ + int reg1 = sqlite3GetTempReg(pParse); /* Reg. for csr1.peerVal+regVal */ + int reg2 = sqlite3GetTempReg(pParse); /* Reg. for csr2.peerVal */ + int regString = ++pParse->nMem; /* Reg. for constant value '' */ + int arith = OP_Add; /* OP_Add or OP_Subtract */ + int addrGe; /* Jump destination */ + int addrDone = sqlite3VdbeMakeLabel(pParse); /* Address past OP_Ge */ + CollSeq *pColl; + + /* Read the peer-value from each cursor into a register */ + windowReadPeerValues(p, csr1, reg1); + windowReadPeerValues(p, csr2, reg2); + + assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); + assert( pOrderBy && pOrderBy->nExpr==1 ); + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){ + switch( op ){ + case OP_Ge: op = OP_Le; break; + case OP_Gt: op = OP_Lt; break; + default: assert( op==OP_Le ); op = OP_Ge; break; + } + arith = OP_Subtract; + } + + VdbeModuleComment((v, "CodeRangeTest: if( R%d %s R%d %s R%d ) goto lbl", + reg1, (arith==OP_Add ? "+" : "-"), regVal, + ((op==OP_Ge) ? ">=" : (op==OP_Le) ? "<=" : (op==OP_Gt) ? ">" : "<"), reg2 + )); + + /* If the BIGNULL flag is set for the ORDER BY, then it is required to + ** consider NULL values to be larger than all other values, instead of + ** the usual smaller. The VDBE opcodes OP_Ge and so on do not handle this + ** (and adding that capability causes a performance regression), so + ** instead if the BIGNULL flag is set then cases where either reg1 or + ** reg2 are NULL are handled separately in the following block. The code + ** generated is equivalent to: + ** + ** if( reg1 IS NULL ){ + ** if( op==OP_Ge ) goto lbl; + ** if( op==OP_Gt && reg2 IS NOT NULL ) goto lbl; + ** if( op==OP_Le && reg2 IS NULL ) goto lbl; + ** }else if( reg2 IS NULL ){ + ** if( op==OP_Le ) goto lbl; + ** } + ** + ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is + ** not taken, control jumps over the comparison operator coded below this + ** block. */ + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){ + /* This block runs if reg1 contains a NULL. */ + int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); + switch( op ){ + case OP_Ge: + sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); + break; + case OP_Gt: + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); + VdbeCoverage(v); + break; + case OP_Le: + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); + break; + default: assert( op==OP_Lt ); /* no-op */ break; + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrDone); + + /* This block runs if reg1 is not NULL, but reg2 is. */ + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); + if( op==OP_Gt || op==OP_Ge ){ + sqlite3VdbeChangeP2(v, -1, addrDone); + } + } + + /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). + ** This block adds (or subtracts for DESC) the numeric value in regVal + ** from it. Or, if reg1 is not numeric (it is a NULL, a text value or a blob), + ** then leave reg1 as it is. In pseudo-code, this is implemented as: + ** + ** if( reg1>='' ) goto addrGe; + ** reg1 = reg1 +/- regVal + ** addrGe: + ** + ** Since all strings and blobs are greater-than-or-equal-to an empty string, + ** the add/subtract is skipped for these, as required. If reg1 is a NULL, + ** then the arithmetic is performed, but since adding or subtracting from + ** NULL is always NULL anyway, this case is handled as required too. */ + sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); + addrGe = sqlite3VdbeAddOp3(v, OP_Ge, regString, 0, reg1); + VdbeCoverage(v); + if( (op==OP_Ge && arith==OP_Add) || (op==OP_Le && arith==OP_Subtract) ){ + sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); + sqlite3VdbeJumpHere(v, addrGe); + + /* Compare registers reg2 and reg1, taking the jump if required. Note that + ** control skips over this test if the BIGNULL flag is set and either + ** reg1 or reg2 contain a NULL value. */ + sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); + pColl = sqlite3ExprNNCollSeq(pParse, pOrderBy->a[0].pExpr); + sqlite3VdbeAppendP4(v, (void*)pColl, P4_COLLSEQ); + sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + sqlite3VdbeResolveLabel(v, addrDone); + + assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); + testcase(op==OP_Ge); VdbeCoverageIf(v, op==OP_Ge); + testcase(op==OP_Lt); VdbeCoverageIf(v, op==OP_Lt); + testcase(op==OP_Le); VdbeCoverageIf(v, op==OP_Le); + testcase(op==OP_Gt); VdbeCoverageIf(v, op==OP_Gt); + sqlite3ReleaseTempReg(pParse, reg1); + sqlite3ReleaseTempReg(pParse, reg2); + + VdbeModuleComment((v, "CodeRangeTest: end")); +} + +/* +** Helper function for sqlite3WindowCodeStep(). Each call to this function +** generates VM code for a single RETURN_ROW, AGGSTEP or AGGINVERSE +** operation. Refer to the header comment for sqlite3WindowCodeStep() for +** details. +*/ +static int windowCodeOp( + WindowCodeArg *p, /* Context object */ + int op, /* WINDOW_RETURN_ROW, AGGSTEP or AGGINVERSE */ + int regCountdown, /* Register for OP_IfPos countdown */ + int jumpOnEof /* Jump here if stepped cursor reaches EOF */ +){ + int csr, reg; + Parse *pParse = p->pParse; + Window *pMWin = p->pMWin; + int ret = 0; + Vdbe *v = p->pVdbe; + int addrContinue = 0; + int bPeer = (pMWin->eFrmType!=TK_ROWS); + + int lblDone = sqlite3VdbeMakeLabel(pParse); + int addrNextRange = 0; + + /* Special case - WINDOW_AGGINVERSE is always a no-op if the frame + ** starts with UNBOUNDED PRECEDING. */ + if( op==WINDOW_AGGINVERSE && pMWin->eStart==TK_UNBOUNDED ){ + assert( regCountdown==0 && jumpOnEof==0 ); + return 0; + } + + if( regCountdown>0 ){ + if( pMWin->eFrmType==TK_RANGE ){ + addrNextRange = sqlite3VdbeCurrentAddr(v); + assert( op==WINDOW_AGGINVERSE || op==WINDOW_AGGSTEP ); + if( op==WINDOW_AGGINVERSE ){ + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeRangeTest( + p, OP_Le, p->current.csr, regCountdown, p->start.csr, lblDone + ); + }else{ + windowCodeRangeTest( + p, OP_Ge, p->start.csr, regCountdown, p->current.csr, lblDone + ); + } + }else{ + windowCodeRangeTest( + p, OP_Gt, p->end.csr, regCountdown, p->current.csr, lblDone + ); + } + }else{ + sqlite3VdbeAddOp3(v, OP_IfPos, regCountdown, lblDone, 1); + VdbeCoverage(v); + } + } + + if( op==WINDOW_RETURN_ROW && pMWin->regStartRowid==0 ){ + windowAggFinal(p, 0); + } + addrContinue = sqlite3VdbeCurrentAddr(v); + + /* If this is a (RANGE BETWEEN a FOLLOWING AND b FOLLOWING) or + ** (RANGE BETWEEN b PRECEDING AND a PRECEDING) frame, ensure the + ** start cursor does not advance past the end cursor within the + ** temporary table. It otherwise might, if (a>b). Also ensure that, + ** if the input cursor is still finding new rows, that the end + ** cursor does not go past it to EOF. */ + if( pMWin->eStart==pMWin->eEnd && regCountdown + && pMWin->eFrmType==TK_RANGE + ){ + int regRowid1 = sqlite3GetTempReg(pParse); + int regRowid2 = sqlite3GetTempReg(pParse); + if( op==WINDOW_AGGINVERSE ){ + sqlite3VdbeAddOp2(v, OP_Rowid, p->start.csr, regRowid1); + sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid2); + sqlite3VdbeAddOp3(v, OP_Ge, regRowid2, lblDone, regRowid1); + VdbeCoverage(v); + }else if( p->regRowid ){ + sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid1); + sqlite3VdbeAddOp3(v, OP_Ge, p->regRowid, lblDone, regRowid1); + VdbeCoverageNeverNull(v); + } + sqlite3ReleaseTempReg(pParse, regRowid1); + sqlite3ReleaseTempReg(pParse, regRowid2); + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ); + } + + switch( op ){ + case WINDOW_RETURN_ROW: + csr = p->current.csr; + reg = p->current.reg; + windowReturnOneRow(p); + break; + + case WINDOW_AGGINVERSE: + csr = p->start.csr; + reg = p->start.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regStartRowid, 1); + }else{ + windowAggStep(p, pMWin, csr, 1, p->regArg); + } + break; + + default: + assert( op==WINDOW_AGGSTEP ); + csr = p->end.csr; + reg = p->end.reg; + if( pMWin->regStartRowid ){ + assert( pMWin->regEndRowid ); + sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regEndRowid, 1); + }else{ + windowAggStep(p, pMWin, csr, 0, p->regArg); + } + break; + } + + if( op==p->eDelete ){ + sqlite3VdbeAddOp1(v, OP_Delete, csr); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } + + if( jumpOnEof ){ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + ret = sqlite3VdbeAddOp0(v, OP_Goto); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+1+bPeer); + VdbeCoverage(v); + if( bPeer ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblDone); + } + } + + if( bPeer ){ + int nReg = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); + int regTmp = (nReg ? sqlite3GetTempRange(pParse, nReg) : 0); + windowReadPeerValues(p, csr, regTmp); + windowIfNewPeer(pParse, pMWin->pOrderBy, regTmp, reg, addrContinue); + sqlite3ReleaseTempRange(pParse, regTmp, nReg); + } + + if( addrNextRange ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNextRange); + } + sqlite3VdbeResolveLabel(v, lblDone); + return ret; +} + + +/* +** Allocate and return a duplicate of the Window object indicated by the +** third argument. Set the Window.pOwner field of the new object to +** pOwner. +*/ +SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ + Window *pNew = 0; + if( ALWAYS(p) ){ + pNew = sqlite3DbMallocZero(db, sizeof(Window)); + if( pNew ){ + pNew->zName = sqlite3DbStrDup(db, p->zName); + pNew->zBase = sqlite3DbStrDup(db, p->zBase); + pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pWFunc = p->pWFunc; + pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); + pNew->eFrmType = p->eFrmType; + pNew->eEnd = p->eEnd; + pNew->eStart = p->eStart; + pNew->eExclude = p->eExclude; + pNew->regResult = p->regResult; + pNew->regAccum = p->regAccum; + pNew->iArgCol = p->iArgCol; + pNew->iEphCsr = p->iEphCsr; + pNew->bExprArgs = p->bExprArgs; + pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); + pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); + pNew->pOwner = pOwner; + pNew->bImplicitFrame = p->bImplicitFrame; + } + } + return pNew; +} + +/* +** Return a copy of the linked list of Window objects passed as the +** second argument. +*/ +SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ + Window *pWin; + Window *pRet = 0; + Window **pp = &pRet; + + for(pWin=p; pWin; pWin=pWin->pNextWin){ + *pp = sqlite3WindowDup(db, 0, pWin); + if( *pp==0 ) break; + pp = &((*pp)->pNextWin); + } + + return pRet; +} + +/* +** Return true if it can be determined at compile time that expression +** pExpr evaluates to a value that, when cast to an integer, is greater +** than zero. False otherwise. +** +** If an OOM error occurs, this function sets the Parse.db.mallocFailed +** flag and returns zero. +*/ +static int windowExprGtZero(Parse *pParse, Expr *pExpr){ + int ret = 0; + sqlite3 *db = pParse->db; + sqlite3_value *pVal = 0; + sqlite3ValueFromExpr(db, pExpr, db->enc, SQLITE_AFF_NUMERIC, &pVal); + if( pVal && sqlite3_value_int(pVal)>0 ){ + ret = 1; + } + sqlite3ValueFree(pVal); + return ret; +} + +/* +** sqlite3WhereBegin() has already been called for the SELECT statement +** passed as the second argument when this function is invoked. It generates +** code to populate the Window.regResult register for each window function +** and invoke the sub-routine at instruction addrGosub once for each row. +** sqlite3WhereEnd() is always called before returning. +** +** This function handles several different types of window frames, which +** require slightly different processing. The following pseudo code is +** used to implement window frames of the form: +** +** ROWS BETWEEN PRECEDING AND FOLLOWING +** +** Other window frame types use variants of the following: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** +** if( first row of partition ){ +** // Rewind three cursors, all open on the eph table. +** Rewind(csrEnd); +** Rewind(csrStart); +** Rewind(csrCurrent); +** +** regEnd = // FOLLOWING expression +** regStart = // PRECEDING expression +** }else{ +** // First time this branch is taken, the eph table contains two +** // rows. The first row in the partition, which all three cursors +** // currently point to, and the following row. +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** if( (regStart--)<=0 ){ +** AggInverse(csrStart) +** Next(csrStart) +** } +** } +** +** The pseudo-code above uses the following shorthand: +** +** AGGSTEP: invoke the aggregate xStep() function for each window function +** with arguments read from the current row of cursor csrEnd, then +** step cursor csrEnd forward one row (i.e. sqlite3BtreeNext()). +** +** RETURN_ROW: return a row to the caller based on the contents of the +** current row of csrCurrent and the current state of all +** aggregates. Then step cursor csrCurrent forward one row. +** +** AGGINVERSE: invoke the aggregate xInverse() function for each window +** functions with arguments read from the current row of cursor +** csrStart. Then step csrStart forward one row. +** +** There are two other ROWS window frames that are handled significantly +** differently from the above - "BETWEEN PRECEDING AND PRECEDING" +** and "BETWEEN FOLLOWING AND FOLLOWING". These are special +** cases because they change the order in which the three cursors (csrStart, +** csrCurrent and csrEnd) iterate through the ephemeral table. Cases that +** use UNBOUNDED or CURRENT ROW are much simpler variations on one of these +** three. +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** if( (regEnd--)<=0 ){ +** AGGSTEP +** } +** RETURN_ROW +** +** +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = regEnd - +** }else{ +** AGGSTEP +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regEnd--)<=0 ){ +** RETURN_ROW +** if( eof ) break; +** } +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** For the most part, the patterns above are adapted to support UNBOUNDED by +** assuming that it is equivalent to "infinity PRECEDING/FOLLOWING" and +** CURRENT ROW by assuming that it is equivilent to "0 PRECEDING/FOLLOWING". +** This is optimized of course - branches that will never be taken and +** conditions that are always true are omitted from the VM code. The only +** exceptional case is: +** +** ROWS BETWEEN FOLLOWING AND UNBOUNDED FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regStart = +** }else{ +** AGGSTEP +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** if( (regStart--)<=0 ){ +** AGGINVERSE +** if( eof ) break +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** Also requiring special handling are the cases: +** +** ROWS BETWEEN PRECEDING AND PRECEDING +** ROWS BETWEEN FOLLOWING AND FOLLOWING +** +** when (expr1 < expr2). This is detected at runtime, not by this function. +** To handle this case, the pseudo-code programs depicted above are modified +** slightly to be: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** if( regEnd < regStart ){ +** RETURN_ROW +** delete eph table contents +** continue +** } +** ... +** +** The new "continue" statement in the above jumps to the next iteration +** of the outer loop - the one started by sqlite3WhereBegin(). +** +** The various GROUPS cases are implemented using the same patterns as +** ROWS. The VM code is modified slightly so that: +** +** 1. The else branch in the main loop is only taken if the row just +** added to the ephemeral table is the start of a new group. In +** other words, it becomes: +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else if( new group ){ +** ... +** } +** } +** +** 2. Instead of processing a single row, each RETURN_ROW, AGGSTEP or +** AGGINVERSE step processes the current row of the relevant cursor and +** all subsequent rows belonging to the same group. +** +** RANGE window frames are a little different again. As for GROUPS, the +** main loop runs once per group only. And RETURN_ROW, AGGSTEP and AGGINVERSE +** deal in groups instead of rows. As for ROWS and GROUPS, there are three +** basic cases: +** +** RANGE BETWEEN PRECEDING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** RETURN_ROW +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** RETURN ROW +** if( csrCurrent is EOF ) break; +** while( csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** } +** } +** +** In the above notation, "csr.key" means the current value of the ORDER BY +** expression (there is only ever 1 for a RANGE that uses an FOLLOWING +** or PRECEDING AND PRECEDING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** flush: +** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ +** AGGSTEP +** } +** while( (csrStart.key + regStart) < csrCurrent.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** +** RANGE BETWEEN FOLLOWING AND FOLLOWING +** +** ... loop started by sqlite3WhereBegin() ... +** if( new partition ){ +** Gosub flush +** } +** Insert new row into eph table. +** if( first row of partition ){ +** Rewind(csrEnd) ; Rewind(csrStart) ; Rewind(csrCurrent) +** regEnd = +** regStart = +** }else{ +** AGGSTEP +** while( (csrCurrent.key + regEnd) < csrEnd.key ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** } +** RETURN_ROW +** } +** } +** } +** flush: +** AGGSTEP +** while( 1 ){ +** while( (csrCurrent.key + regStart) > csrStart.key ){ +** AGGINVERSE +** if( eof ) break "while( 1 )" loop. +** } +** RETURN_ROW +** } +** while( !eof csrCurrent ){ +** RETURN_ROW +** } +** +** The text above leaves out many details. Refer to the code and comments +** below for a more complete picture. +*/ +SQLITE_PRIVATE void sqlite3WindowCodeStep( + Parse *pParse, /* Parse context */ + Select *p, /* Rewritten SELECT statement */ + WhereInfo *pWInfo, /* Context returned by sqlite3WhereBegin() */ + int regGosub, /* Register for OP_Gosub */ + int addrGosub /* OP_Gosub here to return each row */ +){ + Window *pMWin = p->pWin; + ExprList *pOrderBy = pMWin->pOrderBy; + Vdbe *v = sqlite3GetVdbe(pParse); + int csrWrite; /* Cursor used to write to eph. table */ + int csrInput = p->pSrc->a[0].iCursor; /* Cursor of sub-select */ + int nInput = p->pSrc->a[0].pTab->nCol; /* Number of cols returned by sub */ + int iInput; /* To iterate through sub cols */ + int addrNe; /* Address of OP_Ne */ + int addrGosubFlush = 0; /* Address of OP_Gosub to flush: */ + int addrInteger = 0; /* Address of OP_Integer */ + int addrEmpty; /* Address of OP_Rewind in flush: */ + int regNew; /* Array of registers holding new input row */ + int regRecord; /* regNew array in record form */ + int regNewPeer = 0; /* Peer values for new row (part of regNew) */ + int regPeer = 0; /* Peer values for current row */ + int regFlushPart = 0; /* Register for "Gosub flush_partition" */ + WindowCodeArg s; /* Context object for sub-routines */ + int lblWhereEnd; /* Label just before sqlite3WhereEnd() code */ + int regStart = 0; /* Value of PRECEDING */ + int regEnd = 0; /* Value of FOLLOWING */ + + assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_CURRENT + || pMWin->eStart==TK_FOLLOWING || pMWin->eStart==TK_UNBOUNDED + ); + assert( pMWin->eEnd==TK_FOLLOWING || pMWin->eEnd==TK_CURRENT + || pMWin->eEnd==TK_UNBOUNDED || pMWin->eEnd==TK_PRECEDING + ); + assert( pMWin->eExclude==0 || pMWin->eExclude==TK_CURRENT + || pMWin->eExclude==TK_GROUP || pMWin->eExclude==TK_TIES + || pMWin->eExclude==TK_NO + ); + + lblWhereEnd = sqlite3VdbeMakeLabel(pParse); + + /* Fill in the context object */ + memset(&s, 0, sizeof(WindowCodeArg)); + s.pParse = pParse; + s.pMWin = pMWin; + s.pVdbe = v; + s.regGosub = regGosub; + s.addrGosub = addrGosub; + s.current.csr = pMWin->iEphCsr; + csrWrite = s.current.csr+1; + s.start.csr = s.current.csr+2; + s.end.csr = s.current.csr+3; + + /* Figure out when rows may be deleted from the ephemeral table. There + ** are four options - they may never be deleted (eDelete==0), they may + ** be deleted as soon as they are no longer part of the window frame + ** (eDelete==WINDOW_AGGINVERSE), they may be deleted as after the row + ** has been returned to the caller (WINDOW_RETURN_ROW), or they may + ** be deleted after they enter the frame (WINDOW_AGGSTEP). */ + switch( pMWin->eStart ){ + case TK_FOLLOWING: + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pStart) + ){ + s.eDelete = WINDOW_RETURN_ROW; + } + break; + case TK_UNBOUNDED: + if( windowCacheFrame(pMWin)==0 ){ + if( pMWin->eEnd==TK_PRECEDING ){ + if( pMWin->eFrmType!=TK_RANGE + && windowExprGtZero(pParse, pMWin->pEnd) + ){ + s.eDelete = WINDOW_AGGSTEP; + } + }else{ + s.eDelete = WINDOW_RETURN_ROW; + } + } + break; + default: + s.eDelete = WINDOW_AGGINVERSE; + break; + } + + /* Allocate registers for the array of values from the sub-query, the + ** samve values in record form, and the rowid used to insert said record + ** into the ephemeral table. */ + regNew = pParse->nMem+1; + pParse->nMem += nInput; + regRecord = ++pParse->nMem; + s.regRowid = ++pParse->nMem; + + /* If the window frame contains an " PRECEDING" or " FOLLOWING" + ** clause, allocate registers to store the results of evaluating each + ** . */ + if( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ){ + regStart = ++pParse->nMem; + } + if( pMWin->eEnd==TK_PRECEDING || pMWin->eEnd==TK_FOLLOWING ){ + regEnd = ++pParse->nMem; + } + + /* If this is not a "ROWS BETWEEN ..." frame, then allocate arrays of + ** registers to store copies of the ORDER BY expressions (peer values) + ** for the main loop, and for each cursor (start, current and end). */ + if( pMWin->eFrmType!=TK_ROWS ){ + int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); + regNewPeer = regNew + pMWin->nBufferCol; + if( pMWin->pPartition ) regNewPeer += pMWin->pPartition->nExpr; + regPeer = pParse->nMem+1; pParse->nMem += nPeer; + s.start.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.current.reg = pParse->nMem+1; pParse->nMem += nPeer; + s.end.reg = pParse->nMem+1; pParse->nMem += nPeer; + } + + /* Load the column values for the row returned by the sub-select + ** into an array of registers starting at regNew. Assemble them into + ** a record in register regRecord. */ + for(iInput=0; iInputpPartition ){ + int addr; + ExprList *pPart = pMWin->pPartition; + int nPart = pPart->nExpr; + int regNewPart = regNew + pMWin->nBufferCol; + KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + + regFlushPart = ++pParse->nMem; + addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart, nPart); + sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); + sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); + VdbeCoverageEqNe(v); + addrGosubFlush = sqlite3VdbeAddOp1(v, OP_Gosub, regFlushPart); + VdbeComment((v, "call flush_partition")); + sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); + } + + /* Insert the new row into the ephemeral table */ + sqlite3VdbeAddOp2(v, OP_NewRowid, csrWrite, s.regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, csrWrite, regRecord, s.regRowid); + addrNe = sqlite3VdbeAddOp3(v, OP_Ne, pMWin->regOne, 0, s.regRowid); + VdbeCoverageNeverNull(v); + + /* This block is run for the first row of each partition */ + s.regArg = windowInitAccum(pParse, pMWin); + + if( regStart ){ + sqlite3ExprCode(pParse, pMWin->pStart, regStart); + windowCheckValue(pParse, regStart, 0 + (pMWin->eFrmType==TK_RANGE?3:0)); + } + if( regEnd ){ + sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); + windowCheckValue(pParse, regEnd, 1 + (pMWin->eFrmType==TK_RANGE?3:0)); + } + + if( pMWin->eFrmType!=TK_RANGE && pMWin->eStart==pMWin->eEnd && regStart ){ + int op = ((pMWin->eStart==TK_FOLLOWING) ? OP_Ge : OP_Le); + int addrGe = sqlite3VdbeAddOp3(v, op, regStart, 0, regEnd); + VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound */ + VdbeCoverageNeverNullIf(v, op==OP_Le); /* values previously checked */ + windowAggFinal(&s, 0); + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + windowReturnOneRow(&s); + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + sqlite3VdbeJumpHere(v, addrGe); + } + if( pMWin->eStart==TK_FOLLOWING && pMWin->eFrmType!=TK_RANGE && regEnd ){ + assert( pMWin->eEnd==TK_FOLLOWING ); + sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regStart); + } + + if( pMWin->eStart!=TK_UNBOUNDED ){ + sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1); + VdbeCoverageNeverTaken(v); + } + sqlite3VdbeAddOp2(v, OP_Rewind, s.current.csr, 1); + VdbeCoverageNeverTaken(v); + sqlite3VdbeAddOp2(v, OP_Rewind, s.end.csr, 1); + VdbeCoverageNeverTaken(v); + if( regPeer && pOrderBy ){ + sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.start.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.current.reg, pOrderBy->nExpr-1); + sqlite3VdbeAddOp3(v, OP_Copy, regPeer, s.end.reg, pOrderBy->nExpr-1); + } + + sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); + + sqlite3VdbeJumpHere(v, addrNe); + + /* Beginning of the block executed for the second and subsequent rows. */ + if( regPeer ){ + windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd); + } + if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = sqlite3VdbeMakeLabel(pParse); + int addrNext = sqlite3VdbeCurrentAddr(v); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNext); + sqlite3VdbeResolveLabel(v, lbl); + }else{ + windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + } + } + }else + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + }else{ + int addr = 0; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eEnd!=TK_UNBOUNDED ){ + if( pMWin->eFrmType==TK_RANGE ){ + int lbl = 0; + addr = sqlite3VdbeCurrentAddr(v); + if( regEnd ){ + lbl = sqlite3VdbeMakeLabel(pParse); + windowCodeRangeTest(&s, OP_Ge, s.current.csr, regEnd, s.end.csr, lbl); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ){ + sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); + sqlite3VdbeResolveLabel(v, lbl); + } + }else{ + if( regEnd ){ + addr = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0, 1); + VdbeCoverage(v); + } + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + if( regEnd ) sqlite3VdbeJumpHere(v, addr); + } + } + } + + /* End of the main input loop */ + sqlite3VdbeResolveLabel(v, lblWhereEnd); + sqlite3WhereEnd(pWInfo); + + /* Fall through */ + if( pMWin->pPartition ){ + addrInteger = sqlite3VdbeAddOp2(v, OP_Integer, 0, regFlushPart); + sqlite3VdbeJumpHere(v, addrGosubFlush); + } + + s.regRowid = 0; + addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite); + VdbeCoverage(v); + if( pMWin->eEnd==TK_PRECEDING ){ + int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE); + windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); + if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); + }else if( pMWin->eStart==TK_FOLLOWING ){ + int addrStart; + int addrBreak1; + int addrBreak2; + int addrBreak3; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + if( pMWin->eFrmType==TK_RANGE ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + }else + if( pMWin->eEnd==TK_UNBOUNDED ){ + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regStart, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, 0, 1); + }else{ + assert( pMWin->eEnd==TK_FOLLOWING ); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak2); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak3 = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak1); + sqlite3VdbeJumpHere(v, addrBreak3); + }else{ + int addrBreak; + int addrStart; + windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 1); + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak); + } + sqlite3VdbeJumpHere(v, addrEmpty); + + sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); + if( pMWin->pPartition ){ + if( pMWin->regStartRowid ){ + sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); + } + sqlite3VdbeChangeP1(v, addrInteger, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); + } +} + +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/************** End of window.c **********************************************/ +/************** Begin file parse.c *******************************************/ +/* This file is automatically generated by Lemon from input grammar +** source file "parse.y". */ +/* +** 2001-09-15 +** +** 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 contains SQLite's SQL parser. +** +** The canonical source code to this file ("parse.y") is a Lemon grammar +** file that specifies the input grammar and actions to take while parsing. +** That input file is processed by Lemon to generate a C-language +** implementation of a parser for the given grammer. You might be reading +** this comment as part of the translated C-code. Edits should be made +** to the original parse.y sources. +*/ + +/* #include "sqliteInt.h" */ + +/* +** Disable all error recovery processing in the parser push-down +** automaton. +*/ +#define YYNOERRORRECOVERY 1 + +/* +** Make yytestcase() the same as testcase() +*/ +#define yytestcase(X) testcase(X) + +/* +** Indicate that sqlite3ParserFree() will never be called with a null +** pointer. +*/ +#define YYPARSEFREENEVERNULL 1 + +/* +** In the amalgamation, the parse.c file generated by lemon and the +** tokenize.c file are concatenated. In that case, sqlite3RunParser() +** has access to the the size of the yyParser object and so the parser +** engine can be allocated from stack. In that case, only the +** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked +** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be +** omitted. +*/ +#ifdef SQLITE_AMALGAMATION +# define sqlite3Parser_ENGINEALWAYSONSTACK 1 +#endif + +/* +** Alternative datatype for the argument to the malloc() routine passed +** into sqlite3ParserAlloc(). The default is size_t. +*/ +#define YYMALLOCARGTYPE u64 + +/* +** An instance of the following structure describes the event of a +** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, +** TK_DELETE, or TK_INSTEAD. If the event is of the form +** +** UPDATE ON (a,b,c) +** +** Then the "b" IdList records the list "a,b,c". +*/ +struct TrigEvent { int a; IdList * b; }; + +struct FrameBound { int eType; Expr *pExpr; }; + +/* +** Disable lookaside memory allocation for objects that might be +** shared across database connections. +*/ +static void disableLookaside(Parse *pParse){ + sqlite3 *db = pParse->db; + pParse->disableLookaside++; + DisableLookaside; +} + +#if !defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) \ + && defined(SQLITE_UDL_CAPABLE_PARSER) +/* +** Issue an error message if an ORDER BY or LIMIT clause occurs on an +** UPDATE or DELETE statement. +*/ +static void updateDeleteLimitError( + Parse *pParse, + ExprList *pOrderBy, + Expr *pLimit +){ + if( pOrderBy ){ + sqlite3ErrorMsg(pParse, "syntax error near \"ORDER BY\""); + }else{ + sqlite3ErrorMsg(pParse, "syntax error near \"LIMIT\""); + } + sqlite3ExprListDelete(pParse->db, pOrderBy); + sqlite3ExprDelete(pParse->db, pLimit); +} +#endif /* SQLITE_ENABLE_UPDATE_DELETE_LIMIT */ + + + /* + ** For a compound SELECT statement, make sure p->pPrior->pNext==p for + ** all elements in the list. And make sure list length does not exceed + ** SQLITE_LIMIT_COMPOUND_SELECT. + */ + static void parserDoubleLinkSelect(Parse *pParse, Select *p){ + assert( p!=0 ); + if( p->pPrior ){ + Select *pNext = 0, *pLoop = p; + int mxSelect, cnt = 1; + while(1){ + pLoop->pNext = pNext; + pLoop->selFlags |= SF_Compound; + pNext = pLoop; + pLoop = pLoop->pPrior; + if( pLoop==0 ) break; + cnt++; + if( pLoop->pOrderBy || pLoop->pLimit ){ + sqlite3ErrorMsg(pParse,"%s clause should come after %s not before", + pLoop->pOrderBy!=0 ? "ORDER BY" : "LIMIT", + sqlite3SelectOpName(pNext->op)); + break; + } + } + if( (p->selFlags & SF_MultiValue)==0 && + (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && + cnt>mxSelect + ){ + sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); + } + } + } + + /* Attach a With object describing the WITH clause to a Select + ** object describing the query for which the WITH clause is a prefix. + */ + static Select *attachWithToSelect(Parse *pParse, Select *pSelect, With *pWith){ + if( pSelect ){ + pSelect->pWith = pWith; + parserDoubleLinkSelect(pParse, pSelect); + }else{ + sqlite3WithDelete(pParse->db, pWith); + } + return pSelect; + } + + + /* Construct a new Expr object from a single token */ + static Expr *tokenExpr(Parse *pParse, int op, Token t){ + Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); + if( p ){ + /* memset(p, 0, sizeof(Expr)); */ + p->op = (u8)op; + p->affExpr = 0; + p->flags = EP_Leaf; + ExprClearVVAProperties(p); + /* p->iAgg = -1; // Not required */ + p->pLeft = p->pRight = 0; + p->pAggInfo = 0; + memset(&p->x, 0, sizeof(p->x)); + memset(&p->y, 0, sizeof(p->y)); + p->op2 = 0; + p->iTable = 0; + p->iColumn = 0; + p->u.zToken = (char*)&p[1]; + memcpy(p->u.zToken, t.z, t.n); + p->u.zToken[t.n] = 0; + p->w.iOfst = (int)(t.z - pParse->zTail); + if( sqlite3Isquote(p->u.zToken[0]) ){ + sqlite3DequoteExpr(p); + } +#if SQLITE_MAX_EXPR_DEPTH>0 + p->nHeight = 1; +#endif + if( IN_RENAME_OBJECT ){ + return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t); + } + } + return p; + } + + + /* A routine to convert a binary TK_IS or TK_ISNOT expression into a + ** unary TK_ISNULL or TK_NOTNULL expression. */ + static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ + sqlite3 *db = pParse->db; + if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){ + pA->op = (u8)op; + sqlite3ExprDelete(db, pA->pRight); + pA->pRight = 0; + } + } + + /* Add a single new term to an ExprList that is used to store a + ** list of identifiers. Report an error if the ID list contains + ** a COLLATE clause or an ASC or DESC keyword, except ignore the + ** error while parsing a legacy schema. + */ + static ExprList *parserAddExprIdListTerm( + Parse *pParse, + ExprList *pPrior, + Token *pIdToken, + int hasCollate, + int sortOrder + ){ + ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); + if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) + && pParse->db->init.busy==0 + ){ + sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", + pIdToken->n, pIdToken->z); + } + sqlite3ExprListSetName(pParse, p, pIdToken, 1); + return p; + } + +#if TK_SPAN>255 +# error too many tokens in the grammar +#endif +/**************** End of %include directives **********************************/ +/* These constants specify the various numeric values for terminal symbols. +***************** Begin token definitions *************************************/ +#ifndef TK_SEMI +#define TK_SEMI 1 +#define TK_EXPLAIN 2 +#define TK_QUERY 3 +#define TK_PLAN 4 +#define TK_BEGIN 5 +#define TK_TRANSACTION 6 +#define TK_DEFERRED 7 +#define TK_IMMEDIATE 8 +#define TK_EXCLUSIVE 9 +#define TK_COMMIT 10 +#define TK_END 11 +#define TK_ROLLBACK 12 +#define TK_SAVEPOINT 13 +#define TK_RELEASE 14 +#define TK_TO 15 +#define TK_TABLE 16 +#define TK_CREATE 17 +#define TK_IF 18 +#define TK_NOT 19 +#define TK_EXISTS 20 +#define TK_TEMP 21 +#define TK_LP 22 +#define TK_RP 23 +#define TK_AS 24 +#define TK_COMMA 25 +#define TK_WITHOUT 26 +#define TK_ABORT 27 +#define TK_ACTION 28 +#define TK_AFTER 29 +#define TK_ANALYZE 30 +#define TK_ASC 31 +#define TK_ATTACH 32 +#define TK_BEFORE 33 +#define TK_BY 34 +#define TK_CASCADE 35 +#define TK_CAST 36 +#define TK_CONFLICT 37 +#define TK_DATABASE 38 +#define TK_DESC 39 +#define TK_DETACH 40 +#define TK_EACH 41 +#define TK_FAIL 42 +#define TK_OR 43 +#define TK_AND 44 +#define TK_IS 45 +#define TK_MATCH 46 +#define TK_LIKE_KW 47 +#define TK_BETWEEN 48 +#define TK_IN 49 +#define TK_ISNULL 50 +#define TK_NOTNULL 51 +#define TK_NE 52 +#define TK_EQ 53 +#define TK_GT 54 +#define TK_LE 55 +#define TK_LT 56 +#define TK_GE 57 +#define TK_ESCAPE 58 +#define TK_ID 59 +#define TK_COLUMNKW 60 +#define TK_DO 61 +#define TK_FOR 62 +#define TK_IGNORE 63 +#define TK_INITIALLY 64 +#define TK_INSTEAD 65 +#define TK_NO 66 +#define TK_KEY 67 +#define TK_OF 68 +#define TK_OFFSET 69 +#define TK_PRAGMA 70 +#define TK_RAISE 71 +#define TK_RECURSIVE 72 +#define TK_REPLACE 73 +#define TK_RESTRICT 74 +#define TK_ROW 75 +#define TK_ROWS 76 +#define TK_TRIGGER 77 +#define TK_VACUUM 78 +#define TK_VIEW 79 +#define TK_VIRTUAL 80 +#define TK_WITH 81 +#define TK_NULLS 82 +#define TK_FIRST 83 +#define TK_LAST 84 +#define TK_CURRENT 85 +#define TK_FOLLOWING 86 +#define TK_PARTITION 87 +#define TK_PRECEDING 88 +#define TK_RANGE 89 +#define TK_UNBOUNDED 90 +#define TK_EXCLUDE 91 +#define TK_GROUPS 92 +#define TK_OTHERS 93 +#define TK_TIES 94 +#define TK_GENERATED 95 +#define TK_ALWAYS 96 +#define TK_MATERIALIZED 97 +#define TK_REINDEX 98 +#define TK_RENAME 99 +#define TK_CTIME_KW 100 +#define TK_ANY 101 +#define TK_BITAND 102 +#define TK_BITOR 103 +#define TK_LSHIFT 104 +#define TK_RSHIFT 105 +#define TK_PLUS 106 +#define TK_MINUS 107 +#define TK_STAR 108 +#define TK_SLASH 109 +#define TK_REM 110 +#define TK_CONCAT 111 +#define TK_PTR 112 +#define TK_COLLATE 113 +#define TK_BITNOT 114 +#define TK_ON 115 +#define TK_INDEXED 116 +#define TK_STRING 117 +#define TK_JOIN_KW 118 +#define TK_CONSTRAINT 119 +#define TK_DEFAULT 120 +#define TK_NULL 121 +#define TK_PRIMARY 122 +#define TK_UNIQUE 123 +#define TK_CHECK 124 +#define TK_REFERENCES 125 +#define TK_AUTOINCR 126 +#define TK_INSERT 127 +#define TK_DELETE 128 +#define TK_UPDATE 129 +#define TK_SET 130 +#define TK_DEFERRABLE 131 +#define TK_FOREIGN 132 +#define TK_DROP 133 +#define TK_UNION 134 +#define TK_ALL 135 +#define TK_EXCEPT 136 +#define TK_INTERSECT 137 +#define TK_SELECT 138 +#define TK_VALUES 139 +#define TK_DISTINCT 140 +#define TK_DOT 141 +#define TK_FROM 142 +#define TK_JOIN 143 +#define TK_USING 144 +#define TK_ORDER 145 +#define TK_GROUP 146 +#define TK_HAVING 147 +#define TK_LIMIT 148 +#define TK_WHERE 149 +#define TK_RETURNING 150 +#define TK_INTO 151 +#define TK_NOTHING 152 +#define TK_FLOAT 153 +#define TK_BLOB 154 +#define TK_INTEGER 155 +#define TK_VARIABLE 156 +#define TK_CASE 157 +#define TK_WHEN 158 +#define TK_THEN 159 +#define TK_ELSE 160 +#define TK_INDEX 161 +#define TK_ALTER 162 +#define TK_ADD 163 +#define TK_WINDOW 164 +#define TK_OVER 165 +#define TK_FILTER 166 +#define TK_COLUMN 167 +#define TK_AGG_FUNCTION 168 +#define TK_AGG_COLUMN 169 +#define TK_TRUEFALSE 170 +#define TK_ISNOT 171 +#define TK_FUNCTION 172 +#define TK_UMINUS 173 +#define TK_UPLUS 174 +#define TK_TRUTH 175 +#define TK_REGISTER 176 +#define TK_VECTOR 177 +#define TK_SELECT_COLUMN 178 +#define TK_IF_NULL_ROW 179 +#define TK_ASTERISK 180 +#define TK_SPAN 181 +#define TK_ERROR 182 +#define TK_SPACE 183 +#define TK_ILLEGAL 184 +#endif +/**************** End token definitions ***************************************/ + +/* The next sections is a series of control #defines. +** various aspects of the generated parser. +** YYCODETYPE is the data type used to store the integer codes +** that represent terminal and non-terminal symbols. +** "unsigned char" is used if there are fewer than +** 256 symbols. Larger types otherwise. +** YYNOCODE is a number of type YYCODETYPE that is not used for +** any terminal or nonterminal symbol. +** YYFALLBACK If defined, this indicates that one or more tokens +** (also known as: "terminal symbols") have fall-back +** values which should be used if the original symbol +** would not parse. This permits keywords to sometimes +** be used as identifiers, for example. +** YYACTIONTYPE is the data type used for "action codes" - numbers +** that indicate what to do in response to the next +** token. +** sqlite3ParserTOKENTYPE is the data type used for minor type for terminal +** symbols. Background: A "minor type" is a semantic +** value associated with a terminal or non-terminal +** symbols. For example, for an "ID" terminal symbol, +** the minor type might be the name of the identifier. +** Each non-terminal can have a different minor type. +** Terminal symbols all have the same minor type, though. +** This macros defines the minor type for terminal +** symbols. +** YYMINORTYPE is the data type used for all minor types. +** This is typically a union of many types, one of +** which is sqlite3ParserTOKENTYPE. The entry in the union +** for terminal symbols is called "yy0". +** YYSTACKDEPTH is the maximum depth of the parser's stack. If +** zero the stack is dynamically sized using realloc() +** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument +** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument +** sqlite3ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter +** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser +** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser +** sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context +** YYERRORSYMBOL is the code number of the error symbol. If not +** defined, then do no error processing. +** YYNSTATE the combined number of states. +** YYNRULE the number of rules in the grammar +** YYNTOKEN Number of terminal symbols +** YY_MAX_SHIFT Maximum value for shift actions +** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions +** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions +** YY_ERROR_ACTION The yy_action[] code for syntax error +** YY_ACCEPT_ACTION The yy_action[] code for accept +** YY_NO_ACTION The yy_action[] code for no-op +** YY_MIN_REDUCE Minimum value for reduce actions +** YY_MAX_REDUCE Maximum value for reduce actions +*/ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/************* Begin control #defines *****************************************/ +#define YYCODETYPE unsigned short int +#define YYNOCODE 319 +#define YYACTIONTYPE unsigned short int +#define YYWILDCARD 101 +#define sqlite3ParserTOKENTYPE Token +typedef union { + int yyinit; + sqlite3ParserTOKENTYPE yy0; + TriggerStep* yy33; + Window* yy41; + Select* yy47; + SrcList* yy131; + struct TrigEvent yy180; + struct {int value; int mask;} yy231; + IdList* yy254; + u32 yy285; + ExprList* yy322; + Cte* yy385; + int yy394; + Upsert* yy444; + u8 yy516; + With* yy521; + const char* yy522; + Expr* yy528; + OnOrUsing yy561; + struct FrameBound yy595; +} YYMINORTYPE; +#ifndef YYSTACKDEPTH +#define YYSTACKDEPTH 100 +#endif +#define sqlite3ParserARG_SDECL +#define sqlite3ParserARG_PDECL +#define sqlite3ParserARG_PARAM +#define sqlite3ParserARG_FETCH +#define sqlite3ParserARG_STORE +#define sqlite3ParserCTX_SDECL Parse *pParse; +#define sqlite3ParserCTX_PDECL ,Parse *pParse +#define sqlite3ParserCTX_PARAM ,pParse +#define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; +#define sqlite3ParserCTX_STORE yypParser->pParse=pParse; +#define YYFALLBACK 1 +#define YYNSTATE 580 +#define YYNRULE 405 +#define YYNRULE_WITH_ACTION 342 +#define YYNTOKEN 185 +#define YY_MAX_SHIFT 579 +#define YY_MIN_SHIFTREDUCE 839 +#define YY_MAX_SHIFTREDUCE 1243 +#define YY_ERROR_ACTION 1244 +#define YY_ACCEPT_ACTION 1245 +#define YY_NO_ACTION 1246 +#define YY_MIN_REDUCE 1247 +#define YY_MAX_REDUCE 1651 +/************* End control #defines *******************************************/ +#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) + +/* Define the yytestcase() macro to be a no-op if is not already defined +** otherwise. +** +** Applications can choose to define yytestcase() in the %include section +** to a macro that can assist in verifying code coverage. For production +** code the yytestcase() macro should be turned off. But it is useful +** for testing. +*/ +#ifndef yytestcase +# define yytestcase(X) +#endif + + +/* Next are the tables used to determine what action to take based on the +** current state and lookahead token. These tables are used to implement +** functions that take a state number and lookahead value and return an +** action integer. +** +** Suppose the action integer is N. Then the action is determined as +** follows +** +** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead +** token onto the stack and goto state N. +** +** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then +** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. +** +** N == YY_ERROR_ACTION A syntax error has occurred. +** +** N == YY_ACCEPT_ACTION The parser accepts its input. +** +** N == YY_NO_ACTION No such action. Denotes unused +** slots in the yy_action[] table. +** +** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE +** and YY_MAX_REDUCE +** +** The action table is constructed as a single large table named yy_action[]. +** Given state S and lookahead X, the action is computed as either: +** +** (A) N = yy_action[ yy_shift_ofst[S] + X ] +** (B) N = yy_default[S] +** +** The (A) formula is preferred. The B formula is used instead if +** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X. +** +** The formulas above are for computing the action when the lookahead is +** a terminal symbol. If the lookahead is a non-terminal (as occurs after +** a reduce action) then the yy_reduce_ofst[] array is used in place of +** the yy_shift_ofst[] array. +** +** The following are the tables generated in this section: +** +** yy_action[] A single table containing all actions. +** yy_lookahead[] A table containing the lookahead for each entry in +** yy_action. Used to detect hash collisions. +** yy_shift_ofst[] For each state, the offset into yy_action for +** shifting terminals. +** yy_reduce_ofst[] For each state, the offset into yy_action for +** shifting non-terminals after a reduce. +** yy_default[] Default action for each state. +** +*********** Begin parsing tables **********************************************/ +#define YY_ACTTAB_COUNT (2101) +static const YYACTIONTYPE yy_action[] = { + /* 0 */ 572, 208, 572, 118, 115, 229, 572, 118, 115, 229, + /* 10 */ 572, 1318, 381, 1297, 412, 566, 566, 566, 572, 413, + /* 20 */ 382, 1318, 1280, 41, 41, 41, 41, 208, 1530, 71, + /* 30 */ 71, 975, 423, 41, 41, 495, 303, 279, 303, 976, + /* 40 */ 401, 71, 71, 125, 126, 80, 1221, 1221, 1054, 1057, + /* 50 */ 1044, 1044, 123, 123, 124, 124, 124, 124, 480, 413, + /* 60 */ 1245, 1, 1, 579, 2, 1249, 554, 118, 115, 229, + /* 70 */ 317, 484, 146, 484, 528, 118, 115, 229, 533, 1331, + /* 80 */ 421, 527, 142, 125, 126, 80, 1221, 1221, 1054, 1057, + /* 90 */ 1044, 1044, 123, 123, 124, 124, 124, 124, 118, 115, + /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120, + /* 110 */ 120, 119, 116, 448, 284, 284, 284, 284, 446, 446, + /* 120 */ 446, 1571, 380, 1573, 1196, 379, 1167, 569, 1167, 569, + /* 130 */ 413, 1571, 541, 259, 226, 448, 101, 145, 453, 316, + /* 140 */ 563, 240, 122, 122, 122, 122, 121, 121, 120, 120, + /* 150 */ 120, 119, 116, 448, 125, 126, 80, 1221, 1221, 1054, + /* 160 */ 1057, 1044, 1044, 123, 123, 124, 124, 124, 124, 142, + /* 170 */ 294, 1196, 343, 452, 120, 120, 120, 119, 116, 448, + /* 180 */ 127, 1196, 1197, 1198, 148, 445, 444, 572, 119, 116, + /* 190 */ 448, 124, 124, 124, 124, 117, 122, 122, 122, 122, + /* 200 */ 121, 121, 120, 120, 120, 119, 116, 448, 458, 113, + /* 210 */ 13, 13, 550, 122, 122, 122, 122, 121, 121, 120, + /* 220 */ 120, 120, 119, 116, 448, 426, 316, 563, 1196, 1197, + /* 230 */ 1198, 149, 1228, 413, 1228, 124, 124, 124, 124, 122, + /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 250 */ 448, 469, 346, 1041, 1041, 1055, 1058, 125, 126, 80, + /* 260 */ 1221, 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, + /* 270 */ 124, 124, 1283, 526, 222, 1196, 572, 413, 224, 518, + /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120, + /* 290 */ 120, 120, 119, 116, 448, 1011, 16, 16, 1196, 133, + /* 300 */ 133, 125, 126, 80, 1221, 1221, 1054, 1057, 1044, 1044, + /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122, + /* 320 */ 121, 121, 120, 120, 120, 119, 116, 448, 1045, 550, + /* 330 */ 1196, 377, 1196, 1197, 1198, 252, 1438, 403, 508, 505, + /* 340 */ 504, 111, 564, 570, 4, 930, 930, 437, 503, 344, + /* 350 */ 464, 330, 364, 398, 1241, 1196, 1197, 1198, 567, 572, + /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119, + /* 370 */ 116, 448, 284, 284, 373, 1584, 1611, 445, 444, 154, + /* 380 */ 413, 449, 71, 71, 1290, 569, 1225, 1196, 1197, 1198, + /* 390 */ 85, 1227, 271, 561, 547, 519, 1565, 572, 98, 1226, + /* 400 */ 6, 1282, 476, 142, 125, 126, 80, 1221, 1221, 1054, + /* 410 */ 1057, 1044, 1044, 123, 123, 124, 124, 124, 124, 554, + /* 420 */ 13, 13, 1031, 511, 1228, 1196, 1228, 553, 109, 109, + /* 430 */ 222, 572, 1242, 175, 572, 431, 110, 197, 449, 574, + /* 440 */ 573, 434, 1556, 1021, 325, 555, 1196, 270, 287, 372, + /* 450 */ 514, 367, 513, 257, 71, 71, 547, 71, 71, 363, + /* 460 */ 316, 563, 1617, 122, 122, 122, 122, 121, 121, 120, + /* 470 */ 120, 120, 119, 116, 448, 1021, 1021, 1023, 1024, 27, + /* 480 */ 284, 284, 1196, 1197, 1198, 1162, 572, 1616, 413, 905, + /* 490 */ 190, 554, 360, 569, 554, 941, 537, 521, 1162, 520, + /* 500 */ 417, 1162, 556, 1196, 1197, 1198, 572, 548, 1558, 51, + /* 510 */ 51, 214, 125, 126, 80, 1221, 1221, 1054, 1057, 1044, + /* 520 */ 1044, 123, 123, 124, 124, 124, 124, 1196, 478, 135, + /* 530 */ 135, 413, 284, 284, 1494, 509, 121, 121, 120, 120, + /* 540 */ 120, 119, 116, 448, 1011, 569, 522, 217, 545, 1565, + /* 550 */ 316, 563, 142, 6, 536, 125, 126, 80, 1221, 1221, + /* 560 */ 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, 124, + /* 570 */ 1559, 122, 122, 122, 122, 121, 121, 120, 120, 120, + /* 580 */ 119, 116, 448, 489, 1196, 1197, 1198, 486, 281, 1271, + /* 590 */ 961, 252, 1196, 377, 508, 505, 504, 1196, 344, 575, + /* 600 */ 1196, 575, 413, 292, 503, 961, 880, 191, 484, 316, + /* 610 */ 563, 388, 290, 384, 122, 122, 122, 122, 121, 121, + /* 620 */ 120, 120, 120, 119, 116, 448, 125, 126, 80, 1221, + /* 630 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 640 */ 124, 413, 398, 1140, 1196, 873, 100, 284, 284, 1196, + /* 650 */ 1197, 1198, 377, 1097, 1196, 1197, 1198, 1196, 1197, 1198, + /* 660 */ 569, 459, 32, 377, 233, 125, 126, 80, 1221, 1221, + /* 670 */ 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, 124, + /* 680 */ 1437, 963, 572, 228, 962, 122, 122, 122, 122, 121, + /* 690 */ 121, 120, 120, 120, 119, 116, 448, 1162, 228, 1196, + /* 700 */ 157, 1196, 1197, 1198, 1557, 13, 13, 301, 961, 1236, + /* 710 */ 1162, 153, 413, 1162, 377, 1587, 1180, 5, 373, 1584, + /* 720 */ 433, 1242, 3, 961, 122, 122, 122, 122, 121, 121, + /* 730 */ 120, 120, 120, 119, 116, 448, 125, 126, 80, 1221, + /* 740 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 750 */ 124, 413, 208, 571, 1196, 1032, 1196, 1197, 1198, 1196, + /* 760 */ 392, 856, 155, 1556, 286, 406, 1102, 1102, 492, 572, + /* 770 */ 469, 346, 1323, 1323, 1556, 125, 126, 80, 1221, 1221, + /* 780 */ 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, 124, + /* 790 */ 129, 572, 13, 13, 378, 122, 122, 122, 122, 121, + /* 800 */ 121, 120, 120, 120, 119, 116, 448, 302, 572, 457, + /* 810 */ 532, 1196, 1197, 1198, 13, 13, 1196, 1197, 1198, 1301, + /* 820 */ 467, 1271, 413, 1321, 1321, 1556, 1016, 457, 456, 200, + /* 830 */ 299, 71, 71, 1269, 122, 122, 122, 122, 121, 121, + /* 840 */ 120, 120, 120, 119, 116, 448, 125, 126, 80, 1221, + /* 850 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 860 */ 124, 413, 227, 1077, 1162, 284, 284, 423, 312, 278, + /* 870 */ 278, 285, 285, 1423, 410, 409, 386, 1162, 569, 572, + /* 880 */ 1162, 1200, 569, 1604, 569, 125, 126, 80, 1221, 1221, + /* 890 */ 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, 124, + /* 900 */ 457, 1486, 13, 13, 1540, 122, 122, 122, 122, 121, + /* 910 */ 121, 120, 120, 120, 119, 116, 448, 201, 572, 358, + /* 920 */ 1590, 579, 2, 1249, 844, 845, 846, 1566, 317, 1216, + /* 930 */ 146, 6, 413, 255, 254, 253, 206, 1331, 9, 1200, + /* 940 */ 262, 71, 71, 428, 122, 122, 122, 122, 121, 121, + /* 950 */ 120, 120, 120, 119, 116, 448, 125, 126, 80, 1221, + /* 960 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 970 */ 124, 572, 284, 284, 572, 1217, 413, 578, 313, 1249, + /* 980 */ 353, 1300, 356, 423, 317, 569, 146, 495, 529, 1647, + /* 990 */ 399, 375, 495, 1331, 70, 70, 1299, 71, 71, 240, + /* 1000 */ 1329, 104, 80, 1221, 1221, 1054, 1057, 1044, 1044, 123, + /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121, + /* 1020 */ 121, 120, 120, 120, 119, 116, 448, 1118, 284, 284, + /* 1030 */ 432, 452, 1529, 1217, 443, 284, 284, 1493, 1356, 311, + /* 1040 */ 478, 569, 1119, 975, 495, 495, 217, 1267, 569, 1542, + /* 1050 */ 572, 976, 207, 572, 1031, 240, 387, 1120, 523, 122, + /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 1070 */ 448, 1022, 107, 71, 71, 1021, 13, 13, 916, 572, + /* 1080 */ 1499, 572, 284, 284, 97, 530, 495, 452, 917, 1330, + /* 1090 */ 1326, 549, 413, 284, 284, 569, 151, 209, 1499, 1501, + /* 1100 */ 262, 454, 55, 55, 56, 56, 569, 1021, 1021, 1023, + /* 1110 */ 447, 336, 413, 531, 12, 295, 125, 126, 80, 1221, + /* 1120 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 1130 */ 124, 351, 413, 868, 1538, 1217, 125, 126, 80, 1221, + /* 1140 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 1150 */ 124, 1141, 1645, 478, 1645, 375, 125, 114, 80, 1221, + /* 1160 */ 1221, 1054, 1057, 1044, 1044, 123, 123, 124, 124, 124, + /* 1170 */ 124, 1499, 333, 478, 335, 122, 122, 122, 122, 121, + /* 1180 */ 121, 120, 120, 120, 119, 116, 448, 203, 1423, 572, + /* 1190 */ 1298, 868, 468, 1217, 440, 122, 122, 122, 122, 121, + /* 1200 */ 121, 120, 120, 120, 119, 116, 448, 557, 1141, 1646, + /* 1210 */ 543, 1646, 15, 15, 896, 122, 122, 122, 122, 121, + /* 1220 */ 121, 120, 120, 120, 119, 116, 448, 572, 298, 542, + /* 1230 */ 1139, 1423, 1563, 1564, 1335, 413, 6, 6, 1173, 1272, + /* 1240 */ 419, 320, 284, 284, 1423, 512, 569, 529, 300, 461, + /* 1250 */ 43, 43, 572, 897, 12, 569, 334, 482, 429, 411, + /* 1260 */ 126, 80, 1221, 1221, 1054, 1057, 1044, 1044, 123, 123, + /* 1270 */ 124, 124, 124, 124, 572, 57, 57, 288, 1196, 1423, + /* 1280 */ 500, 462, 396, 396, 395, 273, 393, 1139, 1562, 853, + /* 1290 */ 1173, 411, 6, 572, 321, 1162, 474, 44, 44, 1561, + /* 1300 */ 1118, 430, 234, 6, 323, 256, 544, 256, 1162, 435, + /* 1310 */ 572, 1162, 322, 17, 491, 1119, 58, 58, 122, 122, + /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 448, + /* 1330 */ 1120, 216, 485, 59, 59, 1196, 1197, 1198, 111, 564, + /* 1340 */ 324, 4, 236, 460, 530, 572, 237, 460, 572, 441, + /* 1350 */ 168, 560, 424, 141, 483, 567, 572, 293, 572, 1099, + /* 1360 */ 572, 293, 572, 1099, 535, 572, 876, 8, 60, 60, + /* 1370 */ 235, 61, 61, 572, 418, 572, 418, 572, 449, 62, + /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49, + /* 1390 */ 561, 572, 363, 572, 100, 490, 50, 50, 63, 63, + /* 1400 */ 64, 64, 565, 419, 539, 414, 572, 1031, 572, 538, + /* 1410 */ 316, 563, 316, 563, 65, 65, 14, 14, 572, 1031, + /* 1420 */ 572, 516, 936, 876, 1022, 109, 109, 935, 1021, 66, + /* 1430 */ 66, 131, 131, 110, 455, 449, 574, 573, 420, 177, + /* 1440 */ 1021, 132, 132, 67, 67, 572, 471, 572, 936, 475, + /* 1450 */ 1368, 283, 226, 935, 315, 1367, 411, 572, 463, 411, + /* 1460 */ 1021, 1021, 1023, 239, 411, 86, 213, 1354, 52, 52, + /* 1470 */ 68, 68, 1021, 1021, 1023, 1024, 27, 1589, 1184, 451, + /* 1480 */ 69, 69, 288, 97, 108, 1545, 106, 396, 396, 395, + /* 1490 */ 273, 393, 572, 883, 853, 887, 572, 111, 564, 470, + /* 1500 */ 4, 572, 152, 30, 38, 572, 1136, 234, 400, 323, + /* 1510 */ 111, 564, 531, 4, 567, 53, 53, 322, 572, 163, + /* 1520 */ 163, 572, 341, 472, 164, 164, 337, 567, 76, 76, + /* 1530 */ 572, 289, 1518, 572, 31, 1517, 572, 449, 342, 487, + /* 1540 */ 100, 54, 54, 348, 72, 72, 296, 236, 1084, 561, + /* 1550 */ 449, 883, 1364, 134, 134, 168, 73, 73, 141, 161, + /* 1560 */ 161, 1578, 561, 539, 572, 319, 572, 352, 540, 1013, + /* 1570 */ 477, 261, 261, 895, 894, 235, 539, 572, 1031, 572, + /* 1580 */ 479, 538, 261, 371, 109, 109, 525, 136, 136, 130, + /* 1590 */ 130, 1031, 110, 370, 449, 574, 573, 109, 109, 1021, + /* 1600 */ 162, 162, 156, 156, 572, 110, 1084, 449, 574, 573, + /* 1610 */ 414, 355, 1021, 572, 357, 316, 563, 572, 347, 572, + /* 1620 */ 100, 501, 361, 258, 100, 902, 903, 140, 140, 359, + /* 1630 */ 1314, 1021, 1021, 1023, 1024, 27, 139, 139, 366, 455, + /* 1640 */ 137, 137, 138, 138, 1021, 1021, 1023, 1024, 27, 1184, + /* 1650 */ 451, 572, 376, 288, 111, 564, 1025, 4, 396, 396, + /* 1660 */ 395, 273, 393, 572, 1145, 853, 572, 1080, 572, 258, + /* 1670 */ 496, 567, 572, 211, 75, 75, 559, 966, 234, 261, + /* 1680 */ 323, 111, 564, 933, 4, 113, 77, 77, 322, 74, + /* 1690 */ 74, 42, 42, 1377, 449, 48, 48, 1422, 567, 978, + /* 1700 */ 979, 1096, 1095, 1096, 1095, 866, 561, 150, 934, 1350, + /* 1710 */ 113, 1362, 558, 1428, 1025, 1279, 1270, 1258, 236, 1257, + /* 1720 */ 1259, 449, 1597, 1347, 308, 276, 168, 309, 11, 141, + /* 1730 */ 397, 310, 232, 561, 1409, 1031, 339, 291, 329, 219, + /* 1740 */ 340, 109, 109, 940, 297, 1414, 235, 345, 481, 110, + /* 1750 */ 506, 449, 574, 573, 332, 1413, 1021, 404, 1297, 369, + /* 1760 */ 223, 1490, 1031, 1489, 1359, 1360, 1358, 1357, 109, 109, + /* 1770 */ 204, 1600, 1236, 562, 265, 218, 110, 205, 449, 574, + /* 1780 */ 573, 414, 391, 1021, 1537, 179, 316, 563, 1021, 1021, + /* 1790 */ 1023, 1024, 27, 230, 1535, 1233, 79, 564, 85, 4, + /* 1800 */ 422, 215, 552, 81, 84, 188, 1410, 128, 1404, 550, + /* 1810 */ 455, 35, 328, 567, 173, 1021, 1021, 1023, 1024, 27, + /* 1820 */ 181, 1495, 1397, 331, 465, 183, 184, 185, 186, 466, + /* 1830 */ 499, 242, 98, 402, 1416, 1418, 449, 1415, 473, 36, + /* 1840 */ 192, 488, 405, 1506, 246, 91, 494, 196, 561, 1484, + /* 1850 */ 350, 497, 277, 354, 248, 249, 111, 564, 1260, 4, + /* 1860 */ 250, 407, 515, 436, 1317, 1308, 93, 1316, 1315, 887, + /* 1870 */ 1307, 224, 1583, 567, 438, 524, 439, 1031, 263, 264, + /* 1880 */ 442, 1615, 10, 109, 109, 1287, 408, 1614, 1286, 368, + /* 1890 */ 1285, 110, 1613, 449, 574, 573, 449, 306, 1021, 307, + /* 1900 */ 374, 1382, 1569, 1470, 1381, 385, 105, 314, 561, 99, + /* 1910 */ 1568, 534, 34, 576, 1190, 272, 1340, 551, 383, 274, + /* 1920 */ 1339, 210, 389, 390, 275, 577, 1255, 1250, 415, 165, + /* 1930 */ 1021, 1021, 1023, 1024, 27, 147, 1522, 1031, 166, 1523, + /* 1940 */ 416, 1521, 178, 109, 109, 1520, 304, 167, 840, 450, + /* 1950 */ 220, 110, 221, 449, 574, 573, 212, 78, 1021, 318, + /* 1960 */ 231, 1094, 1092, 144, 180, 326, 169, 1216, 241, 182, + /* 1970 */ 919, 338, 238, 1108, 187, 170, 171, 425, 427, 189, + /* 1980 */ 87, 88, 89, 90, 172, 1111, 243, 1107, 244, 158, + /* 1990 */ 1021, 1021, 1023, 1024, 27, 18, 245, 1230, 493, 349, + /* 2000 */ 1100, 261, 247, 193, 194, 37, 370, 855, 498, 251, + /* 2010 */ 195, 510, 92, 19, 174, 362, 502, 20, 507, 885, + /* 2020 */ 365, 898, 94, 305, 159, 95, 517, 96, 1178, 160, + /* 2030 */ 1060, 1147, 39, 1146, 225, 280, 282, 970, 198, 964, + /* 2040 */ 113, 1164, 1168, 260, 1166, 21, 1172, 7, 22, 1152, + /* 2050 */ 33, 23, 24, 25, 1171, 546, 26, 202, 100, 102, + /* 2060 */ 1075, 103, 1061, 1059, 1063, 1117, 1064, 1116, 266, 267, + /* 2070 */ 28, 40, 929, 1026, 867, 112, 29, 568, 394, 143, + /* 2080 */ 1186, 268, 176, 1185, 269, 1246, 1246, 1246, 1246, 1246, + /* 2090 */ 1246, 1246, 1246, 1246, 1246, 1606, 1246, 1246, 1246, 1246, + /* 2100 */ 1605, +}; +static const YYCODETYPE yy_lookahead[] = { + /* 0 */ 193, 193, 193, 274, 275, 276, 193, 274, 275, 276, + /* 10 */ 193, 223, 219, 225, 206, 210, 211, 212, 193, 19, + /* 20 */ 219, 233, 216, 216, 217, 216, 217, 193, 295, 216, + /* 30 */ 217, 31, 193, 216, 217, 193, 228, 213, 230, 39, + /* 40 */ 206, 216, 217, 43, 44, 45, 46, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 193, 19, + /* 60 */ 185, 186, 187, 188, 189, 190, 253, 274, 275, 276, + /* 70 */ 195, 193, 197, 193, 261, 274, 275, 276, 253, 204, + /* 80 */ 238, 204, 81, 43, 44, 45, 46, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 274, 275, + /* 100 */ 276, 262, 102, 103, 104, 105, 106, 107, 108, 109, + /* 110 */ 110, 111, 112, 113, 239, 240, 239, 240, 210, 211, + /* 120 */ 212, 314, 315, 314, 59, 316, 86, 252, 88, 252, + /* 130 */ 19, 314, 315, 256, 257, 113, 25, 72, 296, 138, + /* 140 */ 139, 266, 102, 103, 104, 105, 106, 107, 108, 109, + /* 150 */ 110, 111, 112, 113, 43, 44, 45, 46, 47, 48, + /* 160 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 81, + /* 170 */ 292, 59, 292, 298, 108, 109, 110, 111, 112, 113, + /* 180 */ 69, 116, 117, 118, 72, 106, 107, 193, 111, 112, + /* 190 */ 113, 54, 55, 56, 57, 58, 102, 103, 104, 105, + /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 25, + /* 210 */ 216, 217, 145, 102, 103, 104, 105, 106, 107, 108, + /* 220 */ 109, 110, 111, 112, 113, 231, 138, 139, 116, 117, + /* 230 */ 118, 164, 153, 19, 155, 54, 55, 56, 57, 102, + /* 240 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 250 */ 113, 128, 129, 46, 47, 48, 49, 43, 44, 45, + /* 260 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 270 */ 56, 57, 216, 193, 25, 59, 193, 19, 165, 166, + /* 280 */ 193, 67, 24, 102, 103, 104, 105, 106, 107, 108, + /* 290 */ 109, 110, 111, 112, 113, 73, 216, 217, 59, 216, + /* 300 */ 217, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 310 */ 52, 53, 54, 55, 56, 57, 102, 103, 104, 105, + /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 145, + /* 330 */ 59, 193, 116, 117, 118, 119, 273, 204, 122, 123, + /* 340 */ 124, 19, 20, 134, 22, 136, 137, 19, 132, 127, + /* 350 */ 128, 129, 24, 22, 23, 116, 117, 118, 36, 193, + /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 370 */ 112, 113, 239, 240, 311, 312, 215, 106, 107, 241, + /* 380 */ 19, 59, 216, 217, 223, 252, 115, 116, 117, 118, + /* 390 */ 151, 120, 26, 71, 193, 308, 309, 193, 149, 128, + /* 400 */ 313, 216, 269, 81, 43, 44, 45, 46, 47, 48, + /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 253, + /* 420 */ 216, 217, 100, 95, 153, 59, 155, 261, 106, 107, + /* 430 */ 25, 193, 101, 193, 193, 231, 114, 25, 116, 117, + /* 440 */ 118, 113, 304, 121, 193, 204, 59, 119, 120, 121, + /* 450 */ 122, 123, 124, 125, 216, 217, 193, 216, 217, 131, + /* 460 */ 138, 139, 230, 102, 103, 104, 105, 106, 107, 108, + /* 470 */ 109, 110, 111, 112, 113, 153, 154, 155, 156, 157, + /* 480 */ 239, 240, 116, 117, 118, 76, 193, 23, 19, 25, + /* 490 */ 22, 253, 23, 252, 253, 108, 87, 204, 89, 261, + /* 500 */ 198, 92, 261, 116, 117, 118, 193, 306, 307, 216, + /* 510 */ 217, 150, 43, 44, 45, 46, 47, 48, 49, 50, + /* 520 */ 51, 52, 53, 54, 55, 56, 57, 59, 193, 216, + /* 530 */ 217, 19, 239, 240, 283, 23, 106, 107, 108, 109, + /* 540 */ 110, 111, 112, 113, 73, 252, 253, 142, 308, 309, + /* 550 */ 138, 139, 81, 313, 145, 43, 44, 45, 46, 47, + /* 560 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 570 */ 307, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 580 */ 111, 112, 113, 281, 116, 117, 118, 285, 23, 193, + /* 590 */ 25, 119, 59, 193, 122, 123, 124, 59, 127, 203, + /* 600 */ 59, 205, 19, 268, 132, 25, 23, 22, 193, 138, + /* 610 */ 139, 249, 204, 251, 102, 103, 104, 105, 106, 107, + /* 620 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 630 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 640 */ 57, 19, 22, 23, 59, 23, 25, 239, 240, 116, + /* 650 */ 117, 118, 193, 11, 116, 117, 118, 116, 117, 118, + /* 660 */ 252, 269, 22, 193, 15, 43, 44, 45, 46, 47, + /* 670 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 680 */ 273, 143, 193, 118, 143, 102, 103, 104, 105, 106, + /* 690 */ 107, 108, 109, 110, 111, 112, 113, 76, 118, 59, + /* 700 */ 241, 116, 117, 118, 304, 216, 217, 292, 143, 60, + /* 710 */ 89, 241, 19, 92, 193, 193, 23, 22, 311, 312, + /* 720 */ 231, 101, 22, 143, 102, 103, 104, 105, 106, 107, + /* 730 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 740 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 750 */ 57, 19, 193, 193, 59, 23, 116, 117, 118, 59, + /* 760 */ 201, 21, 241, 304, 22, 206, 127, 128, 129, 193, + /* 770 */ 128, 129, 235, 236, 304, 43, 44, 45, 46, 47, + /* 780 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 790 */ 22, 193, 216, 217, 193, 102, 103, 104, 105, 106, + /* 800 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 193, + /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 226, + /* 820 */ 80, 193, 19, 235, 236, 304, 23, 211, 212, 231, + /* 830 */ 204, 216, 217, 205, 102, 103, 104, 105, 106, 107, + /* 840 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 850 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 860 */ 57, 19, 193, 123, 76, 239, 240, 193, 253, 239, + /* 870 */ 240, 239, 240, 193, 106, 107, 193, 89, 252, 193, + /* 880 */ 92, 59, 252, 141, 252, 43, 44, 45, 46, 47, + /* 890 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 900 */ 284, 161, 216, 217, 193, 102, 103, 104, 105, 106, + /* 910 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 16, + /* 920 */ 187, 188, 189, 190, 7, 8, 9, 309, 195, 25, + /* 930 */ 197, 313, 19, 127, 128, 129, 262, 204, 22, 117, + /* 940 */ 24, 216, 217, 263, 102, 103, 104, 105, 106, 107, + /* 950 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, + /* 960 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 970 */ 57, 193, 239, 240, 193, 59, 19, 188, 253, 190, + /* 980 */ 77, 226, 79, 193, 195, 252, 197, 193, 19, 301, + /* 990 */ 302, 193, 193, 204, 216, 217, 226, 216, 217, 266, + /* 1000 */ 204, 159, 45, 46, 47, 48, 49, 50, 51, 52, + /* 1010 */ 53, 54, 55, 56, 57, 102, 103, 104, 105, 106, + /* 1020 */ 107, 108, 109, 110, 111, 112, 113, 12, 239, 240, + /* 1030 */ 232, 298, 238, 117, 253, 239, 240, 238, 259, 260, + /* 1040 */ 193, 252, 27, 31, 193, 193, 142, 204, 252, 193, + /* 1050 */ 193, 39, 262, 193, 100, 266, 278, 42, 204, 102, + /* 1060 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 1070 */ 113, 117, 159, 216, 217, 121, 216, 217, 63, 193, + /* 1080 */ 193, 193, 239, 240, 115, 116, 193, 298, 73, 238, + /* 1090 */ 238, 231, 19, 239, 240, 252, 22, 24, 211, 212, + /* 1100 */ 24, 193, 216, 217, 216, 217, 252, 153, 154, 155, + /* 1110 */ 253, 16, 19, 144, 213, 268, 43, 44, 45, 46, + /* 1120 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1130 */ 57, 238, 19, 59, 193, 59, 43, 44, 45, 46, + /* 1140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1150 */ 57, 22, 23, 193, 25, 193, 43, 44, 45, 46, + /* 1160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1170 */ 57, 284, 77, 193, 79, 102, 103, 104, 105, 106, + /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 286, 193, 193, + /* 1190 */ 193, 117, 291, 117, 232, 102, 103, 104, 105, 106, + /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 22, 23, + /* 1210 */ 66, 25, 216, 217, 35, 102, 103, 104, 105, 106, + /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 193, 268, 85, + /* 1230 */ 101, 193, 309, 309, 240, 19, 313, 313, 94, 208, + /* 1240 */ 209, 193, 239, 240, 193, 66, 252, 19, 268, 244, + /* 1250 */ 216, 217, 193, 74, 213, 252, 161, 19, 263, 254, + /* 1260 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 1270 */ 54, 55, 56, 57, 193, 216, 217, 5, 59, 193, + /* 1280 */ 19, 244, 10, 11, 12, 13, 14, 101, 309, 17, + /* 1290 */ 146, 254, 313, 193, 193, 76, 115, 216, 217, 309, + /* 1300 */ 12, 263, 30, 313, 32, 46, 87, 46, 89, 130, + /* 1310 */ 193, 92, 40, 22, 263, 27, 216, 217, 102, 103, + /* 1320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + /* 1330 */ 42, 150, 291, 216, 217, 116, 117, 118, 19, 20, + /* 1340 */ 193, 22, 70, 260, 116, 193, 24, 264, 193, 263, + /* 1350 */ 78, 63, 61, 81, 116, 36, 193, 260, 193, 29, + /* 1360 */ 193, 264, 193, 33, 145, 193, 59, 48, 216, 217, + /* 1370 */ 98, 216, 217, 193, 115, 193, 115, 193, 59, 216, + /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 255, 216, 217, + /* 1390 */ 71, 193, 131, 193, 25, 65, 216, 217, 216, 217, + /* 1400 */ 216, 217, 208, 209, 85, 133, 193, 100, 193, 90, + /* 1410 */ 138, 139, 138, 139, 216, 217, 216, 217, 193, 100, + /* 1420 */ 193, 108, 135, 116, 117, 106, 107, 140, 121, 216, + /* 1430 */ 217, 216, 217, 114, 162, 116, 117, 118, 299, 300, + /* 1440 */ 121, 216, 217, 216, 217, 193, 244, 193, 135, 244, + /* 1450 */ 193, 256, 257, 140, 244, 193, 254, 193, 193, 254, + /* 1460 */ 153, 154, 155, 141, 254, 149, 150, 258, 216, 217, + /* 1470 */ 216, 217, 153, 154, 155, 156, 157, 0, 1, 2, + /* 1480 */ 216, 217, 5, 115, 158, 193, 160, 10, 11, 12, + /* 1490 */ 13, 14, 193, 59, 17, 126, 193, 19, 20, 129, + /* 1500 */ 22, 193, 22, 22, 24, 193, 23, 30, 25, 32, + /* 1510 */ 19, 20, 144, 22, 36, 216, 217, 40, 193, 216, + /* 1520 */ 217, 193, 152, 129, 216, 217, 193, 36, 216, 217, + /* 1530 */ 193, 99, 193, 193, 53, 193, 193, 59, 23, 193, + /* 1540 */ 25, 216, 217, 193, 216, 217, 152, 70, 59, 71, + /* 1550 */ 59, 117, 193, 216, 217, 78, 216, 217, 81, 216, + /* 1560 */ 217, 318, 71, 85, 193, 133, 193, 193, 90, 23, + /* 1570 */ 23, 25, 25, 120, 121, 98, 85, 193, 100, 193, + /* 1580 */ 23, 90, 25, 121, 106, 107, 19, 216, 217, 216, + /* 1590 */ 217, 100, 114, 131, 116, 117, 118, 106, 107, 121, + /* 1600 */ 216, 217, 216, 217, 193, 114, 117, 116, 117, 118, + /* 1610 */ 133, 193, 121, 193, 193, 138, 139, 193, 23, 193, + /* 1620 */ 25, 23, 23, 25, 25, 7, 8, 216, 217, 193, + /* 1630 */ 193, 153, 154, 155, 156, 157, 216, 217, 193, 162, + /* 1640 */ 216, 217, 216, 217, 153, 154, 155, 156, 157, 1, + /* 1650 */ 2, 193, 193, 5, 19, 20, 59, 22, 10, 11, + /* 1660 */ 12, 13, 14, 193, 97, 17, 193, 23, 193, 25, + /* 1670 */ 288, 36, 193, 242, 216, 217, 236, 23, 30, 25, + /* 1680 */ 32, 19, 20, 23, 22, 25, 216, 217, 40, 216, + /* 1690 */ 217, 216, 217, 193, 59, 216, 217, 193, 36, 83, + /* 1700 */ 84, 153, 153, 155, 155, 23, 71, 25, 23, 193, + /* 1710 */ 25, 193, 193, 193, 117, 193, 193, 193, 70, 193, + /* 1720 */ 193, 59, 193, 255, 255, 287, 78, 255, 243, 81, + /* 1730 */ 191, 255, 297, 71, 271, 100, 293, 245, 267, 214, + /* 1740 */ 246, 106, 107, 108, 246, 271, 98, 245, 293, 114, + /* 1750 */ 220, 116, 117, 118, 267, 271, 121, 271, 225, 219, + /* 1760 */ 229, 219, 100, 219, 259, 259, 259, 259, 106, 107, + /* 1770 */ 249, 196, 60, 280, 141, 243, 114, 249, 116, 117, + /* 1780 */ 118, 133, 245, 121, 200, 297, 138, 139, 153, 154, + /* 1790 */ 155, 156, 157, 297, 200, 38, 19, 20, 151, 22, + /* 1800 */ 200, 150, 140, 294, 294, 22, 272, 148, 250, 145, + /* 1810 */ 162, 270, 249, 36, 43, 153, 154, 155, 156, 157, + /* 1820 */ 234, 283, 250, 249, 18, 237, 237, 237, 237, 200, + /* 1830 */ 18, 199, 149, 246, 272, 234, 59, 272, 246, 270, + /* 1840 */ 234, 200, 246, 290, 199, 158, 62, 22, 71, 246, + /* 1850 */ 289, 221, 200, 200, 199, 199, 19, 20, 200, 22, + /* 1860 */ 199, 221, 115, 64, 218, 227, 22, 218, 218, 126, + /* 1870 */ 227, 165, 312, 36, 24, 305, 113, 100, 200, 91, + /* 1880 */ 82, 224, 22, 106, 107, 218, 221, 224, 220, 218, + /* 1890 */ 218, 114, 218, 116, 117, 118, 59, 282, 121, 282, + /* 1900 */ 221, 265, 317, 277, 265, 200, 158, 279, 71, 147, + /* 1910 */ 317, 146, 25, 202, 13, 194, 250, 140, 249, 194, + /* 1920 */ 250, 248, 247, 246, 6, 192, 192, 192, 303, 207, + /* 1930 */ 153, 154, 155, 156, 157, 222, 213, 100, 207, 213, + /* 1940 */ 303, 213, 300, 106, 107, 213, 222, 207, 4, 3, + /* 1950 */ 214, 114, 214, 116, 117, 118, 22, 213, 121, 163, + /* 1960 */ 15, 23, 23, 16, 151, 139, 130, 25, 144, 142, + /* 1970 */ 20, 16, 24, 1, 142, 130, 130, 61, 37, 151, + /* 1980 */ 53, 53, 53, 53, 130, 116, 34, 1, 141, 5, + /* 1990 */ 153, 154, 155, 156, 157, 22, 115, 75, 41, 161, + /* 2000 */ 68, 25, 141, 68, 115, 24, 131, 20, 19, 125, + /* 2010 */ 22, 96, 22, 22, 37, 23, 67, 22, 67, 59, + /* 2020 */ 24, 28, 22, 67, 23, 149, 22, 25, 23, 23, + /* 2030 */ 23, 23, 22, 97, 141, 23, 23, 116, 22, 143, + /* 2040 */ 25, 88, 75, 34, 86, 34, 75, 44, 34, 23, + /* 2050 */ 22, 34, 34, 34, 93, 24, 34, 25, 25, 142, + /* 2060 */ 23, 142, 23, 23, 23, 23, 11, 23, 25, 22, + /* 2070 */ 22, 22, 135, 23, 23, 22, 22, 25, 15, 23, + /* 2080 */ 1, 141, 25, 1, 141, 319, 319, 319, 319, 319, + /* 2090 */ 319, 319, 319, 319, 319, 141, 319, 319, 319, 319, + /* 2100 */ 141, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2110 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2120 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2130 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2140 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2150 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2160 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2170 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2180 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2190 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2200 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2210 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2220 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2230 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2240 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2250 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2260 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2270 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2280 */ 319, 319, 319, 319, 319, 319, +}; +#define YY_SHIFT_COUNT (579) +#define YY_SHIFT_MIN (0) +#define YY_SHIFT_MAX (2082) +static const unsigned short int yy_shift_ofst[] = { + /* 0 */ 1648, 1477, 1272, 322, 322, 1, 1319, 1478, 1491, 1837, + /* 10 */ 1837, 1837, 471, 0, 0, 214, 1093, 1837, 1837, 1837, + /* 20 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 30 */ 271, 271, 1219, 1219, 216, 88, 1, 1, 1, 1, + /* 40 */ 1, 40, 111, 258, 361, 469, 512, 583, 622, 693, + /* 50 */ 732, 803, 842, 913, 1073, 1093, 1093, 1093, 1093, 1093, + /* 60 */ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, + /* 70 */ 1093, 1093, 1093, 1113, 1093, 1216, 957, 957, 1635, 1662, + /* 80 */ 1777, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 90 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 100 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 110 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 120 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 130 */ 137, 181, 181, 181, 181, 181, 181, 181, 94, 430, + /* 140 */ 66, 65, 112, 366, 533, 533, 740, 1261, 533, 533, + /* 150 */ 79, 79, 533, 412, 412, 412, 77, 412, 123, 113, + /* 160 */ 113, 22, 22, 2101, 2101, 328, 328, 328, 239, 468, + /* 170 */ 468, 468, 468, 1015, 1015, 409, 366, 1129, 1186, 533, + /* 180 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 190 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 969, + /* 200 */ 621, 621, 533, 642, 788, 788, 1228, 1228, 822, 822, + /* 210 */ 67, 1274, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 1307, + /* 220 */ 954, 954, 585, 472, 640, 387, 695, 538, 541, 700, + /* 230 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 240 */ 222, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 250 */ 533, 533, 533, 1179, 1179, 1179, 533, 533, 533, 565, + /* 260 */ 533, 533, 533, 916, 1144, 533, 533, 1288, 533, 533, + /* 270 */ 533, 533, 533, 533, 533, 533, 639, 1330, 209, 1076, + /* 280 */ 1076, 1076, 1076, 580, 209, 209, 1313, 768, 917, 649, + /* 290 */ 1181, 1316, 405, 1316, 1238, 249, 1181, 1181, 249, 1181, + /* 300 */ 405, 1238, 1369, 464, 1259, 1012, 1012, 1012, 1368, 1368, + /* 310 */ 1368, 1368, 184, 184, 1326, 904, 1287, 1480, 1712, 1712, + /* 320 */ 1633, 1633, 1757, 1757, 1633, 1647, 1651, 1783, 1659, 1664, + /* 330 */ 1771, 1659, 1664, 1806, 1806, 1806, 1806, 1633, 1812, 1683, + /* 340 */ 1651, 1651, 1683, 1783, 1771, 1683, 1771, 1683, 1633, 1812, + /* 350 */ 1687, 1784, 1633, 1812, 1825, 1633, 1812, 1633, 1812, 1825, + /* 360 */ 1747, 1747, 1747, 1799, 1844, 1844, 1825, 1747, 1743, 1747, + /* 370 */ 1799, 1747, 1747, 1706, 1850, 1763, 1763, 1825, 1633, 1788, + /* 380 */ 1788, 1798, 1798, 1659, 1664, 1860, 1633, 1748, 1659, 1762, + /* 390 */ 1765, 1683, 1887, 1901, 1901, 1918, 1918, 1918, 2101, 2101, + /* 400 */ 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, + /* 410 */ 2101, 2101, 2101, 207, 1095, 331, 620, 903, 806, 1074, + /* 420 */ 1483, 1432, 1481, 1322, 1370, 1394, 1515, 1291, 1546, 1547, + /* 430 */ 1557, 1595, 1598, 1599, 1434, 1453, 1618, 1462, 1567, 1489, + /* 440 */ 1644, 1654, 1616, 1660, 1548, 1549, 1682, 1685, 1597, 742, + /* 450 */ 1944, 1946, 1934, 1796, 1945, 1947, 1938, 1939, 1826, 1813, + /* 460 */ 1836, 1942, 1942, 1948, 1827, 1950, 1824, 1955, 1972, 1832, + /* 470 */ 1845, 1942, 1846, 1916, 1941, 1942, 1828, 1927, 1928, 1929, + /* 480 */ 1930, 1854, 1869, 1952, 1847, 1986, 1984, 1973, 1881, 1838, + /* 490 */ 1932, 1976, 1935, 1922, 1957, 1861, 1889, 1981, 1987, 1989, + /* 500 */ 1875, 1884, 1988, 1949, 1990, 1991, 1992, 1995, 1951, 1960, + /* 510 */ 1996, 1915, 1993, 2000, 1956, 1977, 2001, 1876, 2004, 2005, + /* 520 */ 2006, 2007, 2002, 2008, 2010, 1936, 1893, 2012, 2013, 1921, + /* 530 */ 2009, 2016, 1896, 2015, 2011, 2014, 2017, 2018, 1953, 1967, + /* 540 */ 1958, 2003, 1971, 1961, 2019, 2026, 2028, 2031, 2032, 2033, + /* 550 */ 2022, 1917, 1919, 2037, 2015, 2039, 2040, 2041, 2042, 2043, + /* 560 */ 2044, 2047, 2055, 2048, 2049, 2050, 2051, 2053, 2054, 2052, + /* 570 */ 1937, 1940, 1943, 1954, 1959, 2057, 2056, 2063, 2079, 2082, +}; +#define YY_REDUCE_COUNT (412) +#define YY_REDUCE_MIN (-271) +#define YY_REDUCE_MAX (1744) +static const short yy_reduce_ofst[] = { + /* 0 */ -125, 733, 789, 241, 293, -123, -193, -191, -183, -187, + /* 10 */ 166, 238, 133, -207, -199, -267, -176, -6, 204, 489, + /* 20 */ 576, -175, 598, 686, 615, 725, 860, 778, 781, 857, + /* 30 */ 616, 887, 87, 240, -192, 408, 626, 796, 843, 854, + /* 40 */ 1003, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 50 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 60 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 70 */ -271, -271, -271, -271, -271, -271, -271, -271, 80, 83, + /* 80 */ 313, 886, 888, 996, 1034, 1059, 1081, 1100, 1117, 1152, + /* 90 */ 1155, 1163, 1165, 1167, 1169, 1172, 1180, 1182, 1184, 1198, + /* 100 */ 1200, 1213, 1215, 1225, 1227, 1252, 1254, 1264, 1299, 1303, + /* 110 */ 1308, 1312, 1325, 1328, 1337, 1340, 1343, 1371, 1373, 1384, + /* 120 */ 1386, 1411, 1420, 1424, 1426, 1458, 1470, 1473, 1475, 1479, + /* 130 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 140 */ -271, 138, 459, 396, -158, 470, 302, -212, 521, 201, + /* 150 */ -195, -92, 559, 630, 632, 630, -271, 632, 901, 63, + /* 160 */ 407, -271, -271, -271, -271, 161, 161, 161, 251, 335, + /* 170 */ 847, 960, 980, 537, 588, 618, 628, 688, 688, -166, + /* 180 */ -161, 674, 790, 794, 799, 851, 852, -122, 680, -120, + /* 190 */ 995, 1038, 415, 1051, 893, 798, 962, 400, 1086, 779, + /* 200 */ 923, 924, 263, 1041, 979, 990, 1083, 1097, 1031, 1194, + /* 210 */ 362, 994, 1139, 1005, 1037, 1202, 1205, 1195, 1210, -194, + /* 220 */ 56, 185, -135, 232, 522, 560, 601, 617, 669, 683, + /* 230 */ 711, 856, 908, 941, 1048, 1101, 1147, 1257, 1262, 1265, + /* 240 */ 392, 1292, 1333, 1339, 1342, 1346, 1350, 1359, 1374, 1418, + /* 250 */ 1421, 1436, 1437, 593, 755, 770, 997, 1445, 1459, 1209, + /* 260 */ 1500, 1504, 1516, 1132, 1243, 1518, 1519, 1440, 1520, 560, + /* 270 */ 1522, 1523, 1524, 1526, 1527, 1529, 1382, 1438, 1431, 1468, + /* 280 */ 1469, 1472, 1476, 1209, 1431, 1431, 1485, 1525, 1539, 1435, + /* 290 */ 1463, 1471, 1492, 1487, 1443, 1494, 1474, 1484, 1498, 1486, + /* 300 */ 1502, 1455, 1530, 1531, 1533, 1540, 1542, 1544, 1505, 1506, + /* 310 */ 1507, 1508, 1521, 1528, 1493, 1537, 1532, 1575, 1488, 1496, + /* 320 */ 1584, 1594, 1509, 1510, 1600, 1538, 1534, 1541, 1558, 1563, + /* 330 */ 1586, 1572, 1574, 1588, 1589, 1590, 1591, 1629, 1632, 1587, + /* 340 */ 1562, 1565, 1592, 1569, 1601, 1596, 1606, 1603, 1641, 1645, + /* 350 */ 1553, 1561, 1652, 1655, 1630, 1653, 1656, 1658, 1661, 1640, + /* 360 */ 1646, 1649, 1650, 1638, 1657, 1663, 1665, 1667, 1668, 1671, + /* 370 */ 1643, 1672, 1674, 1560, 1570, 1615, 1617, 1679, 1678, 1585, + /* 380 */ 1593, 1636, 1639, 1666, 1669, 1626, 1705, 1628, 1670, 1673, + /* 390 */ 1675, 1677, 1711, 1721, 1725, 1733, 1734, 1735, 1625, 1637, + /* 400 */ 1642, 1722, 1723, 1726, 1728, 1732, 1731, 1713, 1724, 1736, + /* 410 */ 1738, 1744, 1740, +}; +static const YYACTIONTYPE yy_default[] = { + /* 0 */ 1651, 1651, 1651, 1479, 1244, 1355, 1244, 1244, 1244, 1479, + /* 10 */ 1479, 1479, 1244, 1385, 1385, 1532, 1277, 1244, 1244, 1244, + /* 20 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1478, 1244, 1244, + /* 30 */ 1244, 1244, 1567, 1567, 1244, 1244, 1244, 1244, 1244, 1244, + /* 40 */ 1244, 1244, 1394, 1244, 1401, 1244, 1244, 1244, 1244, 1244, + /* 50 */ 1480, 1481, 1244, 1244, 1244, 1531, 1533, 1496, 1408, 1407, + /* 60 */ 1406, 1405, 1514, 1373, 1399, 1392, 1396, 1474, 1475, 1473, + /* 70 */ 1477, 1481, 1480, 1244, 1395, 1442, 1458, 1441, 1244, 1244, + /* 80 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 90 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 100 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 110 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 120 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 130 */ 1450, 1457, 1456, 1455, 1464, 1454, 1451, 1444, 1443, 1445, + /* 140 */ 1446, 1244, 1244, 1268, 1244, 1244, 1265, 1319, 1244, 1244, + /* 150 */ 1244, 1244, 1244, 1551, 1550, 1244, 1447, 1244, 1277, 1436, + /* 160 */ 1435, 1461, 1448, 1460, 1459, 1539, 1603, 1602, 1497, 1244, + /* 170 */ 1244, 1244, 1244, 1244, 1244, 1567, 1244, 1244, 1244, 1244, + /* 180 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 190 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1375, + /* 200 */ 1567, 1567, 1244, 1277, 1567, 1567, 1376, 1376, 1273, 1273, + /* 210 */ 1379, 1244, 1546, 1346, 1346, 1346, 1346, 1355, 1346, 1244, + /* 220 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 230 */ 1244, 1244, 1244, 1244, 1536, 1534, 1244, 1244, 1244, 1244, + /* 240 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 250 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 260 */ 1244, 1244, 1244, 1351, 1244, 1244, 1244, 1244, 1244, 1244, + /* 270 */ 1244, 1244, 1244, 1244, 1244, 1596, 1244, 1509, 1333, 1351, + /* 280 */ 1351, 1351, 1351, 1353, 1334, 1332, 1345, 1278, 1251, 1643, + /* 290 */ 1411, 1400, 1352, 1400, 1640, 1398, 1411, 1411, 1398, 1411, + /* 300 */ 1352, 1640, 1294, 1619, 1289, 1385, 1385, 1385, 1375, 1375, + /* 310 */ 1375, 1375, 1379, 1379, 1476, 1352, 1345, 1244, 1643, 1643, + /* 320 */ 1361, 1361, 1642, 1642, 1361, 1497, 1627, 1420, 1393, 1379, + /* 330 */ 1322, 1393, 1379, 1328, 1328, 1328, 1328, 1361, 1262, 1398, + /* 340 */ 1627, 1627, 1398, 1420, 1322, 1398, 1322, 1398, 1361, 1262, + /* 350 */ 1513, 1637, 1361, 1262, 1487, 1361, 1262, 1361, 1262, 1487, + /* 360 */ 1320, 1320, 1320, 1309, 1244, 1244, 1487, 1320, 1294, 1320, + /* 370 */ 1309, 1320, 1320, 1585, 1244, 1491, 1491, 1487, 1361, 1577, + /* 380 */ 1577, 1388, 1388, 1393, 1379, 1482, 1361, 1244, 1393, 1391, + /* 390 */ 1389, 1398, 1312, 1599, 1599, 1595, 1595, 1595, 1648, 1648, + /* 400 */ 1546, 1612, 1277, 1277, 1277, 1277, 1612, 1296, 1296, 1278, + /* 410 */ 1278, 1277, 1612, 1244, 1244, 1244, 1244, 1244, 1244, 1607, + /* 420 */ 1244, 1541, 1498, 1365, 1244, 1244, 1244, 1244, 1244, 1244, + /* 430 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1552, 1244, + /* 440 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1425, + /* 450 */ 1244, 1247, 1543, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 460 */ 1244, 1402, 1403, 1366, 1244, 1244, 1244, 1244, 1244, 1244, + /* 470 */ 1244, 1417, 1244, 1244, 1244, 1412, 1244, 1244, 1244, 1244, + /* 480 */ 1244, 1244, 1244, 1244, 1639, 1244, 1244, 1244, 1244, 1244, + /* 490 */ 1244, 1512, 1511, 1244, 1244, 1363, 1244, 1244, 1244, 1244, + /* 500 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1292, + /* 510 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 520 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + /* 530 */ 1244, 1244, 1244, 1390, 1244, 1244, 1244, 1244, 1244, 1244, + /* 540 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1582, 1380, + /* 550 */ 1244, 1244, 1244, 1244, 1630, 1244, 1244, 1244, 1244, 1244, + /* 560 */ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1623, + /* 570 */ 1336, 1427, 1244, 1426, 1430, 1266, 1244, 1256, 1244, 1244, +}; +/********** End of lemon-generated parsing tables *****************************/ + +/* The next table maps tokens (terminal symbols) into fallback tokens. +** If a construct like the following: +** +** %fallback ID X Y Z. +** +** appears in the grammar, then ID becomes a fallback token for X, Y, +** and Z. Whenever one of the tokens X, Y, or Z is input to the parser +** but it does not parse, the type of the token is changed to ID and +** the parse is retried before an error is thrown. +** +** This feature can be used, for example, to cause some keywords in a language +** to revert to identifiers if they keyword does not apply in the context where +** it appears. +*/ +#ifdef YYFALLBACK +static const YYCODETYPE yyFallback[] = { + 0, /* $ => nothing */ + 0, /* SEMI => nothing */ + 59, /* EXPLAIN => ID */ + 59, /* QUERY => ID */ + 59, /* PLAN => ID */ + 59, /* BEGIN => ID */ + 0, /* TRANSACTION => nothing */ + 59, /* DEFERRED => ID */ + 59, /* IMMEDIATE => ID */ + 59, /* EXCLUSIVE => ID */ + 0, /* COMMIT => nothing */ + 59, /* END => ID */ + 59, /* ROLLBACK => ID */ + 59, /* SAVEPOINT => ID */ + 59, /* RELEASE => ID */ + 0, /* TO => nothing */ + 0, /* TABLE => nothing */ + 0, /* CREATE => nothing */ + 59, /* IF => ID */ + 0, /* NOT => nothing */ + 0, /* EXISTS => nothing */ + 59, /* TEMP => ID */ + 0, /* LP => nothing */ + 0, /* RP => nothing */ + 0, /* AS => nothing */ + 0, /* COMMA => nothing */ + 59, /* WITHOUT => ID */ + 59, /* ABORT => ID */ + 59, /* ACTION => ID */ + 59, /* AFTER => ID */ + 59, /* ANALYZE => ID */ + 59, /* ASC => ID */ + 59, /* ATTACH => ID */ + 59, /* BEFORE => ID */ + 59, /* BY => ID */ + 59, /* CASCADE => ID */ + 59, /* CAST => ID */ + 59, /* CONFLICT => ID */ + 59, /* DATABASE => ID */ + 59, /* DESC => ID */ + 59, /* DETACH => ID */ + 59, /* EACH => ID */ + 59, /* FAIL => ID */ + 0, /* OR => nothing */ + 0, /* AND => nothing */ + 0, /* IS => nothing */ + 59, /* MATCH => ID */ + 59, /* LIKE_KW => ID */ + 0, /* BETWEEN => nothing */ + 0, /* IN => nothing */ + 0, /* ISNULL => nothing */ + 0, /* NOTNULL => nothing */ + 0, /* NE => nothing */ + 0, /* EQ => nothing */ + 0, /* GT => nothing */ + 0, /* LE => nothing */ + 0, /* LT => nothing */ + 0, /* GE => nothing */ + 0, /* ESCAPE => nothing */ + 0, /* ID => nothing */ + 59, /* COLUMNKW => ID */ + 59, /* DO => ID */ + 59, /* FOR => ID */ + 59, /* IGNORE => ID */ + 59, /* INITIALLY => ID */ + 59, /* INSTEAD => ID */ + 59, /* NO => ID */ + 59, /* KEY => ID */ + 59, /* OF => ID */ + 59, /* OFFSET => ID */ + 59, /* PRAGMA => ID */ + 59, /* RAISE => ID */ + 59, /* RECURSIVE => ID */ + 59, /* REPLACE => ID */ + 59, /* RESTRICT => ID */ + 59, /* ROW => ID */ + 59, /* ROWS => ID */ + 59, /* TRIGGER => ID */ + 59, /* VACUUM => ID */ + 59, /* VIEW => ID */ + 59, /* VIRTUAL => ID */ + 59, /* WITH => ID */ + 59, /* NULLS => ID */ + 59, /* FIRST => ID */ + 59, /* LAST => ID */ + 59, /* CURRENT => ID */ + 59, /* FOLLOWING => ID */ + 59, /* PARTITION => ID */ + 59, /* PRECEDING => ID */ + 59, /* RANGE => ID */ + 59, /* UNBOUNDED => ID */ + 59, /* EXCLUDE => ID */ + 59, /* GROUPS => ID */ + 59, /* OTHERS => ID */ + 59, /* TIES => ID */ + 59, /* GENERATED => ID */ + 59, /* ALWAYS => ID */ + 59, /* MATERIALIZED => ID */ + 59, /* REINDEX => ID */ + 59, /* RENAME => ID */ + 59, /* CTIME_KW => ID */ + 0, /* ANY => nothing */ + 0, /* BITAND => nothing */ + 0, /* BITOR => nothing */ + 0, /* LSHIFT => nothing */ + 0, /* RSHIFT => nothing */ + 0, /* PLUS => nothing */ + 0, /* MINUS => nothing */ + 0, /* STAR => nothing */ + 0, /* SLASH => nothing */ + 0, /* REM => nothing */ + 0, /* CONCAT => nothing */ + 0, /* PTR => nothing */ + 0, /* COLLATE => nothing */ + 0, /* BITNOT => nothing */ + 0, /* ON => nothing */ + 0, /* INDEXED => nothing */ + 0, /* STRING => nothing */ + 0, /* JOIN_KW => nothing */ + 0, /* CONSTRAINT => nothing */ + 0, /* DEFAULT => nothing */ + 0, /* NULL => nothing */ + 0, /* PRIMARY => nothing */ + 0, /* UNIQUE => nothing */ + 0, /* CHECK => nothing */ + 0, /* REFERENCES => nothing */ + 0, /* AUTOINCR => nothing */ + 0, /* INSERT => nothing */ + 0, /* DELETE => nothing */ + 0, /* UPDATE => nothing */ + 0, /* SET => nothing */ + 0, /* DEFERRABLE => nothing */ + 0, /* FOREIGN => nothing */ + 0, /* DROP => nothing */ + 0, /* UNION => nothing */ + 0, /* ALL => nothing */ + 0, /* EXCEPT => nothing */ + 0, /* INTERSECT => nothing */ + 0, /* SELECT => nothing */ + 0, /* VALUES => nothing */ + 0, /* DISTINCT => nothing */ + 0, /* DOT => nothing */ + 0, /* FROM => nothing */ + 0, /* JOIN => nothing */ + 0, /* USING => nothing */ + 0, /* ORDER => nothing */ + 0, /* GROUP => nothing */ + 0, /* HAVING => nothing */ + 0, /* LIMIT => nothing */ + 0, /* WHERE => nothing */ + 0, /* RETURNING => nothing */ + 0, /* INTO => nothing */ + 0, /* NOTHING => nothing */ + 0, /* FLOAT => nothing */ + 0, /* BLOB => nothing */ + 0, /* INTEGER => nothing */ + 0, /* VARIABLE => nothing */ + 0, /* CASE => nothing */ + 0, /* WHEN => nothing */ + 0, /* THEN => nothing */ + 0, /* ELSE => nothing */ + 0, /* INDEX => nothing */ + 0, /* ALTER => nothing */ + 0, /* ADD => nothing */ + 0, /* WINDOW => nothing */ + 0, /* OVER => nothing */ + 0, /* FILTER => nothing */ + 0, /* COLUMN => nothing */ + 0, /* AGG_FUNCTION => nothing */ + 0, /* AGG_COLUMN => nothing */ + 0, /* TRUEFALSE => nothing */ + 0, /* ISNOT => nothing */ + 0, /* FUNCTION => nothing */ + 0, /* UMINUS => nothing */ + 0, /* UPLUS => nothing */ + 0, /* TRUTH => nothing */ + 0, /* REGISTER => nothing */ + 0, /* VECTOR => nothing */ + 0, /* SELECT_COLUMN => nothing */ + 0, /* IF_NULL_ROW => nothing */ + 0, /* ASTERISK => nothing */ + 0, /* SPAN => nothing */ + 0, /* ERROR => nothing */ + 0, /* SPACE => nothing */ + 0, /* ILLEGAL => nothing */ +}; +#endif /* YYFALLBACK */ + +/* The following structure represents a single element of the +** parser's stack. Information stored includes: +** +** + The state number for the parser at this level of the stack. +** +** + The value of the token stored at this level of the stack. +** (In other words, the "major" token.) +** +** + The semantic value stored at this level of the stack. This is +** the information used by the action routines in the grammar. +** It is sometimes called the "minor" token. +** +** After the "shift" half of a SHIFTREDUCE action, the stateno field +** actually contains the reduce action for the second half of the +** SHIFTREDUCE. +*/ +struct yyStackEntry { + YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ + YYCODETYPE major; /* The major token value. This is the code + ** number for the token at this stack level */ + YYMINORTYPE minor; /* The user-supplied minor token value. This + ** is the value of the token */ +}; +typedef struct yyStackEntry yyStackEntry; + +/* The state of the parser is completely contained in an instance of +** the following structure */ +struct yyParser { + yyStackEntry *yytos; /* Pointer to top element of the stack */ +#ifdef YYTRACKMAXSTACKDEPTH + int yyhwm; /* High-water mark of the stack */ +#endif +#ifndef YYNOERRORRECOVERY + int yyerrcnt; /* Shifts left before out of the error */ +#endif + sqlite3ParserARG_SDECL /* A place to hold %extra_argument */ + sqlite3ParserCTX_SDECL /* A place to hold %extra_context */ +#if YYSTACKDEPTH<=0 + int yystksz; /* Current side of the stack */ + yyStackEntry *yystack; /* The parser's stack */ + yyStackEntry yystk0; /* First stack entry */ +#else + yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ + yyStackEntry *yystackEnd; /* Last entry in the stack */ +#endif +}; +typedef struct yyParser yyParser; + +/* #include */ +#ifndef NDEBUG +/* #include */ +static FILE *yyTraceFILE = 0; +static char *yyTracePrompt = 0; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Turn parser tracing on by giving a stream to which to write the trace +** and a prompt to preface each trace message. Tracing is turned off +** by making either argument NULL +** +** Inputs: +**
          +**
        • A FILE* to which trace output should be written. +** If NULL, then tracing is turned off. +**
        • A prefix string written at the beginning of every +** line of trace output. If NULL, then tracing is +** turned off. +**
        +** +** Outputs: +** None. +*/ +SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){ + yyTraceFILE = TraceFILE; + yyTracePrompt = zTracePrompt; + if( yyTraceFILE==0 ) yyTracePrompt = 0; + else if( yyTracePrompt==0 ) yyTraceFILE = 0; +} +#endif /* NDEBUG */ + +#if defined(YYCOVERAGE) || !defined(NDEBUG) +/* For tracing shifts, the names of all terminals and nonterminals +** are required. The following table supplies these names */ +static const char *const yyTokenName[] = { + /* 0 */ "$", + /* 1 */ "SEMI", + /* 2 */ "EXPLAIN", + /* 3 */ "QUERY", + /* 4 */ "PLAN", + /* 5 */ "BEGIN", + /* 6 */ "TRANSACTION", + /* 7 */ "DEFERRED", + /* 8 */ "IMMEDIATE", + /* 9 */ "EXCLUSIVE", + /* 10 */ "COMMIT", + /* 11 */ "END", + /* 12 */ "ROLLBACK", + /* 13 */ "SAVEPOINT", + /* 14 */ "RELEASE", + /* 15 */ "TO", + /* 16 */ "TABLE", + /* 17 */ "CREATE", + /* 18 */ "IF", + /* 19 */ "NOT", + /* 20 */ "EXISTS", + /* 21 */ "TEMP", + /* 22 */ "LP", + /* 23 */ "RP", + /* 24 */ "AS", + /* 25 */ "COMMA", + /* 26 */ "WITHOUT", + /* 27 */ "ABORT", + /* 28 */ "ACTION", + /* 29 */ "AFTER", + /* 30 */ "ANALYZE", + /* 31 */ "ASC", + /* 32 */ "ATTACH", + /* 33 */ "BEFORE", + /* 34 */ "BY", + /* 35 */ "CASCADE", + /* 36 */ "CAST", + /* 37 */ "CONFLICT", + /* 38 */ "DATABASE", + /* 39 */ "DESC", + /* 40 */ "DETACH", + /* 41 */ "EACH", + /* 42 */ "FAIL", + /* 43 */ "OR", + /* 44 */ "AND", + /* 45 */ "IS", + /* 46 */ "MATCH", + /* 47 */ "LIKE_KW", + /* 48 */ "BETWEEN", + /* 49 */ "IN", + /* 50 */ "ISNULL", + /* 51 */ "NOTNULL", + /* 52 */ "NE", + /* 53 */ "EQ", + /* 54 */ "GT", + /* 55 */ "LE", + /* 56 */ "LT", + /* 57 */ "GE", + /* 58 */ "ESCAPE", + /* 59 */ "ID", + /* 60 */ "COLUMNKW", + /* 61 */ "DO", + /* 62 */ "FOR", + /* 63 */ "IGNORE", + /* 64 */ "INITIALLY", + /* 65 */ "INSTEAD", + /* 66 */ "NO", + /* 67 */ "KEY", + /* 68 */ "OF", + /* 69 */ "OFFSET", + /* 70 */ "PRAGMA", + /* 71 */ "RAISE", + /* 72 */ "RECURSIVE", + /* 73 */ "REPLACE", + /* 74 */ "RESTRICT", + /* 75 */ "ROW", + /* 76 */ "ROWS", + /* 77 */ "TRIGGER", + /* 78 */ "VACUUM", + /* 79 */ "VIEW", + /* 80 */ "VIRTUAL", + /* 81 */ "WITH", + /* 82 */ "NULLS", + /* 83 */ "FIRST", + /* 84 */ "LAST", + /* 85 */ "CURRENT", + /* 86 */ "FOLLOWING", + /* 87 */ "PARTITION", + /* 88 */ "PRECEDING", + /* 89 */ "RANGE", + /* 90 */ "UNBOUNDED", + /* 91 */ "EXCLUDE", + /* 92 */ "GROUPS", + /* 93 */ "OTHERS", + /* 94 */ "TIES", + /* 95 */ "GENERATED", + /* 96 */ "ALWAYS", + /* 97 */ "MATERIALIZED", + /* 98 */ "REINDEX", + /* 99 */ "RENAME", + /* 100 */ "CTIME_KW", + /* 101 */ "ANY", + /* 102 */ "BITAND", + /* 103 */ "BITOR", + /* 104 */ "LSHIFT", + /* 105 */ "RSHIFT", + /* 106 */ "PLUS", + /* 107 */ "MINUS", + /* 108 */ "STAR", + /* 109 */ "SLASH", + /* 110 */ "REM", + /* 111 */ "CONCAT", + /* 112 */ "PTR", + /* 113 */ "COLLATE", + /* 114 */ "BITNOT", + /* 115 */ "ON", + /* 116 */ "INDEXED", + /* 117 */ "STRING", + /* 118 */ "JOIN_KW", + /* 119 */ "CONSTRAINT", + /* 120 */ "DEFAULT", + /* 121 */ "NULL", + /* 122 */ "PRIMARY", + /* 123 */ "UNIQUE", + /* 124 */ "CHECK", + /* 125 */ "REFERENCES", + /* 126 */ "AUTOINCR", + /* 127 */ "INSERT", + /* 128 */ "DELETE", + /* 129 */ "UPDATE", + /* 130 */ "SET", + /* 131 */ "DEFERRABLE", + /* 132 */ "FOREIGN", + /* 133 */ "DROP", + /* 134 */ "UNION", + /* 135 */ "ALL", + /* 136 */ "EXCEPT", + /* 137 */ "INTERSECT", + /* 138 */ "SELECT", + /* 139 */ "VALUES", + /* 140 */ "DISTINCT", + /* 141 */ "DOT", + /* 142 */ "FROM", + /* 143 */ "JOIN", + /* 144 */ "USING", + /* 145 */ "ORDER", + /* 146 */ "GROUP", + /* 147 */ "HAVING", + /* 148 */ "LIMIT", + /* 149 */ "WHERE", + /* 150 */ "RETURNING", + /* 151 */ "INTO", + /* 152 */ "NOTHING", + /* 153 */ "FLOAT", + /* 154 */ "BLOB", + /* 155 */ "INTEGER", + /* 156 */ "VARIABLE", + /* 157 */ "CASE", + /* 158 */ "WHEN", + /* 159 */ "THEN", + /* 160 */ "ELSE", + /* 161 */ "INDEX", + /* 162 */ "ALTER", + /* 163 */ "ADD", + /* 164 */ "WINDOW", + /* 165 */ "OVER", + /* 166 */ "FILTER", + /* 167 */ "COLUMN", + /* 168 */ "AGG_FUNCTION", + /* 169 */ "AGG_COLUMN", + /* 170 */ "TRUEFALSE", + /* 171 */ "ISNOT", + /* 172 */ "FUNCTION", + /* 173 */ "UMINUS", + /* 174 */ "UPLUS", + /* 175 */ "TRUTH", + /* 176 */ "REGISTER", + /* 177 */ "VECTOR", + /* 178 */ "SELECT_COLUMN", + /* 179 */ "IF_NULL_ROW", + /* 180 */ "ASTERISK", + /* 181 */ "SPAN", + /* 182 */ "ERROR", + /* 183 */ "SPACE", + /* 184 */ "ILLEGAL", + /* 185 */ "input", + /* 186 */ "cmdlist", + /* 187 */ "ecmd", + /* 188 */ "cmdx", + /* 189 */ "explain", + /* 190 */ "cmd", + /* 191 */ "transtype", + /* 192 */ "trans_opt", + /* 193 */ "nm", + /* 194 */ "savepoint_opt", + /* 195 */ "create_table", + /* 196 */ "create_table_args", + /* 197 */ "createkw", + /* 198 */ "temp", + /* 199 */ "ifnotexists", + /* 200 */ "dbnm", + /* 201 */ "columnlist", + /* 202 */ "conslist_opt", + /* 203 */ "table_option_set", + /* 204 */ "select", + /* 205 */ "table_option", + /* 206 */ "columnname", + /* 207 */ "carglist", + /* 208 */ "typetoken", + /* 209 */ "typename", + /* 210 */ "signed", + /* 211 */ "plus_num", + /* 212 */ "minus_num", + /* 213 */ "scanpt", + /* 214 */ "scantok", + /* 215 */ "ccons", + /* 216 */ "term", + /* 217 */ "expr", + /* 218 */ "onconf", + /* 219 */ "sortorder", + /* 220 */ "autoinc", + /* 221 */ "eidlist_opt", + /* 222 */ "refargs", + /* 223 */ "defer_subclause", + /* 224 */ "generated", + /* 225 */ "refarg", + /* 226 */ "refact", + /* 227 */ "init_deferred_pred_opt", + /* 228 */ "conslist", + /* 229 */ "tconscomma", + /* 230 */ "tcons", + /* 231 */ "sortlist", + /* 232 */ "eidlist", + /* 233 */ "defer_subclause_opt", + /* 234 */ "orconf", + /* 235 */ "resolvetype", + /* 236 */ "raisetype", + /* 237 */ "ifexists", + /* 238 */ "fullname", + /* 239 */ "selectnowith", + /* 240 */ "oneselect", + /* 241 */ "wqlist", + /* 242 */ "multiselect_op", + /* 243 */ "distinct", + /* 244 */ "selcollist", + /* 245 */ "from", + /* 246 */ "where_opt", + /* 247 */ "groupby_opt", + /* 248 */ "having_opt", + /* 249 */ "orderby_opt", + /* 250 */ "limit_opt", + /* 251 */ "window_clause", + /* 252 */ "values", + /* 253 */ "nexprlist", + /* 254 */ "sclp", + /* 255 */ "as", + /* 256 */ "seltablist", + /* 257 */ "stl_prefix", + /* 258 */ "joinop", + /* 259 */ "on_using", + /* 260 */ "indexed_by", + /* 261 */ "exprlist", + /* 262 */ "xfullname", + /* 263 */ "idlist", + /* 264 */ "indexed_opt", + /* 265 */ "nulls", + /* 266 */ "with", + /* 267 */ "where_opt_ret", + /* 268 */ "setlist", + /* 269 */ "insert_cmd", + /* 270 */ "idlist_opt", + /* 271 */ "upsert", + /* 272 */ "returning", + /* 273 */ "filter_over", + /* 274 */ "likeop", + /* 275 */ "between_op", + /* 276 */ "in_op", + /* 277 */ "paren_exprlist", + /* 278 */ "case_operand", + /* 279 */ "case_exprlist", + /* 280 */ "case_else", + /* 281 */ "uniqueflag", + /* 282 */ "collate", + /* 283 */ "vinto", + /* 284 */ "nmnum", + /* 285 */ "trigger_decl", + /* 286 */ "trigger_cmd_list", + /* 287 */ "trigger_time", + /* 288 */ "trigger_event", + /* 289 */ "foreach_clause", + /* 290 */ "when_clause", + /* 291 */ "trigger_cmd", + /* 292 */ "trnm", + /* 293 */ "tridxby", + /* 294 */ "database_kw_opt", + /* 295 */ "key_opt", + /* 296 */ "add_column_fullname", + /* 297 */ "kwcolumn_opt", + /* 298 */ "create_vtab", + /* 299 */ "vtabarglist", + /* 300 */ "vtabarg", + /* 301 */ "vtabargtoken", + /* 302 */ "lp", + /* 303 */ "anylist", + /* 304 */ "wqitem", + /* 305 */ "wqas", + /* 306 */ "windowdefn_list", + /* 307 */ "windowdefn", + /* 308 */ "window", + /* 309 */ "frame_opt", + /* 310 */ "part_opt", + /* 311 */ "filter_clause", + /* 312 */ "over_clause", + /* 313 */ "range_or_rows", + /* 314 */ "frame_bound", + /* 315 */ "frame_bound_s", + /* 316 */ "frame_bound_e", + /* 317 */ "frame_exclude_opt", + /* 318 */ "frame_exclude", +}; +#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ + +#ifndef NDEBUG +/* For tracing reduce actions, the names of all rules are required. +*/ +static const char *const yyRuleName[] = { + /* 0 */ "explain ::= EXPLAIN", + /* 1 */ "explain ::= EXPLAIN QUERY PLAN", + /* 2 */ "cmdx ::= cmd", + /* 3 */ "cmd ::= BEGIN transtype trans_opt", + /* 4 */ "transtype ::=", + /* 5 */ "transtype ::= DEFERRED", + /* 6 */ "transtype ::= IMMEDIATE", + /* 7 */ "transtype ::= EXCLUSIVE", + /* 8 */ "cmd ::= COMMIT|END trans_opt", + /* 9 */ "cmd ::= ROLLBACK trans_opt", + /* 10 */ "cmd ::= SAVEPOINT nm", + /* 11 */ "cmd ::= RELEASE savepoint_opt nm", + /* 12 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm", + /* 13 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm", + /* 14 */ "createkw ::= CREATE", + /* 15 */ "ifnotexists ::=", + /* 16 */ "ifnotexists ::= IF NOT EXISTS", + /* 17 */ "temp ::= TEMP", + /* 18 */ "temp ::=", + /* 19 */ "create_table_args ::= LP columnlist conslist_opt RP table_option_set", + /* 20 */ "create_table_args ::= AS select", + /* 21 */ "table_option_set ::=", + /* 22 */ "table_option_set ::= table_option_set COMMA table_option", + /* 23 */ "table_option ::= WITHOUT nm", + /* 24 */ "table_option ::= nm", + /* 25 */ "columnname ::= nm typetoken", + /* 26 */ "typetoken ::=", + /* 27 */ "typetoken ::= typename LP signed RP", + /* 28 */ "typetoken ::= typename LP signed COMMA signed RP", + /* 29 */ "typename ::= typename ID|STRING", + /* 30 */ "scanpt ::=", + /* 31 */ "scantok ::=", + /* 32 */ "ccons ::= CONSTRAINT nm", + /* 33 */ "ccons ::= DEFAULT scantok term", + /* 34 */ "ccons ::= DEFAULT LP expr RP", + /* 35 */ "ccons ::= DEFAULT PLUS scantok term", + /* 36 */ "ccons ::= DEFAULT MINUS scantok term", + /* 37 */ "ccons ::= DEFAULT scantok ID|INDEXED", + /* 38 */ "ccons ::= NOT NULL onconf", + /* 39 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", + /* 40 */ "ccons ::= UNIQUE onconf", + /* 41 */ "ccons ::= CHECK LP expr RP", + /* 42 */ "ccons ::= REFERENCES nm eidlist_opt refargs", + /* 43 */ "ccons ::= defer_subclause", + /* 44 */ "ccons ::= COLLATE ID|STRING", + /* 45 */ "generated ::= LP expr RP", + /* 46 */ "generated ::= LP expr RP ID", + /* 47 */ "autoinc ::=", + /* 48 */ "autoinc ::= AUTOINCR", + /* 49 */ "refargs ::=", + /* 50 */ "refargs ::= refargs refarg", + /* 51 */ "refarg ::= MATCH nm", + /* 52 */ "refarg ::= ON INSERT refact", + /* 53 */ "refarg ::= ON DELETE refact", + /* 54 */ "refarg ::= ON UPDATE refact", + /* 55 */ "refact ::= SET NULL", + /* 56 */ "refact ::= SET DEFAULT", + /* 57 */ "refact ::= CASCADE", + /* 58 */ "refact ::= RESTRICT", + /* 59 */ "refact ::= NO ACTION", + /* 60 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", + /* 61 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", + /* 62 */ "init_deferred_pred_opt ::=", + /* 63 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", + /* 64 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", + /* 65 */ "conslist_opt ::=", + /* 66 */ "tconscomma ::= COMMA", + /* 67 */ "tcons ::= CONSTRAINT nm", + /* 68 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf", + /* 69 */ "tcons ::= UNIQUE LP sortlist RP onconf", + /* 70 */ "tcons ::= CHECK LP expr RP onconf", + /* 71 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt", + /* 72 */ "defer_subclause_opt ::=", + /* 73 */ "onconf ::=", + /* 74 */ "onconf ::= ON CONFLICT resolvetype", + /* 75 */ "orconf ::=", + /* 76 */ "orconf ::= OR resolvetype", + /* 77 */ "resolvetype ::= IGNORE", + /* 78 */ "resolvetype ::= REPLACE", + /* 79 */ "cmd ::= DROP TABLE ifexists fullname", + /* 80 */ "ifexists ::= IF EXISTS", + /* 81 */ "ifexists ::=", + /* 82 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select", + /* 83 */ "cmd ::= DROP VIEW ifexists fullname", + /* 84 */ "cmd ::= select", + /* 85 */ "select ::= WITH wqlist selectnowith", + /* 86 */ "select ::= WITH RECURSIVE wqlist selectnowith", + /* 87 */ "select ::= selectnowith", + /* 88 */ "selectnowith ::= selectnowith multiselect_op oneselect", + /* 89 */ "multiselect_op ::= UNION", + /* 90 */ "multiselect_op ::= UNION ALL", + /* 91 */ "multiselect_op ::= EXCEPT|INTERSECT", + /* 92 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", + /* 93 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt", + /* 94 */ "values ::= VALUES LP nexprlist RP", + /* 95 */ "values ::= values COMMA LP nexprlist RP", + /* 96 */ "distinct ::= DISTINCT", + /* 97 */ "distinct ::= ALL", + /* 98 */ "distinct ::=", + /* 99 */ "sclp ::=", + /* 100 */ "selcollist ::= sclp scanpt expr scanpt as", + /* 101 */ "selcollist ::= sclp scanpt STAR", + /* 102 */ "selcollist ::= sclp scanpt nm DOT STAR", + /* 103 */ "as ::= AS nm", + /* 104 */ "as ::=", + /* 105 */ "from ::=", + /* 106 */ "from ::= FROM seltablist", + /* 107 */ "stl_prefix ::= seltablist joinop", + /* 108 */ "stl_prefix ::=", + /* 109 */ "seltablist ::= stl_prefix nm dbnm as on_using", + /* 110 */ "seltablist ::= stl_prefix nm dbnm as indexed_by on_using", + /* 111 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using", + /* 112 */ "seltablist ::= stl_prefix LP select RP as on_using", + /* 113 */ "seltablist ::= stl_prefix LP seltablist RP as on_using", + /* 114 */ "dbnm ::=", + /* 115 */ "dbnm ::= DOT nm", + /* 116 */ "fullname ::= nm", + /* 117 */ "fullname ::= nm DOT nm", + /* 118 */ "xfullname ::= nm", + /* 119 */ "xfullname ::= nm DOT nm", + /* 120 */ "xfullname ::= nm DOT nm AS nm", + /* 121 */ "xfullname ::= nm AS nm", + /* 122 */ "joinop ::= COMMA|JOIN", + /* 123 */ "joinop ::= JOIN_KW JOIN", + /* 124 */ "joinop ::= JOIN_KW nm JOIN", + /* 125 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 126 */ "on_using ::= ON expr", + /* 127 */ "on_using ::= USING LP idlist RP", + /* 128 */ "on_using ::=", + /* 129 */ "indexed_opt ::=", + /* 130 */ "indexed_by ::= INDEXED BY nm", + /* 131 */ "indexed_by ::= NOT INDEXED", + /* 132 */ "orderby_opt ::=", + /* 133 */ "orderby_opt ::= ORDER BY sortlist", + /* 134 */ "sortlist ::= sortlist COMMA expr sortorder nulls", + /* 135 */ "sortlist ::= expr sortorder nulls", + /* 136 */ "sortorder ::= ASC", + /* 137 */ "sortorder ::= DESC", + /* 138 */ "sortorder ::=", + /* 139 */ "nulls ::= NULLS FIRST", + /* 140 */ "nulls ::= NULLS LAST", + /* 141 */ "nulls ::=", + /* 142 */ "groupby_opt ::=", + /* 143 */ "groupby_opt ::= GROUP BY nexprlist", + /* 144 */ "having_opt ::=", + /* 145 */ "having_opt ::= HAVING expr", + /* 146 */ "limit_opt ::=", + /* 147 */ "limit_opt ::= LIMIT expr", + /* 148 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 149 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 150 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret orderby_opt limit_opt", + /* 151 */ "where_opt ::=", + /* 152 */ "where_opt ::= WHERE expr", + /* 153 */ "where_opt_ret ::=", + /* 154 */ "where_opt_ret ::= WHERE expr", + /* 155 */ "where_opt_ret ::= RETURNING selcollist", + /* 156 */ "where_opt_ret ::= WHERE expr RETURNING selcollist", + /* 157 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret orderby_opt limit_opt", + /* 158 */ "setlist ::= setlist COMMA nm EQ expr", + /* 159 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", + /* 160 */ "setlist ::= nm EQ expr", + /* 161 */ "setlist ::= LP idlist RP EQ expr", + /* 162 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", + /* 163 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning", + /* 164 */ "upsert ::=", + /* 165 */ "upsert ::= RETURNING selcollist", + /* 166 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert", + /* 167 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert", + /* 168 */ "upsert ::= ON CONFLICT DO NOTHING returning", + /* 169 */ "upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning", + /* 170 */ "returning ::= RETURNING selcollist", + /* 171 */ "insert_cmd ::= INSERT orconf", + /* 172 */ "insert_cmd ::= REPLACE", + /* 173 */ "idlist_opt ::=", + /* 174 */ "idlist_opt ::= LP idlist RP", + /* 175 */ "idlist ::= idlist COMMA nm", + /* 176 */ "idlist ::= nm", + /* 177 */ "expr ::= LP expr RP", + /* 178 */ "expr ::= ID|INDEXED", + /* 179 */ "expr ::= JOIN_KW", + /* 180 */ "expr ::= nm DOT nm", + /* 181 */ "expr ::= nm DOT nm DOT nm", + /* 182 */ "term ::= NULL|FLOAT|BLOB", + /* 183 */ "term ::= STRING", + /* 184 */ "term ::= INTEGER", + /* 185 */ "expr ::= VARIABLE", + /* 186 */ "expr ::= expr COLLATE ID|STRING", + /* 187 */ "expr ::= CAST LP expr AS typetoken RP", + /* 188 */ "expr ::= ID|INDEXED LP distinct exprlist RP", + /* 189 */ "expr ::= ID|INDEXED LP STAR RP", + /* 190 */ "expr ::= ID|INDEXED LP distinct exprlist RP filter_over", + /* 191 */ "expr ::= ID|INDEXED LP STAR RP filter_over", + /* 192 */ "term ::= CTIME_KW", + /* 193 */ "expr ::= LP nexprlist COMMA expr RP", + /* 194 */ "expr ::= expr AND expr", + /* 195 */ "expr ::= expr OR expr", + /* 196 */ "expr ::= expr LT|GT|GE|LE expr", + /* 197 */ "expr ::= expr EQ|NE expr", + /* 198 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 199 */ "expr ::= expr PLUS|MINUS expr", + /* 200 */ "expr ::= expr STAR|SLASH|REM expr", + /* 201 */ "expr ::= expr CONCAT expr", + /* 202 */ "likeop ::= NOT LIKE_KW|MATCH", + /* 203 */ "expr ::= expr likeop expr", + /* 204 */ "expr ::= expr likeop expr ESCAPE expr", + /* 205 */ "expr ::= expr ISNULL|NOTNULL", + /* 206 */ "expr ::= expr NOT NULL", + /* 207 */ "expr ::= expr IS expr", + /* 208 */ "expr ::= expr IS NOT expr", + /* 209 */ "expr ::= expr IS NOT DISTINCT FROM expr", + /* 210 */ "expr ::= expr IS DISTINCT FROM expr", + /* 211 */ "expr ::= NOT expr", + /* 212 */ "expr ::= BITNOT expr", + /* 213 */ "expr ::= PLUS|MINUS expr", + /* 214 */ "expr ::= expr PTR expr", + /* 215 */ "between_op ::= BETWEEN", + /* 216 */ "between_op ::= NOT BETWEEN", + /* 217 */ "expr ::= expr between_op expr AND expr", + /* 218 */ "in_op ::= IN", + /* 219 */ "in_op ::= NOT IN", + /* 220 */ "expr ::= expr in_op LP exprlist RP", + /* 221 */ "expr ::= LP select RP", + /* 222 */ "expr ::= expr in_op LP select RP", + /* 223 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 224 */ "expr ::= EXISTS LP select RP", + /* 225 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 226 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 227 */ "case_exprlist ::= WHEN expr THEN expr", + /* 228 */ "case_else ::= ELSE expr", + /* 229 */ "case_else ::=", + /* 230 */ "case_operand ::= expr", + /* 231 */ "case_operand ::=", + /* 232 */ "exprlist ::=", + /* 233 */ "nexprlist ::= nexprlist COMMA expr", + /* 234 */ "nexprlist ::= expr", + /* 235 */ "paren_exprlist ::=", + /* 236 */ "paren_exprlist ::= LP exprlist RP", + /* 237 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 238 */ "uniqueflag ::= UNIQUE", + /* 239 */ "uniqueflag ::=", + /* 240 */ "eidlist_opt ::=", + /* 241 */ "eidlist_opt ::= LP eidlist RP", + /* 242 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 243 */ "eidlist ::= nm collate sortorder", + /* 244 */ "collate ::=", + /* 245 */ "collate ::= COLLATE ID|STRING", + /* 246 */ "cmd ::= DROP INDEX ifexists fullname", + /* 247 */ "cmd ::= VACUUM vinto", + /* 248 */ "cmd ::= VACUUM nm vinto", + /* 249 */ "vinto ::= INTO expr", + /* 250 */ "vinto ::=", + /* 251 */ "cmd ::= PRAGMA nm dbnm", + /* 252 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 253 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 254 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 255 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 256 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 257 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 258 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 259 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 260 */ "trigger_time ::= BEFORE|AFTER", + /* 261 */ "trigger_time ::= INSTEAD OF", + /* 262 */ "trigger_time ::=", + /* 263 */ "trigger_event ::= DELETE|INSERT", + /* 264 */ "trigger_event ::= UPDATE", + /* 265 */ "trigger_event ::= UPDATE OF idlist", + /* 266 */ "when_clause ::=", + /* 267 */ "when_clause ::= WHEN expr", + /* 268 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 269 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 270 */ "trnm ::= nm DOT nm", + /* 271 */ "tridxby ::= INDEXED BY nm", + /* 272 */ "tridxby ::= NOT INDEXED", + /* 273 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", + /* 274 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 275 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 276 */ "trigger_cmd ::= scanpt select scanpt", + /* 277 */ "expr ::= RAISE LP IGNORE RP", + /* 278 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 279 */ "raisetype ::= ROLLBACK", + /* 280 */ "raisetype ::= ABORT", + /* 281 */ "raisetype ::= FAIL", + /* 282 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 283 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 284 */ "cmd ::= DETACH database_kw_opt expr", + /* 285 */ "key_opt ::=", + /* 286 */ "key_opt ::= KEY expr", + /* 287 */ "cmd ::= REINDEX", + /* 288 */ "cmd ::= REINDEX nm dbnm", + /* 289 */ "cmd ::= ANALYZE", + /* 290 */ "cmd ::= ANALYZE nm dbnm", + /* 291 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 292 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 293 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", + /* 294 */ "add_column_fullname ::= fullname", + /* 295 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 296 */ "cmd ::= create_vtab", + /* 297 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 298 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 299 */ "vtabarg ::=", + /* 300 */ "vtabargtoken ::= ANY", + /* 301 */ "vtabargtoken ::= lp anylist RP", + /* 302 */ "lp ::= LP", + /* 303 */ "with ::= WITH wqlist", + /* 304 */ "with ::= WITH RECURSIVE wqlist", + /* 305 */ "wqas ::= AS", + /* 306 */ "wqas ::= AS MATERIALIZED", + /* 307 */ "wqas ::= AS NOT MATERIALIZED", + /* 308 */ "wqitem ::= nm eidlist_opt wqas LP select RP", + /* 309 */ "wqlist ::= wqitem", + /* 310 */ "wqlist ::= wqlist COMMA wqitem", + /* 311 */ "windowdefn_list ::= windowdefn", + /* 312 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 313 */ "windowdefn ::= nm AS LP window RP", + /* 314 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 315 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 316 */ "window ::= ORDER BY sortlist frame_opt", + /* 317 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 318 */ "window ::= frame_opt", + /* 319 */ "window ::= nm frame_opt", + /* 320 */ "frame_opt ::=", + /* 321 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 322 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 323 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 324 */ "frame_bound_s ::= frame_bound", + /* 325 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 326 */ "frame_bound_e ::= frame_bound", + /* 327 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 328 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 329 */ "frame_bound ::= CURRENT ROW", + /* 330 */ "frame_exclude_opt ::=", + /* 331 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 332 */ "frame_exclude ::= NO OTHERS", + /* 333 */ "frame_exclude ::= CURRENT ROW", + /* 334 */ "frame_exclude ::= GROUP|TIES", + /* 335 */ "window_clause ::= WINDOW windowdefn_list", + /* 336 */ "filter_over ::= filter_clause over_clause", + /* 337 */ "filter_over ::= over_clause", + /* 338 */ "filter_over ::= filter_clause", + /* 339 */ "over_clause ::= OVER LP window RP", + /* 340 */ "over_clause ::= OVER nm", + /* 341 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 342 */ "input ::= cmdlist", + /* 343 */ "cmdlist ::= cmdlist ecmd", + /* 344 */ "cmdlist ::= ecmd", + /* 345 */ "ecmd ::= SEMI", + /* 346 */ "ecmd ::= cmdx SEMI", + /* 347 */ "ecmd ::= explain cmdx SEMI", + /* 348 */ "trans_opt ::=", + /* 349 */ "trans_opt ::= TRANSACTION", + /* 350 */ "trans_opt ::= TRANSACTION nm", + /* 351 */ "savepoint_opt ::= SAVEPOINT", + /* 352 */ "savepoint_opt ::=", + /* 353 */ "cmd ::= create_table create_table_args", + /* 354 */ "table_option_set ::= table_option", + /* 355 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 356 */ "columnlist ::= columnname carglist", + /* 357 */ "nm ::= ID|INDEXED", + /* 358 */ "nm ::= STRING", + /* 359 */ "nm ::= JOIN_KW", + /* 360 */ "typetoken ::= typename", + /* 361 */ "typename ::= ID|STRING", + /* 362 */ "signed ::= plus_num", + /* 363 */ "signed ::= minus_num", + /* 364 */ "carglist ::= carglist ccons", + /* 365 */ "carglist ::=", + /* 366 */ "ccons ::= NULL onconf", + /* 367 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 368 */ "ccons ::= AS generated", + /* 369 */ "conslist_opt ::= COMMA conslist", + /* 370 */ "conslist ::= conslist tconscomma tcons", + /* 371 */ "conslist ::= tcons", + /* 372 */ "tconscomma ::=", + /* 373 */ "defer_subclause_opt ::= defer_subclause", + /* 374 */ "resolvetype ::= raisetype", + /* 375 */ "selectnowith ::= oneselect", + /* 376 */ "oneselect ::= values", + /* 377 */ "sclp ::= selcollist COMMA", + /* 378 */ "as ::= ID|STRING", + /* 379 */ "indexed_opt ::= indexed_by", + /* 380 */ "returning ::=", + /* 381 */ "expr ::= term", + /* 382 */ "likeop ::= LIKE_KW|MATCH", + /* 383 */ "exprlist ::= nexprlist", + /* 384 */ "nmnum ::= plus_num", + /* 385 */ "nmnum ::= nm", + /* 386 */ "nmnum ::= ON", + /* 387 */ "nmnum ::= DELETE", + /* 388 */ "nmnum ::= DEFAULT", + /* 389 */ "plus_num ::= INTEGER|FLOAT", + /* 390 */ "foreach_clause ::=", + /* 391 */ "foreach_clause ::= FOR EACH ROW", + /* 392 */ "trnm ::= nm", + /* 393 */ "tridxby ::=", + /* 394 */ "database_kw_opt ::= DATABASE", + /* 395 */ "database_kw_opt ::=", + /* 396 */ "kwcolumn_opt ::=", + /* 397 */ "kwcolumn_opt ::= COLUMNKW", + /* 398 */ "vtabarglist ::= vtabarg", + /* 399 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 400 */ "vtabarg ::= vtabarg vtabargtoken", + /* 401 */ "anylist ::=", + /* 402 */ "anylist ::= anylist LP anylist RP", + /* 403 */ "anylist ::= anylist ANY", + /* 404 */ "with ::=", +}; +#endif /* NDEBUG */ + + +#if YYSTACKDEPTH<=0 +/* +** Try to increase the size of the parser stack. Return the number +** of errors. Return 0 on success. +*/ +static int yyGrowStack(yyParser *p){ + int newSize; + int idx; + yyStackEntry *pNew; + + newSize = p->yystksz*2 + 100; + idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; + if( p->yystack==&p->yystk0 ){ + pNew = malloc(newSize*sizeof(pNew[0])); + if( pNew ) pNew[0] = p->yystk0; + }else{ + pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + } + if( pNew ){ + p->yystack = pNew; + p->yytos = &p->yystack[idx]; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", + yyTracePrompt, p->yystksz, newSize); + } +#endif + p->yystksz = newSize; + } + return pNew==0; +} +#endif + +/* Datatype of the argument to the memory allocated passed as the +** second argument to sqlite3ParserAlloc() below. This can be changed by +** putting an appropriate #define in the %include section of the input +** grammar. +*/ +#ifndef YYMALLOCARGTYPE +# define YYMALLOCARGTYPE size_t +#endif + +/* Initialize a new parser that has already been allocated. +*/ +SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL){ + yyParser *yypParser = (yyParser*)yypRawParser; + sqlite3ParserCTX_STORE +#ifdef YYTRACKMAXSTACKDEPTH + yypParser->yyhwm = 0; +#endif +#if YYSTACKDEPTH<=0 + yypParser->yytos = NULL; + yypParser->yystack = NULL; + yypParser->yystksz = 0; + if( yyGrowStack(yypParser) ){ + yypParser->yystack = &yypParser->yystk0; + yypParser->yystksz = 1; + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yypParser->yytos = yypParser->yystack; + yypParser->yystack[0].stateno = 0; + yypParser->yystack[0].major = 0; +#if YYSTACKDEPTH>0 + yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; +#endif +} + +#ifndef sqlite3Parser_ENGINEALWAYSONSTACK +/* +** This function allocates a new parser. +** The only argument is a pointer to a function which works like +** malloc. +** +** Inputs: +** A pointer to the function used to allocate memory. +** +** Outputs: +** A pointer to a parser. This pointer is used in subsequent calls +** to sqlite3Parser and sqlite3ParserFree. +*/ +SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sqlite3ParserCTX_PDECL){ + yyParser *yypParser; + yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); + if( yypParser ){ + sqlite3ParserCTX_STORE + sqlite3ParserInit(yypParser sqlite3ParserCTX_PARAM); + } + return (void*)yypParser; +} +#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */ + + +/* The following function deletes the "minor type" or semantic value +** associated with a symbol. The symbol can be either a terminal +** or nonterminal. "yymajor" is the symbol code, and "yypminor" is +** a pointer to the value to be deleted. The code used to do the +** deletions is derived from the %destructor and/or %token_destructor +** directives of the input grammar. +*/ +static void yy_destructor( + yyParser *yypParser, /* The parser */ + YYCODETYPE yymajor, /* Type code for object to destroy */ + YYMINORTYPE *yypminor /* The object to be destroyed */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH + switch( yymajor ){ + /* Here is inserted the actions which take place when a + ** terminal or non-terminal is destroyed. This can happen + ** when the symbol is popped from the stack during a + ** reduce or during error processing or when a parser is + ** being destroyed before it is finished parsing. + ** + ** Note: during a reduce, the only symbols destroyed are those + ** which appear on the RHS of the rule, but which are *not* used + ** inside the C code. + */ +/********* Begin destructor definitions ***************************************/ + case 204: /* select */ + case 239: /* selectnowith */ + case 240: /* oneselect */ + case 252: /* values */ +{ +sqlite3SelectDelete(pParse->db, (yypminor->yy47)); +} + break; + case 216: /* term */ + case 217: /* expr */ + case 246: /* where_opt */ + case 248: /* having_opt */ + case 267: /* where_opt_ret */ + case 278: /* case_operand */ + case 280: /* case_else */ + case 283: /* vinto */ + case 290: /* when_clause */ + case 295: /* key_opt */ + case 311: /* filter_clause */ +{ +sqlite3ExprDelete(pParse->db, (yypminor->yy528)); +} + break; + case 221: /* eidlist_opt */ + case 231: /* sortlist */ + case 232: /* eidlist */ + case 244: /* selcollist */ + case 247: /* groupby_opt */ + case 249: /* orderby_opt */ + case 253: /* nexprlist */ + case 254: /* sclp */ + case 261: /* exprlist */ + case 268: /* setlist */ + case 277: /* paren_exprlist */ + case 279: /* case_exprlist */ + case 310: /* part_opt */ +{ +sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); +} + break; + case 238: /* fullname */ + case 245: /* from */ + case 256: /* seltablist */ + case 257: /* stl_prefix */ + case 262: /* xfullname */ +{ +sqlite3SrcListDelete(pParse->db, (yypminor->yy131)); +} + break; + case 241: /* wqlist */ +{ +sqlite3WithDelete(pParse->db, (yypminor->yy521)); +} + break; + case 251: /* window_clause */ + case 306: /* windowdefn_list */ +{ +sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); +} + break; + case 263: /* idlist */ + case 270: /* idlist_opt */ +{ +sqlite3IdListDelete(pParse->db, (yypminor->yy254)); +} + break; + case 273: /* filter_over */ + case 307: /* windowdefn */ + case 308: /* window */ + case 309: /* frame_opt */ + case 312: /* over_clause */ +{ +sqlite3WindowDelete(pParse->db, (yypminor->yy41)); +} + break; + case 286: /* trigger_cmd_list */ + case 291: /* trigger_cmd */ +{ +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy33)); +} + break; + case 288: /* trigger_event */ +{ +sqlite3IdListDelete(pParse->db, (yypminor->yy180).b); +} + break; + case 314: /* frame_bound */ + case 315: /* frame_bound_s */ + case 316: /* frame_bound_e */ +{ +sqlite3ExprDelete(pParse->db, (yypminor->yy595).pExpr); +} + break; +/********* End destructor definitions *****************************************/ + default: break; /* If no destructor action specified: do nothing */ + } +} + +/* +** Pop the parser's stack once. +** +** If there is a destructor routine associated with the token which +** is popped from the stack, then call it. +*/ +static void yy_pop_parser_stack(yyParser *pParser){ + yyStackEntry *yytos; + assert( pParser->yytos!=0 ); + assert( pParser->yytos > pParser->yystack ); + yytos = pParser->yytos--; +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sPopping %s\n", + yyTracePrompt, + yyTokenName[yytos->major]); + } +#endif + yy_destructor(pParser, yytos->major, &yytos->minor); +} + +/* +** Clear all secondary memory allocations from the parser +*/ +SQLITE_PRIVATE void sqlite3ParserFinalize(void *p){ + yyParser *pParser = (yyParser*)p; + while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); +#if YYSTACKDEPTH<=0 + if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); +#endif +} + +#ifndef sqlite3Parser_ENGINEALWAYSONSTACK +/* +** Deallocate and destroy a parser. Destructors are called for +** all stack elements before shutting the parser down. +** +** If the YYPARSEFREENEVERNULL macro exists (for example because it +** is defined in a %include section of the input grammar) then it is +** assumed that the input pointer is never NULL. +*/ +SQLITE_PRIVATE void sqlite3ParserFree( + void *p, /* The parser to be deleted */ + void (*freeProc)(void*) /* Function used to reclaim memory */ +){ +#ifndef YYPARSEFREENEVERNULL + if( p==0 ) return; +#endif + sqlite3ParserFinalize(p); + (*freeProc)(p); +} +#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */ + +/* +** Return the peak depth of the stack for a parser. +*/ +#ifdef YYTRACKMAXSTACKDEPTH +SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){ + yyParser *pParser = (yyParser*)p; + return pParser->yyhwm; +} +#endif + +/* This array of booleans keeps track of the parser statement +** coverage. The element yycoverage[X][Y] is set when the parser +** is in state X and has a lookahead token Y. In a well-tested +** systems, every element of this matrix should end up being set. +*/ +#if defined(YYCOVERAGE) +static unsigned char yycoverage[YYNSTATE][YYNTOKEN]; +#endif + +/* +** Write into out a description of every state/lookahead combination that +** +** (1) has not been used by the parser, and +** (2) is not a syntax error. +** +** Return the number of missed state/lookahead combinations. +*/ +#if defined(YYCOVERAGE) +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE *out){ + int stateno, iLookAhead, i; + int nMissed = 0; + for(stateno=0; statenoYY_MAX_SHIFT ) return stateno; + assert( stateno <= YY_SHIFT_COUNT ); +#if defined(YYCOVERAGE) + yycoverage[stateno][iLookAhead] = 1; +#endif + do{ + i = yy_shift_ofst[stateno]; + assert( i>=0 ); + assert( i<=YY_ACTTAB_COUNT ); + assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); + assert( iLookAhead!=YYNOCODE ); + assert( iLookAhead < YYNTOKEN ); + i += iLookAhead; + assert( i<(int)YY_NLOOKAHEAD ); + if( yy_lookahead[i]!=iLookAhead ){ +#ifdef YYFALLBACK + YYCODETYPE iFallback; /* Fallback token */ + assert( iLookAhead %s\n", + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); + } +#endif + assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ + iLookAhead = iFallback; + continue; + } +#endif +#ifdef YYWILDCARD + { + int j = i - iLookAhead + YYWILDCARD; + assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) ); + if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", + yyTracePrompt, yyTokenName[iLookAhead], + yyTokenName[YYWILDCARD]); + } +#endif /* NDEBUG */ + return yy_action[j]; + } + } +#endif /* YYWILDCARD */ + return yy_default[stateno]; + }else{ + assert( i>=0 && i<(int)(sizeof(yy_action)/sizeof(yy_action[0])) ); + return yy_action[i]; + } + }while(1); +} + +/* +** Find the appropriate action for a parser given the non-terminal +** look-ahead token iLookAhead. +*/ +static YYACTIONTYPE yy_find_reduce_action( + YYACTIONTYPE stateno, /* Current state number */ + YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; +#ifdef YYERRORSYMBOL + if( stateno>YY_REDUCE_COUNT ){ + return yy_default[stateno]; + } +#else + assert( stateno<=YY_REDUCE_COUNT ); +#endif + i = yy_reduce_ofst[stateno]; + assert( iLookAhead!=YYNOCODE ); + i += iLookAhead; +#ifdef YYERRORSYMBOL + if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ + return yy_default[stateno]; + } +#else + assert( i>=0 && iyytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will execute if the parser + ** stack every overflows */ +/******** Begin %stack_overflow code ******************************************/ + + sqlite3ErrorMsg(pParse, "parser stack overflow"); +/******** End %stack_overflow code ********************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument var */ + sqlite3ParserCTX_STORE +} + +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){ + if( yyTraceFILE ){ + if( yyNewStateyytos->major], + yyNewState); + }else{ + fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n", + yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], + yyNewState - YY_MIN_REDUCE); + } + } +} +#else +# define yyTraceShift(X,Y,Z) +#endif + +/* +** Perform a shift action. +*/ +static void yy_shift( + yyParser *yypParser, /* The parser to be shifted */ + YYACTIONTYPE yyNewState, /* The new state to shift in */ + YYCODETYPE yyMajor, /* The major token to shift in */ + sqlite3ParserTOKENTYPE yyMinor /* The minor token to shift in */ +){ + yyStackEntry *yytos; + yypParser->yytos++; +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>yypParser->yystackEnd ){ + yypParser->yytos--; + yyStackOverflow(yypParser); + return; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ + if( yyGrowStack(yypParser) ){ + yypParser->yytos--; + yyStackOverflow(yypParser); + return; + } + } +#endif + if( yyNewState > YY_MAX_SHIFT ){ + yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; + } + yytos = yypParser->yytos; + yytos->stateno = yyNewState; + yytos->major = yyMajor; + yytos->minor.yy0 = yyMinor; + yyTraceShift(yypParser, yyNewState, "Shift"); +} + +/* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side +** of that rule */ +static const YYCODETYPE yyRuleInfoLhs[] = { + 189, /* (0) explain ::= EXPLAIN */ + 189, /* (1) explain ::= EXPLAIN QUERY PLAN */ + 188, /* (2) cmdx ::= cmd */ + 190, /* (3) cmd ::= BEGIN transtype trans_opt */ + 191, /* (4) transtype ::= */ + 191, /* (5) transtype ::= DEFERRED */ + 191, /* (6) transtype ::= IMMEDIATE */ + 191, /* (7) transtype ::= EXCLUSIVE */ + 190, /* (8) cmd ::= COMMIT|END trans_opt */ + 190, /* (9) cmd ::= ROLLBACK trans_opt */ + 190, /* (10) cmd ::= SAVEPOINT nm */ + 190, /* (11) cmd ::= RELEASE savepoint_opt nm */ + 190, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + 195, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + 197, /* (14) createkw ::= CREATE */ + 199, /* (15) ifnotexists ::= */ + 199, /* (16) ifnotexists ::= IF NOT EXISTS */ + 198, /* (17) temp ::= TEMP */ + 198, /* (18) temp ::= */ + 196, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */ + 196, /* (20) create_table_args ::= AS select */ + 203, /* (21) table_option_set ::= */ + 203, /* (22) table_option_set ::= table_option_set COMMA table_option */ + 205, /* (23) table_option ::= WITHOUT nm */ + 205, /* (24) table_option ::= nm */ + 206, /* (25) columnname ::= nm typetoken */ + 208, /* (26) typetoken ::= */ + 208, /* (27) typetoken ::= typename LP signed RP */ + 208, /* (28) typetoken ::= typename LP signed COMMA signed RP */ + 209, /* (29) typename ::= typename ID|STRING */ + 213, /* (30) scanpt ::= */ + 214, /* (31) scantok ::= */ + 215, /* (32) ccons ::= CONSTRAINT nm */ + 215, /* (33) ccons ::= DEFAULT scantok term */ + 215, /* (34) ccons ::= DEFAULT LP expr RP */ + 215, /* (35) ccons ::= DEFAULT PLUS scantok term */ + 215, /* (36) ccons ::= DEFAULT MINUS scantok term */ + 215, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */ + 215, /* (38) ccons ::= NOT NULL onconf */ + 215, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + 215, /* (40) ccons ::= UNIQUE onconf */ + 215, /* (41) ccons ::= CHECK LP expr RP */ + 215, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */ + 215, /* (43) ccons ::= defer_subclause */ + 215, /* (44) ccons ::= COLLATE ID|STRING */ + 224, /* (45) generated ::= LP expr RP */ + 224, /* (46) generated ::= LP expr RP ID */ + 220, /* (47) autoinc ::= */ + 220, /* (48) autoinc ::= AUTOINCR */ + 222, /* (49) refargs ::= */ + 222, /* (50) refargs ::= refargs refarg */ + 225, /* (51) refarg ::= MATCH nm */ + 225, /* (52) refarg ::= ON INSERT refact */ + 225, /* (53) refarg ::= ON DELETE refact */ + 225, /* (54) refarg ::= ON UPDATE refact */ + 226, /* (55) refact ::= SET NULL */ + 226, /* (56) refact ::= SET DEFAULT */ + 226, /* (57) refact ::= CASCADE */ + 226, /* (58) refact ::= RESTRICT */ + 226, /* (59) refact ::= NO ACTION */ + 223, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + 223, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 227, /* (62) init_deferred_pred_opt ::= */ + 227, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + 227, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 202, /* (65) conslist_opt ::= */ + 229, /* (66) tconscomma ::= COMMA */ + 230, /* (67) tcons ::= CONSTRAINT nm */ + 230, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + 230, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */ + 230, /* (70) tcons ::= CHECK LP expr RP onconf */ + 230, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 233, /* (72) defer_subclause_opt ::= */ + 218, /* (73) onconf ::= */ + 218, /* (74) onconf ::= ON CONFLICT resolvetype */ + 234, /* (75) orconf ::= */ + 234, /* (76) orconf ::= OR resolvetype */ + 235, /* (77) resolvetype ::= IGNORE */ + 235, /* (78) resolvetype ::= REPLACE */ + 190, /* (79) cmd ::= DROP TABLE ifexists fullname */ + 237, /* (80) ifexists ::= IF EXISTS */ + 237, /* (81) ifexists ::= */ + 190, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + 190, /* (83) cmd ::= DROP VIEW ifexists fullname */ + 190, /* (84) cmd ::= select */ + 204, /* (85) select ::= WITH wqlist selectnowith */ + 204, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */ + 204, /* (87) select ::= selectnowith */ + 239, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */ + 242, /* (89) multiselect_op ::= UNION */ + 242, /* (90) multiselect_op ::= UNION ALL */ + 242, /* (91) multiselect_op ::= EXCEPT|INTERSECT */ + 240, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + 240, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + 252, /* (94) values ::= VALUES LP nexprlist RP */ + 252, /* (95) values ::= values COMMA LP nexprlist RP */ + 243, /* (96) distinct ::= DISTINCT */ + 243, /* (97) distinct ::= ALL */ + 243, /* (98) distinct ::= */ + 254, /* (99) sclp ::= */ + 244, /* (100) selcollist ::= sclp scanpt expr scanpt as */ + 244, /* (101) selcollist ::= sclp scanpt STAR */ + 244, /* (102) selcollist ::= sclp scanpt nm DOT STAR */ + 255, /* (103) as ::= AS nm */ + 255, /* (104) as ::= */ + 245, /* (105) from ::= */ + 245, /* (106) from ::= FROM seltablist */ + 257, /* (107) stl_prefix ::= seltablist joinop */ + 257, /* (108) stl_prefix ::= */ + 256, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ + 256, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + 256, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + 256, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ + 256, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 200, /* (114) dbnm ::= */ + 200, /* (115) dbnm ::= DOT nm */ + 238, /* (116) fullname ::= nm */ + 238, /* (117) fullname ::= nm DOT nm */ + 262, /* (118) xfullname ::= nm */ + 262, /* (119) xfullname ::= nm DOT nm */ + 262, /* (120) xfullname ::= nm DOT nm AS nm */ + 262, /* (121) xfullname ::= nm AS nm */ + 258, /* (122) joinop ::= COMMA|JOIN */ + 258, /* (123) joinop ::= JOIN_KW JOIN */ + 258, /* (124) joinop ::= JOIN_KW nm JOIN */ + 258, /* (125) joinop ::= JOIN_KW nm nm JOIN */ + 259, /* (126) on_using ::= ON expr */ + 259, /* (127) on_using ::= USING LP idlist RP */ + 259, /* (128) on_using ::= */ + 264, /* (129) indexed_opt ::= */ + 260, /* (130) indexed_by ::= INDEXED BY nm */ + 260, /* (131) indexed_by ::= NOT INDEXED */ + 249, /* (132) orderby_opt ::= */ + 249, /* (133) orderby_opt ::= ORDER BY sortlist */ + 231, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ + 231, /* (135) sortlist ::= expr sortorder nulls */ + 219, /* (136) sortorder ::= ASC */ + 219, /* (137) sortorder ::= DESC */ + 219, /* (138) sortorder ::= */ + 265, /* (139) nulls ::= NULLS FIRST */ + 265, /* (140) nulls ::= NULLS LAST */ + 265, /* (141) nulls ::= */ + 247, /* (142) groupby_opt ::= */ + 247, /* (143) groupby_opt ::= GROUP BY nexprlist */ + 248, /* (144) having_opt ::= */ + 248, /* (145) having_opt ::= HAVING expr */ + 250, /* (146) limit_opt ::= */ + 250, /* (147) limit_opt ::= LIMIT expr */ + 250, /* (148) limit_opt ::= LIMIT expr OFFSET expr */ + 250, /* (149) limit_opt ::= LIMIT expr COMMA expr */ + 190, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret orderby_opt limit_opt */ + 246, /* (151) where_opt ::= */ + 246, /* (152) where_opt ::= WHERE expr */ + 267, /* (153) where_opt_ret ::= */ + 267, /* (154) where_opt_ret ::= WHERE expr */ + 267, /* (155) where_opt_ret ::= RETURNING selcollist */ + 267, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */ + 190, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret orderby_opt limit_opt */ + 268, /* (158) setlist ::= setlist COMMA nm EQ expr */ + 268, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */ + 268, /* (160) setlist ::= nm EQ expr */ + 268, /* (161) setlist ::= LP idlist RP EQ expr */ + 190, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + 190, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ + 271, /* (164) upsert ::= */ + 271, /* (165) upsert ::= RETURNING selcollist */ + 271, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ + 271, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ + 271, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */ + 271, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ + 272, /* (170) returning ::= RETURNING selcollist */ + 269, /* (171) insert_cmd ::= INSERT orconf */ + 269, /* (172) insert_cmd ::= REPLACE */ + 270, /* (173) idlist_opt ::= */ + 270, /* (174) idlist_opt ::= LP idlist RP */ + 263, /* (175) idlist ::= idlist COMMA nm */ + 263, /* (176) idlist ::= nm */ + 217, /* (177) expr ::= LP expr RP */ + 217, /* (178) expr ::= ID|INDEXED */ + 217, /* (179) expr ::= JOIN_KW */ + 217, /* (180) expr ::= nm DOT nm */ + 217, /* (181) expr ::= nm DOT nm DOT nm */ + 216, /* (182) term ::= NULL|FLOAT|BLOB */ + 216, /* (183) term ::= STRING */ + 216, /* (184) term ::= INTEGER */ + 217, /* (185) expr ::= VARIABLE */ + 217, /* (186) expr ::= expr COLLATE ID|STRING */ + 217, /* (187) expr ::= CAST LP expr AS typetoken RP */ + 217, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP */ + 217, /* (189) expr ::= ID|INDEXED LP STAR RP */ + 217, /* (190) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ + 217, /* (191) expr ::= ID|INDEXED LP STAR RP filter_over */ + 216, /* (192) term ::= CTIME_KW */ + 217, /* (193) expr ::= LP nexprlist COMMA expr RP */ + 217, /* (194) expr ::= expr AND expr */ + 217, /* (195) expr ::= expr OR expr */ + 217, /* (196) expr ::= expr LT|GT|GE|LE expr */ + 217, /* (197) expr ::= expr EQ|NE expr */ + 217, /* (198) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + 217, /* (199) expr ::= expr PLUS|MINUS expr */ + 217, /* (200) expr ::= expr STAR|SLASH|REM expr */ + 217, /* (201) expr ::= expr CONCAT expr */ + 274, /* (202) likeop ::= NOT LIKE_KW|MATCH */ + 217, /* (203) expr ::= expr likeop expr */ + 217, /* (204) expr ::= expr likeop expr ESCAPE expr */ + 217, /* (205) expr ::= expr ISNULL|NOTNULL */ + 217, /* (206) expr ::= expr NOT NULL */ + 217, /* (207) expr ::= expr IS expr */ + 217, /* (208) expr ::= expr IS NOT expr */ + 217, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ + 217, /* (210) expr ::= expr IS DISTINCT FROM expr */ + 217, /* (211) expr ::= NOT expr */ + 217, /* (212) expr ::= BITNOT expr */ + 217, /* (213) expr ::= PLUS|MINUS expr */ + 217, /* (214) expr ::= expr PTR expr */ + 275, /* (215) between_op ::= BETWEEN */ + 275, /* (216) between_op ::= NOT BETWEEN */ + 217, /* (217) expr ::= expr between_op expr AND expr */ + 276, /* (218) in_op ::= IN */ + 276, /* (219) in_op ::= NOT IN */ + 217, /* (220) expr ::= expr in_op LP exprlist RP */ + 217, /* (221) expr ::= LP select RP */ + 217, /* (222) expr ::= expr in_op LP select RP */ + 217, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ + 217, /* (224) expr ::= EXISTS LP select RP */ + 217, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ + 279, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 279, /* (227) case_exprlist ::= WHEN expr THEN expr */ + 280, /* (228) case_else ::= ELSE expr */ + 280, /* (229) case_else ::= */ + 278, /* (230) case_operand ::= expr */ + 278, /* (231) case_operand ::= */ + 261, /* (232) exprlist ::= */ + 253, /* (233) nexprlist ::= nexprlist COMMA expr */ + 253, /* (234) nexprlist ::= expr */ + 277, /* (235) paren_exprlist ::= */ + 277, /* (236) paren_exprlist ::= LP exprlist RP */ + 190, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 281, /* (238) uniqueflag ::= UNIQUE */ + 281, /* (239) uniqueflag ::= */ + 221, /* (240) eidlist_opt ::= */ + 221, /* (241) eidlist_opt ::= LP eidlist RP */ + 232, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ + 232, /* (243) eidlist ::= nm collate sortorder */ + 282, /* (244) collate ::= */ + 282, /* (245) collate ::= COLLATE ID|STRING */ + 190, /* (246) cmd ::= DROP INDEX ifexists fullname */ + 190, /* (247) cmd ::= VACUUM vinto */ + 190, /* (248) cmd ::= VACUUM nm vinto */ + 283, /* (249) vinto ::= INTO expr */ + 283, /* (250) vinto ::= */ + 190, /* (251) cmd ::= PRAGMA nm dbnm */ + 190, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 190, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 190, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 190, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 211, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ + 212, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ + 190, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 285, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 287, /* (260) trigger_time ::= BEFORE|AFTER */ + 287, /* (261) trigger_time ::= INSTEAD OF */ + 287, /* (262) trigger_time ::= */ + 288, /* (263) trigger_event ::= DELETE|INSERT */ + 288, /* (264) trigger_event ::= UPDATE */ + 288, /* (265) trigger_event ::= UPDATE OF idlist */ + 290, /* (266) when_clause ::= */ + 290, /* (267) when_clause ::= WHEN expr */ + 286, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 286, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ + 292, /* (270) trnm ::= nm DOT nm */ + 293, /* (271) tridxby ::= INDEXED BY nm */ + 293, /* (272) tridxby ::= NOT INDEXED */ + 291, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + 291, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 291, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 291, /* (276) trigger_cmd ::= scanpt select scanpt */ + 217, /* (277) expr ::= RAISE LP IGNORE RP */ + 217, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ + 236, /* (279) raisetype ::= ROLLBACK */ + 236, /* (280) raisetype ::= ABORT */ + 236, /* (281) raisetype ::= FAIL */ + 190, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ + 190, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 190, /* (284) cmd ::= DETACH database_kw_opt expr */ + 295, /* (285) key_opt ::= */ + 295, /* (286) key_opt ::= KEY expr */ + 190, /* (287) cmd ::= REINDEX */ + 190, /* (288) cmd ::= REINDEX nm dbnm */ + 190, /* (289) cmd ::= ANALYZE */ + 190, /* (290) cmd ::= ANALYZE nm dbnm */ + 190, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 190, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 190, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + 296, /* (294) add_column_fullname ::= fullname */ + 190, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 190, /* (296) cmd ::= create_vtab */ + 190, /* (297) cmd ::= create_vtab LP vtabarglist RP */ + 298, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 300, /* (299) vtabarg ::= */ + 301, /* (300) vtabargtoken ::= ANY */ + 301, /* (301) vtabargtoken ::= lp anylist RP */ + 302, /* (302) lp ::= LP */ + 266, /* (303) with ::= WITH wqlist */ + 266, /* (304) with ::= WITH RECURSIVE wqlist */ + 305, /* (305) wqas ::= AS */ + 305, /* (306) wqas ::= AS MATERIALIZED */ + 305, /* (307) wqas ::= AS NOT MATERIALIZED */ + 304, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ + 241, /* (309) wqlist ::= wqitem */ + 241, /* (310) wqlist ::= wqlist COMMA wqitem */ + 306, /* (311) windowdefn_list ::= windowdefn */ + 306, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 307, /* (313) windowdefn ::= nm AS LP window RP */ + 308, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (316) window ::= ORDER BY sortlist frame_opt */ + 308, /* (317) window ::= nm ORDER BY sortlist frame_opt */ + 308, /* (318) window ::= frame_opt */ + 308, /* (319) window ::= nm frame_opt */ + 309, /* (320) frame_opt ::= */ + 309, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 309, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 313, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ + 315, /* (324) frame_bound_s ::= frame_bound */ + 315, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ + 316, /* (326) frame_bound_e ::= frame_bound */ + 316, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 314, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ + 314, /* (329) frame_bound ::= CURRENT ROW */ + 317, /* (330) frame_exclude_opt ::= */ + 317, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 318, /* (332) frame_exclude ::= NO OTHERS */ + 318, /* (333) frame_exclude ::= CURRENT ROW */ + 318, /* (334) frame_exclude ::= GROUP|TIES */ + 251, /* (335) window_clause ::= WINDOW windowdefn_list */ + 273, /* (336) filter_over ::= filter_clause over_clause */ + 273, /* (337) filter_over ::= over_clause */ + 273, /* (338) filter_over ::= filter_clause */ + 312, /* (339) over_clause ::= OVER LP window RP */ + 312, /* (340) over_clause ::= OVER nm */ + 311, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ + 185, /* (342) input ::= cmdlist */ + 186, /* (343) cmdlist ::= cmdlist ecmd */ + 186, /* (344) cmdlist ::= ecmd */ + 187, /* (345) ecmd ::= SEMI */ + 187, /* (346) ecmd ::= cmdx SEMI */ + 187, /* (347) ecmd ::= explain cmdx SEMI */ + 192, /* (348) trans_opt ::= */ + 192, /* (349) trans_opt ::= TRANSACTION */ + 192, /* (350) trans_opt ::= TRANSACTION nm */ + 194, /* (351) savepoint_opt ::= SAVEPOINT */ + 194, /* (352) savepoint_opt ::= */ + 190, /* (353) cmd ::= create_table create_table_args */ + 203, /* (354) table_option_set ::= table_option */ + 201, /* (355) columnlist ::= columnlist COMMA columnname carglist */ + 201, /* (356) columnlist ::= columnname carglist */ + 193, /* (357) nm ::= ID|INDEXED */ + 193, /* (358) nm ::= STRING */ + 193, /* (359) nm ::= JOIN_KW */ + 208, /* (360) typetoken ::= typename */ + 209, /* (361) typename ::= ID|STRING */ + 210, /* (362) signed ::= plus_num */ + 210, /* (363) signed ::= minus_num */ + 207, /* (364) carglist ::= carglist ccons */ + 207, /* (365) carglist ::= */ + 215, /* (366) ccons ::= NULL onconf */ + 215, /* (367) ccons ::= GENERATED ALWAYS AS generated */ + 215, /* (368) ccons ::= AS generated */ + 202, /* (369) conslist_opt ::= COMMA conslist */ + 228, /* (370) conslist ::= conslist tconscomma tcons */ + 228, /* (371) conslist ::= tcons */ + 229, /* (372) tconscomma ::= */ + 233, /* (373) defer_subclause_opt ::= defer_subclause */ + 235, /* (374) resolvetype ::= raisetype */ + 239, /* (375) selectnowith ::= oneselect */ + 240, /* (376) oneselect ::= values */ + 254, /* (377) sclp ::= selcollist COMMA */ + 255, /* (378) as ::= ID|STRING */ + 264, /* (379) indexed_opt ::= indexed_by */ + 272, /* (380) returning ::= */ + 217, /* (381) expr ::= term */ + 274, /* (382) likeop ::= LIKE_KW|MATCH */ + 261, /* (383) exprlist ::= nexprlist */ + 284, /* (384) nmnum ::= plus_num */ + 284, /* (385) nmnum ::= nm */ + 284, /* (386) nmnum ::= ON */ + 284, /* (387) nmnum ::= DELETE */ + 284, /* (388) nmnum ::= DEFAULT */ + 211, /* (389) plus_num ::= INTEGER|FLOAT */ + 289, /* (390) foreach_clause ::= */ + 289, /* (391) foreach_clause ::= FOR EACH ROW */ + 292, /* (392) trnm ::= nm */ + 293, /* (393) tridxby ::= */ + 294, /* (394) database_kw_opt ::= DATABASE */ + 294, /* (395) database_kw_opt ::= */ + 297, /* (396) kwcolumn_opt ::= */ + 297, /* (397) kwcolumn_opt ::= COLUMNKW */ + 299, /* (398) vtabarglist ::= vtabarg */ + 299, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ + 300, /* (400) vtabarg ::= vtabarg vtabargtoken */ + 303, /* (401) anylist ::= */ + 303, /* (402) anylist ::= anylist LP anylist RP */ + 303, /* (403) anylist ::= anylist ANY */ + 266, /* (404) with ::= */ +}; + +/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number +** of symbols on the right-hand side of that rule. */ +static const signed char yyRuleInfoNRhs[] = { + -1, /* (0) explain ::= EXPLAIN */ + -3, /* (1) explain ::= EXPLAIN QUERY PLAN */ + -1, /* (2) cmdx ::= cmd */ + -3, /* (3) cmd ::= BEGIN transtype trans_opt */ + 0, /* (4) transtype ::= */ + -1, /* (5) transtype ::= DEFERRED */ + -1, /* (6) transtype ::= IMMEDIATE */ + -1, /* (7) transtype ::= EXCLUSIVE */ + -2, /* (8) cmd ::= COMMIT|END trans_opt */ + -2, /* (9) cmd ::= ROLLBACK trans_opt */ + -2, /* (10) cmd ::= SAVEPOINT nm */ + -3, /* (11) cmd ::= RELEASE savepoint_opt nm */ + -5, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + -6, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + -1, /* (14) createkw ::= CREATE */ + 0, /* (15) ifnotexists ::= */ + -3, /* (16) ifnotexists ::= IF NOT EXISTS */ + -1, /* (17) temp ::= TEMP */ + 0, /* (18) temp ::= */ + -5, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */ + -2, /* (20) create_table_args ::= AS select */ + 0, /* (21) table_option_set ::= */ + -3, /* (22) table_option_set ::= table_option_set COMMA table_option */ + -2, /* (23) table_option ::= WITHOUT nm */ + -1, /* (24) table_option ::= nm */ + -2, /* (25) columnname ::= nm typetoken */ + 0, /* (26) typetoken ::= */ + -4, /* (27) typetoken ::= typename LP signed RP */ + -6, /* (28) typetoken ::= typename LP signed COMMA signed RP */ + -2, /* (29) typename ::= typename ID|STRING */ + 0, /* (30) scanpt ::= */ + 0, /* (31) scantok ::= */ + -2, /* (32) ccons ::= CONSTRAINT nm */ + -3, /* (33) ccons ::= DEFAULT scantok term */ + -4, /* (34) ccons ::= DEFAULT LP expr RP */ + -4, /* (35) ccons ::= DEFAULT PLUS scantok term */ + -4, /* (36) ccons ::= DEFAULT MINUS scantok term */ + -3, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */ + -3, /* (38) ccons ::= NOT NULL onconf */ + -5, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + -2, /* (40) ccons ::= UNIQUE onconf */ + -4, /* (41) ccons ::= CHECK LP expr RP */ + -4, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */ + -1, /* (43) ccons ::= defer_subclause */ + -2, /* (44) ccons ::= COLLATE ID|STRING */ + -3, /* (45) generated ::= LP expr RP */ + -4, /* (46) generated ::= LP expr RP ID */ + 0, /* (47) autoinc ::= */ + -1, /* (48) autoinc ::= AUTOINCR */ + 0, /* (49) refargs ::= */ + -2, /* (50) refargs ::= refargs refarg */ + -2, /* (51) refarg ::= MATCH nm */ + -3, /* (52) refarg ::= ON INSERT refact */ + -3, /* (53) refarg ::= ON DELETE refact */ + -3, /* (54) refarg ::= ON UPDATE refact */ + -2, /* (55) refact ::= SET NULL */ + -2, /* (56) refact ::= SET DEFAULT */ + -1, /* (57) refact ::= CASCADE */ + -1, /* (58) refact ::= RESTRICT */ + -2, /* (59) refact ::= NO ACTION */ + -3, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + -2, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 0, /* (62) init_deferred_pred_opt ::= */ + -2, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + -2, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 0, /* (65) conslist_opt ::= */ + -1, /* (66) tconscomma ::= COMMA */ + -2, /* (67) tcons ::= CONSTRAINT nm */ + -7, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + -5, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */ + -5, /* (70) tcons ::= CHECK LP expr RP onconf */ + -10, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 0, /* (72) defer_subclause_opt ::= */ + 0, /* (73) onconf ::= */ + -3, /* (74) onconf ::= ON CONFLICT resolvetype */ + 0, /* (75) orconf ::= */ + -2, /* (76) orconf ::= OR resolvetype */ + -1, /* (77) resolvetype ::= IGNORE */ + -1, /* (78) resolvetype ::= REPLACE */ + -4, /* (79) cmd ::= DROP TABLE ifexists fullname */ + -2, /* (80) ifexists ::= IF EXISTS */ + 0, /* (81) ifexists ::= */ + -9, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + -4, /* (83) cmd ::= DROP VIEW ifexists fullname */ + -1, /* (84) cmd ::= select */ + -3, /* (85) select ::= WITH wqlist selectnowith */ + -4, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */ + -1, /* (87) select ::= selectnowith */ + -3, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */ + -1, /* (89) multiselect_op ::= UNION */ + -2, /* (90) multiselect_op ::= UNION ALL */ + -1, /* (91) multiselect_op ::= EXCEPT|INTERSECT */ + -9, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + -10, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + -4, /* (94) values ::= VALUES LP nexprlist RP */ + -5, /* (95) values ::= values COMMA LP nexprlist RP */ + -1, /* (96) distinct ::= DISTINCT */ + -1, /* (97) distinct ::= ALL */ + 0, /* (98) distinct ::= */ + 0, /* (99) sclp ::= */ + -5, /* (100) selcollist ::= sclp scanpt expr scanpt as */ + -3, /* (101) selcollist ::= sclp scanpt STAR */ + -5, /* (102) selcollist ::= sclp scanpt nm DOT STAR */ + -2, /* (103) as ::= AS nm */ + 0, /* (104) as ::= */ + 0, /* (105) from ::= */ + -2, /* (106) from ::= FROM seltablist */ + -2, /* (107) stl_prefix ::= seltablist joinop */ + 0, /* (108) stl_prefix ::= */ + -5, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ + -6, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + -8, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + -6, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ + -6, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 0, /* (114) dbnm ::= */ + -2, /* (115) dbnm ::= DOT nm */ + -1, /* (116) fullname ::= nm */ + -3, /* (117) fullname ::= nm DOT nm */ + -1, /* (118) xfullname ::= nm */ + -3, /* (119) xfullname ::= nm DOT nm */ + -5, /* (120) xfullname ::= nm DOT nm AS nm */ + -3, /* (121) xfullname ::= nm AS nm */ + -1, /* (122) joinop ::= COMMA|JOIN */ + -2, /* (123) joinop ::= JOIN_KW JOIN */ + -3, /* (124) joinop ::= JOIN_KW nm JOIN */ + -4, /* (125) joinop ::= JOIN_KW nm nm JOIN */ + -2, /* (126) on_using ::= ON expr */ + -4, /* (127) on_using ::= USING LP idlist RP */ + 0, /* (128) on_using ::= */ + 0, /* (129) indexed_opt ::= */ + -3, /* (130) indexed_by ::= INDEXED BY nm */ + -2, /* (131) indexed_by ::= NOT INDEXED */ + 0, /* (132) orderby_opt ::= */ + -3, /* (133) orderby_opt ::= ORDER BY sortlist */ + -5, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ + -3, /* (135) sortlist ::= expr sortorder nulls */ + -1, /* (136) sortorder ::= ASC */ + -1, /* (137) sortorder ::= DESC */ + 0, /* (138) sortorder ::= */ + -2, /* (139) nulls ::= NULLS FIRST */ + -2, /* (140) nulls ::= NULLS LAST */ + 0, /* (141) nulls ::= */ + 0, /* (142) groupby_opt ::= */ + -3, /* (143) groupby_opt ::= GROUP BY nexprlist */ + 0, /* (144) having_opt ::= */ + -2, /* (145) having_opt ::= HAVING expr */ + 0, /* (146) limit_opt ::= */ + -2, /* (147) limit_opt ::= LIMIT expr */ + -4, /* (148) limit_opt ::= LIMIT expr OFFSET expr */ + -4, /* (149) limit_opt ::= LIMIT expr COMMA expr */ + -8, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret orderby_opt limit_opt */ + 0, /* (151) where_opt ::= */ + -2, /* (152) where_opt ::= WHERE expr */ + 0, /* (153) where_opt_ret ::= */ + -2, /* (154) where_opt_ret ::= WHERE expr */ + -2, /* (155) where_opt_ret ::= RETURNING selcollist */ + -4, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */ + -11, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret orderby_opt limit_opt */ + -5, /* (158) setlist ::= setlist COMMA nm EQ expr */ + -7, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */ + -3, /* (160) setlist ::= nm EQ expr */ + -5, /* (161) setlist ::= LP idlist RP EQ expr */ + -7, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + -8, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ + 0, /* (164) upsert ::= */ + -2, /* (165) upsert ::= RETURNING selcollist */ + -12, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ + -9, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ + -5, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */ + -8, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ + -2, /* (170) returning ::= RETURNING selcollist */ + -2, /* (171) insert_cmd ::= INSERT orconf */ + -1, /* (172) insert_cmd ::= REPLACE */ + 0, /* (173) idlist_opt ::= */ + -3, /* (174) idlist_opt ::= LP idlist RP */ + -3, /* (175) idlist ::= idlist COMMA nm */ + -1, /* (176) idlist ::= nm */ + -3, /* (177) expr ::= LP expr RP */ + -1, /* (178) expr ::= ID|INDEXED */ + -1, /* (179) expr ::= JOIN_KW */ + -3, /* (180) expr ::= nm DOT nm */ + -5, /* (181) expr ::= nm DOT nm DOT nm */ + -1, /* (182) term ::= NULL|FLOAT|BLOB */ + -1, /* (183) term ::= STRING */ + -1, /* (184) term ::= INTEGER */ + -1, /* (185) expr ::= VARIABLE */ + -3, /* (186) expr ::= expr COLLATE ID|STRING */ + -6, /* (187) expr ::= CAST LP expr AS typetoken RP */ + -5, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP */ + -4, /* (189) expr ::= ID|INDEXED LP STAR RP */ + -6, /* (190) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ + -5, /* (191) expr ::= ID|INDEXED LP STAR RP filter_over */ + -1, /* (192) term ::= CTIME_KW */ + -5, /* (193) expr ::= LP nexprlist COMMA expr RP */ + -3, /* (194) expr ::= expr AND expr */ + -3, /* (195) expr ::= expr OR expr */ + -3, /* (196) expr ::= expr LT|GT|GE|LE expr */ + -3, /* (197) expr ::= expr EQ|NE expr */ + -3, /* (198) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + -3, /* (199) expr ::= expr PLUS|MINUS expr */ + -3, /* (200) expr ::= expr STAR|SLASH|REM expr */ + -3, /* (201) expr ::= expr CONCAT expr */ + -2, /* (202) likeop ::= NOT LIKE_KW|MATCH */ + -3, /* (203) expr ::= expr likeop expr */ + -5, /* (204) expr ::= expr likeop expr ESCAPE expr */ + -2, /* (205) expr ::= expr ISNULL|NOTNULL */ + -3, /* (206) expr ::= expr NOT NULL */ + -3, /* (207) expr ::= expr IS expr */ + -4, /* (208) expr ::= expr IS NOT expr */ + -6, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ + -5, /* (210) expr ::= expr IS DISTINCT FROM expr */ + -2, /* (211) expr ::= NOT expr */ + -2, /* (212) expr ::= BITNOT expr */ + -2, /* (213) expr ::= PLUS|MINUS expr */ + -3, /* (214) expr ::= expr PTR expr */ + -1, /* (215) between_op ::= BETWEEN */ + -2, /* (216) between_op ::= NOT BETWEEN */ + -5, /* (217) expr ::= expr between_op expr AND expr */ + -1, /* (218) in_op ::= IN */ + -2, /* (219) in_op ::= NOT IN */ + -5, /* (220) expr ::= expr in_op LP exprlist RP */ + -3, /* (221) expr ::= LP select RP */ + -5, /* (222) expr ::= expr in_op LP select RP */ + -5, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (224) expr ::= EXISTS LP select RP */ + -5, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (227) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (228) case_else ::= ELSE expr */ + 0, /* (229) case_else ::= */ + -1, /* (230) case_operand ::= expr */ + 0, /* (231) case_operand ::= */ + 0, /* (232) exprlist ::= */ + -3, /* (233) nexprlist ::= nexprlist COMMA expr */ + -1, /* (234) nexprlist ::= expr */ + 0, /* (235) paren_exprlist ::= */ + -3, /* (236) paren_exprlist ::= LP exprlist RP */ + -12, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (238) uniqueflag ::= UNIQUE */ + 0, /* (239) uniqueflag ::= */ + 0, /* (240) eidlist_opt ::= */ + -3, /* (241) eidlist_opt ::= LP eidlist RP */ + -5, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (243) eidlist ::= nm collate sortorder */ + 0, /* (244) collate ::= */ + -2, /* (245) collate ::= COLLATE ID|STRING */ + -4, /* (246) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (247) cmd ::= VACUUM vinto */ + -3, /* (248) cmd ::= VACUUM nm vinto */ + -2, /* (249) vinto ::= INTO expr */ + 0, /* (250) vinto ::= */ + -3, /* (251) cmd ::= PRAGMA nm dbnm */ + -5, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (260) trigger_time ::= BEFORE|AFTER */ + -2, /* (261) trigger_time ::= INSTEAD OF */ + 0, /* (262) trigger_time ::= */ + -1, /* (263) trigger_event ::= DELETE|INSERT */ + -1, /* (264) trigger_event ::= UPDATE */ + -3, /* (265) trigger_event ::= UPDATE OF idlist */ + 0, /* (266) when_clause ::= */ + -2, /* (267) when_clause ::= WHEN expr */ + -3, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (270) trnm ::= nm DOT nm */ + -3, /* (271) tridxby ::= INDEXED BY nm */ + -2, /* (272) tridxby ::= NOT INDEXED */ + -9, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + -8, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (276) trigger_cmd ::= scanpt select scanpt */ + -4, /* (277) expr ::= RAISE LP IGNORE RP */ + -6, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ + -1, /* (279) raisetype ::= ROLLBACK */ + -1, /* (280) raisetype ::= ABORT */ + -1, /* (281) raisetype ::= FAIL */ + -4, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (284) cmd ::= DETACH database_kw_opt expr */ + 0, /* (285) key_opt ::= */ + -2, /* (286) key_opt ::= KEY expr */ + -1, /* (287) cmd ::= REINDEX */ + -3, /* (288) cmd ::= REINDEX nm dbnm */ + -1, /* (289) cmd ::= ANALYZE */ + -3, /* (290) cmd ::= ANALYZE nm dbnm */ + -6, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -6, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + -1, /* (294) add_column_fullname ::= fullname */ + -8, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (296) cmd ::= create_vtab */ + -4, /* (297) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (299) vtabarg ::= */ + -1, /* (300) vtabargtoken ::= ANY */ + -3, /* (301) vtabargtoken ::= lp anylist RP */ + -1, /* (302) lp ::= LP */ + -2, /* (303) with ::= WITH wqlist */ + -3, /* (304) with ::= WITH RECURSIVE wqlist */ + -1, /* (305) wqas ::= AS */ + -2, /* (306) wqas ::= AS MATERIALIZED */ + -3, /* (307) wqas ::= AS NOT MATERIALIZED */ + -6, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ + -1, /* (309) wqlist ::= wqitem */ + -3, /* (310) wqlist ::= wqlist COMMA wqitem */ + -1, /* (311) windowdefn_list ::= windowdefn */ + -3, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (313) windowdefn ::= nm AS LP window RP */ + -5, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (316) window ::= ORDER BY sortlist frame_opt */ + -5, /* (317) window ::= nm ORDER BY sortlist frame_opt */ + -1, /* (318) window ::= frame_opt */ + -2, /* (319) window ::= nm frame_opt */ + 0, /* (320) frame_opt ::= */ + -3, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (324) frame_bound_s ::= frame_bound */ + -2, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (326) frame_bound_e ::= frame_bound */ + -2, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (329) frame_bound ::= CURRENT ROW */ + 0, /* (330) frame_exclude_opt ::= */ + -2, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (332) frame_exclude ::= NO OTHERS */ + -2, /* (333) frame_exclude ::= CURRENT ROW */ + -1, /* (334) frame_exclude ::= GROUP|TIES */ + -2, /* (335) window_clause ::= WINDOW windowdefn_list */ + -2, /* (336) filter_over ::= filter_clause over_clause */ + -1, /* (337) filter_over ::= over_clause */ + -1, /* (338) filter_over ::= filter_clause */ + -4, /* (339) over_clause ::= OVER LP window RP */ + -2, /* (340) over_clause ::= OVER nm */ + -5, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ + -1, /* (342) input ::= cmdlist */ + -2, /* (343) cmdlist ::= cmdlist ecmd */ + -1, /* (344) cmdlist ::= ecmd */ + -1, /* (345) ecmd ::= SEMI */ + -2, /* (346) ecmd ::= cmdx SEMI */ + -3, /* (347) ecmd ::= explain cmdx SEMI */ + 0, /* (348) trans_opt ::= */ + -1, /* (349) trans_opt ::= TRANSACTION */ + -2, /* (350) trans_opt ::= TRANSACTION nm */ + -1, /* (351) savepoint_opt ::= SAVEPOINT */ + 0, /* (352) savepoint_opt ::= */ + -2, /* (353) cmd ::= create_table create_table_args */ + -1, /* (354) table_option_set ::= table_option */ + -4, /* (355) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (356) columnlist ::= columnname carglist */ + -1, /* (357) nm ::= ID|INDEXED */ + -1, /* (358) nm ::= STRING */ + -1, /* (359) nm ::= JOIN_KW */ + -1, /* (360) typetoken ::= typename */ + -1, /* (361) typename ::= ID|STRING */ + -1, /* (362) signed ::= plus_num */ + -1, /* (363) signed ::= minus_num */ + -2, /* (364) carglist ::= carglist ccons */ + 0, /* (365) carglist ::= */ + -2, /* (366) ccons ::= NULL onconf */ + -4, /* (367) ccons ::= GENERATED ALWAYS AS generated */ + -2, /* (368) ccons ::= AS generated */ + -2, /* (369) conslist_opt ::= COMMA conslist */ + -3, /* (370) conslist ::= conslist tconscomma tcons */ + -1, /* (371) conslist ::= tcons */ + 0, /* (372) tconscomma ::= */ + -1, /* (373) defer_subclause_opt ::= defer_subclause */ + -1, /* (374) resolvetype ::= raisetype */ + -1, /* (375) selectnowith ::= oneselect */ + -1, /* (376) oneselect ::= values */ + -2, /* (377) sclp ::= selcollist COMMA */ + -1, /* (378) as ::= ID|STRING */ + -1, /* (379) indexed_opt ::= indexed_by */ + 0, /* (380) returning ::= */ + -1, /* (381) expr ::= term */ + -1, /* (382) likeop ::= LIKE_KW|MATCH */ + -1, /* (383) exprlist ::= nexprlist */ + -1, /* (384) nmnum ::= plus_num */ + -1, /* (385) nmnum ::= nm */ + -1, /* (386) nmnum ::= ON */ + -1, /* (387) nmnum ::= DELETE */ + -1, /* (388) nmnum ::= DEFAULT */ + -1, /* (389) plus_num ::= INTEGER|FLOAT */ + 0, /* (390) foreach_clause ::= */ + -3, /* (391) foreach_clause ::= FOR EACH ROW */ + -1, /* (392) trnm ::= nm */ + 0, /* (393) tridxby ::= */ + -1, /* (394) database_kw_opt ::= DATABASE */ + 0, /* (395) database_kw_opt ::= */ + 0, /* (396) kwcolumn_opt ::= */ + -1, /* (397) kwcolumn_opt ::= COLUMNKW */ + -1, /* (398) vtabarglist ::= vtabarg */ + -3, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (400) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (401) anylist ::= */ + -4, /* (402) anylist ::= anylist LP anylist RP */ + -2, /* (403) anylist ::= anylist ANY */ + 0, /* (404) with ::= */ +}; + +static void yy_accept(yyParser*); /* Forward Declaration */ + +/* +** Perform a reduce action and the shift that must immediately +** follow the reduce. +** +** The yyLookahead and yyLookaheadToken parameters provide reduce actions +** access to the lookahead token (if any). The yyLookahead will be YYNOCODE +** if the lookahead token has already been consumed. As this procedure is +** only called from one place, optimizing compilers will in-line it, which +** means that the extra parameters have no performance impact. +*/ +static YYACTIONTYPE yy_reduce( + yyParser *yypParser, /* The parser */ + unsigned int yyruleno, /* Number of the rule by which to reduce */ + int yyLookahead, /* Lookahead token, or YYNOCODE if none */ + sqlite3ParserTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ + sqlite3ParserCTX_PDECL /* %extra_context */ +){ + int yygoto; /* The next state */ + YYACTIONTYPE yyact; /* The next action */ + yyStackEntry *yymsp; /* The top of the parser's stack */ + int yysize; /* Amount to pop the stack */ + sqlite3ParserARG_FETCH + (void)yyLookahead; + (void)yyLookaheadToken; + yymsp = yypParser->yytos; + + switch( yyruleno ){ + /* Beginning here are the reduction cases. A typical example + ** follows: + ** case 0: + ** #line + ** { ... } // User supplied code + ** #line + ** break; + */ +/********** Begin reduce actions **********************************************/ + YYMINORTYPE yylhsminor; + case 0: /* explain ::= EXPLAIN */ +{ pParse->explain = 1; } + break; + case 1: /* explain ::= EXPLAIN QUERY PLAN */ +{ pParse->explain = 2; } + break; + case 2: /* cmdx ::= cmd */ +{ sqlite3FinishCoding(pParse); } + break; + case 3: /* cmd ::= BEGIN transtype trans_opt */ +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy394);} + break; + case 4: /* transtype ::= */ +{yymsp[1].minor.yy394 = TK_DEFERRED;} + break; + case 5: /* transtype ::= DEFERRED */ + case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); + case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); + case 323: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==323); +{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/} + break; + case 8: /* cmd ::= COMMIT|END trans_opt */ + case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); +{sqlite3EndTransaction(pParse,yymsp[-1].major);} + break; + case 10: /* cmd ::= SAVEPOINT nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0); +} + break; + case 11: /* cmd ::= RELEASE savepoint_opt nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0); +} + break; + case 12: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ +{ + sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0); +} + break; + case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ +{ + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy394,0,0,yymsp[-2].minor.yy394); +} + break; + case 14: /* createkw ::= CREATE */ +{disableLookaside(pParse);} + break; + case 15: /* ifnotexists ::= */ + case 18: /* temp ::= */ yytestcase(yyruleno==18); + case 47: /* autoinc ::= */ yytestcase(yyruleno==47); + case 62: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==62); + case 72: /* defer_subclause_opt ::= */ yytestcase(yyruleno==72); + case 81: /* ifexists ::= */ yytestcase(yyruleno==81); + case 98: /* distinct ::= */ yytestcase(yyruleno==98); + case 244: /* collate ::= */ yytestcase(yyruleno==244); +{yymsp[1].minor.yy394 = 0;} + break; + case 16: /* ifnotexists ::= IF NOT EXISTS */ +{yymsp[-2].minor.yy394 = 1;} + break; + case 17: /* temp ::= TEMP */ +{yymsp[0].minor.yy394 = pParse->db->init.busy==0;} + break; + case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_option_set */ +{ + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy285,0); +} + break; + case 20: /* create_table_args ::= AS select */ +{ + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy47); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47); +} + break; + case 21: /* table_option_set ::= */ +{yymsp[1].minor.yy285 = 0;} + break; + case 22: /* table_option_set ::= table_option_set COMMA table_option */ +{yylhsminor.yy285 = yymsp[-2].minor.yy285|yymsp[0].minor.yy285;} + yymsp[-2].minor.yy285 = yylhsminor.yy285; + break; + case 23: /* table_option ::= WITHOUT nm */ +{ + if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ + yymsp[-1].minor.yy285 = TF_WithoutRowid | TF_NoVisibleRowid; + }else{ + yymsp[-1].minor.yy285 = 0; + sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); + } +} + break; + case 24: /* table_option ::= nm */ +{ + if( yymsp[0].minor.yy0.n==6 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"strict",6)==0 ){ + yylhsminor.yy285 = TF_Strict; + }else{ + yylhsminor.yy285 = 0; + sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); + } +} + yymsp[0].minor.yy285 = yylhsminor.yy285; + break; + case 25: /* columnname ::= nm typetoken */ +{sqlite3AddColumn(pParse,yymsp[-1].minor.yy0,yymsp[0].minor.yy0);} + break; + case 26: /* typetoken ::= */ + case 65: /* conslist_opt ::= */ yytestcase(yyruleno==65); + case 104: /* as ::= */ yytestcase(yyruleno==104); +{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;} + break; + case 27: /* typetoken ::= typename LP signed RP */ +{ + yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z); +} + break; + case 28: /* typetoken ::= typename LP signed COMMA signed RP */ +{ + yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z); +} + break; + case 29: /* typename ::= typename ID|STRING */ +{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} + break; + case 30: /* scanpt ::= */ +{ + assert( yyLookahead!=YYNOCODE ); + yymsp[1].minor.yy522 = yyLookaheadToken.z; +} + break; + case 31: /* scantok ::= */ +{ + assert( yyLookahead!=YYNOCODE ); + yymsp[1].minor.yy0 = yyLookaheadToken; +} + break; + case 32: /* ccons ::= CONSTRAINT nm */ + case 67: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==67); +{pParse->constraintName = yymsp[0].minor.yy0;} + break; + case 33: /* ccons ::= DEFAULT scantok term */ +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} + break; + case 34: /* ccons ::= DEFAULT LP expr RP */ +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} + break; + case 35: /* ccons ::= DEFAULT PLUS scantok term */ +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} + break; + case 36: /* ccons ::= DEFAULT MINUS scantok term */ +{ + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy528, 0); + sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]); +} + break; + case 37: /* ccons ::= DEFAULT scantok ID|INDEXED */ +{ + Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0); + if( p ){ + sqlite3ExprIdToTrueFalse(p); + testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) ); + } + sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n); +} + break; + case 38: /* ccons ::= NOT NULL onconf */ +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy394);} + break; + case 39: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy394,yymsp[0].minor.yy394,yymsp[-2].minor.yy394);} + break; + case 40: /* ccons ::= UNIQUE onconf */ +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy394,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} + break; + case 41: /* ccons ::= CHECK LP expr RP */ +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);} + break; + case 42: /* ccons ::= REFERENCES nm eidlist_opt refargs */ +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy322,yymsp[0].minor.yy394);} + break; + case 43: /* ccons ::= defer_subclause */ +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy394);} + break; + case 44: /* ccons ::= COLLATE ID|STRING */ +{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} + break; + case 45: /* generated ::= LP expr RP */ +{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy528,0);} + break; + case 46: /* generated ::= LP expr RP ID */ +{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy528,&yymsp[0].minor.yy0);} + break; + case 48: /* autoinc ::= AUTOINCR */ +{yymsp[0].minor.yy394 = 1;} + break; + case 49: /* refargs ::= */ +{ yymsp[1].minor.yy394 = OE_None*0x0101; /* EV: R-19803-45884 */} + break; + case 50: /* refargs ::= refargs refarg */ +{ yymsp[-1].minor.yy394 = (yymsp[-1].minor.yy394 & ~yymsp[0].minor.yy231.mask) | yymsp[0].minor.yy231.value; } + break; + case 51: /* refarg ::= MATCH nm */ +{ yymsp[-1].minor.yy231.value = 0; yymsp[-1].minor.yy231.mask = 0x000000; } + break; + case 52: /* refarg ::= ON INSERT refact */ +{ yymsp[-2].minor.yy231.value = 0; yymsp[-2].minor.yy231.mask = 0x000000; } + break; + case 53: /* refarg ::= ON DELETE refact */ +{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394; yymsp[-2].minor.yy231.mask = 0x0000ff; } + break; + case 54: /* refarg ::= ON UPDATE refact */ +{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394<<8; yymsp[-2].minor.yy231.mask = 0x00ff00; } + break; + case 55: /* refact ::= SET NULL */ +{ yymsp[-1].minor.yy394 = OE_SetNull; /* EV: R-33326-45252 */} + break; + case 56: /* refact ::= SET DEFAULT */ +{ yymsp[-1].minor.yy394 = OE_SetDflt; /* EV: R-33326-45252 */} + break; + case 57: /* refact ::= CASCADE */ +{ yymsp[0].minor.yy394 = OE_Cascade; /* EV: R-33326-45252 */} + break; + case 58: /* refact ::= RESTRICT */ +{ yymsp[0].minor.yy394 = OE_Restrict; /* EV: R-33326-45252 */} + break; + case 59: /* refact ::= NO ACTION */ +{ yymsp[-1].minor.yy394 = OE_None; /* EV: R-33326-45252 */} + break; + case 60: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ +{yymsp[-2].minor.yy394 = 0;} + break; + case 61: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + case 76: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==76); + case 171: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==171); +{yymsp[-1].minor.yy394 = yymsp[0].minor.yy394;} + break; + case 63: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ + case 80: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==80); + case 216: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==216); + case 219: /* in_op ::= NOT IN */ yytestcase(yyruleno==219); + case 245: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==245); +{yymsp[-1].minor.yy394 = 1;} + break; + case 64: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ +{yymsp[-1].minor.yy394 = 0;} + break; + case 66: /* tconscomma ::= COMMA */ +{pParse->constraintName.n = 0;} + break; + case 68: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy322,yymsp[0].minor.yy394,yymsp[-2].minor.yy394,0);} + break; + case 69: /* tcons ::= UNIQUE LP sortlist RP onconf */ +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy322,yymsp[0].minor.yy394,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} + break; + case 70: /* tcons ::= CHECK LP expr RP onconf */ +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy528,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);} + break; + case 71: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ +{ + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy322, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[-1].minor.yy394); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy394); +} + break; + case 73: /* onconf ::= */ + case 75: /* orconf ::= */ yytestcase(yyruleno==75); +{yymsp[1].minor.yy394 = OE_Default;} + break; + case 74: /* onconf ::= ON CONFLICT resolvetype */ +{yymsp[-2].minor.yy394 = yymsp[0].minor.yy394;} + break; + case 77: /* resolvetype ::= IGNORE */ +{yymsp[0].minor.yy394 = OE_Ignore;} + break; + case 78: /* resolvetype ::= REPLACE */ + case 172: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==172); +{yymsp[0].minor.yy394 = OE_Replace;} + break; + case 79: /* cmd ::= DROP TABLE ifexists fullname */ +{ + sqlite3DropTable(pParse, yymsp[0].minor.yy131, 0, yymsp[-1].minor.yy394); +} + break; + case 82: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ +{ + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[0].minor.yy47, yymsp[-7].minor.yy394, yymsp[-5].minor.yy394); +} + break; + case 83: /* cmd ::= DROP VIEW ifexists fullname */ +{ + sqlite3DropTable(pParse, yymsp[0].minor.yy131, 1, yymsp[-1].minor.yy394); +} + break; + case 84: /* cmd ::= select */ +{ + SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0, 0}; + sqlite3Select(pParse, yymsp[0].minor.yy47, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47); +} + break; + case 85: /* select ::= WITH wqlist selectnowith */ +{yymsp[-2].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);} + break; + case 86: /* select ::= WITH RECURSIVE wqlist selectnowith */ +{yymsp[-3].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);} + break; + case 87: /* select ::= selectnowith */ +{ + Select *p = yymsp[0].minor.yy47; + if( p ){ + parserDoubleLinkSelect(pParse, p); + } + yymsp[0].minor.yy47 = p; /*A-overwrites-X*/ +} + break; + case 88: /* selectnowith ::= selectnowith multiselect_op oneselect */ +{ + Select *pRhs = yymsp[0].minor.yy47; + Select *pLhs = yymsp[-2].minor.yy47; + if( pRhs && pRhs->pPrior ){ + SrcList *pFrom; + Token x; + x.n = 0; + parserDoubleLinkSelect(pParse, pRhs); + pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0); + pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); + } + if( pRhs ){ + pRhs->op = (u8)yymsp[-1].minor.yy394; + pRhs->pPrior = pLhs; + if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; + pRhs->selFlags &= ~SF_MultiValue; + if( yymsp[-1].minor.yy394!=TK_ALL ) pParse->hasCompound = 1; + }else{ + sqlite3SelectDelete(pParse->db, pLhs); + } + yymsp[-2].minor.yy47 = pRhs; +} + break; + case 89: /* multiselect_op ::= UNION */ + case 91: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==91); +{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-OP*/} + break; + case 90: /* multiselect_op ::= UNION ALL */ +{yymsp[-1].minor.yy394 = TK_ALL;} + break; + case 92: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ +{ + yymsp[-8].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy322,yymsp[-5].minor.yy131,yymsp[-4].minor.yy528,yymsp[-3].minor.yy322,yymsp[-2].minor.yy528,yymsp[-1].minor.yy322,yymsp[-7].minor.yy394,yymsp[0].minor.yy528); +} + break; + case 93: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ +{ + yymsp[-9].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy322,yymsp[-6].minor.yy131,yymsp[-5].minor.yy528,yymsp[-4].minor.yy322,yymsp[-3].minor.yy528,yymsp[-1].minor.yy322,yymsp[-8].minor.yy394,yymsp[0].minor.yy528); + if( yymsp[-9].minor.yy47 ){ + yymsp[-9].minor.yy47->pWinDefn = yymsp[-2].minor.yy41; + }else{ + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy41); + } +} + break; + case 94: /* values ::= VALUES LP nexprlist RP */ +{ + yymsp[-3].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values,0); +} + break; + case 95: /* values ::= values COMMA LP nexprlist RP */ +{ + Select *pRight, *pLeft = yymsp[-4].minor.yy47; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values|SF_MultiValue,0); + if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; + if( pRight ){ + pRight->op = TK_ALL; + pRight->pPrior = pLeft; + yymsp[-4].minor.yy47 = pRight; + }else{ + yymsp[-4].minor.yy47 = pLeft; + } +} + break; + case 96: /* distinct ::= DISTINCT */ +{yymsp[0].minor.yy394 = SF_Distinct;} + break; + case 97: /* distinct ::= ALL */ +{yymsp[0].minor.yy394 = SF_All;} + break; + case 99: /* sclp ::= */ + case 132: /* orderby_opt ::= */ yytestcase(yyruleno==132); + case 142: /* groupby_opt ::= */ yytestcase(yyruleno==142); + case 232: /* exprlist ::= */ yytestcase(yyruleno==232); + case 235: /* paren_exprlist ::= */ yytestcase(yyruleno==235); + case 240: /* eidlist_opt ::= */ yytestcase(yyruleno==240); +{yymsp[1].minor.yy322 = 0;} + break; + case 100: /* selcollist ::= sclp scanpt expr scanpt as */ +{ + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy322,yymsp[-3].minor.yy522,yymsp[-1].minor.yy522); +} + break; + case 101: /* selcollist ::= sclp scanpt STAR */ +{ + Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); + yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy322, p); +} + break; + case 102: /* selcollist ::= sclp scanpt nm DOT STAR */ +{ + Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); + Expr *pLeft = tokenExpr(pParse, TK_ID, yymsp[-2].minor.yy0); + Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, pDot); +} + break; + case 103: /* as ::= AS nm */ + case 115: /* dbnm ::= DOT nm */ yytestcase(yyruleno==115); + case 256: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==256); + case 257: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==257); +{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 105: /* from ::= */ + case 108: /* stl_prefix ::= */ yytestcase(yyruleno==108); +{yymsp[1].minor.yy131 = 0;} + break; + case 106: /* from ::= FROM seltablist */ +{ + yymsp[-1].minor.yy131 = yymsp[0].minor.yy131; + sqlite3SrcListShiftJoinType(pParse,yymsp[-1].minor.yy131); +} + break; + case 107: /* stl_prefix ::= seltablist joinop */ +{ + if( ALWAYS(yymsp[-1].minor.yy131 && yymsp[-1].minor.yy131->nSrc>0) ) yymsp[-1].minor.yy131->a[yymsp[-1].minor.yy131->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy394; +} + break; + case 109: /* seltablist ::= stl_prefix nm dbnm as on_using */ +{ + yymsp[-4].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-4].minor.yy131,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); +} + break; + case 110: /* seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ +{ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,0,&yymsp[0].minor.yy561); + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-1].minor.yy0); +} + break; + case 111: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ +{ + yymsp[-7].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy131,&yymsp[-6].minor.yy0,&yymsp[-5].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy131, yymsp[-3].minor.yy322); +} + break; + case 112: /* seltablist ::= stl_prefix LP select RP as on_using */ +{ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,yymsp[-3].minor.yy47,&yymsp[0].minor.yy561); + } + break; + case 113: /* seltablist ::= stl_prefix LP seltablist RP as on_using */ +{ + if( yymsp[-5].minor.yy131==0 && yymsp[-1].minor.yy0.n==0 && yymsp[0].minor.yy561.pOn==0 && yymsp[0].minor.yy561.pUsing==0 ){ + yymsp[-5].minor.yy131 = yymsp[-3].minor.yy131; + }else if( yymsp[-3].minor.yy131->nSrc==1 ){ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + if( yymsp[-5].minor.yy131 ){ + SrcItem *pNew = &yymsp[-5].minor.yy131->a[yymsp[-5].minor.yy131->nSrc-1]; + SrcItem *pOld = yymsp[-3].minor.yy131->a; + pNew->zName = pOld->zName; + pNew->zDatabase = pOld->zDatabase; + pNew->pSelect = pOld->pSelect; + if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){ + pNew->fg.isNestedFrom = 1; + } + if( pOld->fg.isTabFunc ){ + pNew->u1.pFuncArg = pOld->u1.pFuncArg; + pOld->u1.pFuncArg = 0; + pOld->fg.isTabFunc = 0; + pNew->fg.isTabFunc = 1; + } + pOld->zName = pOld->zDatabase = 0; + pOld->pSelect = 0; + } + sqlite3SrcListDelete(pParse->db, yymsp[-3].minor.yy131); + }else{ + Select *pSubquery; + sqlite3SrcListShiftJoinType(pParse,yymsp[-3].minor.yy131); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-3].minor.yy131,0,0,0,0,SF_NestedFrom,0); + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,pSubquery,&yymsp[0].minor.yy561); + } + } + break; + case 114: /* dbnm ::= */ + case 129: /* indexed_opt ::= */ yytestcase(yyruleno==129); +{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} + break; + case 116: /* fullname ::= nm */ +{ + yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); + if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); +} + yymsp[0].minor.yy131 = yylhsminor.yy131; + break; + case 117: /* fullname ::= nm DOT nm */ +{ + yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); +} + yymsp[-2].minor.yy131 = yylhsminor.yy131; + break; + case 118: /* xfullname ::= nm */ +{yymsp[0].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} + break; + case 119: /* xfullname ::= nm DOT nm */ +{yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 120: /* xfullname ::= nm DOT nm AS nm */ +{ + yymsp[-4].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy131 ) yymsp[-4].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); +} + break; + case 121: /* xfullname ::= nm AS nm */ +{ + yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy131 ) yymsp[-2].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); +} + break; + case 122: /* joinop ::= COMMA|JOIN */ +{ yymsp[0].minor.yy394 = JT_INNER; } + break; + case 123: /* joinop ::= JOIN_KW JOIN */ +{yymsp[-1].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} + break; + case 124: /* joinop ::= JOIN_KW nm JOIN */ +{yymsp[-2].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} + break; + case 125: /* joinop ::= JOIN_KW nm nm JOIN */ +{yymsp[-3].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} + break; + case 126: /* on_using ::= ON expr */ +{yymsp[-1].minor.yy561.pOn = yymsp[0].minor.yy528; yymsp[-1].minor.yy561.pUsing = 0;} + break; + case 127: /* on_using ::= USING LP idlist RP */ +{yymsp[-3].minor.yy561.pOn = 0; yymsp[-3].minor.yy561.pUsing = yymsp[-1].minor.yy254;} + break; + case 128: /* on_using ::= */ +{yymsp[1].minor.yy561.pOn = 0; yymsp[1].minor.yy561.pUsing = 0;} + break; + case 130: /* indexed_by ::= INDEXED BY nm */ +{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 131: /* indexed_by ::= NOT INDEXED */ +{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} + break; + case 133: /* orderby_opt ::= ORDER BY sortlist */ + case 143: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==143); +{yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;} + break; + case 134: /* sortlist ::= sortlist COMMA expr sortorder nulls */ +{ + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322,yymsp[-2].minor.yy528); + sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394); +} + break; + case 135: /* sortlist ::= expr sortorder nulls */ +{ + yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy528); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394); +} + break; + case 136: /* sortorder ::= ASC */ +{yymsp[0].minor.yy394 = SQLITE_SO_ASC;} + break; + case 137: /* sortorder ::= DESC */ +{yymsp[0].minor.yy394 = SQLITE_SO_DESC;} + break; + case 138: /* sortorder ::= */ + case 141: /* nulls ::= */ yytestcase(yyruleno==141); +{yymsp[1].minor.yy394 = SQLITE_SO_UNDEFINED;} + break; + case 139: /* nulls ::= NULLS FIRST */ +{yymsp[-1].minor.yy394 = SQLITE_SO_ASC;} + break; + case 140: /* nulls ::= NULLS LAST */ +{yymsp[-1].minor.yy394 = SQLITE_SO_DESC;} + break; + case 144: /* having_opt ::= */ + case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); + case 151: /* where_opt ::= */ yytestcase(yyruleno==151); + case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); + case 229: /* case_else ::= */ yytestcase(yyruleno==229); + case 231: /* case_operand ::= */ yytestcase(yyruleno==231); + case 250: /* vinto ::= */ yytestcase(yyruleno==250); +{yymsp[1].minor.yy528 = 0;} + break; + case 145: /* having_opt ::= HAVING expr */ + case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); + case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); + case 228: /* case_else ::= ELSE expr */ yytestcase(yyruleno==228); + case 249: /* vinto ::= INTO expr */ yytestcase(yyruleno==249); +{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} + break; + case 147: /* limit_opt ::= LIMIT expr */ +{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,0);} + break; + case 148: /* limit_opt ::= LIMIT expr OFFSET expr */ +{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} + break; + case 149: /* limit_opt ::= LIMIT expr COMMA expr */ +{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,yymsp[-2].minor.yy528);} + break; + case 150: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret orderby_opt limit_opt */ +{ + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy131, &yymsp[-3].minor.yy0); +#ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( yymsp[-1].minor.yy322 || yymsp[0].minor.yy528 ){ + updateDeleteLimitError(pParse,yymsp[-1].minor.yy322,yymsp[0].minor.yy528); + yymsp[-1].minor.yy322 = 0; + yymsp[0].minor.yy528 = 0; + } +#endif + sqlite3DeleteFrom(pParse,yymsp[-4].minor.yy131,yymsp[-2].minor.yy528,yymsp[-1].minor.yy322,yymsp[0].minor.yy528); +} + break; + case 155: /* where_opt_ret ::= RETURNING selcollist */ +{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-1].minor.yy528 = 0;} + break; + case 156: /* where_opt_ret ::= WHERE expr RETURNING selcollist */ +{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-3].minor.yy528 = yymsp[-2].minor.yy528;} + break; + case 157: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret orderby_opt limit_opt */ +{ + sqlite3SrcListIndexedBy(pParse, yymsp[-7].minor.yy131, &yymsp[-6].minor.yy0); + if( yymsp[-3].minor.yy131 ){ + SrcList *pFromClause = yymsp[-3].minor.yy131; + if( pFromClause->nSrc>1 ){ + Select *pSubquery; + Token as; + pSubquery = sqlite3SelectNew(pParse,0,pFromClause,0,0,0,0,SF_NestedFrom,0); + as.n = 0; + as.z = 0; + pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); + } + yymsp[-7].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-7].minor.yy131, pFromClause); + } + sqlite3ExprListCheckLength(pParse,yymsp[-4].minor.yy322,"set list"); +#ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( yymsp[-1].minor.yy322 || yymsp[0].minor.yy528 ){ + updateDeleteLimitError(pParse,yymsp[-1].minor.yy322,yymsp[0].minor.yy528); + yymsp[-1].minor.yy322 = 0; + yymsp[0].minor.yy528 = 0; + } +#endif + sqlite3Update(pParse,yymsp[-7].minor.yy131,yymsp[-4].minor.yy322,yymsp[-2].minor.yy528,yymsp[-8].minor.yy394,yymsp[-1].minor.yy322,yymsp[0].minor.yy528,0); +} + break; + case 158: /* setlist ::= setlist COMMA nm EQ expr */ +{ + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[0].minor.yy528); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, 1); +} + break; + case 159: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ +{ + yymsp[-6].minor.yy322 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy322, yymsp[-3].minor.yy254, yymsp[0].minor.yy528); +} + break; + case 160: /* setlist ::= nm EQ expr */ +{ + yylhsminor.yy322 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy528); + sqlite3ExprListSetName(pParse, yylhsminor.yy322, &yymsp[-2].minor.yy0, 1); +} + yymsp[-2].minor.yy322 = yylhsminor.yy322; + break; + case 161: /* setlist ::= LP idlist RP EQ expr */ +{ + yymsp[-4].minor.yy322 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy528); +} + break; + case 162: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ +{ + sqlite3Insert(pParse, yymsp[-3].minor.yy131, yymsp[-1].minor.yy47, yymsp[-2].minor.yy254, yymsp[-5].minor.yy394, yymsp[0].minor.yy444); +} + break; + case 163: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ +{ + sqlite3Insert(pParse, yymsp[-4].minor.yy131, 0, yymsp[-3].minor.yy254, yymsp[-6].minor.yy394, 0); +} + break; + case 164: /* upsert ::= */ +{ yymsp[1].minor.yy444 = 0; } + break; + case 165: /* upsert ::= RETURNING selcollist */ +{ yymsp[-1].minor.yy444 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy322); } + break; + case 166: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ +{ yymsp[-11].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy322,yymsp[-6].minor.yy528,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,yymsp[0].minor.yy444);} + break; + case 167: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ +{ yymsp[-8].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy322,yymsp[-3].minor.yy528,0,0,yymsp[0].minor.yy444); } + break; + case 168: /* upsert ::= ON CONFLICT DO NOTHING returning */ +{ yymsp[-4].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); } + break; + case 169: /* upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ +{ yymsp[-7].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,0);} + break; + case 170: /* returning ::= RETURNING selcollist */ +{sqlite3AddReturning(pParse,yymsp[0].minor.yy322);} + break; + case 173: /* idlist_opt ::= */ +{yymsp[1].minor.yy254 = 0;} + break; + case 174: /* idlist_opt ::= LP idlist RP */ +{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;} + break; + case 175: /* idlist ::= idlist COMMA nm */ +{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} + break; + case 176: /* idlist ::= nm */ +{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} + break; + case 177: /* expr ::= LP expr RP */ +{yymsp[-2].minor.yy528 = yymsp[-1].minor.yy528;} + break; + case 178: /* expr ::= ID|INDEXED */ + case 179: /* expr ::= JOIN_KW */ yytestcase(yyruleno==179); +{yymsp[0].minor.yy528=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 180: /* expr ::= nm DOT nm */ +{ + Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0); + Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); + yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); +} + yymsp[-2].minor.yy528 = yylhsminor.yy528; + break; + case 181: /* expr ::= nm DOT nm DOT nm */ +{ + Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-4].minor.yy0); + Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0); + Expr *temp3 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); + Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, 0, temp1); + } + yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); +} + yymsp[-4].minor.yy528 = yylhsminor.yy528; + break; + case 182: /* term ::= NULL|FLOAT|BLOB */ + case 183: /* term ::= STRING */ yytestcase(yyruleno==183); +{yymsp[0].minor.yy528=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 184: /* term ::= INTEGER */ +{ + yylhsminor.yy528 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + if( yylhsminor.yy528 ) yylhsminor.yy528->w.iOfst = (int)(yymsp[0].minor.yy0.z - pParse->zTail); +} + yymsp[0].minor.yy528 = yylhsminor.yy528; + break; + case 185: /* expr ::= VARIABLE */ +{ + if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ + u32 n = yymsp[0].minor.yy0.n; + yymsp[0].minor.yy528 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy528, n); + }else{ + /* When doing a nested parse, one can include terms in an expression + ** that look like this: #1 #2 ... These terms refer to registers + ** in the virtual machine. #N is the N-th register. */ + Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/ + assert( t.n>=2 ); + if( pParse->nested==0 ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); + yymsp[0].minor.yy528 = 0; + }else{ + yymsp[0].minor.yy528 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy528 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy528->iTable); + } + } +} + break; + case 186: /* expr ::= expr COLLATE ID|STRING */ +{ + yymsp[-2].minor.yy528 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy528, &yymsp[0].minor.yy0, 1); +} + break; + case 187: /* expr ::= CAST LP expr AS typetoken RP */ +{ + yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy528, yymsp[-3].minor.yy528, 0); +} + break; + case 188: /* expr ::= ID|INDEXED LP distinct exprlist RP */ +{ + yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy394); +} + yymsp[-4].minor.yy528 = yylhsminor.yy528; + break; + case 189: /* expr ::= ID|INDEXED LP STAR RP */ +{ + yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); +} + yymsp[-3].minor.yy528 = yylhsminor.yy528; + break; + case 190: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ +{ + yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy322, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy394); + sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41); +} + yymsp[-5].minor.yy528 = yylhsminor.yy528; + break; + case 191: /* expr ::= ID|INDEXED LP STAR RP filter_over */ +{ + yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); + sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41); +} + yymsp[-4].minor.yy528 = yylhsminor.yy528; + break; + case 192: /* term ::= CTIME_KW */ +{ + yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); +} + yymsp[0].minor.yy528 = yylhsminor.yy528; + break; + case 193: /* expr ::= LP nexprlist COMMA expr RP */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy528 ){ + yymsp[-4].minor.yy528->x.pList = pList; + if( ALWAYS(pList->nExpr) ){ + yymsp[-4].minor.yy528->flags |= pList->a[0].pExpr->flags & EP_Propagate; + } + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + break; + case 194: /* expr ::= expr AND expr */ +{yymsp[-2].minor.yy528=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} + break; + case 195: /* expr ::= expr OR expr */ + case 196: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==196); + case 197: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==197); + case 198: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==198); + case 199: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==199); + case 200: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==200); + case 201: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==201); +{yymsp[-2].minor.yy528=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} + break; + case 202: /* likeop ::= NOT LIKE_KW|MATCH */ +{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} + break; + case 203: /* expr ::= expr likeop expr */ +{ + ExprList *pList; + int bNot = yymsp[-1].minor.yy0.n & 0x80000000; + yymsp[-1].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy528); + yymsp[-2].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + if( bNot ) yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy528, 0); + if( yymsp[-2].minor.yy528 ) yymsp[-2].minor.yy528->flags |= EP_InfixFunc; +} + break; + case 204: /* expr ::= expr likeop expr ESCAPE expr */ +{ + ExprList *pList; + int bNot = yymsp[-3].minor.yy0.n & 0x80000000; + yymsp[-3].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); + if( bNot ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + if( yymsp[-4].minor.yy528 ) yymsp[-4].minor.yy528->flags |= EP_InfixFunc; +} + break; + case 205: /* expr ::= expr ISNULL|NOTNULL */ +{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy528,0);} + break; + case 206: /* expr ::= expr NOT NULL */ +{yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy528,0);} + break; + case 207: /* expr ::= expr IS expr */ +{ + yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-2].minor.yy528, TK_ISNULL); +} + break; + case 208: /* expr ::= expr IS NOT expr */ +{ + yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-3].minor.yy528, TK_NOTNULL); +} + break; + case 209: /* expr ::= expr IS NOT DISTINCT FROM expr */ +{ + yymsp[-5].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-5].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-5].minor.yy528, TK_ISNULL); +} + break; + case 210: /* expr ::= expr IS DISTINCT FROM expr */ +{ + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-4].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-4].minor.yy528, TK_NOTNULL); +} + break; + case 211: /* expr ::= NOT expr */ + case 212: /* expr ::= BITNOT expr */ yytestcase(yyruleno==212); +{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy528, 0);/*A-overwrites-B*/} + break; + case 213: /* expr ::= PLUS|MINUS expr */ +{ + yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy528, 0); + /*A-overwrites-B*/ +} + break; + case 214: /* expr ::= expr PTR expr */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy528); + pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy528); + yylhsminor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); +} + yymsp[-2].minor.yy528 = yylhsminor.yy528; + break; + case 215: /* between_op ::= BETWEEN */ + case 218: /* in_op ::= IN */ yytestcase(yyruleno==218); +{yymsp[0].minor.yy394 = 0;} + break; + case 217: /* expr ::= expr between_op expr AND expr */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy528, 0); + if( yymsp[-4].minor.yy528 ){ + yymsp[-4].minor.yy528->x.pList = pList; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); +} + break; + case 220: /* expr ::= expr in_op LP exprlist RP */ +{ + if( yymsp[-1].minor.yy322==0 ){ + /* Expressions of the form + ** + ** expr1 IN () + ** expr1 NOT IN () + ** + ** simplify to constants 0 (false) and 1 (true), respectively, + ** regardless of the value of expr1. + */ + sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy528); + yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_STRING, yymsp[-3].minor.yy394 ? "true" : "false"); + if( yymsp[-4].minor.yy528 ) sqlite3ExprIdToTrueFalse(yymsp[-4].minor.yy528); + }else{ + Expr *pRHS = yymsp[-1].minor.yy322->a[0].pExpr; + if( yymsp[-1].minor.yy322->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy528->op!=TK_VECTOR ){ + yymsp[-1].minor.yy322->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); + pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy528, pRHS); + }else{ + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); + if( yymsp[-4].minor.yy528==0 ){ + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); + }else if( yymsp[-4].minor.yy528->pLeft->op==TK_VECTOR ){ + int nExpr = yymsp[-4].minor.yy528->pLeft->x.pList->nExpr; + Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, yymsp[-1].minor.yy322); + if( pSelectRHS ){ + parserDoubleLinkSelect(pParse, pSelectRHS); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelectRHS); + } + }else{ + yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy322; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); + } + } + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + } + } + break; + case 221: /* expr ::= LP select RP */ +{ + yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy528, yymsp[-1].minor.yy47); + } + break; + case 222: /* expr ::= expr in_op LP select RP */ +{ + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, yymsp[-1].minor.yy47); + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + } + break; + case 223: /* expr ::= expr in_op nm dbnm paren_exprlist */ +{ + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); + Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); + if( yymsp[0].minor.yy322 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy322); + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelect); + if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + } + break; + case 224: /* expr ::= EXISTS LP select RP */ +{ + Expr *p; + p = yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy47); + } + break; + case 225: /* expr ::= CASE case_operand case_exprlist case_else END */ +{ + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy528, 0); + if( yymsp[-4].minor.yy528 ){ + yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy528 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528) : yymsp[-2].minor.yy322; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); + }else{ + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy322); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528); + } +} + break; + case 226: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ +{ + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); + yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy528); +} + break; + case 227: /* case_exprlist ::= WHEN expr THEN expr */ +{ + yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); + yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy528); +} + break; + case 230: /* case_operand ::= expr */ +{yymsp[0].minor.yy528 = yymsp[0].minor.yy528; /*A-overwrites-X*/} + break; + case 233: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy528);} + break; + case 234: /* nexprlist ::= expr */ +{yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy528); /*A-overwrites-Y*/} + break; + case 236: /* paren_exprlist ::= LP exprlist RP */ + case 241: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==241); +{yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;} + break; + case 237: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ +{ + sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy394, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy528, SQLITE_SO_ASC, yymsp[-8].minor.yy394, SQLITE_IDXTYPE_APPDEF); + if( IN_RENAME_OBJECT && pParse->pNewIndex ){ + sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); + } +} + break; + case 238: /* uniqueflag ::= UNIQUE */ + case 280: /* raisetype ::= ABORT */ yytestcase(yyruleno==280); +{yymsp[0].minor.yy394 = OE_Abort;} + break; + case 239: /* uniqueflag ::= */ +{yymsp[1].minor.yy394 = OE_None;} + break; + case 242: /* eidlist ::= eidlist COMMA nm collate sortorder */ +{ + yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); +} + break; + case 243: /* eidlist ::= nm collate sortorder */ +{ + yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); /*A-overwrites-Y*/ +} + break; + case 246: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy131, yymsp[-1].minor.yy394);} + break; + case 247: /* cmd ::= VACUUM vinto */ +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy528);} + break; + case 248: /* cmd ::= VACUUM nm vinto */ +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy528);} + break; + case 251: /* cmd ::= PRAGMA nm dbnm */ +{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} + break; + case 252: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} + break; + case 253: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ +{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} + break; + case 254: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ +{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} + break; + case 255: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ +{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} + break; + case 258: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ +{ + Token all; + all.z = yymsp[-3].minor.yy0.z; + all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy33, &all); +} + break; + case 259: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ +{ + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy394, yymsp[-4].minor.yy180.a, yymsp[-4].minor.yy180.b, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, yymsp[-10].minor.yy394, yymsp[-8].minor.yy394); + yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ +} + break; + case 260: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/ } + break; + case 261: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy394 = TK_INSTEAD;} + break; + case 262: /* trigger_time ::= */ +{ yymsp[1].minor.yy394 = TK_BEFORE; } + break; + case 263: /* trigger_event ::= DELETE|INSERT */ + case 264: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==264); +{yymsp[0].minor.yy180.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy180.b = 0;} + break; + case 265: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy180.a = TK_UPDATE; yymsp[-2].minor.yy180.b = yymsp[0].minor.yy254;} + break; + case 266: /* when_clause ::= */ + case 285: /* key_opt ::= */ yytestcase(yyruleno==285); +{ yymsp[1].minor.yy528 = 0; } + break; + case 267: /* when_clause ::= WHEN expr */ + case 286: /* key_opt ::= KEY expr */ yytestcase(yyruleno==286); +{ yymsp[-1].minor.yy528 = yymsp[0].minor.yy528; } + break; + case 268: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ +{ + assert( yymsp[-2].minor.yy33!=0 ); + yymsp[-2].minor.yy33->pLast->pNext = yymsp[-1].minor.yy33; + yymsp[-2].minor.yy33->pLast = yymsp[-1].minor.yy33; +} + break; + case 269: /* trigger_cmd_list ::= trigger_cmd SEMI */ +{ + assert( yymsp[-1].minor.yy33!=0 ); + yymsp[-1].minor.yy33->pLast = yymsp[-1].minor.yy33; +} + break; + case 270: /* trnm ::= nm DOT nm */ +{ + yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; + sqlite3ErrorMsg(pParse, + "qualified table names are not allowed on INSERT, UPDATE, and DELETE " + "statements within triggers"); +} + break; + case 271: /* tridxby ::= INDEXED BY nm */ +{ + sqlite3ErrorMsg(pParse, + "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " + "within triggers"); +} + break; + case 272: /* tridxby ::= NOT INDEXED */ +{ + sqlite3ErrorMsg(pParse, + "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " + "within triggers"); +} + break; + case 273: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ +{yylhsminor.yy33 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy131, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528, yymsp[-7].minor.yy394, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy522);} + yymsp[-8].minor.yy33 = yylhsminor.yy33; + break; + case 274: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ +{ + yylhsminor.yy33 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy254,yymsp[-2].minor.yy47,yymsp[-6].minor.yy394,yymsp[-1].minor.yy444,yymsp[-7].minor.yy522,yymsp[0].minor.yy522);/*yylhsminor.yy33-overwrites-yymsp[-6].minor.yy394*/ +} + yymsp[-7].minor.yy33 = yylhsminor.yy33; + break; + case 275: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy33 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy528, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy522);} + yymsp[-5].minor.yy33 = yylhsminor.yy33; + break; + case 276: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy33 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy47, yymsp[-2].minor.yy522, yymsp[0].minor.yy522); /*yylhsminor.yy33-overwrites-yymsp[-1].minor.yy47*/} + yymsp[-2].minor.yy33 = yylhsminor.yy33; + break; + case 277: /* expr ::= RAISE LP IGNORE RP */ +{ + yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy528 ){ + yymsp[-3].minor.yy528->affExpr = OE_Ignore; + } +} + break; + case 278: /* expr ::= RAISE LP raisetype COMMA nm RP */ +{ + yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + if( yymsp[-5].minor.yy528 ) { + yymsp[-5].minor.yy528->affExpr = (char)yymsp[-3].minor.yy394; + } +} + break; + case 279: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy394 = OE_Rollback;} + break; + case 281: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy394 = OE_Fail;} + break; + case 282: /* cmd ::= DROP TRIGGER ifexists fullname */ +{ + sqlite3DropTrigger(pParse,yymsp[0].minor.yy131,yymsp[-1].minor.yy394); +} + break; + case 283: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ +{ + sqlite3Attach(pParse, yymsp[-3].minor.yy528, yymsp[-1].minor.yy528, yymsp[0].minor.yy528); +} + break; + case 284: /* cmd ::= DETACH database_kw_opt expr */ +{ + sqlite3Detach(pParse, yymsp[0].minor.yy528); +} + break; + case 287: /* cmd ::= REINDEX */ +{sqlite3Reindex(pParse, 0, 0);} + break; + case 288: /* cmd ::= REINDEX nm dbnm */ +{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} + break; + case 289: /* cmd ::= ANALYZE */ +{sqlite3Analyze(pParse, 0, 0);} + break; + case 290: /* cmd ::= ANALYZE nm dbnm */ +{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} + break; + case 291: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ +{ + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy131,&yymsp[0].minor.yy0); +} + break; + case 292: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ +{ + yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; + sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); +} + break; + case 293: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ +{ + sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy131, &yymsp[0].minor.yy0); +} + break; + case 294: /* add_column_fullname ::= fullname */ +{ + disableLookaside(pParse); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy131); +} + break; + case 295: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ +{ + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy131, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); +} + break; + case 296: /* cmd ::= create_vtab */ +{sqlite3VtabFinishParse(pParse,0);} + break; + case 297: /* cmd ::= create_vtab LP vtabarglist RP */ +{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} + break; + case 298: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ +{ + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy394); +} + break; + case 299: /* vtabarg ::= */ +{sqlite3VtabArgInit(pParse);} + break; + case 300: /* vtabargtoken ::= ANY */ + case 301: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==301); + case 302: /* lp ::= LP */ yytestcase(yyruleno==302); +{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} + break; + case 303: /* with ::= WITH wqlist */ + case 304: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==304); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy521, 1); } + break; + case 305: /* wqas ::= AS */ +{yymsp[0].minor.yy516 = M10d_Any;} + break; + case 306: /* wqas ::= AS MATERIALIZED */ +{yymsp[-1].minor.yy516 = M10d_Yes;} + break; + case 307: /* wqas ::= AS NOT MATERIALIZED */ +{yymsp[-2].minor.yy516 = M10d_No;} + break; + case 308: /* wqitem ::= nm eidlist_opt wqas LP select RP */ +{ + yymsp[-5].minor.yy385 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy47, yymsp[-3].minor.yy516); /*A-overwrites-X*/ +} + break; + case 309: /* wqlist ::= wqitem */ +{ + yymsp[0].minor.yy521 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy385); /*A-overwrites-X*/ +} + break; + case 310: /* wqlist ::= wqlist COMMA wqitem */ +{ + yymsp[-2].minor.yy521 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy521, yymsp[0].minor.yy385); +} + break; + case 311: /* windowdefn_list ::= windowdefn */ +{ yylhsminor.yy41 = yymsp[0].minor.yy41; } + yymsp[0].minor.yy41 = yylhsminor.yy41; + break; + case 312: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ +{ + assert( yymsp[0].minor.yy41!=0 ); + sqlite3WindowChain(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy41); + yymsp[0].minor.yy41->pNextWin = yymsp[-2].minor.yy41; + yylhsminor.yy41 = yymsp[0].minor.yy41; +} + yymsp[-2].minor.yy41 = yylhsminor.yy41; + break; + case 313: /* windowdefn ::= nm AS LP window RP */ +{ + if( ALWAYS(yymsp[-1].minor.yy41) ){ + yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); + } + yylhsminor.yy41 = yymsp[-1].minor.yy41; +} + yymsp[-4].minor.yy41 = yylhsminor.yy41; + break; + case 314: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ +{ + yymsp[-4].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, 0); +} + break; + case 315: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ +{ + yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, &yymsp[-5].minor.yy0); +} + yymsp[-5].minor.yy41 = yylhsminor.yy41; + break; + case 316: /* window ::= ORDER BY sortlist frame_opt */ +{ + yymsp[-3].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, 0); +} + break; + case 317: /* window ::= nm ORDER BY sortlist frame_opt */ +{ + yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0); +} + yymsp[-4].minor.yy41 = yylhsminor.yy41; + break; + case 318: /* window ::= frame_opt */ + case 337: /* filter_over ::= over_clause */ yytestcase(yyruleno==337); +{ + yylhsminor.yy41 = yymsp[0].minor.yy41; +} + yymsp[0].minor.yy41 = yylhsminor.yy41; + break; + case 319: /* window ::= nm frame_opt */ +{ + yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, 0, &yymsp[-1].minor.yy0); +} + yymsp[-1].minor.yy41 = yylhsminor.yy41; + break; + case 320: /* frame_opt ::= */ +{ + yymsp[1].minor.yy41 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); +} + break; + case 321: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ +{ + yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy394, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy516); +} + yymsp[-2].minor.yy41 = yylhsminor.yy41; + break; + case 322: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ +{ + yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy394, yymsp[-3].minor.yy595.eType, yymsp[-3].minor.yy595.pExpr, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, yymsp[0].minor.yy516); +} + yymsp[-5].minor.yy41 = yylhsminor.yy41; + break; + case 324: /* frame_bound_s ::= frame_bound */ + case 326: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==326); +{yylhsminor.yy595 = yymsp[0].minor.yy595;} + yymsp[0].minor.yy595 = yylhsminor.yy595; + break; + case 325: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 327: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==327); + case 329: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==329); +{yylhsminor.yy595.eType = yymsp[-1].major; yylhsminor.yy595.pExpr = 0;} + yymsp[-1].minor.yy595 = yylhsminor.yy595; + break; + case 328: /* frame_bound ::= expr PRECEDING|FOLLOWING */ +{yylhsminor.yy595.eType = yymsp[0].major; yylhsminor.yy595.pExpr = yymsp[-1].minor.yy528;} + yymsp[-1].minor.yy595 = yylhsminor.yy595; + break; + case 330: /* frame_exclude_opt ::= */ +{yymsp[1].minor.yy516 = 0;} + break; + case 331: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ +{yymsp[-1].minor.yy516 = yymsp[0].minor.yy516;} + break; + case 332: /* frame_exclude ::= NO OTHERS */ + case 333: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==333); +{yymsp[-1].minor.yy516 = yymsp[-1].major; /*A-overwrites-X*/} + break; + case 334: /* frame_exclude ::= GROUP|TIES */ +{yymsp[0].minor.yy516 = yymsp[0].major; /*A-overwrites-X*/} + break; + case 335: /* window_clause ::= WINDOW windowdefn_list */ +{ yymsp[-1].minor.yy41 = yymsp[0].minor.yy41; } + break; + case 336: /* filter_over ::= filter_clause over_clause */ +{ + if( yymsp[0].minor.yy41 ){ + yymsp[0].minor.yy41->pFilter = yymsp[-1].minor.yy528; + }else{ + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528); + } + yylhsminor.yy41 = yymsp[0].minor.yy41; +} + yymsp[-1].minor.yy41 = yylhsminor.yy41; + break; + case 338: /* filter_over ::= filter_clause */ +{ + yylhsminor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yylhsminor.yy41 ){ + yylhsminor.yy41->eFrmType = TK_FILTER; + yylhsminor.yy41->pFilter = yymsp[0].minor.yy528; + }else{ + sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy528); + } +} + yymsp[0].minor.yy41 = yylhsminor.yy41; + break; + case 339: /* over_clause ::= OVER LP window RP */ +{ + yymsp[-3].minor.yy41 = yymsp[-1].minor.yy41; + assert( yymsp[-3].minor.yy41!=0 ); +} + break; + case 340: /* over_clause ::= OVER nm */ +{ + yymsp[-1].minor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yymsp[-1].minor.yy41 ){ + yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); + } +} + break; + case 341: /* filter_clause ::= FILTER LP WHERE expr RP */ +{ yymsp[-4].minor.yy528 = yymsp[-1].minor.yy528; } + break; + default: + /* (342) input ::= cmdlist */ yytestcase(yyruleno==342); + /* (343) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==343); + /* (344) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=344); + /* (345) ecmd ::= SEMI */ yytestcase(yyruleno==345); + /* (346) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==346); + /* (347) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=347); + /* (348) trans_opt ::= */ yytestcase(yyruleno==348); + /* (349) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==349); + /* (350) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==350); + /* (351) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==351); + /* (352) savepoint_opt ::= */ yytestcase(yyruleno==352); + /* (353) cmd ::= create_table create_table_args */ yytestcase(yyruleno==353); + /* (354) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=354); + /* (355) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==355); + /* (356) columnlist ::= columnname carglist */ yytestcase(yyruleno==356); + /* (357) nm ::= ID|INDEXED */ yytestcase(yyruleno==357); + /* (358) nm ::= STRING */ yytestcase(yyruleno==358); + /* (359) nm ::= JOIN_KW */ yytestcase(yyruleno==359); + /* (360) typetoken ::= typename */ yytestcase(yyruleno==360); + /* (361) typename ::= ID|STRING */ yytestcase(yyruleno==361); + /* (362) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=362); + /* (363) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=363); + /* (364) carglist ::= carglist ccons */ yytestcase(yyruleno==364); + /* (365) carglist ::= */ yytestcase(yyruleno==365); + /* (366) ccons ::= NULL onconf */ yytestcase(yyruleno==366); + /* (367) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==367); + /* (368) ccons ::= AS generated */ yytestcase(yyruleno==368); + /* (369) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==369); + /* (370) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==370); + /* (371) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=371); + /* (372) tconscomma ::= */ yytestcase(yyruleno==372); + /* (373) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=373); + /* (374) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=374); + /* (375) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=375); + /* (376) oneselect ::= values */ yytestcase(yyruleno==376); + /* (377) sclp ::= selcollist COMMA */ yytestcase(yyruleno==377); + /* (378) as ::= ID|STRING */ yytestcase(yyruleno==378); + /* (379) indexed_opt ::= indexed_by (OPTIMIZED OUT) */ assert(yyruleno!=379); + /* (380) returning ::= */ yytestcase(yyruleno==380); + /* (381) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=381); + /* (382) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==382); + /* (383) exprlist ::= nexprlist */ yytestcase(yyruleno==383); + /* (384) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=384); + /* (385) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=385); + /* (386) nmnum ::= ON */ yytestcase(yyruleno==386); + /* (387) nmnum ::= DELETE */ yytestcase(yyruleno==387); + /* (388) nmnum ::= DEFAULT */ yytestcase(yyruleno==388); + /* (389) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==389); + /* (390) foreach_clause ::= */ yytestcase(yyruleno==390); + /* (391) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==391); + /* (392) trnm ::= nm */ yytestcase(yyruleno==392); + /* (393) tridxby ::= */ yytestcase(yyruleno==393); + /* (394) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==394); + /* (395) database_kw_opt ::= */ yytestcase(yyruleno==395); + /* (396) kwcolumn_opt ::= */ yytestcase(yyruleno==396); + /* (397) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==397); + /* (398) vtabarglist ::= vtabarg */ yytestcase(yyruleno==398); + /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==399); + /* (400) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==400); + /* (401) anylist ::= */ yytestcase(yyruleno==401); + /* (402) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==402); + /* (403) anylist ::= anylist ANY */ yytestcase(yyruleno==403); + /* (404) with ::= */ yytestcase(yyruleno==404); + break; +/********** End reduce actions ************************************************/ + }; + assert( yyrulenoYY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); + + /* It is not possible for a REDUCE to be followed by an error */ + assert( yyact!=YY_ERROR_ACTION ); + + yymsp += yysize+1; + yypParser->yytos = yymsp; + yymsp->stateno = (YYACTIONTYPE)yyact; + yymsp->major = (YYCODETYPE)yygoto; + yyTraceShift(yypParser, yyact, "... then shift"); + return yyact; +} + +/* +** The following code executes when the parse fails +*/ +#ifndef YYNOERRORRECOVERY +static void yy_parse_failed( + yyParser *yypParser /* The parser */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); + } +#endif + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +/************ Begin %parse_failure code ***************************************/ +/************ End %parse_failure code *****************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE +} +#endif /* YYNOERRORRECOVERY */ + +/* +** The following code executes when a syntax error first occurs. +*/ +static void yy_syntax_error( + yyParser *yypParser, /* The parser */ + int yymajor, /* The major type of the error token */ + sqlite3ParserTOKENTYPE yyminor /* The minor type of the error token */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#define TOKEN yyminor +/************ Begin %syntax_error code ****************************************/ + + UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ + if( TOKEN.z[0] ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); + }else{ + sqlite3ErrorMsg(pParse, "incomplete input"); + } +/************ End %syntax_error code ******************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE +} + +/* +** The following is executed when the parser accepts +*/ +static void yy_accept( + yyParser *yypParser /* The parser */ +){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + assert( yypParser->yytos==yypParser->yystack ); + /* Here code is inserted which will be executed whenever the + ** parser accepts */ +/*********** Begin %parse_accept code *****************************************/ +/*********** End %parse_accept code *******************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE +} + +/* The main parser program. +** The first argument is a pointer to a structure obtained from +** "sqlite3ParserAlloc" which describes the current state of the parser. +** The second argument is the major token number. The third is +** the minor token. The fourth optional argument is whatever the +** user wants (and specified in the grammar) and is available for +** use by the action routines. +** +** Inputs: +**
          +**
        • A pointer to the parser (an opaque structure.) +**
        • The major token number. +**
        • The minor token number. +**
        • An option argument of a grammar-specified type. +**
        +** +** Outputs: +** None. +*/ +SQLITE_PRIVATE void sqlite3Parser( + void *yyp, /* The parser */ + int yymajor, /* The major token code number */ + sqlite3ParserTOKENTYPE yyminor /* The value for the token */ + sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */ +){ + YYMINORTYPE yyminorunion; + YYACTIONTYPE yyact; /* The parser action. */ +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + int yyendofinput; /* True if we are at the end of input */ +#endif +#ifdef YYERRORSYMBOL + int yyerrorhit = 0; /* True if yymajor has invoked an error */ +#endif + yyParser *yypParser = (yyParser*)yyp; /* The parser */ + sqlite3ParserCTX_FETCH + sqlite3ParserARG_STORE + + assert( yypParser->yytos!=0 ); +#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) + yyendofinput = (yymajor==0); +#endif + + yyact = yypParser->yytos->stateno; +#ifndef NDEBUG + if( yyTraceFILE ){ + if( yyact < YY_MIN_REDUCE ){ + fprintf(yyTraceFILE,"%sInput '%s' in state %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact); + }else{ + fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE); + } + } +#endif + + while(1){ /* Exit by "break" */ + assert( yypParser->yytos>=yypParser->yystack ); + assert( yyact==yypParser->yytos->stateno ); + yyact = yy_find_shift_action((YYCODETYPE)yymajor,yyact); + if( yyact >= YY_MIN_REDUCE ){ + unsigned int yyruleno = yyact - YY_MIN_REDUCE; /* Reduce by this rule */ +#ifndef NDEBUG + assert( yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ); + if( yyTraceFILE ){ + int yysize = yyRuleInfoNRhs[yyruleno]; + if( yysize ){ + fprintf(yyTraceFILE, "%sReduce %d [%s]%s, pop back to state %d.\n", + yyTracePrompt, + yyruleno, yyRuleName[yyruleno], + yyrulenoyytos[yysize].stateno); + }else{ + fprintf(yyTraceFILE, "%sReduce %d [%s]%s.\n", + yyTracePrompt, yyruleno, yyRuleName[yyruleno], + yyrulenoyytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == + (int)(yypParser->yytos - yypParser->yystack)); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>=yypParser->yystackEnd ){ + yyStackOverflow(yypParser); + break; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ + if( yyGrowStack(yypParser) ){ + yyStackOverflow(yypParser); + break; + } + } +#endif + } + yyact = yy_reduce(yypParser,yyruleno,yymajor,yyminor sqlite3ParserCTX_PARAM); + }else if( yyact <= YY_MAX_SHIFTREDUCE ){ + yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt--; +#endif + break; + }else if( yyact==YY_ACCEPT_ACTION ){ + yypParser->yytos--; + yy_accept(yypParser); + return; + }else{ + assert( yyact == YY_ERROR_ACTION ); + yyminorunion.yy0 = yyminor; +#ifdef YYERRORSYMBOL + int yymx; +#endif +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); + } +#endif +#ifdef YYERRORSYMBOL + /* A syntax error has occurred. + ** The response to an error depends upon whether or not the + ** grammar defines an error token "ERROR". + ** + ** This is what we do if the grammar does define ERROR: + ** + ** * Call the %syntax_error function. + ** + ** * Begin popping the stack until we enter a state where + ** it is legal to shift the error symbol, then shift + ** the error symbol. + ** + ** * Set the error count to three. + ** + ** * Begin accepting and shifting new tokens. No new error + ** processing will occur until three tokens have been + ** shifted successfully. + ** + */ + if( yypParser->yyerrcnt<0 ){ + yy_syntax_error(yypParser,yymajor,yyminor); + } + yymx = yypParser->yytos->major; + if( yymx==YYERRORSYMBOL || yyerrorhit ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sDiscard input token %s\n", + yyTracePrompt,yyTokenName[yymajor]); + } +#endif + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); + yymajor = YYNOCODE; + }else{ + while( yypParser->yytos > yypParser->yystack ){ + yyact = yy_find_reduce_action(yypParser->yytos->stateno, + YYERRORSYMBOL); + if( yyact<=YY_MAX_SHIFTREDUCE ) break; + yy_pop_parser_stack(yypParser); + } + if( yypParser->yytos <= yypParser->yystack || yymajor==0 ){ + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yymajor = YYNOCODE; + }else if( yymx!=YYERRORSYMBOL ){ + yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); + } + } + yypParser->yyerrcnt = 3; + yyerrorhit = 1; + if( yymajor==YYNOCODE ) break; + yyact = yypParser->yytos->stateno; +#elif defined(YYNOERRORRECOVERY) + /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to + ** do any kind of error recovery. Instead, simply invoke the syntax + ** error routine and continue going as if nothing had happened. + ** + ** Applications can set this macro (for example inside %include) if + ** they intend to abandon the parse upon the first syntax error seen. + */ + yy_syntax_error(yypParser,yymajor, yyminor); + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + break; +#else /* YYERRORSYMBOL is not defined */ + /* This is what we do if the grammar does not define ERROR: + ** + ** * Report an error message, and throw away the input token. + ** + ** * If the input token is $, then fail the parse. + ** + ** As before, subsequent error messages are suppressed until + ** three input tokens have been successfully shifted. + */ + if( yypParser->yyerrcnt<=0 ){ + yy_syntax_error(yypParser,yymajor, yyminor); + } + yypParser->yyerrcnt = 3; + yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); + if( yyendofinput ){ + yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + } + break; +#endif + } + } +#ifndef NDEBUG + if( yyTraceFILE ){ + yyStackEntry *i; + char cDiv = '['; + fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); + for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ + fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); + cDiv = ' '; + } + fprintf(yyTraceFILE,"]\n"); + } +#endif + return; +} + +/* +** Return the fallback token corresponding to canonical token iToken, or +** 0 if iToken has no fallback. +*/ +SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){ +#ifdef YYFALLBACK + assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); + return yyFallback[iToken]; +#else + (void)iToken; + return 0; +#endif +} + +/************** End of parse.c ***********************************************/ +/************** Begin file tokenize.c ****************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** An tokenizer for SQL +** +** This file contains C code that splits an SQL input string up into +** individual tokens and sends those tokens one-by-one over to the +** parser for analysis. +*/ +/* #include "sqliteInt.h" */ +/* #include */ + +/* Character classes for tokenizing +** +** In the sqlite3GetToken() function, a switch() on aiClass[c] is implemented +** using a lookup table, whereas a switch() directly on c uses a binary search. +** The lookup table is much faster. To maximize speed, and to ensure that +** a lookup table is used, all of the classes need to be small integers and +** all of them need to be used within the switch. +*/ +#define CC_X 0 /* The letter 'x', or start of BLOB literal */ +#define CC_KYWD0 1 /* First letter of a keyword */ +#define CC_KYWD 2 /* Alphabetics or '_'. Usable in a keyword */ +#define CC_DIGIT 3 /* Digits */ +#define CC_DOLLAR 4 /* '$' */ +#define CC_VARALPHA 5 /* '@', '#', ':'. Alphabetic SQL variables */ +#define CC_VARNUM 6 /* '?'. Numeric SQL variables */ +#define CC_SPACE 7 /* Space characters */ +#define CC_QUOTE 8 /* '"', '\'', or '`'. String literals, quoted ids */ +#define CC_QUOTE2 9 /* '['. [...] style quoted ids */ +#define CC_PIPE 10 /* '|'. Bitwise OR or concatenate */ +#define CC_MINUS 11 /* '-'. Minus or SQL-style comment */ +#define CC_LT 12 /* '<'. Part of < or <= or <> */ +#define CC_GT 13 /* '>'. Part of > or >= */ +#define CC_EQ 14 /* '='. Part of = or == */ +#define CC_BANG 15 /* '!'. Part of != */ +#define CC_SLASH 16 /* '/'. / or c-style comment */ +#define CC_LP 17 /* '(' */ +#define CC_RP 18 /* ')' */ +#define CC_SEMI 19 /* ';' */ +#define CC_PLUS 20 /* '+' */ +#define CC_STAR 21 /* '*' */ +#define CC_PERCENT 22 /* '%' */ +#define CC_COMMA 23 /* ',' */ +#define CC_AND 24 /* '&' */ +#define CC_TILDA 25 /* '~' */ +#define CC_DOT 26 /* '.' */ +#define CC_ID 27 /* unicode characters usable in IDs */ +#define CC_ILLEGAL 28 /* Illegal character */ +#define CC_NUL 29 /* 0x00 */ +#define CC_BOM 30 /* First byte of UTF8 BOM: 0xEF 0xBB 0xBF */ + +static const unsigned char aiClass[] = { +#ifdef SQLITE_ASCII +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 29, 28, 28, 28, 28, 28, 28, 28, 28, 7, 7, 28, 7, 7, 28, 28, +/* 1x */ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +/* 2x */ 7, 15, 8, 5, 4, 22, 24, 8, 17, 18, 21, 20, 23, 11, 26, 16, +/* 3x */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 19, 12, 14, 13, 6, +/* 4x */ 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 9, 28, 28, 28, 2, +/* 6x */ 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 28, 10, 28, 25, 28, +/* 8x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 9x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* Ax */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* Bx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* Cx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* Dx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* Ex */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 30, +/* Fx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27 +#endif +#ifdef SQLITE_EBCDIC +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 29, 28, 28, 28, 28, 7, 28, 28, 28, 28, 28, 28, 7, 7, 28, 28, +/* 1x */ 28, 28, 28, 28, 28, 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +/* 2x */ 28, 28, 28, 28, 28, 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +/* 3x */ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +/* 4x */ 7, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 26, 12, 17, 20, 10, +/* 5x */ 24, 28, 28, 28, 28, 28, 28, 28, 28, 28, 15, 4, 21, 18, 19, 28, +/* 6x */ 11, 16, 28, 28, 28, 28, 28, 28, 28, 28, 28, 23, 22, 2, 13, 6, +/* 7x */ 28, 28, 28, 28, 28, 28, 28, 28, 28, 8, 5, 5, 5, 8, 14, 8, +/* 8x */ 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 28, 28, 28, 28, 28, +/* 9x */ 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 28, 28, 28, 28, 28, +/* Ax */ 28, 25, 1, 1, 1, 1, 1, 0, 2, 2, 28, 28, 28, 28, 28, 28, +/* Bx */ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 9, 28, 28, 28, 28, 28, +/* Cx */ 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 28, 28, 28, 28, 28, +/* Dx */ 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 28, 28, 28, 28, 28, +/* Ex */ 28, 28, 1, 1, 1, 1, 1, 0, 2, 2, 28, 28, 28, 28, 28, 28, +/* Fx */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 28, 28, 28, 28, 28, 28, +#endif +}; + +/* +** The charMap() macro maps alphabetic characters (only) into their +** lower-case ASCII equivalent. On ASCII machines, this is just +** an upper-to-lower case map. On EBCDIC machines we also need +** to adjust the encoding. The mapping is only valid for alphabetics +** which are the only characters for which this feature is used. +** +** Used by keywordhash.h +*/ +#ifdef SQLITE_ASCII +# define charMap(X) sqlite3UpperToLower[(unsigned char)X] +#endif +#ifdef SQLITE_EBCDIC +# define charMap(X) ebcdicToAscii[(unsigned char)X] +const unsigned char ebcdicToAscii[] = { +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, /* 6x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */ + 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* 8x */ + 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* 9x */ + 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ax */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ + 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* Cx */ + 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* Dx */ + 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ex */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Fx */ +}; +#endif + +/* +** The sqlite3KeywordCode function looks up an identifier to determine if +** it is a keyword. If it is a keyword, the token code of that keyword is +** returned. If the input is not a keyword, TK_ID is returned. +** +** The implementation of this routine was generated by a program, +** mkkeywordhash.c, located in the tool subdirectory of the distribution. +** The output of the mkkeywordhash.c program is written into a file +** named keywordhash.h and then included into this source file by +** the #include below. +*/ +/************** Include keywordhash.h in the middle of tokenize.c ************/ +/************** Begin file keywordhash.h *************************************/ +/***** This file contains automatically generated code ****** +** +** The code in this file has been automatically generated by +** +** sqlite/tool/mkkeywordhash.c +** +** The code in this file implements a function that determines whether +** or not a given identifier is really an SQL keyword. The same thing +** might be implemented more directly using a hand-written hash table. +** But by using this automatically generated code, the size of the code +** is substantially reduced. This is important for embedded applications +** on platforms with limited memory. +*/ +/* Hash score: 231 */ +/* zKWText[] encodes 1007 bytes of keyword text in 667 bytes */ +/* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ +/* ABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYISNULLSAVEPOINTERSECT */ +/* IESNOTNULLIKEXCEPTRANSACTIONATURALTERAISEXCLUSIVEXISTS */ +/* CONSTRAINTOFFSETRIGGERANGENERATEDETACHAVINGLOBEGINNEREFERENCES */ +/* UNIQUERYWITHOUTERELEASEATTACHBETWEENOTHINGROUPSCASCADEFAULT */ +/* CASECOLLATECREATECURRENT_DATEIMMEDIATEJOINSERTMATCHPLANALYZE */ +/* PRAGMATERIALIZEDEFERREDISTINCTUPDATEVALUESVIRTUALWAYSWHENWHERE */ +/* CURSIVEABORTAFTERENAMEANDROPARTITIONAUTOINCREMENTCASTCOLUMN */ +/* COMMITCONFLICTCROSSCURRENT_TIMESTAMPRECEDINGFAILASTFILTER */ +/* EPLACEFIRSTFOLLOWINGFROMFULLIMITIFORDERESTRICTOTHERSOVER */ +/* ETURNINGRIGHTROLLBACKROWSUNBOUNDEDUNIONUSINGVACUUMVIEWINDOWBY */ +/* INITIALLYPRIMARY */ +static const char zKWText[666] = { + 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', + 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', + 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', + 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', + 'E','R','R','A','B','L','E','L','S','E','X','C','L','U','D','E','L','E', + 'T','E','M','P','O','R','A','R','Y','I','S','N','U','L','L','S','A','V', + 'E','P','O','I','N','T','E','R','S','E','C','T','I','E','S','N','O','T', + 'N','U','L','L','I','K','E','X','C','E','P','T','R','A','N','S','A','C', + 'T','I','O','N','A','T','U','R','A','L','T','E','R','A','I','S','E','X', + 'C','L','U','S','I','V','E','X','I','S','T','S','C','O','N','S','T','R', + 'A','I','N','T','O','F','F','S','E','T','R','I','G','G','E','R','A','N', + 'G','E','N','E','R','A','T','E','D','E','T','A','C','H','A','V','I','N', + 'G','L','O','B','E','G','I','N','N','E','R','E','F','E','R','E','N','C', + 'E','S','U','N','I','Q','U','E','R','Y','W','I','T','H','O','U','T','E', + 'R','E','L','E','A','S','E','A','T','T','A','C','H','B','E','T','W','E', + 'E','N','O','T','H','I','N','G','R','O','U','P','S','C','A','S','C','A', + 'D','E','F','A','U','L','T','C','A','S','E','C','O','L','L','A','T','E', + 'C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A','T','E', + 'I','M','M','E','D','I','A','T','E','J','O','I','N','S','E','R','T','M', + 'A','T','C','H','P','L','A','N','A','L','Y','Z','E','P','R','A','G','M', + 'A','T','E','R','I','A','L','I','Z','E','D','E','F','E','R','R','E','D', + 'I','S','T','I','N','C','T','U','P','D','A','T','E','V','A','L','U','E', + 'S','V','I','R','T','U','A','L','W','A','Y','S','W','H','E','N','W','H', + 'E','R','E','C','U','R','S','I','V','E','A','B','O','R','T','A','F','T', + 'E','R','E','N','A','M','E','A','N','D','R','O','P','A','R','T','I','T', + 'I','O','N','A','U','T','O','I','N','C','R','E','M','E','N','T','C','A', + 'S','T','C','O','L','U','M','N','C','O','M','M','I','T','C','O','N','F', + 'L','I','C','T','C','R','O','S','S','C','U','R','R','E','N','T','_','T', + 'I','M','E','S','T','A','M','P','R','E','C','E','D','I','N','G','F','A', + 'I','L','A','S','T','F','I','L','T','E','R','E','P','L','A','C','E','F', + 'I','R','S','T','F','O','L','L','O','W','I','N','G','F','R','O','M','F', + 'U','L','L','I','M','I','T','I','F','O','R','D','E','R','E','S','T','R', + 'I','C','T','O','T','H','E','R','S','O','V','E','R','E','T','U','R','N', + 'I','N','G','R','I','G','H','T','R','O','L','L','B','A','C','K','R','O', + 'W','S','U','N','B','O','U','N','D','E','D','U','N','I','O','N','U','S', + 'I','N','G','V','A','C','U','U','M','V','I','E','W','I','N','D','O','W', + 'B','Y','I','N','I','T','I','A','L','L','Y','P','R','I','M','A','R','Y', +}; +/* aKWHash[i] is the hash value for the i-th keyword */ +static const unsigned char aKWHash[127] = { + 84, 92, 134, 82, 105, 29, 0, 0, 94, 0, 85, 72, 0, + 53, 35, 86, 15, 0, 42, 97, 54, 89, 135, 19, 0, 0, + 140, 0, 40, 129, 0, 22, 107, 0, 9, 0, 0, 123, 80, + 0, 78, 6, 0, 65, 103, 147, 0, 136, 115, 0, 0, 48, + 0, 90, 24, 0, 17, 0, 27, 70, 23, 26, 5, 60, 142, + 110, 122, 0, 73, 91, 71, 145, 61, 120, 74, 0, 49, 0, + 11, 41, 0, 113, 0, 0, 0, 109, 10, 111, 116, 125, 14, + 50, 124, 0, 100, 0, 18, 121, 144, 56, 130, 139, 88, 83, + 37, 30, 126, 0, 0, 108, 51, 131, 128, 0, 34, 0, 0, + 132, 0, 98, 38, 39, 0, 20, 45, 117, 93, +}; +/* aKWNext[] forms the hash collision chain. If aKWHash[i]==0 +** then the i-th keyword has no more hash collisions. Otherwise, +** the next keyword with the same hash is aKWHash[i]-1. */ +static const unsigned char aKWNext[147] = { + 0, 0, 0, 0, 4, 0, 43, 0, 0, 106, 114, 0, 0, + 0, 2, 0, 0, 143, 0, 0, 0, 13, 0, 0, 0, 0, + 141, 0, 0, 119, 52, 0, 0, 137, 12, 0, 0, 62, 0, + 138, 0, 133, 0, 0, 36, 0, 0, 28, 77, 0, 0, 0, + 0, 59, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 146, 3, 0, 58, 0, 1, + 75, 0, 0, 0, 31, 0, 0, 0, 0, 0, 127, 0, 104, + 0, 64, 66, 63, 0, 0, 0, 0, 0, 46, 0, 16, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 101, 0, + 112, 21, 7, 67, 0, 79, 96, 118, 0, 0, 68, 0, 0, + 99, 44, 0, 55, 0, 76, 0, 95, 32, 33, 57, 25, 0, + 102, 0, 0, 87, +}; +/* aKWLen[i] is the length (in bytes) of the i-th keyword */ +static const unsigned char aKWLen[147] = { + 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, + 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 7, + 6, 9, 4, 2, 6, 5, 9, 9, 4, 7, 3, 2, 4, + 4, 6, 11, 6, 2, 7, 5, 5, 9, 6, 10, 4, 6, + 2, 3, 7, 5, 9, 6, 6, 4, 5, 5, 10, 6, 5, + 7, 4, 5, 7, 6, 7, 7, 6, 5, 7, 3, 7, 4, + 7, 6, 12, 9, 4, 6, 5, 4, 7, 6, 12, 8, 8, + 2, 6, 6, 7, 6, 4, 5, 9, 5, 5, 6, 3, 4, + 9, 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, 7, 9, + 4, 4, 6, 7, 5, 9, 4, 4, 5, 2, 5, 8, 6, + 4, 9, 5, 8, 4, 3, 9, 5, 5, 6, 4, 6, 2, + 2, 9, 3, 7, +}; +/* aKWOffset[i] is the index into zKWText[] of the start of +** the text for the i-th keyword. */ +static const unsigned short int aKWOffset[147] = { + 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, + 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, + 86, 90, 90, 94, 99, 101, 105, 111, 119, 123, 123, 123, 126, + 129, 132, 137, 142, 146, 147, 152, 156, 160, 168, 174, 181, 184, + 184, 187, 189, 195, 198, 206, 211, 216, 219, 222, 226, 236, 239, + 244, 244, 248, 252, 259, 265, 271, 277, 277, 283, 284, 288, 295, + 299, 306, 312, 324, 333, 335, 341, 346, 348, 355, 359, 370, 377, + 378, 385, 391, 397, 402, 408, 412, 415, 424, 429, 433, 439, 441, + 444, 453, 455, 457, 466, 470, 476, 482, 490, 495, 495, 495, 511, + 520, 523, 527, 532, 539, 544, 553, 557, 560, 565, 567, 571, 579, + 585, 588, 597, 602, 610, 610, 614, 623, 628, 633, 639, 642, 645, + 648, 650, 655, 659, +}; +/* aKWCode[i] is the parser symbol code for the i-th keyword */ +static const unsigned char aKWCode[147] = { + TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, + TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, + TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, + TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, + TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, + TK_EXCLUDE, TK_DELETE, TK_TEMP, TK_TEMP, TK_OR, + TK_ISNULL, TK_NULLS, TK_SAVEPOINT, TK_INTERSECT, TK_TIES, + TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, + TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_CONSTRAINT, + TK_INTO, TK_OFFSET, TK_OF, TK_SET, TK_TRIGGER, + TK_RANGE, TK_GENERATED, TK_DETACH, TK_HAVING, TK_LIKE_KW, + TK_BEGIN, TK_JOIN_KW, TK_REFERENCES, TK_UNIQUE, TK_QUERY, + TK_WITHOUT, TK_WITH, TK_JOIN_KW, TK_RELEASE, TK_ATTACH, + TK_BETWEEN, TK_NOTHING, TK_GROUPS, TK_GROUP, TK_CASCADE, + TK_ASC, TK_DEFAULT, TK_CASE, TK_COLLATE, TK_CREATE, + TK_CTIME_KW, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_MATCH, + TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_MATERIALIZED, TK_DEFERRED, + TK_DISTINCT, TK_IS, TK_UPDATE, TK_VALUES, TK_VIRTUAL, + TK_ALWAYS, TK_WHEN, TK_WHERE, TK_RECURSIVE, TK_ABORT, + TK_AFTER, TK_RENAME, TK_AND, TK_DROP, TK_PARTITION, + TK_AUTOINCR, TK_TO, TK_IN, TK_CAST, TK_COLUMNKW, + TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, + TK_CURRENT, TK_PRECEDING, TK_FAIL, TK_LAST, TK_FILTER, + TK_REPLACE, TK_FIRST, TK_FOLLOWING, TK_FROM, TK_JOIN_KW, + TK_LIMIT, TK_IF, TK_ORDER, TK_RESTRICT, TK_OTHERS, + TK_OVER, TK_RETURNING, TK_JOIN_KW, TK_ROLLBACK, TK_ROWS, + TK_ROW, TK_UNBOUNDED, TK_UNION, TK_USING, TK_VACUUM, + TK_VIEW, TK_WINDOW, TK_DO, TK_BY, TK_INITIALLY, + TK_ALL, TK_PRIMARY, +}; +/* Hash table decoded: +** 0: INSERT +** 1: IS +** 2: ROLLBACK TRIGGER +** 3: IMMEDIATE +** 4: PARTITION +** 5: TEMP +** 6: +** 7: +** 8: VALUES WITHOUT +** 9: +** 10: MATCH +** 11: NOTHING +** 12: +** 13: OF +** 14: TIES IGNORE +** 15: PLAN +** 16: INSTEAD INDEXED +** 17: +** 18: TRANSACTION RIGHT +** 19: WHEN +** 20: SET HAVING +** 21: MATERIALIZED IF +** 22: ROWS +** 23: SELECT +** 24: +** 25: +** 26: VACUUM SAVEPOINT +** 27: +** 28: LIKE UNION VIRTUAL REFERENCES +** 29: RESTRICT +** 30: +** 31: THEN REGEXP +** 32: TO +** 33: +** 34: BEFORE +** 35: +** 36: +** 37: FOLLOWING COLLATE CASCADE +** 38: CREATE +** 39: +** 40: CASE REINDEX +** 41: EACH +** 42: +** 43: QUERY +** 44: AND ADD +** 45: PRIMARY ANALYZE +** 46: +** 47: ROW ASC DETACH +** 48: CURRENT_TIME CURRENT_DATE +** 49: +** 50: +** 51: EXCLUSIVE TEMPORARY +** 52: +** 53: DEFERRED +** 54: DEFERRABLE +** 55: +** 56: DATABASE +** 57: +** 58: DELETE VIEW GENERATED +** 59: ATTACH +** 60: END +** 61: EXCLUDE +** 62: ESCAPE DESC +** 63: GLOB +** 64: WINDOW ELSE +** 65: COLUMN +** 66: FIRST +** 67: +** 68: GROUPS ALL +** 69: DISTINCT DROP KEY +** 70: BETWEEN +** 71: INITIALLY +** 72: BEGIN +** 73: FILTER CHECK ACTION +** 74: GROUP INDEX +** 75: +** 76: EXISTS DEFAULT +** 77: +** 78: FOR CURRENT_TIMESTAMP +** 79: EXCEPT +** 80: +** 81: CROSS +** 82: +** 83: +** 84: +** 85: CAST +** 86: FOREIGN AUTOINCREMENT +** 87: COMMIT +** 88: CURRENT AFTER ALTER +** 89: FULL FAIL CONFLICT +** 90: EXPLAIN +** 91: CONSTRAINT +** 92: FROM ALWAYS +** 93: +** 94: ABORT +** 95: +** 96: AS DO +** 97: REPLACE WITH RELEASE +** 98: BY RENAME +** 99: RANGE RAISE +** 100: OTHERS +** 101: USING NULLS +** 102: PRAGMA +** 103: JOIN ISNULL OFFSET +** 104: NOT +** 105: OR LAST LEFT +** 106: LIMIT +** 107: +** 108: +** 109: IN +** 110: INTO +** 111: OVER RECURSIVE +** 112: ORDER OUTER +** 113: +** 114: INTERSECT UNBOUNDED +** 115: +** 116: +** 117: RETURNING ON +** 118: +** 119: WHERE +** 120: NO INNER +** 121: NULL +** 122: +** 123: TABLE +** 124: NATURAL NOTNULL +** 125: PRECEDING +** 126: UPDATE UNIQUE +*/ +/* Check to see if z[0..n-1] is a keyword. If it is, write the +** parser symbol code for that keyword into *pType. Always +** return the integer n (the length of the token). */ +static int keywordCode(const char *z, int n, int *pType){ + int i, j; + const char *zKW; + if( n>=2 ){ + i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n*1) % 127; + for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){ + if( aKWLen[i]!=n ) continue; + zKW = &zKWText[aKWOffset[i]]; +#ifdef SQLITE_ASCII + if( (z[0]&~0x20)!=zKW[0] ) continue; + if( (z[1]&~0x20)!=zKW[1] ) continue; + j = 2; + while( j=SQLITE_N_KEYWORD ) return SQLITE_ERROR; + *pzName = zKWText + aKWOffset[i]; + *pnName = aKWLen[i]; + return SQLITE_OK; +} +SQLITE_API int sqlite3_keyword_count(void){ return SQLITE_N_KEYWORD; } +SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){ + return TK_ID!=sqlite3KeywordCode((const u8*)zName, nName); +} + +/************** End of keywordhash.h *****************************************/ +/************** Continuing where we left off in tokenize.c *******************/ + + +/* +** If X is a character that can be used in an identifier then +** IdChar(X) will be true. Otherwise it is false. +** +** For ASCII, any character with the high-order bit set is +** allowed in an identifier. For 7-bit characters, +** sqlite3IsIdChar[X] must be 1. +** +** For EBCDIC, the rules are more complex but have the same +** end result. +** +** Ticket #1066. the SQL standard does not allow '$' in the +** middle of identifiers. But many SQL implementations do. +** SQLite will allow '$' in identifiers for compatibility. +** But the feature is undocumented. +*/ +#ifdef SQLITE_ASCII +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#endif +#ifdef SQLITE_EBCDIC +SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 4x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, /* 5x */ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, /* 6x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* 7x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, /* 8x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, /* 9x */ + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, /* Ax */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Cx */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Dx */ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Ex */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, /* Fx */ +}; +#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif + +/* Make the IdChar function accessible from ctime.c and alter.c */ +SQLITE_PRIVATE int sqlite3IsIdChar(u8 c){ return IdChar(c); } + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Return the id of the next token in string (*pz). Before returning, set +** (*pz) to point to the byte following the parsed token. +*/ +static int getToken(const unsigned char **pz){ + const unsigned char *z = *pz; + int t; /* Token type to return */ + do { + z += sqlite3GetToken(z, &t); + }while( t==TK_SPACE ); + if( t==TK_ID + || t==TK_STRING + || t==TK_JOIN_KW + || t==TK_WINDOW + || t==TK_OVER + || sqlite3ParserFallback(t)==TK_ID + ){ + t = TK_ID; + } + *pz = z; + return t; +} + +/* +** The following three functions are called immediately after the tokenizer +** reads the keywords WINDOW, OVER and FILTER, respectively, to determine +** whether the token should be treated as a keyword or an SQL identifier. +** This cannot be handled by the usual lemon %fallback method, due to +** the ambiguity in some constructions. e.g. +** +** SELECT sum(x) OVER ... +** +** In the above, "OVER" might be a keyword, or it might be an alias for the +** sum(x) expression. If a "%fallback ID OVER" directive were added to +** grammar, then SQLite would always treat "OVER" as an alias, making it +** impossible to call a window-function without a FILTER clause. +** +** WINDOW is treated as a keyword if: +** +** * the following token is an identifier, or a keyword that can fallback +** to being an identifier, and +** * the token after than one is TK_AS. +** +** OVER is a keyword if: +** +** * the previous token was TK_RP, and +** * the next token is either TK_LP or an identifier. +** +** FILTER is a keyword if: +** +** * the previous token was TK_RP, and +** * the next token is TK_LP. +*/ +static int analyzeWindowKeyword(const unsigned char *z){ + int t; + t = getToken(&z); + if( t!=TK_ID ) return TK_ID; + t = getToken(&z); + if( t!=TK_AS ) return TK_ID; + return TK_WINDOW; +} +static int analyzeOverKeyword(const unsigned char *z, int lastToken){ + if( lastToken==TK_RP ){ + int t = getToken(&z); + if( t==TK_LP || t==TK_ID ) return TK_OVER; + } + return TK_ID; +} +static int analyzeFilterKeyword(const unsigned char *z, int lastToken){ + if( lastToken==TK_RP && getToken(&z)==TK_LP ){ + return TK_FILTER; + } + return TK_ID; +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ + +/* +** Return the length (in bytes) of the token that begins at z[0]. +** Store the token type in *tokenType before returning. +*/ +SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ + int i, c; + switch( aiClass[*z] ){ /* Switch on the character-class of the first byte + ** of the token. See the comment on the CC_ defines + ** above. */ + case CC_SPACE: { + testcase( z[0]==' ' ); + testcase( z[0]=='\t' ); + testcase( z[0]=='\n' ); + testcase( z[0]=='\f' ); + testcase( z[0]=='\r' ); + for(i=1; sqlite3Isspace(z[i]); i++){} + *tokenType = TK_SPACE; + return i; + } + case CC_MINUS: { + if( z[1]=='-' ){ + for(i=2; (c=z[i])!=0 && c!='\n'; i++){} + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + return i; + }else if( z[1]=='>' ){ + *tokenType = TK_PTR; + return 2 + (z[2]=='>'); + } + *tokenType = TK_MINUS; + return 1; + } + case CC_LP: { + *tokenType = TK_LP; + return 1; + } + case CC_RP: { + *tokenType = TK_RP; + return 1; + } + case CC_SEMI: { + *tokenType = TK_SEMI; + return 1; + } + case CC_PLUS: { + *tokenType = TK_PLUS; + return 1; + } + case CC_STAR: { + *tokenType = TK_STAR; + return 1; + } + case CC_SLASH: { + if( z[1]!='*' || z[2]==0 ){ + *tokenType = TK_SLASH; + return 1; + } + for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} + if( c ) i++; + *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + return i; + } + case CC_PERCENT: { + *tokenType = TK_REM; + return 1; + } + case CC_EQ: { + *tokenType = TK_EQ; + return 1 + (z[1]=='='); + } + case CC_LT: { + if( (c=z[1])=='=' ){ + *tokenType = TK_LE; + return 2; + }else if( c=='>' ){ + *tokenType = TK_NE; + return 2; + }else if( c=='<' ){ + *tokenType = TK_LSHIFT; + return 2; + }else{ + *tokenType = TK_LT; + return 1; + } + } + case CC_GT: { + if( (c=z[1])=='=' ){ + *tokenType = TK_GE; + return 2; + }else if( c=='>' ){ + *tokenType = TK_RSHIFT; + return 2; + }else{ + *tokenType = TK_GT; + return 1; + } + } + case CC_BANG: { + if( z[1]!='=' ){ + *tokenType = TK_ILLEGAL; + return 1; + }else{ + *tokenType = TK_NE; + return 2; + } + } + case CC_PIPE: { + if( z[1]!='|' ){ + *tokenType = TK_BITOR; + return 1; + }else{ + *tokenType = TK_CONCAT; + return 2; + } + } + case CC_COMMA: { + *tokenType = TK_COMMA; + return 1; + } + case CC_AND: { + *tokenType = TK_BITAND; + return 1; + } + case CC_TILDA: { + *tokenType = TK_BITNOT; + return 1; + } + case CC_QUOTE: { + int delim = z[0]; + testcase( delim=='`' ); + testcase( delim=='\'' ); + testcase( delim=='"' ); + for(i=1; (c=z[i])!=0; i++){ + if( c==delim ){ + if( z[i+1]==delim ){ + i++; + }else{ + break; + } + } + } + if( c=='\'' ){ + *tokenType = TK_STRING; + return i+1; + }else if( c!=0 ){ + *tokenType = TK_ID; + return i+1; + }else{ + *tokenType = TK_ILLEGAL; + return i; + } + } + case CC_DOT: { +#ifndef SQLITE_OMIT_FLOATING_POINT + if( !sqlite3Isdigit(z[1]) ) +#endif + { + *tokenType = TK_DOT; + return 1; + } + /* If the next character is a digit, this is a floating point + ** number that begins with ".". Fall thru into the next case */ + /* no break */ deliberate_fall_through + } + case CC_DIGIT: { + testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' ); + testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' ); + testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' ); + testcase( z[0]=='9' ); + *tokenType = TK_INTEGER; +#ifndef SQLITE_OMIT_HEX_INTEGER + if( z[0]=='0' && (z[1]=='x' || z[1]=='X') && sqlite3Isxdigit(z[2]) ){ + for(i=3; sqlite3Isxdigit(z[i]); i++){} + return i; + } +#endif + for(i=0; sqlite3Isdigit(z[i]); i++){} +#ifndef SQLITE_OMIT_FLOATING_POINT + if( z[i]=='.' ){ + i++; + while( sqlite3Isdigit(z[i]) ){ i++; } + *tokenType = TK_FLOAT; + } + if( (z[i]=='e' || z[i]=='E') && + ( sqlite3Isdigit(z[i+1]) + || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2])) + ) + ){ + i += 2; + while( sqlite3Isdigit(z[i]) ){ i++; } + *tokenType = TK_FLOAT; + } +#endif + while( IdChar(z[i]) ){ + *tokenType = TK_ILLEGAL; + i++; + } + return i; + } + case CC_QUOTE2: { + for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} + *tokenType = c==']' ? TK_ID : TK_ILLEGAL; + return i; + } + case CC_VARNUM: { + *tokenType = TK_VARIABLE; + for(i=1; sqlite3Isdigit(z[i]); i++){} + return i; + } + case CC_DOLLAR: + case CC_VARALPHA: { + int n = 0; + testcase( z[0]=='$' ); testcase( z[0]=='@' ); + testcase( z[0]==':' ); testcase( z[0]=='#' ); + *tokenType = TK_VARIABLE; + for(i=1; (c=z[i])!=0; i++){ + if( IdChar(c) ){ + n++; +#ifndef SQLITE_OMIT_TCL_VARIABLE + }else if( c=='(' && n>0 ){ + do{ + i++; + }while( (c=z[i])!=0 && !sqlite3Isspace(c) && c!=')' ); + if( c==')' ){ + i++; + }else{ + *tokenType = TK_ILLEGAL; + } + break; + }else if( c==':' && z[i+1]==':' ){ + i++; +#endif + }else{ + break; + } + } + if( n==0 ) *tokenType = TK_ILLEGAL; + return i; + } + case CC_KYWD0: { + for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} + if( IdChar(z[i]) ){ + /* This token started out using characters that can appear in keywords, + ** but z[i] is a character not allowed within keywords, so this must + ** be an identifier instead */ + i++; + break; + } + *tokenType = TK_ID; + return keywordCode((char*)z, i, tokenType); + } + case CC_X: { +#ifndef SQLITE_OMIT_BLOB_LITERAL + testcase( z[0]=='x' ); testcase( z[0]=='X' ); + if( z[1]=='\'' ){ + *tokenType = TK_BLOB; + for(i=2; sqlite3Isxdigit(z[i]); i++){} + if( z[i]!='\'' || i%2 ){ + *tokenType = TK_ILLEGAL; + while( z[i] && z[i]!='\'' ){ i++; } + } + if( z[i] ) i++; + return i; + } +#endif + /* If it is not a BLOB literal, then it must be an ID, since no + ** SQL keywords start with the letter 'x'. Fall through */ + /* no break */ deliberate_fall_through + } + case CC_KYWD: + case CC_ID: { + i = 1; + break; + } + case CC_BOM: { + if( z[1]==0xbb && z[2]==0xbf ){ + *tokenType = TK_SPACE; + return 3; + } + i = 1; + break; + } + case CC_NUL: { + *tokenType = TK_ILLEGAL; + return 0; + } + default: { + *tokenType = TK_ILLEGAL; + return 1; + } + } + while( IdChar(z[i]) ){ i++; } + *tokenType = TK_ID; + return i; +} + +/* +** Run the parser on the given SQL string. +*/ +SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ + int nErr = 0; /* Number of errors encountered */ + void *pEngine; /* The LEMON-generated LALR(1) parser */ + int n = 0; /* Length of the next token token */ + int tokenType; /* type of the next token */ + int lastTokenParsed = -1; /* type of the previous token */ + sqlite3 *db = pParse->db; /* The database connection */ + int mxSqlLen; /* Max length of an SQL string */ + Parse *pParentParse = 0; /* Outer parse context, if any */ +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ +#endif + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); + + assert( zSql!=0 ); + mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + pParse->rc = SQLITE_OK; + pParse->zTail = zSql; +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + pEngine = &sEngine; + sqlite3ParserInit(pEngine, pParse); +#else + pEngine = sqlite3ParserAlloc(sqlite3Malloc, pParse); + if( pEngine==0 ){ + sqlite3OomFault(db); + return SQLITE_NOMEM_BKPT; + } +#endif + assert( pParse->pNewTable==0 ); + assert( pParse->pNewTrigger==0 ); + assert( pParse->nVar==0 ); + assert( pParse->pVList==0 ); + pParentParse = db->pParse; + db->pParse = pParse; + while( 1 ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + mxSqlLen -= n; + if( mxSqlLen<0 ){ + pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; + break; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( tokenType>=TK_WINDOW ){ + assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER + || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW + ); +#else + if( tokenType>=TK_SPACE ){ + assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); +#endif /* SQLITE_OMIT_WINDOWFUNC */ + if( AtomicLoad(&db->u1.isInterrupted) ){ + pParse->rc = SQLITE_INTERRUPT; + pParse->nErr++; + break; + } + if( tokenType==TK_SPACE ){ + zSql += n; + continue; + } + if( zSql[0]==0 ){ + /* Upon reaching the end of input, call the parser two more times + ** with tokens TK_SEMI and 0, in that order. */ + if( lastTokenParsed==TK_SEMI ){ + tokenType = 0; + }else if( lastTokenParsed==0 ){ + break; + }else{ + tokenType = TK_SEMI; + } + n = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + }else if( tokenType==TK_WINDOW ){ + assert( n==6 ); + tokenType = analyzeWindowKeyword((const u8*)&zSql[6]); + }else if( tokenType==TK_OVER ){ + assert( n==4 ); + tokenType = analyzeOverKeyword((const u8*)&zSql[4], lastTokenParsed); + }else if( tokenType==TK_FILTER ){ + assert( n==6 ); + tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); +#endif /* SQLITE_OMIT_WINDOWFUNC */ + }else{ + Token x; + x.z = zSql; + x.n = n; + sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", &x); + break; + } + } + pParse->sLastToken.z = zSql; + pParse->sLastToken.n = n; + sqlite3Parser(pEngine, tokenType, pParse->sLastToken); + lastTokenParsed = tokenType; + zSql += n; + assert( db->mallocFailed==0 || pParse->rc!=SQLITE_OK || startedWithOom ); + if( pParse->rc!=SQLITE_OK ) break; + } + assert( nErr==0 ); +#ifdef YYTRACKMAXSTACKDEPTH + sqlite3_mutex_enter(sqlite3MallocMutex()); + sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, + sqlite3ParserStackPeak(pEngine) + ); + sqlite3_mutex_leave(sqlite3MallocMutex()); +#endif /* YYDEBUG */ +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + sqlite3ParserFinalize(pEngine); +#else + sqlite3ParserFree(pEngine, sqlite3_free); +#endif + if( db->mallocFailed ){ + pParse->rc = SQLITE_NOMEM_BKPT; + } + if( pParse->zErrMsg || (pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE) ){ + if( pParse->zErrMsg==0 ){ + pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc)); + } + sqlite3_log(pParse->rc, "%s in \"%s\"", pParse->zErrMsg, pParse->zTail); + nErr++; + } + pParse->zTail = zSql; +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_free(pParse->apVtabLock); +#endif + + if( pParse->pNewTable && !IN_SPECIAL_PARSE ){ + /* If the pParse->declareVtab flag is set, do not delete any table + ** structure built up in pParse->pNewTable. The calling code (see vtab.c) + ** will take responsibility for freeing the Table structure. + */ + sqlite3DeleteTable(db, pParse->pNewTable); + } + if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){ + sqlite3DeleteTrigger(db, pParse->pNewTrigger); + } + if( pParse->pVList ) sqlite3DbFreeNN(db, pParse->pVList); + db->pParse = pParentParse; + assert( nErr==0 || pParse->rc!=SQLITE_OK ); + return nErr; +} + + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Insert a single space character into pStr if the current string +** ends with an identifier +*/ +static void addSpaceSeparator(sqlite3_str *pStr){ + if( pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar-1]) ){ + sqlite3_str_append(pStr, " ", 1); + } +} + +/* +** Compute a normalization of the SQL given by zSql[0..nSql-1]. Return +** the normalization in space obtained from sqlite3DbMalloc(). Or return +** NULL if anything goes wrong or if zSql is NULL. +*/ +SQLITE_PRIVATE char *sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql /* The original SQL string */ +){ + sqlite3 *db; /* The database connection */ + int i; /* Next unread byte of zSql[] */ + int n; /* length of current token */ + int tokenType; /* type of current token */ + int prevType = 0; /* Previous non-whitespace token */ + int nParen; /* Number of nested levels of parentheses */ + int iStartIN; /* Start of RHS of IN operator in z[] */ + int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ + u32 j; /* Bytes of normalized SQL generated so far */ + sqlite3_str *pStr; /* The normalized SQL string under construction */ + + db = sqlite3VdbeDb(pVdbe); + tokenType = -1; + nParen = iStartIN = nParenAtIN = 0; + pStr = sqlite3_str_new(db); + assert( pStr!=0 ); /* sqlite3_str_new() never returns NULL */ + for(i=0; zSql[i] && pStr->accError==0; i+=n){ + if( tokenType!=TK_SPACE ){ + prevType = tokenType; + } + n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); + if( NEVER(n<=0) ) break; + switch( tokenType ){ + case TK_SPACE: { + break; + } + case TK_NULL: { + if( prevType==TK_IS || prevType==TK_NOT ){ + sqlite3_str_append(pStr, " NULL", 5); + break; + } + /* Fall through */ + } + case TK_STRING: + case TK_INTEGER: + case TK_FLOAT: + case TK_VARIABLE: + case TK_BLOB: { + sqlite3_str_append(pStr, "?", 1); + break; + } + case TK_LP: { + nParen++; + if( prevType==TK_IN ){ + iStartIN = pStr->nChar; + nParenAtIN = nParen; + } + sqlite3_str_append(pStr, "(", 1); + break; + } + case TK_RP: { + if( iStartIN>0 && nParen==nParenAtIN ){ + assert( pStr->nChar>=(u32)iStartIN ); + pStr->nChar = iStartIN+1; + sqlite3_str_append(pStr, "?,?,?", 5); + iStartIN = 0; + } + nParen--; + sqlite3_str_append(pStr, ")", 1); + break; + } + case TK_ID: { + iStartIN = 0; + j = pStr->nChar; + if( sqlite3Isquote(zSql[i]) ){ + char *zId = sqlite3DbStrNDup(db, zSql+i, n); + int nId; + int eType = 0; + if( zId==0 ) break; + sqlite3Dequote(zId); + if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, zId) ){ + sqlite3_str_append(pStr, "?", 1); + sqlite3DbFree(db, zId); + break; + } + nId = sqlite3Strlen30(zId); + if( sqlite3GetToken((u8*)zId, &eType)==nId && eType==TK_ID ){ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zId, nId); + }else{ + sqlite3_str_appendf(pStr, "\"%w\"", zId); + } + sqlite3DbFree(db, zId); + }else{ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zSql+i, n); + } + while( jnChar ){ + pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); + j++; + } + break; + } + case TK_SELECT: { + iStartIN = 0; + /* fall through */ + } + default: { + if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + j = pStr->nChar; + sqlite3_str_append(pStr, zSql+i, n); + while( jnChar ){ + pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); + j++; + } + break; + } + } + } + if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + return sqlite3_str_finish(pStr); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + +/************** End of tokenize.c ********************************************/ +/************** Begin file complete.c ****************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** An tokenizer for SQL +** +** This file contains C code that implements the sqlite3_complete() API. +** This code used to be part of the tokenizer.c source file. But by +** separating it out, the code will be automatically omitted from +** static links that do not use it. +*/ +/* #include "sqliteInt.h" */ +#ifndef SQLITE_OMIT_COMPLETE + +/* +** This is defined in tokenize.c. We just have to import the definition. +*/ +#ifndef SQLITE_AMALGAMATION +#ifdef SQLITE_ASCII +#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#endif +#ifdef SQLITE_EBCDIC +SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; +#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) +#endif +#endif /* SQLITE_AMALGAMATION */ + + +/* +** Token types used by the sqlite3_complete() routine. See the header +** comments on that procedure for additional information. +*/ +#define tkSEMI 0 +#define tkWS 1 +#define tkOTHER 2 +#ifndef SQLITE_OMIT_TRIGGER +#define tkEXPLAIN 3 +#define tkCREATE 4 +#define tkTEMP 5 +#define tkTRIGGER 6 +#define tkEND 7 +#endif + +/* +** Return TRUE if the given SQL string ends in a semicolon. +** +** Special handling is require for CREATE TRIGGER statements. +** Whenever the CREATE TRIGGER keywords are seen, the statement +** must end with ";END;". +** +** This implementation uses a state machine with 8 states: +** +** (0) INVALID We have not yet seen a non-whitespace character. +** +** (1) START At the beginning or end of an SQL statement. This routine +** returns 1 if it ends in the START state and 0 if it ends +** in any other state. +** +** (2) NORMAL We are in the middle of statement which ends with a single +** semicolon. +** +** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of +** a statement. +** +** (4) CREATE The keyword CREATE has been seen at the beginning of a +** statement, possibly preceded by EXPLAIN and/or followed by +** TEMP or TEMPORARY +** +** (5) TRIGGER We are in the middle of a trigger definition that must be +** ended by a semicolon, the keyword END, and another semicolon. +** +** (6) SEMI We've seen the first semicolon in the ";END;" that occurs at +** the end of a trigger definition. +** +** (7) END We've seen the ";END" of the ";END;" that occurs at the end +** of a trigger definition. +** +** Transitions between states above are determined by tokens extracted +** from the input. The following tokens are significant: +** +** (0) tkSEMI A semicolon. +** (1) tkWS Whitespace. +** (2) tkOTHER Any other SQL token. +** (3) tkEXPLAIN The "explain" keyword. +** (4) tkCREATE The "create" keyword. +** (5) tkTEMP The "temp" or "temporary" keyword. +** (6) tkTRIGGER The "trigger" keyword. +** (7) tkEND The "end" keyword. +** +** Whitespace never causes a state transition and is always ignored. +** This means that a SQL string of all whitespace is invalid. +** +** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed +** to recognize the end of a trigger can be omitted. All we have to do +** is look for a semicolon that is not part of an string or comment. +*/ +SQLITE_API int sqlite3_complete(const char *zSql){ + u8 state = 0; /* Current state, using numbers defined in header comment */ + u8 token; /* Value of the next token */ + +#ifndef SQLITE_OMIT_TRIGGER + /* A complex statement machine used to detect the end of a CREATE TRIGGER + ** statement. This is the normal case. + */ + static const u8 trans[8][8] = { + /* Token: */ + /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */ + /* 0 INVALID: */ { 1, 0, 2, 3, 4, 2, 2, 2, }, + /* 1 START: */ { 1, 1, 2, 3, 4, 2, 2, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, 2, 2, 2, 2, 2, }, + /* 3 EXPLAIN: */ { 1, 3, 3, 2, 4, 2, 2, 2, }, + /* 4 CREATE: */ { 1, 4, 2, 2, 2, 4, 5, 2, }, + /* 5 TRIGGER: */ { 6, 5, 5, 5, 5, 5, 5, 5, }, + /* 6 SEMI: */ { 6, 6, 5, 5, 5, 5, 5, 7, }, + /* 7 END: */ { 1, 7, 5, 5, 5, 5, 5, 5, }, + }; +#else + /* If triggers are not supported by this compile then the statement machine + ** used to detect the end of a statement is much simpler + */ + static const u8 trans[3][3] = { + /* Token: */ + /* State: ** SEMI WS OTHER */ + /* 0 INVALID: */ { 1, 0, 2, }, + /* 1 START: */ { 1, 1, 2, }, + /* 2 NORMAL: */ { 1, 2, 2, }, + }; +#endif /* SQLITE_OMIT_TRIGGER */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( zSql==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + while( *zSql ){ + switch( *zSql ){ + case ';': { /* A semicolon */ + token = tkSEMI; + break; + } + case ' ': + case '\r': + case '\t': + case '\n': + case '\f': { /* White space is ignored */ + token = tkWS; + break; + } + case '/': { /* C-style comments */ + if( zSql[1]!='*' ){ + token = tkOTHER; + break; + } + zSql += 2; + while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } + if( zSql[0]==0 ) return 0; + zSql++; + token = tkWS; + break; + } + case '-': { /* SQL-style comments from "--" to end of line */ + if( zSql[1]!='-' ){ + token = tkOTHER; + break; + } + while( *zSql && *zSql!='\n' ){ zSql++; } + if( *zSql==0 ) return state==1; + token = tkWS; + break; + } + case '[': { /* Microsoft-style identifiers in [...] */ + zSql++; + while( *zSql && *zSql!=']' ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + case '`': /* Grave-accent quoted symbols used by MySQL */ + case '"': /* single- and double-quoted strings */ + case '\'': { + int c = *zSql; + zSql++; + while( *zSql && *zSql!=c ){ zSql++; } + if( *zSql==0 ) return 0; + token = tkOTHER; + break; + } + default: { +#ifdef SQLITE_EBCDIC + unsigned char c; +#endif + if( IdChar((u8)*zSql) ){ + /* Keywords and unquoted identifiers */ + int nId; + for(nId=1; IdChar(zSql[nId]); nId++){} +#ifdef SQLITE_OMIT_TRIGGER + token = tkOTHER; +#else + switch( *zSql ){ + case 'c': case 'C': { + if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){ + token = tkCREATE; + }else{ + token = tkOTHER; + } + break; + } + case 't': case 'T': { + if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ + token = tkTRIGGER; + }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ + token = tkTEMP; + }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ + token = tkTEMP; + }else{ + token = tkOTHER; + } + break; + } + case 'e': case 'E': { + if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ + token = tkEND; + }else +#ifndef SQLITE_OMIT_EXPLAIN + if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ + token = tkEXPLAIN; + }else +#endif + { + token = tkOTHER; + } + break; + } + default: { + token = tkOTHER; + break; + } + } +#endif /* SQLITE_OMIT_TRIGGER */ + zSql += nId-1; + }else{ + /* Operators and special symbols */ + token = tkOTHER; + } + break; + } + } + state = trans[state][token]; + zSql++; + } + return state==1; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** This routine is the same as the sqlite3_complete() routine described +** above, except that the parameter is required to be UTF-16 encoded, not +** UTF-8. +*/ +SQLITE_API int sqlite3_complete16(const void *zSql){ + sqlite3_value *pVal; + char const *zSql8; + int rc; + +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zSql8 ){ + rc = sqlite3_complete(zSql8); + }else{ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3ValueFree(pVal); + return rc & 0xff; +} +#endif /* SQLITE_OMIT_UTF16 */ +#endif /* SQLITE_OMIT_COMPLETE */ + +/************** End of complete.c ********************************************/ +/************** Begin file main.c ********************************************/ +/* +** 2001 September 15 +** +** 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. +** +************************************************************************* +** Main file for the SQLite library. The routines in this file +** implement the programmer interface to the library. Routines in +** other files are for internal use by SQLite and should not be +** accessed by users of the library. +*/ +/* #include "sqliteInt.h" */ + +#ifdef SQLITE_ENABLE_FTS3 +/************** Include fts3.h in the middle of main.c ***********************/ +/************** Begin file fts3.h ********************************************/ +/* +** 2006 Oct 10 +** +** 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 header file is used by programs that want to link against the +** FTS3 library. All it does is declare the sqlite3Fts3Init() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of fts3.h ************************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#ifdef SQLITE_ENABLE_RTREE +/************** Include rtree.h in the middle of main.c **********************/ +/************** Begin file rtree.h *******************************************/ +/* +** 2008 May 26 +** +** 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 header file is used by programs that want to link against the +** RTREE library. All it does is declare the sqlite3RtreeInit() interface. +*/ +/* #include "sqlite3.h" */ + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_RTREE +#endif + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of rtree.h ***********************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) +/************** Include sqliteicu.h in the middle of main.c ******************/ +/************** Begin file sqliteicu.h ***************************************/ +/* +** 2008 May 26 +** +** 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 header file is used by programs that want to link against the +** ICU extension. All it does is declare the sqlite3IcuInit() interface. +*/ +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif /* __cplusplus */ + +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db); + +#if 0 +} /* extern "C" */ +#endif /* __cplusplus */ + +/************** End of sqliteicu.h *******************************************/ +/************** Continuing where we left off in main.c ***********************/ +#endif + +/* +** This is an extension initializer that is a no-op and always +** succeeds, except that it fails if the fault-simulation is set +** to 500. +*/ +static int sqlite3TestExtInit(sqlite3 *db){ + (void)db; + return sqlite3FaultSim(500); +} + + +/* +** Forward declarations of external module initializer functions +** for modules that need them. +*/ +#ifdef SQLITE_ENABLE_FTS1 +SQLITE_PRIVATE int sqlite3Fts1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS2 +SQLITE_PRIVATE int sqlite3Fts2Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS5 +SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_STMTVTAB +SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); +#endif + +/* +** An array of pointers to extension initializer functions for +** built-in extensions. +*/ +static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { +#ifdef SQLITE_ENABLE_FTS1 + sqlite3Fts1Init, +#endif +#ifdef SQLITE_ENABLE_FTS2 + sqlite3Fts2Init, +#endif +#ifdef SQLITE_ENABLE_FTS3 + sqlite3Fts3Init, +#endif +#ifdef SQLITE_ENABLE_FTS5 + sqlite3Fts5Init, +#endif +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) + sqlite3IcuInit, +#endif +#ifdef SQLITE_ENABLE_RTREE + sqlite3RtreeInit, +#endif +#ifdef SQLITE_ENABLE_DBPAGE_VTAB + sqlite3DbpageRegister, +#endif +#ifdef SQLITE_ENABLE_DBSTAT_VTAB + sqlite3DbstatRegister, +#endif + sqlite3TestExtInit, +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) + sqlite3JsonTableFunctions, +#endif +#ifdef SQLITE_ENABLE_STMTVTAB + sqlite3StmtVtabInit, +#endif +#ifdef SQLITE_ENABLE_BYTECODE_VTAB + sqlite3VdbeBytecodeVtabInit, +#endif +}; + +#ifndef SQLITE_AMALGAMATION +/* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant +** contains the text of SQLITE_VERSION macro. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +#endif + +/* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns +** a pointer to the to the sqlite3_version[] string constant. +*/ +SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } + +/* IMPLEMENTATION-OF: R-25063-23286 The sqlite3_sourceid() function returns a +** pointer to a string constant whose value is the same as the +** SQLITE_SOURCE_ID C preprocessor macro. Except if SQLite is built using +** an edited copy of the amalgamation, then the last four characters of +** the hash might be different from SQLITE_SOURCE_ID. +*/ +/* SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } */ + +/* IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function +** returns an integer equal to SQLITE_VERSION_NUMBER. +*/ +SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } + +/* IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns +** zero if and only if SQLite was compiled with mutexing code omitted due to +** the SQLITE_THREADSAFE compile-time option being set to 0. +*/ +SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } + +/* +** When compiling the test fixture or with debugging enabled (on Win32), +** this variable being set to non-zero will cause OSTRACE macros to emit +** extra diagnostic information. +*/ +#ifdef SQLITE_HAVE_OS_TRACE +# ifndef SQLITE_DEBUG_OS_TRACE +# define SQLITE_DEBUG_OS_TRACE 0 +# endif + int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; +#endif + +#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) +/* +** If the following function pointer is not NULL and if +** SQLITE_ENABLE_IOTRACE is enabled, then messages describing +** I/O active are written using this function. These messages +** are intended for debugging activity only. +*/ +SQLITE_API void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...) = 0; +#endif + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** temporary files. +** +** See also the "PRAGMA temp_store_directory" SQL command. +*/ +SQLITE_API char *sqlite3_temp_directory = 0; + +/* +** If the following global variable points to a string which is the +** name of a directory, then that directory will be used to store +** all database files specified with a relative pathname. +** +** See also the "PRAGMA data_store_directory" SQL command. +*/ +SQLITE_API char *sqlite3_data_directory = 0; + +/* +** Initialize SQLite. +** +** This routine must be called to initialize the memory allocation, +** VFS, and mutex subsystems prior to doing any serious work with +** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT +** this routine will be called automatically by key routines such as +** sqlite3_open(). +** +** This routine is a no-op except on its very first call for the process, +** or for the first call after a call to sqlite3_shutdown. +** +** The first thread to call this routine runs the initialization to +** completion. If subsequent threads call this routine before the first +** thread has finished the initialization process, then the subsequent +** threads must block until the first thread finishes with the initialization. +** +** The first thread might call this routine recursively. Recursive +** calls to this routine should not block, of course. Otherwise the +** initialization process would never complete. +** +** Let X be the first thread to enter this routine. Let Y be some other +** thread. Then while the initial invocation of this routine by X is +** incomplete, it is required that: +** +** * Calls to this routine from Y must block until the outer-most +** call by X completes. +** +** * Recursive calls to this routine from thread X return immediately +** without blocking. +*/ +SQLITE_API int sqlite3_initialize(void){ + MUTEX_LOGIC( sqlite3_mutex *pMainMtx; ) /* The main static mutex */ + int rc; /* Result code */ +#ifdef SQLITE_EXTRA_INIT + int bRunExtraInit = 0; /* Extra initialization needed */ +#endif + +#ifdef SQLITE_OMIT_WSD + rc = sqlite3_wsd_init(4096, 24); + if( rc!=SQLITE_OK ){ + return rc; + } +#endif + + /* If the following assert() fails on some obscure processor/compiler + ** combination, the work-around is to set the correct pointer + ** size at compile-time using -DSQLITE_PTRSIZE=n compile-time option */ + assert( SQLITE_PTRSIZE==sizeof(char*) ); + + /* If SQLite is already completely initialized, then this call + ** to sqlite3_initialize() should be a no-op. But the initialization + ** must be complete. So isInit must not be set until the very end + ** of this routine. + */ + if( sqlite3GlobalConfig.isInit ){ + sqlite3MemoryBarrier(); + return SQLITE_OK; + } + + /* Make sure the mutex subsystem is initialized. If unable to + ** initialize the mutex subsystem, return early with the error. + ** If the system is so sick that we are unable to allocate a mutex, + ** there is not much SQLite is going to be able to do. + ** + ** The mutex subsystem must take care of serializing its own + ** initialization. + */ + rc = sqlite3MutexInit(); + if( rc ) return rc; + + /* Initialize the malloc() system and the recursive pInitMutex mutex. + ** This operation is protected by the STATIC_MAIN mutex. Note that + ** MutexAlloc() is called for a static mutex prior to initializing the + ** malloc subsystem - this implies that the allocation of a static + ** mutex must not require support from the malloc subsystem. + */ + MUTEX_LOGIC( pMainMtx = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + sqlite3_mutex_enter(pMainMtx); + sqlite3GlobalConfig.isMutexInit = 1; + if( !sqlite3GlobalConfig.isMallocInit ){ + rc = sqlite3MallocInit(); + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.isMallocInit = 1; + if( !sqlite3GlobalConfig.pInitMutex ){ + sqlite3GlobalConfig.pInitMutex = + sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){ + rc = SQLITE_NOMEM_BKPT; + } + } + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.nRefInitMutex++; + } + sqlite3_mutex_leave(pMainMtx); + + /* If rc is not SQLITE_OK at this point, then either the malloc + ** subsystem could not be initialized or the system failed to allocate + ** the pInitMutex mutex. Return an error in either case. */ + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Do the rest of the initialization under the recursive mutex so + ** that we will be able to handle recursive calls into + ** sqlite3_initialize(). The recursive calls normally come through + ** sqlite3_os_init() when it invokes sqlite3_vfs_register(), but other + ** recursive calls might also be possible. + ** + ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls + ** to the xInit method, so the xInit method need not be threadsafe. + ** + ** The following mutex is what serializes access to the appdef pcache xInit + ** methods. The sqlite3_pcache_methods.xInit() all is embedded in the + ** call to sqlite3PcacheInitialize(). + */ + sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex); + if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){ + sqlite3GlobalConfig.inProgress = 1; +#ifdef SQLITE_ENABLE_SQLLOG + { + extern void sqlite3_init_sqllog(void); + sqlite3_init_sqllog(); + } +#endif + memset(&sqlite3BuiltinFunctions, 0, sizeof(sqlite3BuiltinFunctions)); + sqlite3RegisterBuiltinFunctions(); + if( sqlite3GlobalConfig.isPCacheInit==0 ){ + rc = sqlite3PcacheInitialize(); + } + if( rc==SQLITE_OK ){ + sqlite3GlobalConfig.isPCacheInit = 1; + rc = sqlite3OsInit(); + } +#ifndef SQLITE_OMIT_DESERIALIZE + if( rc==SQLITE_OK ){ + rc = sqlite3MemdbInit(); + } +#endif + if( rc==SQLITE_OK ){ + sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, + sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); + sqlite3MemoryBarrier(); + sqlite3GlobalConfig.isInit = 1; +#ifdef SQLITE_EXTRA_INIT + bRunExtraInit = 1; +#endif + } + sqlite3GlobalConfig.inProgress = 0; + } + sqlite3_mutex_leave(sqlite3GlobalConfig.pInitMutex); + + /* Go back under the static mutex and clean up the recursive + ** mutex to prevent a resource leak. + */ + sqlite3_mutex_enter(pMainMtx); + sqlite3GlobalConfig.nRefInitMutex--; + if( sqlite3GlobalConfig.nRefInitMutex<=0 ){ + assert( sqlite3GlobalConfig.nRefInitMutex==0 ); + sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex); + sqlite3GlobalConfig.pInitMutex = 0; + } + sqlite3_mutex_leave(pMainMtx); + + /* The following is just a sanity check to make sure SQLite has + ** been compiled correctly. It is important to run this code, but + ** we don't want to run it too often and soak up CPU cycles for no + ** reason. So we run it once during initialization. + */ +#ifndef NDEBUG +#ifndef SQLITE_OMIT_FLOATING_POINT + /* This section of code's only "output" is via assert() statements. */ + if( rc==SQLITE_OK ){ + u64 x = (((u64)1)<<63)-1; + double y; + assert(sizeof(x)==8); + assert(sizeof(x)==sizeof(y)); + memcpy(&y, &x, 8); + assert( sqlite3IsNaN(y) ); + } +#endif +#endif + + /* Do extra initialization steps requested by the SQLITE_EXTRA_INIT + ** compile-time option. + */ +#ifdef SQLITE_EXTRA_INIT + if( bRunExtraInit ){ + int SQLITE_EXTRA_INIT(const char*); + rc = SQLITE_EXTRA_INIT(0); + } +#endif + + return rc; +} + +/* +** Undo the effects of sqlite3_initialize(). Must not be called while +** there are outstanding database connections or memory allocations or +** while any part of SQLite is otherwise in use in any thread. This +** routine is not threadsafe. But it is safe to invoke this routine +** on when SQLite is already shut down. If SQLite is already shut down +** when this routine is invoked, then this routine is a harmless no-op. +*/ +SQLITE_API int sqlite3_shutdown(void){ +#ifdef SQLITE_OMIT_WSD + int rc = sqlite3_wsd_init(4096, 24); + if( rc!=SQLITE_OK ){ + return rc; + } +#endif + + if( sqlite3GlobalConfig.isInit ){ +#ifdef SQLITE_EXTRA_SHUTDOWN + void SQLITE_EXTRA_SHUTDOWN(void); + SQLITE_EXTRA_SHUTDOWN(); +#endif + sqlite3_os_end(); + sqlite3_reset_auto_extension(); + sqlite3GlobalConfig.isInit = 0; + } + if( sqlite3GlobalConfig.isPCacheInit ){ + sqlite3PcacheShutdown(); + sqlite3GlobalConfig.isPCacheInit = 0; + } + if( sqlite3GlobalConfig.isMallocInit ){ + sqlite3MallocEnd(); + sqlite3GlobalConfig.isMallocInit = 0; + +#ifndef SQLITE_OMIT_SHUTDOWN_DIRECTORIES + /* The heap subsystem has now been shutdown and these values are supposed + ** to be NULL or point to memory that was obtained from sqlite3_malloc(), + ** which would rely on that heap subsystem; therefore, make sure these + ** values cannot refer to heap memory that was just invalidated when the + ** heap subsystem was shutdown. This is only done if the current call to + ** this function resulted in the heap subsystem actually being shutdown. + */ + sqlite3_data_directory = 0; + sqlite3_temp_directory = 0; +#endif + } + if( sqlite3GlobalConfig.isMutexInit ){ + sqlite3MutexEnd(); + sqlite3GlobalConfig.isMutexInit = 0; + } + + return SQLITE_OK; +} + +/* +** This API allows applications to modify the global configuration of +** the SQLite library at run-time. +** +** This routine should only be called when there are no outstanding +** database connections or memory allocations. This routine is not +** threadsafe. Failure to heed these warnings can lead to unpredictable +** behavior. +*/ +SQLITE_API int sqlite3_config(int op, ...){ + va_list ap; + int rc = SQLITE_OK; + + /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while + ** the SQLite library is in use. */ + if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT; + + va_start(ap, op); + switch( op ){ + + /* Mutex configuration options are only available in a threadsafe + ** compile. + */ +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */ + case SQLITE_CONFIG_SINGLETHREAD: { + /* EVIDENCE-OF: R-02748-19096 This option sets the threading mode to + ** Single-thread. */ + sqlite3GlobalConfig.bCoreMutex = 0; /* Disable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-20520-54086 */ + case SQLITE_CONFIG_MULTITHREAD: { + /* EVIDENCE-OF: R-14374-42468 This option sets the threading mode to + ** Multi-thread. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-59593-21810 */ + case SQLITE_CONFIG_SERIALIZED: { + /* EVIDENCE-OF: R-41220-51800 This option sets the threading mode to + ** Serialized. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 1; /* Enable mutex on connections */ + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-63666-48755 */ + case SQLITE_CONFIG_MUTEX: { + /* Specify an alternative mutex implementation */ + sqlite3GlobalConfig.mutex = *va_arg(ap, sqlite3_mutex_methods*); + break; + } +#endif +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-14450-37597 */ + case SQLITE_CONFIG_GETMUTEX: { + /* Retrieve the current mutex implementation */ + *va_arg(ap, sqlite3_mutex_methods*) = sqlite3GlobalConfig.mutex; + break; + } +#endif + + case SQLITE_CONFIG_MALLOC: { + /* EVIDENCE-OF: R-55594-21030 The SQLITE_CONFIG_MALLOC option takes a + ** single argument which is a pointer to an instance of the + ** sqlite3_mem_methods structure. The argument specifies alternative + ** low-level memory allocation routines to be used in place of the memory + ** allocation routines built into SQLite. */ + sqlite3GlobalConfig.m = *va_arg(ap, sqlite3_mem_methods*); + break; + } + case SQLITE_CONFIG_GETMALLOC: { + /* EVIDENCE-OF: R-51213-46414 The SQLITE_CONFIG_GETMALLOC option takes a + ** single argument which is a pointer to an instance of the + ** sqlite3_mem_methods structure. The sqlite3_mem_methods structure is + ** filled with the currently defined memory allocation routines. */ + if( sqlite3GlobalConfig.m.xMalloc==0 ) sqlite3MemSetDefault(); + *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m; + break; + } + case SQLITE_CONFIG_MEMSTATUS: { + /* EVIDENCE-OF: R-61275-35157 The SQLITE_CONFIG_MEMSTATUS option takes + ** single argument of type int, interpreted as a boolean, which enables + ** or disables the collection of memory allocation statistics. */ + sqlite3GlobalConfig.bMemstat = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_SMALL_MALLOC: { + sqlite3GlobalConfig.bSmallMalloc = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_PAGECACHE: { + /* EVIDENCE-OF: R-18761-36601 There are three arguments to + ** SQLITE_CONFIG_PAGECACHE: A pointer to 8-byte aligned memory (pMem), + ** the size of each page cache line (sz), and the number of cache lines + ** (N). */ + sqlite3GlobalConfig.pPage = va_arg(ap, void*); + sqlite3GlobalConfig.szPage = va_arg(ap, int); + sqlite3GlobalConfig.nPage = va_arg(ap, int); + break; + } + case SQLITE_CONFIG_PCACHE_HDRSZ: { + /* EVIDENCE-OF: R-39100-27317 The SQLITE_CONFIG_PCACHE_HDRSZ option takes + ** a single parameter which is a pointer to an integer and writes into + ** that integer the number of extra bytes per page required for each page + ** in SQLITE_CONFIG_PAGECACHE. */ + *va_arg(ap, int*) = + sqlite3HeaderSizeBtree() + + sqlite3HeaderSizePcache() + + sqlite3HeaderSizePcache1(); + break; + } + + case SQLITE_CONFIG_PCACHE: { + /* no-op */ + break; + } + case SQLITE_CONFIG_GETPCACHE: { + /* now an error */ + rc = SQLITE_ERROR; + break; + } + + case SQLITE_CONFIG_PCACHE2: { + /* EVIDENCE-OF: R-63325-48378 The SQLITE_CONFIG_PCACHE2 option takes a + ** single argument which is a pointer to an sqlite3_pcache_methods2 + ** object. This object specifies the interface to a custom page cache + ** implementation. */ + sqlite3GlobalConfig.pcache2 = *va_arg(ap, sqlite3_pcache_methods2*); + break; + } + case SQLITE_CONFIG_GETPCACHE2: { + /* EVIDENCE-OF: R-22035-46182 The SQLITE_CONFIG_GETPCACHE2 option takes a + ** single argument which is a pointer to an sqlite3_pcache_methods2 + ** object. SQLite copies of the current page cache implementation into + ** that object. */ + if( sqlite3GlobalConfig.pcache2.xInit==0 ){ + sqlite3PCacheSetDefault(); + } + *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2; + break; + } + +/* EVIDENCE-OF: R-06626-12911 The SQLITE_CONFIG_HEAP option is only +** available if SQLite is compiled with either SQLITE_ENABLE_MEMSYS3 or +** SQLITE_ENABLE_MEMSYS5 and returns SQLITE_ERROR if invoked otherwise. */ +#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) + case SQLITE_CONFIG_HEAP: { + /* EVIDENCE-OF: R-19854-42126 There are three arguments to + ** SQLITE_CONFIG_HEAP: An 8-byte aligned pointer to the memory, the + ** number of bytes in the memory buffer, and the minimum allocation size. + */ + sqlite3GlobalConfig.pHeap = va_arg(ap, void*); + sqlite3GlobalConfig.nHeap = va_arg(ap, int); + sqlite3GlobalConfig.mnReq = va_arg(ap, int); + + if( sqlite3GlobalConfig.mnReq<1 ){ + sqlite3GlobalConfig.mnReq = 1; + }else if( sqlite3GlobalConfig.mnReq>(1<<12) ){ + /* cap min request size at 2^12 */ + sqlite3GlobalConfig.mnReq = (1<<12); + } + + if( sqlite3GlobalConfig.pHeap==0 ){ + /* EVIDENCE-OF: R-49920-60189 If the first pointer (the memory pointer) + ** is NULL, then SQLite reverts to using its default memory allocator + ** (the system malloc() implementation), undoing any prior invocation of + ** SQLITE_CONFIG_MALLOC. + ** + ** Setting sqlite3GlobalConfig.m to all zeros will cause malloc to + ** revert to its default implementation when sqlite3_initialize() is run + */ + memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m)); + }else{ + /* EVIDENCE-OF: R-61006-08918 If the memory pointer is not NULL then the + ** alternative memory allocator is engaged to handle all of SQLites + ** memory allocation needs. */ +#ifdef SQLITE_ENABLE_MEMSYS3 + sqlite3GlobalConfig.m = *sqlite3MemGetMemsys3(); +#endif +#ifdef SQLITE_ENABLE_MEMSYS5 + sqlite3GlobalConfig.m = *sqlite3MemGetMemsys5(); +#endif + } + break; + } +#endif + + case SQLITE_CONFIG_LOOKASIDE: { + sqlite3GlobalConfig.szLookaside = va_arg(ap, int); + sqlite3GlobalConfig.nLookaside = va_arg(ap, int); + break; + } + + /* Record a pointer to the logger function and its first argument. + ** The default is NULL. Logging is disabled if the function pointer is + ** NULL. + */ + case SQLITE_CONFIG_LOG: { + /* MSVC is picky about pulling func ptrs from va lists. + ** http://support.microsoft.com/kb/47961 + ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*)); + */ + typedef void(*LOGFUNC_t)(void*,int,const char*); + sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t); + sqlite3GlobalConfig.pLogArg = va_arg(ap, void*); + break; + } + + /* EVIDENCE-OF: R-55548-33817 The compile-time setting for URI filenames + ** can be changed at start-time using the + ** sqlite3_config(SQLITE_CONFIG_URI,1) or + ** sqlite3_config(SQLITE_CONFIG_URI,0) configuration calls. + */ + case SQLITE_CONFIG_URI: { + /* EVIDENCE-OF: R-25451-61125 The SQLITE_CONFIG_URI option takes a single + ** argument of type int. If non-zero, then URI handling is globally + ** enabled. If the parameter is zero, then URI handling is globally + ** disabled. */ + sqlite3GlobalConfig.bOpenUri = va_arg(ap, int); + break; + } + + case SQLITE_CONFIG_COVERING_INDEX_SCAN: { + /* EVIDENCE-OF: R-36592-02772 The SQLITE_CONFIG_COVERING_INDEX_SCAN + ** option takes a single integer argument which is interpreted as a + ** boolean in order to enable or disable the use of covering indices for + ** full table scans in the query optimizer. */ + sqlite3GlobalConfig.bUseCis = va_arg(ap, int); + break; + } + +#ifdef SQLITE_ENABLE_SQLLOG + case SQLITE_CONFIG_SQLLOG: { + typedef void(*SQLLOGFUNC_t)(void*, sqlite3*, const char*, int); + sqlite3GlobalConfig.xSqllog = va_arg(ap, SQLLOGFUNC_t); + sqlite3GlobalConfig.pSqllogArg = va_arg(ap, void *); + break; + } +#endif + + case SQLITE_CONFIG_MMAP_SIZE: { + /* EVIDENCE-OF: R-58063-38258 SQLITE_CONFIG_MMAP_SIZE takes two 64-bit + ** integer (sqlite3_int64) values that are the default mmap size limit + ** (the default setting for PRAGMA mmap_size) and the maximum allowed + ** mmap size limit. */ + sqlite3_int64 szMmap = va_arg(ap, sqlite3_int64); + sqlite3_int64 mxMmap = va_arg(ap, sqlite3_int64); + /* EVIDENCE-OF: R-53367-43190 If either argument to this option is + ** negative, then that argument is changed to its compile-time default. + ** + ** EVIDENCE-OF: R-34993-45031 The maximum allowed mmap size will be + ** silently truncated if necessary so that it does not exceed the + ** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE + ** compile-time option. + */ + if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ){ + mxMmap = SQLITE_MAX_MMAP_SIZE; + } + if( szMmap<0 ) szMmap = SQLITE_DEFAULT_MMAP_SIZE; + if( szMmap>mxMmap) szMmap = mxMmap; + sqlite3GlobalConfig.mxMmap = mxMmap; + sqlite3GlobalConfig.szMmap = szMmap; + break; + } + +#if SQLITE_OS_WIN && defined(SQLITE_WIN32_MALLOC) /* IMP: R-04780-55815 */ + case SQLITE_CONFIG_WIN32_HEAPSIZE: { + /* EVIDENCE-OF: R-34926-03360 SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit + ** unsigned integer value that specifies the maximum size of the created + ** heap. */ + sqlite3GlobalConfig.nHeap = va_arg(ap, int); + break; + } +#endif + + case SQLITE_CONFIG_PMASZ: { + sqlite3GlobalConfig.szPma = va_arg(ap, unsigned int); + break; + } + + case SQLITE_CONFIG_STMTJRNL_SPILL: { + sqlite3GlobalConfig.nStmtSpill = va_arg(ap, int); + break; + } + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + case SQLITE_CONFIG_SORTERREF_SIZE: { + int iVal = va_arg(ap, int); + if( iVal<0 ){ + iVal = SQLITE_DEFAULT_SORTERREF_SIZE; + } + sqlite3GlobalConfig.szSorterRef = (u32)iVal; + break; + } +#endif /* SQLITE_ENABLE_SORTER_REFERENCES */ + +#ifndef SQLITE_OMIT_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_OMIT_DESERIALIZE */ + + default: { + rc = SQLITE_ERROR; + break; + } + } + va_end(ap); + return rc; +} + +/* +** Set up the lookaside buffers for a database connection. +** Return SQLITE_OK on success. +** If lookaside is already active, return SQLITE_BUSY. +** +** The sz parameter is the number of bytes in each lookaside slot. +** The cnt parameter is the number of slots. If pStart is NULL the +** space for the lookaside memory is obtained from sqlite3_malloc(). +** If pStart is not NULL then it is sz*cnt bytes of memory to use for +** the lookaside memory. +*/ +static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ +#ifndef SQLITE_OMIT_LOOKASIDE + void *pStart; + sqlite3_int64 szAlloc = sz*(sqlite3_int64)cnt; + int nBig; /* Number of full-size slots */ + int nSm; /* Number smaller LOOKASIDE_SMALL-byte slots */ + + if( sqlite3LookasideUsed(db,0)>0 ){ + return SQLITE_BUSY; + } + /* Free any existing lookaside buffer for this handle before + ** allocating a new one so we don't have to have space for + ** both at the same time. + */ + if( db->lookaside.bMalloced ){ + sqlite3_free(db->lookaside.pStart); + } + /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger + ** than a pointer to be useful. + */ + sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */ + if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0; + if( cnt<0 ) cnt = 0; + if( sz==0 || cnt==0 ){ + sz = 0; + pStart = 0; + }else if( pBuf==0 ){ + sqlite3BeginBenignMalloc(); + pStart = sqlite3Malloc( szAlloc ); /* IMP: R-61949-35727 */ + sqlite3EndBenignMalloc(); + if( pStart ) szAlloc = sqlite3MallocSize(pStart); + }else{ + pStart = pBuf; + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( sz>=LOOKASIDE_SMALL*3 ){ + nBig = szAlloc/(3*LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else if( sz>=LOOKASIDE_SMALL*2 ){ + nBig = szAlloc/(LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + if( sz>0 ){ + nBig = szAlloc/sz; + nSm = 0; + }else{ + nBig = nSm = 0; + } + db->lookaside.pStart = pStart; + db->lookaside.pInit = 0; + db->lookaside.pFree = 0; + db->lookaside.sz = (u16)sz; + db->lookaside.szTrue = (u16)sz; + if( pStart ){ + int i; + LookasideSlot *p; + assert( sz > (int)sizeof(LookasideSlot*) ); + p = (LookasideSlot*)pStart; + for(i=0; ipNext = db->lookaside.pInit; + db->lookaside.pInit = p; + p = (LookasideSlot*)&((u8*)p)[sz]; + } +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; + db->lookaside.pMiddle = p; + for(i=0; ipNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = p; + p = (LookasideSlot*)&((u8*)p)[LOOKASIDE_SMALL]; + } +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + assert( ((uptr)p)<=szAlloc + (uptr)pStart ); + db->lookaside.pEnd = p; + db->lookaside.bDisable = 0; + db->lookaside.bMalloced = pBuf==0 ?1:0; + db->lookaside.nSlot = nBig+nSm; + }else{ + db->lookaside.pStart = db; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; + db->lookaside.pMiddle = db; +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ + db->lookaside.pEnd = db; + db->lookaside.bDisable = 1; + db->lookaside.sz = 0; + db->lookaside.bMalloced = 0; + db->lookaside.nSlot = 0; + } + assert( sqlite3LookasideUsed(db,0)==0 ); +#endif /* SQLITE_OMIT_LOOKASIDE */ + return SQLITE_OK; +} + +/* +** Return the mutex associated with a database connection. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->mutex; +} + +/* +** Free up as much memory as we can from the given database +** connection. +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ + int i; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + Pager *pPager = sqlite3BtreePager(pBt); + sqlite3PagerShrink(pPager); + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Flush any dirty pages in the pager-cache for any attached database +** to disk. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ + int i; + int rc = SQLITE_OK; + int bSeenBusy = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt && sqlite3BtreeTxnState(pBt)==SQLITE_TXN_WRITE ){ + Pager *pPager = sqlite3BtreePager(pBt); + rc = sqlite3PagerFlush(pPager); + if( rc==SQLITE_BUSY ){ + bSeenBusy = 1; + rc = SQLITE_OK; + } + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return ((rc==SQLITE_OK && bSeenBusy) ? SQLITE_BUSY : rc); +} + +/* +** Configuration settings for an individual database connection +*/ +SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ + va_list ap; + int rc; + va_start(ap, op); + switch( op ){ + case SQLITE_DBCONFIG_MAINDBNAME: { + /* IMP: R-06824-28531 */ + /* IMP: R-36257-52125 */ + db->aDb[0].zDbSName = va_arg(ap,char*); + rc = SQLITE_OK; + break; + } + case SQLITE_DBCONFIG_LOOKASIDE: { + void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ + int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ + int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */ + rc = setupLookaside(db, pBuf, sz, cnt); + break; + } + default: { + static const struct { + int op; /* The opcode */ + u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ + } aFlagOp[] = { + { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, + { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_VIEW, SQLITE_EnableView }, + { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, + { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, + { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, + { SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG }, + { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, + { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase }, + { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive }, + { SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_WriteSchema| + SQLITE_NoSchemaError }, + { SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_LegacyAlter }, + { SQLITE_DBCONFIG_DQS_DDL, SQLITE_DqsDDL }, + { SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML }, + { SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_LegacyFileFmt }, + { SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema }, + }; + unsigned int i; + rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ + for(i=0; iflags; + if( onoff>0 ){ + db->flags |= aFlagOp[i].mask; + }else if( onoff==0 ){ + db->flags &= ~(u64)aFlagOp[i].mask; + } + if( oldFlags!=db->flags ){ + sqlite3ExpirePreparedStatements(db, 0); + } + if( pRes ){ + *pRes = (db->flags & aFlagOp[i].mask)!=0; + } + rc = SQLITE_OK; + break; + } + } + break; + } + } + va_end(ap); + return rc; +} + +/* +** This is the default collating function named "BINARY" which is always +** available. +*/ +static int binCollFunc( + void *NotUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + int rc, n; + UNUSED_PARAMETER(NotUsed); + n = nKey1xCmp!=binCollFunc || strcmp(p->zName,"BINARY")==0 ); + return p==0 || p->xCmp==binCollFunc; +} + +/* +** Another built-in collating sequence: NOCASE. +** +** This collating sequence is intended to be used for "case independent +** comparison". SQLite's knowledge of upper and lower case equivalents +** extends only to the 26 characters used in the English language. +** +** At the moment there is only a UTF-8 implementation. +*/ +static int nocaseCollatingFunc( + void *NotUsed, + int nKey1, const void *pKey1, + int nKey2, const void *pKey2 +){ + int r = sqlite3StrNICmp( + (const char *)pKey1, (const char *)pKey2, (nKey1lastRowid; +} + +/* +** Set the value returned by the sqlite3_last_insert_rowid() API function. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3 *db, sqlite3_int64 iRowid){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + sqlite3_mutex_enter(db->mutex); + db->lastRowid = iRowid; + sqlite3_mutex_leave(db->mutex); +} + +/* +** Return the number of changes in the most recent call to sqlite3_exec(). +*/ +SQLITE_API sqlite3_int64 sqlite3_changes64(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->nChange; +} +SQLITE_API int sqlite3_changes(sqlite3 *db){ + return (int)sqlite3_changes64(db); +} + +/* +** Return the number of changes since the database handle was opened. +*/ +SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->nTotalChange; +} +SQLITE_API int sqlite3_total_changes(sqlite3 *db){ + return (int)sqlite3_total_changes64(db); +} + +/* +** Close all open savepoints. This function only manipulates fields of the +** database handle object, it does not close any savepoints that may be open +** at the b-tree/pager level. +*/ +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){ + while( db->pSavepoint ){ + Savepoint *pTmp = db->pSavepoint; + db->pSavepoint = pTmp->pNext; + sqlite3DbFree(db, pTmp); + } + db->nSavepoint = 0; + db->nStatement = 0; + db->isTransactionSavepoint = 0; +} + +/* +** Invoke the destructor function associated with FuncDef p, if any. Except, +** if this is not the last copy of the function, do not invoke it. Multiple +** copies of a single function are created when create_function() is called +** with SQLITE_ANY as the encoding. +*/ +static void functionDestroy(sqlite3 *db, FuncDef *p){ + FuncDestructor *pDestructor; + assert( (p->funcFlags & SQLITE_FUNC_BUILTIN)==0 ); + pDestructor = p->u.pDestructor; + if( pDestructor ){ + pDestructor->nRef--; + if( pDestructor->nRef==0 ){ + pDestructor->xDestroy(pDestructor->pUserData); + sqlite3DbFree(db, pDestructor); + } + } +} + +/* +** Disconnect all sqlite3_vtab objects that belong to database connection +** db. This is called when db is being closed. +*/ +static void disconnectAllVtab(sqlite3 *db){ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int i; + HashElem *p; + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + Schema *pSchema = db->aDb[i].pSchema; + if( pSchema ){ + for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ + Table *pTab = (Table *)sqliteHashData(p); + if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab); + } + } + } + for(p=sqliteHashFirst(&db->aModule); p; p=sqliteHashNext(p)){ + Module *pMod = (Module *)sqliteHashData(p); + if( pMod->pEpoTab ){ + sqlite3VtabDisconnect(db, pMod->pEpoTab); + } + } + sqlite3VtabUnlockList(db); + sqlite3BtreeLeaveAll(db); +#else + UNUSED_PARAMETER(db); +#endif +} + +/* +** Return TRUE if database connection db has unfinalized prepared +** statements or unfinished sqlite3_backup objects. +*/ +static int connectionIsBusy(sqlite3 *db){ + int j; + assert( sqlite3_mutex_held(db->mutex) ); + if( db->pVdbe ) return 1; + for(j=0; jnDb; j++){ + Btree *pBt = db->aDb[j].pBt; + if( pBt && sqlite3BtreeIsInBackup(pBt) ) return 1; + } + return 0; +} + +/* +** Close an existing SQLite database +*/ +static int sqlite3Close(sqlite3 *db, int forceZombie){ + if( !db ){ + /* EVIDENCE-OF: R-63257-11740 Calling sqlite3_close() or + ** sqlite3_close_v2() with a NULL pointer argument is a harmless no-op. */ + return SQLITE_OK; + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + sqlite3_mutex_enter(db->mutex); + if( db->mTrace & SQLITE_TRACE_CLOSE ){ + db->trace.xV2(SQLITE_TRACE_CLOSE, db->pTraceArg, db, 0); + } + + /* Force xDisconnect calls on all virtual tables */ + disconnectAllVtab(db); + + /* If a transaction is open, the disconnectAllVtab() call above + ** will not have called the xDisconnect() method on any virtual + ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() + ** call will do so. We need to do this before the check for active + ** SQL statements below, as the v-table implementation may be storing + ** some prepared statements internally. + */ + sqlite3VtabRollback(db); + + /* Legacy behavior (sqlite3_close() behavior) is to return + ** SQLITE_BUSY if the connection can not be closed immediately. + */ + if( !forceZombie && connectionIsBusy(db) ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, "unable to close due to unfinalized " + "statements or unfinished backups"); + sqlite3_mutex_leave(db->mutex); + return SQLITE_BUSY; + } + +#ifdef SQLITE_ENABLE_SQLLOG + if( sqlite3GlobalConfig.xSqllog ){ + /* Closing the handle. Fourth parameter is passed the value 2. */ + sqlite3GlobalConfig.xSqllog(sqlite3GlobalConfig.pSqllogArg, db, 0, 2); + } +#endif + + /* Convert the connection into a zombie and then close it. + */ + db->eOpenState = SQLITE_STATE_ZOMBIE; + sqlite3LeaveMutexAndCloseZombie(db); + return SQLITE_OK; +} + +/* +** Return the transaction state for a single databse, or the maximum +** transaction state over all attached databases if zSchema is null. +*/ +SQLITE_API int sqlite3_txn_state(sqlite3 *db, const char *zSchema){ + int iDb, nDb; + int iTxn = -1; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( zSchema ){ + nDb = iDb = sqlite3FindDbName(db, zSchema); + if( iDb<0 ) nDb--; + }else{ + iDb = 0; + nDb = db->nDb-1; + } + for(; iDb<=nDb; iDb++){ + Btree *pBt = db->aDb[iDb].pBt; + int x = pBt!=0 ? sqlite3BtreeTxnState(pBt) : SQLITE_TXN_NONE; + if( x>iTxn ) iTxn = x; + } + sqlite3_mutex_leave(db->mutex); + return iTxn; +} + +/* +** Two variations on the public interface for closing a database +** connection. The sqlite3_close() version returns SQLITE_BUSY and +** leaves the connection open if there are unfinalized prepared +** statements or unfinished sqlite3_backups. The sqlite3_close_v2() +** version forces the connection to become a zombie if there are +** unclosed resources, and arranges for deallocation when the last +** prepare statement or sqlite3_backup closes. +*/ +SQLITE_API int sqlite3_close(sqlite3 *db){ return sqlite3Close(db,0); } +SQLITE_API int sqlite3_close_v2(sqlite3 *db){ return sqlite3Close(db,1); } + + +/* +** Close the mutex on database connection db. +** +** Furthermore, if database connection db is a zombie (meaning that there +** has been a prior call to sqlite3_close(db) or sqlite3_close_v2(db)) and +** every sqlite3_stmt has now been finalized and every sqlite3_backup has +** finished, then free all resources. +*/ +SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ + HashElem *i; /* Hash table iterator */ + int j; + + /* If there are outstanding sqlite3_stmt or sqlite3_backup objects + ** or if the connection has not yet been closed by sqlite3_close_v2(), + ** then just leave the mutex and return. + */ + if( db->eOpenState!=SQLITE_STATE_ZOMBIE || connectionIsBusy(db) ){ + sqlite3_mutex_leave(db->mutex); + return; + } + + /* If we reach this point, it means that the database connection has + ** closed all sqlite3_stmt and sqlite3_backup objects and has been + ** passed to sqlite3_close (meaning that it is a zombie). Therefore, + ** go ahead and free all resources. + */ + + /* If a transaction is open, roll it back. This also ensures that if + ** any database schemas have been modified by an uncommitted transaction + ** they are reset. And that the required b-tree mutex is held to make + ** the pager rollback and schema reset an atomic operation. */ + sqlite3RollbackAll(db, SQLITE_OK); + + /* Free any outstanding Savepoint structures. */ + sqlite3CloseSavepoints(db); + + /* Close all database connections */ + for(j=0; jnDb; j++){ + struct Db *pDb = &db->aDb[j]; + if( pDb->pBt ){ + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + if( j!=1 ){ + pDb->pSchema = 0; + } + } + } + /* Clear the TEMP schema separately and last */ + if( db->aDb[1].pSchema ){ + sqlite3SchemaClear(db->aDb[1].pSchema); + } + sqlite3VtabUnlockList(db); + + /* Free up the array of auxiliary databases */ + sqlite3CollapseDatabaseArray(db); + assert( db->nDb<=2 ); + assert( db->aDb==db->aDbStatic ); + + /* Tell the code in notify.c that the connection no longer holds any + ** locks and does not require any further unlock-notify callbacks. + */ + sqlite3ConnectionClosed(db); + + for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ + FuncDef *pNext, *p; + p = sqliteHashData(i); + do{ + functionDestroy(db, p); + pNext = p->pNext; + sqlite3DbFree(db, p); + p = pNext; + }while( p ); + } + sqlite3HashClear(&db->aFunc); + for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ + CollSeq *pColl = (CollSeq *)sqliteHashData(i); + /* Invoke any destructors registered for collation sequence user data. */ + for(j=0; j<3; j++){ + if( pColl[j].xDel ){ + pColl[j].xDel(pColl[j].pUser); + } + } + sqlite3DbFree(db, pColl); + } + sqlite3HashClear(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ + Module *pMod = (Module *)sqliteHashData(i); + sqlite3VtabEponymousTableClear(db, pMod); + sqlite3VtabModuleUnref(db, pMod); + } + sqlite3HashClear(&db->aModule); +#endif + + sqlite3Error(db, SQLITE_OK); /* Deallocates any cached error strings. */ + sqlite3ValueFree(db->pErr); + sqlite3CloseExtensions(db); +#if SQLITE_USER_AUTHENTICATION + sqlite3_free(db->auth.zAuthUser); + sqlite3_free(db->auth.zAuthPW); +#endif + + db->eOpenState = SQLITE_STATE_ERROR; + + /* The temp-database schema is allocated differently from the other schema + ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). + ** So it needs to be freed here. Todo: Why not roll the temp schema into + ** the same sqliteMalloc() as the one that allocates the database + ** structure? + */ + sqlite3DbFree(db, db->aDb[1].pSchema); + if( db->xAutovacDestr ){ + db->xAutovacDestr(db->pAutovacPagesArg); + } + sqlite3_mutex_leave(db->mutex); + db->eOpenState = SQLITE_STATE_CLOSED; + sqlite3_mutex_free(db->mutex); + assert( sqlite3LookasideUsed(db,0)==0 ); + if( db->lookaside.bMalloced ){ + sqlite3_free(db->lookaside.pStart); + } + sqlite3_free(db); +} + +/* +** Rollback all database files. If tripCode is not SQLITE_OK, then +** any write cursors are invalidated ("tripped" - as in "tripping a circuit +** breaker") and made to return tripCode if there are any further +** attempts to use that cursor. Read cursors remain open and valid +** but are "saved" in case the table pages are moved around. +*/ +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ + int i; + int inTrans = 0; + int schemaChange; + assert( sqlite3_mutex_held(db->mutex) ); + sqlite3BeginBenignMalloc(); + + /* Obtain all b-tree mutexes before making any calls to BtreeRollback(). + ** This is important in case the transaction being rolled back has + ** modified the database schema. If the b-tree mutexes are not taken + ** here, then another shared-cache connection might sneak in between + ** the database rollback and schema reset, which can cause false + ** corruption reports in some cases. */ + sqlite3BtreeEnterAll(db); + schemaChange = (db->mDbFlags & DBFLAG_SchemaChange)!=0 && db->init.busy==0; + + for(i=0; inDb; i++){ + Btree *p = db->aDb[i].pBt; + if( p ){ + if( sqlite3BtreeTxnState(p)==SQLITE_TXN_WRITE ){ + inTrans = 1; + } + sqlite3BtreeRollback(p, tripCode, !schemaChange); + } + } + sqlite3VtabRollback(db); + sqlite3EndBenignMalloc(); + + if( schemaChange ){ + sqlite3ExpirePreparedStatements(db, 0); + sqlite3ResetAllSchemasOfConnection(db); + } + sqlite3BtreeLeaveAll(db); + + /* Any deferred constraint violations have now been resolved. */ + db->nDeferredCons = 0; + db->nDeferredImmCons = 0; + db->flags &= ~(u64)(SQLITE_DeferFKs|SQLITE_CorruptRdOnly); + + /* If one has been configured, invoke the rollback-hook callback */ + if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ + db->xRollbackCallback(db->pRollbackArg); + } +} + +/* +** Return a static string containing the name corresponding to the error code +** specified in the argument. +*/ +#if defined(SQLITE_NEED_ERR_NAME) +SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ + const char *zName = 0; + int i, origRc = rc; + for(i=0; i<2 && zName==0; i++, rc &= 0xff){ + switch( rc ){ + case SQLITE_OK: zName = "SQLITE_OK"; break; + case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; + case SQLITE_ERROR_SNAPSHOT: zName = "SQLITE_ERROR_SNAPSHOT"; break; + case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; + case SQLITE_PERM: zName = "SQLITE_PERM"; break; + case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; + case SQLITE_ABORT_ROLLBACK: zName = "SQLITE_ABORT_ROLLBACK"; break; + case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; + case SQLITE_BUSY_RECOVERY: zName = "SQLITE_BUSY_RECOVERY"; break; + case SQLITE_BUSY_SNAPSHOT: zName = "SQLITE_BUSY_SNAPSHOT"; break; + case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; + case SQLITE_LOCKED_SHAREDCACHE: zName = "SQLITE_LOCKED_SHAREDCACHE";break; + case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; + case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; + case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break; + case SQLITE_READONLY_CANTINIT: zName = "SQLITE_READONLY_CANTINIT"; break; + case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break; + case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break; + case SQLITE_READONLY_DIRECTORY: zName = "SQLITE_READONLY_DIRECTORY";break; + case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; + case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; + case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; + case SQLITE_IOERR_SHORT_READ: zName = "SQLITE_IOERR_SHORT_READ"; break; + case SQLITE_IOERR_WRITE: zName = "SQLITE_IOERR_WRITE"; break; + case SQLITE_IOERR_FSYNC: zName = "SQLITE_IOERR_FSYNC"; break; + case SQLITE_IOERR_DIR_FSYNC: zName = "SQLITE_IOERR_DIR_FSYNC"; break; + case SQLITE_IOERR_TRUNCATE: zName = "SQLITE_IOERR_TRUNCATE"; break; + case SQLITE_IOERR_FSTAT: zName = "SQLITE_IOERR_FSTAT"; break; + case SQLITE_IOERR_UNLOCK: zName = "SQLITE_IOERR_UNLOCK"; break; + case SQLITE_IOERR_RDLOCK: zName = "SQLITE_IOERR_RDLOCK"; break; + case SQLITE_IOERR_DELETE: zName = "SQLITE_IOERR_DELETE"; break; + case SQLITE_IOERR_NOMEM: zName = "SQLITE_IOERR_NOMEM"; break; + case SQLITE_IOERR_ACCESS: zName = "SQLITE_IOERR_ACCESS"; break; + case SQLITE_IOERR_CHECKRESERVEDLOCK: + zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; + case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; + case SQLITE_IOERR_CLOSE: zName = "SQLITE_IOERR_CLOSE"; break; + case SQLITE_IOERR_DIR_CLOSE: zName = "SQLITE_IOERR_DIR_CLOSE"; break; + case SQLITE_IOERR_SHMOPEN: zName = "SQLITE_IOERR_SHMOPEN"; break; + case SQLITE_IOERR_SHMSIZE: zName = "SQLITE_IOERR_SHMSIZE"; break; + case SQLITE_IOERR_SHMLOCK: zName = "SQLITE_IOERR_SHMLOCK"; break; + case SQLITE_IOERR_SHMMAP: zName = "SQLITE_IOERR_SHMMAP"; break; + case SQLITE_IOERR_SEEK: zName = "SQLITE_IOERR_SEEK"; break; + case SQLITE_IOERR_DELETE_NOENT: zName = "SQLITE_IOERR_DELETE_NOENT";break; + case SQLITE_IOERR_MMAP: zName = "SQLITE_IOERR_MMAP"; break; + case SQLITE_IOERR_GETTEMPPATH: zName = "SQLITE_IOERR_GETTEMPPATH"; break; + case SQLITE_IOERR_CONVPATH: zName = "SQLITE_IOERR_CONVPATH"; break; + case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; + case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break; + case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break; + case SQLITE_FULL: zName = "SQLITE_FULL"; break; + case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; + case SQLITE_CANTOPEN_NOTEMPDIR: zName = "SQLITE_CANTOPEN_NOTEMPDIR";break; + case SQLITE_CANTOPEN_ISDIR: zName = "SQLITE_CANTOPEN_ISDIR"; break; + case SQLITE_CANTOPEN_FULLPATH: zName = "SQLITE_CANTOPEN_FULLPATH"; break; + case SQLITE_CANTOPEN_CONVPATH: zName = "SQLITE_CANTOPEN_CONVPATH"; break; + case SQLITE_CANTOPEN_SYMLINK: zName = "SQLITE_CANTOPEN_SYMLINK"; break; + case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; + case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; + case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; + case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break; + case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; + case SQLITE_CONSTRAINT_UNIQUE: zName = "SQLITE_CONSTRAINT_UNIQUE"; break; + case SQLITE_CONSTRAINT_TRIGGER: zName = "SQLITE_CONSTRAINT_TRIGGER";break; + case SQLITE_CONSTRAINT_FOREIGNKEY: + zName = "SQLITE_CONSTRAINT_FOREIGNKEY"; break; + case SQLITE_CONSTRAINT_CHECK: zName = "SQLITE_CONSTRAINT_CHECK"; break; + case SQLITE_CONSTRAINT_PRIMARYKEY: + zName = "SQLITE_CONSTRAINT_PRIMARYKEY"; break; + case SQLITE_CONSTRAINT_NOTNULL: zName = "SQLITE_CONSTRAINT_NOTNULL";break; + case SQLITE_CONSTRAINT_COMMITHOOK: + zName = "SQLITE_CONSTRAINT_COMMITHOOK"; break; + case SQLITE_CONSTRAINT_VTAB: zName = "SQLITE_CONSTRAINT_VTAB"; break; + case SQLITE_CONSTRAINT_FUNCTION: + zName = "SQLITE_CONSTRAINT_FUNCTION"; break; + case SQLITE_CONSTRAINT_ROWID: zName = "SQLITE_CONSTRAINT_ROWID"; break; + case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; + case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; + case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; + case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; + case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; + case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; + case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; + case SQLITE_ROW: zName = "SQLITE_ROW"; break; + case SQLITE_NOTICE: zName = "SQLITE_NOTICE"; break; + case SQLITE_NOTICE_RECOVER_WAL: zName = "SQLITE_NOTICE_RECOVER_WAL";break; + case SQLITE_NOTICE_RECOVER_ROLLBACK: + zName = "SQLITE_NOTICE_RECOVER_ROLLBACK"; break; + case SQLITE_WARNING: zName = "SQLITE_WARNING"; break; + case SQLITE_WARNING_AUTOINDEX: zName = "SQLITE_WARNING_AUTOINDEX"; break; + case SQLITE_DONE: zName = "SQLITE_DONE"; break; + } + } + if( zName==0 ){ + static char zBuf[50]; + sqlite3_snprintf(sizeof(zBuf), zBuf, "SQLITE_UNKNOWN(%d)", origRc); + zName = zBuf; + } + return zName; +} +#endif + +/* +** Return a static string that describes the kind of error specified in the +** argument. +*/ +SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ + static const char* const aMsg[] = { + /* SQLITE_OK */ "not an error", + /* SQLITE_ERROR */ "SQL logic error", + /* SQLITE_INTERNAL */ 0, + /* SQLITE_PERM */ "access permission denied", + /* SQLITE_ABORT */ "query aborted", + /* SQLITE_BUSY */ "database is locked", + /* SQLITE_LOCKED */ "database table is locked", + /* SQLITE_NOMEM */ "out of memory", + /* SQLITE_READONLY */ "attempt to write a readonly database", + /* SQLITE_INTERRUPT */ "interrupted", + /* SQLITE_IOERR */ "disk I/O error", + /* SQLITE_CORRUPT */ "database disk image is malformed", + /* SQLITE_NOTFOUND */ "unknown operation", + /* SQLITE_FULL */ "database or disk is full", + /* SQLITE_CANTOPEN */ "unable to open database file", + /* SQLITE_PROTOCOL */ "locking protocol", + /* SQLITE_EMPTY */ 0, + /* SQLITE_SCHEMA */ "database schema has changed", + /* SQLITE_TOOBIG */ "string or blob too big", + /* SQLITE_CONSTRAINT */ "constraint failed", + /* SQLITE_MISMATCH */ "datatype mismatch", + /* SQLITE_MISUSE */ "bad parameter or other API misuse", +#ifdef SQLITE_DISABLE_LFS + /* SQLITE_NOLFS */ "large file support is disabled", +#else + /* SQLITE_NOLFS */ 0, +#endif + /* SQLITE_AUTH */ "authorization denied", + /* SQLITE_FORMAT */ 0, + /* SQLITE_RANGE */ "column index out of range", + /* SQLITE_NOTADB */ "file is not a database", + /* SQLITE_NOTICE */ "notification message", + /* SQLITE_WARNING */ "warning message", + }; + const char *zErr = "unknown error"; + switch( rc ){ + case SQLITE_ABORT_ROLLBACK: { + zErr = "abort due to ROLLBACK"; + break; + } + case SQLITE_ROW: { + zErr = "another row available"; + break; + } + case SQLITE_DONE: { + zErr = "no more rows available"; + break; + } + default: { + rc &= 0xff; + if( ALWAYS(rc>=0) && rcbusyTimeout; + int delay, prior; + + assert( count>=0 ); + if( count < NDELAY ){ + delay = delays[count]; + prior = totals[count]; + }else{ + delay = delays[NDELAY-1]; + prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); + } + if( prior + delay > tmout ){ + delay = tmout - prior; + if( delay<=0 ) return 0; + } + sqlite3OsSleep(db->pVfs, delay*1000); + return 1; +#else + /* This case for unix systems that lack usleep() support. Sleeping + ** must be done in increments of whole seconds */ + sqlite3 *db = (sqlite3 *)ptr; + int tmout = ((sqlite3 *)ptr)->busyTimeout; + if( (count+1)*1000 > tmout ){ + return 0; + } + sqlite3OsSleep(db->pVfs, 1000000); + return 1; +#endif +} + +/* +** Invoke the given busy handler. +** +** This routine is called when an operation failed to acquire a +** lock on VFS file pFile. +** +** If this routine returns non-zero, the lock is retried. If it +** returns 0, the operation aborts with an SQLITE_BUSY error. +*/ +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){ + int rc; + if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; + rc = p->xBusyHandler(p->pBusyArg, p->nBusy); + if( rc==0 ){ + p->nBusy = -1; + }else{ + p->nBusy++; + } + return rc; +} + +/* +** This routine sets the busy callback for an Sqlite database to the +** given callback function with the given argument. +*/ +SQLITE_API int sqlite3_busy_handler( + sqlite3 *db, + int (*xBusy)(void*,int), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->busyHandler.xBusyHandler = xBusy; + db->busyHandler.pBusyArg = pArg; + db->busyHandler.nBusy = 0; + db->busyTimeout = 0; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** This routine sets the progress callback for an Sqlite database to the +** given callback function with the given argument. The progress callback will +** be invoked every nOps opcodes. +*/ +SQLITE_API void sqlite3_progress_handler( + sqlite3 *db, + int nOps, + int (*xProgress)(void*), + void *pArg +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( nOps>0 ){ + db->xProgress = xProgress; + db->nProgressOps = (unsigned)nOps; + db->pProgressArg = pArg; + }else{ + db->xProgress = 0; + db->nProgressOps = 0; + db->pProgressArg = 0; + } + sqlite3_mutex_leave(db->mutex); +} +#endif + + +/* +** This routine installs a default busy handler that waits for the +** specified number of milliseconds before returning 0. +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + if( ms>0 ){ + sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, + (void*)db); + db->busyTimeout = ms; + }else{ + sqlite3_busy_handler(db, 0, 0); + } + return SQLITE_OK; +} + +/* +** Cause any pending operation to stop at its earliest opportunity. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) && (db==0 || db->eOpenState!=SQLITE_STATE_ZOMBIE) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + AtomicStore(&db->u1.isInterrupted, 1); +} + + +/* +** This function is exactly the same as sqlite3_create_function(), except +** that it is designed to be called by internal code. The difference is +** that if a malloc() fails in sqlite3_create_function(), an error code +** is returned and the mallocFailed flag cleared. +*/ +SQLITE_PRIVATE int sqlite3CreateFunc( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int enc, + void *pUserData, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value **), + FuncDestructor *pDestructor +){ + FuncDef *p; + int extraFlags; + + assert( sqlite3_mutex_held(db->mutex) ); + assert( xValue==0 || xSFunc==0 ); + if( zFunctionName==0 /* Must have a valid name */ + || (xSFunc!=0 && xFinal!=0) /* Not both xSFunc and xFinal */ + || ((xFinal==0)!=(xStep==0)) /* Both or neither of xFinal and xStep */ + || ((xValue==0)!=(xInverse==0)) /* Both or neither of xValue, xInverse */ + || (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) + || (255funcFlags & SQLITE_FUNC_ENCMASK)==(u32)enc && p->nArg==nArg ){ + if( db->nVdbeActive ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, + "unable to delete/modify user-function due to active statements"); + assert( !db->mallocFailed ); + return SQLITE_BUSY; + }else{ + sqlite3ExpirePreparedStatements(db, 0); + } + }else if( xSFunc==0 && xFinal==0 ){ + /* Trying to delete a function that does not exist. This is a no-op. + ** https://sqlite.org/forum/forumpost/726219164b */ + return SQLITE_OK; + } + + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 1); + assert(p || db->mallocFailed); + if( !p ){ + return SQLITE_NOMEM_BKPT; + } + + /* If an older version of the function with a configured destructor is + ** being replaced invoke the destructor function here. */ + functionDestroy(db, p); + + if( pDestructor ){ + pDestructor->nRef++; + } + p->u.pDestructor = pDestructor; + p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; + testcase( p->funcFlags & SQLITE_DETERMINISTIC ); + testcase( p->funcFlags & SQLITE_DIRECTONLY ); + p->xSFunc = xSFunc ? xSFunc : xStep; + p->xFinalize = xFinal; + p->xValue = xValue; + p->xInverse = xInverse; + p->pUserData = pUserData; + p->nArg = (u16)nArg; + return SQLITE_OK; +} + +/* +** Worker function used by utf-8 APIs that create new functions: +** +** sqlite3_create_function() +** sqlite3_create_function_v2() +** sqlite3_create_window_function() +*/ +static int createFunctionApi( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*) +){ + int rc = SQLITE_ERROR; + FuncDestructor *pArg = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( xDestroy ){ + pArg = (FuncDestructor *)sqlite3Malloc(sizeof(FuncDestructor)); + if( !pArg ){ + sqlite3OomFault(db); + xDestroy(p); + goto out; + } + pArg->nRef = 0; + pArg->xDestroy = xDestroy; + pArg->pUserData = p; + } + rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, + xSFunc, xStep, xFinal, xValue, xInverse, pArg + ); + if( pArg && pArg->nRef==0 ){ + assert( rc!=SQLITE_OK || (xStep==0 && xFinal==0) ); + xDestroy(p); + sqlite3_free(pArg); + } + + out: + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Create new user functions. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*) +){ + return createFunctionApi(db, zFunc, nArg, enc, p, xSFunc, xStep, + xFinal, 0, 0, 0); +} +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xDestroy)(void *) +){ + return createFunctionApi(db, zFunc, nArg, enc, p, xSFunc, xStep, + xFinal, 0, 0, xDestroy); +} +SQLITE_API int sqlite3_create_window_function( + sqlite3 *db, + const char *zFunc, + int nArg, + int enc, + void *p, + void (*xStep)(sqlite3_context*,int,sqlite3_value **), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInverse)(sqlite3_context*,int,sqlite3_value **), + void (*xDestroy)(void *) +){ + return createFunctionApi(db, zFunc, nArg, enc, p, 0, xStep, + xFinal, xValue, xInverse, xDestroy); +} + +#ifndef SQLITE_OMIT_UTF16 +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *p, + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +){ + int rc; + char *zFunc8; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zFunctionName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE); + rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0,0,0); + sqlite3DbFree(db, zFunc8); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif + + +/* +** The following is the implementation of an SQL function that always +** fails with an error message stating that the function is used in the +** wrong context. The sqlite3_overload_function() API might construct +** SQL function that use this routine so that the functions will exist +** for name resolution but are actually overloaded by the xFindFunction +** method of virtual tables. +*/ +static void sqlite3InvalidFunction( + sqlite3_context *context, /* The function calling context */ + int NotUsed, /* Number of arguments to the function */ + sqlite3_value **NotUsed2 /* Value of each argument */ +){ + const char *zName = (const char*)sqlite3_user_data(context); + char *zErr; + UNUSED_PARAMETER2(NotUsed, NotUsed2); + zErr = sqlite3_mprintf( + "unable to use function %s in the requested context", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); +} + +/* +** Declare that a function has been overloaded by a virtual table. +** +** If the function already exists as a regular global function, then +** this routine is a no-op. If the function does not exist, then create +** a new one that always throws a run-time error. +** +** When virtual tables intend to provide an overloaded function, they +** should call this routine to make sure the global function exists. +** A global function must exist in order for name resolution to work +** properly. +*/ +SQLITE_API int sqlite3_overload_function( + sqlite3 *db, + const char *zName, + int nArg +){ + int rc; + char *zCopy; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0; + sqlite3_mutex_leave(db->mutex); + if( rc ) return SQLITE_OK; + zCopy = sqlite3_mprintf(zName); + if( zCopy==0 ) return SQLITE_NOMEM; + return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8, + zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free); +} + +#ifndef SQLITE_OMIT_TRACE +/* +** Register a trace function. The pArg from the previously registered trace +** is returned. +** +** A NULL trace function means that no tracing is executes. A non-NULL +** trace is a pointer to a function that is invoked at the start of each +** SQL statement. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), void *pArg){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pTraceArg; + db->mTrace = xTrace ? SQLITE_TRACE_LEGACY : 0; + db->trace.xLegacy = xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_DEPRECATED */ + +/* Register a trace callback using the version-2 interface. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3 *db, /* Trace this connection */ + unsigned mTrace, /* Mask of events to be traced */ + int(*xTrace)(unsigned,void*,void*,void*), /* Callback to invoke */ + void *pArg /* Context */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( mTrace==0 ) xTrace = 0; + if( xTrace==0 ) mTrace = 0; + db->mTrace = mTrace; + db->trace.xV2 = xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** Register a profile function. The pArg from the previously registered +** profile function is returned. +** +** A NULL profile function means that no profiling is executes. A non-NULL +** profile is a pointer to a function that is invoked at the conclusion of +** each SQL statement that is run. +*/ +SQLITE_API void *sqlite3_profile( + sqlite3 *db, + void (*xProfile)(void*,const char*,sqlite_uint64), + void *pArg +){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pProfileArg; + db->xProfile = xProfile; + db->pProfileArg = pArg; + db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; + if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; + sqlite3_mutex_leave(db->mutex); + return pOld; +} +#endif /* SQLITE_OMIT_DEPRECATED */ +#endif /* SQLITE_OMIT_TRACE */ + +/* +** Register a function to be invoked when a transaction commits. +** If the invoked function returns non-zero, then the commit becomes a +** rollback. +*/ +SQLITE_API void *sqlite3_commit_hook( + sqlite3 *db, /* Attach the hook to this database */ + int (*xCallback)(void*), /* Function to invoke on each commit */ + void *pArg /* Argument to the function */ +){ + void *pOld; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pOld = db->pCommitArg; + db->xCommitCallback = xCallback; + db->pCommitArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pOld; +} + +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*,int,char const *,char const *,sqlite_int64), + void *pArg /* Argument to the function */ +){ + void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pUpdateArg; + db->xUpdateCallback = xCallback; + db->pUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +/* +** Register a callback to be invoked each time a transaction is rolled +** back by this database connection. +*/ +SQLITE_API void *sqlite3_rollback_hook( + sqlite3 *db, /* Attach the hook to this database */ + void (*xCallback)(void*), /* Callback function */ + void *pArg /* Argument to the function */ +){ + void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pRollbackArg; + db->xRollbackCallback = xCallback; + db->pRollbackArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, /* Attach the hook to this database */ + void(*xCallback)( /* Callback function */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64), + void *pArg /* First callback argument */ +){ + void *pRet; + sqlite3_mutex_enter(db->mutex); + pRet = db->pPreUpdateArg; + db->xPreUpdateCallback = xCallback; + db->pPreUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +/* +** Register a function to be invoked prior to each autovacuum that +** determines the number of pages to vacuum. +*/ +SQLITE_API int sqlite3_autovacuum_pages( + sqlite3 *db, /* Attach the hook to this database */ + unsigned int (*xCallback)(void*,const char*,u32,u32,u32), + void *pArg, /* Argument to the function */ + void (*xDestructor)(void*) /* Destructor for pArg */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + if( xDestructor ) xDestructor(pArg); + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( db->xAutovacDestr ){ + db->xAutovacDestr(db->pAutovacPagesArg); + } + db->xAutovacPages = xCallback; + db->pAutovacPagesArg = pArg; + db->xAutovacDestr = xDestructor; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + + +#ifndef SQLITE_OMIT_WAL +/* +** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). +** Invoke sqlite3_wal_checkpoint if the number of frames in the log file +** is greater than sqlite3.pWalArg cast to an integer (the value configured by +** wal_autocheckpoint()). +*/ +SQLITE_PRIVATE int sqlite3WalDefaultHook( + void *pClientData, /* Argument */ + sqlite3 *db, /* Connection */ + const char *zDb, /* Database */ + int nFrame /* Size of WAL */ +){ + if( nFrame>=SQLITE_PTR_TO_INT(pClientData) ){ + sqlite3BeginBenignMalloc(); + sqlite3_wal_checkpoint(db, zDb); + sqlite3EndBenignMalloc(); + } + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_WAL */ + +/* +** Configure an sqlite3_wal_hook() callback to automatically checkpoint +** a database after committing a transaction if there are nFrame or +** more frames in the log file. Passing zero or a negative value as the +** nFrame parameter disables automatic checkpoints entirely. +** +** The callback registered by this function replaces any existing callback +** registered using sqlite3_wal_hook(). Likewise, registering a callback +** using sqlite3_wal_hook() disables the automatic checkpoint mechanism +** configured by this function. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){ +#ifdef SQLITE_OMIT_WAL + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(nFrame); +#else +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + if( nFrame>0 ){ + sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); + }else{ + sqlite3_wal_hook(db, 0, 0); + } +#endif + return SQLITE_OK; +} + +/* +** Register a callback to be invoked each time a transaction is written +** into the write-ahead-log by this database connection. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3 *db, /* Attach the hook to this db handle */ + int(*xCallback)(void *, sqlite3*, const char*, int), + void *pArg /* First argument passed to xCallback() */ +){ +#ifndef SQLITE_OMIT_WAL + void *pRet; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + sqlite3_mutex_enter(db->mutex); + pRet = db->pWalArg; + db->xWalCallback = xCallback; + db->pWalArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +#else + return 0; +#endif +} + +/* +** Checkpoint database zDb. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +){ +#ifdef SQLITE_OMIT_WAL + return SQLITE_OK; +#else + int rc; /* Return code */ + int iDb; /* Schema to checkpoint */ + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + + /* Initialize the output variables to -1 in case an error occurs. */ + if( pnLog ) *pnLog = -1; + if( pnCkpt ) *pnCkpt = -1; + + assert( SQLITE_CHECKPOINT_PASSIVE==0 ); + assert( SQLITE_CHECKPOINT_FULL==1 ); + assert( SQLITE_CHECKPOINT_RESTART==2 ); + assert( SQLITE_CHECKPOINT_TRUNCATE==3 ); + if( eModeSQLITE_CHECKPOINT_TRUNCATE ){ + /* EVIDENCE-OF: R-03996-12088 The M parameter must be a valid checkpoint + ** mode: */ + return SQLITE_MISUSE; + } + + sqlite3_mutex_enter(db->mutex); + if( zDb && zDb[0] ){ + iDb = sqlite3FindDbName(db, zDb); + }else{ + iDb = SQLITE_MAX_DB; /* This means process all schemas */ + } + if( iDb<0 ){ + rc = SQLITE_ERROR; + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "unknown database: %s", zDb); + }else{ + db->busyHandler.nBusy = 0; + rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt); + sqlite3Error(db, rc); + } + rc = sqlite3ApiExit(db, rc); + + /* If there are no active statements, clear the interrupt flag at this + ** point. */ + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + + sqlite3_mutex_leave(db->mutex); + return rc; +#endif +} + + +/* +** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points +** to contains a zero-length string, all attached databases are +** checkpointed. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ + /* EVIDENCE-OF: R-41613-20553 The sqlite3_wal_checkpoint(D,X) is equivalent to + ** sqlite3_wal_checkpoint_v2(D,X,SQLITE_CHECKPOINT_PASSIVE,0,0). */ + return sqlite3_wal_checkpoint_v2(db,zDb,SQLITE_CHECKPOINT_PASSIVE,0,0); +} + +#ifndef SQLITE_OMIT_WAL +/* +** Run a checkpoint on database iDb. This is a no-op if database iDb is +** not currently open in WAL mode. +** +** If a transaction is open on the database being checkpointed, this +** function returns SQLITE_LOCKED and a checkpoint is not attempted. If +** an error occurs while running the checkpoint, an SQLite error code is +** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK. +** +** The mutex on database handle db should be held by the caller. The mutex +** associated with the specific b-tree being checkpointed is taken by +** this function while the checkpoint is running. +** +** If iDb is passed SQLITE_MAX_DB then all attached databases are +** checkpointed. If an error is encountered it is returned immediately - +** no attempt is made to checkpoint any remaining databases. +** +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL, RESTART +** or TRUNCATE. +*/ +SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){ + int rc = SQLITE_OK; /* Return code */ + int i; /* Used to iterate through attached dbs */ + int bBusy = 0; /* True if SQLITE_BUSY has been encountered */ + + assert( sqlite3_mutex_held(db->mutex) ); + assert( !pnLog || *pnLog==-1 ); + assert( !pnCkpt || *pnCkpt==-1 ); + testcase( iDb==SQLITE_MAX_ATTACHED ); /* See forum post a006d86f72 */ + testcase( iDb==SQLITE_MAX_DB ); + + for(i=0; inDb && rc==SQLITE_OK; i++){ + if( i==iDb || iDb==SQLITE_MAX_DB ){ + rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt, eMode, pnLog, pnCkpt); + pnLog = 0; + pnCkpt = 0; + if( rc==SQLITE_BUSY ){ + bBusy = 1; + rc = SQLITE_OK; + } + } + } + + return (rc==SQLITE_OK && bBusy) ? SQLITE_BUSY : rc; +} +#endif /* SQLITE_OMIT_WAL */ + +/* +** This function returns true if main-memory should be used instead of +** a temporary file for transient pager files and statement journals. +** The value returned depends on the value of db->temp_store (runtime +** parameter) and the compile time value of SQLITE_TEMP_STORE. The +** following table describes the relationship between these two values +** and this functions return value. +** +** SQLITE_TEMP_STORE db->temp_store Location of temporary database +** ----------------- -------------- ------------------------------ +** 0 any file (return 0) +** 1 1 file (return 0) +** 1 2 memory (return 1) +** 1 0 file (return 0) +** 2 1 file (return 0) +** 2 2 memory (return 1) +** 2 0 memory (return 1) +** 3 any memory (return 1) +*/ +SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ +#if SQLITE_TEMP_STORE==1 + return ( db->temp_store==2 ); +#endif +#if SQLITE_TEMP_STORE==2 + return ( db->temp_store!=1 ); +#endif +#if SQLITE_TEMP_STORE==3 + UNUSED_PARAMETER(db); + return 1; +#endif +#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3 + UNUSED_PARAMETER(db); + return 0; +#endif +} + +/* +** Return UTF-8 encoded English language explanation of the most recent +** error. +*/ +SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ + const char *z; + if( !db ){ + return sqlite3ErrStr(SQLITE_NOMEM_BKPT); + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return sqlite3ErrStr(SQLITE_MISUSE_BKPT); + } + sqlite3_mutex_enter(db->mutex); + if( db->mallocFailed ){ + z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); + }else{ + testcase( db->pErr==0 ); + z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; + assert( !db->mallocFailed ); + if( z==0 ){ + z = sqlite3ErrStr(db->errCode); + } + } + sqlite3_mutex_leave(db->mutex); + return z; +} + +/* +** Return the byte offset of the most recent error +*/ +SQLITE_API int sqlite3_error_offset(sqlite3 *db){ + int iOffset = -1; + if( db && sqlite3SafetyCheckSickOrOk(db) && db->errCode ){ + sqlite3_mutex_enter(db->mutex); + iOffset = db->errByteOffset; + sqlite3_mutex_leave(db->mutex); + } + return iOffset; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Return UTF-16 encoded English language explanation of the most recent +** error. +*/ +SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){ + static const u16 outOfMem[] = { + 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0 + }; + static const u16 misuse[] = { + 'b', 'a', 'd', ' ', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', ' ', + 'o', 'r', ' ', 'o', 't', 'h', 'e', 'r', ' ', 'A', 'P', 'I', ' ', + 'm', 'i', 's', 'u', 's', 'e', 0 + }; + + const void *z; + if( !db ){ + return (void *)outOfMem; + } + if( !sqlite3SafetyCheckSickOrOk(db) ){ + return (void *)misuse; + } + sqlite3_mutex_enter(db->mutex); + if( db->mallocFailed ){ + z = (void *)outOfMem; + }else{ + z = sqlite3_value_text16(db->pErr); + if( z==0 ){ + sqlite3ErrorWithMsg(db, db->errCode, sqlite3ErrStr(db->errCode)); + z = sqlite3_value_text16(db->pErr); + } + /* A malloc() may have failed within the call to sqlite3_value_text16() + ** above. If this is the case, then the db->mallocFailed flag needs to + ** be cleared before returning. Do this directly, instead of via + ** sqlite3ApiExit(), to avoid setting the database handle error message. + */ + sqlite3OomClear(db); + } + sqlite3_mutex_leave(db->mutex); + return z; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Return the most recent error code generated by an SQLite routine. If NULL is +** passed to this function, we assume a malloc() failed during sqlite3_open(). +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM_BKPT; + } + return db->errCode & db->errMask; +} +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){ + if( db && !sqlite3SafetyCheckSickOrOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( !db || db->mallocFailed ){ + return SQLITE_NOMEM_BKPT; + } + return db->errCode; +} +SQLITE_API int sqlite3_system_errno(sqlite3 *db){ + return db ? db->iSysErrno : 0; +} + +/* +** Return a string that describes the kind of error specified in the +** argument. For now, this simply calls the internal sqlite3ErrStr() +** function. +*/ +SQLITE_API const char *sqlite3_errstr(int rc){ + return sqlite3ErrStr(rc); +} + +/* +** Create a new collating function for database "db". The name is zName +** and the encoding is enc. +*/ +static int createCollation( + sqlite3* db, + const char *zName, + u8 enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + CollSeq *pColl; + int enc2; + + assert( sqlite3_mutex_held(db->mutex) ); + + /* If SQLITE_UTF16 is specified as the encoding type, transform this + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. + */ + enc2 = enc; + testcase( enc2==SQLITE_UTF16 ); + testcase( enc2==SQLITE_UTF16_ALIGNED ); + if( enc2==SQLITE_UTF16 || enc2==SQLITE_UTF16_ALIGNED ){ + enc2 = SQLITE_UTF16NATIVE; + } + if( enc2SQLITE_UTF16BE ){ + return SQLITE_MISUSE_BKPT; + } + + /* Check if this call is removing or replacing an existing collation + ** sequence. If so, and there are active VMs, return busy. If there + ** are no active VMs, invalidate any pre-compiled statements. + */ + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0); + if( pColl && pColl->xCmp ){ + if( db->nVdbeActive ){ + sqlite3ErrorWithMsg(db, SQLITE_BUSY, + "unable to delete/modify collation sequence due to active statements"); + return SQLITE_BUSY; + } + sqlite3ExpirePreparedStatements(db, 0); + + /* If collation sequence pColl was created directly by a call to + ** sqlite3_create_collation, and not generated by synthCollSeq(), + ** then any copies made by synthCollSeq() need to be invalidated. + ** Also, collation destructor - CollSeq.xDel() - function may need + ** to be called. + */ + if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ + CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName); + int j; + for(j=0; j<3; j++){ + CollSeq *p = &aColl[j]; + if( p->enc==pColl->enc ){ + if( p->xDel ){ + p->xDel(p->pUser); + } + p->xCmp = 0; + } + } + } + } + + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1); + if( pColl==0 ) return SQLITE_NOMEM_BKPT; + pColl->xCmp = xCompare; + pColl->pUser = pCtx; + pColl->xDel = xDel; + pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED)); + sqlite3Error(db, SQLITE_OK); + return SQLITE_OK; +} + + +/* +** This array defines hard upper bounds on limit values. The +** initializer must be kept in sync with the SQLITE_LIMIT_* +** #defines in sqlite3.h. +*/ +static const int aHardLimit[] = { + SQLITE_MAX_LENGTH, + SQLITE_MAX_SQL_LENGTH, + SQLITE_MAX_COLUMN, + SQLITE_MAX_EXPR_DEPTH, + SQLITE_MAX_COMPOUND_SELECT, + SQLITE_MAX_VDBE_OP, + SQLITE_MAX_FUNCTION_ARG, + SQLITE_MAX_ATTACHED, + SQLITE_MAX_LIKE_PATTERN_LENGTH, + SQLITE_MAX_VARIABLE_NUMBER, /* IMP: R-38091-32352 */ + SQLITE_MAX_TRIGGER_DEPTH, + SQLITE_MAX_WORKER_THREADS, +}; + +/* +** Make sure the hard limits are set to reasonable values +*/ +#if SQLITE_MAX_LENGTH<100 +# error SQLITE_MAX_LENGTH must be at least 100 +#endif +#if SQLITE_MAX_SQL_LENGTH<100 +# error SQLITE_MAX_SQL_LENGTH must be at least 100 +#endif +#if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH +# error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH +#endif +#if SQLITE_MAX_COMPOUND_SELECT<2 +# error SQLITE_MAX_COMPOUND_SELECT must be at least 2 +#endif +#if SQLITE_MAX_VDBE_OP<40 +# error SQLITE_MAX_VDBE_OP must be at least 40 +#endif +#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127 +# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127 +#endif +#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125 +# error SQLITE_MAX_ATTACHED must be between 0 and 125 +#endif +#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 +# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 +#endif +#if SQLITE_MAX_COLUMN>32767 +# error SQLITE_MAX_COLUMN must not exceed 32767 +#endif +#if SQLITE_MAX_TRIGGER_DEPTH<1 +# error SQLITE_MAX_TRIGGER_DEPTH must be at least 1 +#endif +#if SQLITE_MAX_WORKER_THREADS<0 || SQLITE_MAX_WORKER_THREADS>50 +# error SQLITE_MAX_WORKER_THREADS must be between 0 and 50 +#endif + + +/* +** Change the value of a limit. Report the old value. +** If an invalid limit index is supplied, report -1. +** Make no changes but still report the old value if the +** new limit is negative. +** +** A new lower limit does not shrink existing constructs. +** It merely prevents new constructs that exceed the limit +** from forming. +*/ +SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ + int oldLimit; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + + /* EVIDENCE-OF: R-30189-54097 For each limit category SQLITE_LIMIT_NAME + ** there is a hard upper bound set at compile-time by a C preprocessor + ** macro called SQLITE_MAX_NAME. (The "_LIMIT_" in the name is changed to + ** "_MAX_".) + */ + assert( aHardLimit[SQLITE_LIMIT_LENGTH]==SQLITE_MAX_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_SQL_LENGTH]==SQLITE_MAX_SQL_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_COLUMN]==SQLITE_MAX_COLUMN ); + assert( aHardLimit[SQLITE_LIMIT_EXPR_DEPTH]==SQLITE_MAX_EXPR_DEPTH ); + assert( aHardLimit[SQLITE_LIMIT_COMPOUND_SELECT]==SQLITE_MAX_COMPOUND_SELECT); + assert( aHardLimit[SQLITE_LIMIT_VDBE_OP]==SQLITE_MAX_VDBE_OP ); + assert( aHardLimit[SQLITE_LIMIT_FUNCTION_ARG]==SQLITE_MAX_FUNCTION_ARG ); + assert( aHardLimit[SQLITE_LIMIT_ATTACHED]==SQLITE_MAX_ATTACHED ); + assert( aHardLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]== + SQLITE_MAX_LIKE_PATTERN_LENGTH ); + assert( aHardLimit[SQLITE_LIMIT_VARIABLE_NUMBER]==SQLITE_MAX_VARIABLE_NUMBER); + assert( aHardLimit[SQLITE_LIMIT_TRIGGER_DEPTH]==SQLITE_MAX_TRIGGER_DEPTH ); + assert( aHardLimit[SQLITE_LIMIT_WORKER_THREADS]==SQLITE_MAX_WORKER_THREADS ); + assert( SQLITE_LIMIT_WORKER_THREADS==(SQLITE_N_LIMIT-1) ); + + + if( limitId<0 || limitId>=SQLITE_N_LIMIT ){ + return -1; + } + oldLimit = db->aLimit[limitId]; + if( newLimit>=0 ){ /* IMP: R-52476-28732 */ + if( newLimit>aHardLimit[limitId] ){ + newLimit = aHardLimit[limitId]; /* IMP: R-51463-25634 */ + }else if( newLimit<1 && limitId==SQLITE_LIMIT_LENGTH ){ + newLimit = 1; + } + db->aLimit[limitId] = newLimit; + } + return oldLimit; /* IMP: R-53341-35419 */ +} + +/* +** This function is used to parse both URIs and non-URI filenames passed by the +** user to API functions sqlite3_open() or sqlite3_open_v2(), and for database +** URIs specified as part of ATTACH statements. +** +** The first argument to this function is the name of the VFS to use (or +** a NULL to signify the default VFS) if the URI does not contain a "vfs=xxx" +** query parameter. The second argument contains the URI (or non-URI filename) +** itself. When this function is called the *pFlags variable should contain +** the default flags to open the database handle with. The value stored in +** *pFlags may be updated before returning if the URI filename contains +** "cache=xxx" or "mode=xxx" query parameters. +** +** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to +** the VFS that should be used to open the database file. *pzFile is set to +** point to a buffer containing the name of the file to open. The value +** stored in *pzFile is a database name acceptable to sqlite3_uri_parameter() +** and is in the same format as names created using sqlite3_create_filename(). +** The caller must invoke sqlite3_free_filename() (not sqlite3_free()!) on +** the value returned in *pzFile to avoid a memory leak. +** +** If an error occurs, then an SQLite error code is returned and *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to eventually release +** this buffer by calling sqlite3_free(). +*/ +SQLITE_PRIVATE int sqlite3ParseUri( + const char *zDefaultVfs, /* VFS to use if no "vfs=xxx" query option */ + const char *zUri, /* Nul-terminated URI to parse */ + unsigned int *pFlags, /* IN/OUT: SQLITE_OPEN_XXX flags */ + sqlite3_vfs **ppVfs, /* OUT: VFS to use */ + char **pzFile, /* OUT: Filename component of URI */ + char **pzErrMsg /* OUT: Error message (if rc!=SQLITE_OK) */ +){ + int rc = SQLITE_OK; + unsigned int flags = *pFlags; + const char *zVfs = zDefaultVfs; + char *zFile; + char c; + int nUri = sqlite3Strlen30(zUri); + + assert( *pzErrMsg==0 ); + + if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */ + || sqlite3GlobalConfig.bOpenUri) /* IMP: R-51689-46548 */ + && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */ + ){ + char *zOpt; + int eState; /* Parser state when parsing URI */ + int iIn; /* Input character index */ + int iOut = 0; /* Output character index */ + u64 nByte = nUri+8; /* Bytes of space to allocate */ + + /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen + ** method that there may be extra parameters following the file-name. */ + flags |= SQLITE_OPEN_URI; + + for(iIn=0; iIn=0 && octet<256 ); + if( octet==0 ){ +#ifndef SQLITE_ENABLE_URI_00_ERROR + /* This branch is taken when "%00" appears within the URI. In this + ** case we ignore all text in the remainder of the path, name or + ** value currently being parsed. So ignore the current character + ** and skip to the next "?", "=" or "&", as appropriate. */ + while( (c = zUri[iIn])!=0 && c!='#' + && (eState!=0 || c!='?') + && (eState!=1 || (c!='=' && c!='&')) + && (eState!=2 || c!='&') + ){ + iIn++; + } + continue; +#else + /* If ENABLE_URI_00_ERROR is defined, "%00" in a URI is an error. */ + *pzErrMsg = sqlite3_mprintf("unexpected %%00 in uri"); + rc = SQLITE_ERROR; + goto parse_uri_out; +#endif + } + c = octet; + }else if( eState==1 && (c=='&' || c=='=') ){ + if( zFile[iOut-1]==0 ){ + /* An empty option name. Ignore this option altogether. */ + while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++; + continue; + } + if( c=='&' ){ + zFile[iOut++] = '\0'; + }else{ + eState = 2; + } + c = 0; + }else if( (eState==0 && c=='?') || (eState==2 && c=='&') ){ + c = 0; + eState = 1; + } + zFile[iOut++] = c; + } + if( eState==1 ) zFile[iOut++] = '\0'; + memset(zFile+iOut, 0, 4); /* end-of-options + empty journal filenames */ + + /* Check if there were any options specified that should be interpreted + ** here. Options that are interpreted here include "vfs" and those that + ** correspond to flags that may be passed to the sqlite3_open_v2() + ** method. */ + zOpt = &zFile[sqlite3Strlen30(zFile)+1]; + while( zOpt[0] ){ + int nOpt = sqlite3Strlen30(zOpt); + char *zVal = &zOpt[nOpt+1]; + int nVal = sqlite3Strlen30(zVal); + + if( nOpt==3 && memcmp("vfs", zOpt, 3)==0 ){ + zVfs = zVal; + }else{ + struct OpenMode { + const char *z; + int mode; + } *aMode = 0; + char *zModeType = 0; + int mask = 0; + int limit = 0; + + if( nOpt==5 && memcmp("cache", zOpt, 5)==0 ){ + static struct OpenMode aCacheMode[] = { + { "shared", SQLITE_OPEN_SHAREDCACHE }, + { "private", SQLITE_OPEN_PRIVATECACHE }, + { 0, 0 } + }; + + mask = SQLITE_OPEN_SHAREDCACHE|SQLITE_OPEN_PRIVATECACHE; + aMode = aCacheMode; + limit = mask; + zModeType = "cache"; + } + if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){ + static struct OpenMode aOpenMode[] = { + { "ro", SQLITE_OPEN_READONLY }, + { "rw", SQLITE_OPEN_READWRITE }, + { "rwc", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE }, + { "memory", SQLITE_OPEN_MEMORY }, + { 0, 0 } + }; + + mask = SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY; + aMode = aOpenMode; + limit = mask & flags; + zModeType = "access"; + } + + if( aMode ){ + int i; + int mode = 0; + for(i=0; aMode[i].z; i++){ + const char *z = aMode[i].z; + if( nVal==sqlite3Strlen30(z) && 0==memcmp(zVal, z, nVal) ){ + mode = aMode[i].mode; + break; + } + } + if( mode==0 ){ + *pzErrMsg = sqlite3_mprintf("no such %s mode: %s", zModeType, zVal); + rc = SQLITE_ERROR; + goto parse_uri_out; + } + if( (mode & ~SQLITE_OPEN_MEMORY)>limit ){ + *pzErrMsg = sqlite3_mprintf("%s mode not allowed: %s", + zModeType, zVal); + rc = SQLITE_PERM; + goto parse_uri_out; + } + flags = (flags & ~mask) | mode; + } + } + + zOpt = &zVal[nVal+1]; + } + + }else{ + zFile = sqlite3_malloc64(nUri+8); + if( !zFile ) return SQLITE_NOMEM_BKPT; + memset(zFile, 0, 4); + zFile += 4; + if( nUri ){ + memcpy(zFile, zUri, nUri); + } + memset(zFile+nUri, 0, 4); + flags &= ~SQLITE_OPEN_URI; + } + + *ppVfs = sqlite3_vfs_find(zVfs); + if( *ppVfs==0 ){ + *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); + rc = SQLITE_ERROR; + } + parse_uri_out: + if( rc!=SQLITE_OK ){ + sqlite3_free_filename(zFile); + zFile = 0; + } + *pFlags = flags; + *pzFile = zFile; + return rc; +} + +/* +** This routine does the core work of extracting URI parameters from a +** database filename for the sqlite3_uri_parameter() interface. +*/ +static const char *uriParameter(const char *zFilename, const char *zParam){ + zFilename += sqlite3Strlen30(zFilename) + 1; + while( ALWAYS(zFilename!=0) && zFilename[0] ){ + int x = strcmp(zFilename, zParam); + zFilename += sqlite3Strlen30(zFilename) + 1; + if( x==0 ) return zFilename; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return 0; +} + +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +SQLITE_PRIVATE int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( zUri==0 ){ + return 0; + }else if( (zKey = uriParameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; imutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if( db->mutex==0 ){ + sqlite3_free(db); + db = 0; + goto opendb_out; + } + if( isThreadsafe==0 ){ + sqlite3MutexWarnOnContention(db->mutex); + } + } + sqlite3_mutex_enter(db->mutex); + db->errMask = (flags & SQLITE_OPEN_EXRESCODE)!=0 ? 0xffffffff : 0xff; + db->nDb = 2; + db->eOpenState = SQLITE_STATE_BUSY; + db->aDb = db->aDbStatic; + db->lookaside.bDisable = 1; + db->lookaside.sz = 0; + + assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); + memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); + db->aLimit[SQLITE_LIMIT_WORKER_THREADS] = SQLITE_DEFAULT_WORKER_THREADS; + db->autoCommit = 1; + db->nextAutovac = -1; + db->szMmap = sqlite3GlobalConfig.szMmap; + db->nextPagesize = 0; + db->init.azInit = sqlite3StdType; /* Any array of string ptrs will do */ +#ifdef SQLITE_ENABLE_SORTER_MMAP + /* Beginning with version 3.37.0, using the VFS xFetch() API to memory-map + ** the temporary files used to do external sorts (see code in vdbesort.c) + ** is disabled. It can still be used either by defining + ** SQLITE_ENABLE_SORTER_MMAP at compile time or by using the + ** SQLITE_TESTCTRL_SORTER_MMAP test-control at runtime. */ + db->nMaxSorterMmap = 0x7FFFFFFF; +#endif + db->flags |= SQLITE_ShortColNames + | SQLITE_EnableTrigger + | SQLITE_EnableView + | SQLITE_CacheSpill +#if !defined(SQLITE_TRUSTED_SCHEMA) || SQLITE_TRUSTED_SCHEMA+0!=0 + | SQLITE_TrustedSchema +#endif +/* The SQLITE_DQS compile-time option determines the default settings +** for SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML. +** +** SQLITE_DQS SQLITE_DBCONFIG_DQS_DDL SQLITE_DBCONFIG_DQS_DML +** ---------- ----------------------- ----------------------- +** undefined on on +** 3 on on +** 2 on off +** 1 off on +** 0 off off +** +** Legacy behavior is 3 (double-quoted string literals are allowed anywhere) +** and so that is the default. But developers are encouranged to use +** -DSQLITE_DQS=0 (best) or -DSQLITE_DQS=1 (second choice) if possible. +*/ +#if !defined(SQLITE_DQS) +# define SQLITE_DQS 3 +#endif +#if (SQLITE_DQS&1)==1 + | SQLITE_DqsDML +#endif +#if (SQLITE_DQS&2)==2 + | SQLITE_DqsDDL +#endif + +#if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX + | SQLITE_AutoIndex +#endif +#if SQLITE_DEFAULT_CKPTFULLFSYNC + | SQLITE_CkptFullFSync +#endif +#if SQLITE_DEFAULT_FILE_FORMAT<4 + | SQLITE_LegacyFileFmt +#endif +#ifdef SQLITE_ENABLE_LOAD_EXTENSION + | SQLITE_LoadExtension +#endif +#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS + | SQLITE_RecTriggers +#endif +#if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS + | SQLITE_ForeignKeys +#endif +#if defined(SQLITE_REVERSE_UNORDERED_SELECTS) + | SQLITE_ReverseOrder +#endif +#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) + | SQLITE_CellSizeCk +#endif +#if defined(SQLITE_ENABLE_FTS3_TOKENIZER) + | SQLITE_Fts3Tokenizer +#endif +#if defined(SQLITE_ENABLE_QPSG) + | SQLITE_EnableQPSG +#endif +#if defined(SQLITE_DEFAULT_DEFENSIVE) + | SQLITE_Defensive +#endif +#if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE) + | SQLITE_LegacyAlter +#endif + ; + sqlite3HashInit(&db->aCollSeq); +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3HashInit(&db->aModule); +#endif + + /* Add the default collation sequence BINARY. BINARY works for both UTF-8 + ** and UTF-16, so add a version for each to avoid any unnecessary + ** conversions. The only error that can occur here is a malloc() failure. + ** + ** EVIDENCE-OF: R-52786-44878 SQLite defines three built-in collating + ** functions: + */ + createCollation(db, sqlite3StrBINARY, SQLITE_UTF8, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); + createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); + createCollation(db, "RTRIM", SQLITE_UTF8, 0, rtrimCollFunc, 0); + if( db->mallocFailed ){ + goto opendb_out; + } + + /* Parse the filename/URI argument + ** + ** Only allow sensible combinations of bits in the flags argument. + ** Throw an error if any non-sense combination is used. If we + ** do not block illegal combinations here, it could trigger + ** assert() statements in deeper layers. Sensible combinations + ** are: + ** + ** 1: SQLITE_OPEN_READONLY + ** 2: SQLITE_OPEN_READWRITE + ** 6: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE + */ + db->openFlags = flags; + assert( SQLITE_OPEN_READONLY == 0x01 ); + assert( SQLITE_OPEN_READWRITE == 0x02 ); + assert( SQLITE_OPEN_CREATE == 0x04 ); + testcase( (1<<(flags&7))==0x02 ); /* READONLY */ + testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ + testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ + if( ((1<<(flags&7)) & 0x46)==0 ){ + rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */ + }else{ + rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); + } + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); + sqlite3_free(zErrMsg); + goto opendb_out; + } + + /* Open the backend database driver */ + rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0, + flags | SQLITE_OPEN_MAIN_DB); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_IOERR_NOMEM ){ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3Error(db, rc); + goto opendb_out; + } + sqlite3BtreeEnter(db->aDb[0].pBt); + db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); + if( !db->mallocFailed ){ + sqlite3SetTextEncoding(db, SCHEMA_ENC(db)); + } + sqlite3BtreeLeave(db->aDb[0].pBt); + db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); + + /* The default safety_level for the main database is FULL; for the temp + ** database it is OFF. This matches the pager layer defaults. + */ + db->aDb[0].zDbSName = "main"; + db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + db->aDb[1].zDbSName = "temp"; + db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF; + + db->eOpenState = SQLITE_STATE_OPEN; + if( db->mallocFailed ){ + goto opendb_out; + } + + /* Register all built-in functions, but do not attempt to read the + ** database schema yet. This is delayed until the first time the database + ** is accessed. + */ + sqlite3Error(db, SQLITE_OK); + sqlite3RegisterPerConnectionBuiltinFunctions(db); + rc = sqlite3_errcode(db); + + + /* Load compiled-in extensions */ + for(i=0; rc==SQLITE_OK && imallocFailed && rc==SQLITE_OK ){ + extern int sqlcipherVtabInit(sqlite3 *); + rc = sqlcipherVtabInit(db); + } +#endif + +#ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS + /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time + ** option gives access to internal functions by default. + ** Testing use only!!! */ + db->mDbFlags |= DBFLAG_InternalFunc; +#endif + + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking + ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking + ** mode. Doing nothing at all also makes NORMAL the default. + */ +#ifdef SQLITE_DEFAULT_LOCKING_MODE + db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; + sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), + SQLITE_DEFAULT_LOCKING_MODE); +#endif + + if( rc ) sqlite3Error(db, rc); + + /* Enable the lookaside-malloc subsystem */ + setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, + sqlite3GlobalConfig.nLookaside); + + sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT); + +opendb_out: + if( db ){ + assert( db->mutex!=0 || isThreadsafe==0 + || sqlite3GlobalConfig.bFullMutex==0 ); + sqlite3_mutex_leave(db->mutex); + } + rc = sqlite3_errcode(db); + assert( db!=0 || (rc&0xff)==SQLITE_NOMEM ); + if( (rc&0xff)==SQLITE_NOMEM ){ + sqlite3_close(db); + db = 0; + }else if( rc!=SQLITE_OK ){ + db->eOpenState = SQLITE_STATE_SICK; + } + *ppDb = db; +#ifdef SQLITE_ENABLE_SQLLOG + if( sqlite3GlobalConfig.xSqllog ){ + /* Opening a db handle. Fourth parameter is passed 0. */ + void *pArg = sqlite3GlobalConfig.pSqllogArg; + sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); + } +#endif +/* BEGIN SQLCIPHER */ +#if defined(SQLITE_HAS_CODEC) + if( rc==SQLITE_OK ) sqlite3CodecQueryParameters(db, 0, zOpen); +#endif +/* END SQLCIPHER */ + sqlite3_free_filename(zOpen); + return rc; +} + + +/* +** Open a new database handle. +*/ +SQLITE_API int sqlite3_open( + const char *zFilename, + sqlite3 **ppDb +){ + return openDatabase(zFilename, ppDb, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); +} +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +){ + return openDatabase(filename, ppDb, (unsigned int)flags, zVfs); +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Open a new database handle. +*/ +SQLITE_API int sqlite3_open16( + const void *zFilename, + sqlite3 **ppDb +){ + char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */ + sqlite3_value *pVal; + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( ppDb==0 ) return SQLITE_MISUSE_BKPT; +#endif + *ppDb = 0; +#ifndef SQLITE_OMIT_AUTOINIT + rc = sqlite3_initialize(); + if( rc ) return rc; +#endif + if( zFilename==0 ) zFilename = "\000\000"; + pVal = sqlite3ValueNew(0); + sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC); + zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8); + if( zFilename8 ){ + rc = openDatabase(zFilename8, ppDb, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); + assert( *ppDb || rc==SQLITE_NOMEM ); + if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){ + SCHEMA_ENC(*ppDb) = ENC(*ppDb) = SQLITE_UTF16NATIVE; + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + sqlite3ValueFree(pVal); + + return rc & 0xff; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + return sqlite3_create_collation_v2(db, zName, enc, pCtx, xCompare, 0); +} + +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation_v2( + sqlite3* db, + const char *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDel)(void*) +){ + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a new collation sequence with the database handle db. +*/ +SQLITE_API int sqlite3_create_collation16( + sqlite3* db, + const void *zName, + int enc, + void* pCtx, + int(*xCompare)(void*,int,const void*,int,const void*) +){ + int rc = SQLITE_OK; + char *zName8; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + assert( !db->mallocFailed ); + zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE); + if( zName8 ){ + rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0); + sqlite3DbFree(db, zName8); + } + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} +#endif /* SQLITE_OMIT_UTF16 */ + +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = xCollNeeded; + db->xCollNeeded16 = 0; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_UTF16 +/* +** Register a collation sequence factory callback with the database handle +** db. Replace any previously installed collation sequence factory. +*/ +SQLITE_API int sqlite3_collation_needed16( + sqlite3 *db, + void *pCollNeededArg, + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->xCollNeeded = 0; + db->xCollNeeded16 = xCollNeeded16; + db->pCollNeededArg = pCollNeededArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} +#endif /* SQLITE_OMIT_UTF16 */ + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** This function is now an anachronism. It used to be used to recover from a +** malloc() failure, but SQLite now does this automatically. +*/ +SQLITE_API int sqlite3_global_recover(void){ + return SQLITE_OK; +} +#endif + +/* +** Test to see whether or not the database connection is in autocommit +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on +** by default. Autocommit is disabled by a BEGIN statement and reenabled +** by the next COMMIT or ROLLBACK. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + return db->autoCommit; +} + +/* +** The following routines are substitutes for constants SQLITE_CORRUPT, +** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_NOMEM and possibly other error +** constants. They serve two purposes: +** +** 1. Serve as a convenient place to set a breakpoint in a debugger +** to detect when version error conditions occurs. +** +** 2. Invoke sqlite3_log() to provide the source code location where +** a low-level error is first detected. +*/ +SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType){ + sqlite3_log(iErr, "%s at line %d of [%.10s]", + zType, lineno, 20+sqlite3_sourceid()); + return iErr; +} +SQLITE_PRIVATE int sqlite3CorruptError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CORRUPT, lineno, "database corruption"); +} +SQLITE_PRIVATE int sqlite3MisuseError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse"); +} +SQLITE_PRIVATE int sqlite3CantopenError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file"); +} +#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_CORRUPT_PGNO) +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int lineno, Pgno pgno){ + char zMsg[100]; + sqlite3_snprintf(sizeof(zMsg), zMsg, "database corruption page %d", pgno); + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); +} +#endif +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_NOMEM, lineno, "OOM"); +} +SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error"); +} +#endif + +#ifndef SQLITE_OMIT_DEPRECATED +/* +** This is a convenience routine that makes sure that all thread-specific +** data for this thread has been deallocated. +** +** SQLite no longer uses thread-specific data so this routine is now a +** no-op. It is retained for historical compatibility. +*/ +SQLITE_API void sqlite3_thread_cleanup(void){ +} +#endif + +/* +** Return meta information about a specific column of a database table. +** See comment in sqlite3.h (sqlite.h.in) for details. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +){ + int rc; + char *zErrMsg = 0; + Table *pTab = 0; + Column *pCol = 0; + int iCol = 0; + char const *zDataType = 0; + char const *zCollSeq = 0; + int notnull = 0; + int primarykey = 0; + int autoinc = 0; + + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTableName==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + /* Ensure the database schema has been loaded */ + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + rc = sqlite3Init(db, &zErrMsg); + if( SQLITE_OK!=rc ){ + goto error_out; + } + + /* Locate the table in question */ + pTab = sqlite3FindTable(db, zTableName, zDbName); + if( !pTab || IsView(pTab) ){ + pTab = 0; + goto error_out; + } + + /* Find the column for which info is requested */ + if( zColumnName==0 ){ + /* Query for existance of table only */ + }else{ + for(iCol=0; iColnCol; iCol++){ + pCol = &pTab->aCol[iCol]; + if( 0==sqlite3StrICmp(pCol->zCnName, zColumnName) ){ + break; + } + } + if( iCol==pTab->nCol ){ + if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){ + iCol = pTab->iPKey; + pCol = iCol>=0 ? &pTab->aCol[iCol] : 0; + }else{ + pTab = 0; + goto error_out; + } + } + } + + /* The following block stores the meta information that will be returned + ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey + ** and autoinc. At this point there are two possibilities: + ** + ** 1. The specified column name was rowid", "oid" or "_rowid_" + ** and there is no explicitly declared IPK column. + ** + ** 2. The table is not a view and the column name identified an + ** explicitly declared column. Copy meta information from *pCol. + */ + if( pCol ){ + zDataType = sqlite3ColumnType(pCol,0); + zCollSeq = sqlite3ColumnColl(pCol); + notnull = pCol->notNull!=0; + primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; + autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0; + }else{ + zDataType = "INTEGER"; + primarykey = 1; + } + if( !zCollSeq ){ + zCollSeq = sqlite3StrBINARY; + } + +error_out: + sqlite3BtreeLeaveAll(db); + + /* Whether the function call succeeded or failed, set the output parameters + ** to whatever their local counterparts contain. If an error did occur, + ** this has the effect of zeroing all output parameters. + */ + if( pzDataType ) *pzDataType = zDataType; + if( pzCollSeq ) *pzCollSeq = zCollSeq; + if( pNotNull ) *pNotNull = notnull; + if( pPrimaryKey ) *pPrimaryKey = primarykey; + if( pAutoinc ) *pAutoinc = autoinc; + + if( SQLITE_OK==rc && !pTab ){ + sqlite3DbFree(db, zErrMsg); + zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName, + zColumnName); + rc = SQLITE_ERROR; + } + sqlite3ErrorWithMsg(db, rc, (zErrMsg?"%s":0), zErrMsg); + sqlite3DbFree(db, zErrMsg); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Sleep for a little while. Return the amount of time slept. +*/ +SQLITE_API int sqlite3_sleep(int ms){ + sqlite3_vfs *pVfs; + int rc; + pVfs = sqlite3_vfs_find(0); + if( pVfs==0 ) return 0; + + /* This function works in milliseconds, but the underlying OsSleep() + ** API uses microseconds. Hence the 1000's. + */ + rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); + return rc; +} + +/* +** Enable or disable the extended result codes. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + db->errMask = onoff ? 0xffffffff : 0xff; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +/* +** Invoke the xFileControl method on a particular database. +*/ +SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ + int rc = SQLITE_ERROR; + Btree *pBtree; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + pBtree = sqlite3DbNameToBtree(db, zDbName); + if( pBtree ){ + Pager *pPager; + sqlite3_file *fd; + sqlite3BtreeEnter(pBtree); + pPager = sqlite3BtreePager(pBtree); + assert( pPager!=0 ); + fd = sqlite3PagerFile(pPager); + assert( fd!=0 ); + if( op==SQLITE_FCNTL_FILE_POINTER ){ + *(sqlite3_file**)pArg = fd; + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_VFS_POINTER ){ + *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ + *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_DATA_VERSION ){ + *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_RESERVE_BYTES ){ + int iNew = *(int*)pArg; + *(int*)pArg = sqlite3BtreeGetRequestedReserve(pBtree); + if( iNew>=0 && iNew<=255 ){ + sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0); + } + rc = SQLITE_OK; + }else{ + int nSave = db->busyHandler.nBusy; + rc = sqlite3OsFileControl(fd, op, pArg); + db->busyHandler.nBusy = nSave; + } + sqlite3BtreeLeave(pBtree); + } + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** Interface to the testing logic. +*/ +SQLITE_API int sqlite3_test_control(int op, ...){ + int rc = 0; +#ifdef SQLITE_UNTESTABLE + UNUSED_PARAMETER(op); +#else + va_list ap; + va_start(ap, op); + switch( op ){ + + /* + ** Save the current state of the PRNG. + */ + case SQLITE_TESTCTRL_PRNG_SAVE: { + sqlite3PrngSaveState(); + break; + } + + /* + ** Restore the state of the PRNG to the last state saved using + ** PRNG_SAVE. If PRNG_SAVE has never before been called, then + ** this verb acts like PRNG_RESET. + */ + case SQLITE_TESTCTRL_PRNG_RESTORE: { + sqlite3PrngRestoreState(); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, int x, sqlite3 *db); + ** + ** Control the seed for the pseudo-random number generator (PRNG) that + ** is built into SQLite. Cases: + ** + ** x!=0 && db!=0 Seed the PRNG to the current value of the + ** schema cookie in the main database for db, or + ** x if the schema cookie is zero. This case + ** is convenient to use with database fuzzers + ** as it allows the fuzzer some control over the + ** the PRNG seed. + ** + ** x!=0 && db==0 Seed the PRNG to the value of x. + ** + ** x==0 && db==0 Revert to default behavior of using the + ** xRandomness method on the primary VFS. + ** + ** This test-control also resets the PRNG so that the new seed will + ** be used for the next call to sqlite3_randomness(). + */ +#ifndef SQLITE_OMIT_WSD + case SQLITE_TESTCTRL_PRNG_SEED: { + int x = va_arg(ap, int); + int y; + sqlite3 *db = va_arg(ap, sqlite3*); + assert( db==0 || db->aDb[0].pSchema!=0 ); + if( db && (y = db->aDb[0].pSchema->schema_cookie)!=0 ){ x = y; } + sqlite3Config.iPrngSeed = x; + sqlite3_randomness(0,0); + break; + } +#endif + + /* + ** sqlite3_test_control(BITVEC_TEST, size, program) + ** + ** Run a test against a Bitvec object of size. The program argument + ** is an array of integers that defines the test. Return -1 on a + ** memory allocation error, 0 on success, or non-zero for an error. + ** See the sqlite3BitvecBuiltinTest() for additional information. + */ + case SQLITE_TESTCTRL_BITVEC_TEST: { + int sz = va_arg(ap, int); + int *aProg = va_arg(ap, int*); + rc = sqlite3BitvecBuiltinTest(sz, aProg); + break; + } + + /* + ** sqlite3_test_control(FAULT_INSTALL, xCallback) + ** + ** Arrange to invoke xCallback() whenever sqlite3FaultSim() is called, + ** if xCallback is not NULL. + ** + ** As a test of the fault simulator mechanism itself, sqlite3FaultSim(0) + ** is called immediately after installing the new callback and the return + ** value from sqlite3FaultSim(0) becomes the return from + ** sqlite3_test_control(). + */ + case SQLITE_TESTCTRL_FAULT_INSTALL: { + /* A bug in MSVC prevents it from understanding pointers to functions + ** types in the second argument to va_arg(). Work around the problem + ** using a typedef. + ** http://support.microsoft.com/kb/47961 <-- dead hyperlink + ** Search at http://web.archive.org/ to find the 2015-03-16 archive + ** of the link above to see the original text. + ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); + */ + typedef int(*sqlite3FaultFuncType)(int); + sqlite3GlobalConfig.xTestCallback = va_arg(ap, sqlite3FaultFuncType); + rc = sqlite3FaultSim(0); + break; + } + + /* + ** sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd) + ** + ** Register hooks to call to indicate which malloc() failures + ** are benign. + */ + case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: { + typedef void (*void_function)(void); + void_function xBenignBegin; + void_function xBenignEnd; + xBenignBegin = va_arg(ap, void_function); + xBenignEnd = va_arg(ap, void_function); + sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd); + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, unsigned int X) + ** + ** Set the PENDING byte to the value in the argument, if X>0. + ** Make no changes if X==0. Return the value of the pending byte + ** as it existing before this routine was called. + ** + ** IMPORTANT: Changing the PENDING byte from 0x40000000 results in + ** an incompatible database file format. Changing the PENDING byte + ** while any database connection is open results in undefined and + ** deleterious behavior. + */ + case SQLITE_TESTCTRL_PENDING_BYTE: { + rc = PENDING_BYTE; +#ifndef SQLITE_OMIT_WSD + { + unsigned int newVal = va_arg(ap, unsigned int); + if( newVal ) sqlite3PendingByte = newVal; + } +#endif + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X) + ** + ** This action provides a run-time test to see whether or not + ** assert() was enabled at compile-time. If X is true and assert() + ** is enabled, then the return value is true. If X is true and + ** assert() is disabled, then the return value is zero. If X is + ** false and assert() is enabled, then the assertion fires and the + ** process aborts. If X is false and assert() is disabled, then the + ** return value is zero. + */ + case SQLITE_TESTCTRL_ASSERT: { + volatile int x = 0; + assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 ); + rc = x; +#if defined(SQLITE_DEBUG) + /* Invoke these debugging routines so that the compiler does not + ** issue "defined but not used" warnings. */ + if( x==9999 ){ + sqlite3ShowExpr(0); + sqlite3ShowExpr(0); + sqlite3ShowExprList(0); + sqlite3ShowIdList(0); + sqlite3ShowSrcList(0); + sqlite3ShowWith(0); + sqlite3ShowUpsert(0); + sqlite3ShowTriggerStep(0); + sqlite3ShowTriggerStepList(0); + sqlite3ShowTrigger(0); + sqlite3ShowTriggerList(0); +#ifndef SQLITE_OMIT_WINDOWFUNC + sqlite3ShowWindow(0); + sqlite3ShowWinFunc(0); +#endif + sqlite3ShowSelect(0); + } +#endif + break; + } + + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X) + ** + ** This action provides a run-time test to see how the ALWAYS and + ** NEVER macros were defined at compile-time. + ** + ** The return value is ALWAYS(X) if X is true, or 0 if X is false. + ** + ** The recommended test is X==2. If the return value is 2, that means + ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the + ** default setting. If the return value is 1, then ALWAYS() is either + ** hard-coded to true or else it asserts if its argument is false. + ** The first behavior (hard-coded to true) is the case if + ** SQLITE_TESTCTRL_ASSERT shows that assert() is disabled and the second + ** behavior (assert if the argument to ALWAYS() is false) is the case if + ** SQLITE_TESTCTRL_ASSERT shows that assert() is enabled. + ** + ** The run-time test procedure might look something like this: + ** + ** if( sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, 2)==2 ){ + ** // ALWAYS() and NEVER() are no-op pass-through macros + ** }else if( sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, 1) ){ + ** // ALWAYS(x) asserts that x is true. NEVER(x) asserts x is false. + ** }else{ + ** // ALWAYS(x) is a constant 1. NEVER(x) is a constant 0. + ** } + */ + case SQLITE_TESTCTRL_ALWAYS: { + int x = va_arg(ap,int); + rc = x ? ALWAYS(x) : 0; + break; + } + + /* + ** sqlite3_test_control(SQLITE_TESTCTRL_BYTEORDER); + ** + ** The integer returned reveals the byte-order of the computer on which + ** SQLite is running: + ** + ** 1 big-endian, determined at run-time + ** 10 little-endian, determined at run-time + ** 432101 big-endian, determined at compile-time + ** 123410 little-endian, determined at compile-time + */ + case SQLITE_TESTCTRL_BYTEORDER: { + rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N) + ** + ** Enable or disable various optimizations for testing purposes. The + ** argument N is a bitmask of optimizations to be disabled. For normal + ** operation N should be 0. The idea is that a test program (like the + ** SQL Logic Test or SLT test module) can run the same SQL multiple times + ** with various optimizations disabled to verify that the same answer + ** is obtained in every case. + */ + case SQLITE_TESTCTRL_OPTIMIZATIONS: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->dbOptFlags = va_arg(ap, u32); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, onoff, xAlt); + ** + ** If parameter onoff is 1, subsequent calls to localtime() fail. + ** If 2, then invoke xAlt() instead of localtime(). If 0, normal + ** processing. + ** + ** xAlt arguments are void pointers, but they really want to be: + ** + ** int xAlt(const time_t*, struct tm*); + ** + ** xAlt should write results in to struct tm object of its 2nd argument + ** and return zero on success, or return non-zero on failure. + */ + case SQLITE_TESTCTRL_LOCALTIME_FAULT: { + sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); + if( sqlite3GlobalConfig.bLocaltimeFault==2 ){ + typedef int(*sqlite3LocaltimeType)(const void*,void*); + sqlite3GlobalConfig.xAltLocaltime = va_arg(ap, sqlite3LocaltimeType); + }else{ + sqlite3GlobalConfig.xAltLocaltime = 0; + } + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, sqlite3*); + ** + ** Toggle the ability to use internal functions on or off for + ** the database connection given in the argument. + */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->mDbFlags ^= DBFLAG_InternalFunc; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_NEVER_CORRUPT, int); + ** + ** Set or clear a flag that indicates that the database file is always well- + ** formed and never corrupt. This flag is clear by default, indicating that + ** database files might have arbitrary corruption. Setting the flag during + ** testing causes certain assert() statements in the code to be activated + ** that demonstrat invariants on well-formed database files. + */ + case SQLITE_TESTCTRL_NEVER_CORRUPT: { + sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS, int); + ** + ** Set or clear a flag that causes SQLite to verify that type, name, + ** and tbl_name fields of the sqlite_schema table. This is normally + ** on, but it is sometimes useful to turn it off for testing. + ** + ** 2020-07-22: Disabling EXTRA_SCHEMA_CHECKS also disables the + ** verification of rootpage numbers when parsing the schema. This + ** is useful to make it easier to reach strange internal error states + ** during testing. The EXTRA_SCHEMA_CHECKS setting is always enabled + ** in production. + */ + case SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: { + sqlite3GlobalConfig.bExtraSchemaChecks = va_arg(ap, int); + break; + } + + /* Set the threshold at which OP_Once counters reset back to zero. + ** By default this is 0x7ffffffe (over 2 billion), but that value is + ** too big to test in a reasonable amount of time, so this control is + ** provided to set a small and easily reachable reset value. + */ + case SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: { + sqlite3GlobalConfig.iOnceResetThreshold = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); + ** + ** Set the VDBE coverage callback function to xCallback with context + ** pointer ptr. + */ + case SQLITE_TESTCTRL_VDBE_COVERAGE: { +#ifdef SQLITE_VDBE_COVERAGE + typedef void (*branch_callback)(void*,unsigned int, + unsigned char,unsigned char); + sqlite3GlobalConfig.xVdbeBranch = va_arg(ap,branch_callback); + sqlite3GlobalConfig.pVdbeBranchArg = va_arg(ap,void*); +#endif + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_SORTER_MMAP, db, nMax); */ + case SQLITE_TESTCTRL_SORTER_MMAP: { + sqlite3 *db = va_arg(ap, sqlite3*); + db->nMaxSorterMmap = va_arg(ap, int); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_ISINIT); + ** + ** Return SQLITE_OK if SQLite has been initialized and SQLITE_ERROR if + ** not. + */ + case SQLITE_TESTCTRL_ISINIT: { + if( sqlite3GlobalConfig.isInit==0 ) rc = SQLITE_ERROR; + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, dbName, onOff, tnum); + ** + ** This test control is used to create imposter tables. "db" is a pointer + ** to the database connection. dbName is the database name (ex: "main" or + ** "temp") which will receive the imposter. "onOff" turns imposter mode on + ** or off. "tnum" is the root page of the b-tree to which the imposter + ** table should connect. + ** + ** Enable imposter mode only when the schema has already been parsed. Then + ** run a single CREATE TABLE statement to construct the imposter table in + ** the parsed schema. Then turn imposter mode back off again. + ** + ** If onOff==0 and tnum>0 then reset the schema for all databases, causing + ** the schema to be reparsed the next time it is needed. This has the + ** effect of erasing all imposter tables. + */ + case SQLITE_TESTCTRL_IMPOSTER: { + sqlite3 *db = va_arg(ap, sqlite3*); + int iDb; + sqlite3_mutex_enter(db->mutex); + iDb = sqlite3FindDbName(db, va_arg(ap,const char*)); + if( iDb>=0 ){ + db->init.iDb = iDb; + db->init.busy = db->init.imposterTable = va_arg(ap,int); + db->init.newTnum = va_arg(ap,int); + if( db->init.busy==0 && db->init.newTnum>0 ){ + sqlite3ResetAllSchemasOfConnection(db); + } + } + sqlite3_mutex_leave(db->mutex); + break; + } + +#if defined(YYCOVERAGE) + /* sqlite3_test_control(SQLITE_TESTCTRL_PARSER_COVERAGE, FILE *out) + ** + ** This test control (only available when SQLite is compiled with + ** -DYYCOVERAGE) writes a report onto "out" that shows all + ** state/lookahead combinations in the parser state machine + ** which are never exercised. If any state is missed, make the + ** return code SQLITE_ERROR. + */ + case SQLITE_TESTCTRL_PARSER_COVERAGE: { + FILE *out = va_arg(ap, FILE*); + if( sqlite3ParserCoverage(out) ) rc = SQLITE_ERROR; + break; + } +#endif /* defined(YYCOVERAGE) */ + + /* sqlite3_test_control(SQLITE_TESTCTRL_RESULT_INTREAL, sqlite3_context*); + ** + ** This test-control causes the most recent sqlite3_result_int64() value + ** to be interpreted as a MEM_IntReal instead of as an MEM_Int. Normally, + ** MEM_IntReal values only arise during an INSERT operation of integer + ** values into a REAL column, so they can be challenging to test. This + ** test-control enables us to write an intreal() SQL function that can + ** inject an intreal() value at arbitrary places in an SQL statement, + ** for testing purposes. + */ + case SQLITE_TESTCTRL_RESULT_INTREAL: { + sqlite3_context *pCtx = va_arg(ap, sqlite3_context*); + sqlite3ResultIntReal(pCtx); + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_SEEK_COUNT, + ** sqlite3 *db, // Database connection + ** u64 *pnSeek // Write seek count here + ** ); + ** + ** This test-control queries the seek-counter on the "main" database + ** file. The seek-counter is written into *pnSeek and is then reset. + ** The seek-count is only available if compiled with SQLITE_DEBUG. + */ + case SQLITE_TESTCTRL_SEEK_COUNT: { + sqlite3 *db = va_arg(ap, sqlite3*); + u64 *pn = va_arg(ap, sqlite3_uint64*); + *pn = sqlite3BtreeSeekCount(db->aDb->pBt); + (void)db; /* Silence harmless unused variable warning */ + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, op, ptr) + ** + ** "ptr" is a pointer to a u32. + ** + ** op==0 Store the current sqlite3TreeTrace in *ptr + ** op==1 Set sqlite3TreeTrace to the value *ptr + ** op==3 Store the current sqlite3WhereTrace in *ptr + ** op==3 Set sqlite3WhereTrace to the value *ptr + */ + case SQLITE_TESTCTRL_TRACEFLAGS: { + int opTrace = va_arg(ap, int); + u32 *ptr = va_arg(ap, u32*); + switch( opTrace ){ + case 0: *ptr = sqlite3TreeTrace; break; + case 1: sqlite3TreeTrace = *ptr; break; + case 2: *ptr = sqlite3WhereTrace; break; + case 3: sqlite3WhereTrace = *ptr; break; + } + break; + } + + /* sqlite3_test_control(SQLITE_TESTCTRL_LOGEST, + ** double fIn, // Input value + ** int *pLogEst, // sqlite3LogEstFromDouble(fIn) + ** u64 *pInt, // sqlite3LogEstToInt(*pLogEst) + ** int *pLogEst2 // sqlite3LogEst(*pInt) + ** ); + ** + ** Test access for the LogEst conversion routines. + */ + case SQLITE_TESTCTRL_LOGEST: { + double rIn = va_arg(ap, double); + LogEst rLogEst = sqlite3LogEstFromDouble(rIn); + int *pI1 = va_arg(ap,int*); + u64 *pU64 = va_arg(ap,u64*); + int *pI2 = va_arg(ap,int*); + *pI1 = rLogEst; + *pU64 = sqlite3LogEstToInt(rLogEst); + *pI2 = sqlite3LogEst(*pU64); + break; + } + + +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_WSD) + /* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, *piValue) + ** + ** If "id" is an integer between 1 and SQLITE_NTUNE then set the value + ** of the id-th tuning parameter to *piValue. If "id" is between -1 + ** and -SQLITE_NTUNE, then write the current value of the (-id)-th + ** tuning parameter into *piValue. + ** + ** Tuning parameters are for use during transient development builds, + ** to help find the best values for constants in the query planner. + ** Access tuning parameters using the Tuning(ID) macro. Set the + ** parameters in the CLI using ".testctrl tune ID VALUE". + ** + ** Transient use only. Tuning parameters should not be used in + ** checked-in code. + */ + case SQLITE_TESTCTRL_TUNE: { + int id = va_arg(ap, int); + int *piValue = va_arg(ap, int*); + if( id>0 && id<=SQLITE_NTUNE ){ + Tuning(id) = *piValue; + }else if( id<0 && id>=-SQLITE_NTUNE ){ + *piValue = Tuning(-id); + }else{ + rc = SQLITE_NOTFOUND; + } + break; + } +#endif + } + va_end(ap); +#endif /* SQLITE_UNTESTABLE */ + return rc; +} + +/* +** The Pager stores the Database filename, Journal filename, and WAL filename +** consecutively in memory, in that order. The database filename is prefixed +** by four zero bytes. Locate the start of the database filename by searching +** backwards for the first byte following four consecutive zero bytes. +** +** This only works if the filename passed in was obtained from the Pager. +*/ +static const char *databaseName(const char *zName){ + while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ + zName--; + } + return zName; +} + +/* +** Append text z[] to the end of p[]. Return a pointer to the first +** character after then zero terminator on the new text in p[]. +*/ +static char *appendText(char *p, const char *z){ + size_t n = strlen(z); + memcpy(p, z, n+1); + return p+n+1; +} + +/* +** Allocate memory to hold names for a database, journal file, WAL file, +** and query parameters. The pointer returned is valid for use by +** sqlite3_filename_database() and sqlite3_uri_parameter() and related +** functions. +** +** Memory layout must be compatible with that generated by the pager +** and expected by sqlite3_uri_parameter() and databaseName(). +*/ +SQLITE_API char *sqlite3_create_filename( + const char *zDatabase, + const char *zJournal, + const char *zWal, + int nParam, + const char **azParam +){ + sqlite3_int64 nByte; + int i; + char *pResult, *p; + nByte = strlen(zDatabase) + strlen(zJournal) + strlen(zWal) + 10; + for(i=0; i0 ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename[0] ? zFilename : 0; +} + +/* +** Return a boolean value for a query parameter. +*/ +SQLITE_API int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){ + const char *z = sqlite3_uri_parameter(zFilename, zParam); + bDflt = bDflt!=0; + return z ? sqlite3GetBoolean(z, bDflt) : bDflt; +} + +/* +** Return a 64-bit integer value for a query parameter. +*/ +SQLITE_API sqlite3_int64 sqlite3_uri_int64( + const char *zFilename, /* Filename as passed to xOpen */ + const char *zParam, /* URI parameter sought */ + sqlite3_int64 bDflt /* return if parameter is missing */ +){ + const char *z = sqlite3_uri_parameter(zFilename, zParam); + sqlite3_int64 v; + if( z && sqlite3DecOrHexToI64(z, &v)==0 ){ + bDflt = v; + } + return bDflt; +} + +/* +** Translate a filename that was handed to a VFS routine into the corresponding +** database, journal, or WAL file. +** +** It is an error to pass this routine a filename string that was not +** passed into the VFS from the SQLite core. Doing so is similar to +** passing free() a pointer that was not obtained from malloc() - it is +** an error that we cannot easily detect but that will likely cause memory +** corruption. +*/ +SQLITE_API const char *sqlite3_filename_database(const char *zFilename){ + if( zFilename==0 ) return 0; + return databaseName(zFilename); +} +SQLITE_API const char *sqlite3_filename_journal(const char *zFilename){ + if( zFilename==0 ) return 0; + zFilename = databaseName(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; + while( ALWAYS(zFilename) && zFilename[0] ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename + 1; +} +SQLITE_API const char *sqlite3_filename_wal(const char *zFilename){ +#ifdef SQLITE_OMIT_WAL + return 0; +#else + zFilename = sqlite3_filename_journal(zFilename); + if( zFilename ) zFilename += sqlite3Strlen30(zFilename) + 1; + return zFilename; +#endif +} + +/* +** Return the Btree pointer identified by zDbName. Return NULL if not found. +*/ +SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ + int iDb = zDbName ? sqlite3FindDbName(db, zDbName) : 0; + return iDb<0 ? 0 : db->aDb[iDb].pBt; +} + +/* +** Return the name of the N-th database schema. Return NULL if N is out +** of range. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + if( N<0 || N>=db->nDb ){ + return 0; + }else{ + return db->aDb[N].zDbSName; + } +} + +/* +** Return the filename of the database associated with a database +** connection. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){ + Btree *pBt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + pBt = sqlite3DbNameToBtree(db, zDbName); + return pBt ? sqlite3BtreeGetFilename(pBt) : 0; +} + +/* +** Return 1 if database is read-only or 0 if read/write. Return -1 if +** no such database exists. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ + Btree *pBt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return -1; + } +#endif + pBt = sqlite3DbNameToBtree(db, zDbName); + return pBt ? sqlite3BtreeIsReadonly(pBt) : -1; +} + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Obtain a snapshot handle for the snapshot of database zDb currently +** being read by handle db. +*/ +SQLITE_API int sqlite3_snapshot_get( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot **ppSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + + if( db->autoCommit==0 ){ + int iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( SQLITE_TXN_WRITE!=sqlite3BtreeTxnState(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Open a read-transaction on the snapshot idendified by pSnapshot. +*/ +SQLITE_API int sqlite3_snapshot_open( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot *pSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( db->autoCommit==0 ){ + int iDb; + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( sqlite3BtreeTxnState(pBt)!=SQLITE_TXN_WRITE ){ + Pager *pPager = sqlite3BtreePager(pBt); + int bUnlock = 0; + if( sqlite3BtreeTxnState(pBt)!=SQLITE_TXN_NONE ){ + if( db->nVdbeActive==0 ){ + rc = sqlite3PagerSnapshotCheck(pPager, pSnapshot); + if( rc==SQLITE_OK ){ + bUnlock = 1; + rc = sqlite3BtreeCommit(pBt); + } + } + }else{ + rc = SQLITE_OK; + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotOpen(pPager, pSnapshot); + } + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + sqlite3PagerSnapshotOpen(pPager, 0); + } + if( bUnlock ){ + sqlite3PagerSnapshotUnlock(pPager); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Recover as many snapshots as possible from the wal file associated with +** schema zDb of database db. +*/ +SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){ + int rc = SQLITE_ERROR; + int iDb; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + sqlite3_mutex_enter(db->mutex); + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( SQLITE_TXN_NONE==sqlite3BtreeTxnState(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt)); + sqlite3BtreeCommit(pBt); + } + } + } + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Free a snapshot handle obtained from sqlite3_snapshot_get(). +*/ +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ + sqlite3_free(pSnapshot); +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +/* +** Given the name of a compile-time option, return true if that option +** was used and false if not. +** +** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix +** is not required for a match. +*/ +SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ + int i, n; + int nOpt; + const char **azCompileOpt; + +#if SQLITE_ENABLE_API_ARMOR + if( zOptName==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + azCompileOpt = sqlite3CompileOptions(&nOpt); + + if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; + n = sqlite3Strlen30(zOptName); + + /* Since nOpt is normally in single digits, a linear search is + ** adequate. No need for a binary search. */ + for(i=0; i=0 && NpNextBlocked){ + int seen = 0; + sqlite3 *p2; + + /* Verify property (1) */ + assert( p->pUnlockConnection || p->pBlockingConnection ); + + /* Verify property (2) */ + for(p2=sqlite3BlockedList; p2!=p; p2=p2->pNextBlocked){ + if( p2->xUnlockNotify==p->xUnlockNotify ) seen = 1; + assert( p2->xUnlockNotify==p->xUnlockNotify || !seen ); + assert( db==0 || p->pUnlockConnection!=db ); + assert( db==0 || p->pBlockingConnection!=db ); + } + } +} +#else +# define checkListProperties(x) +#endif + +/* +** Remove connection db from the blocked connections list. If connection +** db is not currently a part of the list, this function is a no-op. +*/ +static void removeFromBlockedList(sqlite3 *db){ + sqlite3 **pp; + assertMutexHeld(); + for(pp=&sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked){ + if( *pp==db ){ + *pp = (*pp)->pNextBlocked; + break; + } + } +} + +/* +** Add connection db to the blocked connections list. It is assumed +** that it is not already a part of the list. +*/ +static void addToBlockedList(sqlite3 *db){ + sqlite3 **pp; + assertMutexHeld(); + for( + pp=&sqlite3BlockedList; + *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify; + pp=&(*pp)->pNextBlocked + ); + db->pNextBlocked = *pp; + *pp = db; +} + +/* +** Obtain the STATIC_MAIN mutex. +*/ +static void enterMutex(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); + checkListProperties(0); +} + +/* +** Release the STATIC_MAIN mutex. +*/ +static void leaveMutex(void){ + assertMutexHeld(); + checkListProperties(0); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); +} + +/* +** Register an unlock-notify callback. +** +** This is called after connection "db" has attempted some operation +** but has received an SQLITE_LOCKED error because another connection +** (call it pOther) in the same process was busy using the same shared +** cache. pOther is found by looking at db->pBlockingConnection. +** +** If there is no blocking connection, the callback is invoked immediately, +** before this routine returns. +** +** If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate +** a deadlock. +** +** Otherwise, make arrangements to invoke xNotify when pOther drops +** its locks. +** +** Each call to this routine overrides any prior callbacks registered +** on the same "db". If xNotify==0 then any prior callbacks are immediately +** cancelled. +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *db, + void (*xNotify)(void **, int), + void *pArg +){ + int rc = SQLITE_OK; + + sqlite3_mutex_enter(db->mutex); + enterMutex(); + + if( xNotify==0 ){ + removeFromBlockedList(db); + db->pBlockingConnection = 0; + db->pUnlockConnection = 0; + db->xUnlockNotify = 0; + db->pUnlockArg = 0; + }else if( 0==db->pBlockingConnection ){ + /* The blocking transaction has been concluded. Or there never was a + ** blocking transaction. In either case, invoke the notify callback + ** immediately. + */ + xNotify(&pArg, 1); + }else{ + sqlite3 *p; + + for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){} + if( p ){ + rc = SQLITE_LOCKED; /* Deadlock detected. */ + }else{ + db->pUnlockConnection = db->pBlockingConnection; + db->xUnlockNotify = xNotify; + db->pUnlockArg = pArg; + removeFromBlockedList(db); + addToBlockedList(db); + } + } + + leaveMutex(); + assert( !db->mallocFailed ); + sqlite3ErrorWithMsg(db, rc, (rc?"database is deadlocked":0)); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This function is called while stepping or preparing a statement +** associated with connection db. The operation will return SQLITE_LOCKED +** to the user because it requires a lock that will not be available +** until connection pBlocker concludes its current transaction. +*/ +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){ + enterMutex(); + if( db->pBlockingConnection==0 && db->pUnlockConnection==0 ){ + addToBlockedList(db); + } + db->pBlockingConnection = pBlocker; + leaveMutex(); +} + +/* +** This function is called when +** the transaction opened by database db has just finished. Locks held +** by database connection db have been released. +** +** This function loops through each entry in the blocked connections +** list and does the following: +** +** 1) If the sqlite3.pBlockingConnection member of a list entry is +** set to db, then set pBlockingConnection=0. +** +** 2) If the sqlite3.pUnlockConnection member of a list entry is +** set to db, then invoke the configured unlock-notify callback and +** set pUnlockConnection=0. +** +** 3) If the two steps above mean that pBlockingConnection==0 and +** pUnlockConnection==0, remove the entry from the blocked connections +** list. +*/ +SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ + void (*xUnlockNotify)(void **, int) = 0; /* Unlock-notify cb to invoke */ + int nArg = 0; /* Number of entries in aArg[] */ + sqlite3 **pp; /* Iterator variable */ + void **aArg; /* Arguments to the unlock callback */ + void **aDyn = 0; /* Dynamically allocated space for aArg[] */ + void *aStatic[16]; /* Starter space for aArg[]. No malloc required */ + + aArg = aStatic; + enterMutex(); /* Enter STATIC_MAIN mutex */ + + /* This loop runs once for each entry in the blocked-connections list. */ + for(pp=&sqlite3BlockedList; *pp; /* no-op */ ){ + sqlite3 *p = *pp; + + /* Step 1. */ + if( p->pBlockingConnection==db ){ + p->pBlockingConnection = 0; + } + + /* Step 2. */ + if( p->pUnlockConnection==db ){ + assert( p->xUnlockNotify ); + if( p->xUnlockNotify!=xUnlockNotify && nArg!=0 ){ + xUnlockNotify(aArg, nArg); + nArg = 0; + } + + sqlite3BeginBenignMalloc(); + assert( aArg==aDyn || (aDyn==0 && aArg==aStatic) ); + assert( nArg<=(int)ArraySize(aStatic) || aArg==aDyn ); + if( (!aDyn && nArg==(int)ArraySize(aStatic)) + || (aDyn && nArg==(int)(sqlite3MallocSize(aDyn)/sizeof(void*))) + ){ + /* The aArg[] array needs to grow. */ + void **pNew = (void **)sqlite3Malloc(nArg*sizeof(void *)*2); + if( pNew ){ + memcpy(pNew, aArg, nArg*sizeof(void *)); + sqlite3_free(aDyn); + aDyn = aArg = pNew; + }else{ + /* This occurs when the array of context pointers that need to + ** be passed to the unlock-notify callback is larger than the + ** aStatic[] array allocated on the stack and the attempt to + ** allocate a larger array from the heap has failed. + ** + ** This is a difficult situation to handle. Returning an error + ** code to the caller is insufficient, as even if an error code + ** is returned the transaction on connection db will still be + ** closed and the unlock-notify callbacks on blocked connections + ** will go unissued. This might cause the application to wait + ** indefinitely for an unlock-notify callback that will never + ** arrive. + ** + ** Instead, invoke the unlock-notify callback with the context + ** array already accumulated. We can then clear the array and + ** begin accumulating any further context pointers without + ** requiring any dynamic allocation. This is sub-optimal because + ** it means that instead of one callback with a large array of + ** context pointers the application will receive two or more + ** callbacks with smaller arrays of context pointers, which will + ** reduce the applications ability to prioritize multiple + ** connections. But it is the best that can be done under the + ** circumstances. + */ + xUnlockNotify(aArg, nArg); + nArg = 0; + } + } + sqlite3EndBenignMalloc(); + + aArg[nArg++] = p->pUnlockArg; + xUnlockNotify = p->xUnlockNotify; + p->pUnlockConnection = 0; + p->xUnlockNotify = 0; + p->pUnlockArg = 0; + } + + /* Step 3. */ + if( p->pBlockingConnection==0 && p->pUnlockConnection==0 ){ + /* Remove connection p from the blocked connections list. */ + *pp = p->pNextBlocked; + p->pNextBlocked = 0; + }else{ + pp = &p->pNextBlocked; + } + } + + if( nArg!=0 ){ + xUnlockNotify(aArg, nArg); + } + sqlite3_free(aDyn); + leaveMutex(); /* Leave STATIC_MAIN mutex */ +} + +/* +** This is called when the database connection passed as an argument is +** being closed. The connection is removed from the blocked list. +*/ +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ + sqlite3ConnectionUnlocked(db); + enterMutex(); + removeFromBlockedList(db); + checkListProperties(db); + leaveMutex(); +} +#endif + +/************** End of notify.c **********************************************/ +/************** Begin file fts3.c ********************************************/ +/* +** 2006 Oct 10 +** +** 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 is an SQLite module implementing full-text search. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ + +/* The full-text index is stored in a series of b+tree (-like) +** structures called segments which map terms to doclists. The +** structures are like b+trees in layout, but are constructed from the +** bottom up in optimal fashion and are not updatable. Since trees +** are built from the bottom up, things will be described from the +** bottom up. +** +** +**** Varints **** +** The basic unit of encoding is a variable-length integer called a +** varint. We encode variable-length integers in little-endian order +** using seven bits * per byte as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** and so on. +** +** This is similar in concept to how sqlite encodes "varints" but +** the encoding is not the same. SQLite varints are big-endian +** are are limited to 9 bytes in length whereas FTS3 varints are +** little-endian and can be up to 10 bytes in length (in theory). +** +** Example encodings: +** +** 1: 0x01 +** 127: 0x7f +** 128: 0x81 0x00 +** +** +**** Document lists **** +** A doclist (document list) holds a docid-sorted list of hits for a +** given term. Doclists hold docids and associated token positions. +** A docid is the unique integer identifier for a single document. +** A position is the index of a word within the document. The first +** word of the document has a position of 0. +** +** FTS3 used to optionally store character offsets using a compile-time +** option. But that functionality is no longer supported. +** +** A doclist is stored like this: +** +** array { +** varint docid; (delta from previous doclist) +** array { (position list for column 0) +** varint position; (2 more than the delta from previous position) +** } +** array { +** varint POS_COLUMN; (marks start of position list for new column) +** varint column; (index of new column) +** array { +** varint position; (2 more than the delta from previous position) +** } +** } +** varint POS_END; (marks end of positions for this document. +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. A "position" is an index of a token in the token stream +** generated by the tokenizer. Note that POS_END and POS_COLUMN occur +** in the same logical place as the position element, and act as sentinals +** ending a position list array. POS_END is 0. POS_COLUMN is 1. +** The positions numbers are not stored literally but rather as two more +** than the difference from the prior position, or the just the position plus +** 2 for the first position. Example: +** +** label: A B C D E F G H I J K +** value: 123 5 9 1 1 14 35 0 234 72 0 +** +** The 123 value is the first docid. For column zero in this document +** there are two matches at positions 3 and 10 (5-2 and 9-2+3). The 1 +** at D signals the start of a new column; the 1 at E indicates that the +** new column is column number 1. There are two positions at 12 and 45 +** (14-2 and 35-2+12). The 0 at H indicate the end-of-document. The +** 234 at I is the delta to next docid (357). It has one position 70 +** (72-2) and then terminates with the 0 at K. +** +** A "position-list" is the list of positions for multiple columns for +** a single docid. A "column-list" is the set of positions for a single +** column. Hence, a position-list consists of one or more column-lists, +** a document record consists of a docid followed by a position-list and +** a doclist consists of one or more document records. +** +** A bare doclist omits the position information, becoming an +** array of varint-encoded docids. +** +**** Segment leaf nodes **** +** Segment leaf nodes store terms and doclists, ordered by term. Leaf +** nodes are written using LeafWriter, and read using LeafReader (to +** iterate through a single leaf node's data) and LeavesReader (to +** iterate through a segment's entire leaf layer). Leaf nodes have +** the format: +** +** varint iHeight; (height from leaf level, always 0) +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of prefix shared with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix];(unshared suffix of next term) +** varint nDoclist; (length of term's associated doclist) +** char pDoclist[nDoclist]; (content of doclist) +** } +** +** Here, array { X } means zero or more occurrences of X, adjacent in +** memory. +** +** Leaf nodes are broken into blocks which are stored contiguously in +** the %_segments table in sorted order. This means that when the end +** of a node is reached, the next term is in the node with the next +** greater node id. +** +** New data is spilled to a new leaf node when the current node +** exceeds LEAF_MAX bytes (default 2048). New data which itself is +** larger than STANDALONE_MIN (default 1024) is placed in a standalone +** node (a leaf node with a single term and doclist). The goal of +** these settings is to pack together groups of small doclists while +** making it efficient to directly access large doclists. The +** assumption is that large doclists represent terms which are more +** likely to be query targets. +** +** TODO(shess) It may be useful for blocking decisions to be more +** dynamic. For instance, it may make more sense to have a 2.5k leaf +** node rather than splitting into 2k and .5k nodes. My intuition is +** that this might extend through 2x or 4x the pagesize. +** +** +**** Segment interior nodes **** +** Segment interior nodes store blockids for subtree nodes and terms +** to describe what data is stored by the each subtree. Interior +** nodes are written using InteriorWriter, and read using +** InteriorReader. InteriorWriters are created as needed when +** SegmentWriter creates new leaf nodes, or when an interior node +** itself grows too big and must be split. The format of interior +** nodes: +** +** varint iHeight; (height from leaf level, always >0) +** varint iBlockid; (block id of node's leftmost subtree) +** optional { +** varint nTerm; (length of first term) +** char pTerm[nTerm]; (content of first term) +** array { +** (further terms are delta-encoded) +** varint nPrefix; (length of shared prefix with previous term) +** varint nSuffix; (length of unshared suffix) +** char pTermSuffix[nSuffix]; (unshared suffix of next term) +** } +** } +** +** Here, optional { X } means an optional element, while array { X } +** means zero or more occurrences of X, adjacent in memory. +** +** An interior node encodes n terms separating n+1 subtrees. The +** subtree blocks are contiguous, so only the first subtree's blockid +** is encoded. The subtree at iBlockid will contain all terms less +** than the first term encoded (or all terms if no term is encoded). +** Otherwise, for terms greater than or equal to pTerm[i] but less +** than pTerm[i+1], the subtree for that term will be rooted at +** iBlockid+i. Interior nodes only store enough term data to +** distinguish adjacent children (if the rightmost term of the left +** child is "something", and the leftmost term of the right child is +** "wicked", only "w" is stored). +** +** New data is spilled to a new interior node at the same height when +** the current node exceeds INTERIOR_MAX bytes (default 2048). +** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing +** interior nodes and making the tree too skinny. The interior nodes +** at a given height are naturally tracked by interior nodes at +** height+1, and so on. +** +** +**** Segment directory **** +** The segment directory in table %_segdir stores meta-information for +** merging and deleting segments, and also the root node of the +** segment's tree. +** +** The root node is the top node of the segment's tree after encoding +** the entire segment, restricted to ROOT_MAX bytes (default 1024). +** This could be either a leaf node or an interior node. If the top +** node requires more than ROOT_MAX bytes, it is flushed to %_segments +** and a new root interior node is generated (which should always fit +** within ROOT_MAX because it only needs space for 2 varints, the +** height and the blockid of the previous root). +** +** The meta-information in the segment directory is: +** level - segment level (see below) +** idx - index within level +** - (level,idx uniquely identify a segment) +** start_block - first leaf node +** leaves_end_block - last leaf node +** end_block - last block (including interior nodes) +** root - contents of root node +** +** If the root node is a leaf node, then start_block, +** leaves_end_block, and end_block are all 0. +** +** +**** Segment merging **** +** To amortize update costs, segments are grouped into levels and +** merged in batches. Each increase in level represents exponentially +** more documents. +** +** New documents (actually, document updates) are tokenized and +** written individually (using LeafWriter) to a level 0 segment, with +** incrementing idx. When idx reaches MERGE_COUNT (default 16), all +** level 0 segments are merged into a single level 1 segment. Level 1 +** is populated like level 0, and eventually MERGE_COUNT level 1 +** segments are merged to a single level 2 segment (representing +** MERGE_COUNT^2 updates), and so on. +** +** A segment merge traverses all segments at a given level in +** parallel, performing a straightforward sorted merge. Since segment +** leaf nodes are written in to the %_segments table in order, this +** merge traverses the underlying sqlite disk structures efficiently. +** After the merge, all segment blocks from the merged level are +** deleted. +** +** MERGE_COUNT controls how often we merge segments. 16 seems to be +** somewhat of a sweet spot for insertion performance. 32 and 64 show +** very similar performance numbers to 16 on insertion, though they're +** a tiny bit slower (perhaps due to more overhead in merge-time +** sorting). 8 is about 20% slower than 16, 4 about 50% slower than +** 16, 2 about 66% slower than 16. +** +** At query time, high MERGE_COUNT increases the number of segments +** which need to be scanned and merged. For instance, with 100k docs +** inserted: +** +** MERGE_COUNT segments +** 16 25 +** 8 12 +** 4 10 +** 2 6 +** +** This appears to have only a moderate impact on queries for very +** frequent terms (which are somewhat dominated by segment merge +** costs), and infrequent and non-existent terms still seem to be fast +** even with many segments. +** +** TODO(shess) That said, it would be nice to have a better query-side +** argument for MERGE_COUNT of 16. Also, it is possible/likely that +** optimizations to things like doclist merging will swing the sweet +** spot around. +** +** +** +**** Handling of deletions and updates **** +** Since we're using a segmented structure, with no docid-oriented +** index into the term index, we clearly cannot simply update the term +** index when a document is deleted or updated. For deletions, we +** write an empty doclist (varint(docid) varint(POS_END)), for updates +** we simply write the new doclist. Segment merges overwrite older +** data for a particular docid with newer data, so deletes or updates +** will eventually overtake the earlier data and knock it out. The +** query logic likewise merges doclists so that newer data knocks out +** older data. +*/ + +/************** Include fts3Int.h in the middle of fts3.c ********************/ +/************** Begin file fts3Int.h *****************************************/ +/* +** 2009 Nov 12 +** +** 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. +** +****************************************************************************** +** +*/ +#ifndef _FTSINT_H +#define _FTSINT_H + +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* FTS3/FTS4 require virtual tables */ +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + +/* +** FTS4 is really an extension for FTS3. It is enabled using the +** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all +** the SQLITE_ENABLE_FTS4 macro to serve as an alisse for SQLITE_ENABLE_FTS3. +*/ +#if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3) +# define SQLITE_ENABLE_FTS3 +#endif + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* If not building as part of the core, include sqlite3ext.h. */ +#ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT3 +#endif + +/* #include "sqlite3.h" */ +/************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/ +/************** Begin file fts3_tokenizer.h **********************************/ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS3_TOKENIZER_H_ +#define _FTS3_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +/* #include "sqlite3.h" */ + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts3 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts3 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0 or 1. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts3 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialized by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts3 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. *piStartOffset should be set to the index of the first + ** byte of the token in the input buffer. *piEndOffset should be set + ** to the index of the first byte just past the end of the token in + ** the input buffer. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); + + /*********************************************************************** + ** Methods below this point are only available if iVersion>=1. + */ + + /* + ** Configure the language id of a tokenizer cursor. + */ + int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +int fts3_global_term_cnt(int iTerm, int iCol); +int fts3_term_cnt(int iTerm, int iCol); + + +#endif /* _FTS3_TOKENIZER_H_ */ + +/************** End of fts3_tokenizer.h **************************************/ +/************** Continuing where we left off in fts3Int.h ********************/ +/************** Include fts3_hash.h in the middle of fts3Int.h ***************/ +/************** Begin file fts3_hash.h ***************************************/ +/* +** 2001 September 22 +** +** 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 is the header file for the generic hash-table implementation +** used in SQLite. We've modified it slightly to serve as a standalone +** hash table implementation for the full-text indexing module. +** +*/ +#ifndef _FTS3_HASH_H_ +#define _FTS3_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct Fts3Hash Fts3Hash; +typedef struct Fts3HashElem Fts3HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, many of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +*/ +struct Fts3Hash { + char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ + char copyKey; /* True if copy of key made on insert */ + int count; /* Number of entries in this table */ + Fts3HashElem *first; /* The first element of the array */ + int htsize; /* Number of buckets in the hash table */ + struct _fts3ht { /* the hash table */ + int count; /* Number of entries with this hash */ + Fts3HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct Fts3HashElem { + Fts3HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + void *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** There are 2 different modes of operation for a hash table: +** +** FTS3_HASH_STRING pKey points to a string that is nKey bytes long +** (including the null-terminator, if any). Case +** is respected in comparisons. +** +** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. +** memcmp() is used to compare keys. +** +** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. +*/ +#define FTS3_HASH_STRING 1 +#define FTS3_HASH_BINARY 2 + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey); +SQLITE_PRIVATE void *sqlite3Fts3HashInsert(Fts3Hash*, const void *pKey, int nKey, void *pData); +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash*, const void *pKey, int nKey); +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash*); +SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const void *, int); + +/* +** Shorthand for the functions above +*/ +#define fts3HashInit sqlite3Fts3HashInit +#define fts3HashInsert sqlite3Fts3HashInsert +#define fts3HashFind sqlite3Fts3HashFind +#define fts3HashClear sqlite3Fts3HashClear +#define fts3HashFindElem sqlite3Fts3HashFindElem + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Fts3Hash h; +** Fts3HashElem *p; +** ... +** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){ +** SomeStructure *pData = fts3HashData(p); +** // do something with pData +** } +*/ +#define fts3HashFirst(H) ((H)->first) +#define fts3HashNext(E) ((E)->next) +#define fts3HashData(E) ((E)->data) +#define fts3HashKey(E) ((E)->pKey) +#define fts3HashKeysize(E) ((E)->nKey) + +/* +** Number of entries in a hash table +*/ +#define fts3HashCount(H) ((H)->count) + +#endif /* _FTS3_HASH_H_ */ + +/************** End of fts3_hash.h *******************************************/ +/************** Continuing where we left off in fts3Int.h ********************/ + +/* +** This constant determines the maximum depth of an FTS expression tree +** that the library will create and use. FTS uses recursion to perform +** various operations on the query tree, so the disadvantage of a large +** limit is that it may allow very large queries to use large amounts +** of stack space (perhaps causing a stack overflow). +*/ +#ifndef SQLITE_FTS3_MAX_EXPR_DEPTH +# define SQLITE_FTS3_MAX_EXPR_DEPTH 12 +#endif + + +/* +** This constant controls how often segments are merged. Once there are +** FTS3_MERGE_COUNT segments of level N, they are merged into a single +** segment of level N+1. +*/ +#define FTS3_MERGE_COUNT 16 + +/* +** This is the maximum amount of data (in bytes) to store in the +** Fts3Table.pendingTerms hash table. Normally, the hash table is +** populated as documents are inserted/updated/deleted in a transaction +** and used to create a new segment when the transaction is committed. +** However if this limit is reached midway through a transaction, a new +** segment is created and the hash table cleared immediately. +*/ +#define FTS3_MAX_PENDING_DATA (1*1024*1024) + +/* +** Macro to return the number of elements in an array. SQLite has a +** similar macro called ArraySize(). Use a different name to avoid +** a collision when building an amalgamation with built-in FTS3. +*/ +#define SizeofArray(X) ((int)(sizeof(X)/sizeof(X[0]))) + + +#ifndef MIN +# define MIN(x,y) ((x)<(y)?(x):(y)) +#endif +#ifndef MAX +# define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +/* +** Maximum length of a varint encoded integer. The varint format is different +** from that used by SQLite, so the maximum length is 10, not 9. +*/ +#define FTS3_VARINT_MAX 10 + +#define FTS3_BUFFER_PADDING 8 + +/* +** FTS4 virtual tables may maintain multiple indexes - one index of all terms +** in the document set and zero or more prefix indexes. All indexes are stored +** as one or more b+-trees in the %_segments and %_segdir tables. +** +** It is possible to determine which index a b+-tree belongs to based on the +** value stored in the "%_segdir.level" column. Given this value L, the index +** that the b+-tree belongs to is (L<<10). In other words, all b+-trees with +** level values between 0 and 1023 (inclusive) belong to index 0, all levels +** between 1024 and 2047 to index 1, and so on. +** +** It is considered impossible for an index to use more than 1024 levels. In +** theory though this may happen, but only after at least +** (FTS3_MERGE_COUNT^1024) separate flushes of the pending-terms tables. +*/ +#define FTS3_SEGDIR_MAXLEVEL 1024 +#define FTS3_SEGDIR_MAXLEVEL_STR "1024" + +/* +** The testcase() macro is only used by the amalgamation. If undefined, +** make it a no-op. +*/ +#ifndef testcase +# define testcase(X) +#endif + +/* +** Terminator values for position-lists and column-lists. +*/ +#define POS_COLUMN (1) /* Column-list terminator */ +#define POS_END (0) /* Position-list terminator */ + +/* +** The assert_fts3_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#ifdef SQLITE_DEBUG +SQLITE_API extern int sqlite3_fts3_may_be_corrupt; +# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#else +# define assert_fts3_nc(x) assert(x) +#endif + +/* +** This section provides definitions to allow the +** FTS3 extension to be compiled outside of the +** amalgamation. +*/ +#ifndef SQLITE_AMALGAMATION +/* +** Macros indicating that conditional expressions are always true or +** false. +*/ +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +/* +** Internal types used by SQLite. +*/ +typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */ +typedef short int i16; /* 2-byte (or larger) signed integer */ +typedef unsigned int u32; /* 4-byte unsigned integer */ +typedef sqlite3_uint64 u64; /* 8-byte unsigned integer */ +typedef sqlite3_int64 i64; /* 8-byte signed integer */ + +/* +** Macro used to suppress compiler warnings for unused parameters. +*/ +#define UNUSED_PARAMETER(x) (void)(x) + +/* +** Activate assert() only if SQLITE_TEST is enabled. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +#define deliberate_fall_through + +#endif /* SQLITE_AMALGAMATION */ + +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3Fts3Corrupt(void); +# define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt() +#else +# define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB +#endif + +typedef struct Fts3Table Fts3Table; +typedef struct Fts3Cursor Fts3Cursor; +typedef struct Fts3Expr Fts3Expr; +typedef struct Fts3Phrase Fts3Phrase; +typedef struct Fts3PhraseToken Fts3PhraseToken; + +typedef struct Fts3Doclist Fts3Doclist; +typedef struct Fts3SegFilter Fts3SegFilter; +typedef struct Fts3DeferredToken Fts3DeferredToken; +typedef struct Fts3SegReader Fts3SegReader; +typedef struct Fts3MultiSegReader Fts3MultiSegReader; + +typedef struct MatchinfoBuffer MatchinfoBuffer; + +/* +** A connection to a fulltext index is an instance of the following +** structure. The xCreate and xConnect methods create an instance +** of this structure and xDestroy and xDisconnect free that instance. +** All other methods receive a pointer to the structure as one of their +** arguments. +*/ +struct Fts3Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + sqlite3 *db; /* The database connection */ + const char *zDb; /* logical database name */ + const char *zName; /* virtual table name */ + int nColumn; /* number of named columns in virtual table */ + char **azColumn; /* column names. malloced */ + u8 *abNotindexed; /* True for 'notindexed' columns */ + sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ + char *zContentTbl; /* content=xxx option, or NULL */ + char *zLanguageid; /* languageid=xxx option, or NULL */ + int nAutoincrmerge; /* Value configured by 'automerge' */ + u32 nLeafAdd; /* Number of leaf blocks added this trans */ + int bLock; /* Used to prevent recursive content= tbls */ + + /* Precompiled statements used by the implementation. Each of these + ** statements is run and reset within a single virtual table API call. + */ + sqlite3_stmt *aStmt[40]; + sqlite3_stmt *pSeekStmt; /* Cache for fts3CursorSeekStmt() */ + + char *zReadExprlist; + char *zWriteExprlist; + + int nNodeSize; /* Soft limit for node size */ + u8 bFts4; /* True for FTS4, false for FTS3 */ + u8 bHasStat; /* True if %_stat table exists (2==unknown) */ + u8 bHasDocsize; /* True if %_docsize table exists */ + u8 bDescIdx; /* True if doclists are in reverse order */ + u8 bIgnoreSavepoint; /* True to ignore xSavepoint invocations */ + int nPgsz; /* Page size for host database */ + char *zSegmentsTbl; /* Name of %_segments table */ + sqlite3_blob *pSegments; /* Blob handle open on %_segments table */ + + /* + ** The following array of hash tables is used to buffer pending index + ** updates during transactions. All pending updates buffered at any one + ** time must share a common language-id (see the FTS4 langid= feature). + ** The current language id is stored in variable iPrevLangid. + ** + ** A single FTS4 table may have multiple full-text indexes. For each index + ** there is an entry in the aIndex[] array. Index 0 is an index of all the + ** terms that appear in the document set. Each subsequent index in aIndex[] + ** is an index of prefixes of a specific length. + ** + ** Variable nPendingData contains an estimate the memory consumed by the + ** pending data structures, including hash table overhead, but not including + ** malloc overhead. When nPendingData exceeds nMaxPendingData, all hash + ** tables are flushed to disk. Variable iPrevDocid is the docid of the most + ** recently inserted record. + */ + int nIndex; /* Size of aIndex[] */ + struct Fts3Index { + int nPrefix; /* Prefix length (0 for main terms index) */ + Fts3Hash hPending; /* Pending terms table for this index */ + } *aIndex; + int nMaxPendingData; /* Max pending data before flush to disk */ + int nPendingData; /* Current bytes of pending data */ + sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ + int iPrevLangid; /* Langid of recently inserted document */ + int bPrevDelete; /* True if last operation was a delete */ + +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) + /* State variables used for validating that the transaction control + ** methods of the virtual table are called at appropriate times. These + ** values do not contribute to FTS functionality; they are used for + ** verifying the operation of the SQLite core. + */ + int inTransaction; /* True after xBegin but before xCommit/xRollback */ + int mxSavepoint; /* Largest valid xSavepoint integer */ +#endif + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + /* True to disable the incremental doclist optimization. This is controled + ** by special insert command 'test-no-incr-doclist'. */ + int bNoIncrDoclist; + + /* Number of segments in a level */ + int nMergeCount; +#endif +}; + +/* Macro to find the number of segments to merge */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +# define MergeCount(P) ((P)->nMergeCount) +#else +# define MergeCount(P) FTS3_MERGE_COUNT +#endif + +/* +** When the core wants to read from the virtual table, it creates a +** virtual table cursor (an instance of the following structure) using +** the xOpen method. Cursors are destroyed using the xClose method. +*/ +struct Fts3Cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + i16 eSearch; /* Search strategy (see below) */ + u8 isEof; /* True if at End Of Results */ + u8 isRequireSeek; /* True if must seek pStmt to %_content row */ + u8 bSeekStmt; /* True if pStmt is a seek */ + sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ + Fts3Expr *pExpr; /* Parsed MATCH query string */ + int iLangid; /* Language being queried for */ + int nPhrase; /* Number of matchable phrases in query */ + Fts3DeferredToken *pDeferred; /* Deferred search tokens, if any */ + sqlite3_int64 iPrevId; /* Previous id read from aDoclist */ + char *pNextId; /* Pointer into the body of aDoclist */ + char *aDoclist; /* List of docids for full-text queries */ + int nDoclist; /* Size of buffer at aDoclist */ + u8 bDesc; /* True to sort in descending order */ + int eEvalmode; /* An FTS3_EVAL_XX constant */ + int nRowAvg; /* Average size of database rows, in pages */ + sqlite3_int64 nDoc; /* Documents in table */ + i64 iMinDocid; /* Minimum docid to return */ + i64 iMaxDocid; /* Maximum docid to return */ + int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */ + MatchinfoBuffer *pMIBuffer; /* Buffer for matchinfo data */ +}; + +#define FTS3_EVAL_FILTER 0 +#define FTS3_EVAL_NEXT 1 +#define FTS3_EVAL_MATCHINFO 2 + +/* +** The Fts3Cursor.eSearch member is always set to one of the following. +** Actualy, Fts3Cursor.eSearch can be greater than or equal to +** FTS3_FULLTEXT_SEARCH. If so, then Fts3Cursor.eSearch - 2 is the index +** of the column to be searched. For example, in +** +** CREATE VIRTUAL TABLE ex1 USING fts3(a,b,c,d); +** SELECT docid FROM ex1 WHERE b MATCH 'one two three'; +** +** Because the LHS of the MATCH operator is 2nd column "b", +** Fts3Cursor.eSearch will be set to FTS3_FULLTEXT_SEARCH+1. (+0 for a, +** +1 for b, +2 for c, +3 for d.) If the LHS of MATCH were "ex1" +** indicating that all columns should be searched, +** then eSearch would be set to FTS3_FULLTEXT_SEARCH+4. +*/ +#define FTS3_FULLSCAN_SEARCH 0 /* Linear scan of %_content table */ +#define FTS3_DOCID_SEARCH 1 /* Lookup by rowid on %_content table */ +#define FTS3_FULLTEXT_SEARCH 2 /* Full-text index search */ + +/* +** The lower 16-bits of the sqlite3_index_info.idxNum value set by +** the xBestIndex() method contains the Fts3Cursor.eSearch value described +** above. The upper 16-bits contain a combination of the following +** bits, used to describe extra constraints on full-text searches. +*/ +#define FTS3_HAVE_LANGID 0x00010000 /* languageid=? */ +#define FTS3_HAVE_DOCID_GE 0x00020000 /* docid>=? */ +#define FTS3_HAVE_DOCID_LE 0x00040000 /* docid<=? */ + +struct Fts3Doclist { + char *aAll; /* Array containing doclist (or NULL) */ + int nAll; /* Size of a[] in bytes */ + char *pNextDocid; /* Pointer to next docid */ + + sqlite3_int64 iDocid; /* Current docid (if pList!=0) */ + int bFreeList; /* True if pList should be sqlite3_free()d */ + char *pList; /* Pointer to position list following iDocid */ + int nList; /* Length of position list */ +}; + +/* +** A "phrase" is a sequence of one or more tokens that must match in +** sequence. A single token is the base case and the most common case. +** For a sequence of tokens contained in double-quotes (i.e. "one two three") +** nToken will be the number of tokens in the string. +*/ +struct Fts3PhraseToken { + char *z; /* Text of the token */ + int n; /* Number of bytes in buffer z */ + int isPrefix; /* True if token ends with a "*" character */ + int bFirst; /* True if token must appear at position 0 */ + + /* Variables above this point are populated when the expression is + ** parsed (by code in fts3_expr.c). Below this point the variables are + ** used when evaluating the expression. */ + Fts3DeferredToken *pDeferred; /* Deferred token object for this token */ + Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */ +}; + +struct Fts3Phrase { + /* Cache of doclist for this phrase. */ + Fts3Doclist doclist; + int bIncr; /* True if doclist is loaded incrementally */ + int iDoclistToken; + + /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an + ** OR condition. */ + char *pOrPoslist; + i64 iOrDocid; + + /* Variables below this point are populated by fts3_expr.c when parsing + ** a MATCH expression. Everything above is part of the evaluation phase. + */ + int nToken; /* Number of tokens in the phrase */ + int iColumn; /* Index of column this phrase must match */ + Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */ +}; + +/* +** A tree of these objects forms the RHS of a MATCH operator. +** +** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist +** points to a malloced buffer, size nDoclist bytes, containing the results +** of this phrase query in FTS3 doclist format. As usual, the initial +** "Length" field found in doclists stored on disk is omitted from this +** buffer. +** +** Variable aMI is used only for FTSQUERY_NEAR nodes to store the global +** matchinfo data. If it is not NULL, it points to an array of size nCol*3, +** where nCol is the number of columns in the queried FTS table. The array +** is populated as follows: +** +** aMI[iCol*3 + 0] = Undefined +** aMI[iCol*3 + 1] = Number of occurrences +** aMI[iCol*3 + 2] = Number of rows containing at least one instance +** +** The aMI array is allocated using sqlite3_malloc(). It should be freed +** when the expression node is. +*/ +struct Fts3Expr { + int eType; /* One of the FTSQUERY_XXX values defined below */ + int nNear; /* Valid if eType==FTSQUERY_NEAR */ + Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */ + Fts3Expr *pLeft; /* Left operand */ + Fts3Expr *pRight; /* Right operand */ + Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ + + /* The following are used by the fts3_eval.c module. */ + sqlite3_int64 iDocid; /* Current docid */ + u8 bEof; /* True this expression is at EOF already */ + u8 bStart; /* True if iDocid is valid */ + u8 bDeferred; /* True if this expression is entirely deferred */ + + /* The following are used by the fts3_snippet.c module. */ + int iPhrase; /* Index of this phrase in matchinfo() results */ + u32 *aMI; /* See above */ +}; + +/* +** Candidate values for Fts3Query.eType. Note that the order of the first +** four values is in order of precedence when parsing expressions. For +** example, the following: +** +** "a OR b AND c NOT d NEAR e" +** +** is equivalent to: +** +** "a OR (b AND (c NOT (d NEAR e)))" +*/ +#define FTSQUERY_NEAR 1 +#define FTSQUERY_NOT 2 +#define FTSQUERY_AND 3 +#define FTSQUERY_OR 4 +#define FTSQUERY_PHRASE 5 + + +/* fts3_write.c */ +SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(sqlite3_vtab*,int,sqlite3_value**,sqlite3_int64*); +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *); +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(int, int, sqlite3_int64, + sqlite3_int64, sqlite3_int64, const char *, int, Fts3SegReader**); +SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( + Fts3Table*,int,const char*,int,int,Fts3SegReader**); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *); +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, int, int, int, sqlite3_stmt **); +SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char **, int*, int*); + +SQLITE_PRIVATE int sqlite3Fts3SelectDoctotal(Fts3Table *, sqlite3_stmt **); +SQLITE_PRIVATE int sqlite3Fts3SelectDocsize(Fts3Table *, sqlite3_int64, sqlite3_stmt **); + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *); +SQLITE_PRIVATE int sqlite3Fts3DeferToken(Fts3Cursor *, Fts3PhraseToken *, int); +SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *); +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *); +SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(Fts3DeferredToken *, char **, int *); +#else +# define sqlite3Fts3FreeDeferredTokens(x) +# define sqlite3Fts3DeferToken(x,y,z) SQLITE_OK +# define sqlite3Fts3CacheDeferredDoclists(x) SQLITE_OK +# define sqlite3Fts3FreeDeferredDoclists(x) +# define sqlite3Fts3DeferredTokenList(x,y,z) SQLITE_OK +#endif + +SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *); +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *, int *); + +/* Special values interpreted by sqlite3SegReaderCursor() */ +#define FTS3_SEGCURSOR_PENDING -1 +#define FTS3_SEGCURSOR_ALL -2 + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3MultiSegReader*, Fts3SegFilter*); +SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3MultiSegReader *); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader *); + +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *, + int, int, int, const char *, int, int, int, Fts3MultiSegReader *); + +/* Flags allowed as part of the 4th argument to SegmentReaderIterate() */ +#define FTS3_SEGMENT_REQUIRE_POS 0x00000001 +#define FTS3_SEGMENT_IGNORE_EMPTY 0x00000002 +#define FTS3_SEGMENT_COLUMN_FILTER 0x00000004 +#define FTS3_SEGMENT_PREFIX 0x00000008 +#define FTS3_SEGMENT_SCAN 0x00000010 +#define FTS3_SEGMENT_FIRST 0x00000020 + +/* Type passed as 4th argument to SegmentReaderIterate() */ +struct Fts3SegFilter { + const char *zTerm; + int nTerm; + int iCol; + int flags; +}; + +struct Fts3MultiSegReader { + /* Used internally by sqlite3Fts3SegReaderXXX() calls */ + Fts3SegReader **apSegment; /* Array of Fts3SegReader objects */ + int nSegment; /* Size of apSegment array */ + int nAdvance; /* How many seg-readers to advance */ + Fts3SegFilter *pFilter; /* Pointer to filter object */ + char *aBuffer; /* Buffer to merge doclists in */ + int nBuffer; /* Allocated size of aBuffer[] in bytes */ + + int iColFilter; /* If >=0, filter for this column */ + int bRestart; + + /* Used by fts3.c only. */ + int nCost; /* Cost of running iterator */ + int bLookup; /* True if a lookup of a single entry. */ + + /* Output values. Valid only after Fts3SegReaderStep() returns SQLITE_ROW. */ + char *zTerm; /* Pointer to term buffer */ + int nTerm; /* Size of zTerm in bytes */ + char *aDoclist; /* Pointer to doclist buffer */ + int nDoclist; /* Size of aDoclist[] in bytes */ +}; + +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*,int,int); + +#define fts3GetVarint32(p, piVal) ( \ + (*(u8*)(p)&0x80) ? sqlite3Fts3GetVarint32(p, piVal) : (*piVal=*(u8*)(p), 1) \ +) + +/* fts3.c */ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char**,const char*,...); +SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64); +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *, sqlite_uint64 *); +SQLITE_PRIVATE int sqlite3Fts3GetVarintBounded(const char*,const char*,sqlite3_int64*); +SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *); +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64); +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *); +SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); +SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); +SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); +SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*); +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); +SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut); + +/* fts3_tokenizer.c */ +SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); +SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, + sqlite3_tokenizer **, char ** +); +SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char); + +/* fts3_snippet.c */ +SQLITE_PRIVATE void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*); +SQLITE_PRIVATE void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const char *, + const char *, const char *, int, int +); +SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *); +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p); + +/* fts3_expr.c */ +SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, + char **, int, int, int, const char *, int, Fts3Expr **, char ** +); +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*); +SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db); +#endif +SQLITE_PRIVATE void *sqlite3Fts3MallocZero(i64 nByte); + +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int, + sqlite3_tokenizer_cursor ** +); + +/* fts3_aux.c */ +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db); + +SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *); + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( + Fts3Table*, Fts3MultiSegReader*, int, const char*, int); +SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( + Fts3Table *, Fts3MultiSegReader *, sqlite3_int64 *, char **, int *); +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); +SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *); +SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); + +/* fts3_tokenize_vtab.c */ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *, void(*xDestroy)(void*)); + +/* fts3_unicode2.c (functions generated by parsing unicode text files) */ +#ifndef SQLITE_DISABLE_FTS3_UNICODE +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int, int); +SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int); +SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); +#endif + +#endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */ +#endif /* _FTSINT_H */ + +/************** End of fts3Int.h *********************************************/ +/************** Continuing where we left off in fts3.c ***********************/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +#if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE) +# define SQLITE_CORE 1 +#endif + +/* #include */ +/* #include */ +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3.h" */ +#ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#endif + +typedef struct Fts3HashWrapper Fts3HashWrapper; +struct Fts3HashWrapper { + Fts3Hash hash; /* Hash table */ + int nRef; /* Number of pointers to this object */ +}; + +static int fts3EvalNext(Fts3Cursor *pCsr); +static int fts3EvalStart(Fts3Cursor *pCsr); +static int fts3TermSegReaderCursor( + Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **); + +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts3 code are activated - conditions that are +** only true if it is guaranteed that the fts3 database is not corrupt. +*/ +#ifdef SQLITE_DEBUG +SQLITE_API int sqlite3_fts3_may_be_corrupt = 1; +#endif + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. +** The number of bytes written is returned. +*/ +SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ + unsigned char *q = (unsigned char *) p; + sqlite_uint64 vu = v; + do{ + *q++ = (unsigned char) ((vu & 0x7f) | 0x80); + vu >>= 7; + }while( vu!=0 ); + q[-1] &= 0x7f; /* turn off high bit in final byte */ + assert( q - (unsigned char *)p <= FTS3_VARINT_MAX ); + return (int) (q - (unsigned char *)p); +} + +#define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ + v = (v & mask1) | ( (*(const unsigned char*)(ptr++)) << shift ); \ + if( (v & mask2)==0 ){ var = v; return ret; } +#define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ + v = (*ptr++); \ + if( (v & mask2)==0 ){ var = v; return ret; } + +SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *pBuf, sqlite_uint64 *v){ + const unsigned char *p = (const unsigned char*)pBuf; + const unsigned char *pStart = p; + u32 a; + u64 b; + int shift; + + GETVARINT_INIT(a, p, 0, 0x00, 0x80, *v, 1); + GETVARINT_STEP(a, p, 7, 0x7F, 0x4000, *v, 2); + GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *v, 3); + GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *v, 4); + b = (a & 0x0FFFFFFF ); + + for(shift=28; shift<=63; shift+=7){ + u64 c = *p++; + b += (c&0x7F) << shift; + if( (c & 0x80)==0 ) break; + } + *v = b; + return (int)(p - pStart); +} + +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ + return sqlite3Fts3GetVarintU(pBuf, (sqlite3_uint64*)v); +} + +/* +** Read a 64-bit variable-length integer from memory starting at p[0] and +** not extending past pEnd[-1]. +** Return the number of bytes read, or 0 on error. +** The value is stored in *v. +*/ +SQLITE_PRIVATE int sqlite3Fts3GetVarintBounded( + const char *pBuf, + const char *pEnd, + sqlite_int64 *v +){ + const unsigned char *p = (const unsigned char*)pBuf; + const unsigned char *pStart = p; + const unsigned char *pX = (const unsigned char*)pEnd; + u64 b = 0; + int shift; + for(shift=0; shift<=63; shift+=7){ + u64 c = p=0 ); + return 5; +} + +/* +** Return the number of bytes required to encode v as a varint +*/ +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){ + int i = 0; + do{ + i++; + v >>= 7; + }while( v!=0 ); + return i; +} + +/* +** Convert an SQL-style quoted string into a normal string by removing +** the quote characters. The conversion is done in-place. If the +** input does not begin with a quote character, then this routine +** is a no-op. +** +** Examples: +** +** "abc" becomes abc +** 'xyz' becomes xyz +** [pqr] becomes pqr +** `mno` becomes mno +** +*/ +SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ + char quote; /* Quote character (if any ) */ + + quote = z[0]; + if( quote=='[' || quote=='\'' || quote=='"' || quote=='`' ){ + int iIn = 1; /* Index of next byte to read from input */ + int iOut = 0; /* Index of next byte to write to output */ + + /* If the first byte was a '[', then the close-quote character is a ']' */ + if( quote=='[' ) quote = ']'; + + while( z[iIn] ){ + if( z[iIn]==quote ){ + if( z[iIn+1]!=quote ) break; + z[iOut++] = quote; + iIn += 2; + }else{ + z[iOut++] = z[iIn++]; + } + } + z[iOut] = '\0'; + } +} + +/* +** Read a single varint from the doclist at *pp and advance *pp to point +** to the first byte past the end of the varint. Add the value of the varint +** to *pVal. +*/ +static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){ + sqlite3_int64 iVal; + *pp += sqlite3Fts3GetVarint(*pp, &iVal); + *pVal += iVal; +} + +/* +** When this function is called, *pp points to the first byte following a +** varint that is part of a doclist (or position-list, or any other list +** of varints). This function moves *pp to point to the start of that varint, +** and sets *pVal by the varint value. +** +** Argument pStart points to the first byte of the doclist that the +** varint is part of. +*/ +static void fts3GetReverseVarint( + char **pp, + char *pStart, + sqlite3_int64 *pVal +){ + sqlite3_int64 iVal; + char *p; + + /* Pointer p now points at the first byte past the varint we are + ** interested in. So, unless the doclist is corrupt, the 0x80 bit is + ** clear on character p[-1]. */ + for(p = (*pp)-2; p>=pStart && *p&0x80; p--); + p++; + *pp = p; + + sqlite3Fts3GetVarint(p, &iVal); + *pVal = iVal; +} + +/* +** The xDisconnect() virtual table method. +*/ +static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int i; + + assert( p->nPendingData==0 ); + assert( p->pSegments==0 ); + + /* Free any prepared statements held */ + sqlite3_finalize(p->pSeekStmt); + for(i=0; iaStmt); i++){ + sqlite3_finalize(p->aStmt[i]); + } + sqlite3_free(p->zSegmentsTbl); + sqlite3_free(p->zReadExprlist); + sqlite3_free(p->zWriteExprlist); + sqlite3_free(p->zContentTbl); + sqlite3_free(p->zLanguageid); + + /* Invoke the tokenizer destructor to free the tokenizer. */ + p->pTokenizer->pModule->xDestroy(p->pTokenizer); + + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Write an error message into *pzErr +*/ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char **pzErr, const char *zFormat, ...){ + va_list ap; + sqlite3_free(*pzErr); + va_start(ap, zFormat); + *pzErr = sqlite3_vmprintf(zFormat, ap); + va_end(ap); +} + +/* +** Construct one or more SQL statements from the format string given +** and then evaluate those statements. The success code is written +** into *pRc. +** +** If *pRc is initially non-zero then this routine is a no-op. +*/ +static void fts3DbExec( + int *pRc, /* Success code */ + sqlite3 *db, /* Database in which to run SQL */ + const char *zFormat, /* Format string for SQL */ + ... /* Arguments to the format string */ +){ + va_list ap; + char *zSql; + if( *pRc ) return; + va_start(ap, zFormat); + zSql = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + if( zSql==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + *pRc = sqlite3_exec(db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } +} + +/* +** The xDestroy() virtual table method. +*/ +static int fts3DestroyMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_OK; /* Return code */ + const char *zDb = p->zDb; /* Name of database (e.g. "main", "temp") */ + sqlite3 *db = p->db; /* Database handle */ + + /* Drop the shadow tables */ + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); + + /* If everything has worked, invoke fts3DisconnectMethod() to free the + ** memory associated with the Fts3Table structure and return SQLITE_OK. + ** Otherwise, return an SQLite error code. + */ + return (rc==SQLITE_OK ? fts3DisconnectMethod(pVtab) : rc); +} + + +/* +** Invoke sqlite3_declare_vtab() to declare the schema for the FTS3 table +** passed as the first argument. This is done as part of the xConnect() +** and xCreate() methods. +** +** If *pRc is non-zero when this function is called, it is a no-op. +** Otherwise, if an error occurs, an SQLite error code is stored in *pRc +** before returning. +*/ +static void fts3DeclareVtab(int *pRc, Fts3Table *p){ + if( *pRc==SQLITE_OK ){ + int i; /* Iterator variable */ + int rc; /* Return code */ + char *zSql; /* SQL statement passed to declare_vtab() */ + char *zCols; /* List of user defined columns */ + const char *zLanguageid; + + zLanguageid = (p->zLanguageid ? p->zLanguageid : "__langid"); + sqlite3_vtab_config(p->db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Create a list of user columns for the virtual table */ + zCols = sqlite3_mprintf("%Q, ", p->azColumn[0]); + for(i=1; zCols && inColumn; i++){ + zCols = sqlite3_mprintf("%z%Q, ", zCols, p->azColumn[i]); + } + + /* Create the whole "CREATE TABLE" statement to pass to SQLite */ + zSql = sqlite3_mprintf( + "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)", + zCols, p->zName, zLanguageid + ); + if( !zCols || !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_declare_vtab(p->db, zSql); + } + + sqlite3_free(zSql); + sqlite3_free(zCols); + *pRc = rc; + } +} + +/* +** Create the %_stat table if it does not already exist. +*/ +SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){ + fts3DbExec(pRc, p->db, + "CREATE TABLE IF NOT EXISTS %Q.'%q_stat'" + "(id INTEGER PRIMARY KEY, value BLOB);", + p->zDb, p->zName + ); + if( (*pRc)==SQLITE_OK ) p->bHasStat = 1; +} + +/* +** Create the backing store tables (%_content, %_segments and %_segdir) +** required by the FTS3 table passed as the only argument. This is done +** as part of the vtab xCreate() method. +** +** If the p->bHasDocsize boolean is true (indicating that this is an +** FTS4 table, not an FTS3 table) then also create the %_docsize and +** %_stat tables required by FTS4. +*/ +static int fts3CreateTables(Fts3Table *p){ + int rc = SQLITE_OK; /* Return code */ + int i; /* Iterator variable */ + sqlite3 *db = p->db; /* The database connection */ + + if( p->zContentTbl==0 ){ + const char *zLanguageid = p->zLanguageid; + char *zContentCols; /* Columns of %_content table */ + + /* Create a list of user columns for the content table */ + zContentCols = sqlite3_mprintf("docid INTEGER PRIMARY KEY"); + for(i=0; zContentCols && inColumn; i++){ + char *z = p->azColumn[i]; + zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i, z); + } + if( zLanguageid && zContentCols ){ + zContentCols = sqlite3_mprintf("%z, langid", zContentCols, zLanguageid); + } + if( zContentCols==0 ) rc = SQLITE_NOMEM; + + /* Create the content table */ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_content'(%s)", + p->zDb, p->zName, zContentCols + ); + sqlite3_free(zContentCols); + } + + /* Create other tables */ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB);", + p->zDb, p->zName + ); + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_segdir'(" + "level INTEGER," + "idx INTEGER," + "start_block INTEGER," + "leaves_end_block INTEGER," + "end_block INTEGER," + "root BLOB," + "PRIMARY KEY(level, idx)" + ");", + p->zDb, p->zName + ); + if( p->bHasDocsize ){ + fts3DbExec(&rc, db, + "CREATE TABLE %Q.'%q_docsize'(docid INTEGER PRIMARY KEY, size BLOB);", + p->zDb, p->zName + ); + } + assert( p->bHasStat==p->bFts4 ); + if( p->bHasStat ){ + sqlite3Fts3CreateStatTable(&rc, p); + } + return rc; +} + +/* +** Store the current database page-size in bytes in p->nPgsz. +** +** If *pRc is non-zero when this function is called, it is a no-op. +** Otherwise, if an error occurs, an SQLite error code is stored in *pRc +** before returning. +*/ +static void fts3DatabasePageSize(int *pRc, Fts3Table *p){ + if( *pRc==SQLITE_OK ){ + int rc; /* Return code */ + char *zSql; /* SQL text "PRAGMA %Q.page_size" */ + sqlite3_stmt *pStmt; /* Compiled "PRAGMA %Q.page_size" statement */ + + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", p->zDb); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_step(pStmt); + p->nPgsz = sqlite3_column_int(pStmt, 0); + rc = sqlite3_finalize(pStmt); + }else if( rc==SQLITE_AUTH ){ + p->nPgsz = 1024; + rc = SQLITE_OK; + } + } + assert( p->nPgsz>0 || rc!=SQLITE_OK ); + sqlite3_free(zSql); + *pRc = rc; + } +} + +/* +** "Special" FTS4 arguments are column specifications of the following form: +** +** = +** +** There may not be whitespace surrounding the "=" character. The +** term may be quoted, but the may not. +*/ +static int fts3IsSpecialColumn( + const char *z, + int *pnKey, + char **pzValue +){ + char *zValue; + const char *zCsr = z; + + while( *zCsr!='=' ){ + if( *zCsr=='\0' ) return 0; + zCsr++; + } + + *pnKey = (int)(zCsr-z); + zValue = sqlite3_mprintf("%s", &zCsr[1]); + if( zValue ){ + sqlite3Fts3Dequote(zValue); + } + *pzValue = zValue; + return 1; +} + +/* +** Append the output of a printf() style formatting to an existing string. +*/ +static void fts3Appendf( + int *pRc, /* IN/OUT: Error code */ + char **pz, /* IN/OUT: Pointer to string buffer */ + const char *zFormat, /* Printf format string to append */ + ... /* Arguments for printf format string */ +){ + if( *pRc==SQLITE_OK ){ + va_list ap; + char *z; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + if( z && *pz ){ + char *z2 = sqlite3_mprintf("%s%s", *pz, z); + sqlite3_free(z); + z = z2; + } + if( z==0 ) *pRc = SQLITE_NOMEM; + sqlite3_free(*pz); + *pz = z; + } +} + +/* +** Return a copy of input string zInput enclosed in double-quotes (") and +** with all double quote characters escaped. For example: +** +** fts3QuoteId("un \"zip\"") -> "un \"\"zip\"\"" +** +** The pointer returned points to memory obtained from sqlite3_malloc(). It +** is the callers responsibility to call sqlite3_free() to release this +** memory. +*/ +static char *fts3QuoteId(char const *zInput){ + sqlite3_int64 nRet; + char *zRet; + nRet = 2 + (int)strlen(zInput)*2 + 1; + zRet = sqlite3_malloc64(nRet); + if( zRet ){ + int i; + char *z = zRet; + *(z++) = '"'; + for(i=0; zInput[i]; i++){ + if( zInput[i]=='"' ) *(z++) = '"'; + *(z++) = zInput[i]; + } + *(z++) = '"'; + *(z++) = '\0'; + } + return zRet; +} + +/* +** Return a list of comma separated SQL expressions and a FROM clause that +** could be used in a SELECT statement such as the following: +** +** SELECT FROM %_content AS x ... +** +** to return the docid, followed by each column of text data in order +** from left to write. If parameter zFunc is not NULL, then instead of +** being returned directly each column of text data is passed to an SQL +** function named zFunc first. For example, if zFunc is "unzip" and the +** table has the three user-defined columns "a", "b", and "c", the following +** string is returned: +** +** "docid, unzip(x.'a'), unzip(x.'b'), unzip(x.'c') FROM %_content AS x" +** +** The pointer returned points to a buffer allocated by sqlite3_malloc(). It +** is the responsibility of the caller to eventually free it. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and +** a NULL pointer is returned). Otherwise, if an OOM error is encountered +** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If +** no error occurs, *pRc is left unmodified. +*/ +static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){ + char *zRet = 0; + char *zFree = 0; + char *zFunction; + int i; + + if( p->zContentTbl==0 ){ + if( !zFunc ){ + zFunction = ""; + }else{ + zFree = zFunction = fts3QuoteId(zFunc); + } + fts3Appendf(pRc, &zRet, "docid"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ",%s(x.'c%d%q')", zFunction, i, p->azColumn[i]); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", x.%Q", "langid"); + } + sqlite3_free(zFree); + }else{ + fts3Appendf(pRc, &zRet, "rowid"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ", x.'%q'", p->azColumn[i]); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", x.%Q", p->zLanguageid); + } + } + fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", + p->zDb, + (p->zContentTbl ? p->zContentTbl : p->zName), + (p->zContentTbl ? "" : "_content") + ); + return zRet; +} + +/* +** Return a list of N comma separated question marks, where N is the number +** of columns in the %_content table (one for the docid plus one for each +** user-defined text column). +** +** If argument zFunc is not NULL, then all but the first question mark +** is preceded by zFunc and an open bracket, and followed by a closed +** bracket. For example, if zFunc is "zip" and the FTS3 table has three +** user-defined text columns, the following string is returned: +** +** "?, zip(?), zip(?), zip(?)" +** +** The pointer returned points to a buffer allocated by sqlite3_malloc(). It +** is the responsibility of the caller to eventually free it. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and +** a NULL pointer is returned). Otherwise, if an OOM error is encountered +** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If +** no error occurs, *pRc is left unmodified. +*/ +static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ + char *zRet = 0; + char *zFree = 0; + char *zFunction; + int i; + + if( !zFunc ){ + zFunction = ""; + }else{ + zFree = zFunction = fts3QuoteId(zFunc); + } + fts3Appendf(pRc, &zRet, "?"); + for(i=0; inColumn; i++){ + fts3Appendf(pRc, &zRet, ",%s(?)", zFunction); + } + if( p->zLanguageid ){ + fts3Appendf(pRc, &zRet, ", ?"); + } + sqlite3_free(zFree); + return zRet; +} + +/* +** Buffer z contains a positive integer value encoded as utf-8 text. +** Decode this value and store it in *pnOut, returning the number of bytes +** consumed. If an overflow error occurs return a negative value. +*/ +SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut){ + u64 iVal = 0; + int i; + for(i=0; z[i]>='0' && z[i]<='9'; i++){ + iVal = iVal*10 + (z[i] - '0'); + if( iVal>0x7FFFFFFF ) return -1; + } + *pnOut = (int)iVal; + return i; +} + +/* +** This function interprets the string at (*pp) as a non-negative integer +** value. It reads the integer and sets *pnOut to the value read, then +** sets *pp to point to the byte immediately following the last byte of +** the integer value. +** +** Only decimal digits ('0'..'9') may be part of an integer value. +** +** If *pp does not being with a decimal digit SQLITE_ERROR is returned and +** the output value undefined. Otherwise SQLITE_OK is returned. +** +** This function is used when parsing the "prefix=" FTS4 parameter. +*/ +static int fts3GobbleInt(const char **pp, int *pnOut){ + const int MAX_NPREFIX = 10000000; + int nInt = 0; /* Output value */ + int nByte; + nByte = sqlite3Fts3ReadInt(*pp, &nInt); + if( nInt>MAX_NPREFIX ){ + nInt = 0; + } + if( nByte==0 ){ + return SQLITE_ERROR; + } + *pnOut = nInt; + *pp += nByte; + return SQLITE_OK; +} + +/* +** This function is called to allocate an array of Fts3Index structures +** representing the indexes maintained by the current FTS table. FTS tables +** always maintain the main "terms" index, but may also maintain one or +** more "prefix" indexes, depending on the value of the "prefix=" parameter +** (if any) specified as part of the CREATE VIRTUAL TABLE statement. +** +** Argument zParam is passed the value of the "prefix=" option if one was +** specified, or NULL otherwise. +** +** If no error occurs, SQLITE_OK is returned and *apIndex set to point to +** the allocated array. *pnIndex is set to the number of elements in the +** array. If an error does occur, an SQLite error code is returned. +** +** Regardless of whether or not an error is returned, it is the responsibility +** of the caller to call sqlite3_free() on the output array to free it. +*/ +static int fts3PrefixParameter( + const char *zParam, /* ABC in prefix=ABC parameter to parse */ + int *pnIndex, /* OUT: size of *apIndex[] array */ + struct Fts3Index **apIndex /* OUT: Array of indexes for this table */ +){ + struct Fts3Index *aIndex; /* Allocated array */ + int nIndex = 1; /* Number of entries in array */ + + if( zParam && zParam[0] ){ + const char *p; + nIndex++; + for(p=zParam; *p; p++){ + if( *p==',' ) nIndex++; + } + } + + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); + *apIndex = aIndex; + if( !aIndex ){ + return SQLITE_NOMEM; + } + + memset(aIndex, 0, sizeof(struct Fts3Index) * nIndex); + if( zParam ){ + const char *p = zParam; + int i; + for(i=1; i=0 ); + if( nPrefix==0 ){ + nIndex--; + i--; + }else{ + aIndex[i].nPrefix = nPrefix; + } + p++; + } + } + + *pnIndex = nIndex; + return SQLITE_OK; +} + +/* +** This function is called when initializing an FTS4 table that uses the +** content=xxx option. It determines the number of and names of the columns +** of the new FTS4 table. +** +** The third argument passed to this function is the value passed to the +** config=xxx option (i.e. "xxx"). This function queries the database for +** a table of that name. If found, the output variables are populated +** as follows: +** +** *pnCol: Set to the number of columns table xxx has, +** +** *pnStr: Set to the total amount of space required to store a copy +** of each columns name, including the nul-terminator. +** +** *pazCol: Set to point to an array of *pnCol strings. Each string is +** the name of the corresponding column in table xxx. The array +** and its contents are allocated using a single allocation. It +** is the responsibility of the caller to free this allocation +** by eventually passing the *pazCol value to sqlite3_free(). +** +** If the table cannot be found, an error code is returned and the output +** variables are undefined. Or, if an OOM is encountered, SQLITE_NOMEM is +** returned (and the output variables are undefined). +*/ +static int fts3ContentColumns( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (i.e. "main", "temp" etc.) */ + const char *zTbl, /* Name of content table */ + const char ***pazCol, /* OUT: Malloc'd array of column names */ + int *pnCol, /* OUT: Size of array *pazCol */ + int *pnStr, /* OUT: Bytes of string content */ + char **pzErr /* OUT: error message */ +){ + int rc = SQLITE_OK; /* Return code */ + char *zSql; /* "SELECT *" statement on zTbl */ + sqlite3_stmt *pStmt = 0; /* Compiled version of zSql */ + + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", zDb, zTbl); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ErrMsg(pzErr, "%s", sqlite3_errmsg(db)); + } + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + const char **azCol; /* Output array */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ + int nCol; /* Number of table columns */ + int i; /* Used to iterate through columns */ + + /* Loop through the returned columns. Set nStr to the number of bytes of + ** space required to store a copy of each column name, including the + ** nul-terminator byte. */ + nCol = sqlite3_column_count(pStmt); + for(i=0; i module name ("fts3" or "fts4") +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> "column name" and other module argument fields. +*/ +static int fts3InitVtab( + int isCreate, /* True for xCreate, false for xConnect */ + sqlite3 *db, /* The SQLite database connection */ + void *pAux, /* Hash table containing tokenizers */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ + char **pzErr /* Write any error message here */ +){ + Fts3Hash *pHash = &((Fts3HashWrapper*)pAux)->hash; + Fts3Table *p = 0; /* Pointer to allocated vtab */ + int rc = SQLITE_OK; /* Return code */ + int i; /* Iterator variable */ + sqlite3_int64 nByte; /* Size of allocation used for *p */ + int iCol; /* Column index */ + int nString = 0; /* Bytes required to hold all column names */ + int nCol = 0; /* Number of columns in the FTS table */ + char *zCsr; /* Space for holding column names */ + int nDb; /* Bytes required to hold database name */ + int nName; /* Bytes required to hold table name */ + int isFts4 = (argv[0][3]=='4'); /* True for FTS4, false for FTS3 */ + const char **aCol; /* Array of column names */ + sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */ + + int nIndex = 0; /* Size of aIndex[] array */ + struct Fts3Index *aIndex = 0; /* Array of indexes for this table */ + + /* The results of parsing supported FTS4 key=value options: */ + int bNoDocsize = 0; /* True to omit %_docsize table */ + int bDescIdx = 0; /* True to store descending indexes */ + char *zPrefix = 0; /* Prefix parameter value (or NULL) */ + char *zCompress = 0; /* compress=? parameter (or NULL) */ + char *zUncompress = 0; /* uncompress=? parameter (or NULL) */ + char *zContent = 0; /* content=? parameter (or NULL) */ + char *zLanguageid = 0; /* languageid=? parameter (or NULL) */ + char **azNotindexed = 0; /* The set of notindexed= columns */ + int nNotindexed = 0; /* Size of azNotindexed[] array */ + + assert( strlen(argv[0])==4 ); + assert( (sqlite3_strnicmp(argv[0], "fts4", 4)==0 && isFts4) + || (sqlite3_strnicmp(argv[0], "fts3", 4)==0 && !isFts4) + ); + + nDb = (int)strlen(argv[1]) + 1; + nName = (int)strlen(argv[2]) + 1; + + nByte = sizeof(const char *) * (argc-2); + aCol = (const char **)sqlite3_malloc64(nByte); + if( aCol ){ + memset((void*)aCol, 0, nByte); + azNotindexed = (char **)sqlite3_malloc64(nByte); + } + if( azNotindexed ){ + memset(azNotindexed, 0, nByte); + } + if( !aCol || !azNotindexed ){ + rc = SQLITE_NOMEM; + goto fts3_init_out; + } + + /* Loop through all of the arguments passed by the user to the FTS3/4 + ** module (i.e. all the column names and special arguments). This loop + ** does the following: + ** + ** + Figures out the number of columns the FTSX table will have, and + ** the number of bytes of space that must be allocated to store copies + ** of the column names. + ** + ** + If there is a tokenizer specification included in the arguments, + ** initializes the tokenizer pTokenizer. + */ + for(i=3; rc==SQLITE_OK && i8 + && 0==sqlite3_strnicmp(z, "tokenize", 8) + && 0==sqlite3Fts3IsIdChar(z[8]) + ){ + rc = sqlite3Fts3InitTokenizer(pHash, &z[9], &pTokenizer, pzErr); + } + + /* Check if it is an FTS4 special argument. */ + else if( isFts4 && fts3IsSpecialColumn(z, &nKey, &zVal) ){ + struct Fts4Option { + const char *zOpt; + int nOpt; + } aFts4Opt[] = { + { "matchinfo", 9 }, /* 0 -> MATCHINFO */ + { "prefix", 6 }, /* 1 -> PREFIX */ + { "compress", 8 }, /* 2 -> COMPRESS */ + { "uncompress", 10 }, /* 3 -> UNCOMPRESS */ + { "order", 5 }, /* 4 -> ORDER */ + { "content", 7 }, /* 5 -> CONTENT */ + { "languageid", 10 }, /* 6 -> LANGUAGEID */ + { "notindexed", 10 } /* 7 -> NOTINDEXED */ + }; + + int iOpt; + if( !zVal ){ + rc = SQLITE_NOMEM; + }else{ + for(iOpt=0; iOptnOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt) ){ + break; + } + } + switch( iOpt ){ + case 0: /* MATCHINFO */ + if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo: %s", zVal); + rc = SQLITE_ERROR; + } + bNoDocsize = 1; + break; + + case 1: /* PREFIX */ + sqlite3_free(zPrefix); + zPrefix = zVal; + zVal = 0; + break; + + case 2: /* COMPRESS */ + sqlite3_free(zCompress); + zCompress = zVal; + zVal = 0; + break; + + case 3: /* UNCOMPRESS */ + sqlite3_free(zUncompress); + zUncompress = zVal; + zVal = 0; + break; + + case 4: /* ORDER */ + if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) + && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) + ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized order: %s", zVal); + rc = SQLITE_ERROR; + } + bDescIdx = (zVal[0]=='d' || zVal[0]=='D'); + break; + + case 5: /* CONTENT */ + sqlite3_free(zContent); + zContent = zVal; + zVal = 0; + break; + + case 6: /* LANGUAGEID */ + assert( iOpt==6 ); + sqlite3_free(zLanguageid); + zLanguageid = zVal; + zVal = 0; + break; + + case 7: /* NOTINDEXED */ + azNotindexed[nNotindexed++] = zVal; + zVal = 0; + break; + + default: + assert( iOpt==SizeofArray(aFts4Opt) ); + sqlite3Fts3ErrMsg(pzErr, "unrecognized parameter: %s", z); + rc = SQLITE_ERROR; + break; + } + sqlite3_free(zVal); + } + } + + /* Otherwise, the argument is a column name. */ + else { + nString += (int)(strlen(z) + 1); + aCol[nCol++] = z; + } + } + + /* If a content=xxx option was specified, the following: + ** + ** 1. Ignore any compress= and uncompress= options. + ** + ** 2. If no column names were specified as part of the CREATE VIRTUAL + ** TABLE statement, use all columns from the content table. + */ + if( rc==SQLITE_OK && zContent ){ + sqlite3_free(zCompress); + sqlite3_free(zUncompress); + zCompress = 0; + zUncompress = 0; + if( nCol==0 ){ + sqlite3_free((void*)aCol); + aCol = 0; + rc = fts3ContentColumns(db, argv[1], zContent,&aCol,&nCol,&nString,pzErr); + + /* If a languageid= option was specified, remove the language id + ** column from the aCol[] array. */ + if( rc==SQLITE_OK && zLanguageid ){ + int j; + for(j=0; jdb = db; + p->nColumn = nCol; + p->nPendingData = 0; + p->azColumn = (char **)&p[1]; + p->pTokenizer = pTokenizer; + p->nMaxPendingData = FTS3_MAX_PENDING_DATA; + p->bHasDocsize = (isFts4 && bNoDocsize==0); + p->bHasStat = (u8)isFts4; + p->bFts4 = (u8)isFts4; + p->bDescIdx = (u8)bDescIdx; + p->nAutoincrmerge = 0xff; /* 0xff means setting unknown */ + p->zContentTbl = zContent; + p->zLanguageid = zLanguageid; + zContent = 0; + zLanguageid = 0; + TESTONLY( p->inTransaction = -1 ); + TESTONLY( p->mxSavepoint = -1 ); + + p->aIndex = (struct Fts3Index *)&p->azColumn[nCol]; + memcpy(p->aIndex, aIndex, sizeof(struct Fts3Index) * nIndex); + p->nIndex = nIndex; + for(i=0; iaIndex[i].hPending, FTS3_HASH_STRING, 1); + } + p->abNotindexed = (u8 *)&p->aIndex[nIndex]; + + /* Fill in the zName and zDb fields of the vtab structure. */ + zCsr = (char *)&p->abNotindexed[nCol]; + p->zName = zCsr; + memcpy(zCsr, argv[2], nName); + zCsr += nName; + p->zDb = zCsr; + memcpy(zCsr, argv[1], nDb); + zCsr += nDb; + + /* Fill in the azColumn array */ + for(iCol=0; iCol0 ){ + memcpy(zCsr, z, n); + } + zCsr[n] = '\0'; + sqlite3Fts3Dequote(zCsr); + p->azColumn[iCol] = zCsr; + zCsr += n+1; + assert( zCsr <= &((char *)p)[nByte] ); + } + + /* Fill in the abNotindexed array */ + for(iCol=0; iColazColumn[iCol]); + for(i=0; iazColumn[iCol], zNot, n) + ){ + p->abNotindexed[iCol] = 1; + sqlite3_free(zNot); + azNotindexed[i] = 0; + } + } + } + for(i=0; izReadExprlist = fts3ReadExprList(p, zUncompress, &rc); + p->zWriteExprlist = fts3WriteExprList(p, zCompress, &rc); + if( rc!=SQLITE_OK ) goto fts3_init_out; + + /* If this is an xCreate call, create the underlying tables in the + ** database. TODO: For xConnect(), it could verify that said tables exist. + */ + if( isCreate ){ + rc = fts3CreateTables(p); + } + + /* Check to see if a legacy fts3 table has been "upgraded" by the + ** addition of a %_stat table so that it can use incremental merge. + */ + if( !isFts4 && !isCreate ){ + p->bHasStat = 2; + } + + /* Figure out the page-size for the database. This is required in order to + ** estimate the cost of loading large doclists from the database. */ + fts3DatabasePageSize(&rc, p); + p->nNodeSize = p->nPgsz-35; + +#if defined(SQLITE_DEBUG)||defined(SQLITE_TEST) + p->nMergeCount = FTS3_MERGE_COUNT; +#endif + + /* Declare the table schema to SQLite. */ + fts3DeclareVtab(&rc, p); + +fts3_init_out: + sqlite3_free(zPrefix); + sqlite3_free(aIndex); + sqlite3_free(zCompress); + sqlite3_free(zUncompress); + sqlite3_free(zContent); + sqlite3_free(zLanguageid); + for(i=0; ipModule->xDestroy(pTokenizer); + } + }else{ + assert( p->pSegments==0 ); + *ppVTab = &p->base; + } + return rc; +} + +/* +** The xConnect() and xCreate() methods for the virtual table. All the +** work is done in function fts3InitVtab(). +*/ +static int fts3ConnectMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts3InitVtab(0, db, pAux, argc, argv, ppVtab, pzErr); +} +static int fts3CreateMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts3InitVtab(1, db, pAux, argc, argv, ppVtab, pzErr); +} + +/* +** Set the pIdxInfo->estimatedRows variable to nRow. Unless this +** extension is currently being used by a version of SQLite too old to +** support estimatedRows. In that case this function is a no-op. +*/ +static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ +#if SQLITE_VERSION_NUMBER>=3008002 + if( sqlite3_libversion_number()>=3008002 ){ + pIdxInfo->estimatedRows = nRow; + } +#endif +} + +/* +** Set the SQLITE_INDEX_SCAN_UNIQUE flag in pIdxInfo->flags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 + if( sqlite3_libversion_number()>=3008012 ){ + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + +/* +** Implementation of the xBestIndex method for FTS3 tables. There +** are three possible strategies, in order of preference: +** +** 1. Direct lookup by rowid or docid. +** 2. Full-text search using a MATCH operator on a non-docid column. +** 3. Linear scan of %_content table. +*/ +static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + Fts3Table *p = (Fts3Table *)pVTab; + int i; /* Iterator variable */ + int iCons = -1; /* Index of constraint to use */ + + int iLangidCons = -1; /* Index of langid=x constraint, if present */ + int iDocidGe = -1; /* Index of docid>=x constraint, if present */ + int iDocidLe = -1; /* Index of docid<=x constraint, if present */ + int iIdx; + + if( p->bLock ){ + return SQLITE_ERROR; + } + + /* By default use a full table scan. This is an expensive option, + ** so search through the constraints to see if a more efficient + ** strategy is possible. + */ + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 5000000; + for(i=0; inConstraint; i++){ + int bDocid; /* True if this constraint is on docid */ + struct sqlite3_index_constraint *pCons = &pInfo->aConstraint[i]; + if( pCons->usable==0 ){ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + /* There exists an unusable MATCH constraint. This means that if + ** the planner does elect to use the results of this call as part + ** of the overall query plan the user will see an "unable to use + ** function MATCH in the requested context" error. To discourage + ** this, return a very high cost here. */ + pInfo->idxNum = FTS3_FULLSCAN_SEARCH; + pInfo->estimatedCost = 1e50; + fts3SetEstimatedRows(pInfo, ((sqlite3_int64)1) << 50); + return SQLITE_OK; + } + continue; + } + + bDocid = (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1); + + /* A direct lookup on the rowid or docid column. Assign a cost of 1.0. */ + if( iCons<0 && pCons->op==SQLITE_INDEX_CONSTRAINT_EQ && bDocid ){ + pInfo->idxNum = FTS3_DOCID_SEARCH; + pInfo->estimatedCost = 1.0; + iCons = i; + } + + /* A MATCH constraint. Use a full-text search. + ** + ** If there is more than one MATCH constraint available, use the first + ** one encountered. If there is both a MATCH constraint and a direct + ** rowid/docid lookup, prefer the MATCH strategy. This is done even + ** though the rowid/docid lookup is faster than a MATCH query, selecting + ** it would lead to an "unable to use function MATCH in the requested + ** context" error. + */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH + && pCons->iColumn>=0 && pCons->iColumn<=p->nColumn + ){ + pInfo->idxNum = FTS3_FULLTEXT_SEARCH + pCons->iColumn; + pInfo->estimatedCost = 2.0; + iCons = i; + } + + /* Equality constraint on the langid column */ + if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ + && pCons->iColumn==p->nColumn + 2 + ){ + iLangidCons = i; + } + + if( bDocid ){ + switch( pCons->op ){ + case SQLITE_INDEX_CONSTRAINT_GE: + case SQLITE_INDEX_CONSTRAINT_GT: + iDocidGe = i; + break; + + case SQLITE_INDEX_CONSTRAINT_LE: + case SQLITE_INDEX_CONSTRAINT_LT: + iDocidLe = i; + break; + } + } + } + + /* If using a docid=? or rowid=? strategy, set the UNIQUE flag. */ + if( pInfo->idxNum==FTS3_DOCID_SEARCH ) fts3SetUniqueFlag(pInfo); + + iIdx = 1; + if( iCons>=0 ){ + pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; + pInfo->aConstraintUsage[iCons].omit = 1; + } + if( iLangidCons>=0 ){ + pInfo->idxNum |= FTS3_HAVE_LANGID; + pInfo->aConstraintUsage[iLangidCons].argvIndex = iIdx++; + } + if( iDocidGe>=0 ){ + pInfo->idxNum |= FTS3_HAVE_DOCID_GE; + pInfo->aConstraintUsage[iDocidGe].argvIndex = iIdx++; + } + if( iDocidLe>=0 ){ + pInfo->idxNum |= FTS3_HAVE_DOCID_LE; + pInfo->aConstraintUsage[iDocidLe].argvIndex = iIdx++; + } + + /* Regardless of the strategy selected, FTS can deliver rows in rowid (or + ** docid) order. Both ascending and descending are possible. + */ + if( pInfo->nOrderBy==1 ){ + struct sqlite3_index_orderby *pOrder = &pInfo->aOrderBy[0]; + if( pOrder->iColumn<0 || pOrder->iColumn==p->nColumn+1 ){ + if( pOrder->desc ){ + pInfo->idxStr = "DESC"; + }else{ + pInfo->idxStr = "ASC"; + } + pInfo->orderByConsumed = 1; + } + } + + assert( p->pSegments==0 ); + return SQLITE_OK; +} + +/* +** Implementation of xOpen method. +*/ +static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + sqlite3_vtab_cursor *pCsr; /* Allocated cursor */ + + UNUSED_PARAMETER(pVTab); + + /* Allocate a buffer large enough for an Fts3Cursor structure. If the + ** allocation succeeds, zero it and return SQLITE_OK. Otherwise, + ** if the allocation fails, return SQLITE_NOMEM. + */ + *ppCsr = pCsr = (sqlite3_vtab_cursor *)sqlite3_malloc(sizeof(Fts3Cursor)); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(Fts3Cursor)); + return SQLITE_OK; +} + +/* +** Finalize the statement handle at pCsr->pStmt. +** +** Or, if that statement handle is one created by fts3CursorSeekStmt(), +** and the Fts3Table.pSeekStmt slot is currently NULL, save the statement +** pointer there instead of finalizing it. +*/ +static void fts3CursorFinalizeStmt(Fts3Cursor *pCsr){ + if( pCsr->bSeekStmt ){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + if( p->pSeekStmt==0 ){ + p->pSeekStmt = pCsr->pStmt; + sqlite3_reset(pCsr->pStmt); + pCsr->pStmt = 0; + } + pCsr->bSeekStmt = 0; + } + sqlite3_finalize(pCsr->pStmt); +} + +/* +** Free all resources currently held by the cursor passed as the only +** argument. +*/ +static void fts3ClearCursor(Fts3Cursor *pCsr){ + fts3CursorFinalizeStmt(pCsr); + sqlite3Fts3FreeDeferredTokens(pCsr); + sqlite3_free(pCsr->aDoclist); + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + sqlite3Fts3ExprFree(pCsr->pExpr); + memset(&(&pCsr->base)[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor)); +} + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + fts3ClearCursor(pCsr); + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** If pCsr->pStmt has not been prepared (i.e. if pCsr->pStmt==0), then +** compose and prepare an SQL statement of the form: +** +** "SELECT FROM %_content WHERE rowid = ?" +** +** (or the equivalent for a content=xxx table) and set pCsr->pStmt to +** it. If an error occurs, return an SQLite error code. +*/ +static int fts3CursorSeekStmt(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; + if( pCsr->pStmt==0 ){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + char *zSql; + if( p->pSeekStmt ){ + pCsr->pStmt = p->pSeekStmt; + p->pSeekStmt = 0; + }else{ + zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); + if( !zSql ) return SQLITE_NOMEM; + p->bLock++; + rc = sqlite3_prepare_v3( + p->db, zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 + ); + p->bLock--; + sqlite3_free(zSql); + } + if( rc==SQLITE_OK ) pCsr->bSeekStmt = 1; + } + return rc; +} + +/* +** Position the pCsr->pStmt statement so that it is on the row +** of the %_content table that contains the last match. Return +** SQLITE_OK on success. +*/ +static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ + int rc = SQLITE_OK; + if( pCsr->isRequireSeek ){ + rc = fts3CursorSeekStmt(pCsr); + if( rc==SQLITE_OK ){ + Fts3Table *pTab = (Fts3Table*)pCsr->base.pVtab; + pTab->bLock++; + sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId); + pCsr->isRequireSeek = 0; + if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){ + pTab->bLock--; + return SQLITE_OK; + }else{ + pTab->bLock--; + rc = sqlite3_reset(pCsr->pStmt); + if( rc==SQLITE_OK && ((Fts3Table *)pCsr->base.pVtab)->zContentTbl==0 ){ + /* If no row was found and no error has occurred, then the %_content + ** table is missing a row that is present in the full-text index. + ** The data structures are corrupt. */ + rc = FTS_CORRUPT_VTAB; + pCsr->isEof = 1; + } + } + } + } + + if( rc!=SQLITE_OK && pContext ){ + sqlite3_result_error_code(pContext, rc); + } + return rc; +} + +/* +** This function is used to process a single interior node when searching +** a b-tree for a term or term prefix. The node data is passed to this +** function via the zNode/nNode parameters. The term to search for is +** passed in zTerm/nTerm. +** +** If piFirst is not NULL, then this function sets *piFirst to the blockid +** of the child node that heads the sub-tree that may contain the term. +** +** If piLast is not NULL, then *piLast is set to the right-most child node +** that heads a sub-tree that may contain a term for which zTerm/nTerm is +** a prefix. +** +** If an OOM error occurs, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK. +*/ +static int fts3ScanInteriorNode( + const char *zTerm, /* Term to select leaves for */ + int nTerm, /* Size of term zTerm in bytes */ + const char *zNode, /* Buffer containing segment interior node */ + int nNode, /* Size of buffer at zNode */ + sqlite3_int64 *piFirst, /* OUT: Selected child node */ + sqlite3_int64 *piLast /* OUT: Selected child node */ +){ + int rc = SQLITE_OK; /* Return code */ + const char *zCsr = zNode; /* Cursor to iterate through node */ + const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ + char *zBuffer = 0; /* Buffer to load terms into */ + i64 nAlloc = 0; /* Size of allocated buffer */ + int isFirstTerm = 1; /* True when processing first term on page */ + u64 iChild; /* Block id of child node to descend to */ + int nBuffer = 0; /* Total term size */ + + /* Skip over the 'height' varint that occurs at the start of every + ** interior node. Then load the blockid of the left-child of the b-tree + ** node into variable iChild. + ** + ** Even if the data structure on disk is corrupted, this (reading two + ** varints from the buffer) does not risk an overread. If zNode is a + ** root node, then the buffer comes from a SELECT statement. SQLite does + ** not make this guarantee explicitly, but in practice there are always + ** either more than 20 bytes of allocated space following the nNode bytes of + ** contents, or two zero bytes. Or, if the node is read from the %_segments + ** table, then there are always 20 bytes of zeroed padding following the + ** nNode bytes of content (see sqlite3Fts3ReadBlock() for details). + */ + zCsr += sqlite3Fts3GetVarintU(zCsr, &iChild); + zCsr += sqlite3Fts3GetVarintU(zCsr, &iChild); + if( zCsr>zEnd ){ + return FTS_CORRUPT_VTAB; + } + + while( zCsrnBuffer ){ + rc = FTS_CORRUPT_VTAB; + goto finish_scan; + } + } + isFirstTerm = 0; + zCsr += fts3GetVarint32(zCsr, &nSuffix); + + assert( nPrefix>=0 && nSuffix>=0 ); + if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ + rc = FTS_CORRUPT_VTAB; + goto finish_scan; + } + if( (i64)nPrefix+nSuffix>nAlloc ){ + char *zNew; + nAlloc = ((i64)nPrefix+nSuffix) * 2; + zNew = (char *)sqlite3_realloc64(zBuffer, nAlloc); + if( !zNew ){ + rc = SQLITE_NOMEM; + goto finish_scan; + } + zBuffer = zNew; + } + assert( zBuffer ); + memcpy(&zBuffer[nPrefix], zCsr, nSuffix); + nBuffer = nPrefix + nSuffix; + zCsr += nSuffix; + + /* Compare the term we are searching for with the term just loaded from + ** the interior node. If the specified term is greater than or equal + ** to the term from the interior node, then all terms on the sub-tree + ** headed by node iChild are smaller than zTerm. No need to search + ** iChild. + ** + ** If the interior node term is larger than the specified term, then + ** the tree headed by iChild may contain the specified term. + */ + cmp = memcmp(zTerm, zBuffer, (nBuffer>nTerm ? nTerm : nBuffer)); + if( piFirst && (cmp<0 || (cmp==0 && nBuffer>nTerm)) ){ + *piFirst = (i64)iChild; + piFirst = 0; + } + + if( piLast && cmp<0 ){ + *piLast = (i64)iChild; + piLast = 0; + } + + iChild++; + }; + + if( piFirst ) *piFirst = (i64)iChild; + if( piLast ) *piLast = (i64)iChild; + + finish_scan: + sqlite3_free(zBuffer); + return rc; +} + + +/* +** The buffer pointed to by argument zNode (size nNode bytes) contains an +** interior node of a b-tree segment. The zTerm buffer (size nTerm bytes) +** contains a term. This function searches the sub-tree headed by the zNode +** node for the range of leaf nodes that may contain the specified term +** or terms for which the specified term is a prefix. +** +** If piLeaf is not NULL, then *piLeaf is set to the blockid of the +** left-most leaf node in the tree that may contain the specified term. +** If piLeaf2 is not NULL, then *piLeaf2 is set to the blockid of the +** right-most leaf node that may contain a term for which the specified +** term is a prefix. +** +** It is possible that the range of returned leaf nodes does not contain +** the specified term or any terms for which it is a prefix. However, if the +** segment does contain any such terms, they are stored within the identified +** range. Because this function only inspects interior segment nodes (and +** never loads leaf nodes into memory), it is not possible to be sure. +** +** If an error occurs, an error code other than SQLITE_OK is returned. +*/ +static int fts3SelectLeaf( + Fts3Table *p, /* Virtual table handle */ + const char *zTerm, /* Term to select leaves for */ + int nTerm, /* Size of term zTerm in bytes */ + const char *zNode, /* Buffer containing segment interior node */ + int nNode, /* Size of buffer at zNode */ + sqlite3_int64 *piLeaf, /* Selected leaf node */ + sqlite3_int64 *piLeaf2 /* Selected leaf node */ +){ + int rc = SQLITE_OK; /* Return code */ + int iHeight; /* Height of this node in tree */ + + assert( piLeaf || piLeaf2 ); + + fts3GetVarint32(zNode, &iHeight); + rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2); + assert_fts3_nc( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) ); + + if( rc==SQLITE_OK && iHeight>1 ){ + char *zBlob = 0; /* Blob read from %_segments table */ + int nBlob = 0; /* Size of zBlob in bytes */ + + if( piLeaf && piLeaf2 && (*piLeaf!=*piLeaf2) ){ + rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob, 0); + if( rc==SQLITE_OK ){ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, 0); + } + sqlite3_free(zBlob); + piLeaf = 0; + zBlob = 0; + } + + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0); + } + if( rc==SQLITE_OK ){ + int iNewHeight = 0; + fts3GetVarint32(zBlob, &iNewHeight); + if( iNewHeight>=iHeight ){ + rc = FTS_CORRUPT_VTAB; + }else{ + rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2); + } + } + sqlite3_free(zBlob); + } + + return rc; +} + +/* +** This function is used to create delta-encoded serialized lists of FTS3 +** varints. Each call to this function appends a single varint to a list. +*/ +static void fts3PutDeltaVarint( + char **pp, /* IN/OUT: Output pointer */ + sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */ + sqlite3_int64 iVal /* Write this value to the list */ +){ + assert_fts3_nc( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) ); + *pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev); + *piPrev = iVal; +} + +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a position-list. After it returns, *ppPoslist points to the +** first byte after the position-list. +** +** A position list is list of positions (delta encoded) and columns for +** a single document record of a doclist. So, in other words, this +** routine advances *ppPoslist so that it points to the next docid in +** the doclist, or to the first byte past the end of the doclist. +** +** If pp is not NULL, then the contents of the position list are copied +** to *pp. *pp is set to point to the first byte past the last byte copied +** before this function returns. +*/ +static void fts3PoslistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* The end of a position list is marked by a zero encoded as an FTS3 + ** varint. A single POS_END (0) byte. Except, if the 0 byte is preceded by + ** a byte with the 0x80 bit set, then it is not a varint 0, but the tail + ** of some other, multi-byte, value. + ** + ** The following while-loop moves pEnd to point to the first byte that is not + ** immediately preceded by a byte with the 0x80 bit set. Then increments + ** pEnd once more so that it points to the byte immediately following the + ** last byte in the position-list. + */ + while( *pEnd | c ){ + c = *pEnd++ & 0x80; + testcase( c!=0 && (*pEnd)==0 ); + } + pEnd++; /* Advance past the POS_END terminator byte */ + + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; +} + +/* +** When this function is called, *ppPoslist is assumed to point to the +** start of a column-list. After it returns, *ppPoslist points to the +** to the terminator (POS_COLUMN or POS_END) byte of the column-list. +** +** A column-list is list of delta-encoded positions for a single column +** within a single document within a doclist. +** +** The column-list is terminated either by a POS_COLUMN varint (1) or +** a POS_END varint (0). This routine leaves *ppPoslist pointing to +** the POS_COLUMN or POS_END that terminates the column-list. +** +** If pp is not NULL, then the contents of the column-list are copied +** to *pp. *pp is set to point to the first byte past the last byte copied +** before this function returns. The POS_COLUMN or POS_END terminator +** is not copied into *pp. +*/ +static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ + char *pEnd = *ppPoslist; + char c = 0; + + /* A column-list is terminated by either a 0x01 or 0x00 byte that is + ** not part of a multi-byte varint. + */ + while( 0xFE & (*pEnd | c) ){ + c = *pEnd++ & 0x80; + testcase( c!=0 && ((*pEnd)&0xfe)==0 ); + } + if( pp ){ + int n = (int)(pEnd - *ppPoslist); + char *p = *pp; + memcpy(p, *ppPoslist, n); + p += n; + *pp = p; + } + *ppPoslist = pEnd; +} + +/* +** Value used to signify the end of an position-list. This must be +** as large or larger than any value that might appear on the +** position-list, even a position list that has been corrupted. +*/ +#define POSITION_LIST_END LARGEST_INT64 + +/* +** This function is used to help parse position-lists. When this function is +** called, *pp may point to the start of the next varint in the position-list +** being parsed, or it may point to 1 byte past the end of the position-list +** (in which case **pp will be a terminator bytes POS_END (0) or +** (1)). +** +** If *pp points past the end of the current position-list, set *pi to +** POSITION_LIST_END and return. Otherwise, read the next varint from *pp, +** increment the current value of *pi by the value read, and set *pp to +** point to the next value before returning. +** +** Before calling this routine *pi must be initialized to the value of +** the previous position, or zero if we are reading the first position +** in the position-list. Because positions are delta-encoded, the value +** of the previous position is needed in order to compute the value of +** the next position. +*/ +static void fts3ReadNextPos( + char **pp, /* IN/OUT: Pointer into position-list buffer */ + sqlite3_int64 *pi /* IN/OUT: Value read from position-list */ +){ + if( (**pp)&0xFE ){ + int iVal; + *pp += fts3GetVarint32((*pp), &iVal); + *pi += iVal; + *pi -= 2; + }else{ + *pi = POSITION_LIST_END; + } +} + +/* +** If parameter iCol is not 0, write an POS_COLUMN (1) byte followed by +** the value of iCol encoded as a varint to *pp. This will start a new +** column list. +** +** Set *pp to point to the byte just after the last byte written before +** returning (do not modify it if iCol==0). Return the total number of bytes +** written (0 if iCol==0). +*/ +static int fts3PutColNumber(char **pp, int iCol){ + int n = 0; /* Number of bytes written */ + if( iCol ){ + char *p = *pp; /* Output pointer */ + n = 1 + sqlite3Fts3PutVarint(&p[1], iCol); + *p = 0x01; + *pp = &p[n]; + } + return n; +} + +/* +** Compute the union of two position lists. The output written +** into *pp contains all positions of both *pp1 and *pp2 in sorted +** order and with any duplicates removed. All pointers are +** updated appropriately. The caller is responsible for insuring +** that there is enough space in *pp to hold the complete output. +*/ +static int fts3PoslistMerge( + char **pp, /* Output buffer */ + char **pp1, /* Left input list */ + char **pp2 /* Right input list */ +){ + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + + while( *p1 || *p2 ){ + int iCol1; /* The current column index in pp1 */ + int iCol2; /* The current column index in pp2 */ + + if( *p1==POS_COLUMN ){ + fts3GetVarint32(&p1[1], &iCol1); + if( iCol1==0 ) return FTS_CORRUPT_VTAB; + } + else if( *p1==POS_END ) iCol1 = 0x7fffffff; + else iCol1 = 0; + + if( *p2==POS_COLUMN ){ + fts3GetVarint32(&p2[1], &iCol2); + if( iCol2==0 ) return FTS_CORRUPT_VTAB; + } + else if( *p2==POS_END ) iCol2 = 0x7fffffff; + else iCol2 = 0; + + if( iCol1==iCol2 ){ + sqlite3_int64 i1 = 0; /* Last position from pp1 */ + sqlite3_int64 i2 = 0; /* Last position from pp2 */ + sqlite3_int64 iPrev = 0; + int n = fts3PutColNumber(&p, iCol1); + p1 += n; + p2 += n; + + /* At this point, both p1 and p2 point to the start of column-lists + ** for the same column (the column with index iCol1 and iCol2). + ** A column-list is a list of non-negative delta-encoded varints, each + ** incremented by 2 before being stored. Each list is terminated by a + ** POS_END (0) or POS_COLUMN (1). The following block merges the two lists + ** and writes the results to buffer p. p is left pointing to the byte + ** after the list written. No terminator (POS_END or POS_COLUMN) is + ** written to the output. + */ + fts3GetDeltaVarint(&p1, &i1); + fts3GetDeltaVarint(&p2, &i2); + if( i1<2 || i2<2 ){ + break; + } + do { + fts3PutDeltaVarint(&p, &iPrev, (i1pos(*pp1) && pos(*pp2)-pos(*pp1)<=nToken). i.e. +** when the *pp1 token appears before the *pp2 token, but not more than nToken +** slots before it. +** +** e.g. nToken==1 searches for adjacent positions. +*/ +static int fts3PoslistPhraseMerge( + char **pp, /* IN/OUT: Preallocated output buffer */ + int nToken, /* Maximum difference in token positions */ + int isSaveLeft, /* Save the left position */ + int isExact, /* If *pp1 is exactly nTokens before *pp2 */ + char **pp1, /* IN/OUT: Left input list */ + char **pp2 /* IN/OUT: Right input list */ +){ + char *p = *pp; + char *p1 = *pp1; + char *p2 = *pp2; + int iCol1 = 0; + int iCol2 = 0; + + /* Never set both isSaveLeft and isExact for the same invocation. */ + assert( isSaveLeft==0 || isExact==0 ); + + assert_fts3_nc( p!=0 && *p1!=0 && *p2!=0 ); + if( *p1==POS_COLUMN ){ + p1++; + p1 += fts3GetVarint32(p1, &iCol1); + } + if( *p2==POS_COLUMN ){ + p2++; + p2 += fts3GetVarint32(p2, &iCol2); + } + + while( 1 ){ + if( iCol1==iCol2 ){ + char *pSave = p; + sqlite3_int64 iPrev = 0; + sqlite3_int64 iPos1 = 0; + sqlite3_int64 iPos2 = 0; + + if( iCol1 ){ + *p++ = POS_COLUMN; + p += sqlite3Fts3PutVarint(p, iCol1); + } + + fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; + fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + if( iPos1<0 || iPos2<0 ) break; + + while( 1 ){ + if( iPos2==iPos1+nToken + || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken) + ){ + sqlite3_int64 iSave; + iSave = isSaveLeft ? iPos1 : iPos2; + fts3PutDeltaVarint(&p, &iPrev, iSave+2); iPrev -= 2; + pSave = 0; + assert( p ); + } + if( (!isSaveLeft && iPos2<=(iPos1+nToken)) || iPos2<=iPos1 ){ + if( (*p2&0xFE)==0 ) break; + fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + }else{ + if( (*p1&0xFE)==0 ) break; + fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; + } + } + + if( pSave ){ + assert( pp && p ); + p = pSave; + } + + fts3ColumnlistCopy(0, &p1); + fts3ColumnlistCopy(0, &p2); + assert( (*p1&0xFE)==0 && (*p2&0xFE)==0 ); + if( 0==*p1 || 0==*p2 ) break; + + p1++; + p1 += fts3GetVarint32(p1, &iCol1); + p2++; + p2 += fts3GetVarint32(p2, &iCol2); + } + + /* Advance pointer p1 or p2 (whichever corresponds to the smaller of + ** iCol1 and iCol2) so that it points to either the 0x00 that marks the + ** end of the position list, or the 0x01 that precedes the next + ** column-number in the position list. + */ + else if( iCol1=pEnd ){ + *pp = 0; + }else{ + u64 iVal; + *pp += sqlite3Fts3GetVarintU(*pp, &iVal); + if( bDescIdx ){ + *pVal = (i64)((u64)*pVal - iVal); + }else{ + *pVal = (i64)((u64)*pVal + iVal); + } + } +} + +/* +** This function is used to write a single varint to a buffer. The varint +** is written to *pp. Before returning, *pp is set to point 1 byte past the +** end of the value written. +** +** If *pbFirst is zero when this function is called, the value written to +** the buffer is that of parameter iVal. +** +** If *pbFirst is non-zero when this function is called, then the value +** written is either (iVal-*piPrev) (if bDescIdx is zero) or (*piPrev-iVal) +** (if bDescIdx is non-zero). +** +** Before returning, this function always sets *pbFirst to 1 and *piPrev +** to the value of parameter iVal. +*/ +static void fts3PutDeltaVarint3( + char **pp, /* IN/OUT: Output pointer */ + int bDescIdx, /* True for descending docids */ + sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */ + int *pbFirst, /* IN/OUT: True after first int written */ + sqlite3_int64 iVal /* Write this value to the list */ +){ + sqlite3_uint64 iWrite; + if( bDescIdx==0 || *pbFirst==0 ){ + assert_fts3_nc( *pbFirst==0 || iVal>=*piPrev ); + iWrite = (u64)iVal - (u64)*piPrev; + }else{ + assert_fts3_nc( *piPrev>=iVal ); + iWrite = (u64)*piPrev - (u64)iVal; + } + assert( *pbFirst || *piPrev==0 ); + assert_fts3_nc( *pbFirst==0 || iWrite>0 ); + *pp += sqlite3Fts3PutVarint(*pp, iWrite); + *piPrev = iVal; + *pbFirst = 1; +} + + +/* +** This macro is used by various functions that merge doclists. The two +** arguments are 64-bit docid values. If the value of the stack variable +** bDescDoclist is 0 when this macro is invoked, then it returns (i1-i2). +** Otherwise, (i2-i1). +** +** Using this makes it easier to write code that can merge doclists that are +** sorted in either ascending or descending order. +*/ +/* #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i64)((u64)i1-i2)) */ +#define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1>i2?1:((i1==i2)?0:-1))) + +/* +** This function does an "OR" merge of two doclists (output contains all +** positions contained in either argument doclist). If the docids in the +** input doclists are sorted in ascending order, parameter bDescDoclist +** should be false. If they are sorted in ascending order, it should be +** passed a non-zero value. +** +** If no error occurs, *paOut is set to point at an sqlite3_malloc'd buffer +** containing the output doclist and SQLITE_OK is returned. In this case +** *pnOut is set to the number of bytes in the output doclist. +** +** If an error occurs, an SQLite error code is returned. The output values +** are undefined in this case. +*/ +static int fts3DoclistOrMerge( + int bDescDoclist, /* True if arguments are desc */ + char *a1, int n1, /* First doclist */ + char *a2, int n2, /* Second doclist */ + char **paOut, int *pnOut /* OUT: Malloc'd doclist */ +){ + int rc = SQLITE_OK; + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + char *pEnd1 = &a1[n1]; + char *pEnd2 = &a2[n2]; + char *p1 = a1; + char *p2 = a2; + char *p; + char *aOut; + int bFirstOut = 0; + + *paOut = 0; + *pnOut = 0; + + /* Allocate space for the output. Both the input and output doclists + ** are delta encoded. If they are in ascending order (bDescDoclist==0), + ** then the first docid in each list is simply encoded as a varint. For + ** each subsequent docid, the varint stored is the difference between the + ** current and previous docid (a positive number - since the list is in + ** ascending order). + ** + ** The first docid written to the output is therefore encoded using the + ** same number of bytes as it is in whichever of the input lists it is + ** read from. And each subsequent docid read from the same input list + ** consumes either the same or less bytes as it did in the input (since + ** the difference between it and the previous value in the output must + ** be a positive value less than or equal to the delta value read from + ** the input list). The same argument applies to all but the first docid + ** read from the 'other' list. And to the contents of all position lists + ** that will be copied and merged from the input to the output. + ** + ** However, if the first docid copied to the output is a negative number, + ** then the encoding of the first docid from the 'other' input list may + ** be larger in the output than it was in the input (since the delta value + ** may be a larger positive integer than the actual docid). + ** + ** The space required to store the output is therefore the sum of the + ** sizes of the two inputs, plus enough space for exactly one of the input + ** docids to grow. + ** + ** A symetric argument may be made if the doclists are in descending + ** order. + */ + aOut = sqlite3_malloc64((i64)n1+n2+FTS3_VARINT_MAX-1+FTS3_BUFFER_PADDING); + if( !aOut ) return SQLITE_NOMEM; + + p = aOut; + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); + while( p1 || p2 ){ + sqlite3_int64 iDiff = DOCID_CMP(i1, i2); + + if( p2 && p1 && iDiff==0 ){ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + rc = fts3PoslistMerge(&p, &p1, &p2); + if( rc ) break; + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + }else if( !p2 || (p1 && iDiff<0) ){ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + fts3PoslistCopy(&p, &p1); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + }else{ + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i2); + fts3PoslistCopy(&p, &p2); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + } + + assert( (p-aOut)<=((p1?(p1-a1):n1)+(p2?(p2-a2):n2)+FTS3_VARINT_MAX-1) ); + } + + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + p = aOut = 0; + }else{ + assert( (p-aOut)<=n1+n2+FTS3_VARINT_MAX-1 ); + memset(&aOut[(p-aOut)], 0, FTS3_BUFFER_PADDING); + } + *paOut = aOut; + *pnOut = (int)(p-aOut); + return rc; +} + +/* +** This function does a "phrase" merge of two doclists. In a phrase merge, +** the output contains a copy of each position from the right-hand input +** doclist for which there is a position in the left-hand input doclist +** exactly nDist tokens before it. +** +** If the docids in the input doclists are sorted in ascending order, +** parameter bDescDoclist should be false. If they are sorted in ascending +** order, it should be passed a non-zero value. +** +** The right-hand input doclist is overwritten by this function. +*/ +static int fts3DoclistPhraseMerge( + int bDescDoclist, /* True if arguments are desc */ + int nDist, /* Distance from left to right (1=adjacent) */ + char *aLeft, int nLeft, /* Left doclist */ + char **paRight, int *pnRight /* IN/OUT: Right/output doclist */ +){ + sqlite3_int64 i1 = 0; + sqlite3_int64 i2 = 0; + sqlite3_int64 iPrev = 0; + char *aRight = *paRight; + char *pEnd1 = &aLeft[nLeft]; + char *pEnd2 = &aRight[*pnRight]; + char *p1 = aLeft; + char *p2 = aRight; + char *p; + int bFirstOut = 0; + char *aOut; + + assert( nDist>0 ); + if( bDescDoclist ){ + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); + if( aOut==0 ) return SQLITE_NOMEM; + }else{ + aOut = aRight; + } + p = aOut; + + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); + + while( p1 && p2 ){ + sqlite3_int64 iDiff = DOCID_CMP(i1, i2); + if( iDiff==0 ){ + char *pSave = p; + sqlite3_int64 iPrevSave = iPrev; + int bFirstOutSave = bFirstOut; + + fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); + if( 0==fts3PoslistPhraseMerge(&p, nDist, 0, 1, &p1, &p2) ){ + p = pSave; + iPrev = iPrevSave; + bFirstOut = bFirstOutSave; + } + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + }else if( iDiff<0 ){ + fts3PoslistCopy(0, &p1); + fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); + }else{ + fts3PoslistCopy(0, &p2); + fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); + } + } + + *pnRight = (int)(p - aOut); + if( bDescDoclist ){ + sqlite3_free(aRight); + *paRight = aOut; + } + + return SQLITE_OK; +} + +/* +** Argument pList points to a position list nList bytes in size. This +** function checks to see if the position list contains any entries for +** a token in position 0 (of any column). If so, it writes argument iDelta +** to the output buffer pOut, followed by a position list consisting only +** of the entries from pList at position 0, and terminated by an 0x00 byte. +** The value returned is the number of bytes written to pOut (if any). +*/ +SQLITE_PRIVATE int sqlite3Fts3FirstFilter( + sqlite3_int64 iDelta, /* Varint that may be written to pOut */ + char *pList, /* Position list (no 0x00 term) */ + int nList, /* Size of pList in bytes */ + char *pOut /* Write output here */ +){ + int nOut = 0; + int bWritten = 0; /* True once iDelta has been written */ + char *p = pList; + char *pEnd = &pList[nList]; + + if( *p!=0x01 ){ + if( *p==0x02 ){ + nOut += sqlite3Fts3PutVarint(&pOut[nOut], iDelta); + pOut[nOut++] = 0x02; + bWritten = 1; + } + fts3ColumnlistCopy(0, &p); + } + + while( paaOutput); i++){ + if( pTS->aaOutput[i] ){ + if( !aOut ){ + aOut = pTS->aaOutput[i]; + nOut = pTS->anOutput[i]; + pTS->aaOutput[i] = 0; + }else{ + int nNew; + char *aNew; + + int rc = fts3DoclistOrMerge(p->bDescIdx, + pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew + ); + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + return rc; + } + + sqlite3_free(pTS->aaOutput[i]); + sqlite3_free(aOut); + pTS->aaOutput[i] = 0; + aOut = aNew; + nOut = nNew; + } + } + } + + pTS->aaOutput[0] = aOut; + pTS->anOutput[0] = nOut; + return SQLITE_OK; +} + +/* +** Merge the doclist aDoclist/nDoclist into the TermSelect object passed +** as the first argument. The merge is an "OR" merge (see function +** fts3DoclistOrMerge() for details). +** +** This function is called with the doclist for each term that matches +** a queried prefix. It merges all these doclists into one, the doclist +** for the specified prefix. Since there can be a very large number of +** doclists to merge, the merging is done pair-wise using the TermSelect +** object. +** +** This function returns SQLITE_OK if the merge is successful, or an +** SQLite error code (SQLITE_NOMEM) if an error occurs. +*/ +static int fts3TermSelectMerge( + Fts3Table *p, /* FTS table handle */ + TermSelect *pTS, /* TermSelect object to merge into */ + char *aDoclist, /* Pointer to doclist */ + int nDoclist /* Size of aDoclist in bytes */ +){ + if( pTS->aaOutput[0]==0 ){ + /* If this is the first term selected, copy the doclist to the output + ** buffer using memcpy(). + ** + ** Add FTS3_VARINT_MAX bytes of unused space to the end of the + ** allocation. This is so as to ensure that the buffer is big enough + ** to hold the current doclist AND'd with any other doclist. If the + ** doclists are stored in order=ASC order, this padding would not be + ** required (since the size of [doclistA AND doclistB] is always less + ** than or equal to the size of [doclistA] in that case). But this is + ** not true for order=DESC. For example, a doclist containing (1, -1) + ** may be smaller than (-1), as in the first example the -1 may be stored + ** as a single-byte delta, whereas in the second it must be stored as a + ** FTS3_VARINT_MAX byte varint. + ** + ** Similar padding is added in the fts3DoclistOrMerge() function. + */ + pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); + pTS->anOutput[0] = nDoclist; + if( pTS->aaOutput[0] ){ + memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); + }else{ + return SQLITE_NOMEM; + } + }else{ + char *aMerge = aDoclist; + int nMerge = nDoclist; + int iOut; + + for(iOut=0; iOutaaOutput); iOut++){ + if( pTS->aaOutput[iOut]==0 ){ + assert( iOut>0 ); + pTS->aaOutput[iOut] = aMerge; + pTS->anOutput[iOut] = nMerge; + break; + }else{ + char *aNew; + int nNew; + + int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge, + pTS->aaOutput[iOut], pTS->anOutput[iOut], &aNew, &nNew + ); + if( rc!=SQLITE_OK ){ + if( aMerge!=aDoclist ) sqlite3_free(aMerge); + return rc; + } + + if( aMerge!=aDoclist ) sqlite3_free(aMerge); + sqlite3_free(pTS->aaOutput[iOut]); + pTS->aaOutput[iOut] = 0; + + aMerge = aNew; + nMerge = nNew; + if( (iOut+1)==SizeofArray(pTS->aaOutput) ){ + pTS->aaOutput[iOut] = aMerge; + pTS->anOutput[iOut] = nMerge; + } + } + } + } + return SQLITE_OK; +} + +/* +** Append SegReader object pNew to the end of the pCsr->apSegment[] array. +*/ +static int fts3SegReaderCursorAppend( + Fts3MultiSegReader *pCsr, + Fts3SegReader *pNew +){ + if( (pCsr->nSegment%16)==0 ){ + Fts3SegReader **apNew; + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); + if( !apNew ){ + sqlite3Fts3SegReaderFree(pNew); + return SQLITE_NOMEM; + } + pCsr->apSegment = apNew; + } + pCsr->apSegment[pCsr->nSegment++] = pNew; + return SQLITE_OK; +} + +/* +** Add seg-reader objects to the Fts3MultiSegReader object passed as the +** 8th argument. +** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +static int fts3SegReaderCursor( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index to search (from 0 to p->nIndex-1) */ + int iLevel, /* Level of segments to scan */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isScan, /* True to scan from zTerm to EOF */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + int rc = SQLITE_OK; /* Error code */ + sqlite3_stmt *pStmt = 0; /* Statement to iterate through segments */ + int rc2; /* Result of sqlite3_reset() */ + + /* If iLevel is less than 0 and this is not a scan, include a seg-reader + ** for the pending-terms. If this is a scan, then this call must be being + ** made by an fts4aux module, not an FTS table. In this case calling + ** Fts3SegReaderPending might segfault, as the data structures used by + ** fts4aux are not completely populated. So it's easiest to filter these + ** calls out here. */ + if( iLevel<0 && p->aIndex && p->iPrevLangid==iLangid ){ + Fts3SegReader *pSeg = 0; + rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix||isScan, &pSeg); + if( rc==SQLITE_OK && pSeg ){ + rc = fts3SegReaderCursorAppend(pCsr, pSeg); + } + } + + if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3AllSegdirs(p, iLangid, iIndex, iLevel, &pStmt); + } + + while( rc==SQLITE_OK && SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + Fts3SegReader *pSeg = 0; + + /* Read the values returned by the SELECT into local variables. */ + sqlite3_int64 iStartBlock = sqlite3_column_int64(pStmt, 1); + sqlite3_int64 iLeavesEndBlock = sqlite3_column_int64(pStmt, 2); + sqlite3_int64 iEndBlock = sqlite3_column_int64(pStmt, 3); + int nRoot = sqlite3_column_bytes(pStmt, 4); + char const *zRoot = sqlite3_column_blob(pStmt, 4); + + /* If zTerm is not NULL, and this segment is not stored entirely on its + ** root node, the range of leaves scanned can be reduced. Do this. */ + if( iStartBlock && zTerm && zRoot ){ + sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); + rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); + if( rc!=SQLITE_OK ) goto finished; + if( isPrefix==0 && isScan==0 ) iLeavesEndBlock = iStartBlock; + } + + rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1, + (isPrefix==0 && isScan==0), + iStartBlock, iLeavesEndBlock, + iEndBlock, zRoot, nRoot, &pSeg + ); + if( rc!=SQLITE_OK ) goto finished; + rc = fts3SegReaderCursorAppend(pCsr, pSeg); + } + } + + finished: + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_DONE ) rc = rc2; + + return rc; +} + +/* +** Set up a cursor object for iterating through a full-text index or a +** single level therein. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language-id to search */ + int iIndex, /* Index to search (from 0 to p->nIndex-1) */ + int iLevel, /* Level of segments to scan */ + const char *zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + int isScan, /* True to scan from zTerm to EOF */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + assert( iIndex>=0 && iIndexnIndex ); + assert( iLevel==FTS3_SEGCURSOR_ALL + || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel>=0 + ); + assert( iLevelbase.pVtab; + + if( isPrefix ){ + for(i=1; bFound==0 && inIndex; i++){ + if( p->aIndex[i].nPrefix==nTerm ){ + bFound = 1; + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr + ); + pSegcsr->bLookup = 1; + } + } + + for(i=1; bFound==0 && inIndex; i++){ + if( p->aIndex[i].nPrefix==nTerm+1 ){ + bFound = 1; + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 1, 0, pSegcsr + ); + if( rc==SQLITE_OK ){ + rc = fts3SegReaderCursorAddZero( + p, pCsr->iLangid, zTerm, nTerm, pSegcsr + ); + } + } + } + } + + if( bFound==0 ){ + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, + 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr + ); + pSegcsr->bLookup = !isPrefix; + } + } + + *ppSegcsr = pSegcsr; + return rc; +} + +/* +** Free an Fts3MultiSegReader allocated by fts3TermSegReaderCursor(). +*/ +static void fts3SegReaderCursorFree(Fts3MultiSegReader *pSegcsr){ + sqlite3Fts3SegReaderFinish(pSegcsr); + sqlite3_free(pSegcsr); +} + +/* +** This function retrieves the doclist for the specified term (or term +** prefix) from the database. +*/ +static int fts3TermSelect( + Fts3Table *p, /* Virtual table handle */ + Fts3PhraseToken *pTok, /* Token to query for */ + int iColumn, /* Column to query (or -ve for all columns) */ + int *pnOut, /* OUT: Size of buffer at *ppOut */ + char **ppOut /* OUT: Malloced result buffer */ +){ + int rc; /* Return code */ + Fts3MultiSegReader *pSegcsr; /* Seg-reader cursor for this term */ + TermSelect tsc; /* Object for pair-wise doclist merging */ + Fts3SegFilter filter; /* Segment term filter configuration */ + + pSegcsr = pTok->pSegcsr; + memset(&tsc, 0, sizeof(TermSelect)); + + filter.flags = FTS3_SEGMENT_IGNORE_EMPTY | FTS3_SEGMENT_REQUIRE_POS + | (pTok->isPrefix ? FTS3_SEGMENT_PREFIX : 0) + | (pTok->bFirst ? FTS3_SEGMENT_FIRST : 0) + | (iColumnnColumn ? FTS3_SEGMENT_COLUMN_FILTER : 0); + filter.iCol = iColumn; + filter.zTerm = pTok->z; + filter.nTerm = pTok->n; + + rc = sqlite3Fts3SegReaderStart(p, pSegcsr, &filter); + while( SQLITE_OK==rc + && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr)) + ){ + rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist); + } + + if( rc==SQLITE_OK ){ + rc = fts3TermSelectFinishMerge(p, &tsc); + } + if( rc==SQLITE_OK ){ + *ppOut = tsc.aaOutput[0]; + *pnOut = tsc.anOutput[0]; + }else{ + int i; + for(i=0; ipSegcsr = 0; + return rc; +} + +/* +** This function counts the total number of docids in the doclist stored +** in buffer aList[], size nList bytes. +** +** If the isPoslist argument is true, then it is assumed that the doclist +** contains a position-list following each docid. Otherwise, it is assumed +** that the doclist is simply a list of docids stored as delta encoded +** varints. +*/ +static int fts3DoclistCountDocids(char *aList, int nList){ + int nDoc = 0; /* Return value */ + if( aList ){ + char *aEnd = &aList[nList]; /* Pointer to one byte after EOF */ + char *p = aList; /* Cursor */ + while( peSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){ + Fts3Table *pTab = (Fts3Table*)pCursor->pVtab; + pTab->bLock++; + if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){ + pCsr->isEof = 1; + rc = sqlite3_reset(pCsr->pStmt); + }else{ + pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0); + rc = SQLITE_OK; + } + pTab->bLock--; + }else{ + rc = fts3EvalNext((Fts3Cursor *)pCursor); + } + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + return rc; +} + +/* +** If the numeric type of argument pVal is "integer", then return it +** converted to a 64-bit signed integer. Otherwise, return a copy of +** the second parameter, iDefault. +*/ +static sqlite3_int64 fts3DocidRange(sqlite3_value *pVal, i64 iDefault){ + if( pVal ){ + int eType = sqlite3_value_numeric_type(pVal); + if( eType==SQLITE_INTEGER ){ + return sqlite3_value_int64(pVal); + } + } + return iDefault; +} + +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** If idxNum==FTS3_FULLSCAN_SEARCH then do a full table scan against +** the %_content table. +** +** If idxNum==FTS3_DOCID_SEARCH then do a docid lookup for a single entry +** in the %_content table. +** +** If idxNum>=FTS3_FULLTEXT_SEARCH then use the full text index. The +** column on the left-hand side of the MATCH operator is column +** number idxNum-FTS3_FULLTEXT_SEARCH, 0 indexed. argv[0] is the right-hand +** side of the MATCH operator. +*/ +static int fts3FilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + int rc = SQLITE_OK; + char *zSql; /* SQL statement used to access %_content */ + int eSearch; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + + sqlite3_value *pCons = 0; /* The MATCH or rowid constraint, if any */ + sqlite3_value *pLangid = 0; /* The "langid = ?" constraint, if any */ + sqlite3_value *pDocidGe = 0; /* The "docid >= ?" constraint, if any */ + sqlite3_value *pDocidLe = 0; /* The "docid <= ?" constraint, if any */ + int iIdx; + + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + if( p->bLock ){ + return SQLITE_ERROR; + } + + eSearch = (idxNum & 0x0000FFFF); + assert( eSearch>=0 && eSearch<=(FTS3_FULLTEXT_SEARCH+p->nColumn) ); + assert( p->pSegments==0 ); + + /* Collect arguments into local variables */ + iIdx = 0; + if( eSearch!=FTS3_FULLSCAN_SEARCH ) pCons = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_LANGID ) pLangid = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_DOCID_GE ) pDocidGe = apVal[iIdx++]; + if( idxNum & FTS3_HAVE_DOCID_LE ) pDocidLe = apVal[iIdx++]; + assert( iIdx==nVal ); + + /* In case the cursor has been used before, clear it now. */ + fts3ClearCursor(pCsr); + + /* Set the lower and upper bounds on docids to return */ + pCsr->iMinDocid = fts3DocidRange(pDocidGe, SMALLEST_INT64); + pCsr->iMaxDocid = fts3DocidRange(pDocidLe, LARGEST_INT64); + + if( idxStr ){ + pCsr->bDesc = (idxStr[0]=='D'); + }else{ + pCsr->bDesc = p->bDescIdx; + } + pCsr->eSearch = (i16)eSearch; + + if( eSearch!=FTS3_DOCID_SEARCH && eSearch!=FTS3_FULLSCAN_SEARCH ){ + int iCol = eSearch-FTS3_FULLTEXT_SEARCH; + const char *zQuery = (const char *)sqlite3_value_text(pCons); + + if( zQuery==0 && sqlite3_value_type(pCons)!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } + + pCsr->iLangid = 0; + if( pLangid ) pCsr->iLangid = sqlite3_value_int(pLangid); + + assert( p->base.zErrMsg==0 ); + rc = sqlite3Fts3ExprParse(p->pTokenizer, pCsr->iLangid, + p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr, + &p->base.zErrMsg + ); + if( rc!=SQLITE_OK ){ + return rc; + } + + rc = fts3EvalStart(pCsr); + sqlite3Fts3SegmentsClose(p); + if( rc!=SQLITE_OK ) return rc; + pCsr->pNextId = pCsr->aDoclist; + pCsr->iPrevId = 0; + } + + /* Compile a SELECT statement for this cursor. For a full-table-scan, the + ** statement loops through all rows of the %_content table. For a + ** full-text query or docid lookup, the statement retrieves a single + ** row by docid. + */ + if( eSearch==FTS3_FULLSCAN_SEARCH ){ + if( pDocidGe || pDocidLe ){ + zSql = sqlite3_mprintf( + "SELECT %s WHERE rowid BETWEEN %lld AND %lld ORDER BY rowid %s", + p->zReadExprlist, pCsr->iMinDocid, pCsr->iMaxDocid, + (pCsr->bDesc ? "DESC" : "ASC") + ); + }else{ + zSql = sqlite3_mprintf("SELECT %s ORDER BY rowid %s", + p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC") + ); + } + if( zSql ){ + p->bLock++; + rc = sqlite3_prepare_v3( + p->db,zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 + ); + p->bLock--; + sqlite3_free(zSql); + }else{ + rc = SQLITE_NOMEM; + } + }else if( eSearch==FTS3_DOCID_SEARCH ){ + rc = fts3CursorSeekStmt(pCsr); + if( rc==SQLITE_OK ){ + rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons); + } + } + if( rc!=SQLITE_OK ) return rc; + + return fts3NextMethod(pCursor); +} + +/* +** This is the xEof method of the virtual table. SQLite calls this +** routine to find out if it has reached the end of a result set. +*/ +static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Cursor *pCsr = (Fts3Cursor*)pCursor; + if( pCsr->isEof ){ + fts3ClearCursor(pCsr); + pCsr->isEof = 1; + } + return pCsr->isEof; +} + +/* +** This is the xRowid method. The SQLite core calls this routine to +** retrieve the rowid for the current row of the result set. fts3 +** exposes %_content.docid as the rowid for the virtual table. The +** rowid should be written to *pRowid. +*/ +static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + *pRowid = pCsr->iPrevId; + return SQLITE_OK; +} + +/* +** This is the xColumn method, called by SQLite to request a value from +** the row that the supplied cursor currently points to. +** +** If: +** +** (iCol < p->nColumn) -> The value of the iCol'th user column. +** (iCol == p->nColumn) -> Magic column with the same name as the table. +** (iCol == p->nColumn+1) -> Docid column +** (iCol == p->nColumn+2) -> Langid column +*/ +static int fts3ColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + int rc = SQLITE_OK; /* Return Code */ + Fts3Cursor *pCsr = (Fts3Cursor *) pCursor; + Fts3Table *p = (Fts3Table *)pCursor->pVtab; + + /* The column value supplied by SQLite must be in range. */ + assert( iCol>=0 && iCol<=p->nColumn+2 ); + + switch( iCol-p->nColumn ){ + case 0: + /* The special 'table-name' column */ + sqlite3_result_pointer(pCtx, pCsr, "fts3cursor", 0); + break; + + case 1: + /* The docid column */ + sqlite3_result_int64(pCtx, pCsr->iPrevId); + break; + + case 2: + if( pCsr->pExpr ){ + sqlite3_result_int64(pCtx, pCsr->iLangid); + break; + }else if( p->zLanguageid==0 ){ + sqlite3_result_int(pCtx, 0); + break; + }else{ + iCol = p->nColumn; + /* no break */ deliberate_fall_through + } + + default: + /* A user column. Or, if this is a full-table scan, possibly the + ** language-id column. Seek the cursor. */ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK && sqlite3_data_count(pCsr->pStmt)-1>iCol ){ + sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); + } + break; + } + + assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + return rc; +} + +/* +** This function is the implementation of the xUpdate callback used by +** FTS3 virtual tables. It is invoked by SQLite each time a row is to be +** inserted, updated or deleted. +*/ +static int fts3UpdateMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + return sqlite3Fts3UpdateMethod(pVtab, nArg, apVal, pRowid); +} + +/* +** Implementation of xSync() method. Flush the contents of the pending-terms +** hash-table to the database. +*/ +static int fts3SyncMethod(sqlite3_vtab *pVtab){ + + /* Following an incremental-merge operation, assuming that the input + ** segments are not completely consumed (the usual case), they are updated + ** in place to remove the entries that have already been merged. This + ** involves updating the leaf block that contains the smallest unmerged + ** entry and each block (if any) between the leaf and the root node. So + ** if the height of the input segment b-trees is N, and input segments + ** are merged eight at a time, updating the input segments at the end + ** of an incremental-merge requires writing (8*(1+N)) blocks. N is usually + ** small - often between 0 and 2. So the overhead of the incremental + ** merge is somewhere between 8 and 24 blocks. To avoid this overhead + ** dwarfing the actual productive work accomplished, the incremental merge + ** is only attempted if it will write at least 64 leaf blocks. Hence + ** nMinMerge. + ** + ** Of course, updating the input segments also involves deleting a bunch + ** of blocks from the segments table. But this is not considered overhead + ** as it would also be required by a crisis-merge that used the same input + ** segments. + */ + const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */ + + Fts3Table *p = (Fts3Table*)pVtab; + int rc; + i64 iLastRowid = sqlite3_last_insert_rowid(p->db); + + rc = sqlite3Fts3PendingTermsFlush(p); + if( rc==SQLITE_OK + && p->nLeafAdd>(nMinMerge/16) + && p->nAutoincrmerge && p->nAutoincrmerge!=0xff + ){ + int mxLevel = 0; /* Maximum relative level value in db */ + int A; /* Incr-merge parameter A */ + + rc = sqlite3Fts3MaxLevel(p, &mxLevel); + assert( rc==SQLITE_OK || mxLevel==0 ); + A = p->nLeafAdd * mxLevel; + A += (A/2); + if( A>(int)nMinMerge ) rc = sqlite3Fts3Incrmerge(p, A, p->nAutoincrmerge); + } + sqlite3Fts3SegmentsClose(p); + sqlite3_set_last_insert_rowid(p->db, iLastRowid); + return rc; +} + +/* +** If it is currently unknown whether or not the FTS table has an %_stat +** table (if p->bHasStat==2), attempt to determine this (set p->bHasStat +** to 0 or 1). Return SQLITE_OK if successful, or an SQLite error code +** if an error occurs. +*/ +static int fts3SetHasStat(Fts3Table *p){ + int rc = SQLITE_OK; + if( p->bHasStat==2 ){ + char *zTbl = sqlite3_mprintf("%s_stat", p->zName); + if( zTbl ){ + int res = sqlite3_table_column_metadata(p->db, p->zDb, zTbl, 0,0,0,0,0,0); + sqlite3_free(zTbl); + p->bHasStat = (res==SQLITE_OK); + }else{ + rc = SQLITE_NOMEM; + } + } + return rc; +} + +/* +** Implementation of xBegin() method. +*/ +static int fts3BeginMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table*)pVtab; + int rc; + UNUSED_PARAMETER(pVtab); + assert( p->pSegments==0 ); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=1 ); + p->nLeafAdd = 0; + rc = fts3SetHasStat(p); +#ifdef SQLITE_DEBUG + if( rc==SQLITE_OK ){ + p->inTransaction = 1; + p->mxSavepoint = -1; + } +#endif + return rc; +} + +/* +** Implementation of xCommit() method. This is a no-op. The contents of +** the pending-terms hash-table have already been flushed into the database +** by fts3SyncMethod(). +*/ +static int fts3CommitMethod(sqlite3_vtab *pVtab){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(pVtab); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=0 ); + assert( p->pSegments==0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); + return SQLITE_OK; +} + +/* +** Implementation of xRollback(). Discard the contents of the pending-terms +** hash-table. Any changes made to the database are reverted by SQLite. +*/ +static int fts3RollbackMethod(sqlite3_vtab *pVtab){ + Fts3Table *p = (Fts3Table*)pVtab; + sqlite3Fts3PendingTermsClear(p); + assert( p->inTransaction!=0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); + return SQLITE_OK; +} + +/* +** When called, *ppPoslist must point to the byte immediately following the +** end of a position-list. i.e. ( (*ppPoslist)[-1]==POS_END ). This function +** moves *ppPoslist so that it instead points to the first byte of the +** same position list. +*/ +static void fts3ReversePoslist(char *pStart, char **ppPoslist){ + char *p = &(*ppPoslist)[-2]; + char c = 0; + + /* Skip backwards passed any trailing 0x00 bytes added by NearTrim() */ + while( p>pStart && (c=*p--)==0 ); + + /* Search backwards for a varint with value zero (the end of the previous + ** poslist). This is an 0x00 byte preceded by some byte that does not + ** have the 0x80 bit set. */ + while( p>pStart && (*p & 0x80) | c ){ + c = *p--; + } + assert( p==pStart || c==0 ); + + /* At this point p points to that preceding byte without the 0x80 bit + ** set. So to find the start of the poslist, skip forward 2 bytes then + ** over a varint. + ** + ** Normally. The other case is that p==pStart and the poslist to return + ** is the first in the doclist. In this case do not skip forward 2 bytes. + ** The second part of the if condition (c==0 && *ppPoslist>&p[2]) + ** is required for cases where the first byte of a doclist and the + ** doclist is empty. For example, if the first docid is 10, a doclist + ** that begins with: + ** + ** 0x0A 0x00 + */ + if( p>pStart || (c==0 && *ppPoslist>&p[2]) ){ p = &p[2]; } + while( *p++&0x80 ); + *ppPoslist = p; +} + +/* +** Helper function used by the implementation of the overloaded snippet(), +** offsets() and optimize() SQL functions. +** +** If the value passed as the third argument is a blob of size +** sizeof(Fts3Cursor*), then the blob contents are copied to the +** output variable *ppCsr and SQLITE_OK is returned. Otherwise, an error +** message is written to context pContext and SQLITE_ERROR returned. The +** string passed via zFunc is used as part of the error message. +*/ +static int fts3FunctionArg( + sqlite3_context *pContext, /* SQL function call context */ + const char *zFunc, /* Function name */ + sqlite3_value *pVal, /* argv[0] passed to function */ + Fts3Cursor **ppCsr /* OUT: Store cursor handle here */ +){ + int rc; + *ppCsr = (Fts3Cursor*)sqlite3_value_pointer(pVal, "fts3cursor"); + if( (*ppCsr)!=0 ){ + rc = SQLITE_OK; + }else{ + char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); + sqlite3_result_error(pContext, zErr, -1); + sqlite3_free(zErr); + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** Implementation of the snippet() function for FTS3 +*/ +static void fts3SnippetFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of apVal[] array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + const char *zStart = ""; + const char *zEnd = ""; + const char *zEllipsis = "..."; + int iCol = -1; + int nToken = 15; /* Default number of tokens in snippet */ + + /* There must be at least one argument passed to this function (otherwise + ** the non-overloaded version would have been called instead of this one). + */ + assert( nVal>=1 ); + + if( nVal>6 ){ + sqlite3_result_error(pContext, + "wrong number of arguments to function snippet()", -1); + return; + } + if( fts3FunctionArg(pContext, "snippet", apVal[0], &pCsr) ) return; + + switch( nVal ){ + case 6: nToken = sqlite3_value_int(apVal[5]); + /* no break */ deliberate_fall_through + case 5: iCol = sqlite3_value_int(apVal[4]); + /* no break */ deliberate_fall_through + case 4: zEllipsis = (const char*)sqlite3_value_text(apVal[3]); + /* no break */ deliberate_fall_through + case 3: zEnd = (const char*)sqlite3_value_text(apVal[2]); + /* no break */ deliberate_fall_through + case 2: zStart = (const char*)sqlite3_value_text(apVal[1]); + } + if( !zEllipsis || !zEnd || !zStart ){ + sqlite3_result_error_nomem(pContext); + }else if( nToken==0 ){ + sqlite3_result_text(pContext, "", -1, SQLITE_STATIC); + }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken); + } +} + +/* +** Implementation of the offsets() function for FTS3 +*/ +static void fts3OffsetsFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + + UNUSED_PARAMETER(nVal); + + assert( nVal==1 ); + if( fts3FunctionArg(pContext, "offsets", apVal[0], &pCsr) ) return; + assert( pCsr ); + if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + sqlite3Fts3Offsets(pContext, pCsr); + } +} + +/* +** Implementation of the special optimize() function for FTS3. This +** function merges all segments in the database to a single segment. +** Example usage is: +** +** SELECT optimize(t) FROM t LIMIT 1; +** +** where 't' is the name of an FTS3 table. +*/ +static void fts3OptimizeFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + int rc; /* Return code */ + Fts3Table *p; /* Virtual table handle */ + Fts3Cursor *pCursor; /* Cursor handle passed through apVal[0] */ + + UNUSED_PARAMETER(nVal); + + assert( nVal==1 ); + if( fts3FunctionArg(pContext, "optimize", apVal[0], &pCursor) ) return; + p = (Fts3Table *)pCursor->base.pVtab; + assert( p ); + + rc = sqlite3Fts3Optimize(p); + + switch( rc ){ + case SQLITE_OK: + sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC); + break; + case SQLITE_DONE: + sqlite3_result_text(pContext, "Index already optimal", -1, SQLITE_STATIC); + break; + default: + sqlite3_result_error_code(pContext, rc); + break; + } +} + +/* +** Implementation of the matchinfo() function for FTS3 +*/ +static void fts3MatchinfoFunc( + sqlite3_context *pContext, /* SQLite function call context */ + int nVal, /* Size of argument array */ + sqlite3_value **apVal /* Array of arguments */ +){ + Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */ + assert( nVal==1 || nVal==2 ); + if( SQLITE_OK==fts3FunctionArg(pContext, "matchinfo", apVal[0], &pCsr) ){ + const char *zArg = 0; + if( nVal>1 ){ + zArg = (const char *)sqlite3_value_text(apVal[1]); + } + sqlite3Fts3Matchinfo(pContext, pCsr, zArg); + } +} + +/* +** This routine implements the xFindFunction method for the FTS3 +** virtual table. +*/ +static int fts3FindFunctionMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Number of SQL function arguments */ + const char *zName, /* Name of SQL function */ + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ + void **ppArg /* Unused */ +){ + struct Overloaded { + const char *zName; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aOverload[] = { + { "snippet", fts3SnippetFunc }, + { "offsets", fts3OffsetsFunc }, + { "optimize", fts3OptimizeFunc }, + { "matchinfo", fts3MatchinfoFunc }, + }; + int i; /* Iterator variable */ + + UNUSED_PARAMETER(pVtab); + UNUSED_PARAMETER(nArg); + UNUSED_PARAMETER(ppArg); + + for(i=0; idb; /* Database connection */ + int rc; /* Return Code */ + + /* At this point it must be known if the %_stat table exists or not. + ** So bHasStat may not be 2. */ + rc = fts3SetHasStat(p); + + /* As it happens, the pending terms table is always empty here. This is + ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction + ** always opens a savepoint transaction. And the xSavepoint() method + ** flushes the pending terms table. But leave the (no-op) call to + ** PendingTermsFlush() in in case that changes. + */ + assert( p->nPendingData==0 ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3PendingTermsFlush(p); + } + + if( p->zContentTbl==0 ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';", + p->zDb, p->zName, zName + ); + } + + if( p->bHasDocsize ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_docsize' RENAME TO '%q_docsize';", + p->zDb, p->zName, zName + ); + } + if( p->bHasStat ){ + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_stat' RENAME TO '%q_stat';", + p->zDb, p->zName, zName + ); + } + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';", + p->zDb, p->zName, zName + ); + fts3DbExec(&rc, db, + "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';", + p->zDb, p->zName, zName + ); + return rc; +} + +/* +** The xSavepoint() method. +** +** Flush the contents of the pending-terms table to disk. +*/ +static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ + int rc = SQLITE_OK; + UNUSED_PARAMETER(iSavepoint); + assert( ((Fts3Table *)pVtab)->inTransaction ); + assert( ((Fts3Table *)pVtab)->mxSavepoint <= iSavepoint ); + TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint ); + if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){ + rc = fts3SyncMethod(pVtab); + } + return rc; +} + +/* +** The xRelease() method. +** +** This is a no-op. +*/ +static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(iSavepoint); + UNUSED_PARAMETER(pVtab); + assert( p->inTransaction ); + assert( p->mxSavepoint >= iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint-1 ); + return SQLITE_OK; +} + +/* +** The xRollbackTo() method. +** +** Discard the contents of the pending terms table. +*/ +static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ + Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(iSavepoint); + assert( p->inTransaction ); + TESTONLY( p->mxSavepoint = iSavepoint ); + sqlite3Fts3PendingTermsClear(p); + return SQLITE_OK; +} + +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int fts3ShadowName(const char *zName){ + static const char *azName[] = { + "content", "docsize", "segdir", "segments", "stat", + }; + unsigned int i; + for(i=0; inRef--; + if( pHash->nRef<=0 ){ + sqlite3Fts3HashClear(&pHash->hash); + sqlite3_free(pHash); + } +} + +/* +** The fts3 built-in tokenizers - "simple", "porter" and "icu"- are +** implemented in files fts3_tokenizer1.c, fts3_porter.c and fts3_icu.c +** respectively. The following three forward declarations are for functions +** declared in these files used to retrieve the respective implementations. +** +** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed +** to by the argument to point to the "simple" tokenizer implementation. +** And so on. +*/ +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); +#ifndef SQLITE_DISABLE_FTS3_UNICODE +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const**ppModule); +#endif +#ifdef SQLITE_ENABLE_ICU +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); +#endif + +/* +** Initialize the fts3 extension. If this extension is built as part +** of the sqlite library, then this function is called directly by +** SQLite. If fts3 is built as a dynamically loadable extension, this +** function is called by the sqlite3_extension_init() entry point. +*/ +SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ + int rc = SQLITE_OK; + Fts3HashWrapper *pHash = 0; + const sqlite3_tokenizer_module *pSimple = 0; + const sqlite3_tokenizer_module *pPorter = 0; +#ifndef SQLITE_DISABLE_FTS3_UNICODE + const sqlite3_tokenizer_module *pUnicode = 0; +#endif + +#ifdef SQLITE_ENABLE_ICU + const sqlite3_tokenizer_module *pIcu = 0; + sqlite3Fts3IcuTokenizerModule(&pIcu); +#endif + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + sqlite3Fts3UnicodeTokenizer(&pUnicode); +#endif + +#ifdef SQLITE_TEST + rc = sqlite3Fts3InitTerm(db); + if( rc!=SQLITE_OK ) return rc; +#endif + + rc = sqlite3Fts3InitAux(db); + if( rc!=SQLITE_OK ) return rc; + + sqlite3Fts3SimpleTokenizerModule(&pSimple); + sqlite3Fts3PorterTokenizerModule(&pPorter); + + /* Allocate and initialize the hash-table used to store tokenizers. */ + pHash = sqlite3_malloc(sizeof(Fts3HashWrapper)); + if( !pHash ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3Fts3HashInit(&pHash->hash, FTS3_HASH_STRING, 1); + pHash->nRef = 0; + } + + /* Load the built-in tokenizers into the hash table */ + if( rc==SQLITE_OK ){ + if( sqlite3Fts3HashInsert(&pHash->hash, "simple", 7, (void *)pSimple) + || sqlite3Fts3HashInsert(&pHash->hash, "porter", 7, (void *)pPorter) + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + || sqlite3Fts3HashInsert(&pHash->hash, "unicode61", 10, (void *)pUnicode) +#endif +#ifdef SQLITE_ENABLE_ICU + || (pIcu && sqlite3Fts3HashInsert(&pHash->hash, "icu", 4, (void *)pIcu)) +#endif + ){ + rc = SQLITE_NOMEM; + } + } + +#ifdef SQLITE_TEST + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3ExprInitTestInterface(db, &pHash->hash); + } +#endif + + /* Create the virtual table wrapper around the hash-table and overload + ** the four scalar functions. If this is successful, register the + ** module with sqlite. + */ + if( SQLITE_OK==rc + && SQLITE_OK==(rc=sqlite3Fts3InitHashTable(db,&pHash->hash,"fts3_tokenizer")) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2)) + && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1)) + ){ + pHash->nRef++; + rc = sqlite3_create_module_v2( + db, "fts3", &fts3Module, (void *)pHash, hashDestroy + ); + if( rc==SQLITE_OK ){ + pHash->nRef++; + rc = sqlite3_create_module_v2( + db, "fts4", &fts3Module, (void *)pHash, hashDestroy + ); + } + if( rc==SQLITE_OK ){ + pHash->nRef++; + rc = sqlite3Fts3InitTok(db, (void *)pHash, hashDestroy); + } + return rc; + } + + + /* An error has occurred. Delete the hash table and return the error code. */ + assert( rc!=SQLITE_OK ); + if( pHash ){ + sqlite3Fts3HashClear(&pHash->hash); + sqlite3_free(pHash); + } + return rc; +} + +/* +** Allocate an Fts3MultiSegReader for each token in the expression headed +** by pExpr. +** +** An Fts3SegReader object is a cursor that can seek or scan a range of +** entries within a single segment b-tree. An Fts3MultiSegReader uses multiple +** Fts3SegReader objects internally to provide an interface to seek or scan +** within the union of all segments of a b-tree. Hence the name. +** +** If the allocated Fts3MultiSegReader just seeks to a single entry in a +** segment b-tree (if the term is not a prefix or it is a prefix for which +** there exists prefix b-tree of the right length) then it may be traversed +** and merged incrementally. Otherwise, it has to be merged into an in-memory +** doclist and then traversed. +*/ +static void fts3EvalAllocateReaders( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Allocate readers for this expression */ + int *pnToken, /* OUT: Total number of tokens in phrase. */ + int *pnOr, /* OUT: Total number of OR nodes in expr. */ + int *pRc /* IN/OUT: Error code */ +){ + if( pExpr && SQLITE_OK==*pRc ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + int i; + int nToken = pExpr->pPhrase->nToken; + *pnToken += nToken; + for(i=0; ipPhrase->aToken[i]; + int rc = fts3TermSegReaderCursor(pCsr, + pToken->z, pToken->n, pToken->isPrefix, &pToken->pSegcsr + ); + if( rc!=SQLITE_OK ){ + *pRc = rc; + return; + } + } + assert( pExpr->pPhrase->iDoclistToken==0 ); + pExpr->pPhrase->iDoclistToken = -1; + }else{ + *pnOr += (pExpr->eType==FTSQUERY_OR); + fts3EvalAllocateReaders(pCsr, pExpr->pLeft, pnToken, pnOr, pRc); + fts3EvalAllocateReaders(pCsr, pExpr->pRight, pnToken, pnOr, pRc); + } + } +} + +/* +** Arguments pList/nList contain the doclist for token iToken of phrase p. +** It is merged into the main doclist stored in p->doclist.aAll/nAll. +** +** This function assumes that pList points to a buffer allocated using +** sqlite3_malloc(). This function takes responsibility for eventually +** freeing the buffer. +** +** SQLITE_OK is returned if successful, or SQLITE_NOMEM if an error occurs. +*/ +static int fts3EvalPhraseMergeToken( + Fts3Table *pTab, /* FTS Table pointer */ + Fts3Phrase *p, /* Phrase to merge pList/nList into */ + int iToken, /* Token pList/nList corresponds to */ + char *pList, /* Pointer to doclist */ + int nList /* Number of bytes in pList */ +){ + int rc = SQLITE_OK; + assert( iToken!=p->iDoclistToken ); + + if( pList==0 ){ + sqlite3_free(p->doclist.aAll); + p->doclist.aAll = 0; + p->doclist.nAll = 0; + } + + else if( p->iDoclistToken<0 ){ + p->doclist.aAll = pList; + p->doclist.nAll = nList; + } + + else if( p->doclist.aAll==0 ){ + sqlite3_free(pList); + } + + else { + char *pLeft; + char *pRight; + int nLeft; + int nRight; + int nDiff; + + if( p->iDoclistTokendoclist.aAll; + nLeft = p->doclist.nAll; + pRight = pList; + nRight = nList; + nDiff = iToken - p->iDoclistToken; + }else{ + pRight = p->doclist.aAll; + nRight = p->doclist.nAll; + pLeft = pList; + nLeft = nList; + nDiff = p->iDoclistToken - iToken; + } + + rc = fts3DoclistPhraseMerge( + pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight + ); + sqlite3_free(pLeft); + p->doclist.aAll = pRight; + p->doclist.nAll = nRight; + } + + if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken; + return rc; +} + +/* +** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist +** does not take deferred tokens into account. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalPhraseLoad( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p /* Phrase object */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int iToken; + int rc = SQLITE_OK; + + for(iToken=0; rc==SQLITE_OK && iTokennToken; iToken++){ + Fts3PhraseToken *pToken = &p->aToken[iToken]; + assert( pToken->pDeferred==0 || pToken->pSegcsr==0 ); + + if( pToken->pSegcsr ){ + int nThis = 0; + char *pThis = 0; + rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis); + } + } + assert( pToken->pSegcsr==0 ); + } + + return rc; +} + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +/* +** This function is called on each phrase after the position lists for +** any deferred tokens have been loaded into memory. It updates the phrases +** current position list to include only those positions that are really +** instances of the phrase (after considering deferred tokens). If this +** means that the phrase does not appear in the current row, doclist.pList +** and doclist.nList are both zeroed. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ + int iToken; /* Used to iterate through phrase tokens */ + char *aPoslist = 0; /* Position list for deferred tokens */ + int nPoslist = 0; /* Number of bytes in aPoslist */ + int iPrev = -1; /* Token number of previous deferred token */ + char *aFree = (pPhrase->doclist.bFreeList ? pPhrase->doclist.pList : 0); + + for(iToken=0; iTokennToken; iToken++){ + Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; + Fts3DeferredToken *pDeferred = pToken->pDeferred; + + if( pDeferred ){ + char *pList; + int nList; + int rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList); + if( rc!=SQLITE_OK ) return rc; + + if( pList==0 ){ + sqlite3_free(aPoslist); + sqlite3_free(aFree); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + return SQLITE_OK; + + }else if( aPoslist==0 ){ + aPoslist = pList; + nPoslist = nList; + + }else{ + char *aOut = pList; + char *p1 = aPoslist; + char *p2 = aOut; + + assert( iPrev>=0 ); + fts3PoslistPhraseMerge(&aOut, iToken-iPrev, 0, 1, &p1, &p2); + sqlite3_free(aPoslist); + aPoslist = pList; + nPoslist = (int)(aOut - aPoslist); + if( nPoslist==0 ){ + sqlite3_free(aPoslist); + sqlite3_free(aFree); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + return SQLITE_OK; + } + } + iPrev = iToken; + } + } + + if( iPrev>=0 ){ + int nMaxUndeferred = pPhrase->iDoclistToken; + if( nMaxUndeferred<0 ){ + pPhrase->doclist.pList = aPoslist; + pPhrase->doclist.nList = nPoslist; + pPhrase->doclist.iDocid = pCsr->iPrevId; + pPhrase->doclist.bFreeList = 1; + }else{ + int nDistance; + char *p1; + char *p2; + char *aOut; + + if( nMaxUndeferred>iPrev ){ + p1 = aPoslist; + p2 = pPhrase->doclist.pList; + nDistance = nMaxUndeferred - iPrev; + }else{ + p1 = pPhrase->doclist.pList; + p2 = aPoslist; + nDistance = iPrev - nMaxUndeferred; + } + + aOut = (char *)sqlite3_malloc(nPoslist+8); + if( !aOut ){ + sqlite3_free(aPoslist); + return SQLITE_NOMEM; + } + + pPhrase->doclist.pList = aOut; + assert( p1 && p2 ); + if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ + pPhrase->doclist.bFreeList = 1; + pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList); + }else{ + sqlite3_free(aOut); + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + } + sqlite3_free(aPoslist); + } + } + + if( pPhrase->doclist.pList!=aFree ) sqlite3_free(aFree); + return SQLITE_OK; +} +#endif /* SQLITE_DISABLE_FTS4_DEFERRED */ + +/* +** Maximum number of tokens a phrase may have to be considered for the +** incremental doclists strategy. +*/ +#define MAX_INCR_PHRASE_TOKENS 4 + +/* +** This function is called for each Fts3Phrase in a full-text query +** expression to initialize the mechanism for returning rows. Once this +** function has been called successfully on an Fts3Phrase, it may be +** used with fts3EvalPhraseNext() to iterate through the matching docids. +** +** If parameter bOptOk is true, then the phrase may (or may not) use the +** incremental loading strategy. Otherwise, the entire doclist is loaded into +** memory within this call. +** +** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. +*/ +static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; /* Error code */ + int i; + + /* Determine if doclists may be loaded from disk incrementally. This is + ** possible if the bOptOk argument is true, the FTS doclists will be + ** scanned in forward order, and the phrase consists of + ** MAX_INCR_PHRASE_TOKENS or fewer tokens, none of which are are "^first" + ** tokens or prefix tokens that cannot use a prefix-index. */ + int bHaveIncr = 0; + int bIncrOk = (bOptOk + && pCsr->bDesc==pTab->bDescIdx + && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + && pTab->bNoIncrDoclist==0 +#endif + ); + for(i=0; bIncrOk==1 && inToken; i++){ + Fts3PhraseToken *pToken = &p->aToken[i]; + if( pToken->bFirst || (pToken->pSegcsr!=0 && !pToken->pSegcsr->bLookup) ){ + bIncrOk = 0; + } + if( pToken->pSegcsr ) bHaveIncr = 1; + } + + if( bIncrOk && bHaveIncr ){ + /* Use the incremental approach. */ + int iCol = (p->iColumn >= pTab->nColumn ? -1 : p->iColumn); + for(i=0; rc==SQLITE_OK && inToken; i++){ + Fts3PhraseToken *pToken = &p->aToken[i]; + Fts3MultiSegReader *pSegcsr = pToken->pSegcsr; + if( pSegcsr ){ + rc = sqlite3Fts3MsrIncrStart(pTab, pSegcsr, iCol, pToken->z, pToken->n); + } + } + p->bIncr = 1; + }else{ + /* Load the full doclist for the phrase into memory. */ + rc = fts3EvalPhraseLoad(pCsr, p); + p->bIncr = 0; + } + + assert( rc!=SQLITE_OK || p->nToken<1 || p->aToken[0].pSegcsr==0 || p->bIncr ); + return rc; +} + +/* +** This function is used to iterate backwards (from the end to start) +** through doclists. It is used by this module to iterate through phrase +** doclists in reverse and by the fts3_write.c module to iterate through +** pending-terms lists when writing to databases with "order=desc". +** +** The doclist may be sorted in ascending (parameter bDescIdx==0) or +** descending (parameter bDescIdx==1) order of docid. Regardless, this +** function iterates from the end of the doclist to the beginning. +*/ +SQLITE_PRIVATE void sqlite3Fts3DoclistPrev( + int bDescIdx, /* True if the doclist is desc */ + char *aDoclist, /* Pointer to entire doclist */ + int nDoclist, /* Length of aDoclist in bytes */ + char **ppIter, /* IN/OUT: Iterator pointer */ + sqlite3_int64 *piDocid, /* IN/OUT: Docid pointer */ + int *pnList, /* OUT: List length pointer */ + u8 *pbEof /* OUT: End-of-file flag */ +){ + char *p = *ppIter; + + assert( nDoclist>0 ); + assert( *pbEof==0 ); + assert_fts3_nc( p || *piDocid==0 ); + assert( !p || (p>aDoclist && p<&aDoclist[nDoclist]) ); + + if( p==0 ){ + sqlite3_int64 iDocid = 0; + char *pNext = 0; + char *pDocid = aDoclist; + char *pEnd = &aDoclist[nDoclist]; + int iMul = 1; + + while( pDocid0 ); + assert( *pbEof==0 ); + assert_fts3_nc( p || *piDocid==0 ); + assert( !p || (p>=aDoclist && p<=&aDoclist[nDoclist]) ); + + if( p==0 ){ + p = aDoclist; + p += sqlite3Fts3GetVarint(p, piDocid); + }else{ + fts3PoslistCopy(0, &p); + while( p<&aDoclist[nDoclist] && *p==0 ) p++; + if( p>=&aDoclist[nDoclist] ){ + *pbEof = 1; + }else{ + sqlite3_int64 iVar; + p += sqlite3Fts3GetVarint(p, &iVar); + *piDocid += ((bDescIdx ? -1 : 1) * iVar); + } + } + + *ppIter = p; +} + +/* +** Advance the iterator pDL to the next entry in pDL->aAll/nAll. Set *pbEof +** to true if EOF is reached. +*/ +static void fts3EvalDlPhraseNext( + Fts3Table *pTab, + Fts3Doclist *pDL, + u8 *pbEof +){ + char *pIter; /* Used to iterate through aAll */ + char *pEnd; /* 1 byte past end of aAll */ + + if( pDL->pNextDocid ){ + pIter = pDL->pNextDocid; + assert( pDL->aAll!=0 || pIter==0 ); + }else{ + pIter = pDL->aAll; + } + + if( pIter==0 || pIter>=(pEnd = pDL->aAll + pDL->nAll) ){ + /* We have already reached the end of this doclist. EOF. */ + *pbEof = 1; + }else{ + sqlite3_int64 iDelta; + pIter += sqlite3Fts3GetVarint(pIter, &iDelta); + if( pTab->bDescIdx==0 || pDL->pNextDocid==0 ){ + pDL->iDocid += iDelta; + }else{ + pDL->iDocid -= iDelta; + } + pDL->pList = pIter; + fts3PoslistCopy(0, &pIter); + pDL->nList = (int)(pIter - pDL->pList); + + /* pIter now points just past the 0x00 that terminates the position- + ** list for document pDL->iDocid. However, if this position-list was + ** edited in place by fts3EvalNearTrim(), then pIter may not actually + ** point to the start of the next docid value. The following line deals + ** with this case by advancing pIter past the zero-padding added by + ** fts3EvalNearTrim(). */ + while( pIterpNextDocid = pIter; + assert( pIter>=&pDL->aAll[pDL->nAll] || *pIter ); + *pbEof = 0; + } +} + +/* +** Helper type used by fts3EvalIncrPhraseNext() and incrPhraseTokenNext(). +*/ +typedef struct TokenDoclist TokenDoclist; +struct TokenDoclist { + int bIgnore; + sqlite3_int64 iDocid; + char *pList; + int nList; +}; + +/* +** Token pToken is an incrementally loaded token that is part of a +** multi-token phrase. Advance it to the next matching document in the +** database and populate output variable *p with the details of the new +** entry. Or, if the iterator has reached EOF, set *pbEof to true. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +*/ +static int incrPhraseTokenNext( + Fts3Table *pTab, /* Virtual table handle */ + Fts3Phrase *pPhrase, /* Phrase to advance token of */ + int iToken, /* Specific token to advance */ + TokenDoclist *p, /* OUT: Docid and doclist for new entry */ + u8 *pbEof /* OUT: True if iterator is at EOF */ +){ + int rc = SQLITE_OK; + + if( pPhrase->iDoclistToken==iToken ){ + assert( p->bIgnore==0 ); + assert( pPhrase->aToken[iToken].pSegcsr==0 ); + fts3EvalDlPhraseNext(pTab, &pPhrase->doclist, pbEof); + p->pList = pPhrase->doclist.pList; + p->nList = pPhrase->doclist.nList; + p->iDocid = pPhrase->doclist.iDocid; + }else{ + Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; + assert( pToken->pDeferred==0 ); + assert( pToken->pSegcsr || pPhrase->iDoclistToken>=0 ); + if( pToken->pSegcsr ){ + assert( p->bIgnore==0 ); + rc = sqlite3Fts3MsrIncrNext( + pTab, pToken->pSegcsr, &p->iDocid, &p->pList, &p->nList + ); + if( p->pList==0 ) *pbEof = 1; + }else{ + p->bIgnore = 1; + } + } + + return rc; +} + + +/* +** The phrase iterator passed as the second argument: +** +** * features at least one token that uses an incremental doclist, and +** +** * does not contain any deferred tokens. +** +** Advance it to the next matching documnent in the database and populate +** the Fts3Doclist.pList and nList fields. +** +** If there is no "next" entry and no error occurs, then *pbEof is set to +** 1 before returning. Otherwise, if no error occurs and the iterator is +** successfully advanced, *pbEof is set to 0. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +*/ +static int fts3EvalIncrPhraseNext( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p, /* Phrase object to advance to next docid */ + u8 *pbEof /* OUT: Set to 1 if EOF */ +){ + int rc = SQLITE_OK; + Fts3Doclist *pDL = &p->doclist; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + u8 bEof = 0; + + /* This is only called if it is guaranteed that the phrase has at least + ** one incremental token. In which case the bIncr flag is set. */ + assert( p->bIncr==1 ); + + if( p->nToken==1 ){ + rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr, + &pDL->iDocid, &pDL->pList, &pDL->nList + ); + if( pDL->pList==0 ) bEof = 1; + }else{ + int bDescDoclist = pCsr->bDesc; + struct TokenDoclist a[MAX_INCR_PHRASE_TOKENS]; + + memset(a, 0, sizeof(a)); + assert( p->nToken<=MAX_INCR_PHRASE_TOKENS ); + assert( p->iDoclistTokennToken && bEof==0; i++){ + rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); + if( a[i].bIgnore==0 && (bMaxSet==0 || DOCID_CMP(iMax, a[i].iDocid)<0) ){ + iMax = a[i].iDocid; + bMaxSet = 1; + } + } + assert( rc!=SQLITE_OK || (p->nToken>=1 && a[p->nToken-1].bIgnore==0) ); + assert( rc!=SQLITE_OK || bMaxSet ); + + /* Keep advancing iterators until they all point to the same document */ + for(i=0; inToken; i++){ + while( rc==SQLITE_OK && bEof==0 + && a[i].bIgnore==0 && DOCID_CMP(a[i].iDocid, iMax)<0 + ){ + rc = incrPhraseTokenNext(pTab, p, i, &a[i], &bEof); + if( DOCID_CMP(a[i].iDocid, iMax)>0 ){ + iMax = a[i].iDocid; + i = 0; + } + } + } + + /* Check if the current entries really are a phrase match */ + if( bEof==0 ){ + int nList = 0; + int nByte = a[p->nToken-1].nList; + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); + if( !aDoclist ) return SQLITE_NOMEM; + memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); + + for(i=0; i<(p->nToken-1); i++){ + if( a[i].bIgnore==0 ){ + char *pL = a[i].pList; + char *pR = aDoclist; + char *pOut = aDoclist; + int nDist = p->nToken-1-i; + int res = fts3PoslistPhraseMerge(&pOut, nDist, 0, 1, &pL, &pR); + if( res==0 ) break; + nList = (int)(pOut - aDoclist); + } + } + if( i==(p->nToken-1) ){ + pDL->iDocid = iMax; + pDL->pList = aDoclist; + pDL->nList = nList; + pDL->bFreeList = 1; + break; + } + sqlite3_free(aDoclist); + } + } + } + + *pbEof = bEof; + return rc; +} + +/* +** Attempt to move the phrase iterator to point to the next matching docid. +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. +** +** If there is no "next" entry and no error occurs, then *pbEof is set to +** 1 before returning. Otherwise, if no error occurs and the iterator is +** successfully advanced, *pbEof is set to 0. +*/ +static int fts3EvalPhraseNext( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Phrase *p, /* Phrase object to advance to next docid */ + u8 *pbEof /* OUT: Set to 1 if EOF */ +){ + int rc = SQLITE_OK; + Fts3Doclist *pDL = &p->doclist; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + + if( p->bIncr ){ + rc = fts3EvalIncrPhraseNext(pCsr, p, pbEof); + }else if( pCsr->bDesc!=pTab->bDescIdx && pDL->nAll ){ + sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll, + &pDL->pNextDocid, &pDL->iDocid, &pDL->nList, pbEof + ); + pDL->pList = pDL->pNextDocid; + }else{ + fts3EvalDlPhraseNext(pTab, pDL, pbEof); + } + + return rc; +} + +/* +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, fts3EvalPhraseStart() is called on all phrases within the +** expression. Also the Fts3Expr.bDeferred variable is set to true for any +** expressions for which all descendent tokens are deferred. +** +** If parameter bOptOk is zero, then it is guaranteed that the +** Fts3Phrase.doclist.aAll/nAll variables contain the entire doclist for +** each phrase in the expression (subject to deferred token processing). +** Or, if bOptOk is non-zero, then one or more tokens within the expression +** may be loaded incrementally, meaning doclist.aAll/nAll is not available. +** +** If an error occurs within this function, *pRc is set to an SQLite error +** code before returning. +*/ +static void fts3EvalStartReaders( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pExpr, /* Expression to initialize phrases in */ + int *pRc /* IN/OUT: Error code */ +){ + if( pExpr && SQLITE_OK==*pRc ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + int nToken = pExpr->pPhrase->nToken; + if( nToken ){ + int i; + for(i=0; ipPhrase->aToken[i].pDeferred==0 ) break; + } + pExpr->bDeferred = (i==nToken); + } + *pRc = fts3EvalPhraseStart(pCsr, 1, pExpr->pPhrase); + }else{ + fts3EvalStartReaders(pCsr, pExpr->pLeft, pRc); + fts3EvalStartReaders(pCsr, pExpr->pRight, pRc); + pExpr->bDeferred = (pExpr->pLeft->bDeferred && pExpr->pRight->bDeferred); + } + } +} + +/* +** An array of the following structures is assembled as part of the process +** of selecting tokens to defer before the query starts executing (as part +** of the xFilter() method). There is one element in the array for each +** token in the FTS expression. +** +** Tokens are divided into AND/NEAR clusters. All tokens in a cluster belong +** to phrases that are connected only by AND and NEAR operators (not OR or +** NOT). When determining tokens to defer, each AND/NEAR cluster is considered +** separately. The root of a tokens AND/NEAR cluster is stored in +** Fts3TokenAndCost.pRoot. +*/ +typedef struct Fts3TokenAndCost Fts3TokenAndCost; +struct Fts3TokenAndCost { + Fts3Phrase *pPhrase; /* The phrase the token belongs to */ + int iToken; /* Position of token in phrase */ + Fts3PhraseToken *pToken; /* The token itself */ + Fts3Expr *pRoot; /* Root of NEAR/AND cluster */ + int nOvfl; /* Number of overflow pages to load doclist */ + int iCol; /* The column the token must match */ +}; + +/* +** This function is used to populate an allocated Fts3TokenAndCost array. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, if an error occurs during execution, *pRc is set to an +** SQLite error code. +*/ +static void fts3EvalTokenCosts( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pRoot, /* Root of current AND/NEAR cluster */ + Fts3Expr *pExpr, /* Expression to consider */ + Fts3TokenAndCost **ppTC, /* Write new entries to *(*ppTC)++ */ + Fts3Expr ***ppOr, /* Write new OR root to *(*ppOr)++ */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + if( pExpr->eType==FTSQUERY_PHRASE ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + for(i=0; *pRc==SQLITE_OK && inToken; i++){ + Fts3TokenAndCost *pTC = (*ppTC)++; + pTC->pPhrase = pPhrase; + pTC->iToken = i; + pTC->pRoot = pRoot; + pTC->pToken = &pPhrase->aToken[i]; + pTC->iCol = pPhrase->iColumn; + *pRc = sqlite3Fts3MsrOvfl(pCsr, pTC->pToken->pSegcsr, &pTC->nOvfl); + } + }else if( pExpr->eType!=FTSQUERY_NOT ){ + assert( pExpr->eType==FTSQUERY_OR + || pExpr->eType==FTSQUERY_AND + || pExpr->eType==FTSQUERY_NEAR + ); + assert( pExpr->pLeft && pExpr->pRight ); + if( pExpr->eType==FTSQUERY_OR ){ + pRoot = pExpr->pLeft; + **ppOr = pRoot; + (*ppOr)++; + } + fts3EvalTokenCosts(pCsr, pRoot, pExpr->pLeft, ppTC, ppOr, pRc); + if( pExpr->eType==FTSQUERY_OR ){ + pRoot = pExpr->pRight; + **ppOr = pRoot; + (*ppOr)++; + } + fts3EvalTokenCosts(pCsr, pRoot, pExpr->pRight, ppTC, ppOr, pRc); + } + } +} + +/* +** Determine the average document (row) size in pages. If successful, +** write this value to *pnPage and return SQLITE_OK. Otherwise, return +** an SQLite error code. +** +** The average document size in pages is calculated by first calculating +** determining the average size in bytes, B. If B is less than the amount +** of data that will fit on a single leaf page of an intkey table in +** this database, then the average docsize is 1. Otherwise, it is 1 plus +** the number of overflow pages consumed by a record B bytes in size. +*/ +static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ + int rc = SQLITE_OK; + if( pCsr->nRowAvg==0 ){ + /* The average document size, which is required to calculate the cost + ** of each doclist, has not yet been determined. Read the required + ** data from the %_stat table to calculate it. + ** + ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3 + ** varints, where nCol is the number of columns in the FTS3 table. + ** The first varint is the number of documents currently stored in + ** the table. The following nCol varints contain the total amount of + ** data stored in all rows of each column of the table, from left + ** to right. + */ + Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; + sqlite3_stmt *pStmt; + sqlite3_int64 nDoc = 0; + sqlite3_int64 nByte = 0; + const char *pEnd; + const char *a; + + rc = sqlite3Fts3SelectDoctotal(p, &pStmt); + if( rc!=SQLITE_OK ) return rc; + a = sqlite3_column_blob(pStmt, 0); + testcase( a==0 ); /* If %_stat.value set to X'' */ + if( a ){ + pEnd = &a[sqlite3_column_bytes(pStmt, 0)]; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nDoc); + while( anDoc = nDoc; + pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz); + assert( pCsr->nRowAvg>0 ); + rc = sqlite3_reset(pStmt); + } + + *pnPage = pCsr->nRowAvg; + return rc; +} + +/* +** This function is called to select the tokens (if any) that will be +** deferred. The array aTC[] has already been populated when this is +** called. +** +** This function is called once for each AND/NEAR cluster in the +** expression. Each invocation determines which tokens to defer within +** the cluster with root node pRoot. See comments above the definition +** of struct Fts3TokenAndCost for more details. +** +** If no error occurs, SQLITE_OK is returned and sqlite3Fts3DeferToken() +** called on each token to defer. Otherwise, an SQLite error code is +** returned. +*/ +static int fts3EvalSelectDeferred( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pRoot, /* Consider tokens with this root node */ + Fts3TokenAndCost *aTC, /* Array of expression tokens and costs */ + int nTC /* Number of entries in aTC[] */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int nDocSize = 0; /* Number of pages per doc loaded */ + int rc = SQLITE_OK; /* Return code */ + int ii; /* Iterator variable for various purposes */ + int nOvfl = 0; /* Total overflow pages used by doclists */ + int nToken = 0; /* Total number of tokens in cluster */ + + int nMinEst = 0; /* The minimum count for any phrase so far. */ + int nLoad4 = 1; /* (Phrases that will be loaded)^4. */ + + /* Tokens are never deferred for FTS tables created using the content=xxx + ** option. The reason being that it is not guaranteed that the content + ** table actually contains the same data as the index. To prevent this from + ** causing any problems, the deferred token optimization is completely + ** disabled for content=xxx tables. */ + if( pTab->zContentTbl ){ + return SQLITE_OK; + } + + /* Count the tokens in this AND/NEAR cluster. If none of the doclists + ** associated with the tokens spill onto overflow pages, or if there is + ** only 1 token, exit early. No tokens to defer in this case. */ + for(ii=0; ii0 ); + + + /* Iterate through all tokens in this AND/NEAR cluster, in ascending order + ** of the number of overflow pages that will be loaded by the pager layer + ** to retrieve the entire doclist for the token from the full-text index. + ** Load the doclists for tokens that are either: + ** + ** a. The cheapest token in the entire query (i.e. the one visited by the + ** first iteration of this loop), or + ** + ** b. Part of a multi-token phrase. + ** + ** After each token doclist is loaded, merge it with the others from the + ** same phrase and count the number of documents that the merged doclist + ** contains. Set variable "nMinEst" to the smallest number of documents in + ** any phrase doclist for which 1 or more token doclists have been loaded. + ** Let nOther be the number of other phrases for which it is certain that + ** one or more tokens will not be deferred. + ** + ** Then, for each token, defer it if loading the doclist would result in + ** loading N or more overflow pages into memory, where N is computed as: + ** + ** (nMinEst + 4^nOther - 1) / (4^nOther) + */ + for(ii=0; iinOvfl) + ){ + pTC = &aTC[iTC]; + } + } + assert( pTC ); + + if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){ + /* The number of overflow pages to load for this (and therefore all + ** subsequent) tokens is greater than the estimated number of pages + ** that will be loaded if all subsequent tokens are deferred. + */ + Fts3PhraseToken *pToken = pTC->pToken; + rc = sqlite3Fts3DeferToken(pCsr, pToken, pTC->iCol); + fts3SegReaderCursorFree(pToken->pSegcsr); + pToken->pSegcsr = 0; + }else{ + /* Set nLoad4 to the value of (4^nOther) for the next iteration of the + ** for-loop. Except, limit the value to 2^24 to prevent it from + ** overflowing the 32-bit integer it is stored in. */ + if( ii<12 ) nLoad4 = nLoad4*4; + + if( ii==0 || (pTC->pPhrase->nToken>1 && ii!=nToken-1) ){ + /* Either this is the cheapest token in the entire query, or it is + ** part of a multi-token phrase. Either way, the entire doclist will + ** (eventually) be loaded into memory. It may as well be now. */ + Fts3PhraseToken *pToken = pTC->pToken; + int nList = 0; + char *pList = 0; + rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList); + assert( rc==SQLITE_OK || pList==0 ); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken( + pTab, pTC->pPhrase, pTC->iToken,pList,nList + ); + } + if( rc==SQLITE_OK ){ + int nCount; + nCount = fts3DoclistCountDocids( + pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll + ); + if( ii==0 || nCountpToken = 0; + } + + return rc; +} + +/* +** This function is called from within the xFilter method. It initializes +** the full-text query currently stored in pCsr->pExpr. To iterate through +** the results of a query, the caller does: +** +** fts3EvalStart(pCsr); +** while( 1 ){ +** fts3EvalNext(pCsr); +** if( pCsr->bEof ) break; +** ... return row pCsr->iPrevId to the caller ... +** } +*/ +static int fts3EvalStart(Fts3Cursor *pCsr){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int nToken = 0; + int nOr = 0; + + /* Allocate a MultiSegReader for each token in the expression. */ + fts3EvalAllocateReaders(pCsr, pCsr->pExpr, &nToken, &nOr, &rc); + + /* Determine which, if any, tokens in the expression should be deferred. */ +#ifndef SQLITE_DISABLE_FTS4_DEFERRED + if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ + Fts3TokenAndCost *aTC; + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( + sizeof(Fts3TokenAndCost) * nToken + + sizeof(Fts3Expr *) * nOr * 2 + ); + + if( !aTC ){ + rc = SQLITE_NOMEM; + }else{ + Fts3Expr **apOr = (Fts3Expr **)&aTC[nToken]; + int ii; + Fts3TokenAndCost *pTC = aTC; + Fts3Expr **ppOr = apOr; + + fts3EvalTokenCosts(pCsr, 0, pCsr->pExpr, &pTC, &ppOr, &rc); + nToken = (int)(pTC-aTC); + nOr = (int)(ppOr-apOr); + + if( rc==SQLITE_OK ){ + rc = fts3EvalSelectDeferred(pCsr, 0, aTC, nToken); + for(ii=0; rc==SQLITE_OK && iipExpr, &rc); + return rc; +} + +/* +** Invalidate the current position list for phrase pPhrase. +*/ +static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){ + if( pPhrase->doclist.bFreeList ){ + sqlite3_free(pPhrase->doclist.pList); + } + pPhrase->doclist.pList = 0; + pPhrase->doclist.nList = 0; + pPhrase->doclist.bFreeList = 0; +} + +/* +** This function is called to edit the position list associated with +** the phrase object passed as the fifth argument according to a NEAR +** condition. For example: +** +** abc NEAR/5 "def ghi" +** +** Parameter nNear is passed the NEAR distance of the expression (5 in +** the example above). When this function is called, *paPoslist points to +** the position list, and *pnToken is the number of phrase tokens in the +** phrase on the other side of the NEAR operator to pPhrase. For example, +** if pPhrase refers to the "def ghi" phrase, then *paPoslist points to +** the position list associated with phrase "abc". +** +** All positions in the pPhrase position list that are not sufficiently +** close to a position in the *paPoslist position list are removed. If this +** leaves 0 positions, zero is returned. Otherwise, non-zero. +** +** Before returning, *paPoslist is set to point to the position lsit +** associated with pPhrase. And *pnToken is set to the number of tokens in +** pPhrase. +*/ +static int fts3EvalNearTrim( + int nNear, /* NEAR distance. As in "NEAR/nNear". */ + char *aTmp, /* Temporary space to use */ + char **paPoslist, /* IN/OUT: Position list */ + int *pnToken, /* IN/OUT: Tokens in phrase of *paPoslist */ + Fts3Phrase *pPhrase /* The phrase object to trim the doclist of */ +){ + int nParam1 = nNear + pPhrase->nToken; + int nParam2 = nNear + *pnToken; + int nNew; + char *p2; + char *pOut; + int res; + + assert( pPhrase->doclist.pList ); + + p2 = pOut = pPhrase->doclist.pList; + res = fts3PoslistNearMerge( + &pOut, aTmp, nParam1, nParam2, paPoslist, &p2 + ); + if( res ){ + nNew = (int)(pOut - pPhrase->doclist.pList) - 1; + assert_fts3_nc( nNew<=pPhrase->doclist.nList && nNew>0 ); + if( nNew>=0 && nNew<=pPhrase->doclist.nList ){ + assert( pPhrase->doclist.pList[nNew]=='\0' ); + memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew); + pPhrase->doclist.nList = nNew; + } + *paPoslist = pPhrase->doclist.pList; + *pnToken = pPhrase->nToken; + } + + return res; +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is called. +** Otherwise, it advances the expression passed as the second argument to +** point to the next matching row in the database. Expressions iterate through +** matching rows in docid order. Ascending order if Fts3Cursor.bDesc is zero, +** or descending if it is non-zero. +** +** If an error occurs, *pRc is set to an SQLite error code. Otherwise, if +** successful, the following variables in pExpr are set: +** +** Fts3Expr.bEof (non-zero if EOF - there is no next row) +** Fts3Expr.iDocid (valid if bEof==0. The docid of the next row) +** +** If the expression is of type FTSQUERY_PHRASE, and the expression is not +** at EOF, then the following variables are populated with the position list +** for the phrase for the visited row: +** +** FTs3Expr.pPhrase->doclist.nList (length of pList in bytes) +** FTs3Expr.pPhrase->doclist.pList (pointer to position list) +** +** It says above that this function advances the expression to the next +** matching row. This is usually true, but there are the following exceptions: +** +** 1. Deferred tokens are not taken into account. If a phrase consists +** entirely of deferred tokens, it is assumed to match every row in +** the db. In this case the position-list is not populated at all. +** +** Or, if a phrase contains one or more deferred tokens and one or +** more non-deferred tokens, then the expression is advanced to the +** next possible match, considering only non-deferred tokens. In other +** words, if the phrase is "A B C", and "B" is deferred, the expression +** is advanced to the next row that contains an instance of "A * C", +** where "*" may match any single token. The position list in this case +** is populated as for "A * C" before returning. +** +** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is +** advanced to point to the next row that matches "x AND y". +** +** See sqlite3Fts3EvalTestDeferred() for details on testing if a row is +** really a match, taking into account deferred tokens and NEAR operators. +*/ +static void fts3EvalNextRow( + Fts3Cursor *pCsr, /* FTS Cursor handle */ + Fts3Expr *pExpr, /* Expr. to advance to next matching row */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + int bDescDoclist = pCsr->bDesc; /* Used by DOCID_CMP() macro */ + assert( pExpr->bEof==0 ); + pExpr->bStart = 1; + + switch( pExpr->eType ){ + case FTSQUERY_NEAR: + case FTSQUERY_AND: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + assert( !pLeft->bDeferred || !pRight->bDeferred ); + + if( pLeft->bDeferred ){ + /* LHS is entirely deferred. So we assume it matches every row. + ** Advance the RHS iterator to find the next row visited. */ + fts3EvalNextRow(pCsr, pRight, pRc); + pExpr->iDocid = pRight->iDocid; + pExpr->bEof = pRight->bEof; + }else if( pRight->bDeferred ){ + /* RHS is entirely deferred. So we assume it matches every row. + ** Advance the LHS iterator to find the next row visited. */ + fts3EvalNextRow(pCsr, pLeft, pRc); + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = pLeft->bEof; + }else{ + /* Neither the RHS or LHS are deferred. */ + fts3EvalNextRow(pCsr, pLeft, pRc); + fts3EvalNextRow(pCsr, pRight, pRc); + while( !pLeft->bEof && !pRight->bEof && *pRc==SQLITE_OK ){ + sqlite3_int64 iDiff = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + if( iDiff==0 ) break; + if( iDiff<0 ){ + fts3EvalNextRow(pCsr, pLeft, pRc); + }else{ + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = (pLeft->bEof || pRight->bEof); + if( pExpr->eType==FTSQUERY_NEAR && pExpr->bEof ){ + assert( pRight->eType==FTSQUERY_PHRASE ); + if( pRight->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pRight->pPhrase->doclist; + while( *pRc==SQLITE_OK && pRight->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pLeft->pPhrase->doclist; + while( *pRc==SQLITE_OK && pLeft->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pLeft, pRc); + } + } + pRight->bEof = pLeft->bEof = 1; + } + } + break; + } + + case FTSQUERY_OR: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + + assert_fts3_nc( pLeft->bStart || pLeft->iDocid==pRight->iDocid ); + assert_fts3_nc( pRight->bStart || pLeft->iDocid==pRight->iDocid ); + + if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ + fts3EvalNextRow(pCsr, pLeft, pRc); + }else if( pLeft->bEof || iCmp>0 ){ + fts3EvalNextRow(pCsr, pRight, pRc); + }else{ + fts3EvalNextRow(pCsr, pLeft, pRc); + fts3EvalNextRow(pCsr, pRight, pRc); + } + + pExpr->bEof = (pLeft->bEof && pRight->bEof); + iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid); + if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ + pExpr->iDocid = pLeft->iDocid; + }else{ + pExpr->iDocid = pRight->iDocid; + } + + break; + } + + case FTSQUERY_NOT: { + Fts3Expr *pLeft = pExpr->pLeft; + Fts3Expr *pRight = pExpr->pRight; + + if( pRight->bStart==0 ){ + fts3EvalNextRow(pCsr, pRight, pRc); + assert( *pRc!=SQLITE_OK || pRight->bStart ); + } + + fts3EvalNextRow(pCsr, pLeft, pRc); + if( pLeft->bEof==0 ){ + while( !*pRc + && !pRight->bEof + && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0 + ){ + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + pExpr->iDocid = pLeft->iDocid; + pExpr->bEof = pLeft->bEof; + break; + } + + default: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + fts3EvalInvalidatePoslist(pPhrase); + *pRc = fts3EvalPhraseNext(pCsr, pPhrase, &pExpr->bEof); + pExpr->iDocid = pPhrase->doclist.iDocid; + break; + } + } + } +} + +/* +** If *pRc is not SQLITE_OK, or if pExpr is not the root node of a NEAR +** cluster, then this function returns 1 immediately. +** +** Otherwise, it checks if the current row really does match the NEAR +** expression, using the data currently stored in the position lists +** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression. +** +** If the current row is a match, the position list associated with each +** phrase in the NEAR expression is edited in place to contain only those +** phrase instances sufficiently close to their peers to satisfy all NEAR +** constraints. In this case it returns 1. If the NEAR expression does not +** match the current row, 0 is returned. The position lists may or may not +** be edited if 0 is returned. +*/ +static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ + int res = 1; + + /* The following block runs if pExpr is the root of a NEAR query. + ** For example, the query: + ** + ** "w" NEAR "x" NEAR "y" NEAR "z" + ** + ** which is represented in tree form as: + ** + ** | + ** +--NEAR--+ <-- root of NEAR query + ** | | + ** +--NEAR--+ "z" + ** | | + ** +--NEAR--+ "y" + ** | | + ** "w" "x" + ** + ** The right-hand child of a NEAR node is always a phrase. The + ** left-hand child may be either a phrase or a NEAR node. There are + ** no exceptions to this - it's the way the parser in fts3_expr.c works. + */ + if( *pRc==SQLITE_OK + && pExpr->eType==FTSQUERY_NEAR + && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) + ){ + Fts3Expr *p; + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ + char *aTmp; /* Temp space for PoslistNearMerge() */ + + /* Allocate temporary working space. */ + for(p=pExpr; p->pLeft; p=p->pLeft){ + assert( p->pRight->pPhrase->doclist.nList>0 ); + nTmp += p->pRight->pPhrase->doclist.nList; + } + nTmp += p->pPhrase->doclist.nList; + aTmp = sqlite3_malloc64(nTmp*2); + if( !aTmp ){ + *pRc = SQLITE_NOMEM; + res = 0; + }else{ + char *aPoslist = p->pPhrase->doclist.pList; + int nToken = p->pPhrase->nToken; + + for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){ + Fts3Phrase *pPhrase = p->pRight->pPhrase; + int nNear = p->nNear; + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } + + aPoslist = pExpr->pRight->pPhrase->doclist.pList; + nToken = pExpr->pRight->pPhrase->nToken; + for(p=pExpr->pLeft; p && res; p=p->pLeft){ + int nNear; + Fts3Phrase *pPhrase; + assert( p->pParent && p->pParent->pLeft==p ); + nNear = p->pParent->nNear; + pPhrase = ( + p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase + ); + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } + } + + sqlite3_free(aTmp); + } + + return res; +} + +/* +** This function is a helper function for sqlite3Fts3EvalTestDeferred(). +** Assuming no error occurs or has occurred, It returns non-zero if the +** expression passed as the second argument matches the row that pCsr +** currently points to, or zero if it does not. +** +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** If an error occurs during execution of this function, *pRc is set to +** the appropriate SQLite error code. In this case the returned value is +** undefined. +*/ +static int fts3EvalTestExpr( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Expr to test. May or may not be root. */ + int *pRc /* IN/OUT: Error code */ +){ + int bHit = 1; /* Return value */ + if( *pRc==SQLITE_OK ){ + switch( pExpr->eType ){ + case FTSQUERY_NEAR: + case FTSQUERY_AND: + bHit = ( + fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) + && fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) + && fts3EvalNearTest(pExpr, pRc) + ); + + /* If the NEAR expression does not match any rows, zero the doclist for + ** all phrases involved in the NEAR. This is because the snippet(), + ** offsets() and matchinfo() functions are not supposed to recognize + ** any instances of phrases that are part of unmatched NEAR queries. + ** For example if this expression: + ** + ** ... MATCH 'a OR (b NEAR c)' + ** + ** is matched against a row containing: + ** + ** 'a b d e' + ** + ** then any snippet() should ony highlight the "a" term, not the "b" + ** (as "b" is part of a non-matching NEAR clause). + */ + if( bHit==0 + && pExpr->eType==FTSQUERY_NEAR + && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) + ){ + Fts3Expr *p; + for(p=pExpr; p->pPhrase==0; p=p->pLeft){ + if( p->pRight->iDocid==pCsr->iPrevId ){ + fts3EvalInvalidatePoslist(p->pRight->pPhrase); + } + } + if( p->iDocid==pCsr->iPrevId ){ + fts3EvalInvalidatePoslist(p->pPhrase); + } + } + + break; + + case FTSQUERY_OR: { + int bHit1 = fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc); + int bHit2 = fts3EvalTestExpr(pCsr, pExpr->pRight, pRc); + bHit = bHit1 || bHit2; + break; + } + + case FTSQUERY_NOT: + bHit = ( + fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) + && !fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) + ); + break; + + default: { +#ifndef SQLITE_DISABLE_FTS4_DEFERRED + if( pCsr->pDeferred && (pExpr->bDeferred || ( + pExpr->iDocid==pCsr->iPrevId && pExpr->pPhrase->doclist.pList + ))){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + if( pExpr->bDeferred ){ + fts3EvalInvalidatePoslist(pPhrase); + } + *pRc = fts3EvalDeferredPhrase(pCsr, pPhrase); + bHit = (pPhrase->doclist.pList!=0); + pExpr->iDocid = pCsr->iPrevId; + }else +#endif + { + bHit = ( + pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId + && pExpr->pPhrase->doclist.nList>0 + ); + } + break; + } + } + } + return bHit; +} + +/* +** This function is called as the second part of each xNext operation when +** iterating through the results of a full-text query. At this point the +** cursor points to a row that matches the query expression, with the +** following caveats: +** +** * Up until this point, "NEAR" operators in the expression have been +** treated as "AND". +** +** * Deferred tokens have not yet been considered. +** +** If *pRc is not SQLITE_OK when this function is called, it immediately +** returns 0. Otherwise, it tests whether or not after considering NEAR +** operators and deferred tokens the current row is still a match for the +** expression. It returns 1 if both of the following are true: +** +** 1. *pRc is SQLITE_OK when this function returns, and +** +** 2. After scanning the current FTS table row for the deferred tokens, +** it is determined that the row does *not* match the query. +** +** Or, if no error occurs and it seems the current row does match the FTS +** query, return 0. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){ + int rc = *pRc; + int bMiss = 0; + if( rc==SQLITE_OK ){ + + /* If there are one or more deferred tokens, load the current row into + ** memory and scan it to determine the position list for each deferred + ** token. Then, see if this row is really a match, considering deferred + ** tokens and NEAR operators (neither of which were taken into account + ** earlier, by fts3EvalNextRow()). + */ + if( pCsr->pDeferred ){ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3CacheDeferredDoclists(pCsr); + } + } + bMiss = (0==fts3EvalTestExpr(pCsr, pCsr->pExpr, &rc)); + + /* Free the position-lists accumulated for each deferred token above. */ + sqlite3Fts3FreeDeferredDoclists(pCsr); + *pRc = rc; + } + return (rc==SQLITE_OK && bMiss); +} + +/* +** Advance to the next document that matches the FTS expression in +** Fts3Cursor.pExpr. +*/ +static int fts3EvalNext(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; /* Return Code */ + Fts3Expr *pExpr = pCsr->pExpr; + assert( pCsr->isEof==0 ); + if( pExpr==0 ){ + pCsr->isEof = 1; + }else{ + do { + if( pCsr->isRequireSeek==0 ){ + sqlite3_reset(pCsr->pStmt); + } + assert( sqlite3_data_count(pCsr->pStmt)==0 ); + fts3EvalNextRow(pCsr, pExpr, &rc); + pCsr->isEof = pExpr->bEof; + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoNeeded = 1; + pCsr->iPrevId = pExpr->iDocid; + }while( pCsr->isEof==0 && sqlite3Fts3EvalTestDeferred(pCsr, &rc) ); + } + + /* Check if the cursor is past the end of the docid range specified + ** by Fts3Cursor.iMinDocid/iMaxDocid. If so, set the EOF flag. */ + if( rc==SQLITE_OK && ( + (pCsr->bDesc==0 && pCsr->iPrevId>pCsr->iMaxDocid) + || (pCsr->bDesc!=0 && pCsr->iPrevIdiMinDocid) + )){ + pCsr->isEof = 1; + } + + return rc; +} + +/* +** Restart interation for expression pExpr so that the next call to +** fts3EvalNext() visits the first row. Do not allow incremental +** loading or merging of phrase doclists for this iteration. +** +** If *pRc is other than SQLITE_OK when this function is called, it is +** a no-op. If an error occurs within this function, *pRc is set to an +** SQLite error code before returning. +*/ +static void fts3EvalRestart( + Fts3Cursor *pCsr, + Fts3Expr *pExpr, + int *pRc +){ + if( pExpr && *pRc==SQLITE_OK ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + + if( pPhrase ){ + fts3EvalInvalidatePoslist(pPhrase); + if( pPhrase->bIncr ){ + int i; + for(i=0; inToken; i++){ + Fts3PhraseToken *pToken = &pPhrase->aToken[i]; + assert( pToken->pDeferred==0 ); + if( pToken->pSegcsr ){ + sqlite3Fts3MsrIncrRestart(pToken->pSegcsr); + } + } + *pRc = fts3EvalPhraseStart(pCsr, 0, pPhrase); + } + pPhrase->doclist.pNextDocid = 0; + pPhrase->doclist.iDocid = 0; + pPhrase->pOrPoslist = 0; + } + + pExpr->iDocid = 0; + pExpr->bEof = 0; + pExpr->bStart = 0; + + fts3EvalRestart(pCsr, pExpr->pLeft, pRc); + fts3EvalRestart(pCsr, pExpr->pRight, pRc); + } +} + +/* +** After allocating the Fts3Expr.aMI[] array for each phrase in the +** expression rooted at pExpr, the cursor iterates through all rows matched +** by pExpr, calling this function for each row. This function increments +** the values in Fts3Expr.aMI[] according to the position-list currently +** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase +** expression nodes. +*/ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ + if( pExpr ){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + if( pPhrase && pPhrase->doclist.pList ){ + int iCol = 0; + char *p = pPhrase->doclist.pList; + + do{ + u8 c = 0; + int iCnt = 0; + while( 0xFE & (*p | c) ){ + if( (c&0x80)==0 ) iCnt++; + c = *p++ & 0x80; + } + + /* aMI[iCol*3 + 1] = Number of occurrences + ** aMI[iCol*3 + 2] = Number of rows containing at least one instance + */ + pExpr->aMI[iCol*3 + 1] += iCnt; + pExpr->aMI[iCol*3 + 2] += (iCnt>0); + if( *p==0x00 ) break; + p++; + p += fts3GetVarint32(p, &iCol); + }while( iColpLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); + } +} + +/* +** Expression pExpr must be of type FTSQUERY_PHRASE. +** +** If it is not already allocated and populated, this function allocates and +** populates the Fts3Expr.aMI[] array for expression pExpr. If pExpr is part +** of a NEAR expression, then it also allocates and populates the same array +** for all other phrases that are part of the NEAR expression. +** +** SQLITE_OK is returned if the aMI[] array is successfully allocated and +** populated. Otherwise, if an error occurs, an SQLite error code is returned. +*/ +static int fts3EvalGatherStats( + Fts3Cursor *pCsr, /* Cursor object */ + Fts3Expr *pExpr /* FTSQUERY_PHRASE expression */ +){ + int rc = SQLITE_OK; /* Return code */ + + assert( pExpr->eType==FTSQUERY_PHRASE ); + if( pExpr->aMI==0 ){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + Fts3Expr *pRoot; /* Root of NEAR expression */ + Fts3Expr *p; /* Iterator used for several purposes */ + + sqlite3_int64 iPrevId = pCsr->iPrevId; + sqlite3_int64 iDocid; + u8 bEof; + + /* Find the root of the NEAR expression */ + pRoot = pExpr; + while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){ + pRoot = pRoot->pParent; + } + iDocid = pRoot->iDocid; + bEof = pRoot->bEof; + assert( pRoot->bStart ); + + /* Allocate space for the aMSI[] array of each FTSQUERY_PHRASE node */ + for(p=pRoot; p; p=p->pLeft){ + Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); + assert( pE->aMI==0 ); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); + if( !pE->aMI ) return SQLITE_NOMEM; + memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); + } + + fts3EvalRestart(pCsr, pRoot, &rc); + + while( pCsr->isEof==0 && rc==SQLITE_OK ){ + + do { + /* Ensure the %_content statement is reset. */ + if( pCsr->isRequireSeek==0 ) sqlite3_reset(pCsr->pStmt); + assert( sqlite3_data_count(pCsr->pStmt)==0 ); + + /* Advance to the next document */ + fts3EvalNextRow(pCsr, pRoot, &rc); + pCsr->isEof = pRoot->bEof; + pCsr->isRequireSeek = 1; + pCsr->isMatchinfoNeeded = 1; + pCsr->iPrevId = pRoot->iDocid; + }while( pCsr->isEof==0 + && pRoot->eType==FTSQUERY_NEAR + && sqlite3Fts3EvalTestDeferred(pCsr, &rc) + ); + + if( rc==SQLITE_OK && pCsr->isEof==0 ){ + fts3EvalUpdateCounts(pRoot, pTab->nColumn); + } + } + + pCsr->isEof = 0; + pCsr->iPrevId = iPrevId; + + if( bEof ){ + pRoot->bEof = bEof; + }else{ + /* Caution: pRoot may iterate through docids in ascending or descending + ** order. For this reason, even though it seems more defensive, the + ** do loop can not be written: + ** + ** do {...} while( pRoot->iDocidbEof==0 ); + if( pRoot->bEof ) rc = FTS_CORRUPT_VTAB; + }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK ); + } + } + return rc; +} + +/* +** This function is used by the matchinfo() module to query a phrase +** expression node for the following information: +** +** 1. The total number of occurrences of the phrase in each column of +** the FTS table (considering all rows), and +** +** 2. For each column, the number of rows in the table for which the +** column contains at least one instance of the phrase. +** +** If no error occurs, SQLITE_OK is returned and the values for each column +** written into the array aiOut as follows: +** +** aiOut[iCol*3 + 1] = Number of occurrences +** aiOut[iCol*3 + 2] = Number of rows containing at least one instance +** +** Caveats: +** +** * If a phrase consists entirely of deferred tokens, then all output +** values are set to the number of documents in the table. In other +** words we assume that very common tokens occur exactly once in each +** column of each row of the table. +** +** * If a phrase contains some deferred tokens (and some non-deferred +** tokens), count the potential occurrence identified by considering +** the non-deferred tokens instead of actual phrase occurrences. +** +** * If the phrase is part of a NEAR expression, then only phrase instances +** that meet the NEAR constraint are included in the counts. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats( + Fts3Cursor *pCsr, /* FTS cursor handle */ + Fts3Expr *pExpr, /* Phrase expression */ + u32 *aiOut /* Array to write results into (see above) */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int iCol; + + if( pExpr->bDeferred && pExpr->pParent->eType!=FTSQUERY_NEAR ){ + assert( pCsr->nDoc>0 ); + for(iCol=0; iColnColumn; iCol++){ + aiOut[iCol*3 + 1] = (u32)pCsr->nDoc; + aiOut[iCol*3 + 2] = (u32)pCsr->nDoc; + } + }else{ + rc = fts3EvalGatherStats(pCsr, pExpr); + if( rc==SQLITE_OK ){ + assert( pExpr->aMI ); + for(iCol=0; iColnColumn; iCol++){ + aiOut[iCol*3 + 1] = pExpr->aMI[iCol*3 + 1]; + aiOut[iCol*3 + 2] = pExpr->aMI[iCol*3 + 2]; + } + } + } + + return rc; +} + +/* +** The expression pExpr passed as the second argument to this function +** must be of type FTSQUERY_PHRASE. +** +** The returned value is either NULL or a pointer to a buffer containing +** a position-list indicating the occurrences of the phrase in column iCol +** of the current row. +** +** More specifically, the returned buffer contains 1 varint for each +** occurrence of the phrase in the column, stored using the normal (delta+2) +** compression and is terminated by either an 0x01 or 0x00 byte. For example, +** if the requested column contains "a b X c d X X" and the position-list +** for 'X' is requested, the buffer returned may contain: +** +** 0x04 0x05 0x03 0x01 or 0x04 0x05 0x03 0x00 +** +** This function works regardless of whether or not the phrase is deferred, +** incremental, or neither. +*/ +SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( + Fts3Cursor *pCsr, /* FTS3 cursor object */ + Fts3Expr *pExpr, /* Phrase to return doclist for */ + int iCol, /* Column to return position list for */ + char **ppOut /* OUT: Pointer to position list */ +){ + Fts3Phrase *pPhrase = pExpr->pPhrase; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + char *pIter; + int iThis; + sqlite3_int64 iDocid; + + /* If this phrase is applies specifically to some column other than + ** column iCol, return a NULL pointer. */ + *ppOut = 0; + assert( iCol>=0 && iColnColumn ); + if( (pPhrase->iColumnnColumn && pPhrase->iColumn!=iCol) ){ + return SQLITE_OK; + } + + iDocid = pExpr->iDocid; + pIter = pPhrase->doclist.pList; + if( iDocid!=pCsr->iPrevId || pExpr->bEof ){ + int rc = SQLITE_OK; + int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */ + int bOr = 0; + u8 bTreeEof = 0; + Fts3Expr *p; /* Used to iterate from pExpr to root */ + Fts3Expr *pNear; /* Most senior NEAR ancestor (or pExpr) */ + int bMatch; + + /* Check if this phrase descends from an OR expression node. If not, + ** return NULL. Otherwise, the entry that corresponds to docid + ** pCsr->iPrevId may lie earlier in the doclist buffer. Or, if the + ** tree that the node is part of has been marked as EOF, but the node + ** itself is not EOF, then it may point to an earlier entry. */ + pNear = pExpr; + for(p=pExpr->pParent; p; p=p->pParent){ + if( p->eType==FTSQUERY_OR ) bOr = 1; + if( p->eType==FTSQUERY_NEAR ) pNear = p; + if( p->bEof ) bTreeEof = 1; + } + if( bOr==0 ) return SQLITE_OK; + + /* This is the descendent of an OR node. In this case we cannot use + ** an incremental phrase. Load the entire doclist for the phrase + ** into memory in this case. */ + if( pPhrase->bIncr ){ + int bEofSave = pNear->bEof; + fts3EvalRestart(pCsr, pNear, &rc); + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + if( bEofSave==0 && pNear->iDocid==iDocid ) break; + } + assert( rc!=SQLITE_OK || pPhrase->bIncr==0 ); + if( rc==SQLITE_OK && pNear->bEof!=bEofSave ){ + rc = FTS_CORRUPT_VTAB; + } + } + if( bTreeEof ){ + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + } + } + if( rc!=SQLITE_OK ) return rc; + + bMatch = 1; + for(p=pNear; p; p=p->pLeft){ + u8 bEof = 0; + Fts3Expr *pTest = p; + Fts3Phrase *pPh; + assert( pTest->eType==FTSQUERY_NEAR || pTest->eType==FTSQUERY_PHRASE ); + if( pTest->eType==FTSQUERY_NEAR ) pTest = pTest->pRight; + assert( pTest->eType==FTSQUERY_PHRASE ); + pPh = pTest->pPhrase; + + pIter = pPh->pOrPoslist; + iDocid = pPh->iOrDocid; + if( pCsr->bDesc==bDescDoclist ){ + bEof = !pPh->doclist.nAll || + (pIter >= (pPh->doclist.aAll + pPh->doclist.nAll)); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){ + sqlite3Fts3DoclistNext( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &bEof + ); + } + }else{ + bEof = !pPh->doclist.nAll || (pIter && pIter<=pPh->doclist.aAll); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){ + int dummy; + sqlite3Fts3DoclistPrev( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &dummy, &bEof + ); + } + } + pPh->pOrPoslist = pIter; + pPh->iOrDocid = iDocid; + if( bEof || iDocid!=pCsr->iPrevId ) bMatch = 0; + } + + if( bMatch ){ + pIter = pPhrase->pOrPoslist; + }else{ + pIter = 0; + } + } + if( pIter==0 ) return SQLITE_OK; + + if( *pIter==0x01 ){ + pIter++; + pIter += fts3GetVarint32(pIter, &iThis); + }else{ + iThis = 0; + } + while( iThisdoclist, and +** * any Fts3MultiSegReader objects held by phrase tokens. +*/ +SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *pPhrase){ + if( pPhrase ){ + int i; + sqlite3_free(pPhrase->doclist.aAll); + fts3EvalInvalidatePoslist(pPhrase); + memset(&pPhrase->doclist, 0, sizeof(Fts3Doclist)); + for(i=0; inToken; i++){ + fts3SegReaderCursorFree(pPhrase->aToken[i].pSegcsr); + pPhrase->aToken[i].pSegcsr = 0; + } + } +} + + +/* +** Return SQLITE_CORRUPT_VTAB. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3Fts3Corrupt(){ + return SQLITE_CORRUPT_VTAB; +} +#endif + +#if !SQLITE_CORE +/* +** Initialize API pointer table, if required. +*/ +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_fts3_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3Fts3Init(db); +} +#endif + +#endif + +/************** End of fts3.c ************************************************/ +/************** Begin file fts3_aux.c ****************************************/ +/* +** 2011 Jan 27 +** +** 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. +** +****************************************************************************** +** +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +typedef struct Fts3auxTable Fts3auxTable; +typedef struct Fts3auxCursor Fts3auxCursor; + +struct Fts3auxTable { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts3Table *pFts3Tab; +}; + +struct Fts3auxCursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + Fts3MultiSegReader csr; /* Must be right after "base" */ + Fts3SegFilter filter; + char *zStop; + int nStop; /* Byte-length of string zStop */ + int iLangid; /* Language id to query */ + int isEof; /* True if cursor is at EOF */ + sqlite3_int64 iRowid; /* Current rowid */ + + int iCol; /* Current value of 'col' column */ + int nStat; /* Size of aStat[] array */ + struct Fts3auxColstats { + sqlite3_int64 nDoc; /* 'documents' values for current csr row */ + sqlite3_int64 nOcc; /* 'occurrences' values for current csr row */ + } *aStat; +}; + +/* +** Schema of the terms table. +*/ +#define FTS3_AUX_SCHEMA \ + "CREATE TABLE x(term, col, documents, occurrences, languageid HIDDEN)" + +/* +** This function does all the work for both the xConnect and xCreate methods. +** These tables have no persistent representation of their own, so xConnect +** and xCreate are identical operations. +*/ +static int fts3auxConnectMethod( + sqlite3 *db, /* Database connection */ + void *pUnused, /* Unused */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + char const *zDb; /* Name of database (e.g. "main") */ + char const *zFts3; /* Name of fts3 table */ + int nDb; /* Result of strlen(zDb) */ + int nFts3; /* Result of strlen(zFts3) */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ + int rc; /* value returned by declare_vtab() */ + Fts3auxTable *p; /* Virtual table object to return */ + + UNUSED_PARAMETER(pUnused); + + /* The user should invoke this in one of two forms: + ** + ** CREATE VIRTUAL TABLE xxx USING fts4aux(fts4-table); + ** CREATE VIRTUAL TABLE xxx USING fts4aux(fts4-table-db, fts4-table); + */ + if( argc!=4 && argc!=5 ) goto bad_args; + + zDb = argv[1]; + nDb = (int)strlen(zDb); + if( argc==5 ){ + if( nDb==4 && 0==sqlite3_strnicmp("temp", zDb, 4) ){ + zDb = argv[3]; + nDb = (int)strlen(zDb); + zFts3 = argv[4]; + }else{ + goto bad_args; + } + }else{ + zFts3 = argv[3]; + } + nFts3 = (int)strlen(zFts3); + + rc = sqlite3_declare_vtab(db, FTS3_AUX_SCHEMA); + if( rc!=SQLITE_OK ) return rc; + + nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; + p = (Fts3auxTable *)sqlite3_malloc64(nByte); + if( !p ) return SQLITE_NOMEM; + memset(p, 0, nByte); + + p->pFts3Tab = (Fts3Table *)&p[1]; + p->pFts3Tab->zDb = (char *)&p->pFts3Tab[1]; + p->pFts3Tab->zName = &p->pFts3Tab->zDb[nDb+1]; + p->pFts3Tab->db = db; + p->pFts3Tab->nIndex = 1; + + memcpy((char *)p->pFts3Tab->zDb, zDb, nDb); + memcpy((char *)p->pFts3Tab->zName, zFts3, nFts3); + sqlite3Fts3Dequote((char *)p->pFts3Tab->zName); + + *ppVtab = (sqlite3_vtab *)p; + return SQLITE_OK; + + bad_args: + sqlite3Fts3ErrMsg(pzErr, "invalid arguments to fts4aux constructor"); + return SQLITE_ERROR; +} + +/* +** This function does the work for both the xDisconnect and xDestroy methods. +** These tables have no persistent representation of their own, so xDisconnect +** and xDestroy are identical operations. +*/ +static int fts3auxDisconnectMethod(sqlite3_vtab *pVtab){ + Fts3auxTable *p = (Fts3auxTable *)pVtab; + Fts3Table *pFts3 = p->pFts3Tab; + int i; + + /* Free any prepared statements held */ + for(i=0; iaStmt); i++){ + sqlite3_finalize(pFts3->aStmt[i]); + } + sqlite3_free(pFts3->zSegmentsTbl); + sqlite3_free(p); + return SQLITE_OK; +} + +#define FTS4AUX_EQ_CONSTRAINT 1 +#define FTS4AUX_GE_CONSTRAINT 2 +#define FTS4AUX_LE_CONSTRAINT 4 + +/* +** xBestIndex - Analyze a WHERE and ORDER BY clause. +*/ +static int fts3auxBestIndexMethod( + sqlite3_vtab *pVTab, + sqlite3_index_info *pInfo +){ + int i; + int iEq = -1; + int iGe = -1; + int iLe = -1; + int iLangid = -1; + int iNext = 1; /* Next free argvIndex value */ + + UNUSED_PARAMETER(pVTab); + + /* This vtab delivers always results in "ORDER BY term ASC" order. */ + if( pInfo->nOrderBy==1 + && pInfo->aOrderBy[0].iColumn==0 + && pInfo->aOrderBy[0].desc==0 + ){ + pInfo->orderByConsumed = 1; + } + + /* Search for equality and range constraints on the "term" column. + ** And equality constraints on the hidden "languageid" column. */ + for(i=0; inConstraint; i++){ + if( pInfo->aConstraint[i].usable ){ + int op = pInfo->aConstraint[i].op; + int iCol = pInfo->aConstraint[i].iColumn; + + if( iCol==0 ){ + if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iEq = i; + if( op==SQLITE_INDEX_CONSTRAINT_LT ) iLe = i; + if( op==SQLITE_INDEX_CONSTRAINT_LE ) iLe = i; + if( op==SQLITE_INDEX_CONSTRAINT_GT ) iGe = i; + if( op==SQLITE_INDEX_CONSTRAINT_GE ) iGe = i; + } + if( iCol==4 ){ + if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iLangid = i; + } + } + } + + if( iEq>=0 ){ + pInfo->idxNum = FTS4AUX_EQ_CONSTRAINT; + pInfo->aConstraintUsage[iEq].argvIndex = iNext++; + pInfo->estimatedCost = 5; + }else{ + pInfo->idxNum = 0; + pInfo->estimatedCost = 20000; + if( iGe>=0 ){ + pInfo->idxNum += FTS4AUX_GE_CONSTRAINT; + pInfo->aConstraintUsage[iGe].argvIndex = iNext++; + pInfo->estimatedCost /= 2; + } + if( iLe>=0 ){ + pInfo->idxNum += FTS4AUX_LE_CONSTRAINT; + pInfo->aConstraintUsage[iLe].argvIndex = iNext++; + pInfo->estimatedCost /= 2; + } + } + if( iLangid>=0 ){ + pInfo->aConstraintUsage[iLangid].argvIndex = iNext++; + pInfo->estimatedCost--; + } + + return SQLITE_OK; +} + +/* +** xOpen - Open a cursor. +*/ +static int fts3auxOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts3auxCursor *pCsr; /* Pointer to cursor object to return */ + + UNUSED_PARAMETER(pVTab); + + pCsr = (Fts3auxCursor *)sqlite3_malloc(sizeof(Fts3auxCursor)); + if( !pCsr ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(Fts3auxCursor)); + + *ppCsr = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** xClose - Close a cursor. +*/ +static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + + sqlite3Fts3SegmentsClose(pFts3); + sqlite3Fts3SegReaderFinish(&pCsr->csr); + sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->zStop); + sqlite3_free(pCsr->aStat); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ + if( nSize>pCsr->nStat ){ + struct Fts3auxColstats *aNew; + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, + sizeof(struct Fts3auxColstats) * nSize + ); + if( aNew==0 ) return SQLITE_NOMEM; + memset(&aNew[pCsr->nStat], 0, + sizeof(struct Fts3auxColstats) * (nSize - pCsr->nStat) + ); + pCsr->aStat = aNew; + pCsr->nStat = nSize; + } + return SQLITE_OK; +} + +/* +** xNext - Advance the cursor to the next row, if any. +*/ +static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + int rc; + + /* Increment our pretend rowid value. */ + pCsr->iRowid++; + + for(pCsr->iCol++; pCsr->iColnStat; pCsr->iCol++){ + if( pCsr->aStat[pCsr->iCol].nDoc>0 ) return SQLITE_OK; + } + + rc = sqlite3Fts3SegReaderStep(pFts3, &pCsr->csr); + if( rc==SQLITE_ROW ){ + int i = 0; + int nDoclist = pCsr->csr.nDoclist; + char *aDoclist = pCsr->csr.aDoclist; + int iCol; + + int eState = 0; + + if( pCsr->zStop ){ + int n = (pCsr->nStopcsr.nTerm) ? pCsr->nStop : pCsr->csr.nTerm; + int mc = memcmp(pCsr->zStop, pCsr->csr.zTerm, n); + if( mc<0 || (mc==0 && pCsr->csr.nTerm>pCsr->nStop) ){ + pCsr->isEof = 1; + return SQLITE_OK; + } + } + + if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM; + memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat); + iCol = 0; + rc = SQLITE_OK; + + while( iaStat[0].nDoc++; + eState = 1; + iCol = 0; + break; + + /* State 1. In this state we are expecting either a 1, indicating + ** that the following integer will be a column number, or the + ** start of a position list for column 0. + ** + ** The only difference between state 1 and state 2 is that if the + ** integer encountered in state 1 is not 0 or 1, then we need to + ** increment the column 0 "nDoc" count for this term. + */ + case 1: + assert( iCol==0 ); + if( v>1 ){ + pCsr->aStat[1].nDoc++; + } + eState = 2; + /* fall through */ + + case 2: + if( v==0 ){ /* 0x00. Next integer will be a docid. */ + eState = 0; + }else if( v==1 ){ /* 0x01. Next integer will be a column number. */ + eState = 3; + }else{ /* 2 or greater. A position. */ + pCsr->aStat[iCol+1].nOcc++; + pCsr->aStat[0].nOcc++; + } + break; + + /* State 3. The integer just read is a column number. */ + default: assert( eState==3 ); + iCol = (int)v; + if( iCol<1 ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } + if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM; + pCsr->aStat[iCol+1].nDoc++; + eState = 2; + break; + } + } + + pCsr->iCol = 0; + }else{ + pCsr->isEof = 1; + } + return rc; +} + +/* +** xFilter - Initialize a cursor to point at the start of its data. +*/ +static int fts3auxFilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; + int rc; + int isScan = 0; + int iLangVal = 0; /* Language id to query */ + + int iEq = -1; /* Index of term=? value in apVal */ + int iGe = -1; /* Index of term>=? value in apVal */ + int iLe = -1; /* Index of term<=? value in apVal */ + int iLangid = -1; /* Index of languageid=? value in apVal */ + int iNext = 0; + + UNUSED_PARAMETER(nVal); + UNUSED_PARAMETER(idxStr); + + assert( idxStr==0 ); + assert( idxNum==FTS4AUX_EQ_CONSTRAINT || idxNum==0 + || idxNum==FTS4AUX_LE_CONSTRAINT || idxNum==FTS4AUX_GE_CONSTRAINT + || idxNum==(FTS4AUX_LE_CONSTRAINT|FTS4AUX_GE_CONSTRAINT) + ); + + if( idxNum==FTS4AUX_EQ_CONSTRAINT ){ + iEq = iNext++; + }else{ + isScan = 1; + if( idxNum & FTS4AUX_GE_CONSTRAINT ){ + iGe = iNext++; + } + if( idxNum & FTS4AUX_LE_CONSTRAINT ){ + iLe = iNext++; + } + } + if( iNextfilter.zTerm); + sqlite3Fts3SegReaderFinish(&pCsr->csr); + sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->aStat); + sqlite3_free(pCsr->zStop); + memset(&pCsr->csr, 0, ((u8*)&pCsr[1]) - (u8*)&pCsr->csr); + + pCsr->filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; + if( isScan ) pCsr->filter.flags |= FTS3_SEGMENT_SCAN; + + if( iEq>=0 || iGe>=0 ){ + const unsigned char *zStr = sqlite3_value_text(apVal[0]); + assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); + if( zStr ){ + pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); + if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); + } + } + + if( iLe>=0 ){ + pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); + if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = (int)strlen(pCsr->zStop); + } + + if( iLangid>=0 ){ + iLangVal = sqlite3_value_int(apVal[iLangid]); + + /* If the user specified a negative value for the languageid, use zero + ** instead. This works, as the "languageid=?" constraint will also + ** be tested by the VDBE layer. The test will always be false (since + ** this module will not return a row with a negative languageid), and + ** so the overall query will return zero rows. */ + if( iLangVal<0 ) iLangVal = 0; + } + pCsr->iLangid = iLangVal; + + rc = sqlite3Fts3SegReaderCursor(pFts3, iLangVal, 0, FTS3_SEGCURSOR_ALL, + pCsr->filter.zTerm, pCsr->filter.nTerm, 0, isScan, &pCsr->csr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3SegReaderStart(pFts3, &pCsr->csr, &pCsr->filter); + } + + if( rc==SQLITE_OK ) rc = fts3auxNextMethod(pCursor); + return rc; +} + +/* +** xEof - Return true if the cursor is at EOF, or false otherwise. +*/ +static int fts3auxEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + return pCsr->isEof; +} + +/* +** xColumn - Return a column value. +*/ +static int fts3auxColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts3auxCursor *p = (Fts3auxCursor *)pCursor; + + assert( p->isEof==0 ); + switch( iCol ){ + case 0: /* term */ + sqlite3_result_text(pCtx, p->csr.zTerm, p->csr.nTerm, SQLITE_TRANSIENT); + break; + + case 1: /* col */ + if( p->iCol ){ + sqlite3_result_int(pCtx, p->iCol-1); + }else{ + sqlite3_result_text(pCtx, "*", -1, SQLITE_STATIC); + } + break; + + case 2: /* documents */ + sqlite3_result_int64(pCtx, p->aStat[p->iCol].nDoc); + break; + + case 3: /* occurrences */ + sqlite3_result_int64(pCtx, p->aStat[p->iCol].nOcc); + break; + + default: /* languageid */ + assert( iCol==4 ); + sqlite3_result_int(pCtx, p->iLangid); + break; + } + + return SQLITE_OK; +} + +/* +** xRowid - Return the current rowid for the cursor. +*/ +static int fts3auxRowidMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite_int64 *pRowid /* OUT: Rowid value */ +){ + Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor; + *pRowid = pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Register the fts3aux module with database connection db. Return SQLITE_OK +** if successful or an error code if sqlite3_create_module() fails. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ + static const sqlite3_module fts3aux_module = { + 0, /* iVersion */ + fts3auxConnectMethod, /* xCreate */ + fts3auxConnectMethod, /* xConnect */ + fts3auxBestIndexMethod, /* xBestIndex */ + fts3auxDisconnectMethod, /* xDisconnect */ + fts3auxDisconnectMethod, /* xDestroy */ + fts3auxOpenMethod, /* xOpen */ + fts3auxCloseMethod, /* xClose */ + fts3auxFilterMethod, /* xFilter */ + fts3auxNextMethod, /* xNext */ + fts3auxEofMethod, /* xEof */ + fts3auxColumnMethod, /* xColumn */ + fts3auxRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ + }; + int rc; /* Return code */ + + rc = sqlite3_create_module(db, "fts4aux", &fts3aux_module, 0); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_aux.c ********************************************/ +/************** Begin file fts3_expr.c ***************************************/ +/* +** 2008 Nov 28 +** +** 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 module contains code that implements a parser for fts3 query strings +** (the right-hand argument to the MATCH operator). Because the supported +** syntax is relatively simple, the whole tokenizer/parser system is +** hand-coded. +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* +** By default, this module parses the legacy syntax that has been +** traditionally used by fts3. Or, if SQLITE_ENABLE_FTS3_PARENTHESIS +** is defined, then it uses the new syntax. The differences between +** the new and the old syntaxes are: +** +** a) The new syntax supports parenthesis. The old does not. +** +** b) The new syntax supports the AND and NOT operators. The old does not. +** +** c) The old syntax supports the "-" token qualifier. This is not +** supported by the new syntax (it is replaced by the NOT operator). +** +** d) When using the old syntax, the OR operator has a greater precedence +** than an implicit AND. When using the new, both implicity and explicit +** AND operators have a higher precedence than OR. +** +** If compiled with SQLITE_TEST defined, then this module exports the +** symbol "int sqlite3_fts3_enable_parentheses". Setting this variable +** to zero causes the module to use the old syntax. If it is set to +** non-zero the new syntax is activated. This is so both syntaxes can +** be tested using a single build of testfixture. +** +** The following describes the syntax supported by the fts3 MATCH +** operator in a similar format to that used by the lemon parser +** generator. This module does not use actually lemon, it uses a +** custom parser. +** +** query ::= andexpr (OR andexpr)*. +** +** andexpr ::= notexpr (AND? notexpr)*. +** +** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*. +** notexpr ::= LP query RP. +** +** nearexpr ::= phrase (NEAR distance_opt nearexpr)*. +** +** distance_opt ::= . +** distance_opt ::= / INTEGER. +** +** phrase ::= TOKEN. +** phrase ::= COLUMN:TOKEN. +** phrase ::= "TOKEN TOKEN TOKEN...". +*/ + +#ifdef SQLITE_TEST +SQLITE_API int sqlite3_fts3_enable_parentheses = 0; +#else +# ifdef SQLITE_ENABLE_FTS3_PARENTHESIS +# define sqlite3_fts3_enable_parentheses 1 +# else +# define sqlite3_fts3_enable_parentheses 0 +# endif +#endif + +/* +** Default span for NEAR operators. +*/ +#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10 + +/* #include */ +/* #include */ + +/* +** isNot: +** This variable is used by function getNextNode(). When getNextNode() is +** called, it sets ParseContext.isNot to true if the 'next node' is a +** FTSQUERY_PHRASE with a unary "-" attached to it. i.e. "mysql" in the +** FTS3 query "sqlite -mysql". Otherwise, ParseContext.isNot is set to +** zero. +*/ +typedef struct ParseContext ParseContext; +struct ParseContext { + sqlite3_tokenizer *pTokenizer; /* Tokenizer module */ + int iLangid; /* Language id used with tokenizer */ + const char **azCol; /* Array of column names for fts3 table */ + int bFts4; /* True to allow FTS4-only syntax */ + int nCol; /* Number of entries in azCol[] */ + int iDefaultCol; /* Default column to query */ + int isNot; /* True if getNextNode() sees a unary - */ + sqlite3_context *pCtx; /* Write error message here */ + int nNest; /* Number of nested brackets */ +}; + +/* +** This function is equivalent to the standard isspace() function. +** +** The standard isspace() can be awkward to use safely, because although it +** is defined to accept an argument of type int, its behavior when passed +** an integer that falls outside of the range of the unsigned char type +** is undefined (and sometimes, "undefined" means segfault). This wrapper +** is defined to accept an argument of type char, and always returns 0 for +** any values that fall outside of the range of the unsigned char type (i.e. +** negative values). +*/ +static int fts3isspace(char c){ + return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f'; +} + +/* +** Allocate nByte bytes of memory using sqlite3_malloc(). If successful, +** zero the memory before returning a pointer to it. If unsuccessful, +** return NULL. +*/ +SQLITE_PRIVATE void *sqlite3Fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); + if( pRet ) memset(pRet, 0, nByte); + return pRet; +} + +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer( + sqlite3_tokenizer *pTokenizer, + int iLangid, + const char *z, + int n, + sqlite3_tokenizer_cursor **ppCsr +){ + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCsr = 0; + int rc; + + rc = pModule->xOpen(pTokenizer, z, n, &pCsr); + assert( rc==SQLITE_OK || pCsr==0 ); + if( rc==SQLITE_OK ){ + pCsr->pTokenizer = pTokenizer; + if( pModule->iVersion>=1 ){ + rc = pModule->xLanguageid(pCsr, iLangid); + if( rc!=SQLITE_OK ){ + pModule->xClose(pCsr); + pCsr = 0; + } + } + } + *ppCsr = pCsr; + return rc; +} + +/* +** Function getNextNode(), which is called by fts3ExprParse(), may itself +** call fts3ExprParse(). So this forward declaration is required. +*/ +static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *); + +/* +** Extract the next token from buffer z (length n) using the tokenizer +** and other information (column names etc.) in pParse. Create an Fts3Expr +** structure of type FTSQUERY_PHRASE containing a phrase consisting of this +** single token and set *ppExpr to point to it. If the end of the buffer is +** reached before a token is found, set *ppExpr to zero. It is the +** responsibility of the caller to eventually deallocate the allocated +** Fts3Expr structure (if any) by passing it to sqlite3_free(). +** +** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation +** fails. +*/ +static int getNextToken( + ParseContext *pParse, /* fts3 query parse context */ + int iCol, /* Value for Fts3Phrase.iColumn */ + const char *z, int n, /* Input string */ + Fts3Expr **ppExpr, /* OUT: expression */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + int rc; + sqlite3_tokenizer_cursor *pCursor; + Fts3Expr *pRet = 0; + int i = 0; + + /* Set variable i to the maximum number of bytes of input to tokenize. */ + for(i=0; iiLangid, z, i, &pCursor); + if( rc==SQLITE_OK ){ + const char *zToken; + int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; + sqlite3_int64 nByte; /* total space to allocate */ + + rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); + if( rc==SQLITE_OK ){ + nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; + pRet = (Fts3Expr *)sqlite3Fts3MallocZero(nByte); + if( !pRet ){ + rc = SQLITE_NOMEM; + }else{ + pRet->eType = FTSQUERY_PHRASE; + pRet->pPhrase = (Fts3Phrase *)&pRet[1]; + pRet->pPhrase->nToken = 1; + pRet->pPhrase->iColumn = iCol; + pRet->pPhrase->aToken[0].n = nToken; + pRet->pPhrase->aToken[0].z = (char *)&pRet->pPhrase[1]; + memcpy(pRet->pPhrase->aToken[0].z, zToken, nToken); + + if( iEndpPhrase->aToken[0].isPrefix = 1; + iEnd++; + } + + while( 1 ){ + if( !sqlite3_fts3_enable_parentheses + && iStart>0 && z[iStart-1]=='-' + ){ + pParse->isNot = 1; + iStart--; + }else if( pParse->bFts4 && iStart>0 && z[iStart-1]=='^' ){ + pRet->pPhrase->aToken[0].bFirst = 1; + iStart--; + }else{ + break; + } + } + + } + *pnConsumed = iEnd; + }else if( i && rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + + pModule->xClose(pCursor); + } + + *ppExpr = pRet; + return rc; +} + + +/* +** Enlarge a memory allocation. If an out-of-memory allocation occurs, +** then free the old allocation. +*/ +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); + if( !pRet ){ + sqlite3_free(pOrig); + } + return pRet; +} + +/* +** Buffer zInput, length nInput, contains the contents of a quoted string +** that appeared as part of an fts3 query expression. Neither quote character +** is included in the buffer. This function attempts to tokenize the entire +** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE +** containing the results. +** +** If successful, SQLITE_OK is returned and *ppExpr set to point at the +** allocated Fts3Expr structure. Otherwise, either SQLITE_NOMEM (out of memory +** error) or SQLITE_ERROR (tokenization error) is returned and *ppExpr set +** to 0. +*/ +static int getNextString( + ParseContext *pParse, /* fts3 query parse context */ + const char *zInput, int nInput, /* Input string */ + Fts3Expr **ppExpr /* OUT: expression */ +){ + sqlite3_tokenizer *pTokenizer = pParse->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + int rc; + Fts3Expr *p = 0; + sqlite3_tokenizer_cursor *pCursor = 0; + char *zTemp = 0; + int nTemp = 0; + + const int nSpace = sizeof(Fts3Expr) + sizeof(Fts3Phrase); + int nToken = 0; + + /* The final Fts3Expr data structure, including the Fts3Phrase, + ** Fts3PhraseToken structures token buffers are all stored as a single + ** allocation so that the expression can be freed with a single call to + ** sqlite3_free(). Setting this up requires a two pass approach. + ** + ** The first pass, in the block below, uses a tokenizer cursor to iterate + ** through the tokens in the expression. This pass uses fts3ReallocOrFree() + ** to assemble data in two dynamic buffers: + ** + ** Buffer p: Points to the Fts3Expr structure, followed by the Fts3Phrase + ** structure, followed by the array of Fts3PhraseToken + ** structures. This pass only populates the Fts3PhraseToken array. + ** + ** Buffer zTemp: Contains copies of all tokens. + ** + ** The second pass, in the block that begins "if( rc==SQLITE_DONE )" below, + ** appends buffer zTemp to buffer p, and fills in the Fts3Expr and Fts3Phrase + ** structures. + */ + rc = sqlite3Fts3OpenTokenizer( + pTokenizer, pParse->iLangid, zInput, nInput, &pCursor); + if( rc==SQLITE_OK ){ + int ii; + for(ii=0; rc==SQLITE_OK; ii++){ + const char *zByte; + int nByte = 0, iBegin = 0, iEnd = 0, iPos = 0; + rc = pModule->xNext(pCursor, &zByte, &nByte, &iBegin, &iEnd, &iPos); + if( rc==SQLITE_OK ){ + Fts3PhraseToken *pToken; + + p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken)); + if( !p ) goto no_mem; + + zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte); + if( !zTemp ) goto no_mem; + + assert( nToken==ii ); + pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii]; + memset(pToken, 0, sizeof(Fts3PhraseToken)); + + memcpy(&zTemp[nTemp], zByte, nByte); + nTemp += nByte; + + pToken->n = nByte; + pToken->isPrefix = (iEndbFirst = (iBegin>0 && zInput[iBegin-1]=='^'); + nToken = ii+1; + } + } + + pModule->xClose(pCursor); + pCursor = 0; + } + + if( rc==SQLITE_DONE ){ + int jj; + char *zBuf = 0; + + p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp); + if( !p ) goto no_mem; + memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p); + p->eType = FTSQUERY_PHRASE; + p->pPhrase = (Fts3Phrase *)&p[1]; + p->pPhrase->iColumn = pParse->iDefaultCol; + p->pPhrase->nToken = nToken; + + zBuf = (char *)&p->pPhrase->aToken[nToken]; + if( zTemp ){ + memcpy(zBuf, zTemp, nTemp); + sqlite3_free(zTemp); + }else{ + assert( nTemp==0 ); + } + + for(jj=0; jjpPhrase->nToken; jj++){ + p->pPhrase->aToken[jj].z = zBuf; + zBuf += p->pPhrase->aToken[jj].n; + } + rc = SQLITE_OK; + } + + *ppExpr = p; + return rc; +no_mem: + + if( pCursor ){ + pModule->xClose(pCursor); + } + sqlite3_free(zTemp); + sqlite3_free(p); + *ppExpr = 0; + return SQLITE_NOMEM; +} + +/* +** The output variable *ppExpr is populated with an allocated Fts3Expr +** structure, or set to 0 if the end of the input buffer is reached. +** +** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM +** if a malloc failure occurs, or SQLITE_ERROR if a parse error is encountered. +** If SQLITE_ERROR is returned, pContext is populated with an error message. +*/ +static int getNextNode( + ParseContext *pParse, /* fts3 query parse context */ + const char *z, int n, /* Input string */ + Fts3Expr **ppExpr, /* OUT: expression */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + static const struct Fts3Keyword { + char *z; /* Keyword text */ + unsigned char n; /* Length of the keyword */ + unsigned char parenOnly; /* Only valid in paren mode */ + unsigned char eType; /* Keyword code */ + } aKeyword[] = { + { "OR" , 2, 0, FTSQUERY_OR }, + { "AND", 3, 1, FTSQUERY_AND }, + { "NOT", 3, 1, FTSQUERY_NOT }, + { "NEAR", 4, 0, FTSQUERY_NEAR } + }; + int ii; + int iCol; + int iColLen; + int rc; + Fts3Expr *pRet = 0; + + const char *zInput = z; + int nInput = n; + + pParse->isNot = 0; + + /* Skip over any whitespace before checking for a keyword, an open or + ** close bracket, or a quoted string. + */ + while( nInput>0 && fts3isspace(*zInput) ){ + nInput--; + zInput++; + } + if( nInput==0 ){ + return SQLITE_DONE; + } + + /* See if we are dealing with a keyword. */ + for(ii=0; ii<(int)(sizeof(aKeyword)/sizeof(struct Fts3Keyword)); ii++){ + const struct Fts3Keyword *pKey = &aKeyword[ii]; + + if( (pKey->parenOnly & ~sqlite3_fts3_enable_parentheses)!=0 ){ + continue; + } + + if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){ + int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM; + int nKey = pKey->n; + char cNext; + + /* If this is a "NEAR" keyword, check for an explicit nearness. */ + if( pKey->eType==FTSQUERY_NEAR ){ + assert( nKey==4 ); + if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ + nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear); + } + } + + /* At this point this is probably a keyword. But for that to be true, + ** the next byte must contain either whitespace, an open or close + ** parenthesis, a quote character, or EOF. + */ + cNext = zInput[nKey]; + if( fts3isspace(cNext) + || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 + ){ + pRet = (Fts3Expr *)sqlite3Fts3MallocZero(sizeof(Fts3Expr)); + if( !pRet ){ + return SQLITE_NOMEM; + } + pRet->eType = pKey->eType; + pRet->nNear = nNear; + *ppExpr = pRet; + *pnConsumed = (int)((zInput - z) + nKey); + return SQLITE_OK; + } + + /* Turns out that wasn't a keyword after all. This happens if the + ** user has supplied a token such as "ORacle". Continue. + */ + } + } + + /* See if we are dealing with a quoted phrase. If this is the case, then + ** search for the closing quote and pass the whole string to getNextString() + ** for processing. This is easy to do, as fts3 has no syntax for escaping + ** a quote character embedded in a string. + */ + if( *zInput=='"' ){ + for(ii=1; iinNest++; +#if !defined(SQLITE_MAX_EXPR_DEPTH) + if( pParse->nNest>1000 ) return SQLITE_ERROR; +#elif SQLITE_MAX_EXPR_DEPTH>0 + if( pParse->nNest>SQLITE_MAX_EXPR_DEPTH ) return SQLITE_ERROR; +#endif + rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); + *pnConsumed = (int)(zInput - z) + 1 + nConsumed; + return rc; + }else if( *zInput==')' ){ + pParse->nNest--; + *pnConsumed = (int)((zInput - z) + 1); + *ppExpr = 0; + return SQLITE_DONE; + } + } + + /* If control flows to this point, this must be a regular token, or + ** the end of the input. Read a regular token using the sqlite3_tokenizer + ** interface. Before doing so, figure out if there is an explicit + ** column specifier for the token. + ** + ** TODO: Strangely, it is not possible to associate a column specifier + ** with a quoted phrase, only with a single token. Not sure if this was + ** an implementation artifact or an intentional decision when fts3 was + ** first implemented. Whichever it was, this module duplicates the + ** limitation. + */ + iCol = pParse->iDefaultCol; + iColLen = 0; + for(ii=0; iinCol; ii++){ + const char *zStr = pParse->azCol[ii]; + int nStr = (int)strlen(zStr); + if( nInput>nStr && zInput[nStr]==':' + && sqlite3_strnicmp(zStr, zInput, nStr)==0 + ){ + iCol = ii; + iColLen = (int)((zInput - z) + nStr + 1); + break; + } + } + rc = getNextToken(pParse, iCol, &z[iColLen], n-iColLen, ppExpr, pnConsumed); + *pnConsumed += iColLen; + return rc; +} + +/* +** The argument is an Fts3Expr structure for a binary operator (any type +** except an FTSQUERY_PHRASE). Return an integer value representing the +** precedence of the operator. Lower values have a higher precedence (i.e. +** group more tightly). For example, in the C language, the == operator +** groups more tightly than ||, and would therefore have a higher precedence. +** +** When using the new fts3 query syntax (when SQLITE_ENABLE_FTS3_PARENTHESIS +** is defined), the order of the operators in precedence from highest to +** lowest is: +** +** NEAR +** NOT +** AND (including implicit ANDs) +** OR +** +** Note that when using the old query syntax, the OR operator has a higher +** precedence than the AND operator. +*/ +static int opPrecedence(Fts3Expr *p){ + assert( p->eType!=FTSQUERY_PHRASE ); + if( sqlite3_fts3_enable_parentheses ){ + return p->eType; + }else if( p->eType==FTSQUERY_NEAR ){ + return 1; + }else if( p->eType==FTSQUERY_OR ){ + return 2; + } + assert( p->eType==FTSQUERY_AND ); + return 3; +} + +/* +** Argument ppHead contains a pointer to the current head of a query +** expression tree being parsed. pPrev is the expression node most recently +** inserted into the tree. This function adds pNew, which is always a binary +** operator node, into the expression tree based on the relative precedence +** of pNew and the existing nodes of the tree. This may result in the head +** of the tree changing, in which case *ppHead is set to the new root node. +*/ +static void insertBinaryOperator( + Fts3Expr **ppHead, /* Pointer to the root node of a tree */ + Fts3Expr *pPrev, /* Node most recently inserted into the tree */ + Fts3Expr *pNew /* New binary node to insert into expression tree */ +){ + Fts3Expr *pSplit = pPrev; + while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){ + pSplit = pSplit->pParent; + } + + if( pSplit->pParent ){ + assert( pSplit->pParent->pRight==pSplit ); + pSplit->pParent->pRight = pNew; + pNew->pParent = pSplit->pParent; + }else{ + *ppHead = pNew; + } + pNew->pLeft = pSplit; + pSplit->pParent = pNew; +} + +/* +** Parse the fts3 query expression found in buffer z, length n. This function +** returns either when the end of the buffer is reached or an unmatched +** closing bracket - ')' - is encountered. +** +** If successful, SQLITE_OK is returned, *ppExpr is set to point to the +** parsed form of the expression and *pnConsumed is set to the number of +** bytes read from buffer z. Otherwise, *ppExpr is set to 0 and SQLITE_NOMEM +** (out of memory error) or SQLITE_ERROR (parse error) is returned. +*/ +static int fts3ExprParse( + ParseContext *pParse, /* fts3 query parse context */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr, /* OUT: Parsed query structure */ + int *pnConsumed /* OUT: Number of bytes consumed */ +){ + Fts3Expr *pRet = 0; + Fts3Expr *pPrev = 0; + Fts3Expr *pNotBranch = 0; /* Only used in legacy parse mode */ + int nIn = n; + const char *zIn = z; + int rc = SQLITE_OK; + int isRequirePhrase = 1; + + while( rc==SQLITE_OK ){ + Fts3Expr *p = 0; + int nByte = 0; + + rc = getNextNode(pParse, zIn, nIn, &p, &nByte); + assert( nByte>0 || (rc!=SQLITE_OK && p==0) ); + if( rc==SQLITE_OK ){ + if( p ){ + int isPhrase; + + if( !sqlite3_fts3_enable_parentheses + && p->eType==FTSQUERY_PHRASE && pParse->isNot + ){ + /* Create an implicit NOT operator. */ + Fts3Expr *pNot = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); + if( !pNot ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + pNot->eType = FTSQUERY_NOT; + pNot->pRight = p; + p->pParent = pNot; + if( pNotBranch ){ + pNot->pLeft = pNotBranch; + pNotBranch->pParent = pNot; + } + pNotBranch = pNot; + p = pPrev; + }else{ + int eType = p->eType; + isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft); + + /* The isRequirePhrase variable is set to true if a phrase or + ** an expression contained in parenthesis is required. If a + ** binary operator (AND, OR, NOT or NEAR) is encounted when + ** isRequirePhrase is set, this is a syntax error. + */ + if( !isPhrase && isRequirePhrase ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_ERROR; + goto exprparse_out; + } + + if( isPhrase && !isRequirePhrase ){ + /* Insert an implicit AND operator. */ + Fts3Expr *pAnd; + assert( pRet && pPrev ); + pAnd = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); + if( !pAnd ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_NOMEM; + goto exprparse_out; + } + pAnd->eType = FTSQUERY_AND; + insertBinaryOperator(&pRet, pPrev, pAnd); + pPrev = pAnd; + } + + /* This test catches attempts to make either operand of a NEAR + ** operator something other than a phrase. For example, either of + ** the following: + ** + ** (bracketed expression) NEAR phrase + ** phrase NEAR (bracketed expression) + ** + ** Return an error in either case. + */ + if( pPrev && ( + (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE) + || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR) + )){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_ERROR; + goto exprparse_out; + } + + if( isPhrase ){ + if( pRet ){ + assert( pPrev && pPrev->pLeft && pPrev->pRight==0 ); + pPrev->pRight = p; + p->pParent = pPrev; + }else{ + pRet = p; + } + }else{ + insertBinaryOperator(&pRet, pPrev, p); + } + isRequirePhrase = !isPhrase; + } + pPrev = p; + } + assert( nByte>0 ); + } + assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) ); + nIn -= nByte; + zIn += nByte; + } + + if( rc==SQLITE_DONE && pRet && isRequirePhrase ){ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + if( !sqlite3_fts3_enable_parentheses && pNotBranch ){ + if( !pRet ){ + rc = SQLITE_ERROR; + }else{ + Fts3Expr *pIter = pNotBranch; + while( pIter->pLeft ){ + pIter = pIter->pLeft; + } + pIter->pLeft = pRet; + pRet->pParent = pIter; + pRet = pNotBranch; + } + } + } + *pnConsumed = n - nIn; + +exprparse_out: + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRet); + sqlite3Fts3ExprFree(pNotBranch); + pRet = 0; + } + *ppExpr = pRet; + return rc; +} + +/* +** Return SQLITE_ERROR if the maximum depth of the expression tree passed +** as the only argument is more than nMaxDepth. +*/ +static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){ + int rc = SQLITE_OK; + if( p ){ + if( nMaxDepth<0 ){ + rc = SQLITE_TOOBIG; + }else{ + rc = fts3ExprCheckDepth(p->pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprCheckDepth(p->pRight, nMaxDepth-1); + } + } + } + return rc; +} + +/* +** This function attempts to transform the expression tree at (*pp) to +** an equivalent but more balanced form. The tree is modified in place. +** If successful, SQLITE_OK is returned and (*pp) set to point to the +** new root expression node. +** +** nMaxDepth is the maximum allowable depth of the balanced sub-tree. +** +** Otherwise, if an error occurs, an SQLite error code is returned and +** expression (*pp) freed. +*/ +static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ + int rc = SQLITE_OK; /* Return code */ + Fts3Expr *pRoot = *pp; /* Initial root node */ + Fts3Expr *pFree = 0; /* List of free nodes. Linked by pParent. */ + int eType = pRoot->eType; /* Type of node in this tree */ + + if( nMaxDepth==0 ){ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_OK ){ + if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ + Fts3Expr **apLeaf; + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); + if( 0==apLeaf ){ + rc = SQLITE_NOMEM; + }else{ + memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); + } + + if( rc==SQLITE_OK ){ + int i; + Fts3Expr *p; + + /* Set $p to point to the left-most leaf in the tree of eType nodes. */ + for(p=pRoot; p->eType==eType; p=p->pLeft){ + assert( p->pParent==0 || p->pParent->pLeft==p ); + assert( p->pLeft && p->pRight ); + } + + /* This loop runs once for each leaf in the tree of eType nodes. */ + while( 1 ){ + int iLvl; + Fts3Expr *pParent = p->pParent; /* Current parent of p */ + + assert( pParent==0 || pParent->pLeft==p ); + p->pParent = 0; + if( pParent ){ + pParent->pLeft = 0; + }else{ + pRoot = 0; + } + rc = fts3ExprBalance(&p, nMaxDepth-1); + if( rc!=SQLITE_OK ) break; + + for(iLvl=0; p && iLvlpLeft = apLeaf[iLvl]; + pFree->pRight = p; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + apLeaf[iLvl] = 0; + } + } + if( p ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_TOOBIG; + break; + } + + /* If that was the last leaf node, break out of the loop */ + if( pParent==0 ) break; + + /* Set $p to point to the next leaf in the tree of eType nodes */ + for(p=pParent->pRight; p->eType==eType; p=p->pLeft); + + /* Remove pParent from the original tree. */ + assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); + pParent->pRight->pParent = pParent->pParent; + if( pParent->pParent ){ + pParent->pParent->pLeft = pParent->pRight; + }else{ + assert( pParent==pRoot ); + pRoot = pParent->pRight; + } + + /* Link pParent into the free node list. It will be used as an + ** internal node of the new tree. */ + pParent->pParent = pFree; + pFree = pParent; + } + + if( rc==SQLITE_OK ){ + p = 0; + for(i=0; ipParent = 0; + }else{ + assert( pFree!=0 ); + pFree->pRight = p; + pFree->pLeft = apLeaf[i]; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + } + } + } + pRoot = p; + }else{ + /* An error occurred. Delete the contents of the apLeaf[] array + ** and pFree list. Everything else is cleaned up by the call to + ** sqlite3Fts3ExprFree(pRoot) below. */ + Fts3Expr *pDel; + for(i=0; ipParent; + sqlite3_free(pDel); + } + } + + assert( pFree==0 ); + sqlite3_free( apLeaf ); + } + }else if( eType==FTSQUERY_NOT ){ + Fts3Expr *pLeft = pRoot->pLeft; + Fts3Expr *pRight = pRoot->pRight; + + pRoot->pLeft = 0; + pRoot->pRight = 0; + pLeft->pParent = 0; + pRight->pParent = 0; + + rc = fts3ExprBalance(&pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprBalance(&pRight, nMaxDepth-1); + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRight); + sqlite3Fts3ExprFree(pLeft); + }else{ + assert( pLeft && pRight ); + pRoot->pLeft = pLeft; + pLeft->pParent = pRoot; + pRoot->pRight = pRight; + pRight->pParent = pRoot; + } + } + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRoot); + pRoot = 0; + } + *pp = pRoot; + return rc; +} + +/* +** This function is similar to sqlite3Fts3ExprParse(), with the following +** differences: +** +** 1. It does not do expression rebalancing. +** 2. It does not check that the expression does not exceed the +** maximum allowable depth. +** 3. Even if it fails, *ppExpr may still be set to point to an +** expression tree. It should be deleted using sqlite3Fts3ExprFree() +** in this case. +*/ +static int fts3ExprParseUnbalanced( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + int iLangid, /* Language id for tokenizer */ + char **azCol, /* Array of column names for fts3 table */ + int bFts4, /* True to allow FTS4-only syntax */ + int nCol, /* Number of entries in azCol[] */ + int iDefaultCol, /* Default column to query */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr /* OUT: Parsed query structure */ +){ + int nParsed; + int rc; + ParseContext sParse; + + memset(&sParse, 0, sizeof(ParseContext)); + sParse.pTokenizer = pTokenizer; + sParse.iLangid = iLangid; + sParse.azCol = (const char **)azCol; + sParse.nCol = nCol; + sParse.iDefaultCol = iDefaultCol; + sParse.bFts4 = bFts4; + if( z==0 ){ + *ppExpr = 0; + return SQLITE_OK; + } + if( n<0 ){ + n = (int)strlen(z); + } + rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed); + assert( rc==SQLITE_OK || *ppExpr==0 ); + + /* Check for mismatched parenthesis */ + if( rc==SQLITE_OK && sParse.nNest ){ + rc = SQLITE_ERROR; + } + + return rc; +} + +/* +** Parameters z and n contain a pointer to and length of a buffer containing +** an fts3 query expression, respectively. This function attempts to parse the +** query expression and create a tree of Fts3Expr structures representing the +** parsed expression. If successful, *ppExpr is set to point to the head +** of the parsed expression tree and SQLITE_OK is returned. If an error +** occurs, either SQLITE_NOMEM (out-of-memory error) or SQLITE_ERROR (parse +** error) is returned and *ppExpr is set to 0. +** +** If parameter n is a negative number, then z is assumed to point to a +** nul-terminated string and the length is determined using strlen(). +** +** The first parameter, pTokenizer, is passed the fts3 tokenizer module to +** use to normalize query tokens while parsing the expression. The azCol[] +** array, which is assumed to contain nCol entries, should contain the names +** of each column in the target fts3 table, in order from left to right. +** Column names must be nul-terminated strings. +** +** The iDefaultCol parameter should be passed the index of the table column +** that appears on the left-hand-side of the MATCH operator (the default +** column to match against for tokens for which a column name is not explicitly +** specified as part of the query string), or -1 if tokens may by default +** match any table column. +*/ +SQLITE_PRIVATE int sqlite3Fts3ExprParse( + sqlite3_tokenizer *pTokenizer, /* Tokenizer module */ + int iLangid, /* Language id for tokenizer */ + char **azCol, /* Array of column names for fts3 table */ + int bFts4, /* True to allow FTS4-only syntax */ + int nCol, /* Number of entries in azCol[] */ + int iDefaultCol, /* Default column to query */ + const char *z, int n, /* Text of MATCH query */ + Fts3Expr **ppExpr, /* OUT: Parsed query structure */ + char **pzErr /* OUT: Error message (sqlite3_malloc) */ +){ + int rc = fts3ExprParseUnbalanced( + pTokenizer, iLangid, azCol, bFts4, nCol, iDefaultCol, z, n, ppExpr + ); + + /* Rebalance the expression. And check that its depth does not exceed + ** SQLITE_FTS3_MAX_EXPR_DEPTH. */ + if( rc==SQLITE_OK && *ppExpr ){ + rc = fts3ExprBalance(ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); + if( rc==SQLITE_OK ){ + rc = fts3ExprCheckDepth(*ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(*ppExpr); + *ppExpr = 0; + if( rc==SQLITE_TOOBIG ){ + sqlite3Fts3ErrMsg(pzErr, + "FTS expression tree is too large (maximum depth %d)", + SQLITE_FTS3_MAX_EXPR_DEPTH + ); + rc = SQLITE_ERROR; + }else if( rc==SQLITE_ERROR ){ + sqlite3Fts3ErrMsg(pzErr, "malformed MATCH expression: [%s]", z); + } + } + + return rc; +} + +/* +** Free a single node of an expression tree. +*/ +static void fts3FreeExprNode(Fts3Expr *p){ + assert( p->eType==FTSQUERY_PHRASE || p->pPhrase==0 ); + sqlite3Fts3EvalPhraseCleanup(p->pPhrase); + sqlite3_free(p->aMI); + sqlite3_free(p); +} + +/* +** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse(). +** +** This function would be simpler if it recursively called itself. But +** that would mean passing a sufficiently large expression to ExprParse() +** could cause a stack overflow. +*/ +SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){ + Fts3Expr *p; + assert( pDel==0 || pDel->pParent==0 ); + for(p=pDel; p && (p->pLeft||p->pRight); p=(p->pLeft ? p->pLeft : p->pRight)){ + assert( p->pParent==0 || p==p->pParent->pRight || p==p->pParent->pLeft ); + } + while( p ){ + Fts3Expr *pParent = p->pParent; + fts3FreeExprNode(p); + if( pParent && p==pParent->pLeft && pParent->pRight ){ + p = pParent->pRight; + while( p && (p->pLeft || p->pRight) ){ + assert( p==p->pParent->pRight || p==p->pParent->pLeft ); + p = (p->pLeft ? p->pLeft : p->pRight); + } + }else{ + p = pParent; + } + } +} + +/**************************************************************************** +***************************************************************************** +** Everything after this point is just test code. +*/ + +#ifdef SQLITE_TEST + +/* #include */ + +/* +** Return a pointer to a buffer containing a text representation of the +** expression passed as the first argument. The buffer is obtained from +** sqlite3_malloc(). It is the responsibility of the caller to use +** sqlite3_free() to release the memory. If an OOM condition is encountered, +** NULL is returned. +** +** If the second argument is not NULL, then its contents are prepended to +** the returned expression text and then freed using sqlite3_free(). +*/ +static char *exprToString(Fts3Expr *pExpr, char *zBuf){ + if( pExpr==0 ){ + return sqlite3_mprintf(""); + } + switch( pExpr->eType ){ + case FTSQUERY_PHRASE: { + Fts3Phrase *pPhrase = pExpr->pPhrase; + int i; + zBuf = sqlite3_mprintf( + "%zPHRASE %d 0", zBuf, pPhrase->iColumn); + for(i=0; zBuf && inToken; i++){ + zBuf = sqlite3_mprintf("%z %.*s%s", zBuf, + pPhrase->aToken[i].n, pPhrase->aToken[i].z, + (pPhrase->aToken[i].isPrefix?"+":"") + ); + } + return zBuf; + } + + case FTSQUERY_NEAR: + zBuf = sqlite3_mprintf("%zNEAR/%d ", zBuf, pExpr->nNear); + break; + case FTSQUERY_NOT: + zBuf = sqlite3_mprintf("%zNOT ", zBuf); + break; + case FTSQUERY_AND: + zBuf = sqlite3_mprintf("%zAND ", zBuf); + break; + case FTSQUERY_OR: + zBuf = sqlite3_mprintf("%zOR ", zBuf); + break; + } + + if( zBuf ) zBuf = sqlite3_mprintf("%z{", zBuf); + if( zBuf ) zBuf = exprToString(pExpr->pLeft, zBuf); + if( zBuf ) zBuf = sqlite3_mprintf("%z} {", zBuf); + + if( zBuf ) zBuf = exprToString(pExpr->pRight, zBuf); + if( zBuf ) zBuf = sqlite3_mprintf("%z}", zBuf); + + return zBuf; +} + +/* +** This is the implementation of a scalar SQL function used to test the +** expression parser. It should be called as follows: +** +** fts3_exprtest(, , , ...); +** +** The first argument, , is the name of the fts3 tokenizer used +** to parse the query expression (see README.tokenizers). The second argument +** is the query expression to parse. Each subsequent argument is the name +** of a column of the fts3 table that the query expression may refer to. +** For example: +** +** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2'); +*/ +static void fts3ExprTestCommon( + int bRebalance, + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + sqlite3_tokenizer *pTokenizer = 0; + int rc; + char **azCol = 0; + const char *zExpr; + int nExpr; + int nCol; + int ii; + Fts3Expr *pExpr; + char *zBuf = 0; + Fts3Hash *pHash = (Fts3Hash*)sqlite3_user_data(context); + const char *zTokenizer = 0; + char *zErr = 0; + + if( argc<3 ){ + sqlite3_result_error(context, + "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1 + ); + return; + } + + zTokenizer = (const char*)sqlite3_value_text(argv[0]); + rc = sqlite3Fts3InitTokenizer(pHash, zTokenizer, &pTokenizer, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_error(context, zErr, -1); + } + sqlite3_free(zErr); + return; + } + + zExpr = (const char *)sqlite3_value_text(argv[1]); + nExpr = sqlite3_value_bytes(argv[1]); + nCol = argc-2; + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); + if( !azCol ){ + sqlite3_result_error_nomem(context); + goto exprtest_out; + } + for(ii=0; iipModule->xDestroy(pTokenizer); + } + sqlite3_free(azCol); +} + +static void fts3ExprTest( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3ExprTestCommon(0, context, argc, argv); +} +static void fts3ExprTestRebalance( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3ExprTestCommon(1, context, argc, argv); +} + +/* +** Register the query expression parser test function fts3_exprtest() +** with database connection db. +*/ +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){ + int rc = sqlite3_create_function( + db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0 + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "fts3_exprtest_rebalance", + -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0 + ); + } + return rc; +} + +#endif +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_expr.c *******************************************/ +/************** Begin file fts3_hash.c ***************************************/ +/* +** 2001 September 22 +** +** 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 is the implementation of generic hash-tables used in SQLite. +** We've modified it slightly to serve as a standalone hash table +** implementation for the full-text indexing module. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_hash.h" */ + +/* +** Malloc and Free functions +*/ +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); + if( p ){ + memset(p, 0, n); + } + return p; +} +static void fts3HashFree(void *p){ + sqlite3_free(p); +} + +/* Turn bulk memory into a hash table object by initializing the +** fields of the Hash structure. +** +** "pNew" is a pointer to the hash table that is to be initialized. +** keyClass is one of the constants +** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass +** determines what kind of key the hash table will use. "copyKey" is +** true if the hash table should make its own private copy of keys and +** false if it should just use the supplied pointer. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey){ + assert( pNew!=0 ); + assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY ); + pNew->keyClass = keyClass; + pNew->copyKey = copyKey; + pNew->first = 0; + pNew->count = 0; + pNew->htsize = 0; + pNew->ht = 0; +} + +/* Remove all entries from a hash table. Reclaim all memory. +** Call this routine to delete a hash table or to reset a hash table +** to the empty state. +*/ +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash *pH){ + Fts3HashElem *elem; /* For looping over all elements of the table */ + + assert( pH!=0 ); + elem = pH->first; + pH->first = 0; + fts3HashFree(pH->ht); + pH->ht = 0; + pH->htsize = 0; + while( elem ){ + Fts3HashElem *next_elem = elem->next; + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree(elem); + elem = next_elem; + } + pH->count = 0; +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_STRING +*/ +static int fts3StrHash(const void *pKey, int nKey){ + const char *z = (const char *)pKey; + unsigned h = 0; + if( nKey<=0 ) nKey = (int) strlen(z); + while( nKey > 0 ){ + h = (h<<3) ^ h ^ *z++; + nKey--; + } + return (int)(h & 0x7fffffff); +} +static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return strncmp((const char*)pKey1,(const char*)pKey2,n1); +} + +/* +** Hash and comparison functions when the mode is FTS3_HASH_BINARY +*/ +static int fts3BinHash(const void *pKey, int nKey){ + int h = 0; + const char *z = (const char *)pKey; + while( nKey-- > 0 ){ + h = (h<<3) ^ h ^ *(z++); + } + return h & 0x7fffffff; +} +static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ + if( n1!=n2 ) return 1; + return memcmp(pKey1,pKey2,n1); +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** The C syntax in this function definition may be unfamilar to some +** programmers, so we provide the following additional explanation: +** +** The name of the function is "ftsHashFunction". The function takes a +** single parameter "keyClass". The return value of ftsHashFunction() +** is a pointer to another function. Specifically, the return value +** of ftsHashFunction() is a pointer to a function that takes two parameters +** with types "const void*" and "int" and returns an "int". +*/ +static int (*ftsHashFunction(int keyClass))(const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrHash; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinHash; + } +} + +/* +** Return a pointer to the appropriate hash function given the key class. +** +** For help in interpreted the obscure C code in the function definition, +** see the header comment on the previous function. +*/ +static int (*ftsCompareFunction(int keyClass))(const void*,int,const void*,int){ + if( keyClass==FTS3_HASH_STRING ){ + return &fts3StrCompare; + }else{ + assert( keyClass==FTS3_HASH_BINARY ); + return &fts3BinCompare; + } +} + +/* Link an element into the hash table +*/ +static void fts3HashInsertElement( + Fts3Hash *pH, /* The complete hash table */ + struct _fts3ht *pEntry, /* The entry into which pNew is inserted */ + Fts3HashElem *pNew /* The element to be inserted */ +){ + Fts3HashElem *pHead; /* First element already in pEntry */ + pHead = pEntry->chain; + if( pHead ){ + pNew->next = pHead; + pNew->prev = pHead->prev; + if( pHead->prev ){ pHead->prev->next = pNew; } + else { pH->first = pNew; } + pHead->prev = pNew; + }else{ + pNew->next = pH->first; + if( pH->first ){ pH->first->prev = pNew; } + pNew->prev = 0; + pH->first = pNew; + } + pEntry->count++; + pEntry->chain = pNew; +} + + +/* Resize the hash table so that it cantains "new_size" buckets. +** "new_size" must be a power of 2. The hash table might fail +** to resize if sqliteMalloc() fails. +** +** Return non-zero if a memory allocation error occurs. +*/ +static int fts3Rehash(Fts3Hash *pH, int new_size){ + struct _fts3ht *new_ht; /* The new hash table */ + Fts3HashElem *elem, *next_elem; /* For looping over existing elements */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( (new_size & (new_size-1))==0 ); + new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) ); + if( new_ht==0 ) return 1; + fts3HashFree(pH->ht); + pH->ht = new_ht; + pH->htsize = new_size; + xHash = ftsHashFunction(pH->keyClass); + for(elem=pH->first, pH->first=0; elem; elem = next_elem){ + int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); + next_elem = elem->next; + fts3HashInsertElement(pH, &new_ht[h], elem); + } + return 0; +} + +/* This function (for internal use only) locates an element in an +** hash table that matches the given key. The hash for this key has +** already been computed and is passed as the 4th parameter. +*/ +static Fts3HashElem *fts3FindElementByHash( + const Fts3Hash *pH, /* The pH to be searched */ + const void *pKey, /* The key we are searching for */ + int nKey, + int h /* The hash for this key. */ +){ + Fts3HashElem *elem; /* Used to loop thru the element list */ + int count; /* Number of elements left to test */ + int (*xCompare)(const void*,int,const void*,int); /* comparison function */ + + if( pH->ht ){ + struct _fts3ht *pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + xCompare = ftsCompareFunction(pH->keyClass); + while( count-- && elem ){ + if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + } + return 0; +} + +/* Remove a single entry from the hash table given a pointer to that +** element and a hash on the element's key. +*/ +static void fts3RemoveElementByHash( + Fts3Hash *pH, /* The pH containing "elem" */ + Fts3HashElem* elem, /* The element to be removed from the pH */ + int h /* Hash value for the element */ +){ + struct _fts3ht *pEntry; + if( elem->prev ){ + elem->prev->next = elem->next; + }else{ + pH->first = elem->next; + } + if( elem->next ){ + elem->next->prev = elem->prev; + } + pEntry = &pH->ht[h]; + if( pEntry->chain==elem ){ + pEntry->chain = elem->next; + } + pEntry->count--; + if( pEntry->count<=0 ){ + pEntry->chain = 0; + } + if( pH->copyKey && elem->pKey ){ + fts3HashFree(elem->pKey); + } + fts3HashFree( elem ); + pH->count--; + if( pH->count<=0 ){ + assert( pH->first==0 ); + assert( pH->count==0 ); + fts3HashClear(pH); + } +} + +SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem( + const Fts3Hash *pH, + const void *pKey, + int nKey +){ + int h; /* A hash on key */ + int (*xHash)(const void*,int); /* The hash function */ + + if( pH==0 || pH->ht==0 ) return 0; + xHash = ftsHashFunction(pH->keyClass); + assert( xHash!=0 ); + h = (*xHash)(pKey,nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + return fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); +} + +/* +** Attempt to locate an element of the hash table pH with a key +** that matches pKey,nKey. Return the data for this element if it is +** found, or NULL if there is no match. +*/ +SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash *pH, const void *pKey, int nKey){ + Fts3HashElem *pElem; /* The element that matches key (if any) */ + + pElem = sqlite3Fts3HashFindElem(pH, pKey, nKey); + return pElem ? pElem->data : 0; +} + +/* Insert an element into the hash table pH. The key is pKey,nKey +** and the data is "data". +** +** If no element exists with a matching key, then a new +** element is created. A copy of the key is made if the copyKey +** flag is set. NULL is returned. +** +** If another element already exists with the same key, then the +** new data replaces the old data and the old data is returned. +** The key is not copied in this instance. If a malloc fails, then +** the new data is returned and the hash table is unchanged. +** +** If the "data" parameter to this function is NULL, then the +** element corresponding to "key" is removed from the hash table. +*/ +SQLITE_PRIVATE void *sqlite3Fts3HashInsert( + Fts3Hash *pH, /* The hash table to insert into */ + const void *pKey, /* The key */ + int nKey, /* Number of bytes in the key */ + void *data /* The data */ +){ + int hraw; /* Raw hash value of the key */ + int h; /* the hash of the key modulo hash table size */ + Fts3HashElem *elem; /* Used to loop thru the element list */ + Fts3HashElem *new_elem; /* New element added to the pH */ + int (*xHash)(const void*,int); /* The hash function */ + + assert( pH!=0 ); + xHash = ftsHashFunction(pH->keyClass); + assert( xHash!=0 ); + hraw = (*xHash)(pKey, nKey); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + elem = fts3FindElementByHash(pH,pKey,nKey,h); + if( elem ){ + void *old_data = elem->data; + if( data==0 ){ + fts3RemoveElementByHash(pH,elem,h); + }else{ + elem->data = data; + } + return old_data; + } + if( data==0 ) return 0; + if( (pH->htsize==0 && fts3Rehash(pH,8)) + || (pH->count>=pH->htsize && fts3Rehash(pH, pH->htsize*2)) + ){ + pH->count = 0; + return data; + } + assert( pH->htsize>0 ); + new_elem = (Fts3HashElem*)fts3HashMalloc( sizeof(Fts3HashElem) ); + if( new_elem==0 ) return data; + if( pH->copyKey && pKey!=0 ){ + new_elem->pKey = fts3HashMalloc( nKey ); + if( new_elem->pKey==0 ){ + fts3HashFree(new_elem); + return data; + } + memcpy((void*)new_elem->pKey, pKey, nKey); + }else{ + new_elem->pKey = (void*)pKey; + } + new_elem->nKey = nKey; + pH->count++; + assert( pH->htsize>0 ); + assert( (pH->htsize & (pH->htsize-1))==0 ); + h = hraw & (pH->htsize-1); + fts3HashInsertElement(pH, &pH->ht[h], new_elem); + new_elem->data = data; + return 0; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_hash.c *******************************************/ +/************** Begin file fts3_porter.c *************************************/ +/* +** 2006 September 30 +** +** 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. +** +************************************************************************* +** Implementation of the full-text-search tokenizer that implements +** a Porter stemmer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +/* +** Class derived from sqlite3_tokenizer +*/ +typedef struct porter_tokenizer { + sqlite3_tokenizer base; /* Base class */ +} porter_tokenizer; + +/* +** Class derived from sqlite3_tokenizer_cursor +*/ +typedef struct porter_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *zInput; /* input we are tokenizing */ + int nInput; /* size of the input */ + int iOffset; /* current position in zInput */ + int iToken; /* index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAllocated; /* space allocated to zToken buffer */ +} porter_tokenizer_cursor; + + +/* +** Create a new tokenizer instance. +*/ +static int porterCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + porter_tokenizer *t; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int porterDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is zInput[0..nInput-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int porterOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, int nInput, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + porter_tokenizer_cursor *c; + + UNUSED_PARAMETER(pTokenizer); + + c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->zInput = zInput; + if( zInput==0 ){ + c->nInput = 0; + }else if( nInput<0 ){ + c->nInput = (int)strlen(zInput); + }else{ + c->nInput = nInput; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->zToken = NULL; /* no space allocated, yet. */ + c->nAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** porterOpen() above. +*/ +static int porterClose(sqlite3_tokenizer_cursor *pCursor){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + sqlite3_free(c->zToken); + sqlite3_free(c); + return SQLITE_OK; +} +/* +** Vowel or consonant +*/ +static const char cType[] = { + 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 2, 1 +}; + +/* +** isConsonant() and isVowel() determine if their first character in +** the string they point to is a consonant or a vowel, according +** to Porter ruls. +** +** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. +** 'Y' is a consonant unless it follows another consonant, +** in which case it is a vowel. +** +** In these routine, the letters are in reverse order. So the 'y' rule +** is that 'y' is a consonant unless it is followed by another +** consonent. +*/ +static int isVowel(const char*); +static int isConsonant(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return j; + return z[1]==0 || isVowel(z + 1); +} +static int isVowel(const char *z){ + int j; + char x = *z; + if( x==0 ) return 0; + assert( x>='a' && x<='z' ); + j = cType[x-'a']; + if( j<2 ) return 1-j; + return isConsonant(z + 1); +} + +/* +** Let any sequence of one or more vowels be represented by V and let +** C be sequence of one or more consonants. Then every word can be +** represented as: +** +** [C] (VC){m} [V] +** +** In prose: A word is an optional consonant followed by zero or +** vowel-consonant pairs followed by an optional vowel. "m" is the +** number of vowel consonant pairs. This routine computes the value +** of m for the first i bytes of a word. +** +** Return true if the m-value for z is 1 or more. In other words, +** return true if z contains at least one vowel that is followed +** by a consonant. +** +** In this routine z[] is in reverse order. So we are really looking +** for an instance of a consonant followed by a vowel. +*/ +static int m_gt_0(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* Like mgt0 above except we are looking for a value of m which is +** exactly 1 +*/ +static int m_eq_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 1; + while( isConsonant(z) ){ z++; } + return *z==0; +} + +/* Like mgt0 above except we are looking for a value of m>1 instead +** or m>0 +*/ +static int m_gt_1(const char *z){ + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + if( *z==0 ) return 0; + while( isVowel(z) ){ z++; } + if( *z==0 ) return 0; + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if there is a vowel anywhere within z[0..n-1] +*/ +static int hasVowel(const char *z){ + while( isConsonant(z) ){ z++; } + return *z!=0; +} + +/* +** Return TRUE if the word ends in a double consonant. +** +** The text is reversed here. So we are really looking at +** the first two characters of z[]. +*/ +static int doubleConsonant(const char *z){ + return isConsonant(z) && z[0]==z[1]; +} + +/* +** Return TRUE if the word ends with three letters which +** are consonant-vowel-consonent and where the final consonant +** is not 'w', 'x', or 'y'. +** +** The word is reversed here. So we are really checking the +** first three letters and the first one cannot be in [wxy]. +*/ +static int star_oh(const char *z){ + return + isConsonant(z) && + z[0]!='w' && z[0]!='x' && z[0]!='y' && + isVowel(z+1) && + isConsonant(z+2); +} + +/* +** If the word ends with zFrom and xCond() is true for the stem +** of the word that preceeds the zFrom ending, then change the +** ending to zTo. +** +** The input word *pz and zFrom are both in reverse order. zTo +** is in normal order. +** +** Return TRUE if zFrom matches. Return FALSE if zFrom does not +** match. Not that TRUE is returned even if xCond() fails and +** no substitution occurs. +*/ +static int stem( + char **pz, /* The word being stemmed (Reversed) */ + const char *zFrom, /* If the ending matches this... (Reversed) */ + const char *zTo, /* ... change the ending to this (not reversed) */ + int (*xCond)(const char*) /* Condition that must be true */ +){ + char *z = *pz; + while( *zFrom && *zFrom==*z ){ z++; zFrom++; } + if( *zFrom!=0 ) return 0; + if( xCond && !xCond(z) ) return 1; + while( *zTo ){ + *(--z) = *(zTo++); + } + *pz = z; + return 1; +} + +/* +** This is the fallback stemmer used when the porter stemmer is +** inappropriate. The input word is copied into the output with +** US-ASCII case folding. If the input word is too long (more +** than 20 bytes if it contains no digits or more than 6 bytes if +** it contains digits) then word is truncated to 20 or 6 bytes +** by taking 10 or 3 bytes from the beginning and end. +*/ +static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ + int i, mx, j; + int hasDigit = 0; + for(i=0; i='A' && c<='Z' ){ + zOut[i] = c - 'A' + 'a'; + }else{ + if( c>='0' && c<='9' ) hasDigit = 1; + zOut[i] = c; + } + } + mx = hasDigit ? 3 : 10; + if( nIn>mx*2 ){ + for(j=mx, i=nIn-mx; i=(int)sizeof(zReverse)-7 ){ + /* The word is too big or too small for the porter stemmer. + ** Fallback to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ + zReverse[j] = c + 'a' - 'A'; + }else if( c>='a' && c<='z' ){ + zReverse[j] = c; + }else{ + /* The use of a character not in [a-zA-Z] means that we fallback + ** to the copy stemmer */ + copy_stemmer(zIn, nIn, zOut, pnOut); + return; + } + } + memset(&zReverse[sizeof(zReverse)-5], 0, 5); + z = &zReverse[j+1]; + + + /* Step 1a */ + if( z[0]=='s' ){ + if( + !stem(&z, "sess", "ss", 0) && + !stem(&z, "sei", "i", 0) && + !stem(&z, "ss", "ss", 0) + ){ + z++; + } + } + + /* Step 1b */ + z2 = z; + if( stem(&z, "dee", "ee", m_gt_0) ){ + /* Do nothing. The work was all in the test */ + }else if( + (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) + && z!=z2 + ){ + if( stem(&z, "ta", "ate", 0) || + stem(&z, "lb", "ble", 0) || + stem(&z, "zi", "ize", 0) ){ + /* Do nothing. The work was all in the test */ + }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ + z++; + }else if( m_eq_1(z) && star_oh(z) ){ + *(--z) = 'e'; + } + } + + /* Step 1c */ + if( z[0]=='y' && hasVowel(z+1) ){ + z[0] = 'i'; + } + + /* Step 2 */ + switch( z[1] ){ + case 'a': + if( !stem(&z, "lanoita", "ate", m_gt_0) ){ + stem(&z, "lanoit", "tion", m_gt_0); + } + break; + case 'c': + if( !stem(&z, "icne", "ence", m_gt_0) ){ + stem(&z, "icna", "ance", m_gt_0); + } + break; + case 'e': + stem(&z, "rezi", "ize", m_gt_0); + break; + case 'g': + stem(&z, "igol", "log", m_gt_0); + break; + case 'l': + if( !stem(&z, "ilb", "ble", m_gt_0) + && !stem(&z, "illa", "al", m_gt_0) + && !stem(&z, "iltne", "ent", m_gt_0) + && !stem(&z, "ile", "e", m_gt_0) + ){ + stem(&z, "ilsuo", "ous", m_gt_0); + } + break; + case 'o': + if( !stem(&z, "noitazi", "ize", m_gt_0) + && !stem(&z, "noita", "ate", m_gt_0) + ){ + stem(&z, "rota", "ate", m_gt_0); + } + break; + case 's': + if( !stem(&z, "msila", "al", m_gt_0) + && !stem(&z, "ssenevi", "ive", m_gt_0) + && !stem(&z, "ssenluf", "ful", m_gt_0) + ){ + stem(&z, "ssensuo", "ous", m_gt_0); + } + break; + case 't': + if( !stem(&z, "itila", "al", m_gt_0) + && !stem(&z, "itivi", "ive", m_gt_0) + ){ + stem(&z, "itilib", "ble", m_gt_0); + } + break; + } + + /* Step 3 */ + switch( z[0] ){ + case 'e': + if( !stem(&z, "etaci", "ic", m_gt_0) + && !stem(&z, "evita", "", m_gt_0) + ){ + stem(&z, "ezila", "al", m_gt_0); + } + break; + case 'i': + stem(&z, "itici", "ic", m_gt_0); + break; + case 'l': + if( !stem(&z, "laci", "ic", m_gt_0) ){ + stem(&z, "luf", "", m_gt_0); + } + break; + case 's': + stem(&z, "ssen", "", m_gt_0); + break; + } + + /* Step 4 */ + switch( z[1] ){ + case 'a': + if( z[0]=='l' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'c': + if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'e': + if( z[0]=='r' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'i': + if( z[0]=='c' && m_gt_1(z+2) ){ + z += 2; + } + break; + case 'l': + if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ + z += 4; + } + break; + case 'n': + if( z[0]=='t' ){ + if( z[2]=='a' ){ + if( m_gt_1(z+3) ){ + z += 3; + } + }else if( z[2]=='e' ){ + if( !stem(&z, "tneme", "", m_gt_1) + && !stem(&z, "tnem", "", m_gt_1) + ){ + stem(&z, "tne", "", m_gt_1); + } + } + } + break; + case 'o': + if( z[0]=='u' ){ + if( m_gt_1(z+2) ){ + z += 2; + } + }else if( z[3]=='s' || z[3]=='t' ){ + stem(&z, "noi", "", m_gt_1); + } + break; + case 's': + if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 't': + if( !stem(&z, "eta", "", m_gt_1) ){ + stem(&z, "iti", "", m_gt_1); + } + break; + case 'u': + if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ + z += 3; + } + break; + case 'v': + case 'z': + if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ + z += 3; + } + break; + } + + /* Step 5a */ + if( z[0]=='e' ){ + if( m_gt_1(z+1) ){ + z++; + }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + z++; + } + } + + /* Step 5b */ + if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ + z++; + } + + /* z[] is now the stemmed word in reverse order. Flip it back + ** around into forward order and return. + */ + *pnOut = i = (int)strlen(z); + zOut[i] = 0; + while( *z ){ + zOut[--i] = *(z++); + } +} + +/* +** Characters that can be part of a token. We assume any character +** whose value is greater than 0x80 (any UTF character) can be +** part of a token. In other words, delimiters all must have +** values of 0x7f or lower. +*/ +static const char porterIdChar[] = { +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ +}; +#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to porterOpen(). +*/ +static int porterNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ + const char **pzToken, /* OUT: *pzToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; + const char *z = c->zInput; + + while( c->iOffsetnInput ){ + int iStartOffset, ch; + + /* Scan past delimiter characters */ + while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int n = c->iOffset-iStartOffset; + if( n>c->nAllocated ){ + char *pNew; + c->nAllocated = n+20; + pNew = sqlite3_realloc(c->zToken, c->nAllocated); + if( !pNew ) return SQLITE_NOMEM; + c->zToken = pNew; + } + porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); + *pzToken = c->zToken; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the porter-stemmer tokenizer +*/ +static const sqlite3_tokenizer_module porterTokenizerModule = { + 0, + porterCreate, + porterDestroy, + porterOpen, + porterClose, + porterNext, + 0 +}; + +/* +** Allocate a new porter tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &porterTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_porter.c *****************************************/ +/************** Begin file fts3_tokenizer.c **********************************/ +/* +** 2007 June 22 +** +** 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 is part of an SQLite module implementing full-text search. +** This particular file implements the generic tokenizer interface. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +/* +** Return true if the two-argument version of fts3_tokenizer() +** has been activated via a prior call to sqlite3_db_config(db, +** SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 1, 0); +*/ +static int fts3TokenizerEnabled(sqlite3_context *context){ + sqlite3 *db = sqlite3_context_db_handle(context); + int isEnabled = 0; + sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,-1,&isEnabled); + return isEnabled; +} + +/* +** Implementation of the SQL scalar function for accessing the underlying +** hash table. This function may be called as follows: +** +** SELECT (); +** SELECT (, ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer'). +** +** If the argument is specified, it must be a blob value +** containing a pointer to be stored as the hash data corresponding +** to the string . If is not specified, then +** the string must already exist in the has table. Otherwise, +** an error is returned. +** +** Whether or not the argument is specified, the value returned +** is a blob containing the pointer stored as the hash data corresponding +** to string (after the hash-table is updated, if applicable). +*/ +static void fts3TokenizerFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Fts3Hash *pHash; + void *pPtr = 0; + const unsigned char *zName; + int nName; + + assert( argc==1 || argc==2 ); + + pHash = (Fts3Hash *)sqlite3_user_data(context); + + zName = sqlite3_value_text(argv[0]); + nName = sqlite3_value_bytes(argv[0])+1; + + if( argc==2 ){ + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[1]) ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( zName==0 || n!=sizeof(pPtr) ){ + sqlite3_result_error(context, "argument type mismatch", -1); + return; + } + pPtr = *(void **)sqlite3_value_blob(argv[1]); + pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); + if( pOld==pPtr ){ + sqlite3_result_error(context, "out of memory", -1); + } + }else{ + sqlite3_result_error(context, "fts3tokenize disabled", -1); + return; + } + }else{ + if( zName ){ + pPtr = sqlite3Fts3HashFind(pHash, zName, nName); + } + if( !pPtr ){ + char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + } + if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[0]) ){ + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + } +} + +SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char c){ + static const char isFtsIdChar[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ + }; + return (c&0x80 || isFtsIdChar[(int)(c)]); +} + +SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *zStr, int *pn){ + const char *z1; + const char *z2 = 0; + + /* Find the start of the next token. */ + z1 = zStr; + while( z2==0 ){ + char c = *z1; + switch( c ){ + case '\0': return 0; /* No more tokens here */ + case '\'': + case '"': + case '`': { + z2 = z1; + while( *++z2 && (*z2!=c || *++z2==c) ); + break; + } + case '[': + z2 = &z1[1]; + while( *z2 && z2[0]!=']' ) z2++; + if( *z2 ) z2++; + break; + + default: + if( sqlite3Fts3IsIdChar(*z1) ){ + z2 = &z1[1]; + while( sqlite3Fts3IsIdChar(*z2) ) z2++; + }else{ + z1++; + } + } + } + + *pn = (int)(z2-z1); + return z1; +} + +SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( + Fts3Hash *pHash, /* Tokenizer hash table */ + const char *zArg, /* Tokenizer name */ + sqlite3_tokenizer **ppTok, /* OUT: Tokenizer (if applicable) */ + char **pzErr /* OUT: Set to malloced error message */ +){ + int rc; + char *z = (char *)zArg; + int n = 0; + char *zCopy; + char *zEnd; /* Pointer to nul-term of zCopy */ + sqlite3_tokenizer_module *m; + + zCopy = sqlite3_mprintf("%s", zArg); + if( !zCopy ) return SQLITE_NOMEM; + zEnd = &zCopy[strlen(zCopy)]; + + z = (char *)sqlite3Fts3NextToken(zCopy, &n); + if( z==0 ){ + assert( n==0 ); + z = zCopy; + } + z[n] = '\0'; + sqlite3Fts3Dequote(z); + + m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1); + if( !m ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", z); + rc = SQLITE_ERROR; + }else{ + char const **aArg = 0; + int iArg = 0; + z = &z[n+1]; + while( zxCreate(iArg, aArg, ppTok); + assert( rc!=SQLITE_OK || *ppTok ); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); + }else{ + (*ppTok)->pModule = m; + } + sqlite3_free((void *)aArg); + } + + sqlite3_free(zCopy); + return rc; +} + + +#ifdef SQLITE_TEST + +#if defined(INCLUDE_SQLITE_TCL_H) +# include "sqlite_tcl.h" +#else +# include "tcl.h" +#endif +/* #include */ + +/* +** Implementation of a special SQL scalar function for testing tokenizers +** designed to be used in concert with the Tcl testing framework. This +** function must be called with two or more arguments: +** +** SELECT (, ..., ); +** +** where is the name passed as the second argument +** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer') +** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test'). +** +** The return value is a string that may be interpreted as a Tcl +** list. For each token in the , three elements are +** added to the returned list. The first is the token position, the +** second is the token text (folded, stemmed, etc.) and the third is the +** substring of associated with the token. For example, +** using the built-in "simple" tokenizer: +** +** SELECT fts_tokenizer_test('simple', 'I don't see how'); +** +** will return the string: +** +** "{0 i I 1 dont don't 2 see see 3 how how}" +** +*/ +static void testFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + Fts3Hash *pHash; + sqlite3_tokenizer_module *p; + sqlite3_tokenizer *pTokenizer = 0; + sqlite3_tokenizer_cursor *pCsr = 0; + + const char *zErr = 0; + + const char *zName; + int nName; + const char *zInput; + int nInput; + + const char *azArg[64]; + + const char *zToken; + int nToken = 0; + int iStart = 0; + int iEnd = 0; + int iPos = 0; + int i; + + Tcl_Obj *pRet; + + if( argc<2 ){ + sqlite3_result_error(context, "insufficient arguments", -1); + return; + } + + nName = sqlite3_value_bytes(argv[0]); + zName = (const char *)sqlite3_value_text(argv[0]); + nInput = sqlite3_value_bytes(argv[argc-1]); + zInput = (const char *)sqlite3_value_text(argv[argc-1]); + + pHash = (Fts3Hash *)sqlite3_user_data(context); + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + + if( !p ){ + char *zErr2 = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr2, -1); + sqlite3_free(zErr2); + return; + } + + pRet = Tcl_NewObj(); + Tcl_IncrRefCount(pRet); + + for(i=1; ixCreate(argc-2, azArg, &pTokenizer) ){ + zErr = "error in xCreate()"; + goto finish; + } + pTokenizer->pModule = p; + if( sqlite3Fts3OpenTokenizer(pTokenizer, 0, zInput, nInput, &pCsr) ){ + zErr = "error in xOpen()"; + goto finish; + } + + while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ + Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + zToken = &zInput[iStart]; + nToken = iEnd-iStart; + Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); + } + + if( SQLITE_OK!=p->xClose(pCsr) ){ + zErr = "error in xClose()"; + goto finish; + } + if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + zErr = "error in xDestroy()"; + goto finish; + } + +finish: + if( zErr ){ + sqlite3_result_error(context, zErr, -1); + }else{ + sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); + } + Tcl_DecrRefCount(pRet); +} + +static +int registerTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module *p +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); + sqlite3_step(pStmt); + + return sqlite3_finalize(pStmt); +} + + +static +int queryTokenizer( + sqlite3 *db, + char *zName, + const sqlite3_tokenizer_module **pp +){ + int rc; + sqlite3_stmt *pStmt; + const char zSql[] = "SELECT fts3_tokenizer(?)"; + + *pp = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB + && sqlite3_column_bytes(pStmt, 0)==sizeof(*pp) + ){ + memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); + } + } + + return sqlite3_finalize(pStmt); +} + +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); + +/* +** Implementation of the scalar function fts3_tokenizer_internal_test(). +** This function is used for testing only, it is not included in the +** build unless SQLITE_TEST is defined. +** +** The purpose of this is to test that the fts3_tokenizer() function +** can be used as designed by the C-code in the queryTokenizer and +** registerTokenizer() functions above. These two functions are repeated +** in the README.tokenizer file as an example, so it is important to +** test them. +** +** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar +** function with no arguments. An assert() will fail if a problem is +** detected. i.e.: +** +** SELECT fts3_tokenizer_internal_test(); +** +*/ +static void intTestFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int rc; + const sqlite3_tokenizer_module *p1; + const sqlite3_tokenizer_module *p2; + sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + /* Test the query function */ + sqlite3Fts3SimpleTokenizerModule(&p1); + rc = queryTokenizer(db, "simple", &p2); + assert( rc==SQLITE_OK ); + assert( p1==p2 ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_ERROR ); + assert( p2==0 ); + assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); + + /* Test the storage function */ + if( fts3TokenizerEnabled(context) ){ + rc = registerTokenizer(db, "nosuchtokenizer", p1); + assert( rc==SQLITE_OK ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_OK ); + assert( p2==p1 ); + } + + sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); +} + +#endif + +/* +** Set up SQL objects in database db used to access the contents of +** the hash table pointed to by argument pHash. The hash table must +** been initialized to use string keys, and to take a private copy +** of the key when a value is inserted. i.e. by a call similar to: +** +** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); +** +** This function adds a scalar function (see header comment above +** fts3TokenizerFunc() in this file for details) and, if ENABLE_TABLE is +** defined at compilation time, a temporary virtual table (see header +** comment above struct HashTableVtab) to the database schema. Both +** provide read/write access to the contents of *pHash. +** +** The third argument to this function, zName, is used as the name +** of both the scalar and, if created, the virtual table. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitHashTable( + sqlite3 *db, + Fts3Hash *pHash, + const char *zName +){ + int rc = SQLITE_OK; + void *p = (void *)pHash; + const int any = SQLITE_UTF8|SQLITE_DIRECTONLY; + +#ifdef SQLITE_TEST + char *zTest = 0; + char *zTest2 = 0; + void *pdb = (void *)db; + zTest = sqlite3_mprintf("%s_test", zName); + zTest2 = sqlite3_mprintf("%s_internal_test", zName); + if( !zTest || !zTest2 ){ + rc = SQLITE_NOMEM; + } +#endif + + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zName, 1, any, p, fts3TokenizerFunc, 0, 0); + } + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zName, 2, any, p, fts3TokenizerFunc, 0, 0); + } +#ifdef SQLITE_TEST + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zTest, -1, any, p, testFunc, 0, 0); + } + if( SQLITE_OK==rc ){ + rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0); + } +#endif + +#ifdef SQLITE_TEST + sqlite3_free(zTest); + sqlite3_free(zTest2); +#endif + + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer.c **************************************/ +/************** Begin file fts3_tokenizer1.c *********************************/ +/* +** 2006 Oct 10 +** +** 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. +** +****************************************************************************** +** +** Implementation of the "simple" full-text-search tokenizer. +*/ + +/* +** The code in this file is only compiled if: +** +** * The FTS3 module is being built as an extension +** (in which case SQLITE_CORE is not defined), or +** +** * The FTS3 module is being built into the core of +** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +typedef struct simple_tokenizer { + sqlite3_tokenizer base; + char delim[128]; /* flag ASCII delimiters */ +} simple_tokenizer; + +typedef struct simple_tokenizer_cursor { + sqlite3_tokenizer_cursor base; + const char *pInput; /* input we are tokenizing */ + int nBytes; /* size of the input */ + int iOffset; /* current position in pInput */ + int iToken; /* index of next token to be returned */ + char *pToken; /* storage for current token */ + int nTokenAllocated; /* space allocated to zToken buffer */ +} simple_tokenizer_cursor; + + +static int simpleDelim(simple_tokenizer *t, unsigned char c){ + return c<0x80 && t->delim[c]; +} +static int fts3_isalnum(int x){ + return (x>='0' && x<='9') || (x>='A' && x<='Z') || (x>='a' && x<='z'); +} + +/* +** Create a new tokenizer instance. +*/ +static int simpleCreate( + int argc, const char * const *argv, + sqlite3_tokenizer **ppTokenizer +){ + simple_tokenizer *t; + + t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t)); + if( t==NULL ) return SQLITE_NOMEM; + memset(t, 0, sizeof(*t)); + + /* TODO(shess) Delimiters need to remain the same from run to run, + ** else we need to reindex. One solution would be a meta-table to + ** track such information in the database, then we'd only want this + ** information on the initial create. + */ + if( argc>1 ){ + int i, n = (int)strlen(argv[1]); + for(i=0; i=0x80 ){ + sqlite3_free(t); + return SQLITE_ERROR; + } + t->delim[ch] = 1; + } + } else { + /* Mark non-alphanumeric ASCII characters as delimiters */ + int i; + for(i=1; i<0x80; i++){ + t->delim[i] = !fts3_isalnum(i) ? -1 : 0; + } + } + + *ppTokenizer = &t->base; + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int simpleOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *pInput, int nBytes, /* String to be tokenized */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + simple_tokenizer_cursor *c; + + UNUSED_PARAMETER(pTokenizer); + + c = (simple_tokenizer_cursor *) sqlite3_malloc(sizeof(*c)); + if( c==NULL ) return SQLITE_NOMEM; + + c->pInput = pInput; + if( pInput==0 ){ + c->nBytes = 0; + }else if( nBytes<0 ){ + c->nBytes = (int)strlen(pInput); + }else{ + c->nBytes = nBytes; + } + c->iOffset = 0; /* start tokenizing at the beginning */ + c->iToken = 0; + c->pToken = NULL; /* no space allocated, yet. */ + c->nTokenAllocated = 0; + + *ppCursor = &c->base; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + sqlite3_free(c->pToken); + sqlite3_free(c); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int simpleNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; + simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; + unsigned char *p = (unsigned char *)c->pInput; + + while( c->iOffsetnBytes ){ + int iStartOffset; + + /* Scan past delimiter characters */ + while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + /* Count non-delimiter characters. */ + iStartOffset = c->iOffset; + while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + c->iOffset++; + } + + if( c->iOffset>iStartOffset ){ + int i, n = c->iOffset-iStartOffset; + if( n>c->nTokenAllocated ){ + char *pNew; + c->nTokenAllocated = n+20; + pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); + if( !pNew ) return SQLITE_NOMEM; + c->pToken = pNew; + } + for(i=0; ipToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch); + } + *ppToken = c->pToken; + *pnBytes = n; + *piStartOffset = iStartOffset; + *piEndOffset = c->iOffset; + *piPosition = c->iToken++; + + return SQLITE_OK; + } + } + return SQLITE_DONE; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module simpleTokenizerModule = { + 0, + simpleCreate, + simpleDestroy, + simpleOpen, + simpleClose, + simpleNext, + 0, +}; + +/* +** Allocate a new simple tokenizer. Return a pointer to the new +** tokenizer in *ppModule +*/ +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &simpleTokenizerModule; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenizer1.c *************************************/ +/************** Begin file fts3_tokenize_vtab.c ******************************/ +/* +** 2013 Apr 22 +** +** 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 contains code for the "fts3tokenize" virtual table module. +** An fts3tokenize virtual table is created as follows: +** +** CREATE VIRTUAL TABLE USING fts3tokenize( +** , , ... +** ); +** +** The table created has the following schema: +** +** CREATE TABLE (input, token, start, end, position) +** +** When queried, the query must include a WHERE clause of type: +** +** input = +** +** The virtual table module tokenizes this , using the FTS3 +** tokenizer specified by the arguments to the CREATE VIRTUAL TABLE +** statement and returns one row for each token in the result. With +** fields set as follows: +** +** input: Always set to a copy of +** token: A token from the input. +** start: Byte offset of the token within the input . +** end: Byte offset of the byte immediately following the end of the +** token within the input string. +** pos: Token offset of token within input. +** +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +typedef struct Fts3tokTable Fts3tokTable; +typedef struct Fts3tokCursor Fts3tokCursor; + +/* +** Virtual table structure. +*/ +struct Fts3tokTable { + sqlite3_vtab base; /* Base class used by SQLite core */ + const sqlite3_tokenizer_module *pMod; + sqlite3_tokenizer *pTok; +}; + +/* +** Virtual table cursor structure. +*/ +struct Fts3tokCursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + char *zInput; /* Input string */ + sqlite3_tokenizer_cursor *pCsr; /* Cursor to iterate through zInput */ + int iRowid; /* Current 'rowid' value */ + const char *zToken; /* Current 'token' value */ + int nToken; /* Size of zToken in bytes */ + int iStart; /* Current 'start' value */ + int iEnd; /* Current 'end' value */ + int iPos; /* Current 'pos' value */ +}; + +/* +** Query FTS for the tokenizer implementation named zName. +*/ +static int fts3tokQueryTokenizer( + Fts3Hash *pHash, + const char *zName, + const sqlite3_tokenizer_module **pp, + char **pzErr +){ + sqlite3_tokenizer_module *p; + int nName = (int)strlen(zName); + + p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); + if( !p ){ + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", zName); + return SQLITE_ERROR; + } + + *pp = p; + return SQLITE_OK; +} + +/* +** The second argument, argv[], is an array of pointers to nul-terminated +** strings. This function makes a copy of the array and strings into a +** single block of memory. It then dequotes any of the strings that appear +** to be quoted. +** +** If successful, output parameter *pazDequote is set to point at the +** array of dequoted strings and SQLITE_OK is returned. The caller is +** responsible for eventually calling sqlite3_free() to free the array +** in this case. Or, if an error occurs, an SQLite error code is returned. +** The final value of *pazDequote is undefined in this case. +*/ +static int fts3tokDequoteArray( + int argc, /* Number of elements in argv[] */ + const char * const *argv, /* Input array */ + char ***pazDequote /* Output array */ +){ + int rc = SQLITE_OK; /* Return code */ + if( argc==0 ){ + *pazDequote = 0; + }else{ + int i; + int nByte = 0; + char **azDequote; + + for(i=0; i1 ) azArg = (const char * const *)&azDequote[1]; + rc = pMod->xCreate((nDequote>1 ? nDequote-1 : 0), azArg, &pTok); + } + + if( rc==SQLITE_OK ){ + pTab = (Fts3tokTable *)sqlite3_malloc(sizeof(Fts3tokTable)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ + memset(pTab, 0, sizeof(Fts3tokTable)); + pTab->pMod = pMod; + pTab->pTok = pTok; + *ppVtab = &pTab->base; + }else{ + if( pTok ){ + pMod->xDestroy(pTok); + } + } + + sqlite3_free(azDequote); + return rc; +} + +/* +** This function does the work for both the xDisconnect and xDestroy methods. +** These tables have no persistent representation of their own, so xDisconnect +** and xDestroy are identical operations. +*/ +static int fts3tokDisconnectMethod(sqlite3_vtab *pVtab){ + Fts3tokTable *pTab = (Fts3tokTable *)pVtab; + + pTab->pMod->xDestroy(pTab->pTok); + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* +** xBestIndex - Analyze a WHERE and ORDER BY clause. +*/ +static int fts3tokBestIndexMethod( + sqlite3_vtab *pVTab, + sqlite3_index_info *pInfo +){ + int i; + UNUSED_PARAMETER(pVTab); + + for(i=0; inConstraint; i++){ + if( pInfo->aConstraint[i].usable + && pInfo->aConstraint[i].iColumn==0 + && pInfo->aConstraint[i].op==SQLITE_INDEX_CONSTRAINT_EQ + ){ + pInfo->idxNum = 1; + pInfo->aConstraintUsage[i].argvIndex = 1; + pInfo->aConstraintUsage[i].omit = 1; + pInfo->estimatedCost = 1; + return SQLITE_OK; + } + } + + pInfo->idxNum = 0; + assert( pInfo->estimatedCost>1000000.0 ); + + return SQLITE_OK; +} + +/* +** xOpen - Open a cursor. +*/ +static int fts3tokOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts3tokCursor *pCsr; + UNUSED_PARAMETER(pVTab); + + pCsr = (Fts3tokCursor *)sqlite3_malloc(sizeof(Fts3tokCursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(Fts3tokCursor)); + + *ppCsr = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Reset the tokenizer cursor passed as the only argument. As if it had +** just been returned by fts3tokOpenMethod(). +*/ +static void fts3tokResetCursor(Fts3tokCursor *pCsr){ + if( pCsr->pCsr ){ + Fts3tokTable *pTab = (Fts3tokTable *)(pCsr->base.pVtab); + pTab->pMod->xClose(pCsr->pCsr); + pCsr->pCsr = 0; + } + sqlite3_free(pCsr->zInput); + pCsr->zInput = 0; + pCsr->zToken = 0; + pCsr->nToken = 0; + pCsr->iStart = 0; + pCsr->iEnd = 0; + pCsr->iPos = 0; + pCsr->iRowid = 0; +} + +/* +** xClose - Close a cursor. +*/ +static int fts3tokCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + + fts3tokResetCursor(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** xNext - Advance the cursor to the next row, if any. +*/ +static int fts3tokNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + Fts3tokTable *pTab = (Fts3tokTable *)(pCursor->pVtab); + int rc; /* Return code */ + + pCsr->iRowid++; + rc = pTab->pMod->xNext(pCsr->pCsr, + &pCsr->zToken, &pCsr->nToken, + &pCsr->iStart, &pCsr->iEnd, &pCsr->iPos + ); + + if( rc!=SQLITE_OK ){ + fts3tokResetCursor(pCsr); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + + return rc; +} + +/* +** xFilter - Initialize a cursor to point at the start of its data. +*/ +static int fts3tokFilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *idxStr, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + int rc = SQLITE_ERROR; + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + Fts3tokTable *pTab = (Fts3tokTable *)(pCursor->pVtab); + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(nVal); + + fts3tokResetCursor(pCsr); + if( idxNum==1 ){ + const char *zByte = (const char *)sqlite3_value_text(apVal[0]); + int nByte = sqlite3_value_bytes(apVal[0]); + pCsr->zInput = sqlite3_malloc64(nByte+1); + if( pCsr->zInput==0 ){ + rc = SQLITE_NOMEM; + }else{ + if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); + pCsr->zInput[nByte] = 0; + rc = pTab->pMod->xOpen(pTab->pTok, pCsr->zInput, nByte, &pCsr->pCsr); + if( rc==SQLITE_OK ){ + pCsr->pCsr->pTokenizer = pTab->pTok; + } + } + } + + if( rc!=SQLITE_OK ) return rc; + return fts3tokNextMethod(pCursor); +} + +/* +** xEof - Return true if the cursor is at EOF, or false otherwise. +*/ +static int fts3tokEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + return (pCsr->zToken==0); +} + +/* +** xColumn - Return a column value. +*/ +static int fts3tokColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + + /* CREATE TABLE x(input, token, start, end, position) */ + switch( iCol ){ + case 0: + sqlite3_result_text(pCtx, pCsr->zInput, -1, SQLITE_TRANSIENT); + break; + case 1: + sqlite3_result_text(pCtx, pCsr->zToken, pCsr->nToken, SQLITE_TRANSIENT); + break; + case 2: + sqlite3_result_int(pCtx, pCsr->iStart); + break; + case 3: + sqlite3_result_int(pCtx, pCsr->iEnd); + break; + default: + assert( iCol==4 ); + sqlite3_result_int(pCtx, pCsr->iPos); + break; + } + return SQLITE_OK; +} + +/* +** xRowid - Return the current rowid for the cursor. +*/ +static int fts3tokRowidMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite_int64 *pRowid /* OUT: Rowid value */ +){ + Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; + *pRowid = (sqlite3_int64)pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Register the fts3tok module with database connection db. Return SQLITE_OK +** if successful or an error code if sqlite3_create_module() fails. +*/ +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash, void(*xDestroy)(void*)){ + static const sqlite3_module fts3tok_module = { + 0, /* iVersion */ + fts3tokConnectMethod, /* xCreate */ + fts3tokConnectMethod, /* xConnect */ + fts3tokBestIndexMethod, /* xBestIndex */ + fts3tokDisconnectMethod, /* xDisconnect */ + fts3tokDisconnectMethod, /* xDestroy */ + fts3tokOpenMethod, /* xOpen */ + fts3tokCloseMethod, /* xClose */ + fts3tokFilterMethod, /* xFilter */ + fts3tokNextMethod, /* xNext */ + fts3tokEofMethod, /* xEof */ + fts3tokColumnMethod, /* xColumn */ + fts3tokRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ + }; + int rc; /* Return code */ + + rc = sqlite3_create_module_v2( + db, "fts3tokenize", &fts3tok_module, (void*)pHash, xDestroy + ); + return rc; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_tokenize_vtab.c **********************************/ +/************** Begin file fts3_write.c **************************************/ +/* +** 2009 Oct 23 +** +** 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 is part of the SQLite FTS3 extension module. Specifically, +** this file contains code to insert, update and delete rows from FTS3 +** tables. It also contains code to merge FTS3 b-tree segments. Some +** of the sub-routines used to merge segments are also used by the query +** code in fts3.c. +*/ + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +#define FTS_MAX_APPENDABLE_HEIGHT 16 + +/* +** When full-text index nodes are loaded from disk, the buffer that they +** are loaded into has the following number of bytes of padding at the end +** of it. i.e. if a full-text index node is 900 bytes in size, then a buffer +** of 920 bytes is allocated for it. +** +** This means that if we have a pointer into a buffer containing node data, +** it is always safe to read up to two varints from it without risking an +** overread, even if the node data is corrupted. +*/ +#define FTS3_NODE_PADDING (FTS3_VARINT_MAX*2) + +/* +** Under certain circumstances, b-tree nodes (doclists) can be loaded into +** memory incrementally instead of all at once. This can be a big performance +** win (reduced IO and CPU) if SQLite stops calling the virtual table xNext() +** method before retrieving all query results (as may happen, for example, +** if a query has a LIMIT clause). +** +** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD +** bytes and larger. Nodes are loaded in chunks of FTS3_NODE_CHUNKSIZE bytes. +** The code is written so that the hard lower-limit for each of these values +** is 1. Clearly such small values would be inefficient, but can be useful +** for testing purposes. +** +** If this module is built with SQLITE_TEST defined, these constants may +** be overridden at runtime for testing purposes. File fts3_test.c contains +** a Tcl interface to read and write the values. +*/ +#ifdef SQLITE_TEST +int test_fts3_node_chunksize = (4*1024); +int test_fts3_node_chunk_threshold = (4*1024)*4; +# define FTS3_NODE_CHUNKSIZE test_fts3_node_chunksize +# define FTS3_NODE_CHUNK_THRESHOLD test_fts3_node_chunk_threshold +#else +# define FTS3_NODE_CHUNKSIZE (4*1024) +# define FTS3_NODE_CHUNK_THRESHOLD (FTS3_NODE_CHUNKSIZE*4) +#endif + +/* +** The values that may be meaningfully bound to the :1 parameter in +** statements SQL_REPLACE_STAT and SQL_SELECT_STAT. +*/ +#define FTS_STAT_DOCTOTAL 0 +#define FTS_STAT_INCRMERGEHINT 1 +#define FTS_STAT_AUTOINCRMERGE 2 + +/* +** If FTS_LOG_MERGES is defined, call sqlite3_log() to report each automatic +** and incremental merge operation that takes place. This is used for +** debugging FTS only, it should not usually be turned on in production +** systems. +*/ +#ifdef FTS3_LOG_MERGES +static void fts3LogMerge(int nMerge, sqlite3_int64 iAbsLevel){ + sqlite3_log(SQLITE_OK, "%d-way merge from level %d", nMerge, (int)iAbsLevel); +} +#else +#define fts3LogMerge(x, y) +#endif + + +typedef struct PendingList PendingList; +typedef struct SegmentNode SegmentNode; +typedef struct SegmentWriter SegmentWriter; + +/* +** An instance of the following data structure is used to build doclists +** incrementally. See function fts3PendingListAppend() for details. +*/ +struct PendingList { + int nData; + char *aData; + int nSpace; + sqlite3_int64 iLastDocid; + sqlite3_int64 iLastCol; + sqlite3_int64 iLastPos; +}; + + +/* +** Each cursor has a (possibly empty) linked list of the following objects. +*/ +struct Fts3DeferredToken { + Fts3PhraseToken *pToken; /* Pointer to corresponding expr token */ + int iCol; /* Column token must occur in */ + Fts3DeferredToken *pNext; /* Next in list of deferred tokens */ + PendingList *pList; /* Doclist is assembled here */ +}; + +/* +** An instance of this structure is used to iterate through the terms on +** a contiguous set of segment b-tree leaf nodes. Although the details of +** this structure are only manipulated by code in this file, opaque handles +** of type Fts3SegReader* are also used by code in fts3.c to iterate through +** terms when querying the full-text index. See functions: +** +** sqlite3Fts3SegReaderNew() +** sqlite3Fts3SegReaderFree() +** sqlite3Fts3SegReaderIterate() +** +** Methods used to manipulate Fts3SegReader structures: +** +** fts3SegReaderNext() +** fts3SegReaderFirstDocid() +** fts3SegReaderNextDocid() +*/ +struct Fts3SegReader { + int iIdx; /* Index within level, or 0x7FFFFFFF for PT */ + u8 bLookup; /* True for a lookup only */ + u8 rootOnly; /* True for a root-only reader */ + + sqlite3_int64 iStartBlock; /* Rowid of first leaf block to traverse */ + sqlite3_int64 iLeafEndBlock; /* Rowid of final leaf block to traverse */ + sqlite3_int64 iEndBlock; /* Rowid of final block in segment (or 0) */ + sqlite3_int64 iCurrentBlock; /* Current leaf block (or 0) */ + + char *aNode; /* Pointer to node data (or NULL) */ + int nNode; /* Size of buffer at aNode (or 0) */ + int nPopulate; /* If >0, bytes of buffer aNode[] loaded */ + sqlite3_blob *pBlob; /* If not NULL, blob handle to read node */ + + Fts3HashElem **ppNextElem; + + /* Variables set by fts3SegReaderNext(). These may be read directly + ** by the caller. They are valid from the time SegmentReaderNew() returns + ** until SegmentReaderNext() returns something other than SQLITE_OK + ** (i.e. SQLITE_DONE). + */ + int nTerm; /* Number of bytes in current term */ + char *zTerm; /* Pointer to current term */ + int nTermAlloc; /* Allocated size of zTerm buffer */ + char *aDoclist; /* Pointer to doclist of current entry */ + int nDoclist; /* Size of doclist in current entry */ + + /* The following variables are used by fts3SegReaderNextDocid() to iterate + ** through the current doclist (aDoclist/nDoclist). + */ + char *pOffsetList; + int nOffsetList; /* For descending pending seg-readers only */ + sqlite3_int64 iDocid; +}; + +#define fts3SegReaderIsPending(p) ((p)->ppNextElem!=0) +#define fts3SegReaderIsRootOnly(p) ((p)->rootOnly!=0) + +/* +** An instance of this structure is used to create a segment b-tree in the +** database. The internal details of this type are only accessed by the +** following functions: +** +** fts3SegWriterAdd() +** fts3SegWriterFlush() +** fts3SegWriterFree() +*/ +struct SegmentWriter { + SegmentNode *pTree; /* Pointer to interior tree structure */ + sqlite3_int64 iFirst; /* First slot in %_segments written */ + sqlite3_int64 iFree; /* Next free slot in %_segments */ + char *zTerm; /* Pointer to previous term buffer */ + int nTerm; /* Number of bytes in zTerm */ + int nMalloc; /* Size of malloc'd buffer at zMalloc */ + char *zMalloc; /* Malloc'd space (possibly) used for zTerm */ + int nSize; /* Size of allocation at aData */ + int nData; /* Bytes of data in aData */ + char *aData; /* Pointer to block from malloc() */ + i64 nLeafData; /* Number of bytes of leaf data written */ +}; + +/* +** Type SegmentNode is used by the following three functions to create +** the interior part of the segment b+-tree structures (everything except +** the leaf nodes). These functions and type are only ever used by code +** within the fts3SegWriterXXX() family of functions described above. +** +** fts3NodeAddTerm() +** fts3NodeWrite() +** fts3NodeFree() +** +** When a b+tree is written to the database (either as a result of a merge +** or the pending-terms table being flushed), leaves are written into the +** database file as soon as they are completely populated. The interior of +** the tree is assembled in memory and written out only once all leaves have +** been populated and stored. This is Ok, as the b+-tree fanout is usually +** very large, meaning that the interior of the tree consumes relatively +** little memory. +*/ +struct SegmentNode { + SegmentNode *pParent; /* Parent node (or NULL for root node) */ + SegmentNode *pRight; /* Pointer to right-sibling */ + SegmentNode *pLeftmost; /* Pointer to left-most node of this depth */ + int nEntry; /* Number of terms written to node so far */ + char *zTerm; /* Pointer to previous term buffer */ + int nTerm; /* Number of bytes in zTerm */ + int nMalloc; /* Size of malloc'd buffer at zMalloc */ + char *zMalloc; /* Malloc'd space (possibly) used for zTerm */ + int nData; /* Bytes of valid data so far */ + char *aData; /* Node data */ +}; + +/* +** Valid values for the second argument to fts3SqlStmt(). +*/ +#define SQL_DELETE_CONTENT 0 +#define SQL_IS_EMPTY 1 +#define SQL_DELETE_ALL_CONTENT 2 +#define SQL_DELETE_ALL_SEGMENTS 3 +#define SQL_DELETE_ALL_SEGDIR 4 +#define SQL_DELETE_ALL_DOCSIZE 5 +#define SQL_DELETE_ALL_STAT 6 +#define SQL_SELECT_CONTENT_BY_ROWID 7 +#define SQL_NEXT_SEGMENT_INDEX 8 +#define SQL_INSERT_SEGMENTS 9 +#define SQL_NEXT_SEGMENTS_ID 10 +#define SQL_INSERT_SEGDIR 11 +#define SQL_SELECT_LEVEL 12 +#define SQL_SELECT_LEVEL_RANGE 13 +#define SQL_SELECT_LEVEL_COUNT 14 +#define SQL_SELECT_SEGDIR_MAX_LEVEL 15 +#define SQL_DELETE_SEGDIR_LEVEL 16 +#define SQL_DELETE_SEGMENTS_RANGE 17 +#define SQL_CONTENT_INSERT 18 +#define SQL_DELETE_DOCSIZE 19 +#define SQL_REPLACE_DOCSIZE 20 +#define SQL_SELECT_DOCSIZE 21 +#define SQL_SELECT_STAT 22 +#define SQL_REPLACE_STAT 23 + +#define SQL_SELECT_ALL_PREFIX_LEVEL 24 +#define SQL_DELETE_ALL_TERMS_SEGDIR 25 +#define SQL_DELETE_SEGDIR_RANGE 26 +#define SQL_SELECT_ALL_LANGID 27 +#define SQL_FIND_MERGE_LEVEL 28 +#define SQL_MAX_LEAF_NODE_ESTIMATE 29 +#define SQL_DELETE_SEGDIR_ENTRY 30 +#define SQL_SHIFT_SEGDIR_ENTRY 31 +#define SQL_SELECT_SEGDIR 32 +#define SQL_CHOMP_SEGDIR 33 +#define SQL_SEGMENT_IS_APPENDABLE 34 +#define SQL_SELECT_INDEXES 35 +#define SQL_SELECT_MXLEVEL 36 + +#define SQL_SELECT_LEVEL_RANGE2 37 +#define SQL_UPDATE_LEVEL_IDX 38 +#define SQL_UPDATE_LEVEL 39 + +/* +** This function is used to obtain an SQLite prepared statement handle +** for the statement identified by the second argument. If successful, +** *pp is set to the requested statement handle and SQLITE_OK returned. +** Otherwise, an SQLite error code is returned and *pp is set to 0. +** +** If argument apVal is not NULL, then it must point to an array with +** at least as many entries as the requested statement has bound +** parameters. The values are bound to the statements parameters before +** returning. +*/ +static int fts3SqlStmt( + Fts3Table *p, /* Virtual table handle */ + int eStmt, /* One of the SQL_XXX constants above */ + sqlite3_stmt **pp, /* OUT: Statement handle */ + sqlite3_value **apVal /* Values to bind to statement */ +){ + const char *azSql[] = { +/* 0 */ "DELETE FROM %Q.'%q_content' WHERE rowid = ?", +/* 1 */ "SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?)", +/* 2 */ "DELETE FROM %Q.'%q_content'", +/* 3 */ "DELETE FROM %Q.'%q_segments'", +/* 4 */ "DELETE FROM %Q.'%q_segdir'", +/* 5 */ "DELETE FROM %Q.'%q_docsize'", +/* 6 */ "DELETE FROM %Q.'%q_stat'", +/* 7 */ "SELECT %s WHERE rowid=?", +/* 8 */ "SELECT (SELECT max(idx) FROM %Q.'%q_segdir' WHERE level = ?) + 1", +/* 9 */ "REPLACE INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)", +/* 10 */ "SELECT coalesce((SELECT max(blockid) FROM %Q.'%q_segments') + 1, 1)", +/* 11 */ "REPLACE INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", + + /* Return segments in order from oldest to newest.*/ +/* 12 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", +/* 13 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?" + "ORDER BY level DESC, idx ASC", + +/* 14 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?", +/* 15 */ "SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", + +/* 16 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?", +/* 17 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?", +/* 18 */ "INSERT INTO %Q.'%q_content' VALUES(%s)", +/* 19 */ "DELETE FROM %Q.'%q_docsize' WHERE docid = ?", +/* 20 */ "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)", +/* 21 */ "SELECT size FROM %Q.'%q_docsize' WHERE docid=?", +/* 22 */ "SELECT value FROM %Q.'%q_stat' WHERE id=?", +/* 23 */ "REPLACE INTO %Q.'%q_stat' VALUES(?,?)", +/* 24 */ "", +/* 25 */ "", + +/* 26 */ "DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", +/* 27 */ "SELECT ? UNION SELECT level / (1024 * ?) FROM %Q.'%q_segdir'", + +/* This statement is used to determine which level to read the input from +** when performing an incremental merge. It returns the absolute level number +** of the oldest level in the db that contains at least ? segments. Or, +** if no level in the FTS index contains more than ? segments, the statement +** returns zero rows. */ +/* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' " + " GROUP BY level HAVING cnt>=?" + " ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1", + +/* Estimate the upper limit on the number of leaf nodes in a new segment +** created by merging the oldest :2 segments from absolute level :1. See +** function sqlite3Fts3Incrmerge() for details. */ +/* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) " + " FROM (SELECT * FROM %Q.'%q_segdir' " + " WHERE level = ? ORDER BY idx ASC LIMIT ?" + " )", + +/* SQL_DELETE_SEGDIR_ENTRY +** Delete the %_segdir entry on absolute level :1 with index :2. */ +/* 30 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", + +/* SQL_SHIFT_SEGDIR_ENTRY +** Modify the idx value for the segment with idx=:3 on absolute level :2 +** to :1. */ +/* 31 */ "UPDATE %Q.'%q_segdir' SET idx = ? WHERE level=? AND idx=?", + +/* SQL_SELECT_SEGDIR +** Read a single entry from the %_segdir table. The entry from absolute +** level :1 with index value :2. */ +/* 32 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?", + +/* SQL_CHOMP_SEGDIR +** Update the start_block (:1) and root (:2) fields of the %_segdir +** entry located on absolute level :3 with index :4. */ +/* 33 */ "UPDATE %Q.'%q_segdir' SET start_block = ?, root = ?" + "WHERE level = ? AND idx = ?", + +/* SQL_SEGMENT_IS_APPENDABLE +** Return a single row if the segment with end_block=? is appendable. Or +** no rows otherwise. */ +/* 34 */ "SELECT 1 FROM %Q.'%q_segments' WHERE blockid=? AND block IS NULL", + +/* SQL_SELECT_INDEXES +** Return the list of valid segment indexes for absolute level ? */ +/* 35 */ "SELECT idx FROM %Q.'%q_segdir' WHERE level=? ORDER BY 1 ASC", + +/* SQL_SELECT_MXLEVEL +** Return the largest relative level in the FTS index or indexes. */ +/* 36 */ "SELECT max( level %% 1024 ) FROM %Q.'%q_segdir'", + + /* Return segments in order from oldest to newest.*/ +/* 37 */ "SELECT level, idx, end_block " + "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? " + "ORDER BY level DESC, idx ASC", + + /* Update statements used while promoting segments */ +/* 38 */ "UPDATE OR FAIL %Q.'%q_segdir' SET level=-1,idx=? " + "WHERE level=? AND idx=?", +/* 39 */ "UPDATE OR FAIL %Q.'%q_segdir' SET level=? WHERE level=-1" + + }; + int rc = SQLITE_OK; + sqlite3_stmt *pStmt; + + assert( SizeofArray(azSql)==SizeofArray(p->aStmt) ); + assert( eStmt=0 ); + + pStmt = p->aStmt[eStmt]; + if( !pStmt ){ + int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; + char *zSql; + if( eStmt==SQL_CONTENT_INSERT ){ + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); + }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + f &= ~SQLITE_PREPARE_NO_VTAB; + zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); + }else{ + zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); + } + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); + sqlite3_free(zSql); + assert( rc==SQLITE_OK || pStmt==0 ); + p->aStmt[eStmt] = pStmt; + } + } + if( apVal ){ + int i; + int nParam = sqlite3_bind_parameter_count(pStmt); + for(i=0; rc==SQLITE_OK && inPendingData==0 ){ + sqlite3_stmt *pStmt; + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_null(pStmt, 1); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + } + } + + return rc; +} + +/* +** FTS maintains a separate indexes for each language-id (a 32-bit integer). +** Within each language id, a separate index is maintained to store the +** document terms, and each configured prefix size (configured the FTS +** "prefix=" option). And each index consists of multiple levels ("relative +** levels"). +** +** All three of these values (the language id, the specific index and the +** level within the index) are encoded in 64-bit integer values stored +** in the %_segdir table on disk. This function is used to convert three +** separate component values into the single 64-bit integer value that +** can be used to query the %_segdir table. +** +** Specifically, each language-id/index combination is allocated 1024 +** 64-bit integer level values ("absolute levels"). The main terms index +** for language-id 0 is allocate values 0-1023. The first prefix index +** (if any) for language-id 0 is allocated values 1024-2047. And so on. +** Language 1 indexes are allocated immediately following language 0. +** +** So, for a system with nPrefix prefix indexes configured, the block of +** absolute levels that corresponds to language-id iLangid and index +** iIndex starts at absolute level ((iLangid * (nPrefix+1) + iIndex) * 1024). +*/ +static sqlite3_int64 getAbsoluteLevel( + Fts3Table *p, /* FTS3 table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index in p->aIndex[] */ + int iLevel /* Level of segments */ +){ + sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ + assert_fts3_nc( iLangid>=0 ); + assert( p->nIndex>0 ); + assert( iIndex>=0 && iIndexnIndex ); + + iBase = ((sqlite3_int64)iLangid * p->nIndex + iIndex) * FTS3_SEGDIR_MAXLEVEL; + return iBase + iLevel; +} + +/* +** Set *ppStmt to a statement handle that may be used to iterate through +** all rows in the %_segdir table, from oldest to newest. If successful, +** return SQLITE_OK. If an error occurs while preparing the statement, +** return an SQLite error code. +** +** There is only ever one instance of this SQL statement compiled for +** each FTS3 table. +** +** The statement returns the following columns from the %_segdir table: +** +** 0: idx +** 1: start_block +** 2: leaves_end_block +** 3: end_block +** 4: root +*/ +SQLITE_PRIVATE int sqlite3Fts3AllSegdirs( + Fts3Table *p, /* FTS3 table */ + int iLangid, /* Language being queried */ + int iIndex, /* Index for p->aIndex[] */ + int iLevel, /* Level to select (relative level) */ + sqlite3_stmt **ppStmt /* OUT: Compiled statement */ +){ + int rc; + sqlite3_stmt *pStmt = 0; + + assert( iLevel==FTS3_SEGCURSOR_ALL || iLevel>=0 ); + assert( iLevel=0 && iIndexnIndex ); + + if( iLevel<0 ){ + /* "SELECT * FROM %_segdir WHERE level BETWEEN ? AND ? ORDER BY ..." */ + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pStmt, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + } + }else{ + /* "SELECT * FROM %_segdir WHERE level = ? ORDER BY ..." */ + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex,iLevel)); + } + } + *ppStmt = pStmt; + return rc; +} + + +/* +** Append a single varint to a PendingList buffer. SQLITE_OK is returned +** if successful, or an SQLite error code otherwise. +** +** This function also serves to allocate the PendingList structure itself. +** For example, to create a new PendingList structure containing two +** varints: +** +** PendingList *p = 0; +** fts3PendingListAppendVarint(&p, 1); +** fts3PendingListAppendVarint(&p, 2); +*/ +static int fts3PendingListAppendVarint( + PendingList **pp, /* IN/OUT: Pointer to PendingList struct */ + sqlite3_int64 i /* Value to append to data */ +){ + PendingList *p = *pp; + + /* Allocate or grow the PendingList as required. */ + if( !p ){ + p = sqlite3_malloc(sizeof(*p) + 100); + if( !p ){ + return SQLITE_NOMEM; + } + p->nSpace = 100; + p->aData = (char *)&p[1]; + p->nData = 0; + } + else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ + int nNew = p->nSpace * 2; + p = sqlite3_realloc(p, sizeof(*p) + nNew); + if( !p ){ + sqlite3_free(*pp); + *pp = 0; + return SQLITE_NOMEM; + } + p->nSpace = nNew; + p->aData = (char *)&p[1]; + } + + /* Append the new serialized varint to the end of the list. */ + p->nData += sqlite3Fts3PutVarint(&p->aData[p->nData], i); + p->aData[p->nData] = '\0'; + *pp = p; + return SQLITE_OK; +} + +/* +** Add a docid/column/position entry to a PendingList structure. Non-zero +** is returned if the structure is sqlite3_realloced as part of adding +** the entry. Otherwise, zero. +** +** If an OOM error occurs, *pRc is set to SQLITE_NOMEM before returning. +** Zero is always returned in this case. Otherwise, if no OOM error occurs, +** it is set to SQLITE_OK. +*/ +static int fts3PendingListAppend( + PendingList **pp, /* IN/OUT: PendingList structure */ + sqlite3_int64 iDocid, /* Docid for entry to add */ + sqlite3_int64 iCol, /* Column for entry to add */ + sqlite3_int64 iPos, /* Position of term for entry to add */ + int *pRc /* OUT: Return code */ +){ + PendingList *p = *pp; + int rc = SQLITE_OK; + + assert( !p || p->iLastDocid<=iDocid ); + + if( !p || p->iLastDocid!=iDocid ){ + u64 iDelta = (u64)iDocid - (u64)(p ? p->iLastDocid : 0); + if( p ){ + assert( p->nDatanSpace ); + assert( p->aData[p->nData]==0 ); + p->nData++; + } + if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iDelta)) ){ + goto pendinglistappend_out; + } + p->iLastCol = -1; + p->iLastPos = 0; + p->iLastDocid = iDocid; + } + if( iCol>0 && p->iLastCol!=iCol ){ + if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, 1)) + || SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iCol)) + ){ + goto pendinglistappend_out; + } + p->iLastCol = iCol; + p->iLastPos = 0; + } + if( iCol>=0 ){ + assert( iPos>p->iLastPos || (iPos==0 && p->iLastPos==0) ); + rc = fts3PendingListAppendVarint(&p, 2+iPos-p->iLastPos); + if( rc==SQLITE_OK ){ + p->iLastPos = iPos; + } + } + + pendinglistappend_out: + *pRc = rc; + if( p!=*pp ){ + *pp = p; + return 1; + } + return 0; +} + +/* +** Free a PendingList object allocated by fts3PendingListAppend(). +*/ +static void fts3PendingListDelete(PendingList *pList){ + sqlite3_free(pList); +} + +/* +** Add an entry to one of the pending-terms hash tables. +*/ +static int fts3PendingTermsAddOne( + Fts3Table *p, + int iCol, + int iPos, + Fts3Hash *pHash, /* Pending terms hash table to add entry to */ + const char *zToken, + int nToken +){ + PendingList *pList; + int rc = SQLITE_OK; + + pList = (PendingList *)fts3HashFind(pHash, zToken, nToken); + if( pList ){ + p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem)); + } + if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){ + if( pList==fts3HashInsert(pHash, zToken, nToken, pList) ){ + /* Malloc failed while inserting the new entry. This can only + ** happen if there was no previous entry for this token. + */ + assert( 0==fts3HashFind(pHash, zToken, nToken) ); + sqlite3_free(pList); + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem)); + } + return rc; +} + +/* +** Tokenize the nul-terminated string zText and add all tokens to the +** pending-terms hash-table. The docid used is that currently stored in +** p->iPrevDocid, and the column is specified by argument iCol. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +static int fts3PendingTermsAdd( + Fts3Table *p, /* Table into which text will be inserted */ + int iLangid, /* Language id to use */ + const char *zText, /* Text of document to be inserted */ + int iCol, /* Column into which text is being inserted */ + u32 *pnWord /* IN/OUT: Incr. by number tokens inserted */ +){ + int rc; + int iStart = 0; + int iEnd = 0; + int iPos = 0; + int nWord = 0; + + char const *zToken; + int nToken = 0; + + sqlite3_tokenizer *pTokenizer = p->pTokenizer; + sqlite3_tokenizer_module const *pModule = pTokenizer->pModule; + sqlite3_tokenizer_cursor *pCsr; + int (*xNext)(sqlite3_tokenizer_cursor *pCursor, + const char**,int*,int*,int*,int*); + + assert( pTokenizer && pModule ); + + /* If the user has inserted a NULL value, this function may be called with + ** zText==0. In this case, add zero token entries to the hash table and + ** return early. */ + if( zText==0 ){ + *pnWord = 0; + return SQLITE_OK; + } + + rc = sqlite3Fts3OpenTokenizer(pTokenizer, iLangid, zText, -1, &pCsr); + if( rc!=SQLITE_OK ){ + return rc; + } + + xNext = pModule->xNext; + while( SQLITE_OK==rc + && SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos)) + ){ + int i; + if( iPos>=nWord ) nWord = iPos+1; + + /* Positions cannot be negative; we use -1 as a terminator internally. + ** Tokens must have a non-zero length. + */ + if( iPos<0 || !zToken || nToken<=0 ){ + rc = SQLITE_ERROR; + break; + } + + /* Add the term to the terms index */ + rc = fts3PendingTermsAddOne( + p, iCol, iPos, &p->aIndex[0].hPending, zToken, nToken + ); + + /* Add the term to each of the prefix indexes that it is not too + ** short for. */ + for(i=1; rc==SQLITE_OK && inIndex; i++){ + struct Fts3Index *pIndex = &p->aIndex[i]; + if( nTokennPrefix ) continue; + rc = fts3PendingTermsAddOne( + p, iCol, iPos, &pIndex->hPending, zToken, pIndex->nPrefix + ); + } + } + + pModule->xClose(pCsr); + *pnWord += nWord; + return (rc==SQLITE_DONE ? SQLITE_OK : rc); +} + +/* +** Calling this function indicates that subsequent calls to +** fts3PendingTermsAdd() are to add term/position-list pairs for the +** contents of the document with docid iDocid. +*/ +static int fts3PendingTermsDocid( + Fts3Table *p, /* Full-text table handle */ + int bDelete, /* True if this op is a delete */ + int iLangid, /* Language id of row being written */ + sqlite_int64 iDocid /* Docid of row being written */ +){ + assert( iLangid>=0 ); + assert( bDelete==1 || bDelete==0 ); + + /* TODO(shess) Explore whether partially flushing the buffer on + ** forced-flush would provide better performance. I suspect that if + ** we ordered the doclists by size and flushed the largest until the + ** buffer was half empty, that would let the less frequent terms + ** generate longer doclists. + */ + if( iDocidiPrevDocid + || (iDocid==p->iPrevDocid && p->bPrevDelete==0) + || p->iPrevLangid!=iLangid + || p->nPendingData>p->nMaxPendingData + ){ + int rc = sqlite3Fts3PendingTermsFlush(p); + if( rc!=SQLITE_OK ) return rc; + } + p->iPrevDocid = iDocid; + p->iPrevLangid = iLangid; + p->bPrevDelete = bDelete; + return SQLITE_OK; +} + +/* +** Discard the contents of the pending-terms hash tables. +*/ +SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ + int i; + for(i=0; inIndex; i++){ + Fts3HashElem *pElem; + Fts3Hash *pHash = &p->aIndex[i].hPending; + for(pElem=fts3HashFirst(pHash); pElem; pElem=fts3HashNext(pElem)){ + PendingList *pList = (PendingList *)fts3HashData(pElem); + fts3PendingListDelete(pList); + } + fts3HashClear(pHash); + } + p->nPendingData = 0; +} + +/* +** This function is called by the xUpdate() method as part of an INSERT +** operation. It adds entries for each term in the new record to the +** pendingTerms hash table. +** +** Argument apVal is the same as the similarly named argument passed to +** fts3InsertData(). Parameter iDocid is the docid of the new row. +*/ +static int fts3InsertTerms( + Fts3Table *p, + int iLangid, + sqlite3_value **apVal, + u32 *aSz +){ + int i; /* Iterator variable */ + for(i=2; inColumn+2; i++){ + int iCol = i-2; + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_value_text(apVal[i]); + int rc = fts3PendingTermsAdd(p, iLangid, zText, iCol, &aSz[iCol]); + if( rc!=SQLITE_OK ){ + return rc; + } + aSz[p->nColumn] += sqlite3_value_bytes(apVal[i]); + } + } + return SQLITE_OK; +} + +/* +** This function is called by the xUpdate() method for an INSERT operation. +** The apVal parameter is passed a copy of the apVal argument passed by +** SQLite to the xUpdate() method. i.e: +** +** apVal[0] Not used for INSERT. +** apVal[1] rowid +** apVal[2] Left-most user-defined column +** ... +** apVal[p->nColumn+1] Right-most user-defined column +** apVal[p->nColumn+2] Hidden column with same name as table +** apVal[p->nColumn+3] Hidden "docid" column (alias for rowid) +** apVal[p->nColumn+4] Hidden languageid column +*/ +static int fts3InsertData( + Fts3Table *p, /* Full-text table */ + sqlite3_value **apVal, /* Array of values to insert */ + sqlite3_int64 *piDocid /* OUT: Docid for row just inserted */ +){ + int rc; /* Return code */ + sqlite3_stmt *pContentInsert; /* INSERT INTO %_content VALUES(...) */ + + if( p->zContentTbl ){ + sqlite3_value *pRowid = apVal[p->nColumn+3]; + if( sqlite3_value_type(pRowid)==SQLITE_NULL ){ + pRowid = apVal[1]; + } + if( sqlite3_value_type(pRowid)!=SQLITE_INTEGER ){ + return SQLITE_CONSTRAINT; + } + *piDocid = sqlite3_value_int64(pRowid); + return SQLITE_OK; + } + + /* Locate the statement handle used to insert data into the %_content + ** table. The SQL for this statement is: + ** + ** INSERT INTO %_content VALUES(?, ?, ?, ...) + ** + ** The statement features N '?' variables, where N is the number of user + ** defined columns in the FTS3 table, plus one for the docid field. + */ + rc = fts3SqlStmt(p, SQL_CONTENT_INSERT, &pContentInsert, &apVal[1]); + if( rc==SQLITE_OK && p->zLanguageid ){ + rc = sqlite3_bind_int( + pContentInsert, p->nColumn+2, + sqlite3_value_int(apVal[p->nColumn+4]) + ); + } + if( rc!=SQLITE_OK ) return rc; + + /* There is a quirk here. The users INSERT statement may have specified + ** a value for the "rowid" field, for the "docid" field, or for both. + ** Which is a problem, since "rowid" and "docid" are aliases for the + ** same value. For example: + ** + ** INSERT INTO fts3tbl(rowid, docid) VALUES(1, 2); + ** + ** In FTS3, this is an error. It is an error to specify non-NULL values + ** for both docid and some other rowid alias. + */ + if( SQLITE_NULL!=sqlite3_value_type(apVal[3+p->nColumn]) ){ + if( SQLITE_NULL==sqlite3_value_type(apVal[0]) + && SQLITE_NULL!=sqlite3_value_type(apVal[1]) + ){ + /* A rowid/docid conflict. */ + return SQLITE_ERROR; + } + rc = sqlite3_bind_value(pContentInsert, 1, apVal[3+p->nColumn]); + if( rc!=SQLITE_OK ) return rc; + } + + /* Execute the statement to insert the record. Set *piDocid to the + ** new docid value. + */ + sqlite3_step(pContentInsert); + rc = sqlite3_reset(pContentInsert); + + *piDocid = sqlite3_last_insert_rowid(p->db); + return rc; +} + + + +/* +** Remove all data from the FTS3 table. Clear the hash table containing +** pending terms. +*/ +static int fts3DeleteAll(Fts3Table *p, int bContent){ + int rc = SQLITE_OK; /* Return code */ + + /* Discard the contents of the pending-terms hash table. */ + sqlite3Fts3PendingTermsClear(p); + + /* Delete everything from the shadow tables. Except, leave %_content as + ** is if bContent is false. */ + assert( p->zContentTbl==0 || bContent==0 ); + if( bContent ) fts3SqlExec(&rc, p, SQL_DELETE_ALL_CONTENT, 0); + fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGMENTS, 0); + fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGDIR, 0); + if( p->bHasDocsize ){ + fts3SqlExec(&rc, p, SQL_DELETE_ALL_DOCSIZE, 0); + } + if( p->bHasStat ){ + fts3SqlExec(&rc, p, SQL_DELETE_ALL_STAT, 0); + } + return rc; +} + +/* +** +*/ +static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){ + int iLangid = 0; + if( p->zLanguageid ) iLangid = sqlite3_column_int(pSelect, p->nColumn+1); + return iLangid; +} + +/* +** The first element in the apVal[] array is assumed to contain the docid +** (an integer) of a row about to be deleted. Remove all terms from the +** full-text index. +*/ +static void fts3DeleteTerms( + int *pRC, /* Result code */ + Fts3Table *p, /* The FTS table to delete from */ + sqlite3_value *pRowid, /* The docid to be deleted */ + u32 *aSz, /* Sizes of deleted document written here */ + int *pbFound /* OUT: Set to true if row really does exist */ +){ + int rc; + sqlite3_stmt *pSelect; + + assert( *pbFound==0 ); + if( *pRC ) return; + rc = fts3SqlStmt(p, SQL_SELECT_CONTENT_BY_ROWID, &pSelect, &pRowid); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + int i; + int iLangid = langidFromSelect(p, pSelect); + i64 iDocid = sqlite3_column_int64(pSelect, 0); + rc = fts3PendingTermsDocid(p, 1, iLangid, iDocid); + for(i=1; rc==SQLITE_OK && i<=p->nColumn; i++){ + int iCol = i-1; + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pSelect, i); + rc = fts3PendingTermsAdd(p, iLangid, zText, -1, &aSz[iCol]); + aSz[p->nColumn] += sqlite3_column_bytes(pSelect, i); + } + } + if( rc!=SQLITE_OK ){ + sqlite3_reset(pSelect); + *pRC = rc; + return; + } + *pbFound = 1; + } + rc = sqlite3_reset(pSelect); + }else{ + sqlite3_reset(pSelect); + } + *pRC = rc; +} + +/* +** Forward declaration to account for the circular dependency between +** functions fts3SegmentMerge() and fts3AllocateSegdirIdx(). +*/ +static int fts3SegmentMerge(Fts3Table *, int, int, int); + +/* +** This function allocates a new level iLevel index in the segdir table. +** Usually, indexes are allocated within a level sequentially starting +** with 0, so the allocated index is one greater than the value returned +** by: +** +** SELECT max(idx) FROM %_segdir WHERE level = :iLevel +** +** However, if there are already FTS3_MERGE_COUNT indexes at the requested +** level, they are merged into a single level (iLevel+1) segment and the +** allocated index is 0. +** +** If successful, *piIdx is set to the allocated index slot and SQLITE_OK +** returned. Otherwise, an SQLite error code is returned. +*/ +static int fts3AllocateSegdirIdx( + Fts3Table *p, + int iLangid, /* Language id */ + int iIndex, /* Index for p->aIndex */ + int iLevel, + int *piIdx +){ + int rc; /* Return Code */ + sqlite3_stmt *pNextIdx; /* Query for next idx at level iLevel */ + int iNext = 0; /* Result of query pNextIdx */ + + assert( iLangid>=0 ); + assert( p->nIndex>=1 ); + + /* Set variable iNext to the next available segdir index at level iLevel. */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pNextIdx, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64( + pNextIdx, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel) + ); + if( SQLITE_ROW==sqlite3_step(pNextIdx) ){ + iNext = sqlite3_column_int(pNextIdx, 0); + } + rc = sqlite3_reset(pNextIdx); + } + + if( rc==SQLITE_OK ){ + /* If iNext is FTS3_MERGE_COUNT, indicating that level iLevel is already + ** full, merge all segments in level iLevel into a single iLevel+1 + ** segment and allocate (newly freed) index 0 at level iLevel. Otherwise, + ** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext. + */ + if( iNext>=MergeCount(p) ){ + fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); + rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel); + *piIdx = 0; + }else{ + *piIdx = iNext; + } + } + + return rc; +} + +/* +** The %_segments table is declared as follows: +** +** CREATE TABLE %_segments(blockid INTEGER PRIMARY KEY, block BLOB) +** +** This function reads data from a single row of the %_segments table. The +** specific row is identified by the iBlockid parameter. If paBlob is not +** NULL, then a buffer is allocated using sqlite3_malloc() and populated +** with the contents of the blob stored in the "block" column of the +** identified table row is. Whether or not paBlob is NULL, *pnBlob is set +** to the size of the blob in bytes before returning. +** +** If an error occurs, or the table does not contain the specified row, +** an SQLite error code is returned. Otherwise, SQLITE_OK is returned. If +** paBlob is non-NULL, then it is the responsibility of the caller to +** eventually free the returned buffer. +** +** This function may leave an open sqlite3_blob* handle in the +** Fts3Table.pSegments variable. This handle is reused by subsequent calls +** to this function. The handle may be closed by calling the +** sqlite3Fts3SegmentsClose() function. Reusing a blob handle is a handy +** performance improvement, but the blob handle should always be closed +** before control is returned to the user (to prevent a lock being held +** on the database file for longer than necessary). Thus, any virtual table +** method (xFilter etc.) that may directly or indirectly call this function +** must call sqlite3Fts3SegmentsClose() before returning. +*/ +SQLITE_PRIVATE int sqlite3Fts3ReadBlock( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iBlockid, /* Access the row with blockid=$iBlockid */ + char **paBlob, /* OUT: Blob data in malloc'd buffer */ + int *pnBlob, /* OUT: Size of blob data */ + int *pnLoad /* OUT: Bytes actually loaded */ +){ + int rc; /* Return code */ + + /* pnBlob must be non-NULL. paBlob may be NULL or non-NULL. */ + assert( pnBlob ); + + if( p->pSegments ){ + rc = sqlite3_blob_reopen(p->pSegments, iBlockid); + }else{ + if( 0==p->zSegmentsTbl ){ + p->zSegmentsTbl = sqlite3_mprintf("%s_segments", p->zName); + if( 0==p->zSegmentsTbl ) return SQLITE_NOMEM; + } + rc = sqlite3_blob_open( + p->db, p->zDb, p->zSegmentsTbl, "block", iBlockid, 0, &p->pSegments + ); + } + + if( rc==SQLITE_OK ){ + int nByte = sqlite3_blob_bytes(p->pSegments); + *pnBlob = nByte; + if( paBlob ){ + char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); + if( !aByte ){ + rc = SQLITE_NOMEM; + }else{ + if( pnLoad && nByte>(FTS3_NODE_CHUNK_THRESHOLD) ){ + nByte = FTS3_NODE_CHUNKSIZE; + *pnLoad = nByte; + } + rc = sqlite3_blob_read(p->pSegments, aByte, nByte, 0); + memset(&aByte[nByte], 0, FTS3_NODE_PADDING); + if( rc!=SQLITE_OK ){ + sqlite3_free(aByte); + aByte = 0; + } + } + *paBlob = aByte; + } + }else if( rc==SQLITE_ERROR ){ + rc = FTS_CORRUPT_VTAB; + } + + return rc; +} + +/* +** Close the blob handle at p->pSegments, if it is open. See comments above +** the sqlite3Fts3ReadBlock() function for details. +*/ +SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *p){ + sqlite3_blob_close(p->pSegments); + p->pSegments = 0; +} + +static int fts3SegReaderIncrRead(Fts3SegReader *pReader){ + int nRead; /* Number of bytes to read */ + int rc; /* Return code */ + + nRead = MIN(pReader->nNode - pReader->nPopulate, FTS3_NODE_CHUNKSIZE); + rc = sqlite3_blob_read( + pReader->pBlob, + &pReader->aNode[pReader->nPopulate], + nRead, + pReader->nPopulate + ); + + if( rc==SQLITE_OK ){ + pReader->nPopulate += nRead; + memset(&pReader->aNode[pReader->nPopulate], 0, FTS3_NODE_PADDING); + if( pReader->nPopulate==pReader->nNode ){ + sqlite3_blob_close(pReader->pBlob); + pReader->pBlob = 0; + pReader->nPopulate = 0; + } + } + return rc; +} + +static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){ + int rc = SQLITE_OK; + assert( !pReader->pBlob + || (pFrom>=pReader->aNode && pFrom<&pReader->aNode[pReader->nNode]) + ); + while( pReader->pBlob && rc==SQLITE_OK + && (pFrom - pReader->aNode + nByte)>pReader->nPopulate + ){ + rc = fts3SegReaderIncrRead(pReader); + } + return rc; +} + +/* +** Set an Fts3SegReader cursor to point at EOF. +*/ +static void fts3SegReaderSetEof(Fts3SegReader *pSeg){ + if( !fts3SegReaderIsRootOnly(pSeg) ){ + sqlite3_free(pSeg->aNode); + sqlite3_blob_close(pSeg->pBlob); + pSeg->pBlob = 0; + } + pSeg->aNode = 0; +} + +/* +** Move the iterator passed as the first argument to the next term in the +** segment. If successful, SQLITE_OK is returned. If there is no next term, +** SQLITE_DONE. Otherwise, an SQLite error code. +*/ +static int fts3SegReaderNext( + Fts3Table *p, + Fts3SegReader *pReader, + int bIncr +){ + int rc; /* Return code of various sub-routines */ + char *pNext; /* Cursor variable */ + int nPrefix; /* Number of bytes in term prefix */ + int nSuffix; /* Number of bytes in term suffix */ + + if( !pReader->aDoclist ){ + pNext = pReader->aNode; + }else{ + pNext = &pReader->aDoclist[pReader->nDoclist]; + } + + if( !pNext || pNext>=&pReader->aNode[pReader->nNode] ){ + + if( fts3SegReaderIsPending(pReader) ){ + Fts3HashElem *pElem = *(pReader->ppNextElem); + sqlite3_free(pReader->aNode); + pReader->aNode = 0; + if( pElem ){ + char *aCopy; + PendingList *pList = (PendingList *)fts3HashData(pElem); + int nCopy = pList->nData+1; + + int nTerm = fts3HashKeysize(pElem); + if( (nTerm+1)>pReader->nTermAlloc ){ + sqlite3_free(pReader->zTerm); + pReader->zTerm = (char*)sqlite3_malloc((nTerm+1)*2); + if( !pReader->zTerm ) return SQLITE_NOMEM; + pReader->nTermAlloc = (nTerm+1)*2; + } + memcpy(pReader->zTerm, fts3HashKey(pElem), nTerm); + pReader->zTerm[nTerm] = '\0'; + pReader->nTerm = nTerm; + + aCopy = (char*)sqlite3_malloc(nCopy); + if( !aCopy ) return SQLITE_NOMEM; + memcpy(aCopy, pList->aData, nCopy); + pReader->nNode = pReader->nDoclist = nCopy; + pReader->aNode = pReader->aDoclist = aCopy; + pReader->ppNextElem++; + assert( pReader->aNode ); + } + return SQLITE_OK; + } + + fts3SegReaderSetEof(pReader); + + /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf + ** blocks have already been traversed. */ +#ifdef CORRUPT_DB + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); +#endif + if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ + return SQLITE_OK; + } + + rc = sqlite3Fts3ReadBlock( + p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode, + (bIncr ? &pReader->nPopulate : 0) + ); + if( rc!=SQLITE_OK ) return rc; + assert( pReader->pBlob==0 ); + if( bIncr && pReader->nPopulatenNode ){ + pReader->pBlob = p->pSegments; + p->pSegments = 0; + } + pNext = pReader->aNode; + } + + assert( !fts3SegReaderIsPending(pReader) ); + + rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2); + if( rc!=SQLITE_OK ) return rc; + + /* Because of the FTS3_NODE_PADDING bytes of padding, the following is + ** safe (no risk of overread) even if the node data is corrupted. */ + pNext += fts3GetVarint32(pNext, &nPrefix); + pNext += fts3GetVarint32(pNext, &nSuffix); + if( nSuffix<=0 + || (&pReader->aNode[pReader->nNode] - pNext)pReader->nTerm + ){ + return FTS_CORRUPT_VTAB; + } + + /* Both nPrefix and nSuffix were read by fts3GetVarint32() and so are + ** between 0 and 0x7FFFFFFF. But the sum of the two may cause integer + ** overflow - hence the (i64) casts. */ + if( (i64)nPrefix+nSuffix>(i64)pReader->nTermAlloc ){ + i64 nNew = ((i64)nPrefix+nSuffix)*2; + char *zNew = sqlite3_realloc64(pReader->zTerm, nNew); + if( !zNew ){ + return SQLITE_NOMEM; + } + pReader->zTerm = zNew; + pReader->nTermAlloc = nNew; + } + + rc = fts3SegReaderRequire(pReader, pNext, nSuffix+FTS3_VARINT_MAX); + if( rc!=SQLITE_OK ) return rc; + + memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix); + pReader->nTerm = nPrefix+nSuffix; + pNext += nSuffix; + pNext += fts3GetVarint32(pNext, &pReader->nDoclist); + pReader->aDoclist = pNext; + pReader->pOffsetList = 0; + + /* Check that the doclist does not appear to extend past the end of the + ** b-tree node. And that the final byte of the doclist is 0x00. If either + ** of these statements is untrue, then the data structure is corrupt. + */ + if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) + || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) + || pReader->nDoclist==0 + ){ + return FTS_CORRUPT_VTAB; + } + return SQLITE_OK; +} + +/* +** Set the SegReader to point to the first docid in the doclist associated +** with the current term. +*/ +static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ + int rc = SQLITE_OK; + assert( pReader->aDoclist ); + assert( !pReader->pOffsetList ); + if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + u8 bEof = 0; + pReader->iDocid = 0; + pReader->nOffsetList = 0; + sqlite3Fts3DoclistPrev(0, + pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList, + &pReader->iDocid, &pReader->nOffsetList, &bEof + ); + }else{ + rc = fts3SegReaderRequire(pReader, pReader->aDoclist, FTS3_VARINT_MAX); + if( rc==SQLITE_OK ){ + int n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid); + pReader->pOffsetList = &pReader->aDoclist[n]; + } + } + return rc; +} + +/* +** Advance the SegReader to point to the next docid in the doclist +** associated with the current term. +** +** If arguments ppOffsetList and pnOffsetList are not NULL, then +** *ppOffsetList is set to point to the first column-offset list +** in the doclist entry (i.e. immediately past the docid varint). +** *pnOffsetList is set to the length of the set of column-offset +** lists, not including the nul-terminator byte. For example: +*/ +static int fts3SegReaderNextDocid( + Fts3Table *pTab, + Fts3SegReader *pReader, /* Reader to advance to next docid */ + char **ppOffsetList, /* OUT: Pointer to current position-list */ + int *pnOffsetList /* OUT: Length of *ppOffsetList in bytes */ +){ + int rc = SQLITE_OK; + char *p = pReader->pOffsetList; + char c = 0; + + assert( p ); + + if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + /* A pending-terms seg-reader for an FTS4 table that uses order=desc. + ** Pending-terms doclists are always built up in ascending order, so + ** we have to iterate through them backwards here. */ + u8 bEof = 0; + if( ppOffsetList ){ + *ppOffsetList = pReader->pOffsetList; + *pnOffsetList = pReader->nOffsetList - 1; + } + sqlite3Fts3DoclistPrev(0, + pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid, + &pReader->nOffsetList, &bEof + ); + if( bEof ){ + pReader->pOffsetList = 0; + }else{ + pReader->pOffsetList = p; + } + }else{ + char *pEnd = &pReader->aDoclist[pReader->nDoclist]; + + /* Pointer p currently points at the first byte of an offset list. The + ** following block advances it to point one byte past the end of + ** the same offset list. */ + while( 1 ){ + + /* The following line of code (and the "p++" below the while() loop) is + ** normally all that is required to move pointer p to the desired + ** position. The exception is if this node is being loaded from disk + ** incrementally and pointer "p" now points to the first byte past + ** the populated part of pReader->aNode[]. + */ + while( *p | c ) c = *p++ & 0x80; + assert( *p==0 ); + + if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break; + rc = fts3SegReaderIncrRead(pReader); + if( rc!=SQLITE_OK ) return rc; + } + p++; + + /* If required, populate the output variables with a pointer to and the + ** size of the previous offset-list. + */ + if( ppOffsetList ){ + *ppOffsetList = pReader->pOffsetList; + *pnOffsetList = (int)(p - pReader->pOffsetList - 1); + } + + /* List may have been edited in place by fts3EvalNearTrim() */ + while( p=pEnd ){ + pReader->pOffsetList = 0; + }else{ + rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); + if( rc==SQLITE_OK ){ + u64 iDelta; + pReader->pOffsetList = p + sqlite3Fts3GetVarintU(p, &iDelta); + if( pTab->bDescIdx ){ + pReader->iDocid = (i64)((u64)pReader->iDocid - iDelta); + }else{ + pReader->iDocid = (i64)((u64)pReader->iDocid + iDelta); + } + } + } + } + + return rc; +} + + +SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( + Fts3Cursor *pCsr, + Fts3MultiSegReader *pMsr, + int *pnOvfl +){ + Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; + int nOvfl = 0; + int ii; + int rc = SQLITE_OK; + int pgsz = p->nPgsz; + + assert( p->bFts4 ); + assert( pgsz>0 ); + + for(ii=0; rc==SQLITE_OK && iinSegment; ii++){ + Fts3SegReader *pReader = pMsr->apSegment[ii]; + if( !fts3SegReaderIsPending(pReader) + && !fts3SegReaderIsRootOnly(pReader) + ){ + sqlite3_int64 jj; + for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; jj++){ + int nBlob; + rc = sqlite3Fts3ReadBlock(p, jj, 0, &nBlob, 0); + if( rc!=SQLITE_OK ) break; + if( (nBlob+35)>pgsz ){ + nOvfl += (nBlob + 34)/pgsz; + } + } + } + } + *pnOvfl = nOvfl; + return rc; +} + +/* +** Free all allocations associated with the iterator passed as the +** second argument. +*/ +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ + if( pReader ){ + sqlite3_free(pReader->zTerm); + if( !fts3SegReaderIsRootOnly(pReader) ){ + sqlite3_free(pReader->aNode); + } + sqlite3_blob_close(pReader->pBlob); + } + sqlite3_free(pReader); +} + +/* +** Allocate a new SegReader object. +*/ +SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( + int iAge, /* Segment "age". */ + int bLookup, /* True for a lookup only */ + sqlite3_int64 iStartLeaf, /* First leaf to traverse */ + sqlite3_int64 iEndLeaf, /* Final leaf to traverse */ + sqlite3_int64 iEndBlock, /* Final block of segment */ + const char *zRoot, /* Buffer containing root node */ + int nRoot, /* Size of buffer containing root node */ + Fts3SegReader **ppReader /* OUT: Allocated Fts3SegReader */ +){ + Fts3SegReader *pReader; /* Newly allocated SegReader object */ + int nExtra = 0; /* Bytes to allocate segment root node */ + + assert( zRoot!=0 || nRoot==0 ); +#ifdef CORRUPT_DB + assert( zRoot!=0 || CORRUPT_DB ); +#endif + + if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; + nExtra = nRoot + FTS3_NODE_PADDING; + } + + pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + if( !pReader ){ + return SQLITE_NOMEM; + } + memset(pReader, 0, sizeof(Fts3SegReader)); + pReader->iIdx = iAge; + pReader->bLookup = bLookup!=0; + pReader->iStartBlock = iStartLeaf; + pReader->iLeafEndBlock = iEndLeaf; + pReader->iEndBlock = iEndBlock; + + if( nExtra ){ + /* The entire segment is stored in the root node. */ + pReader->aNode = (char *)&pReader[1]; + pReader->rootOnly = 1; + pReader->nNode = nRoot; + if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); + memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); + }else{ + pReader->iCurrentBlock = iStartLeaf-1; + } + *ppReader = pReader; + return SQLITE_OK; +} + +/* +** This is a comparison function used as a qsort() callback when sorting +** an array of pending terms by term. This occurs as part of flushing +** the contents of the pending-terms hash table to the database. +*/ +static int SQLITE_CDECL fts3CompareElemByTerm( + const void *lhs, + const void *rhs +){ + char *z1 = fts3HashKey(*(Fts3HashElem **)lhs); + char *z2 = fts3HashKey(*(Fts3HashElem **)rhs); + int n1 = fts3HashKeysize(*(Fts3HashElem **)lhs); + int n2 = fts3HashKeysize(*(Fts3HashElem **)rhs); + + int n = (n1aIndex */ + const char *zTerm, /* Term to search for */ + int nTerm, /* Size of buffer zTerm */ + int bPrefix, /* True for a prefix iterator */ + Fts3SegReader **ppReader /* OUT: SegReader for pending-terms */ +){ + Fts3SegReader *pReader = 0; /* Fts3SegReader object to return */ + Fts3HashElem *pE; /* Iterator variable */ + Fts3HashElem **aElem = 0; /* Array of term hash entries to scan */ + int nElem = 0; /* Size of array at aElem */ + int rc = SQLITE_OK; /* Return Code */ + Fts3Hash *pHash; + + pHash = &p->aIndex[iIndex].hPending; + if( bPrefix ){ + int nAlloc = 0; /* Size of allocated array at aElem */ + + for(pE=fts3HashFirst(pHash); pE; pE=fts3HashNext(pE)){ + char *zKey = (char *)fts3HashKey(pE); + int nKey = fts3HashKeysize(pE); + if( nTerm==0 || (nKey>=nTerm && 0==memcmp(zKey, zTerm, nTerm)) ){ + if( nElem==nAlloc ){ + Fts3HashElem **aElem2; + nAlloc += 16; + aElem2 = (Fts3HashElem **)sqlite3_realloc( + aElem, nAlloc*sizeof(Fts3HashElem *) + ); + if( !aElem2 ){ + rc = SQLITE_NOMEM; + nElem = 0; + break; + } + aElem = aElem2; + } + + aElem[nElem++] = pE; + } + } + + /* If more than one term matches the prefix, sort the Fts3HashElem + ** objects in term order using qsort(). This uses the same comparison + ** callback as is used when flushing terms to disk. + */ + if( nElem>1 ){ + qsort(aElem, nElem, sizeof(Fts3HashElem *), fts3CompareElemByTerm); + } + + }else{ + /* The query is a simple term lookup that matches at most one term in + ** the index. All that is required is a straight hash-lookup. + ** + ** Because the stack address of pE may be accessed via the aElem pointer + ** below, the "Fts3HashElem *pE" must be declared so that it is valid + ** within this entire function, not just this "else{...}" block. + */ + pE = fts3HashFindElem(pHash, zTerm, nTerm); + if( pE ){ + aElem = &pE; + nElem = 1; + } + } + + if( nElem>0 ){ + sqlite3_int64 nByte; + nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); + pReader = (Fts3SegReader *)sqlite3_malloc64(nByte); + if( !pReader ){ + rc = SQLITE_NOMEM; + }else{ + memset(pReader, 0, nByte); + pReader->iIdx = 0x7FFFFFFF; + pReader->ppNextElem = (Fts3HashElem **)&pReader[1]; + memcpy(pReader->ppNextElem, aElem, nElem*sizeof(Fts3HashElem *)); + } + } + + if( bPrefix ){ + sqlite3_free(aElem); + } + *ppReader = pReader; + return rc; +} + +/* +** Compare the entries pointed to by two Fts3SegReader structures. +** Comparison is as follows: +** +** 1) EOF is greater than not EOF. +** +** 2) The current terms (if any) are compared using memcmp(). If one +** term is a prefix of another, the longer term is considered the +** larger. +** +** 3) By segment age. An older segment is considered larger. +*/ +static int fts3SegReaderCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc; + if( pLhs->aNode && pRhs->aNode ){ + int rc2 = pLhs->nTerm - pRhs->nTerm; + if( rc2<0 ){ + rc = memcmp(pLhs->zTerm, pRhs->zTerm, pLhs->nTerm); + }else{ + rc = memcmp(pLhs->zTerm, pRhs->zTerm, pRhs->nTerm); + } + if( rc==0 ){ + rc = rc2; + } + }else{ + rc = (pLhs->aNode==0) - (pRhs->aNode==0); + } + if( rc==0 ){ + rc = pRhs->iIdx - pLhs->iIdx; + } + assert_fts3_nc( rc!=0 ); + return rc; +} + +/* +** A different comparison function for SegReader structures. In this +** version, it is assumed that each SegReader points to an entry in +** a doclist for identical terms. Comparison is made as follows: +** +** 1) EOF (end of doclist in this case) is greater than not EOF. +** +** 2) By current docid. +** +** 3) By segment age. An older segment is considered larger. +*/ +static int fts3SegReaderDoclistCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0); + if( rc==0 ){ + if( pLhs->iDocid==pRhs->iDocid ){ + rc = pRhs->iIdx - pLhs->iIdx; + }else{ + rc = (pLhs->iDocid > pRhs->iDocid) ? 1 : -1; + } + } + assert( pLhs->aNode && pRhs->aNode ); + return rc; +} +static int fts3SegReaderDoclistCmpRev(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ + int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0); + if( rc==0 ){ + if( pLhs->iDocid==pRhs->iDocid ){ + rc = pRhs->iIdx - pLhs->iIdx; + }else{ + rc = (pLhs->iDocid < pRhs->iDocid) ? 1 : -1; + } + } + assert( pLhs->aNode && pRhs->aNode ); + return rc; +} + +/* +** Compare the term that the Fts3SegReader object passed as the first argument +** points to with the term specified by arguments zTerm and nTerm. +** +** If the pSeg iterator is already at EOF, return 0. Otherwise, return +** -ve if the pSeg term is less than zTerm/nTerm, 0 if the two terms are +** equal, or +ve if the pSeg term is greater than zTerm/nTerm. +*/ +static int fts3SegReaderTermCmp( + Fts3SegReader *pSeg, /* Segment reader object */ + const char *zTerm, /* Term to compare to */ + int nTerm /* Size of term zTerm in bytes */ +){ + int res = 0; + if( pSeg->aNode ){ + if( pSeg->nTerm>nTerm ){ + res = memcmp(pSeg->zTerm, zTerm, nTerm); + }else{ + res = memcmp(pSeg->zTerm, zTerm, pSeg->nTerm); + } + if( res==0 ){ + res = pSeg->nTerm-nTerm; + } + } + return res; +} + +/* +** Argument apSegment is an array of nSegment elements. It is known that +** the final (nSegment-nSuspect) members are already in sorted order +** (according to the comparison function provided). This function shuffles +** the array around until all entries are in sorted order. +*/ +static void fts3SegReaderSort( + Fts3SegReader **apSegment, /* Array to sort entries of */ + int nSegment, /* Size of apSegment array */ + int nSuspect, /* Unsorted entry count */ + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) /* Comparison function */ +){ + int i; /* Iterator variable */ + + assert( nSuspect<=nSegment ); + + if( nSuspect==nSegment ) nSuspect--; + for(i=nSuspect-1; i>=0; i--){ + int j; + for(j=i; j<(nSegment-1); j++){ + Fts3SegReader *pTmp; + if( xCmp(apSegment[j], apSegment[j+1])<0 ) break; + pTmp = apSegment[j+1]; + apSegment[j+1] = apSegment[j]; + apSegment[j] = pTmp; + } + } + +#ifndef NDEBUG + /* Check that the list really is sorted now. */ + for(i=0; i<(nSuspect-1); i++){ + assert( xCmp(apSegment[i], apSegment[i+1])<0 ); + } +#endif +} + +/* +** Insert a record into the %_segments table. +*/ +static int fts3WriteSegment( + Fts3Table *p, /* Virtual table handle */ + sqlite3_int64 iBlock, /* Block id for new block */ + char *z, /* Pointer to buffer containing block data */ + int n /* Size of buffer z in bytes */ +){ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_INSERT_SEGMENTS, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, iBlock); + sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 2); + } + return rc; +} + +/* +** Find the largest relative level number in the table. If successful, set +** *pnMax to this value and return SQLITE_OK. Otherwise, if an error occurs, +** set *pnMax to zero and return an SQLite error code. +*/ +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *p, int *pnMax){ + int rc; + int mxLevel = 0; + sqlite3_stmt *pStmt = 0; + + rc = fts3SqlStmt(p, SQL_SELECT_MXLEVEL, &pStmt, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + mxLevel = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_reset(pStmt); + } + *pnMax = mxLevel; + return rc; +} + +/* +** Insert a record into the %_segdir table. +*/ +static int fts3WriteSegdir( + Fts3Table *p, /* Virtual table handle */ + sqlite3_int64 iLevel, /* Value for "level" field (absolute level) */ + int iIdx, /* Value for "idx" field */ + sqlite3_int64 iStartBlock, /* Value for "start_block" field */ + sqlite3_int64 iLeafEndBlock, /* Value for "leaves_end_block" field */ + sqlite3_int64 iEndBlock, /* Value for "end_block" field */ + sqlite3_int64 nLeafData, /* Bytes of leaf data in segment */ + char *zRoot, /* Blob value for "root" field */ + int nRoot /* Number of bytes in buffer zRoot */ +){ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_INSERT_SEGDIR, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pStmt, 1, iLevel); + sqlite3_bind_int(pStmt, 2, iIdx); + sqlite3_bind_int64(pStmt, 3, iStartBlock); + sqlite3_bind_int64(pStmt, 4, iLeafEndBlock); + if( nLeafData==0 ){ + sqlite3_bind_int64(pStmt, 5, iEndBlock); + }else{ + char *zEnd = sqlite3_mprintf("%lld %lld", iEndBlock, nLeafData); + if( !zEnd ) return SQLITE_NOMEM; + sqlite3_bind_text(pStmt, 5, zEnd, -1, sqlite3_free); + } + sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 6); + } + return rc; +} + +/* +** Return the size of the common prefix (if any) shared by zPrev and +** zNext, in bytes. For example, +** +** fts3PrefixCompress("abc", 3, "abcdef", 6) // returns 3 +** fts3PrefixCompress("abX", 3, "abcdef", 6) // returns 2 +** fts3PrefixCompress("abX", 3, "Xbcdef", 6) // returns 0 +*/ +static int fts3PrefixCompress( + const char *zPrev, /* Buffer containing previous term */ + int nPrev, /* Size of buffer zPrev in bytes */ + const char *zNext, /* Buffer containing next term */ + int nNext /* Size of buffer zNext in bytes */ +){ + int n; + for(n=0; nnData; /* Current size of node in bytes */ + int nReq = nData; /* Required space after adding zTerm */ + int nPrefix; /* Number of bytes of prefix compression */ + int nSuffix; /* Suffix length */ + + nPrefix = fts3PrefixCompress(pTree->zTerm, pTree->nTerm, zTerm, nTerm); + nSuffix = nTerm-nPrefix; + + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + + nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix; + if( nReq<=p->nNodeSize || !pTree->zTerm ){ + + if( nReq>p->nNodeSize ){ + /* An unusual case: this is the first term to be added to the node + ** and the static node buffer (p->nNodeSize bytes) is not large + ** enough. Use a separately malloced buffer instead This wastes + ** p->nNodeSize bytes, but since this scenario only comes about when + ** the database contain two terms that share a prefix of almost 2KB, + ** this is not expected to be a serious problem. + */ + assert( pTree->aData==(char *)&pTree[1] ); + pTree->aData = (char *)sqlite3_malloc(nReq); + if( !pTree->aData ){ + return SQLITE_NOMEM; + } + } + + if( pTree->zTerm ){ + /* There is no prefix-length field for first term in a node */ + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nPrefix); + } + + nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nSuffix); + memcpy(&pTree->aData[nData], &zTerm[nPrefix], nSuffix); + pTree->nData = nData + nSuffix; + pTree->nEntry++; + + if( isCopyTerm ){ + if( pTree->nMalloczMalloc, nTerm*2); + if( !zNew ){ + return SQLITE_NOMEM; + } + pTree->nMalloc = nTerm*2; + pTree->zMalloc = zNew; + } + pTree->zTerm = pTree->zMalloc; + memcpy(pTree->zTerm, zTerm, nTerm); + pTree->nTerm = nTerm; + }else{ + pTree->zTerm = (char *)zTerm; + pTree->nTerm = nTerm; + } + return SQLITE_OK; + } + } + + /* If control flows to here, it was not possible to append zTerm to the + ** current node. Create a new node (a right-sibling of the current node). + ** If this is the first node in the tree, the term is added to it. + ** + ** Otherwise, the term is not added to the new node, it is left empty for + ** now. Instead, the term is inserted into the parent of pTree. If pTree + ** has no parent, one is created here. + */ + pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); + if( !pNew ){ + return SQLITE_NOMEM; + } + memset(pNew, 0, sizeof(SegmentNode)); + pNew->nData = 1 + FTS3_VARINT_MAX; + pNew->aData = (char *)&pNew[1]; + + if( pTree ){ + SegmentNode *pParent = pTree->pParent; + rc = fts3NodeAddTerm(p, &pParent, isCopyTerm, zTerm, nTerm); + if( pTree->pParent==0 ){ + pTree->pParent = pParent; + } + pTree->pRight = pNew; + pNew->pLeftmost = pTree->pLeftmost; + pNew->pParent = pParent; + pNew->zMalloc = pTree->zMalloc; + pNew->nMalloc = pTree->nMalloc; + pTree->zMalloc = 0; + }else{ + pNew->pLeftmost = pNew; + rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); + } + + *ppTree = pNew; + return rc; +} + +/* +** Helper function for fts3NodeWrite(). +*/ +static int fts3TreeFinishNode( + SegmentNode *pTree, + int iHeight, + sqlite3_int64 iLeftChild +){ + int nStart; + assert( iHeight>=1 && iHeight<128 ); + nStart = FTS3_VARINT_MAX - sqlite3Fts3VarintLen(iLeftChild); + pTree->aData[nStart] = (char)iHeight; + sqlite3Fts3PutVarint(&pTree->aData[nStart+1], iLeftChild); + return nStart; +} + +/* +** Write the buffer for the segment node pTree and all of its peers to the +** database. Then call this function recursively to write the parent of +** pTree and its peers to the database. +** +** Except, if pTree is a root node, do not write it to the database. Instead, +** set output variables *paRoot and *pnRoot to contain the root node. +** +** If successful, SQLITE_OK is returned and output variable *piLast is +** set to the largest blockid written to the database (or zero if no +** blocks were written to the db). Otherwise, an SQLite error code is +** returned. +*/ +static int fts3NodeWrite( + Fts3Table *p, /* Virtual table handle */ + SegmentNode *pTree, /* SegmentNode handle */ + int iHeight, /* Height of this node in tree */ + sqlite3_int64 iLeaf, /* Block id of first leaf node */ + sqlite3_int64 iFree, /* Block id of next free slot in %_segments */ + sqlite3_int64 *piLast, /* OUT: Block id of last entry written */ + char **paRoot, /* OUT: Data for root node */ + int *pnRoot /* OUT: Size of root node in bytes */ +){ + int rc = SQLITE_OK; + + if( !pTree->pParent ){ + /* Root node of the tree. */ + int nStart = fts3TreeFinishNode(pTree, iHeight, iLeaf); + *piLast = iFree-1; + *pnRoot = pTree->nData - nStart; + *paRoot = &pTree->aData[nStart]; + }else{ + SegmentNode *pIter; + sqlite3_int64 iNextFree = iFree; + sqlite3_int64 iNextLeaf = iLeaf; + for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){ + int nStart = fts3TreeFinishNode(pIter, iHeight, iNextLeaf); + int nWrite = pIter->nData - nStart; + + rc = fts3WriteSegment(p, iNextFree, &pIter->aData[nStart], nWrite); + iNextFree++; + iNextLeaf += (pIter->nEntry+1); + } + if( rc==SQLITE_OK ){ + assert( iNextLeaf==iFree ); + rc = fts3NodeWrite( + p, pTree->pParent, iHeight+1, iFree, iNextFree, piLast, paRoot, pnRoot + ); + } + } + + return rc; +} + +/* +** Free all memory allocations associated with the tree pTree. +*/ +static void fts3NodeFree(SegmentNode *pTree){ + if( pTree ){ + SegmentNode *p = pTree->pLeftmost; + fts3NodeFree(p->pParent); + while( p ){ + SegmentNode *pRight = p->pRight; + if( p->aData!=(char *)&p[1] ){ + sqlite3_free(p->aData); + } + assert( pRight==0 || p->zMalloc==0 ); + sqlite3_free(p->zMalloc); + sqlite3_free(p); + p = pRight; + } + } +} + +/* +** Add a term to the segment being constructed by the SegmentWriter object +** *ppWriter. When adding the first term to a segment, *ppWriter should +** be passed NULL. This function will allocate a new SegmentWriter object +** and return it via the input/output variable *ppWriter in this case. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +*/ +static int fts3SegWriterAdd( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter **ppWriter, /* IN/OUT: SegmentWriter handle */ + int isCopyTerm, /* True if buffer zTerm must be copied */ + const char *zTerm, /* Pointer to buffer containing term */ + int nTerm, /* Size of term in bytes */ + const char *aDoclist, /* Pointer to buffer containing doclist */ + int nDoclist /* Size of doclist in bytes */ +){ + int nPrefix; /* Size of term prefix in bytes */ + int nSuffix; /* Size of term suffix in bytes */ + int nReq; /* Number of bytes required on leaf page */ + int nData; + SegmentWriter *pWriter = *ppWriter; + + if( !pWriter ){ + int rc; + sqlite3_stmt *pStmt; + + /* Allocate the SegmentWriter structure */ + pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); + if( !pWriter ) return SQLITE_NOMEM; + memset(pWriter, 0, sizeof(SegmentWriter)); + *ppWriter = pWriter; + + /* Allocate a buffer in which to accumulate data */ + pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); + if( !pWriter->aData ) return SQLITE_NOMEM; + pWriter->nSize = p->nNodeSize; + + /* Find the next free blockid in the %_segments table */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + pWriter->iFree = sqlite3_column_int64(pStmt, 0); + pWriter->iFirst = pWriter->iFree; + } + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ) return rc; + } + nData = pWriter->nData; + + nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); + nSuffix = nTerm-nPrefix; + + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + + /* Figure out how many bytes are required by this new entry */ + nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ + sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ + nSuffix + /* Term suffix */ + sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */ + nDoclist; /* Doclist data */ + + if( nData>0 && nData+nReq>p->nNodeSize ){ + int rc; + + /* The current leaf node is full. Write it out to the database. */ + if( pWriter->iFree==LARGEST_INT64 ) return FTS_CORRUPT_VTAB; + rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData); + if( rc!=SQLITE_OK ) return rc; + p->nLeafAdd++; + + /* Add the current term to the interior node tree. The term added to + ** the interior tree must: + ** + ** a) be greater than the largest term on the leaf node just written + ** to the database (still available in pWriter->zTerm), and + ** + ** b) be less than or equal to the term about to be added to the new + ** leaf node (zTerm/nTerm). + ** + ** In other words, it must be the prefix of zTerm 1 byte longer than + ** the common prefix (if any) of zTerm and pWriter->zTerm. + */ + assert( nPrefixpTree, isCopyTerm, zTerm, nPrefix+1); + if( rc!=SQLITE_OK ) return rc; + + nData = 0; + pWriter->nTerm = 0; + + nPrefix = 0; + nSuffix = nTerm; + nReq = 1 + /* varint containing prefix size */ + sqlite3Fts3VarintLen(nTerm) + /* varint containing suffix size */ + nTerm + /* Term suffix */ + sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */ + nDoclist; /* Doclist data */ + } + + /* Increase the total number of bytes written to account for the new entry. */ + pWriter->nLeafData += nReq; + + /* If the buffer currently allocated is too small for this entry, realloc + ** the buffer to make it large enough. + */ + if( nReq>pWriter->nSize ){ + char *aNew = sqlite3_realloc(pWriter->aData, nReq); + if( !aNew ) return SQLITE_NOMEM; + pWriter->aData = aNew; + pWriter->nSize = nReq; + } + assert( nData+nReq<=pWriter->nSize ); + + /* Append the prefix-compressed term and doclist to the buffer. */ + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nPrefix); + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nSuffix); + assert( nSuffix>0 ); + memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix); + nData += nSuffix; + nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist); + assert( nDoclist>0 ); + memcpy(&pWriter->aData[nData], aDoclist, nDoclist); + pWriter->nData = nData + nDoclist; + + /* Save the current term so that it can be used to prefix-compress the next. + ** If the isCopyTerm parameter is true, then the buffer pointed to by + ** zTerm is transient, so take a copy of the term data. Otherwise, just + ** store a copy of the pointer. + */ + if( isCopyTerm ){ + if( nTerm>pWriter->nMalloc ){ + char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); + if( !zNew ){ + return SQLITE_NOMEM; + } + pWriter->nMalloc = nTerm*2; + pWriter->zMalloc = zNew; + pWriter->zTerm = zNew; + } + assert( pWriter->zTerm==pWriter->zMalloc ); + assert( nTerm>0 ); + memcpy(pWriter->zTerm, zTerm, nTerm); + }else{ + pWriter->zTerm = (char *)zTerm; + } + pWriter->nTerm = nTerm; + + return SQLITE_OK; +} + +/* +** Flush all data associated with the SegmentWriter object pWriter to the +** database. This function must be called after all terms have been added +** to the segment using fts3SegWriterAdd(). If successful, SQLITE_OK is +** returned. Otherwise, an SQLite error code. +*/ +static int fts3SegWriterFlush( + Fts3Table *p, /* Virtual table handle */ + SegmentWriter *pWriter, /* SegmentWriter to flush to the db */ + sqlite3_int64 iLevel, /* Value for 'level' column of %_segdir */ + int iIdx /* Value for 'idx' column of %_segdir */ +){ + int rc; /* Return code */ + if( pWriter->pTree ){ + sqlite3_int64 iLast = 0; /* Largest block id written to database */ + sqlite3_int64 iLastLeaf; /* Largest leaf block id written to db */ + char *zRoot = NULL; /* Pointer to buffer containing root node */ + int nRoot = 0; /* Size of buffer zRoot */ + + iLastLeaf = pWriter->iFree; + rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, pWriter->nData); + if( rc==SQLITE_OK ){ + rc = fts3NodeWrite(p, pWriter->pTree, 1, + pWriter->iFirst, pWriter->iFree, &iLast, &zRoot, &nRoot); + } + if( rc==SQLITE_OK ){ + rc = fts3WriteSegdir(p, iLevel, iIdx, + pWriter->iFirst, iLastLeaf, iLast, pWriter->nLeafData, zRoot, nRoot); + } + }else{ + /* The entire tree fits on the root node. Write it to the segdir table. */ + rc = fts3WriteSegdir(p, iLevel, iIdx, + 0, 0, 0, pWriter->nLeafData, pWriter->aData, pWriter->nData); + } + p->nLeafAdd++; + return rc; +} + +/* +** Release all memory held by the SegmentWriter object passed as the +** first argument. +*/ +static void fts3SegWriterFree(SegmentWriter *pWriter){ + if( pWriter ){ + sqlite3_free(pWriter->aData); + sqlite3_free(pWriter->zMalloc); + fts3NodeFree(pWriter->pTree); + sqlite3_free(pWriter); + } +} + +/* +** The first value in the apVal[] array is assumed to contain an integer. +** This function tests if there exist any documents with docid values that +** are different from that integer. i.e. if deleting the document with docid +** pRowid would mean the FTS3 table were empty. +** +** If successful, *pisEmpty is set to true if the table is empty except for +** document pRowid, or false otherwise, and SQLITE_OK is returned. If an +** error occurs, an SQLite error code is returned. +*/ +static int fts3IsEmpty(Fts3Table *p, sqlite3_value *pRowid, int *pisEmpty){ + sqlite3_stmt *pStmt; + int rc; + if( p->zContentTbl ){ + /* If using the content=xxx option, assume the table is never empty */ + *pisEmpty = 0; + rc = SQLITE_OK; + }else{ + rc = fts3SqlStmt(p, SQL_IS_EMPTY, &pStmt, &pRowid); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pisEmpty = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_reset(pStmt); + } + } + return rc; +} + +/* +** Set *pnMax to the largest segment level in the database for the index +** iIndex. +** +** Segment levels are stored in the 'level' column of the %_segdir table. +** +** Return SQLITE_OK if successful, or an SQLite error code if not. +*/ +static int fts3SegmentMaxLevel( + Fts3Table *p, + int iLangid, + int iIndex, + sqlite3_int64 *pnMax +){ + sqlite3_stmt *pStmt; + int rc; + assert( iIndex>=0 && iIndexnIndex ); + + /* Set pStmt to the compiled version of: + ** + ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? + ** + ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). + */ + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pStmt, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pnMax = sqlite3_column_int64(pStmt, 0); + } + return sqlite3_reset(pStmt); +} + +/* +** iAbsLevel is an absolute level that may be assumed to exist within +** the database. This function checks if it is the largest level number +** within its index. Assuming no error occurs, *pbMax is set to 1 if +** iAbsLevel is indeed the largest level, or 0 otherwise, and SQLITE_OK +** is returned. If an error occurs, an error code is returned and the +** final value of *pbMax is undefined. +*/ +static int fts3SegmentIsMaxLevel(Fts3Table *p, i64 iAbsLevel, int *pbMax){ + + /* Set pStmt to the compiled version of: + ** + ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? + ** + ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). + */ + sqlite3_stmt *pStmt; + int rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pStmt, 1, iAbsLevel+1); + sqlite3_bind_int64(pStmt, 2, + (((u64)iAbsLevel/FTS3_SEGDIR_MAXLEVEL)+1) * FTS3_SEGDIR_MAXLEVEL + ); + + *pbMax = 0; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *pbMax = sqlite3_column_type(pStmt, 0)==SQLITE_NULL; + } + return sqlite3_reset(pStmt); +} + +/* +** Delete all entries in the %_segments table associated with the segment +** opened with seg-reader pSeg. This function does not affect the contents +** of the %_segdir table. +*/ +static int fts3DeleteSegment( + Fts3Table *p, /* FTS table handle */ + Fts3SegReader *pSeg /* Segment to delete */ +){ + int rc = SQLITE_OK; /* Return code */ + if( pSeg->iStartBlock ){ + sqlite3_stmt *pDelete; /* SQL statement to delete rows */ + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, pSeg->iStartBlock); + sqlite3_bind_int64(pDelete, 2, pSeg->iEndBlock); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + } + return rc; +} + +/* +** This function is used after merging multiple segments into a single large +** segment to delete the old, now redundant, segment b-trees. Specifically, +** it: +** +** 1) Deletes all %_segments entries for the segments associated with +** each of the SegReader objects in the array passed as the third +** argument, and +** +** 2) deletes all %_segdir entries with level iLevel, or all %_segdir +** entries regardless of level if (iLevel<0). +** +** SQLITE_OK is returned if successful, otherwise an SQLite error code. +*/ +static int fts3DeleteSegdir( + Fts3Table *p, /* Virtual table handle */ + int iLangid, /* Language id */ + int iIndex, /* Index for p->aIndex */ + int iLevel, /* Level of %_segdir entries to delete */ + Fts3SegReader **apSegment, /* Array of SegReader objects */ + int nReader /* Size of array apSegment */ +){ + int rc = SQLITE_OK; /* Return Code */ + int i; /* Iterator variable */ + sqlite3_stmt *pDelete = 0; /* SQL statement to delete rows */ + + for(i=0; rc==SQLITE_OK && i=0 || iLevel==FTS3_SEGCURSOR_ALL ); + if( iLevel==FTS3_SEGCURSOR_ALL ){ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, 0)); + sqlite3_bind_int64(pDelete, 2, + getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1) + ); + } + }else{ + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64( + pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel) + ); + } + } + + if( rc==SQLITE_OK ){ + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + + return rc; +} + +/* +** When this function is called, buffer *ppList (size *pnList bytes) contains +** a position list that may (or may not) feature multiple columns. This +** function adjusts the pointer *ppList and the length *pnList so that they +** identify the subset of the position list that corresponds to column iCol. +** +** If there are no entries in the input position list for column iCol, then +** *pnList is set to zero before returning. +** +** If parameter bZero is non-zero, then any part of the input list following +** the end of the output list is zeroed before returning. +*/ +static void fts3ColumnFilter( + int iCol, /* Column to filter on */ + int bZero, /* Zero out anything following *ppList */ + char **ppList, /* IN/OUT: Pointer to position list */ + int *pnList /* IN/OUT: Size of buffer *ppList in bytes */ +){ + char *pList = *ppList; + int nList = *pnList; + char *pEnd = &pList[nList]; + int iCurrent = 0; + char *p = pList; + + assert( iCol>=0 ); + while( 1 ){ + char c = 0; + while( p0){ + memset(&pList[nList], 0, pEnd - &pList[nList]); + } + *ppList = pList; + *pnList = nList; +} + +/* +** Cache data in the Fts3MultiSegReader.aBuffer[] buffer (overwriting any +** existing data). Grow the buffer if required. +** +** If successful, return SQLITE_OK. Otherwise, if an OOM error is encountered +** trying to resize the buffer, return SQLITE_NOMEM. +*/ +static int fts3MsrBufferData( + Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ + char *pList, + int nList +){ + if( nList>pMsr->nBuffer ){ + char *pNew; + pMsr->nBuffer = nList*2; + pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); + if( !pNew ) return SQLITE_NOMEM; + pMsr->aBuffer = pNew; + } + + assert( nList>0 ); + memcpy(pMsr->aBuffer, pList, nList); + return SQLITE_OK; +} + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ + sqlite3_int64 *piDocid, /* OUT: Docid value */ + char **paPoslist, /* OUT: Pointer to position list */ + int *pnPoslist /* OUT: Size of position list in bytes */ +){ + int nMerge = pMsr->nAdvance; + Fts3SegReader **apSegment = pMsr->apSegment; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + if( nMerge==0 ){ + *paPoslist = 0; + return SQLITE_OK; + } + + while( 1 ){ + Fts3SegReader *pSeg; + pSeg = pMsr->apSegment[0]; + + if( pSeg->pOffsetList==0 ){ + *paPoslist = 0; + break; + }else{ + int rc; + char *pList; + int nList; + int j; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + + rc = fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); + j = 1; + while( rc==SQLITE_OK + && jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + rc = fts3SegReaderNextDocid(p, apSegment[j], 0, 0); + j++; + } + if( rc!=SQLITE_OK ) return rc; + fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); + + if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ + rc = fts3MsrBufferData(pMsr, pList, nList+1); + if( rc!=SQLITE_OK ) return rc; + assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); + pList = pMsr->aBuffer; + } + + if( pMsr->iColFilter>=0 ){ + fts3ColumnFilter(pMsr->iColFilter, 1, &pList, &nList); + } + + if( nList>0 ){ + *paPoslist = pList; + *piDocid = iDocid; + *pnPoslist = nList; + break; + } + } + } + + return SQLITE_OK; +} + +static int fts3SegReaderStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + const char *zTerm, /* Term searched for (or NULL) */ + int nTerm /* Length of zTerm in bytes */ +){ + int i; + int nSeg = pCsr->nSegment; + + /* If the Fts3SegFilter defines a specific term (or term prefix) to search + ** for, then advance each segment iterator until it points to a term of + ** equal or greater value than the specified term. This prevents many + ** unnecessary merge/sort operations for the case where single segment + ** b-tree leaf nodes contain more than one term. + */ + for(i=0; pCsr->bRestart==0 && inSegment; i++){ + int res = 0; + Fts3SegReader *pSeg = pCsr->apSegment[i]; + do { + int rc = fts3SegReaderNext(p, pSeg, 0); + if( rc!=SQLITE_OK ) return rc; + }while( zTerm && (res = fts3SegReaderTermCmp(pSeg, zTerm, nTerm))<0 ); + + if( pSeg->bLookup && res!=0 ){ + fts3SegReaderSetEof(pSeg); + } + } + fts3SegReaderSort(pCsr->apSegment, nSeg, nSeg, fts3SegReaderCmp); + + return SQLITE_OK; +} + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + Fts3SegFilter *pFilter /* Restrictions on range of iteration */ +){ + pCsr->pFilter = pFilter; + return fts3SegReaderStart(p, pCsr, pFilter->zTerm, pFilter->nTerm); +} + +SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr, /* Cursor object */ + int iCol, /* Column to match on. */ + const char *zTerm, /* Term to iterate through a doclist for */ + int nTerm /* Number of bytes in zTerm */ +){ + int i; + int rc; + int nSegment = pCsr->nSegment; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + assert( pCsr->pFilter==0 ); + assert( zTerm && nTerm>0 ); + + /* Advance each segment iterator until it points to the term zTerm/nTerm. */ + rc = fts3SegReaderStart(p, pCsr, zTerm, nTerm); + if( rc!=SQLITE_OK ) return rc; + + /* Determine how many of the segments actually point to zTerm/nTerm. */ + for(i=0; iapSegment[i]; + if( !pSeg->aNode || fts3SegReaderTermCmp(pSeg, zTerm, nTerm) ){ + break; + } + } + pCsr->nAdvance = i; + + /* Advance each of the segments to point to the first docid. */ + for(i=0; inAdvance; i++){ + rc = fts3SegReaderFirstDocid(p, pCsr->apSegment[i]); + if( rc!=SQLITE_OK ) return rc; + } + fts3SegReaderSort(pCsr->apSegment, i, i, xCmp); + + assert( iCol<0 || iColnColumn ); + pCsr->iColFilter = iCol; + + return SQLITE_OK; +} + +/* +** This function is called on a MultiSegReader that has been started using +** sqlite3Fts3MsrIncrStart(). One or more calls to MsrIncrNext() may also +** have been made. Calling this function puts the MultiSegReader in such +** a state that if the next two calls are: +** +** sqlite3Fts3SegReaderStart() +** sqlite3Fts3SegReaderStep() +** +** then the entire doclist for the term is available in +** MultiSegReader.aDoclist/nDoclist. +*/ +SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ + int i; /* Used to iterate through segment-readers */ + + assert( pCsr->zTerm==0 ); + assert( pCsr->nTerm==0 ); + assert( pCsr->aDoclist==0 ); + assert( pCsr->nDoclist==0 ); + + pCsr->nAdvance = 0; + pCsr->bRestart = 1; + for(i=0; inSegment; i++){ + pCsr->apSegment[i]->pOffsetList = 0; + pCsr->apSegment[i]->nOffsetList = 0; + pCsr->apSegment[i]->iDocid = 0; + } + + return SQLITE_OK; +} + +static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){ + if( nReq>pCsr->nBuffer ){ + char *aNew; + pCsr->nBuffer = nReq*2; + aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); + if( !aNew ){ + return SQLITE_NOMEM; + } + pCsr->aBuffer = aNew; + } + return SQLITE_OK; +} + + +SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( + Fts3Table *p, /* Virtual table handle */ + Fts3MultiSegReader *pCsr /* Cursor object */ +){ + int rc = SQLITE_OK; + + int isIgnoreEmpty = (pCsr->pFilter->flags & FTS3_SEGMENT_IGNORE_EMPTY); + int isRequirePos = (pCsr->pFilter->flags & FTS3_SEGMENT_REQUIRE_POS); + int isColFilter = (pCsr->pFilter->flags & FTS3_SEGMENT_COLUMN_FILTER); + int isPrefix = (pCsr->pFilter->flags & FTS3_SEGMENT_PREFIX); + int isScan = (pCsr->pFilter->flags & FTS3_SEGMENT_SCAN); + int isFirst = (pCsr->pFilter->flags & FTS3_SEGMENT_FIRST); + + Fts3SegReader **apSegment = pCsr->apSegment; + int nSegment = pCsr->nSegment; + Fts3SegFilter *pFilter = pCsr->pFilter; + int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( + p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp + ); + + if( pCsr->nSegment==0 ) return SQLITE_OK; + + do { + int nMerge; + int i; + + /* Advance the first pCsr->nAdvance entries in the apSegment[] array + ** forward. Then sort the list in order of current term again. + */ + for(i=0; inAdvance; i++){ + Fts3SegReader *pSeg = apSegment[i]; + if( pSeg->bLookup ){ + fts3SegReaderSetEof(pSeg); + }else{ + rc = fts3SegReaderNext(p, pSeg, 0); + } + if( rc!=SQLITE_OK ) return rc; + } + fts3SegReaderSort(apSegment, nSegment, pCsr->nAdvance, fts3SegReaderCmp); + pCsr->nAdvance = 0; + + /* If all the seg-readers are at EOF, we're finished. return SQLITE_OK. */ + assert( rc==SQLITE_OK ); + if( apSegment[0]->aNode==0 ) break; + + pCsr->nTerm = apSegment[0]->nTerm; + pCsr->zTerm = apSegment[0]->zTerm; + + /* If this is a prefix-search, and if the term that apSegment[0] points + ** to does not share a suffix with pFilter->zTerm/nTerm, then all + ** required callbacks have been made. In this case exit early. + ** + ** Similarly, if this is a search for an exact match, and the first term + ** of segment apSegment[0] is not a match, exit early. + */ + if( pFilter->zTerm && !isScan ){ + if( pCsr->nTermnTerm + || (!isPrefix && pCsr->nTerm>pFilter->nTerm) + || memcmp(pCsr->zTerm, pFilter->zTerm, pFilter->nTerm) + ){ + break; + } + } + + nMerge = 1; + while( nMergeaNode + && apSegment[nMerge]->nTerm==pCsr->nTerm + && 0==memcmp(pCsr->zTerm, apSegment[nMerge]->zTerm, pCsr->nTerm) + ){ + nMerge++; + } + + assert( isIgnoreEmpty || (isRequirePos && !isColFilter) ); + if( nMerge==1 + && !isIgnoreEmpty + && !isFirst + && (p->bDescIdx==0 || fts3SegReaderIsPending(apSegment[0])==0) + ){ + pCsr->nDoclist = apSegment[0]->nDoclist; + if( fts3SegReaderIsPending(apSegment[0]) ){ + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); + pCsr->aDoclist = pCsr->aBuffer; + }else{ + pCsr->aDoclist = apSegment[0]->aDoclist; + } + if( rc==SQLITE_OK ) rc = SQLITE_ROW; + }else{ + int nDoclist = 0; /* Size of doclist */ + sqlite3_int64 iPrev = 0; /* Previous docid stored in doclist */ + + /* The current term of the first nMerge entries in the array + ** of Fts3SegReader objects is the same. The doclists must be merged + ** and a single term returned with the merged doclist. + */ + for(i=0; ipOffsetList ){ + int j; /* Number of segments that share a docid */ + char *pList = 0; + int nList = 0; + int nByte; + sqlite3_int64 iDocid = apSegment[0]->iDocid; + fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); + j = 1; + while( jpOffsetList + && apSegment[j]->iDocid==iDocid + ){ + fts3SegReaderNextDocid(p, apSegment[j], 0, 0); + j++; + } + + if( isColFilter ){ + fts3ColumnFilter(pFilter->iCol, 0, &pList, &nList); + } + + if( !isIgnoreEmpty || nList>0 ){ + + /* Calculate the 'docid' delta value to write into the merged + ** doclist. */ + sqlite3_int64 iDelta; + if( p->bDescIdx && nDoclist>0 ){ + if( iPrev<=iDocid ) return FTS_CORRUPT_VTAB; + iDelta = (i64)((u64)iPrev - (u64)iDocid); + }else{ + if( nDoclist>0 && iPrev>=iDocid ) return FTS_CORRUPT_VTAB; + iDelta = (i64)((u64)iDocid - (u64)iPrev); + } + + nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); + + rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING); + if( rc ) return rc; + + if( isFirst ){ + char *a = &pCsr->aBuffer[nDoclist]; + int nWrite; + + nWrite = sqlite3Fts3FirstFilter(iDelta, pList, nList, a); + if( nWrite ){ + iPrev = iDocid; + nDoclist += nWrite; + } + }else{ + nDoclist += sqlite3Fts3PutVarint(&pCsr->aBuffer[nDoclist], iDelta); + iPrev = iDocid; + if( isRequirePos ){ + memcpy(&pCsr->aBuffer[nDoclist], pList, nList); + nDoclist += nList; + pCsr->aBuffer[nDoclist++] = '\0'; + } + } + } + + fts3SegReaderSort(apSegment, nMerge, j, xCmp); + } + if( nDoclist>0 ){ + rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING); + if( rc ) return rc; + memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING); + pCsr->aDoclist = pCsr->aBuffer; + pCsr->nDoclist = nDoclist; + rc = SQLITE_ROW; + } + } + pCsr->nAdvance = nMerge; + }while( rc==SQLITE_OK ); + + return rc; +} + + +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish( + Fts3MultiSegReader *pCsr /* Cursor object */ +){ + if( pCsr ){ + int i; + for(i=0; inSegment; i++){ + sqlite3Fts3SegReaderFree(pCsr->apSegment[i]); + } + sqlite3_free(pCsr->apSegment); + sqlite3_free(pCsr->aBuffer); + + pCsr->nSegment = 0; + pCsr->apSegment = 0; + pCsr->aBuffer = 0; + } +} + +/* +** Decode the "end_block" field, selected by column iCol of the SELECT +** statement passed as the first argument. +** +** The "end_block" field may contain either an integer, or a text field +** containing the text representation of two non-negative integers separated +** by one or more space (0x20) characters. In the first case, set *piEndBlock +** to the integer value and *pnByte to zero before returning. In the second, +** set *piEndBlock to the first value and *pnByte to the second. +*/ +static void fts3ReadEndBlockField( + sqlite3_stmt *pStmt, + int iCol, + i64 *piEndBlock, + i64 *pnByte +){ + const unsigned char *zText = sqlite3_column_text(pStmt, iCol); + if( zText ){ + int i; + int iMul = 1; + u64 iVal = 0; + for(i=0; zText[i]>='0' && zText[i]<='9'; i++){ + iVal = iVal*10 + (zText[i] - '0'); + } + *piEndBlock = (i64)iVal; + while( zText[i]==' ' ) i++; + iVal = 0; + if( zText[i]=='-' ){ + i++; + iMul = -1; + } + for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){ + iVal = iVal*10 + (zText[i] - '0'); + } + *pnByte = ((i64)iVal * (i64)iMul); + } +} + + +/* +** A segment of size nByte bytes has just been written to absolute level +** iAbsLevel. Promote any segments that should be promoted as a result. +*/ +static int fts3PromoteSegments( + Fts3Table *p, /* FTS table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level just updated */ + sqlite3_int64 nByte /* Size of new segment at iAbsLevel */ +){ + int rc = SQLITE_OK; + sqlite3_stmt *pRange; + + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE2, &pRange, 0); + + if( rc==SQLITE_OK ){ + int bOk = 0; + i64 iLast = (iAbsLevel/FTS3_SEGDIR_MAXLEVEL + 1) * FTS3_SEGDIR_MAXLEVEL - 1; + i64 nLimit = (nByte*3)/2; + + /* Loop through all entries in the %_segdir table corresponding to + ** segments in this index on levels greater than iAbsLevel. If there is + ** at least one such segment, and it is possible to determine that all + ** such segments are smaller than nLimit bytes in size, they will be + ** promoted to level iAbsLevel. */ + sqlite3_bind_int64(pRange, 1, iAbsLevel+1); + sqlite3_bind_int64(pRange, 2, iLast); + while( SQLITE_ROW==sqlite3_step(pRange) ){ + i64 nSize = 0, dummy; + fts3ReadEndBlockField(pRange, 2, &dummy, &nSize); + if( nSize<=0 || nSize>nLimit ){ + /* If nSize==0, then the %_segdir.end_block field does not not + ** contain a size value. This happens if it was written by an + ** old version of FTS. In this case it is not possible to determine + ** the size of the segment, and so segment promotion does not + ** take place. */ + bOk = 0; + break; + } + bOk = 1; + } + rc = sqlite3_reset(pRange); + + if( bOk ){ + int iIdx = 0; + sqlite3_stmt *pUpdate1 = 0; + sqlite3_stmt *pUpdate2 = 0; + + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL_IDX, &pUpdate1, 0); + } + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL, &pUpdate2, 0); + } + + if( rc==SQLITE_OK ){ + + /* Loop through all %_segdir entries for segments in this index with + ** levels equal to or greater than iAbsLevel. As each entry is visited, + ** updated it to set (level = -1) and (idx = N), where N is 0 for the + ** oldest segment in the range, 1 for the next oldest, and so on. + ** + ** In other words, move all segments being promoted to level -1, + ** setting the "idx" fields as appropriate to keep them in the same + ** order. The contents of level -1 (which is never used, except + ** transiently here), will be moved back to level iAbsLevel below. */ + sqlite3_bind_int64(pRange, 1, iAbsLevel); + while( SQLITE_ROW==sqlite3_step(pRange) ){ + sqlite3_bind_int(pUpdate1, 1, iIdx++); + sqlite3_bind_int(pUpdate1, 2, sqlite3_column_int(pRange, 0)); + sqlite3_bind_int(pUpdate1, 3, sqlite3_column_int(pRange, 1)); + sqlite3_step(pUpdate1); + rc = sqlite3_reset(pUpdate1); + if( rc!=SQLITE_OK ){ + sqlite3_reset(pRange); + break; + } + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3_reset(pRange); + } + + /* Move level -1 to level iAbsLevel */ + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pUpdate2, 1, iAbsLevel); + sqlite3_step(pUpdate2); + rc = sqlite3_reset(pUpdate2); + } + } + } + + + return rc; +} + +/* +** Merge all level iLevel segments in the database into a single +** iLevel+1 segment. Or, if iLevel<0, merge all segments into a +** single segment with a level equal to the numerically largest level +** currently present in the database. +** +** If this function is called with iLevel<0, but there is only one +** segment in the database, SQLITE_DONE is returned immediately. +** Otherwise, if successful, SQLITE_OK is returned. If an error occurs, +** an SQLite error code is returned. +*/ +static int fts3SegmentMerge( + Fts3Table *p, + int iLangid, /* Language id to merge */ + int iIndex, /* Index in p->aIndex[] to merge */ + int iLevel /* Level to merge */ +){ + int rc; /* Return code */ + int iIdx = 0; /* Index of new segment */ + sqlite3_int64 iNewLevel = 0; /* Level/index to create new segment at */ + SegmentWriter *pWriter = 0; /* Used to write the new, merged, segment */ + Fts3SegFilter filter; /* Segment term filter condition */ + Fts3MultiSegReader csr; /* Cursor to iterate through level(s) */ + int bIgnoreEmpty = 0; /* True to ignore empty segments */ + i64 iMaxLevel = 0; /* Max level number for this index/langid */ + + assert( iLevel==FTS3_SEGCURSOR_ALL + || iLevel==FTS3_SEGCURSOR_PENDING + || iLevel>=0 + ); + assert( iLevel=0 && iIndexnIndex ); + + rc = sqlite3Fts3SegReaderCursor(p, iLangid, iIndex, iLevel, 0, 0, 1, 0, &csr); + if( rc!=SQLITE_OK || csr.nSegment==0 ) goto finished; + + if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + rc = fts3SegmentMaxLevel(p, iLangid, iIndex, &iMaxLevel); + if( rc!=SQLITE_OK ) goto finished; + } + + if( iLevel==FTS3_SEGCURSOR_ALL ){ + /* This call is to merge all segments in the database to a single + ** segment. The level of the new segment is equal to the numerically + ** greatest segment level currently present in the database for this + ** index. The idx of the new segment is always 0. */ + if( csr.nSegment==1 && 0==fts3SegReaderIsPending(csr.apSegment[0]) ){ + rc = SQLITE_DONE; + goto finished; + } + iNewLevel = iMaxLevel; + bIgnoreEmpty = 1; + + }else{ + /* This call is to merge all segments at level iLevel. find the next + ** available segment index at level iLevel+1. The call to + ** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to + ** a single iLevel+2 segment if necessary. */ + assert( FTS3_SEGCURSOR_PENDING==-1 ); + iNewLevel = getAbsoluteLevel(p, iLangid, iIndex, iLevel+1); + rc = fts3AllocateSegdirIdx(p, iLangid, iIndex, iLevel+1, &iIdx); + bIgnoreEmpty = (iLevel!=FTS3_SEGCURSOR_PENDING) && (iNewLevel>iMaxLevel); + } + if( rc!=SQLITE_OK ) goto finished; + + assert( csr.nSegment>0 ); + assert_fts3_nc( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); + assert_fts3_nc( + iNewLevelnLeafData); + } + } + } + + finished: + fts3SegWriterFree(pWriter); + sqlite3Fts3SegReaderFinish(&csr); + return rc; +} + + +/* +** Flush the contents of pendingTerms to level 0 segments. +*/ +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && inIndex; i++){ + rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + sqlite3Fts3PendingTermsClear(p); + + /* Determine the auto-incr-merge setting if unknown. If enabled, + ** estimate the number of leaf blocks of content to be written + */ + if( rc==SQLITE_OK && p->bHasStat + && p->nAutoincrmerge==0xff && p->nLeafAdd>0 + ){ + sqlite3_stmt *pStmt = 0; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_ROW ){ + p->nAutoincrmerge = sqlite3_column_int(pStmt, 0); + if( p->nAutoincrmerge==1 ) p->nAutoincrmerge = 8; + }else if( rc==SQLITE_DONE ){ + p->nAutoincrmerge = 0; + } + rc = sqlite3_reset(pStmt); + } + } + return rc; +} + +/* +** Encode N integers as varints into a blob. +*/ +static void fts3EncodeIntArray( + int N, /* The number of integers to encode */ + u32 *a, /* The integer values */ + char *zBuf, /* Write the BLOB here */ + int *pNBuf /* Write number of bytes if zBuf[] used here */ +){ + int i, j; + for(i=j=0; iiPrevDocid. The sizes are encoded as +** a blob of varints. +*/ +static void fts3InsertDocsize( + int *pRC, /* Result code */ + Fts3Table *p, /* Table into which to insert */ + u32 *aSz /* Sizes of each column, in tokens */ +){ + char *pBlob; /* The BLOB encoding of the document size */ + int nBlob; /* Number of bytes in the BLOB */ + sqlite3_stmt *pStmt; /* Statement used to insert the encoding */ + int rc; /* Result code from subfunctions */ + + if( *pRC ) return; + pBlob = sqlite3_malloc64( 10*(sqlite3_int64)p->nColumn ); + if( pBlob==0 ){ + *pRC = SQLITE_NOMEM; + return; + } + fts3EncodeIntArray(p->nColumn, aSz, pBlob, &nBlob); + rc = fts3SqlStmt(p, SQL_REPLACE_DOCSIZE, &pStmt, 0); + if( rc ){ + sqlite3_free(pBlob); + *pRC = rc; + return; + } + sqlite3_bind_int64(pStmt, 1, p->iPrevDocid); + sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, sqlite3_free); + sqlite3_step(pStmt); + *pRC = sqlite3_reset(pStmt); +} + +/* +** Record 0 of the %_stat table contains a blob consisting of N varints, +** where N is the number of user defined columns in the fts3 table plus +** two. If nCol is the number of user defined columns, then values of the +** varints are set as follows: +** +** Varint 0: Total number of rows in the table. +** +** Varint 1..nCol: For each column, the total number of tokens stored in +** the column for all rows of the table. +** +** Varint 1+nCol: The total size, in bytes, of all text values in all +** columns of all rows of the table. +** +*/ +static void fts3UpdateDocTotals( + int *pRC, /* The result code */ + Fts3Table *p, /* Table being updated */ + u32 *aSzIns, /* Size increases */ + u32 *aSzDel, /* Size decreases */ + int nChng /* Change in the number of documents */ +){ + char *pBlob; /* Storage for BLOB written into %_stat */ + int nBlob; /* Size of BLOB written into %_stat */ + u32 *a; /* Array of integers that becomes the BLOB */ + sqlite3_stmt *pStmt; /* Statement for reading and writing */ + int i; /* Loop counter */ + int rc; /* Result code from subfunctions */ + + const int nStat = p->nColumn+2; + + if( *pRC ) return; + a = sqlite3_malloc64( (sizeof(u32)+10)*(sqlite3_int64)nStat ); + if( a==0 ){ + *pRC = SQLITE_NOMEM; + return; + } + pBlob = (char*)&a[nStat]; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); + if( rc ){ + sqlite3_free(a); + *pRC = rc; + return; + } + sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL); + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + fts3DecodeIntArray(nStat, a, + sqlite3_column_blob(pStmt, 0), + sqlite3_column_bytes(pStmt, 0)); + }else{ + memset(a, 0, sizeof(u32)*(nStat) ); + } + rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + sqlite3_free(a); + *pRC = rc; + return; + } + if( nChng<0 && a[0]<(u32)(-nChng) ){ + a[0] = 0; + }else{ + a[0] += nChng; + } + for(i=0; inColumn+1; i++){ + u32 x = a[i+1]; + if( x+aSzIns[i] < aSzDel[i] ){ + x = 0; + }else{ + x = x + aSzIns[i] - aSzDel[i]; + } + a[i+1] = x; + } + fts3EncodeIntArray(nStat, a, pBlob, &nBlob); + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); + if( rc ){ + sqlite3_free(a); + *pRC = rc; + return; + } + sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL); + sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC); + sqlite3_step(pStmt); + *pRC = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 2); + sqlite3_free(a); +} + +/* +** Merge the entire database so that there is one segment for each +** iIndex/iLangid combination. +*/ +static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ + int bSeenDone = 0; + int rc; + sqlite3_stmt *pAllLangid = 0; + + rc = sqlite3Fts3PendingTermsFlush(p); + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + } + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); + while( sqlite3_step(pAllLangid)==SQLITE_ROW ){ + int i; + int iLangid = sqlite3_column_int(pAllLangid, 0); + for(i=0; rc==SQLITE_OK && inIndex; i++){ + rc = fts3SegmentMerge(p, iLangid, i, FTS3_SEGCURSOR_ALL); + if( rc==SQLITE_DONE ){ + bSeenDone = 1; + rc = SQLITE_OK; + } + } + } + rc2 = sqlite3_reset(pAllLangid); + if( rc==SQLITE_OK ) rc = rc2; + } + + sqlite3Fts3SegmentsClose(p); + + return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; +} + +/* +** This function is called when the user executes the following statement: +** +** INSERT INTO () VALUES('rebuild'); +** +** The entire FTS index is discarded and rebuilt. If the table is one +** created using the content=xxx option, then the new index is based on +** the current contents of the xxx table. Otherwise, it is rebuilt based +** on the contents of the %_content table. +*/ +static int fts3DoRebuild(Fts3Table *p){ + int rc; /* Return Code */ + + rc = fts3DeleteAll(p, 0); + if( rc==SQLITE_OK ){ + u32 *aSz = 0; + u32 *aSzIns = 0; + u32 *aSzDel = 0; + sqlite3_stmt *pStmt = 0; + int nEntry = 0; + + /* Compose and prepare an SQL statement to loop through the content table */ + char *zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + + if( rc==SQLITE_OK ){ + sqlite3_int64 nByte = sizeof(u32) * ((sqlite3_int64)p->nColumn+1)*3; + aSz = (u32 *)sqlite3_malloc64(nByte); + if( aSz==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(aSz, 0, nByte); + aSzIns = &aSz[p->nColumn+1]; + aSzDel = &aSzIns[p->nColumn+1]; + } + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + int iCol; + int iLangid = langidFromSelect(p, pStmt); + rc = fts3PendingTermsDocid(p, 0, iLangid, sqlite3_column_int64(pStmt, 0)); + memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn+1)); + for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ + if( p->abNotindexed[iCol]==0 ){ + const char *z = (const char *) sqlite3_column_text(pStmt, iCol+1); + rc = fts3PendingTermsAdd(p, iLangid, z, iCol, &aSz[iCol]); + aSz[p->nColumn] += sqlite3_column_bytes(pStmt, iCol+1); + } + } + if( p->bHasDocsize ){ + fts3InsertDocsize(&rc, p, aSz); + } + if( rc!=SQLITE_OK ){ + sqlite3_finalize(pStmt); + pStmt = 0; + }else{ + nEntry++; + for(iCol=0; iCol<=p->nColumn; iCol++){ + aSzIns[iCol] += aSz[iCol]; + } + } + } + if( p->bFts4 ){ + fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nEntry); + } + sqlite3_free(aSz); + + if( pStmt ){ + int rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + return rc; +} + + +/* +** This function opens a cursor used to read the input data for an +** incremental merge operation. Specifically, it opens a cursor to scan +** the oldest nSeg segments (idx=0 through idx=(nSeg-1)) in absolute +** level iAbsLevel. +*/ +static int fts3IncrmergeCsr( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level to open */ + int nSeg, /* Number of segments to merge */ + Fts3MultiSegReader *pCsr /* Cursor object to populate */ +){ + int rc; /* Return Code */ + sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */ + sqlite3_int64 nByte; /* Bytes allocated at pCsr->apSegment[] */ + + /* Allocate space for the Fts3MultiSegReader.aCsr[] array */ + memset(pCsr, 0, sizeof(*pCsr)); + nByte = sizeof(Fts3SegReader *) * nSeg; + pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc64(nByte); + + if( pCsr->apSegment==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->apSegment, 0, nByte); + rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); + } + if( rc==SQLITE_OK ){ + int i; + int rc2; + sqlite3_bind_int64(pStmt, 1, iAbsLevel); + assert( pCsr->nSegment==0 ); + for(i=0; rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW && iapSegment[i] + ); + pCsr->nSegment++; + } + rc2 = sqlite3_reset(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +typedef struct IncrmergeWriter IncrmergeWriter; +typedef struct NodeWriter NodeWriter; +typedef struct Blob Blob; +typedef struct NodeReader NodeReader; + +/* +** An instance of the following structure is used as a dynamic buffer +** to build up nodes or other blobs of data in. +** +** The function blobGrowBuffer() is used to extend the allocation. +*/ +struct Blob { + char *a; /* Pointer to allocation */ + int n; /* Number of valid bytes of data in a[] */ + int nAlloc; /* Allocated size of a[] (nAlloc>=n) */ +}; + +/* +** This structure is used to build up buffers containing segment b-tree +** nodes (blocks). +*/ +struct NodeWriter { + sqlite3_int64 iBlock; /* Current block id */ + Blob key; /* Last key written to the current block */ + Blob block; /* Current block image */ +}; + +/* +** An object of this type contains the state required to create or append +** to an appendable b-tree segment. +*/ +struct IncrmergeWriter { + int nLeafEst; /* Space allocated for leaf blocks */ + int nWork; /* Number of leaf pages flushed */ + sqlite3_int64 iAbsLevel; /* Absolute level of input segments */ + int iIdx; /* Index of *output* segment in iAbsLevel+1 */ + sqlite3_int64 iStart; /* Block number of first allocated block */ + sqlite3_int64 iEnd; /* Block number of last allocated block */ + sqlite3_int64 nLeafData; /* Bytes of leaf page data so far */ + u8 bNoLeafData; /* If true, store 0 for segment size */ + NodeWriter aNodeWriter[FTS_MAX_APPENDABLE_HEIGHT]; +}; + +/* +** An object of the following type is used to read data from a single +** FTS segment node. See the following functions: +** +** nodeReaderInit() +** nodeReaderNext() +** nodeReaderRelease() +*/ +struct NodeReader { + const char *aNode; + int nNode; + int iOff; /* Current offset within aNode[] */ + + /* Output variables. Containing the current node entry. */ + sqlite3_int64 iChild; /* Pointer to child node */ + Blob term; /* Current term */ + const char *aDoclist; /* Pointer to doclist */ + int nDoclist; /* Size of doclist in bytes */ +}; + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, if the allocation at pBlob->a is not already at least nMin +** bytes in size, extend (realloc) it to be so. +** +** If an OOM error occurs, set *pRc to SQLITE_NOMEM and leave pBlob->a +** unmodified. Otherwise, if the allocation succeeds, update pBlob->nAlloc +** to reflect the new size of the pBlob->a[] buffer. +*/ +static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ + if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ + int nAlloc = nMin; + char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); + if( a ){ + pBlob->nAlloc = nAlloc; + pBlob->a = a; + }else{ + *pRc = SQLITE_NOMEM; + } + } +} + +/* +** Attempt to advance the node-reader object passed as the first argument to +** the next entry on the node. +** +** Return an error code if an error occurs (SQLITE_NOMEM is possible). +** Otherwise return SQLITE_OK. If there is no next entry on the node +** (e.g. because the current entry is the last) set NodeReader->aNode to +** NULL to indicate EOF. Otherwise, populate the NodeReader structure output +** variables for the new entry. +*/ +static int nodeReaderNext(NodeReader *p){ + int bFirst = (p->term.n==0); /* True for first term on the node */ + int nPrefix = 0; /* Bytes to copy from previous term */ + int nSuffix = 0; /* Bytes to append to the prefix */ + int rc = SQLITE_OK; /* Return code */ + + assert( p->aNode ); + if( p->iChild && bFirst==0 ) p->iChild++; + if( p->iOff>=p->nNode ){ + /* EOF */ + p->aNode = 0; + }else{ + if( bFirst==0 ){ + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nPrefix); + } + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); + + if( nPrefix>p->term.n || nSuffix>p->nNode-p->iOff || nSuffix==0 ){ + return FTS_CORRUPT_VTAB; + } + blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); + if( rc==SQLITE_OK && ALWAYS(p->term.a!=0) ){ + memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix); + p->term.n = nPrefix+nSuffix; + p->iOff += nSuffix; + if( p->iChild==0 ){ + p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); + if( (p->nNode-p->iOff)nDoclist ){ + return FTS_CORRUPT_VTAB; + } + p->aDoclist = &p->aNode[p->iOff]; + p->iOff += p->nDoclist; + } + } + } + + assert_fts3_nc( p->iOff<=p->nNode ); + return rc; +} + +/* +** Release all dynamic resources held by node-reader object *p. +*/ +static void nodeReaderRelease(NodeReader *p){ + sqlite3_free(p->term.a); +} + +/* +** Initialize a node-reader object to read the node in buffer aNode/nNode. +** +** If successful, SQLITE_OK is returned and the NodeReader object set to +** point to the first entry on the node (if any). Otherwise, an SQLite +** error code is returned. +*/ +static int nodeReaderInit(NodeReader *p, const char *aNode, int nNode){ + memset(p, 0, sizeof(NodeReader)); + p->aNode = aNode; + p->nNode = nNode; + + /* Figure out if this is a leaf or an internal node. */ + if( aNode && aNode[0] ){ + /* An internal node. */ + p->iOff = 1 + sqlite3Fts3GetVarint(&p->aNode[1], &p->iChild); + }else{ + p->iOff = 1; + } + + return aNode ? nodeReaderNext(p) : SQLITE_OK; +} + +/* +** This function is called while writing an FTS segment each time a leaf o +** node is finished and written to disk. The key (zTerm/nTerm) is guaranteed +** to be greater than the largest key on the node just written, but smaller +** than or equal to the first key that will be written to the next leaf +** node. +** +** The block id of the leaf node just written to disk may be found in +** (pWriter->aNodeWriter[0].iBlock) when this function is called. +*/ +static int fts3IncrmergePush( + Fts3Table *p, /* Fts3 table handle */ + IncrmergeWriter *pWriter, /* Writer object */ + const char *zTerm, /* Term to write to internal node */ + int nTerm /* Bytes at zTerm */ +){ + sqlite3_int64 iPtr = pWriter->aNodeWriter[0].iBlock; + int iLayer; + + assert( nTerm>0 ); + for(iLayer=1; ALWAYS(iLayeraNodeWriter[iLayer]; + int rc = SQLITE_OK; + int nPrefix; + int nSuffix; + int nSpace; + + /* Figure out how much space the key will consume if it is written to + ** the current node of layer iLayer. Due to the prefix compression, + ** the space required changes depending on which node the key is to + ** be added to. */ + nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + if(nSuffix<=0 ) return FTS_CORRUPT_VTAB; + nSpace = sqlite3Fts3VarintLen(nPrefix); + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + + if( pNode->key.n==0 || (pNode->block.n + nSpace)<=p->nNodeSize ){ + /* If the current node of layer iLayer contains zero keys, or if adding + ** the key to it will not cause it to grow to larger than nNodeSize + ** bytes in size, write the key here. */ + + Blob *pBlk = &pNode->block; + if( pBlk->n==0 ){ + blobGrowBuffer(pBlk, p->nNodeSize, &rc); + if( rc==SQLITE_OK ){ + pBlk->a[0] = (char)iLayer; + pBlk->n = 1 + sqlite3Fts3PutVarint(&pBlk->a[1], iPtr); + } + } + blobGrowBuffer(pBlk, pBlk->n + nSpace, &rc); + blobGrowBuffer(&pNode->key, nTerm, &rc); + + if( rc==SQLITE_OK ){ + if( pNode->key.n ){ + pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix); + } + pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix); + assert( nPrefix+nSuffix<=nTerm ); + assert( nPrefix>=0 ); + memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix); + pBlk->n += nSuffix; + + memcpy(pNode->key.a, zTerm, nTerm); + pNode->key.n = nTerm; + } + }else{ + /* Otherwise, flush the current node of layer iLayer to disk. + ** Then allocate a new, empty sibling node. The key will be written + ** into the parent of this node. */ + rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n); + + assert( pNode->block.nAlloc>=p->nNodeSize ); + pNode->block.a[0] = (char)iLayer; + pNode->block.n = 1 + sqlite3Fts3PutVarint(&pNode->block.a[1], iPtr+1); + + iNextPtr = pNode->iBlock; + pNode->iBlock++; + pNode->key.n = 0; + } + + if( rc!=SQLITE_OK || iNextPtr==0 ) return rc; + iPtr = iNextPtr; + } + + assert( 0 ); + return 0; +} + +/* +** Append a term and (optionally) doclist to the FTS segment node currently +** stored in blob *pNode. The node need not contain any terms, but the +** header must be written before this function is called. +** +** A node header is a single 0x00 byte for a leaf node, or a height varint +** followed by the left-hand-child varint for an internal node. +** +** The term to be appended is passed via arguments zTerm/nTerm. For a +** leaf node, the doclist is passed as aDoclist/nDoclist. For an internal +** node, both aDoclist and nDoclist must be passed 0. +** +** If the size of the value in blob pPrev is zero, then this is the first +** term written to the node. Otherwise, pPrev contains a copy of the +** previous term. Before this function returns, it is updated to contain a +** copy of zTerm/nTerm. +** +** It is assumed that the buffer associated with pNode is already large +** enough to accommodate the new entry. The buffer associated with pPrev +** is extended by this function if requrired. +** +** If an error (i.e. OOM condition) occurs, an SQLite error code is +** returned. Otherwise, SQLITE_OK. +*/ +static int fts3AppendToNode( + Blob *pNode, /* Current node image to append to */ + Blob *pPrev, /* Buffer containing previous term written */ + const char *zTerm, /* New term to write */ + int nTerm, /* Size of zTerm in bytes */ + const char *aDoclist, /* Doclist (or NULL) to write */ + int nDoclist /* Size of aDoclist in bytes */ +){ + int rc = SQLITE_OK; /* Return code */ + int bFirst = (pPrev->n==0); /* True if this is the first term written */ + int nPrefix; /* Size of term prefix in bytes */ + int nSuffix; /* Size of term suffix in bytes */ + + /* Node must have already been started. There must be a doclist for a + ** leaf node, and there must not be a doclist for an internal node. */ + assert( pNode->n>0 ); + assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) ); + + blobGrowBuffer(pPrev, nTerm, &rc); + if( rc!=SQLITE_OK ) return rc; + + nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + memcpy(pPrev->a, zTerm, nTerm); + pPrev->n = nTerm; + + if( bFirst==0 ){ + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nPrefix); + } + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nSuffix); + memcpy(&pNode->a[pNode->n], &zTerm[nPrefix], nSuffix); + pNode->n += nSuffix; + + if( aDoclist ){ + pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nDoclist); + memcpy(&pNode->a[pNode->n], aDoclist, nDoclist); + pNode->n += nDoclist; + } + + assert( pNode->n<=pNode->nAlloc ); + + return SQLITE_OK; +} + +/* +** Append the current term and doclist pointed to by cursor pCsr to the +** appendable b-tree segment opened for writing by pWriter. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int fts3IncrmergeAppend( + Fts3Table *p, /* Fts3 table handle */ + IncrmergeWriter *pWriter, /* Writer object */ + Fts3MultiSegReader *pCsr /* Cursor containing term and doclist */ +){ + const char *zTerm = pCsr->zTerm; + int nTerm = pCsr->nTerm; + const char *aDoclist = pCsr->aDoclist; + int nDoclist = pCsr->nDoclist; + int rc = SQLITE_OK; /* Return code */ + int nSpace; /* Total space in bytes required on leaf */ + int nPrefix; /* Size of prefix shared with previous term */ + int nSuffix; /* Size of suffix (nTerm - nPrefix) */ + NodeWriter *pLeaf; /* Object used to write leaf nodes */ + + pLeaf = &pWriter->aNodeWriter[0]; + nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm); + nSuffix = nTerm - nPrefix; + if(nSuffix<=0 ) return FTS_CORRUPT_VTAB; + + nSpace = sqlite3Fts3VarintLen(nPrefix); + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; + + /* If the current block is not empty, and if adding this term/doclist + ** to the current block would make it larger than Fts3Table.nNodeSize + ** bytes, write this block out to the database. */ + if( pLeaf->block.n>0 && (pLeaf->block.n + nSpace)>p->nNodeSize ){ + rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n); + pWriter->nWork++; + + /* Add the current term to the parent node. The term added to the + ** parent must: + ** + ** a) be greater than the largest term on the leaf node just written + ** to the database (still available in pLeaf->key), and + ** + ** b) be less than or equal to the term about to be added to the new + ** leaf node (zTerm/nTerm). + ** + ** In other words, it must be the prefix of zTerm 1 byte longer than + ** the common prefix (if any) of zTerm and pWriter->zTerm. + */ + if( rc==SQLITE_OK ){ + rc = fts3IncrmergePush(p, pWriter, zTerm, nPrefix+1); + } + + /* Advance to the next output block */ + pLeaf->iBlock++; + pLeaf->key.n = 0; + pLeaf->block.n = 0; + + nSuffix = nTerm; + nSpace = 1; + nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; + nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; + } + + pWriter->nLeafData += nSpace; + blobGrowBuffer(&pLeaf->block, pLeaf->block.n + nSpace, &rc); + if( rc==SQLITE_OK ){ + if( pLeaf->block.n==0 ){ + pLeaf->block.n = 1; + pLeaf->block.a[0] = '\0'; + } + rc = fts3AppendToNode( + &pLeaf->block, &pLeaf->key, zTerm, nTerm, aDoclist, nDoclist + ); + } + + return rc; +} + +/* +** This function is called to release all dynamic resources held by the +** merge-writer object pWriter, and if no error has occurred, to flush +** all outstanding node buffers held by pWriter to disk. +** +** If *pRc is not SQLITE_OK when this function is called, then no attempt +** is made to write any data to disk. Instead, this function serves only +** to release outstanding resources. +** +** Otherwise, if *pRc is initially SQLITE_OK and an error occurs while +** flushing buffers to disk, *pRc is set to an SQLite error code before +** returning. +*/ +static void fts3IncrmergeRelease( + Fts3Table *p, /* FTS3 table handle */ + IncrmergeWriter *pWriter, /* Merge-writer object */ + int *pRc /* IN/OUT: Error code */ +){ + int i; /* Used to iterate through non-root layers */ + int iRoot; /* Index of root in pWriter->aNodeWriter */ + NodeWriter *pRoot; /* NodeWriter for root node */ + int rc = *pRc; /* Error code */ + + /* Set iRoot to the index in pWriter->aNodeWriter[] of the output segment + ** root node. If the segment fits entirely on a single leaf node, iRoot + ** will be set to 0. If the root node is the parent of the leaves, iRoot + ** will be 1. And so on. */ + for(iRoot=FTS_MAX_APPENDABLE_HEIGHT-1; iRoot>=0; iRoot--){ + NodeWriter *pNode = &pWriter->aNodeWriter[iRoot]; + if( pNode->block.n>0 ) break; + assert( *pRc || pNode->block.nAlloc==0 ); + assert( *pRc || pNode->key.nAlloc==0 ); + sqlite3_free(pNode->block.a); + sqlite3_free(pNode->key.a); + } + + /* Empty output segment. This is a no-op. */ + if( iRoot<0 ) return; + + /* The entire output segment fits on a single node. Normally, this means + ** the node would be stored as a blob in the "root" column of the %_segdir + ** table. However, this is not permitted in this case. The problem is that + ** space has already been reserved in the %_segments table, and so the + ** start_block and end_block fields of the %_segdir table must be populated. + ** And, by design or by accident, released versions of FTS cannot handle + ** segments that fit entirely on the root node with start_block!=0. + ** + ** Instead, create a synthetic root node that contains nothing but a + ** pointer to the single content node. So that the segment consists of a + ** single leaf and a single interior (root) node. + ** + ** Todo: Better might be to defer allocating space in the %_segments + ** table until we are sure it is needed. + */ + if( iRoot==0 ){ + Blob *pBlock = &pWriter->aNodeWriter[1].block; + blobGrowBuffer(pBlock, 1 + FTS3_VARINT_MAX, &rc); + if( rc==SQLITE_OK ){ + pBlock->a[0] = 0x01; + pBlock->n = 1 + sqlite3Fts3PutVarint( + &pBlock->a[1], pWriter->aNodeWriter[0].iBlock + ); + } + iRoot = 1; + } + pRoot = &pWriter->aNodeWriter[iRoot]; + + /* Flush all currently outstanding nodes to disk. */ + for(i=0; iaNodeWriter[i]; + if( pNode->block.n>0 && rc==SQLITE_OK ){ + rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n); + } + sqlite3_free(pNode->block.a); + sqlite3_free(pNode->key.a); + } + + /* Write the %_segdir record. */ + if( rc==SQLITE_OK ){ + rc = fts3WriteSegdir(p, + pWriter->iAbsLevel+1, /* level */ + pWriter->iIdx, /* idx */ + pWriter->iStart, /* start_block */ + pWriter->aNodeWriter[0].iBlock, /* leaves_end_block */ + pWriter->iEnd, /* end_block */ + (pWriter->bNoLeafData==0 ? pWriter->nLeafData : 0), /* end_block */ + pRoot->block.a, pRoot->block.n /* root */ + ); + } + sqlite3_free(pRoot->block.a); + sqlite3_free(pRoot->key.a); + + *pRc = rc; +} + +/* +** Compare the term in buffer zLhs (size in bytes nLhs) with that in +** zRhs (size in bytes nRhs) using memcmp. If one term is a prefix of +** the other, it is considered to be smaller than the other. +** +** Return -ve if zLhs is smaller than zRhs, 0 if it is equal, or +ve +** if it is greater. +*/ +static int fts3TermCmp( + const char *zLhs, int nLhs, /* LHS of comparison */ + const char *zRhs, int nRhs /* RHS of comparison */ +){ + int nCmp = MIN(nLhs, nRhs); + int res; + + if( nCmp && ALWAYS(zLhs) && ALWAYS(zRhs) ){ + res = memcmp(zLhs, zRhs, nCmp); + }else{ + res = 0; + } + if( res==0 ) res = nLhs - nRhs; + + return res; +} + + +/* +** Query to see if the entry in the %_segments table with blockid iEnd is +** NULL. If no error occurs and the entry is NULL, set *pbRes 1 before +** returning. Otherwise, set *pbRes to 0. +** +** Or, if an error occurs while querying the database, return an SQLite +** error code. The final value of *pbRes is undefined in this case. +** +** This is used to test if a segment is an "appendable" segment. If it +** is, then a NULL entry has been inserted into the %_segments table +** with blockid %_segdir.end_block. +*/ +static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){ + int bRes = 0; /* Result to set *pbRes to */ + sqlite3_stmt *pCheck = 0; /* Statement to query database with */ + int rc; /* Return code */ + + rc = fts3SqlStmt(p, SQL_SEGMENT_IS_APPENDABLE, &pCheck, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pCheck, 1, iEnd); + if( SQLITE_ROW==sqlite3_step(pCheck) ) bRes = 1; + rc = sqlite3_reset(pCheck); + } + + *pbRes = bRes; + return rc; +} + +/* +** This function is called when initializing an incremental-merge operation. +** It checks if the existing segment with index value iIdx at absolute level +** (iAbsLevel+1) can be appended to by the incremental merge. If it can, the +** merge-writer object *pWriter is initialized to write to it. +** +** An existing segment can be appended to by an incremental merge if: +** +** * It was initially created as an appendable segment (with all required +** space pre-allocated), and +** +** * The first key read from the input (arguments zKey and nKey) is +** greater than the largest key currently stored in the potential +** output segment. +*/ +static int fts3IncrmergeLoad( + Fts3Table *p, /* Fts3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ + int iIdx, /* Index of candidate output segment */ + const char *zKey, /* First key to write */ + int nKey, /* Number of bytes in nKey */ + IncrmergeWriter *pWriter /* Populate this object */ +){ + int rc; /* Return code */ + sqlite3_stmt *pSelect = 0; /* SELECT to read %_segdir entry */ + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pSelect, 0); + if( rc==SQLITE_OK ){ + sqlite3_int64 iStart = 0; /* Value of %_segdir.start_block */ + sqlite3_int64 iLeafEnd = 0; /* Value of %_segdir.leaves_end_block */ + sqlite3_int64 iEnd = 0; /* Value of %_segdir.end_block */ + const char *aRoot = 0; /* Pointer to %_segdir.root buffer */ + int nRoot = 0; /* Size of aRoot[] in bytes */ + int rc2; /* Return code from sqlite3_reset() */ + int bAppendable = 0; /* Set to true if segment is appendable */ + + /* Read the %_segdir entry for index iIdx absolute level (iAbsLevel+1) */ + sqlite3_bind_int64(pSelect, 1, iAbsLevel+1); + sqlite3_bind_int(pSelect, 2, iIdx); + if( sqlite3_step(pSelect)==SQLITE_ROW ){ + iStart = sqlite3_column_int64(pSelect, 1); + iLeafEnd = sqlite3_column_int64(pSelect, 2); + fts3ReadEndBlockField(pSelect, 3, &iEnd, &pWriter->nLeafData); + if( pWriter->nLeafData<0 ){ + pWriter->nLeafData = pWriter->nLeafData * -1; + } + pWriter->bNoLeafData = (pWriter->nLeafData==0); + nRoot = sqlite3_column_bytes(pSelect, 4); + aRoot = sqlite3_column_blob(pSelect, 4); + if( aRoot==0 ){ + sqlite3_reset(pSelect); + return nRoot ? SQLITE_NOMEM : FTS_CORRUPT_VTAB; + } + }else{ + return sqlite3_reset(pSelect); + } + + /* Check for the zero-length marker in the %_segments table */ + rc = fts3IsAppendable(p, iEnd, &bAppendable); + + /* Check that zKey/nKey is larger than the largest key the candidate */ + if( rc==SQLITE_OK && bAppendable ){ + char *aLeaf = 0; + int nLeaf = 0; + + rc = sqlite3Fts3ReadBlock(p, iLeafEnd, &aLeaf, &nLeaf, 0); + if( rc==SQLITE_OK ){ + NodeReader reader; + for(rc = nodeReaderInit(&reader, aLeaf, nLeaf); + rc==SQLITE_OK && reader.aNode; + rc = nodeReaderNext(&reader) + ){ + assert( reader.aNode ); + } + if( fts3TermCmp(zKey, nKey, reader.term.a, reader.term.n)<=0 ){ + bAppendable = 0; + } + nodeReaderRelease(&reader); + } + sqlite3_free(aLeaf); + } + + if( rc==SQLITE_OK && bAppendable ){ + /* It is possible to append to this segment. Set up the IncrmergeWriter + ** object to do so. */ + int i; + int nHeight = (int)aRoot[0]; + NodeWriter *pNode; + if( nHeight<1 || nHeight>=FTS_MAX_APPENDABLE_HEIGHT ){ + sqlite3_reset(pSelect); + return FTS_CORRUPT_VTAB; + } + + pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT; + pWriter->iStart = iStart; + pWriter->iEnd = iEnd; + pWriter->iAbsLevel = iAbsLevel; + pWriter->iIdx = iIdx; + + for(i=nHeight+1; iaNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; + } + + pNode = &pWriter->aNodeWriter[nHeight]; + pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight; + blobGrowBuffer(&pNode->block, + MAX(nRoot, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aRoot, nRoot); + pNode->block.n = nRoot; + memset(&pNode->block.a[nRoot], 0, FTS3_NODE_PADDING); + } + + for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){ + NodeReader reader; + pNode = &pWriter->aNodeWriter[i]; + + if( pNode->block.a){ + rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); + while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); + blobGrowBuffer(&pNode->key, reader.term.n, &rc); + if( rc==SQLITE_OK ){ + assert_fts3_nc( reader.term.n>0 || reader.aNode==0 ); + if( reader.term.n>0 ){ + memcpy(pNode->key.a, reader.term.a, reader.term.n); + } + pNode->key.n = reader.term.n; + if( i>0 ){ + char *aBlock = 0; + int nBlock = 0; + pNode = &pWriter->aNodeWriter[i-1]; + pNode->iBlock = reader.iChild; + rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock,0); + blobGrowBuffer(&pNode->block, + MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aBlock, nBlock); + pNode->block.n = nBlock; + memset(&pNode->block.a[nBlock], 0, FTS3_NODE_PADDING); + } + sqlite3_free(aBlock); + } + } + } + nodeReaderRelease(&reader); + } + } + + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +/* +** Determine the largest segment index value that exists within absolute +** level iAbsLevel+1. If no error occurs, set *piIdx to this value plus +** one before returning SQLITE_OK. Or, if there are no segments at all +** within level iAbsLevel, set *piIdx to zero. +** +** If an error occurs, return an SQLite error code. The final value of +** *piIdx is undefined in this case. +*/ +static int fts3IncrmergeOutputIdx( + Fts3Table *p, /* FTS Table handle */ + sqlite3_int64 iAbsLevel, /* Absolute index of input segments */ + int *piIdx /* OUT: Next free index at iAbsLevel+1 */ +){ + int rc; + sqlite3_stmt *pOutputIdx = 0; /* SQL used to find output index */ + + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pOutputIdx, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pOutputIdx, 1, iAbsLevel+1); + sqlite3_step(pOutputIdx); + *piIdx = sqlite3_column_int(pOutputIdx, 0); + rc = sqlite3_reset(pOutputIdx); + } + + return rc; +} + +/* +** Allocate an appendable output segment on absolute level iAbsLevel+1 +** with idx value iIdx. +** +** In the %_segdir table, a segment is defined by the values in three +** columns: +** +** start_block +** leaves_end_block +** end_block +** +** When an appendable segment is allocated, it is estimated that the +** maximum number of leaf blocks that may be required is the sum of the +** number of leaf blocks consumed by the input segments, plus the number +** of input segments, multiplied by two. This value is stored in stack +** variable nLeafEst. +** +** A total of 16*nLeafEst blocks are allocated when an appendable segment +** is created ((1 + end_block - start_block)==16*nLeafEst). The contiguous +** array of leaf nodes starts at the first block allocated. The array +** of interior nodes that are parents of the leaf nodes start at block +** (start_block + (1 + end_block - start_block) / 16). And so on. +** +** In the actual code below, the value "16" is replaced with the +** pre-processor macro FTS_MAX_APPENDABLE_HEIGHT. +*/ +static int fts3IncrmergeWriter( + Fts3Table *p, /* Fts3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of input segments */ + int iIdx, /* Index of new output segment */ + Fts3MultiSegReader *pCsr, /* Cursor that data will be read from */ + IncrmergeWriter *pWriter /* Populate this object */ +){ + int rc; /* Return Code */ + int i; /* Iterator variable */ + int nLeafEst = 0; /* Blocks allocated for leaf nodes */ + sqlite3_stmt *pLeafEst = 0; /* SQL used to determine nLeafEst */ + sqlite3_stmt *pFirstBlock = 0; /* SQL used to determine first block */ + + /* Calculate nLeafEst. */ + rc = fts3SqlStmt(p, SQL_MAX_LEAF_NODE_ESTIMATE, &pLeafEst, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pLeafEst, 1, iAbsLevel); + sqlite3_bind_int64(pLeafEst, 2, pCsr->nSegment); + if( SQLITE_ROW==sqlite3_step(pLeafEst) ){ + nLeafEst = sqlite3_column_int(pLeafEst, 0); + } + rc = sqlite3_reset(pLeafEst); + } + if( rc!=SQLITE_OK ) return rc; + + /* Calculate the first block to use in the output segment */ + rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pFirstBlock, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pFirstBlock) ){ + pWriter->iStart = sqlite3_column_int64(pFirstBlock, 0); + pWriter->iEnd = pWriter->iStart - 1; + pWriter->iEnd += nLeafEst * FTS_MAX_APPENDABLE_HEIGHT; + } + rc = sqlite3_reset(pFirstBlock); + } + if( rc!=SQLITE_OK ) return rc; + + /* Insert the marker in the %_segments table to make sure nobody tries + ** to steal the space just allocated. This is also used to identify + ** appendable segments. */ + rc = fts3WriteSegment(p, pWriter->iEnd, 0, 0); + if( rc!=SQLITE_OK ) return rc; + + pWriter->iAbsLevel = iAbsLevel; + pWriter->nLeafEst = nLeafEst; + pWriter->iIdx = iIdx; + + /* Set up the array of NodeWriter objects */ + for(i=0; iaNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; + } + return SQLITE_OK; +} + +/* +** Remove an entry from the %_segdir table. This involves running the +** following two statements: +** +** DELETE FROM %_segdir WHERE level = :iAbsLevel AND idx = :iIdx +** UPDATE %_segdir SET idx = idx - 1 WHERE level = :iAbsLevel AND idx > :iIdx +** +** The DELETE statement removes the specific %_segdir level. The UPDATE +** statement ensures that the remaining segments have contiguously allocated +** idx values. +*/ +static int fts3RemoveSegdirEntry( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level to delete from */ + int iIdx /* Index of %_segdir entry to delete */ +){ + int rc; /* Return code */ + sqlite3_stmt *pDelete = 0; /* DELETE statement */ + + rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_ENTRY, &pDelete, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDelete, 1, iAbsLevel); + sqlite3_bind_int(pDelete, 2, iIdx); + sqlite3_step(pDelete); + rc = sqlite3_reset(pDelete); + } + + return rc; +} + +/* +** One or more segments have just been removed from absolute level iAbsLevel. +** Update the 'idx' values of the remaining segments in the level so that +** the idx values are a contiguous sequence starting from 0. +*/ +static int fts3RepackSegdirLevel( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel /* Absolute level to repack */ +){ + int rc; /* Return code */ + int *aIdx = 0; /* Array of remaining idx values */ + int nIdx = 0; /* Valid entries in aIdx[] */ + int nAlloc = 0; /* Allocated size of aIdx[] */ + int i; /* Iterator variable */ + sqlite3_stmt *pSelect = 0; /* Select statement to read idx values */ + sqlite3_stmt *pUpdate = 0; /* Update statement to modify idx values */ + + rc = fts3SqlStmt(p, SQL_SELECT_INDEXES, &pSelect, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int64(pSelect, 1, iAbsLevel); + while( SQLITE_ROW==sqlite3_step(pSelect) ){ + if( nIdx>=nAlloc ){ + int *aNew; + nAlloc += 16; + aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); + if( !aNew ){ + rc = SQLITE_NOMEM; + break; + } + aIdx = aNew; + } + aIdx[nIdx++] = sqlite3_column_int(pSelect, 0); + } + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SHIFT_SEGDIR_ENTRY, &pUpdate, 0); + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pUpdate, 2, iAbsLevel); + } + + assert( p->bIgnoreSavepoint==0 ); + p->bIgnoreSavepoint = 1; + for(i=0; rc==SQLITE_OK && ibIgnoreSavepoint = 0; + + sqlite3_free(aIdx); + return rc; +} + +static void fts3StartNode(Blob *pNode, int iHeight, sqlite3_int64 iChild){ + pNode->a[0] = (char)iHeight; + if( iChild ){ + assert( pNode->nAlloc>=1+sqlite3Fts3VarintLen(iChild) ); + pNode->n = 1 + sqlite3Fts3PutVarint(&pNode->a[1], iChild); + }else{ + assert( pNode->nAlloc>=1 ); + pNode->n = 1; + } +} + +/* +** The first two arguments are a pointer to and the size of a segment b-tree +** node. The node may be a leaf or an internal node. +** +** This function creates a new node image in blob object *pNew by copying +** all terms that are greater than or equal to zTerm/nTerm (for leaf nodes) +** or greater than zTerm/nTerm (for internal nodes) from aNode/nNode. +*/ +static int fts3TruncateNode( + const char *aNode, /* Current node image */ + int nNode, /* Size of aNode in bytes */ + Blob *pNew, /* OUT: Write new node image here */ + const char *zTerm, /* Omit all terms smaller than this */ + int nTerm, /* Size of zTerm in bytes */ + sqlite3_int64 *piBlock /* OUT: Block number in next layer down */ +){ + NodeReader reader; /* Reader object */ + Blob prev = {0, 0, 0}; /* Previous term written to new node */ + int rc = SQLITE_OK; /* Return code */ + int bLeaf; /* True for a leaf node */ + + if( nNode<1 ) return FTS_CORRUPT_VTAB; + bLeaf = aNode[0]=='\0'; + + /* Allocate required output space */ + blobGrowBuffer(pNew, nNode, &rc); + if( rc!=SQLITE_OK ) return rc; + pNew->n = 0; + + /* Populate new node buffer */ + for(rc = nodeReaderInit(&reader, aNode, nNode); + rc==SQLITE_OK && reader.aNode; + rc = nodeReaderNext(&reader) + ){ + if( pNew->n==0 ){ + int res = fts3TermCmp(reader.term.a, reader.term.n, zTerm, nTerm); + if( res<0 || (bLeaf==0 && res==0) ) continue; + fts3StartNode(pNew, (int)aNode[0], reader.iChild); + *piBlock = reader.iChild; + } + rc = fts3AppendToNode( + pNew, &prev, reader.term.a, reader.term.n, + reader.aDoclist, reader.nDoclist + ); + if( rc!=SQLITE_OK ) break; + } + if( pNew->n==0 ){ + fts3StartNode(pNew, (int)aNode[0], reader.iChild); + *piBlock = reader.iChild; + } + assert( pNew->n<=pNew->nAlloc ); + + nodeReaderRelease(&reader); + sqlite3_free(prev.a); + return rc; +} + +/* +** Remove all terms smaller than zTerm/nTerm from segment iIdx in absolute +** level iAbsLevel. This may involve deleting entries from the %_segments +** table, and modifying existing entries in both the %_segments and %_segdir +** tables. +** +** SQLITE_OK is returned if the segment is updated successfully. Or an +** SQLite error code otherwise. +*/ +static int fts3TruncateSegment( + Fts3Table *p, /* FTS3 table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level of segment to modify */ + int iIdx, /* Index within level of segment to modify */ + const char *zTerm, /* Remove terms smaller than this */ + int nTerm /* Number of bytes in buffer zTerm */ +){ + int rc = SQLITE_OK; /* Return code */ + Blob root = {0,0,0}; /* New root page image */ + Blob block = {0,0,0}; /* Buffer used for any other block */ + sqlite3_int64 iBlock = 0; /* Block id */ + sqlite3_int64 iNewStart = 0; /* New value for iStartBlock */ + sqlite3_int64 iOldStart = 0; /* Old value for iStartBlock */ + sqlite3_stmt *pFetch = 0; /* Statement used to fetch segdir */ + + rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pFetch, 0); + if( rc==SQLITE_OK ){ + int rc2; /* sqlite3_reset() return code */ + sqlite3_bind_int64(pFetch, 1, iAbsLevel); + sqlite3_bind_int(pFetch, 2, iIdx); + if( SQLITE_ROW==sqlite3_step(pFetch) ){ + const char *aRoot = sqlite3_column_blob(pFetch, 4); + int nRoot = sqlite3_column_bytes(pFetch, 4); + iOldStart = sqlite3_column_int64(pFetch, 1); + rc = fts3TruncateNode(aRoot, nRoot, &root, zTerm, nTerm, &iBlock); + } + rc2 = sqlite3_reset(pFetch); + if( rc==SQLITE_OK ) rc = rc2; + } + + while( rc==SQLITE_OK && iBlock ){ + char *aBlock = 0; + int nBlock = 0; + iNewStart = iBlock; + + rc = sqlite3Fts3ReadBlock(p, iBlock, &aBlock, &nBlock, 0); + if( rc==SQLITE_OK ){ + rc = fts3TruncateNode(aBlock, nBlock, &block, zTerm, nTerm, &iBlock); + } + if( rc==SQLITE_OK ){ + rc = fts3WriteSegment(p, iNewStart, block.a, block.n); + } + sqlite3_free(aBlock); + } + + /* Variable iNewStart now contains the first valid leaf node. */ + if( rc==SQLITE_OK && iNewStart ){ + sqlite3_stmt *pDel = 0; + rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDel, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDel, 1, iOldStart); + sqlite3_bind_int64(pDel, 2, iNewStart-1); + sqlite3_step(pDel); + rc = sqlite3_reset(pDel); + } + } + + if( rc==SQLITE_OK ){ + sqlite3_stmt *pChomp = 0; + rc = fts3SqlStmt(p, SQL_CHOMP_SEGDIR, &pChomp, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pChomp, 1, iNewStart); + sqlite3_bind_blob(pChomp, 2, root.a, root.n, SQLITE_STATIC); + sqlite3_bind_int64(pChomp, 3, iAbsLevel); + sqlite3_bind_int(pChomp, 4, iIdx); + sqlite3_step(pChomp); + rc = sqlite3_reset(pChomp); + sqlite3_bind_null(pChomp, 2); + } + } + + sqlite3_free(root.a); + sqlite3_free(block.a); + return rc; +} + +/* +** This function is called after an incrmental-merge operation has run to +** merge (or partially merge) two or more segments from absolute level +** iAbsLevel. +** +** Each input segment is either removed from the db completely (if all of +** its data was copied to the output segment by the incrmerge operation) +** or modified in place so that it no longer contains those entries that +** have been duplicated in the output segment. +*/ +static int fts3IncrmergeChomp( + Fts3Table *p, /* FTS table handle */ + sqlite3_int64 iAbsLevel, /* Absolute level containing segments */ + Fts3MultiSegReader *pCsr, /* Chomp all segments opened by this cursor */ + int *pnRem /* Number of segments not deleted */ +){ + int i; + int nRem = 0; + int rc = SQLITE_OK; + + for(i=pCsr->nSegment-1; i>=0 && rc==SQLITE_OK; i--){ + Fts3SegReader *pSeg = 0; + int j; + + /* Find the Fts3SegReader object with Fts3SegReader.iIdx==i. It is hiding + ** somewhere in the pCsr->apSegment[] array. */ + for(j=0; ALWAYS(jnSegment); j++){ + pSeg = pCsr->apSegment[j]; + if( pSeg->iIdx==i ) break; + } + assert( jnSegment && pSeg->iIdx==i ); + + if( pSeg->aNode==0 ){ + /* Seg-reader is at EOF. Remove the entire input segment. */ + rc = fts3DeleteSegment(p, pSeg); + if( rc==SQLITE_OK ){ + rc = fts3RemoveSegdirEntry(p, iAbsLevel, pSeg->iIdx); + } + *pnRem = 0; + }else{ + /* The incremental merge did not copy all the data from this + ** segment to the upper level. The segment is modified in place + ** so that it contains no keys smaller than zTerm/nTerm. */ + const char *zTerm = pSeg->zTerm; + int nTerm = pSeg->nTerm; + rc = fts3TruncateSegment(p, iAbsLevel, pSeg->iIdx, zTerm, nTerm); + nRem++; + } + } + + if( rc==SQLITE_OK && nRem!=pCsr->nSegment ){ + rc = fts3RepackSegdirLevel(p, iAbsLevel); + } + + *pnRem = nRem; + return rc; +} + +/* +** Store an incr-merge hint in the database. +*/ +static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ + sqlite3_stmt *pReplace = 0; + int rc; /* Return code */ + + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pReplace, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pReplace, 1, FTS_STAT_INCRMERGEHINT); + sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC); + sqlite3_step(pReplace); + rc = sqlite3_reset(pReplace); + sqlite3_bind_null(pReplace, 2); + } + + return rc; +} + +/* +** Load an incr-merge hint from the database. The incr-merge hint, if one +** exists, is stored in the rowid==1 row of the %_stat table. +** +** If successful, populate blob *pHint with the value read from the %_stat +** table and return SQLITE_OK. Otherwise, if an error occurs, return an +** SQLite error code. +*/ +static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){ + sqlite3_stmt *pSelect = 0; + int rc; + + pHint->n = 0; + rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pSelect, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pSelect, 1, FTS_STAT_INCRMERGEHINT); + if( SQLITE_ROW==sqlite3_step(pSelect) ){ + const char *aHint = sqlite3_column_blob(pSelect, 0); + int nHint = sqlite3_column_bytes(pSelect, 0); + if( aHint ){ + blobGrowBuffer(pHint, nHint, &rc); + if( rc==SQLITE_OK ){ + if( ALWAYS(pHint->a!=0) ) memcpy(pHint->a, aHint, nHint); + pHint->n = nHint; + } + } + } + rc2 = sqlite3_reset(pSelect); + if( rc==SQLITE_OK ) rc = rc2; + } + + return rc; +} + +/* +** If *pRc is not SQLITE_OK when this function is called, it is a no-op. +** Otherwise, append an entry to the hint stored in blob *pHint. Each entry +** consists of two varints, the absolute level number of the input segments +** and the number of input segments. +** +** If successful, leave *pRc set to SQLITE_OK and return. If an error occurs, +** set *pRc to an SQLite error code before returning. +*/ +static void fts3IncrmergeHintPush( + Blob *pHint, /* Hint blob to append to */ + i64 iAbsLevel, /* First varint to store in hint */ + int nInput, /* Second varint to store in hint */ + int *pRc /* IN/OUT: Error code */ +){ + blobGrowBuffer(pHint, pHint->n + 2*FTS3_VARINT_MAX, pRc); + if( *pRc==SQLITE_OK ){ + pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], iAbsLevel); + pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], (i64)nInput); + } +} + +/* +** Read the last entry (most recently pushed) from the hint blob *pHint +** and then remove the entry. Write the two values read to *piAbsLevel and +** *pnInput before returning. +** +** If no error occurs, return SQLITE_OK. If the hint blob in *pHint does +** not contain at least two valid varints, return SQLITE_CORRUPT_VTAB. +*/ +static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ + const int nHint = pHint->n; + int i; + + i = pHint->n-1; + if( (pHint->a[i] & 0x80) ) return FTS_CORRUPT_VTAB; + while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + if( i==0 ) return FTS_CORRUPT_VTAB; + i--; + while( i>0 && (pHint->a[i-1] & 0x80) ) i--; + + pHint->n = i; + i += sqlite3Fts3GetVarint(&pHint->a[i], piAbsLevel); + i += fts3GetVarint32(&pHint->a[i], pnInput); + assert( i<=nHint ); + if( i!=nHint ) return FTS_CORRUPT_VTAB; + + return SQLITE_OK; +} + + +/* +** Attempt an incremental merge that writes nMerge leaf blocks. +** +** Incremental merges happen nMin segments at a time. The segments +** to be merged are the nMin oldest segments (the ones with the smallest +** values for the _segdir.idx field) in the highest level that contains +** at least nMin segments. Multiple merges might occur in an attempt to +** write the quota of nMerge leaf blocks. +*/ +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ + int rc; /* Return code */ + int nRem = nMerge; /* Number of leaf pages yet to be written */ + Fts3MultiSegReader *pCsr; /* Cursor used to read input data */ + Fts3SegFilter *pFilter; /* Filter used with cursor pCsr */ + IncrmergeWriter *pWriter; /* Writer object */ + int nSeg = 0; /* Number of input segments */ + sqlite3_int64 iAbsLevel = 0; /* Absolute level number to work on */ + Blob hint = {0, 0, 0}; /* Hint read from %_stat table */ + int bDirtyHint = 0; /* True if blob 'hint' has been modified */ + + /* Allocate space for the cursor, filter and writer objects */ + const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); + pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); + if( !pWriter ) return SQLITE_NOMEM; + pFilter = (Fts3SegFilter *)&pWriter[1]; + pCsr = (Fts3MultiSegReader *)&pFilter[1]; + + rc = fts3IncrmergeHintLoad(p, &hint); + while( rc==SQLITE_OK && nRem>0 ){ + const i64 nMod = FTS3_SEGDIR_MAXLEVEL * p->nIndex; + sqlite3_stmt *pFindLevel = 0; /* SQL used to determine iAbsLevel */ + int bUseHint = 0; /* True if attempting to append */ + int iIdx = 0; /* Largest idx in level (iAbsLevel+1) */ + + /* Search the %_segdir table for the absolute level with the smallest + ** relative level number that contains at least nMin segments, if any. + ** If one is found, set iAbsLevel to the absolute level number and + ** nSeg to nMin. If no level with at least nMin segments can be found, + ** set nSeg to -1. + */ + rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); + sqlite3_bind_int(pFindLevel, 1, MAX(2, nMin)); + if( sqlite3_step(pFindLevel)==SQLITE_ROW ){ + iAbsLevel = sqlite3_column_int64(pFindLevel, 0); + nSeg = sqlite3_column_int(pFindLevel, 1); + assert( nSeg>=2 ); + }else{ + nSeg = -1; + } + rc = sqlite3_reset(pFindLevel); + + /* If the hint read from the %_stat table is not empty, check if the + ** last entry in it specifies a relative level smaller than or equal + ** to the level identified by the block above (if any). If so, this + ** iteration of the loop will work on merging at the hinted level. + */ + if( rc==SQLITE_OK && hint.n ){ + int nHint = hint.n; + sqlite3_int64 iHintAbsLevel = 0; /* Hint level */ + int nHintSeg = 0; /* Hint number of segments */ + + rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg); + if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){ + /* Based on the scan in the block above, it is known that there + ** are no levels with a relative level smaller than that of + ** iAbsLevel with more than nSeg segments, or if nSeg is -1, + ** no levels with more than nMin segments. Use this to limit the + ** value of nHintSeg to avoid a large memory allocation in case the + ** merge-hint is corrupt*/ + iAbsLevel = iHintAbsLevel; + nSeg = MIN(MAX(nMin,nSeg), nHintSeg); + bUseHint = 1; + bDirtyHint = 1; + }else{ + /* This undoes the effect of the HintPop() above - so that no entry + ** is removed from the hint blob. */ + hint.n = nHint; + } + } + + /* If nSeg is less that zero, then there is no level with at least + ** nMin segments and no hint in the %_stat table. No work to do. + ** Exit early in this case. */ + if( nSeg<=0 ) break; + + assert( nMod<=0x7FFFFFFF ); + if( iAbsLevel<0 || iAbsLevel>(nMod<<32) ){ + rc = FTS_CORRUPT_VTAB; + break; + } + + /* Open a cursor to iterate through the contents of the oldest nSeg + ** indexes of absolute level iAbsLevel. If this cursor is opened using + ** the 'hint' parameters, it is possible that there are less than nSeg + ** segments available in level iAbsLevel. In this case, no work is + ** done on iAbsLevel - fall through to the next iteration of the loop + ** to start work on some other level. */ + memset(pWriter, 0, nAlloc); + pFilter->flags = FTS3_SEGMENT_REQUIRE_POS; + + if( rc==SQLITE_OK ){ + rc = fts3IncrmergeOutputIdx(p, iAbsLevel, &iIdx); + assert( bUseHint==1 || bUseHint==0 ); + if( iIdx==0 || (bUseHint && iIdx==1) ){ + int bIgnore = 0; + rc = fts3SegmentIsMaxLevel(p, iAbsLevel+1, &bIgnore); + if( bIgnore ){ + pFilter->flags |= FTS3_SEGMENT_IGNORE_EMPTY; + } + } + } + + if( rc==SQLITE_OK ){ + rc = fts3IncrmergeCsr(p, iAbsLevel, nSeg, pCsr); + } + if( SQLITE_OK==rc && pCsr->nSegment==nSeg + && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter)) + ){ + int bEmpty = 0; + rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( rc==SQLITE_OK ){ + bEmpty = 1; + }else if( rc!=SQLITE_ROW ){ + sqlite3Fts3SegReaderFinish(pCsr); + break; + } + if( bUseHint && iIdx>0 ){ + const char *zKey = pCsr->zTerm; + int nKey = pCsr->nTerm; + rc = fts3IncrmergeLoad(p, iAbsLevel, iIdx-1, zKey, nKey, pWriter); + }else{ + rc = fts3IncrmergeWriter(p, iAbsLevel, iIdx, pCsr, pWriter); + } + + if( rc==SQLITE_OK && pWriter->nLeafEst ){ + fts3LogMerge(nSeg, iAbsLevel); + if( bEmpty==0 ){ + do { + rc = fts3IncrmergeAppend(p, pWriter, pCsr); + if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; + }while( rc==SQLITE_ROW ); + } + + /* Update or delete the input segments */ + if( rc==SQLITE_OK ){ + nRem -= (1 + pWriter->nWork); + rc = fts3IncrmergeChomp(p, iAbsLevel, pCsr, &nSeg); + if( nSeg!=0 ){ + bDirtyHint = 1; + fts3IncrmergeHintPush(&hint, iAbsLevel, nSeg, &rc); + } + } + } + + if( nSeg!=0 ){ + pWriter->nLeafData = pWriter->nLeafData * -1; + } + fts3IncrmergeRelease(p, pWriter, &rc); + if( nSeg==0 && pWriter->bNoLeafData==0 ){ + fts3PromoteSegments(p, iAbsLevel+1, pWriter->nLeafData); + } + } + + sqlite3Fts3SegReaderFinish(pCsr); + } + + /* Write the hint values into the %_stat table for the next incr-merger */ + if( bDirtyHint && rc==SQLITE_OK ){ + rc = fts3IncrmergeHintStore(p, &hint); + } + + sqlite3_free(pWriter); + sqlite3_free(hint.a); + return rc; +} + +/* +** Convert the text beginning at *pz into an integer and return +** its value. Advance *pz to point to the first character past +** the integer. +** +** This function used for parameters to merge= and incrmerge= +** commands. +*/ +static int fts3Getint(const char **pz){ + const char *z = *pz; + int i = 0; + while( (*z)>='0' && (*z)<='9' && i<214748363 ) i = 10*i + *(z++) - '0'; + *pz = z; + return i; +} + +/* +** Process statements of the form: +** +** INSERT INTO table(table) VALUES('merge=A,B'); +** +** A and B are integers that decode to be the number of leaf pages +** written for the merge, and the minimum number of segments on a level +** before it will be selected for a merge, respectively. +*/ +static int fts3DoIncrmerge( + Fts3Table *p, /* FTS3 table handle */ + const char *zParam /* Nul-terminated string containing "A,B" */ +){ + int rc; + int nMin = (MergeCount(p) / 2); + int nMerge = 0; + const char *z = zParam; + + /* Read the first integer value */ + nMerge = fts3Getint(&z); + + /* If the first integer value is followed by a ',', read the second + ** integer value. */ + if( z[0]==',' && z[1]!='\0' ){ + z++; + nMin = fts3Getint(&z); + } + + if( z[0]!='\0' || nMin<2 ){ + rc = SQLITE_ERROR; + }else{ + rc = SQLITE_OK; + if( !p->bHasStat ){ + assert( p->bFts4==0 ); + sqlite3Fts3CreateStatTable(&rc, p); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3Incrmerge(p, nMerge, nMin); + } + sqlite3Fts3SegmentsClose(p); + } + return rc; +} + +/* +** Process statements of the form: +** +** INSERT INTO table(table) VALUES('automerge=X'); +** +** where X is an integer. X==0 means to turn automerge off. X!=0 means +** turn it on. The setting is persistent. +*/ +static int fts3DoAutoincrmerge( + Fts3Table *p, /* FTS3 table handle */ + const char *zParam /* Nul-terminated string containing boolean */ +){ + int rc = SQLITE_OK; + sqlite3_stmt *pStmt = 0; + p->nAutoincrmerge = fts3Getint(&zParam); + if( p->nAutoincrmerge==1 || p->nAutoincrmerge>MergeCount(p) ){ + p->nAutoincrmerge = 8; + } + if( !p->bHasStat ){ + assert( p->bFts4==0 ); + sqlite3Fts3CreateStatTable(&rc, p); + if( rc ) return rc; + } + rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); + if( rc ) return rc; + sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); + sqlite3_bind_int(pStmt, 2, p->nAutoincrmerge); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + return rc; +} + +/* +** Return a 64-bit checksum for the FTS index entry specified by the +** arguments to this function. +*/ +static u64 fts3ChecksumEntry( + const char *zTerm, /* Pointer to buffer containing term */ + int nTerm, /* Size of zTerm in bytes */ + int iLangid, /* Language id for current row */ + int iIndex, /* Index (0..Fts3Table.nIndex-1) */ + i64 iDocid, /* Docid for current row. */ + int iCol, /* Column number */ + int iPos /* Position */ +){ + int i; + u64 ret = (u64)iDocid; + + ret += (ret<<3) + iLangid; + ret += (ret<<3) + iIndex; + ret += (ret<<3) + iCol; + ret += (ret<<3) + iPos; + for(i=0; inIndex-1) */ + int *pRc /* OUT: Return code */ +){ + Fts3SegFilter filter; + Fts3MultiSegReader csr; + int rc; + u64 cksum = 0; + + assert( *pRc==SQLITE_OK ); + + memset(&filter, 0, sizeof(filter)); + memset(&csr, 0, sizeof(csr)); + filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; + filter.flags |= FTS3_SEGMENT_SCAN; + + rc = sqlite3Fts3SegReaderCursor( + p, iLangid, iIndex, FTS3_SEGCURSOR_ALL, 0, 0, 0, 1,&csr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts3SegReaderStart(p, &csr, &filter); + } + + if( rc==SQLITE_OK ){ + while( SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, &csr)) ){ + char *pCsr = csr.aDoclist; + char *pEnd = &pCsr[csr.nDoclist]; + + i64 iDocid = 0; + i64 iCol = 0; + u64 iPos = 0; + + pCsr += sqlite3Fts3GetVarint(pCsr, &iDocid); + while( pCsrbDescIdx ){ + iDocid = (i64)((u64)iDocid - iVal); + }else{ + iDocid = (i64)((u64)iDocid + iVal); + } + } + }else{ + iPos += (iVal - 2); + cksum = cksum ^ fts3ChecksumEntry( + csr.zTerm, csr.nTerm, iLangid, iIndex, iDocid, + (int)iCol, (int)iPos + ); + } + } + } + } + } + sqlite3Fts3SegReaderFinish(&csr); + + *pRc = rc; + return cksum; +} + +/* +** Check if the contents of the FTS index match the current contents of the +** content table. If no error occurs and the contents do match, set *pbOk +** to true and return SQLITE_OK. Or if the contents do not match, set *pbOk +** to false before returning. +** +** If an error occurs (e.g. an OOM or IO error), return an SQLite error +** code. The final value of *pbOk is undefined in this case. +*/ +static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ + int rc = SQLITE_OK; /* Return code */ + u64 cksum1 = 0; /* Checksum based on FTS index contents */ + u64 cksum2 = 0; /* Checksum based on %_content contents */ + sqlite3_stmt *pAllLangid = 0; /* Statement to return all language-ids */ + + /* This block calculates the checksum according to the FTS index. */ + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + if( rc==SQLITE_OK ){ + int rc2; + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); + while( rc==SQLITE_OK && sqlite3_step(pAllLangid)==SQLITE_ROW ){ + int iLangid = sqlite3_column_int(pAllLangid, 0); + int i; + for(i=0; inIndex; i++){ + cksum1 = cksum1 ^ fts3ChecksumIndex(p, iLangid, i, &rc); + } + } + rc2 = sqlite3_reset(pAllLangid); + if( rc==SQLITE_OK ) rc = rc2; + } + + /* This block calculates the checksum according to the %_content table */ + if( rc==SQLITE_OK ){ + sqlite3_tokenizer_module const *pModule = p->pTokenizer->pModule; + sqlite3_stmt *pStmt = 0; + char *zSql; + + zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + i64 iDocid = sqlite3_column_int64(pStmt, 0); + int iLang = langidFromSelect(p, pStmt); + int iCol; + + for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ + if( p->abNotindexed[iCol]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pStmt, iCol+1); + sqlite3_tokenizer_cursor *pT = 0; + + rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, -1, &pT); + while( rc==SQLITE_OK ){ + char const *zToken; /* Buffer containing token */ + int nToken = 0; /* Number of bytes in token */ + int iDum1 = 0, iDum2 = 0; /* Dummy variables */ + int iPos = 0; /* Position of token in zText */ + + rc = pModule->xNext(pT, &zToken, &nToken, &iDum1, &iDum2, &iPos); + if( rc==SQLITE_OK ){ + int i; + cksum2 = cksum2 ^ fts3ChecksumEntry( + zToken, nToken, iLang, 0, iDocid, iCol, iPos + ); + for(i=1; inIndex; i++){ + if( p->aIndex[i].nPrefix<=nToken ){ + cksum2 = cksum2 ^ fts3ChecksumEntry( + zToken, p->aIndex[i].nPrefix, iLang, i, iDocid, iCol, iPos + ); + } + } + } + } + if( pT ) pModule->xClose(pT); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + } + } + + sqlite3_finalize(pStmt); + } + + *pbOk = (cksum1==cksum2); + return rc; +} + +/* +** Run the integrity-check. If no error occurs and the current contents of +** the FTS index are correct, return SQLITE_OK. Or, if the contents of the +** FTS index are incorrect, return SQLITE_CORRUPT_VTAB. +** +** Or, if an error (e.g. an OOM or IO error) occurs, return an SQLite +** error code. +** +** The integrity-check works as follows. For each token and indexed token +** prefix in the document set, a 64-bit checksum is calculated (by code +** in fts3ChecksumEntry()) based on the following: +** +** + The index number (0 for the main index, 1 for the first prefix +** index etc.), +** + The token (or token prefix) text itself, +** + The language-id of the row it appears in, +** + The docid of the row it appears in, +** + The column it appears in, and +** + The tokens position within that column. +** +** The checksums for all entries in the index are XORed together to create +** a single checksum for the entire index. +** +** The integrity-check code calculates the same checksum in two ways: +** +** 1. By scanning the contents of the FTS index, and +** 2. By scanning and tokenizing the content table. +** +** If the two checksums are identical, the integrity-check is deemed to have +** passed. +*/ +static int fts3DoIntegrityCheck( + Fts3Table *p /* FTS3 table handle */ +){ + int rc; + int bOk = 0; + rc = fts3IntegrityCheck(p, &bOk); + if( rc==SQLITE_OK && bOk==0 ) rc = FTS_CORRUPT_VTAB; + return rc; +} + +/* +** Handle a 'special' INSERT of the form: +** +** "INSERT INTO tbl(tbl) VALUES()" +** +** Argument pVal contains the result of . Currently the only +** meaningful value to insert is the text 'optimize'. +*/ +static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ + int rc = SQLITE_ERROR; /* Return Code */ + const char *zVal = (const char *)sqlite3_value_text(pVal); + int nVal = sqlite3_value_bytes(pVal); + + if( !zVal ){ + return SQLITE_NOMEM; + }else if( nVal==8 && 0==sqlite3_strnicmp(zVal, "optimize", 8) ){ + rc = fts3DoOptimize(p, 0); + }else if( nVal==7 && 0==sqlite3_strnicmp(zVal, "rebuild", 7) ){ + rc = fts3DoRebuild(p); + }else if( nVal==15 && 0==sqlite3_strnicmp(zVal, "integrity-check", 15) ){ + rc = fts3DoIntegrityCheck(p); + }else if( nVal>6 && 0==sqlite3_strnicmp(zVal, "merge=", 6) ){ + rc = fts3DoIncrmerge(p, &zVal[6]); + }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){ + rc = fts3DoAutoincrmerge(p, &zVal[10]); +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) + }else{ + int v; + if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ + v = atoi(&zVal[9]); + if( v>=24 && v<=p->nPgsz-35 ) p->nNodeSize = v; + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ + v = atoi(&zVal[11]); + if( v>=64 && v<=FTS3_MAX_PENDING_DATA ) p->nMaxPendingData = v; + rc = SQLITE_OK; + }else if( nVal>21 && 0==sqlite3_strnicmp(zVal,"test-no-incr-doclist=",21) ){ + p->bNoIncrDoclist = atoi(&zVal[21]); + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal,"mergecount=",11) ){ + v = atoi(&zVal[11]); + if( v>=4 && v<=FTS3_MERGE_COUNT && (v&1)==0 ) p->nMergeCount = v; + rc = SQLITE_OK; + } +#endif + } + return rc; +} + +#ifndef SQLITE_DISABLE_FTS4_DEFERRED +/* +** Delete all cached deferred doclists. Deferred doclists are cached +** (allocated) by the sqlite3Fts3CacheDeferredDoclists() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){ + Fts3DeferredToken *pDef; + for(pDef=pCsr->pDeferred; pDef; pDef=pDef->pNext){ + fts3PendingListDelete(pDef->pList); + pDef->pList = 0; + } +} + +/* +** Free all entries in the pCsr->pDeffered list. Entries are added to +** this list using sqlite3Fts3DeferToken(). +*/ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){ + Fts3DeferredToken *pDef; + Fts3DeferredToken *pNext; + for(pDef=pCsr->pDeferred; pDef; pDef=pNext){ + pNext = pDef->pNext; + fts3PendingListDelete(pDef->pList); + sqlite3_free(pDef); + } + pCsr->pDeferred = 0; +} + +/* +** Generate deferred-doclists for all tokens in the pCsr->pDeferred list +** based on the row that pCsr currently points to. +** +** A deferred-doclist is like any other doclist with position information +** included, except that it only contains entries for a single row of the +** table, not for all rows. +*/ +SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){ + int rc = SQLITE_OK; /* Return code */ + if( pCsr->pDeferred ){ + int i; /* Used to iterate through table columns */ + sqlite3_int64 iDocid; /* Docid of the row pCsr points to */ + Fts3DeferredToken *pDef; /* Used to iterate through deferred tokens */ + + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + sqlite3_tokenizer *pT = p->pTokenizer; + sqlite3_tokenizer_module const *pModule = pT->pModule; + + assert( pCsr->isRequireSeek==0 ); + iDocid = sqlite3_column_int64(pCsr->pStmt, 0); + + for(i=0; inColumn && rc==SQLITE_OK; i++){ + if( p->abNotindexed[i]==0 ){ + const char *zText = (const char *)sqlite3_column_text(pCsr->pStmt, i+1); + sqlite3_tokenizer_cursor *pTC = 0; + + rc = sqlite3Fts3OpenTokenizer(pT, pCsr->iLangid, zText, -1, &pTC); + while( rc==SQLITE_OK ){ + char const *zToken; /* Buffer containing token */ + int nToken = 0; /* Number of bytes in token */ + int iDum1 = 0, iDum2 = 0; /* Dummy variables */ + int iPos = 0; /* Position of token in zText */ + + rc = pModule->xNext(pTC, &zToken, &nToken, &iDum1, &iDum2, &iPos); + for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){ + Fts3PhraseToken *pPT = pDef->pToken; + if( (pDef->iCol>=p->nColumn || pDef->iCol==i) + && (pPT->bFirst==0 || iPos==0) + && (pPT->n==nToken || (pPT->isPrefix && pPT->nz, pPT->n)) + ){ + fts3PendingListAppend(&pDef->pList, iDocid, i, iPos, &rc); + } + } + } + if( pTC ) pModule->xClose(pTC); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + } + } + + for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){ + if( pDef->pList ){ + rc = fts3PendingListAppendVarint(&pDef->pList, 0); + } + } + } + + return rc; +} + +SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( + Fts3DeferredToken *p, + char **ppData, + int *pnData +){ + char *pRet; + int nSkip; + sqlite3_int64 dummy; + + *ppData = 0; + *pnData = 0; + + if( p->pList==0 ){ + return SQLITE_OK; + } + + pRet = (char *)sqlite3_malloc(p->pList->nData); + if( !pRet ) return SQLITE_NOMEM; + + nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); + *pnData = p->pList->nData - nSkip; + *ppData = pRet; + + memcpy(pRet, &p->pList->aData[nSkip], *pnData); + return SQLITE_OK; +} + +/* +** Add an entry for token pToken to the pCsr->pDeferred list. +*/ +SQLITE_PRIVATE int sqlite3Fts3DeferToken( + Fts3Cursor *pCsr, /* Fts3 table cursor */ + Fts3PhraseToken *pToken, /* Token to defer */ + int iCol /* Column that token must appear in (or -1) */ +){ + Fts3DeferredToken *pDeferred; + pDeferred = sqlite3_malloc(sizeof(*pDeferred)); + if( !pDeferred ){ + return SQLITE_NOMEM; + } + memset(pDeferred, 0, sizeof(*pDeferred)); + pDeferred->pToken = pToken; + pDeferred->pNext = pCsr->pDeferred; + pDeferred->iCol = iCol; + pCsr->pDeferred = pDeferred; + + assert( pToken->pDeferred==0 ); + pToken->pDeferred = pDeferred; + + return SQLITE_OK; +} +#endif + +/* +** SQLite value pRowid contains the rowid of a row that may or may not be +** present in the FTS3 table. If it is, delete it and adjust the contents +** of subsiduary data structures accordingly. +*/ +static int fts3DeleteByRowid( + Fts3Table *p, + sqlite3_value *pRowid, + int *pnChng, /* IN/OUT: Decrement if row is deleted */ + u32 *aSzDel +){ + int rc = SQLITE_OK; /* Return code */ + int bFound = 0; /* True if *pRowid really is in the table */ + + fts3DeleteTerms(&rc, p, pRowid, aSzDel, &bFound); + if( bFound && rc==SQLITE_OK ){ + int isEmpty = 0; /* Deleting *pRowid leaves the table empty */ + rc = fts3IsEmpty(p, pRowid, &isEmpty); + if( rc==SQLITE_OK ){ + if( isEmpty ){ + /* Deleting this row means the whole table is empty. In this case + ** delete the contents of all three tables and throw away any + ** data in the pendingTerms hash table. */ + rc = fts3DeleteAll(p, 1); + *pnChng = 0; + memset(aSzDel, 0, sizeof(u32) * (p->nColumn+1) * 2); + }else{ + *pnChng = *pnChng - 1; + if( p->zContentTbl==0 ){ + fts3SqlExec(&rc, p, SQL_DELETE_CONTENT, &pRowid); + } + if( p->bHasDocsize ){ + fts3SqlExec(&rc, p, SQL_DELETE_DOCSIZE, &pRowid); + } + } + } + } + + return rc; +} + +/* +** This function does the work for the xUpdate method of FTS3 virtual +** tables. The schema of the virtual table being: +** +** CREATE TABLE
        ( +** , +**
        HIDDEN, +** docid HIDDEN, +** HIDDEN +** ); +** +** +*/ +SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( + sqlite3_vtab *pVtab, /* FTS3 vtab object */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + Fts3Table *p = (Fts3Table *)pVtab; + int rc = SQLITE_OK; /* Return Code */ + u32 *aSzIns = 0; /* Sizes of inserted documents */ + u32 *aSzDel = 0; /* Sizes of deleted documents */ + int nChng = 0; /* Net change in number of documents */ + int bInsertDone = 0; + + /* At this point it must be known if the %_stat table exists or not. + ** So bHasStat may not be 2. */ + assert( p->bHasStat==0 || p->bHasStat==1 ); + + assert( p->pSegments==0 ); + assert( + nArg==1 /* DELETE operations */ + || nArg==(2 + p->nColumn + 3) /* INSERT or UPDATE operations */ + ); + + /* Check for a "special" INSERT operation. One of the form: + ** + ** INSERT INTO xyz(xyz) VALUES('command'); + */ + if( nArg>1 + && sqlite3_value_type(apVal[0])==SQLITE_NULL + && sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL + ){ + rc = fts3SpecialInsert(p, apVal[p->nColumn+2]); + goto update_out; + } + + if( nArg>1 && sqlite3_value_int(apVal[2 + p->nColumn + 2])<0 ){ + rc = SQLITE_CONSTRAINT; + goto update_out; + } + + /* Allocate space to hold the change in document sizes */ + aSzDel = sqlite3_malloc64(sizeof(aSzDel[0])*((sqlite3_int64)p->nColumn+1)*2); + if( aSzDel==0 ){ + rc = SQLITE_NOMEM; + goto update_out; + } + aSzIns = &aSzDel[p->nColumn+1]; + memset(aSzDel, 0, sizeof(aSzDel[0])*(p->nColumn+1)*2); + + rc = fts3Writelock(p); + if( rc!=SQLITE_OK ) goto update_out; + + /* If this is an INSERT operation, or an UPDATE that modifies the rowid + ** value, then this operation requires constraint handling. + ** + ** If the on-conflict mode is REPLACE, this means that the existing row + ** should be deleted from the database before inserting the new row. Or, + ** if the on-conflict mode is other than REPLACE, then this method must + ** detect the conflict and return SQLITE_CONSTRAINT before beginning to + ** modify the database file. + */ + if( nArg>1 && p->zContentTbl==0 ){ + /* Find the value object that holds the new rowid value. */ + sqlite3_value *pNewRowid = apVal[3+p->nColumn]; + if( sqlite3_value_type(pNewRowid)==SQLITE_NULL ){ + pNewRowid = apVal[1]; + } + + if( sqlite3_value_type(pNewRowid)!=SQLITE_NULL && ( + sqlite3_value_type(apVal[0])==SQLITE_NULL + || sqlite3_value_int64(apVal[0])!=sqlite3_value_int64(pNewRowid) + )){ + /* The new rowid is not NULL (in this case the rowid will be + ** automatically assigned and there is no chance of a conflict), and + ** the statement is either an INSERT or an UPDATE that modifies the + ** rowid column. So if the conflict mode is REPLACE, then delete any + ** existing row with rowid=pNewRowid. + ** + ** Or, if the conflict mode is not REPLACE, insert the new record into + ** the %_content table. If we hit the duplicate rowid constraint (or any + ** other error) while doing so, return immediately. + ** + ** This branch may also run if pNewRowid contains a value that cannot + ** be losslessly converted to an integer. In this case, the eventual + ** call to fts3InsertData() (either just below or further on in this + ** function) will return SQLITE_MISMATCH. If fts3DeleteByRowid is + ** invoked, it will delete zero rows (since no row will have + ** docid=$pNewRowid if $pNewRowid is not an integer value). + */ + if( sqlite3_vtab_on_conflict(p->db)==SQLITE_REPLACE ){ + rc = fts3DeleteByRowid(p, pNewRowid, &nChng, aSzDel); + }else{ + rc = fts3InsertData(p, apVal, pRowid); + bInsertDone = 1; + } + } + } + if( rc!=SQLITE_OK ){ + goto update_out; + } + + /* If this is a DELETE or UPDATE operation, remove the old record. */ + if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER ); + rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel); + } + + /* If this is an INSERT or UPDATE operation, insert the new record. */ + if( nArg>1 && rc==SQLITE_OK ){ + int iLangid = sqlite3_value_int(apVal[2 + p->nColumn + 2]); + if( bInsertDone==0 ){ + rc = fts3InsertData(p, apVal, pRowid); + if( rc==SQLITE_CONSTRAINT && p->zContentTbl==0 ){ + rc = FTS_CORRUPT_VTAB; + } + } + if( rc==SQLITE_OK ){ + rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid); + } + if( rc==SQLITE_OK ){ + assert( p->iPrevDocid==*pRowid ); + rc = fts3InsertTerms(p, iLangid, apVal, aSzIns); + } + if( p->bHasDocsize ){ + fts3InsertDocsize(&rc, p, aSzIns); + } + nChng++; + } + + if( p->bFts4 ){ + fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nChng); + } + + update_out: + sqlite3_free(aSzDel); + sqlite3Fts3SegmentsClose(p); + return rc; +} + +/* +** Flush any data in the pending-terms hash table to disk. If successful, +** merge all segments in the database (including the new segment, if +** there was any data to flush) into a single segment. +*/ +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ + int rc; + rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3DoOptimize(p, 1); + if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + int rc2 = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + if( rc2!=SQLITE_OK ) rc = rc2; + }else{ + sqlite3_exec(p->db, "ROLLBACK TO fts3", 0, 0, 0); + sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0); + } + } + sqlite3Fts3SegmentsClose(p); + return rc; +} + +#endif + +/************** End of fts3_write.c ******************************************/ +/************** Begin file fts3_snippet.c ************************************/ +/* +** 2009 Oct 23 +** +** 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. +** +****************************************************************************** +*/ + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ + +#ifndef SQLITE_AMALGAMATION +typedef sqlite3_int64 i64; +#endif + +/* +** Characters that may appear in the second argument to matchinfo(). +*/ +#define FTS3_MATCHINFO_NPHRASE 'p' /* 1 value */ +#define FTS3_MATCHINFO_NCOL 'c' /* 1 value */ +#define FTS3_MATCHINFO_NDOC 'n' /* 1 value */ +#define FTS3_MATCHINFO_AVGLENGTH 'a' /* nCol values */ +#define FTS3_MATCHINFO_LENGTH 'l' /* nCol values */ +#define FTS3_MATCHINFO_LCS 's' /* nCol values */ +#define FTS3_MATCHINFO_HITS 'x' /* 3*nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS 'y' /* nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS_BM 'b' /* nCol*nPhrase values */ + +/* +** The default value for the second argument to matchinfo(). +*/ +#define FTS3_MATCHINFO_DEFAULT "pcx" + + +/* +** Used as an fts3ExprIterate() context when loading phrase doclists to +** Fts3Expr.aDoclist[]/nDoclist. +*/ +typedef struct LoadDoclistCtx LoadDoclistCtx; +struct LoadDoclistCtx { + Fts3Cursor *pCsr; /* FTS3 Cursor */ + int nPhrase; /* Number of phrases seen so far */ + int nToken; /* Number of tokens seen so far */ +}; + +/* +** The following types are used as part of the implementation of the +** fts3BestSnippet() routine. +*/ +typedef struct SnippetIter SnippetIter; +typedef struct SnippetPhrase SnippetPhrase; +typedef struct SnippetFragment SnippetFragment; + +struct SnippetIter { + Fts3Cursor *pCsr; /* Cursor snippet is being generated from */ + int iCol; /* Extract snippet from this column */ + int nSnippet; /* Requested snippet length (in tokens) */ + int nPhrase; /* Number of phrases in query */ + SnippetPhrase *aPhrase; /* Array of size nPhrase */ + int iCurrent; /* First token of current snippet */ +}; + +struct SnippetPhrase { + int nToken; /* Number of tokens in phrase */ + char *pList; /* Pointer to start of phrase position list */ + i64 iHead; /* Next value in position list */ + char *pHead; /* Position list data following iHead */ + i64 iTail; /* Next value in trailing position list */ + char *pTail; /* Position list data following iTail */ +}; + +struct SnippetFragment { + int iCol; /* Column snippet is extracted from */ + int iPos; /* Index of first token in snippet */ + u64 covered; /* Mask of query phrases covered */ + u64 hlmask; /* Mask of snippet terms to highlight */ +}; + +/* +** This type is used as an fts3ExprIterate() context object while +** accumulating the data returned by the matchinfo() function. +*/ +typedef struct MatchInfo MatchInfo; +struct MatchInfo { + Fts3Cursor *pCursor; /* FTS3 Cursor */ + int nCol; /* Number of columns in table */ + int nPhrase; /* Number of matchable phrases in query */ + sqlite3_int64 nDoc; /* Number of docs in database */ + char flag; + u32 *aMatchinfo; /* Pre-allocated buffer */ +}; + +/* +** An instance of this structure is used to manage a pair of buffers, each +** (nElem * sizeof(u32)) bytes in size. See the MatchinfoBuffer code below +** for details. +*/ +struct MatchinfoBuffer { + u8 aRef[3]; + int nElem; + int bGlobal; /* Set if global data is loaded */ + char *zMatchinfo; + u32 aMatchinfo[1]; +}; + + +/* +** The snippet() and offsets() functions both return text values. An instance +** of the following structure is used to accumulate those values while the +** functions are running. See fts3StringAppend() for details. +*/ +typedef struct StrBuffer StrBuffer; +struct StrBuffer { + char *z; /* Pointer to buffer containing string */ + int n; /* Length of z in bytes (excl. nul-term) */ + int nAlloc; /* Allocated size of buffer z in bytes */ +}; + + +/************************************************************************* +** Start of MatchinfoBuffer code. +*/ + +/* +** Allocate a two-slot MatchinfoBuffer object. +*/ +static MatchinfoBuffer *fts3MIBufferNew(size_t nElem, const char *zMatchinfo){ + MatchinfoBuffer *pRet; + sqlite3_int64 nByte = sizeof(u32) * (2*(sqlite3_int64)nElem + 1) + + sizeof(MatchinfoBuffer); + sqlite3_int64 nStr = strlen(zMatchinfo); + + pRet = sqlite3Fts3MallocZero(nByte + nStr+1); + if( pRet ){ + pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; + pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + + sizeof(u32)*((int)nElem+1); + pRet->nElem = (int)nElem; + pRet->zMatchinfo = ((char*)pRet) + nByte; + memcpy(pRet->zMatchinfo, zMatchinfo, nStr+1); + pRet->aRef[0] = 1; + } + + return pRet; +} + +static void fts3MIBufferFree(void *p){ + MatchinfoBuffer *pBuf = (MatchinfoBuffer*)((u8*)p - ((u32*)p)[-1]); + + assert( (u32*)p==&pBuf->aMatchinfo[1] + || (u32*)p==&pBuf->aMatchinfo[pBuf->nElem+2] + ); + if( (u32*)p==&pBuf->aMatchinfo[1] ){ + pBuf->aRef[1] = 0; + }else{ + pBuf->aRef[2] = 0; + } + + if( pBuf->aRef[0]==0 && pBuf->aRef[1]==0 && pBuf->aRef[2]==0 ){ + sqlite3_free(pBuf); + } +} + +static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ + void (*xRet)(void*) = 0; + u32 *aOut = 0; + + if( p->aRef[1]==0 ){ + p->aRef[1] = 1; + aOut = &p->aMatchinfo[1]; + xRet = fts3MIBufferFree; + } + else if( p->aRef[2]==0 ){ + p->aRef[2] = 1; + aOut = &p->aMatchinfo[p->nElem+2]; + xRet = fts3MIBufferFree; + }else{ + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); + if( aOut ){ + xRet = sqlite3_free; + if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); + } + } + + *paOut = aOut; + return xRet; +} + +static void fts3MIBufferSetGlobal(MatchinfoBuffer *p){ + p->bGlobal = 1; + memcpy(&p->aMatchinfo[2+p->nElem], &p->aMatchinfo[1], p->nElem*sizeof(u32)); +} + +/* +** Free a MatchinfoBuffer object allocated using fts3MIBufferNew() +*/ +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){ + if( p ){ + assert( p->aRef[0]==1 ); + p->aRef[0] = 0; + if( p->aRef[0]==0 && p->aRef[1]==0 && p->aRef[2]==0 ){ + sqlite3_free(p); + } + } +} + +/* +** End of MatchinfoBuffer code. +*************************************************************************/ + + +/* +** This function is used to help iterate through a position-list. A position +** list is a list of unique integers, sorted from smallest to largest. Each +** element of the list is represented by an FTS3 varint that takes the value +** of the difference between the current element and the previous one plus +** two. For example, to store the position-list: +** +** 4 9 113 +** +** the three varints: +** +** 6 7 106 +** +** are encoded. +** +** When this function is called, *pp points to the start of an element of +** the list. *piPos contains the value of the previous entry in the list. +** After it returns, *piPos contains the value of the next element of the +** list and *pp is advanced to the following varint. +*/ +static void fts3GetDeltaPosition(char **pp, i64 *piPos){ + int iVal; + *pp += fts3GetVarint32(*pp, &iVal); + *piPos += (iVal-2); +} + +/* +** Helper function for fts3ExprIterate() (see below). +*/ +static int fts3ExprIterate2( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int *piPhrase, /* Pointer to phrase counter */ + int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ +){ + int rc; /* Return code */ + int eType = pExpr->eType; /* Type of expression node pExpr */ + + if( eType!=FTSQUERY_PHRASE ){ + assert( pExpr->pLeft && pExpr->pRight ); + rc = fts3ExprIterate2(pExpr->pLeft, piPhrase, x, pCtx); + if( rc==SQLITE_OK && eType!=FTSQUERY_NOT ){ + rc = fts3ExprIterate2(pExpr->pRight, piPhrase, x, pCtx); + } + }else{ + rc = x(pExpr, *piPhrase, pCtx); + (*piPhrase)++; + } + return rc; +} + +/* +** Iterate through all phrase nodes in an FTS3 query, except those that +** are part of a sub-tree that is the right-hand-side of a NOT operator. +** For each phrase node found, the supplied callback function is invoked. +** +** If the callback function returns anything other than SQLITE_OK, +** the iteration is abandoned and the error code returned immediately. +** Otherwise, SQLITE_OK is returned after a callback has been made for +** all eligible phrase nodes. +*/ +static int fts3ExprIterate( + Fts3Expr *pExpr, /* Expression to iterate phrases of */ + int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */ + void *pCtx /* Second argument to pass to callback */ +){ + int iPhrase = 0; /* Variable used as the phrase counter */ + return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx); +} + + +/* +** This is an fts3ExprIterate() callback used while loading the doclists +** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also +** fts3ExprLoadDoclists(). +*/ +static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + int rc = SQLITE_OK; + Fts3Phrase *pPhrase = pExpr->pPhrase; + LoadDoclistCtx *p = (LoadDoclistCtx *)ctx; + + UNUSED_PARAMETER(iPhrase); + + p->nPhrase++; + p->nToken += pPhrase->nToken; + + return rc; +} + +/* +** Load the doclists for each phrase in the query associated with FTS3 cursor +** pCsr. +** +** If pnPhrase is not NULL, then *pnPhrase is set to the number of matchable +** phrases in the expression (all phrases except those directly or +** indirectly descended from the right-hand-side of a NOT operator). If +** pnToken is not NULL, then it is set to the number of tokens in all +** matchable phrases of the expression. +*/ +static int fts3ExprLoadDoclists( + Fts3Cursor *pCsr, /* Fts3 cursor for current query */ + int *pnPhrase, /* OUT: Number of phrases in query */ + int *pnToken /* OUT: Number of tokens in query */ +){ + int rc; /* Return Code */ + LoadDoclistCtx sCtx = {0,0,0}; /* Context for fts3ExprIterate() */ + sCtx.pCsr = pCsr; + rc = fts3ExprIterate(pCsr->pExpr, fts3ExprLoadDoclistsCb, (void *)&sCtx); + if( pnPhrase ) *pnPhrase = sCtx.nPhrase; + if( pnToken ) *pnToken = sCtx.nToken; + return rc; +} + +static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + (*(int *)ctx)++; + pExpr->iPhrase = iPhrase; + return SQLITE_OK; +} +static int fts3ExprPhraseCount(Fts3Expr *pExpr){ + int nPhrase = 0; + (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase); + return nPhrase; +} + +/* +** Advance the position list iterator specified by the first two +** arguments so that it points to the first element with a value greater +** than or equal to parameter iNext. +*/ +static void fts3SnippetAdvance(char **ppIter, i64 *piIter, int iNext){ + char *pIter = *ppIter; + if( pIter ){ + i64 iIter = *piIter; + + while( iIteriCurrent<0 ){ + /* The SnippetIter object has just been initialized. The first snippet + ** candidate always starts at offset 0 (even if this candidate has a + ** score of 0.0). + */ + pIter->iCurrent = 0; + + /* Advance the 'head' iterator of each phrase to the first offset that + ** is greater than or equal to (iNext+nSnippet). + */ + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, pIter->nSnippet); + } + }else{ + int iStart; + int iEnd = 0x7FFFFFFF; + + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + if( pPhrase->pHead && pPhrase->iHeadiHead; + } + } + if( iEnd==0x7FFFFFFF ){ + return 1; + } + + pIter->iCurrent = iStart = iEnd - pIter->nSnippet + 1; + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, iEnd+1); + fts3SnippetAdvance(&pPhrase->pTail, &pPhrase->iTail, iStart); + } + } + + return 0; +} + +/* +** Retrieve information about the current candidate snippet of snippet +** iterator pIter. +*/ +static void fts3SnippetDetails( + SnippetIter *pIter, /* Snippet iterator */ + u64 mCovered, /* Bitmask of phrases already covered */ + int *piToken, /* OUT: First token of proposed snippet */ + int *piScore, /* OUT: "Score" for this snippet */ + u64 *pmCover, /* OUT: Bitmask of phrases covered */ + u64 *pmHighlight /* OUT: Bitmask of terms to highlight */ +){ + int iStart = pIter->iCurrent; /* First token of snippet */ + int iScore = 0; /* Score of this snippet */ + int i; /* Loop counter */ + u64 mCover = 0; /* Mask of phrases covered by this snippet */ + u64 mHighlight = 0; /* Mask of tokens to highlight in snippet */ + + for(i=0; inPhrase; i++){ + SnippetPhrase *pPhrase = &pIter->aPhrase[i]; + if( pPhrase->pTail ){ + char *pCsr = pPhrase->pTail; + i64 iCsr = pPhrase->iTail; + + while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ + int j; + u64 mPhrase = (u64)1 << (i%64); + u64 mPos = (u64)1 << (iCsr - iStart); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 ); + if( (mCover|mCovered)&mPhrase ){ + iScore++; + }else{ + iScore += 1000; + } + mCover |= mPhrase; + + for(j=0; jnToken; j++){ + mHighlight |= (mPos>>j); + } + + if( 0==(*pCsr & 0x0FE) ) break; + fts3GetDeltaPosition(&pCsr, &iCsr); + } + } + } + + /* Set the output variables before returning. */ + *piToken = iStart; + *piScore = iScore; + *pmCover = mCover; + *pmHighlight = mHighlight; +} + +/* +** This function is an fts3ExprIterate() callback used by fts3BestSnippet(). +** Each invocation populates an element of the SnippetIter.aPhrase[] array. +*/ +static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ + SnippetIter *p = (SnippetIter *)ctx; + SnippetPhrase *pPhrase = &p->aPhrase[iPhrase]; + char *pCsr; + int rc; + + pPhrase->nToken = pExpr->pPhrase->nToken; + rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pCsr); + assert( rc==SQLITE_OK || pCsr==0 ); + if( pCsr ){ + i64 iFirst = 0; + pPhrase->pList = pCsr; + fts3GetDeltaPosition(&pCsr, &iFirst); + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } + }else{ + assert( rc!=SQLITE_OK || ( + pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 + )); + } + + return rc; +} + +/* +** Select the fragment of text consisting of nFragment contiguous tokens +** from column iCol that represent the "best" snippet. The best snippet +** is the snippet with the highest score, where scores are calculated +** by adding: +** +** (a) +1 point for each occurrence of a matchable phrase in the snippet. +** +** (b) +1000 points for the first occurrence of each matchable phrase in +** the snippet for which the corresponding mCovered bit is not set. +** +** The selected snippet parameters are stored in structure *pFragment before +** returning. The score of the selected snippet is stored in *piScore +** before returning. +*/ +static int fts3BestSnippet( + int nSnippet, /* Desired snippet length */ + Fts3Cursor *pCsr, /* Cursor to create snippet for */ + int iCol, /* Index of column to create snippet from */ + u64 mCovered, /* Mask of phrases already covered */ + u64 *pmSeen, /* IN/OUT: Mask of phrases seen */ + SnippetFragment *pFragment, /* OUT: Best snippet found */ + int *piScore /* OUT: Score of snippet pFragment */ +){ + int rc; /* Return Code */ + int nList; /* Number of phrases in expression */ + SnippetIter sIter; /* Iterates through snippet candidates */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ + int iBestScore = -1; /* Best snippet score found so far */ + int i; /* Loop counter */ + + memset(&sIter, 0, sizeof(sIter)); + + /* Iterate through the phrases in the expression to count them. The same + ** callback makes sure the doclists are loaded for each phrase. + */ + rc = fts3ExprLoadDoclists(pCsr, &nList, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Now that it is known how many phrases there are, allocate and zero + ** the required space using malloc(). + */ + nByte = sizeof(SnippetPhrase) * nList; + sIter.aPhrase = (SnippetPhrase *)sqlite3Fts3MallocZero(nByte); + if( !sIter.aPhrase ){ + return SQLITE_NOMEM; + } + + /* Initialize the contents of the SnippetIter object. Then iterate through + ** the set of phrases in the expression to populate the aPhrase[] array. + */ + sIter.pCsr = pCsr; + sIter.iCol = iCol; + sIter.nSnippet = nSnippet; + sIter.nPhrase = nList; + sIter.iCurrent = -1; + rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter); + if( rc==SQLITE_OK ){ + + /* Set the *pmSeen output variable. */ + for(i=0; iiCol = iCol; + while( !fts3SnippetNextCandidate(&sIter) ){ + int iPos; + int iScore; + u64 mCover; + u64 mHighlite; + fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite); + assert( iScore>=0 ); + if( iScore>iBestScore ){ + pFragment->iPos = iPos; + pFragment->hlmask = mHighlite; + pFragment->covered = mCover; + iBestScore = iScore; + } + } + + *piScore = iBestScore; + } + sqlite3_free(sIter.aPhrase); + return rc; +} + + +/* +** Append a string to the string-buffer passed as the first argument. +** +** If nAppend is negative, then the length of the string zAppend is +** determined using strlen(). +*/ +static int fts3StringAppend( + StrBuffer *pStr, /* Buffer to append to */ + const char *zAppend, /* Pointer to data to append to buffer */ + int nAppend /* Size of zAppend in bytes (or -1) */ +){ + if( nAppend<0 ){ + nAppend = (int)strlen(zAppend); + } + + /* If there is insufficient space allocated at StrBuffer.z, use realloc() + ** to grow the buffer until so that it is big enough to accomadate the + ** appended data. + */ + if( pStr->n+nAppend+1>=pStr->nAlloc ){ + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); + if( !zNew ){ + return SQLITE_NOMEM; + } + pStr->z = zNew; + pStr->nAlloc = nAlloc; + } + assert( pStr->z!=0 && (pStr->nAlloc >= pStr->n+nAppend+1) ); + + /* Append the data to the string buffer. */ + memcpy(&pStr->z[pStr->n], zAppend, nAppend); + pStr->n += nAppend; + pStr->z[pStr->n] = '\0'; + + return SQLITE_OK; +} + +/* +** The fts3BestSnippet() function often selects snippets that end with a +** query term. That is, the final term of the snippet is always a term +** that requires highlighting. For example, if 'X' is a highlighted term +** and '.' is a non-highlighted term, BestSnippet() may select: +** +** ........X.....X +** +** This function "shifts" the beginning of the snippet forward in the +** document so that there are approximately the same number of +** non-highlighted terms to the right of the final highlighted term as there +** are to the left of the first highlighted term. For example, to this: +** +** ....X.....X.... +** +** This is done as part of extracting the snippet text, not when selecting +** the snippet. Snippet selection is done based on doclists only, so there +** is no way for fts3BestSnippet() to know whether or not the document +** actually contains terms that follow the final highlighted term. +*/ +static int fts3SnippetShift( + Fts3Table *pTab, /* FTS3 table snippet comes from */ + int iLangid, /* Language id to use in tokenizing */ + int nSnippet, /* Number of tokens desired for snippet */ + const char *zDoc, /* Document text to extract snippet from */ + int nDoc, /* Size of buffer zDoc in bytes */ + int *piPos, /* IN/OUT: First token of snippet */ + u64 *pHlmask /* IN/OUT: Mask of tokens to highlight */ +){ + u64 hlmask = *pHlmask; /* Local copy of initial highlight-mask */ + + if( hlmask ){ + int nLeft; /* Tokens to the left of first highlight */ + int nRight; /* Tokens to the right of last highlight */ + int nDesired; /* Ideal number of tokens to shift forward */ + + for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); + for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); + nDesired = (nLeft-nRight)/2; + + /* Ideally, the start of the snippet should be pushed forward in the + ** document nDesired tokens. This block checks if there are actually + ** nDesired tokens to the right of the snippet. If so, *piPos and + ** *pHlMask are updated to shift the snippet nDesired tokens to the + ** right. Otherwise, the snippet is shifted by the number of tokens + ** available. + */ + if( nDesired>0 ){ + int nShift; /* Number of tokens to shift snippet by */ + int iCurrent = 0; /* Token counter */ + int rc; /* Return Code */ + sqlite3_tokenizer_module *pMod; + sqlite3_tokenizer_cursor *pC; + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + + /* Open a cursor on zDoc/nDoc. Check if there are (nSnippet+nDesired) + ** or more tokens in zDoc/nDoc. + */ + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, iLangid, zDoc, nDoc, &pC); + if( rc!=SQLITE_OK ){ + return rc; + } + while( rc==SQLITE_OK && iCurrent<(nSnippet+nDesired) ){ + const char *ZDUMMY; int DUMMY1 = 0, DUMMY2 = 0, DUMMY3 = 0; + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &DUMMY2, &DUMMY3, &iCurrent); + } + pMod->xClose(pC); + if( rc!=SQLITE_OK && rc!=SQLITE_DONE ){ return rc; } + + nShift = (rc==SQLITE_DONE)+iCurrent-nSnippet; + assert( nShift<=nDesired ); + if( nShift>0 ){ + *piPos += nShift; + *pHlmask = hlmask >> nShift; + } + } + } + return SQLITE_OK; +} + +/* +** Extract the snippet text for fragment pFragment from cursor pCsr and +** append it to string buffer pOut. +*/ +static int fts3SnippetText( + Fts3Cursor *pCsr, /* FTS3 Cursor */ + SnippetFragment *pFragment, /* Snippet to extract */ + int iFragment, /* Fragment number */ + int isLast, /* True for final fragment in snippet */ + int nSnippet, /* Number of tokens in extracted snippet */ + const char *zOpen, /* String inserted before highlighted term */ + const char *zClose, /* String inserted after highlighted term */ + const char *zEllipsis, /* String inserted between snippets */ + StrBuffer *pOut /* Write output here */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc; /* Return code */ + const char *zDoc; /* Document text to extract snippet from */ + int nDoc; /* Size of zDoc in bytes */ + int iCurrent = 0; /* Current token number of document */ + int iEnd = 0; /* Byte offset of end of current token */ + int isShiftDone = 0; /* True after snippet is shifted */ + int iPos = pFragment->iPos; /* First token of snippet */ + u64 hlmask = pFragment->hlmask; /* Highlight-mask for snippet */ + int iCol = pFragment->iCol+1; /* Query column to extract text from */ + sqlite3_tokenizer_module *pMod; /* Tokenizer module methods object */ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor open on zDoc/nDoc */ + + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol); + if( zDoc==0 ){ + if( sqlite3_column_type(pCsr->pStmt, iCol)!=SQLITE_NULL ){ + return SQLITE_NOMEM; + } + return SQLITE_OK; + } + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol); + + /* Open a token cursor on the document. */ + pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule; + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, zDoc,nDoc,&pC); + if( rc!=SQLITE_OK ){ + return rc; + } + + while( rc==SQLITE_OK ){ + const char *ZDUMMY; /* Dummy argument used with tokenizer */ + int DUMMY1 = -1; /* Dummy argument used with tokenizer */ + int iBegin = 0; /* Offset in zDoc of start of token */ + int iFin = 0; /* Offset in zDoc of end of token */ + int isHighlight = 0; /* True for highlighted terms */ + + /* Variable DUMMY1 is initialized to a negative value above. Elsewhere + ** in the FTS code the variable that the third argument to xNext points to + ** is initialized to zero before the first (*but not necessarily + ** subsequent*) call to xNext(). This is done for a particular application + ** that needs to know whether or not the tokenizer is being used for + ** snippet generation or for some other purpose. + ** + ** Extreme care is required when writing code to depend on this + ** initialization. It is not a documented part of the tokenizer interface. + ** If a tokenizer is used directly by any code outside of FTS, this + ** convention might not be respected. */ + rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &iBegin, &iFin, &iCurrent); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + /* Special case - the last token of the snippet is also the last token + ** of the column. Append any punctuation that occurred between the end + ** of the previous token and the end of the document to the output. + ** Then break out of the loop. */ + rc = fts3StringAppend(pOut, &zDoc[iEnd], -1); + } + break; + } + if( iCurrentiLangid, nSnippet, &zDoc[iBegin], n, &iPos, &hlmask + ); + isShiftDone = 1; + + /* Now that the shift has been done, check if the initial "..." are + ** required. They are required if (a) this is not the first fragment, + ** or (b) this fragment does not begin at position 0 of its column. + */ + if( rc==SQLITE_OK ){ + if( iPos>0 || iFragment>0 ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + }else if( iBegin ){ + rc = fts3StringAppend(pOut, zDoc, iBegin); + } + } + if( rc!=SQLITE_OK || iCurrent=(iPos+nSnippet) ){ + if( isLast ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + } + break; + } + + /* Set isHighlight to true if this term should be highlighted. */ + isHighlight = (hlmask & ((u64)1 << (iCurrent-iPos)))!=0; + + if( iCurrent>iPos ) rc = fts3StringAppend(pOut, &zDoc[iEnd], iBegin-iEnd); + if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zOpen, -1); + if( rc==SQLITE_OK ) rc = fts3StringAppend(pOut, &zDoc[iBegin], iFin-iBegin); + if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zClose, -1); + + iEnd = iFin; + } + + pMod->xClose(pC); + return rc; +} + + +/* +** This function is used to count the entries in a column-list (a +** delta-encoded list of term offsets within a single column of a single +** row). When this function is called, *ppCollist should point to the +** beginning of the first varint in the column-list (the varint that +** contains the position of the first matching term in the column data). +** Before returning, *ppCollist is set to point to the first byte after +** the last varint in the column-list (either the 0x00 signifying the end +** of the position-list, or the 0x01 that precedes the column number of +** the next column in the position-list). +** +** The number of elements in the column-list is returned. +*/ +static int fts3ColumnlistCount(char **ppCollist){ + char *pEnd = *ppCollist; + char c = 0; + int nEntry = 0; + + /* A column-list is terminated by either a 0x01 or 0x00. */ + while( 0xFE & (*pEnd | c) ){ + c = *pEnd++ & 0x80; + if( !c ) nEntry++; + } + + *ppCollist = pEnd; + return nEntry; +} + +/* +** This function gathers 'y' or 'b' data for a single phrase. +*/ +static int fts3ExprLHits( + Fts3Expr *pExpr, /* Phrase expression node */ + MatchInfo *p /* Matchinfo context */ +){ + Fts3Table *pTab = (Fts3Table *)p->pCursor->base.pVtab; + int iStart; + Fts3Phrase *pPhrase = pExpr->pPhrase; + char *pIter = pPhrase->doclist.pList; + int iCol = 0; + + assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS ); + if( p->flag==FTS3_MATCHINFO_LHITS ){ + iStart = pExpr->iPhrase * p->nCol; + }else{ + iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); + } + + if( pIter ) while( 1 ){ + int nHit = fts3ColumnlistCount(&pIter); + if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){ + if( p->flag==FTS3_MATCHINFO_LHITS ){ + p->aMatchinfo[iStart + iCol] = (u32)nHit; + }else if( nHit ){ + p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F)); + } + } + assert( *pIter==0x00 || *pIter==0x01 ); + if( *pIter!=0x01 ) break; + pIter++; + pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; + } + return SQLITE_OK; +} + +/* +** Gather the results for matchinfo directives 'y' and 'b'. +*/ +static int fts3ExprLHitGather( + Fts3Expr *pExpr, + MatchInfo *p +){ + int rc = SQLITE_OK; + assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); + if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ + if( pExpr->pLeft ){ + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); + }else{ + rc = fts3ExprLHits(pExpr, p); + } + } + return rc; +} + +/* +** fts3ExprIterate() callback used to collect the "global" matchinfo stats +** for a single query. +** +** fts3ExprIterate() callback to load the 'global' elements of a +** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements +** of the matchinfo array that are constant for all rows returned by the +** current query. +** +** Argument pCtx is actually a pointer to a struct of type MatchInfo. This +** function populates Matchinfo.aMatchinfo[] as follows: +** +** for(iCol=0; iColpCursor, pExpr, &p->aMatchinfo[3*iPhrase*p->nCol] + ); +} + +/* +** fts3ExprIterate() callback used to collect the "local" part of the +** FTS3_MATCHINFO_HITS array. The local stats are those elements of the +** array that are different for each row returned by the query. +*/ +static int fts3ExprLocalHitsCb( + Fts3Expr *pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number */ + void *pCtx /* Pointer to MatchInfo structure */ +){ + int rc = SQLITE_OK; + MatchInfo *p = (MatchInfo *)pCtx; + int iStart = iPhrase * p->nCol * 3; + int i; + + for(i=0; inCol && rc==SQLITE_OK; i++){ + char *pCsr; + rc = sqlite3Fts3EvalPhrasePoslist(p->pCursor, pExpr, i, &pCsr); + if( pCsr ){ + p->aMatchinfo[iStart+i*3] = fts3ColumnlistCount(&pCsr); + }else{ + p->aMatchinfo[iStart+i*3] = 0; + } + } + + return rc; +} + +static int fts3MatchinfoCheck( + Fts3Table *pTab, + char cArg, + char **pzErr +){ + if( (cArg==FTS3_MATCHINFO_NPHRASE) + || (cArg==FTS3_MATCHINFO_NCOL) + || (cArg==FTS3_MATCHINFO_NDOC && pTab->bFts4) + || (cArg==FTS3_MATCHINFO_AVGLENGTH && pTab->bFts4) + || (cArg==FTS3_MATCHINFO_LENGTH && pTab->bHasDocsize) + || (cArg==FTS3_MATCHINFO_LCS) + || (cArg==FTS3_MATCHINFO_HITS) + || (cArg==FTS3_MATCHINFO_LHITS) + || (cArg==FTS3_MATCHINFO_LHITS_BM) + ){ + return SQLITE_OK; + } + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo request: %c", cArg); + return SQLITE_ERROR; +} + +static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ + size_t nVal; /* Number of integers output by cArg */ + + switch( cArg ){ + case FTS3_MATCHINFO_NDOC: + case FTS3_MATCHINFO_NPHRASE: + case FTS3_MATCHINFO_NCOL: + nVal = 1; + break; + + case FTS3_MATCHINFO_AVGLENGTH: + case FTS3_MATCHINFO_LENGTH: + case FTS3_MATCHINFO_LCS: + nVal = pInfo->nCol; + break; + + case FTS3_MATCHINFO_LHITS: + nVal = pInfo->nCol * pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_LHITS_BM: + nVal = pInfo->nPhrase * ((pInfo->nCol + 31) / 32); + break; + + default: + assert( cArg==FTS3_MATCHINFO_HITS ); + nVal = pInfo->nCol * pInfo->nPhrase * 3; + break; + } + + return nVal; +} + +static int fts3MatchinfoSelectDoctotal( + Fts3Table *pTab, + sqlite3_stmt **ppStmt, + sqlite3_int64 *pnDoc, + const char **paLen, + const char **ppEnd +){ + sqlite3_stmt *pStmt; + const char *a; + const char *pEnd; + sqlite3_int64 nDoc; + int n; + + + if( !*ppStmt ){ + int rc = sqlite3Fts3SelectDoctotal(pTab, ppStmt); + if( rc!=SQLITE_OK ) return rc; + } + pStmt = *ppStmt; + assert( sqlite3_data_count(pStmt)==1 ); + + n = sqlite3_column_bytes(pStmt, 0); + a = sqlite3_column_blob(pStmt, 0); + if( a==0 ){ + return FTS_CORRUPT_VTAB; + } + pEnd = a + n; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nDoc); + if( nDoc<=0 || a>pEnd ){ + return FTS_CORRUPT_VTAB; + } + *pnDoc = nDoc; + + if( paLen ) *paLen = a; + if( ppEnd ) *ppEnd = pEnd; + return SQLITE_OK; +} + +/* +** An instance of the following structure is used to store state while +** iterating through a multi-column position-list corresponding to the +** hits for a single phrase on a single row in order to calculate the +** values for a matchinfo() FTS3_MATCHINFO_LCS request. +*/ +typedef struct LcsIterator LcsIterator; +struct LcsIterator { + Fts3Expr *pExpr; /* Pointer to phrase expression */ + int iPosOffset; /* Tokens count up to end of this phrase */ + char *pRead; /* Cursor used to iterate through aDoclist */ + int iPos; /* Current position */ +}; + +/* +** If LcsIterator.iCol is set to the following value, the iterator has +** finished iterating through all offsets for all columns. +*/ +#define LCS_ITERATOR_FINISHED 0x7FFFFFFF; + +static int fts3MatchinfoLcsCb( + Fts3Expr *pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number (numbered from zero) */ + void *pCtx /* Pointer to MatchInfo structure */ +){ + LcsIterator *aIter = (LcsIterator *)pCtx; + aIter[iPhrase].pExpr = pExpr; + return SQLITE_OK; +} + +/* +** Advance the iterator passed as an argument to the next position. Return +** 1 if the iterator is at EOF or if it now points to the start of the +** position list for the next column. +*/ +static int fts3LcsIteratorAdvance(LcsIterator *pIter){ + char *pRead; + sqlite3_int64 iRead; + int rc = 0; + + if( NEVER(pIter==0) ) return 1; + pRead = pIter->pRead; + pRead += sqlite3Fts3GetVarint(pRead, &iRead); + if( iRead==0 || iRead==1 ){ + pRead = 0; + rc = 1; + }else{ + pIter->iPos += (int)(iRead-2); + } + + pIter->pRead = pRead; + return rc; +} + +/* +** This function implements the FTS3_MATCHINFO_LCS matchinfo() flag. +** +** If the call is successful, the longest-common-substring lengths for each +** column are written into the first nCol elements of the pInfo->aMatchinfo[] +** array before returning. SQLITE_OK is returned in this case. +** +** Otherwise, if an error occurs, an SQLite error code is returned and the +** data written to the first nCol elements of pInfo->aMatchinfo[] is +** undefined. +*/ +static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ + LcsIterator *aIter; + int i; + int iCol; + int nToken = 0; + int rc = SQLITE_OK; + + /* Allocate and populate the array of LcsIterator objects. The array + ** contains one element for each matchable phrase in the query. + **/ + aIter = sqlite3Fts3MallocZero(sizeof(LcsIterator) * pCsr->nPhrase); + if( !aIter ) return SQLITE_NOMEM; + (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); + + for(i=0; inPhrase; i++){ + LcsIterator *pIter = &aIter[i]; + nToken -= pIter->pExpr->pPhrase->nToken; + pIter->iPosOffset = nToken; + } + + for(iCol=0; iColnCol; iCol++){ + int nLcs = 0; /* LCS value for this column */ + int nLive = 0; /* Number of iterators in aIter not at EOF */ + + for(i=0; inPhrase; i++){ + LcsIterator *pIt = &aIter[i]; + rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; + if( pIt->pRead ){ + pIt->iPos = pIt->iPosOffset; + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } + nLive++; + } + } + + while( nLive>0 ){ + LcsIterator *pAdv = 0; /* The iterator to advance by one position */ + int nThisLcs = 0; /* LCS for the current iterator positions */ + + for(i=0; inPhrase; i++){ + LcsIterator *pIter = &aIter[i]; + if( pIter->pRead==0 ){ + /* This iterator is already at EOF for this column. */ + nThisLcs = 0; + }else{ + if( pAdv==0 || pIter->iPosiPos ){ + pAdv = pIter; + } + if( nThisLcs==0 || pIter->iPos==pIter[-1].iPos ){ + nThisLcs++; + }else{ + nThisLcs = 1; + } + if( nThisLcs>nLcs ) nLcs = nThisLcs; + } + } + if( fts3LcsIteratorAdvance(pAdv) ) nLive--; + } + + pInfo->aMatchinfo[iCol] = nLcs; + } + + matchinfo_lcs_out: + sqlite3_free(aIter); + return rc; +} + +/* +** Populate the buffer pInfo->aMatchinfo[] with an array of integers to +** be returned by the matchinfo() function. Argument zArg contains the +** format string passed as the second argument to matchinfo (or the +** default value "pcx" if no second argument was specified). The format +** string has already been validated and the pInfo->aMatchinfo[] array +** is guaranteed to be large enough for the output. +** +** If bGlobal is true, then populate all fields of the matchinfo() output. +** If it is false, then assume that those fields that do not change between +** rows (i.e. FTS3_MATCHINFO_NPHRASE, NCOL, NDOC, AVGLENGTH and part of HITS) +** have already been populated. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. If a value other than SQLITE_OK is returned, the state the +** pInfo->aMatchinfo[] buffer is left in is undefined. +*/ +static int fts3MatchinfoValues( + Fts3Cursor *pCsr, /* FTS3 cursor object */ + int bGlobal, /* True to grab the global stats */ + MatchInfo *pInfo, /* Matchinfo context object */ + const char *zArg /* Matchinfo format string */ +){ + int rc = SQLITE_OK; + int i; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + sqlite3_stmt *pSelect = 0; + + for(i=0; rc==SQLITE_OK && zArg[i]; i++){ + pInfo->flag = zArg[i]; + switch( zArg[i] ){ + case FTS3_MATCHINFO_NPHRASE: + if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_NCOL: + if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol; + break; + + case FTS3_MATCHINFO_NDOC: + if( bGlobal ){ + sqlite3_int64 nDoc = 0; + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0, 0); + pInfo->aMatchinfo[0] = (u32)nDoc; + } + break; + + case FTS3_MATCHINFO_AVGLENGTH: + if( bGlobal ){ + sqlite3_int64 nDoc; /* Number of rows in table */ + const char *a; /* Aggregate column length array */ + const char *pEnd; /* First byte past end of length array */ + + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, &a, &pEnd); + if( rc==SQLITE_OK ){ + int iCol; + for(iCol=0; iColnCol; iCol++){ + u32 iVal; + sqlite3_int64 nToken; + a += sqlite3Fts3GetVarint(a, &nToken); + if( a>pEnd ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } + iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); + pInfo->aMatchinfo[iCol] = iVal; + } + } + } + break; + + case FTS3_MATCHINFO_LENGTH: { + sqlite3_stmt *pSelectDocsize = 0; + rc = sqlite3Fts3SelectDocsize(pTab, pCsr->iPrevId, &pSelectDocsize); + if( rc==SQLITE_OK ){ + int iCol; + const char *a = sqlite3_column_blob(pSelectDocsize, 0); + const char *pEnd = a + sqlite3_column_bytes(pSelectDocsize, 0); + for(iCol=0; iColnCol; iCol++){ + sqlite3_int64 nToken; + a += sqlite3Fts3GetVarintBounded(a, pEnd, &nToken); + if( a>pEnd ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } + pInfo->aMatchinfo[iCol] = (u32)nToken; + } + } + sqlite3_reset(pSelectDocsize); + break; + } + + case FTS3_MATCHINFO_LCS: + rc = fts3ExprLoadDoclists(pCsr, 0, 0); + if( rc==SQLITE_OK ){ + rc = fts3MatchinfoLcs(pCsr, pInfo); + } + break; + + case FTS3_MATCHINFO_LHITS_BM: + case FTS3_MATCHINFO_LHITS: { + size_t nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); + memset(pInfo->aMatchinfo, 0, nZero); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); + break; + } + + default: { + Fts3Expr *pExpr; + assert( zArg[i]==FTS3_MATCHINFO_HITS ); + pExpr = pCsr->pExpr; + rc = fts3ExprLoadDoclists(pCsr, 0, 0); + if( rc!=SQLITE_OK ) break; + if( bGlobal ){ + if( pCsr->pDeferred ){ + rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc,0,0); + if( rc!=SQLITE_OK ) break; + } + rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo); + sqlite3Fts3EvalTestDeferred(pCsr, &rc); + if( rc!=SQLITE_OK ) break; + } + (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo); + break; + } + } + + pInfo->aMatchinfo += fts3MatchinfoSize(pInfo, zArg[i]); + } + + sqlite3_reset(pSelect); + return rc; +} + + +/* +** Populate pCsr->aMatchinfo[] with data for the current row. The +** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32). +*/ +static void fts3GetMatchinfo( + sqlite3_context *pCtx, /* Return results here */ + Fts3Cursor *pCsr, /* FTS3 Cursor object */ + const char *zArg /* Second argument to matchinfo() function */ +){ + MatchInfo sInfo; + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int bGlobal = 0; /* Collect 'global' stats as well as local */ + + u32 *aOut = 0; + void (*xDestroyOut)(void*) = 0; + + memset(&sInfo, 0, sizeof(MatchInfo)); + sInfo.pCursor = pCsr; + sInfo.nCol = pTab->nColumn; + + /* If there is cached matchinfo() data, but the format string for the + ** cache does not match the format string for this request, discard + ** the cached data. */ + if( pCsr->pMIBuffer && strcmp(pCsr->pMIBuffer->zMatchinfo, zArg) ){ + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + pCsr->pMIBuffer = 0; + } + + /* If Fts3Cursor.pMIBuffer is NULL, then this is the first time the + ** matchinfo function has been called for this query. In this case + ** allocate the array used to accumulate the matchinfo data and + ** initialize those elements that are constant for every row. + */ + if( pCsr->pMIBuffer==0 ){ + size_t nMatchinfo = 0; /* Number of u32 elements in match-info */ + int i; /* Used to iterate through zArg */ + + /* Determine the number of phrases in the query */ + pCsr->nPhrase = fts3ExprPhraseCount(pCsr->pExpr); + sInfo.nPhrase = pCsr->nPhrase; + + /* Determine the number of integers in the buffer returned by this call. */ + for(i=0; zArg[i]; i++){ + char *zErr = 0; + if( fts3MatchinfoCheck(pTab, zArg[i], &zErr) ){ + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + return; + } + nMatchinfo += fts3MatchinfoSize(&sInfo, zArg[i]); + } + + /* Allocate space for Fts3Cursor.aMatchinfo[] and Fts3Cursor.zMatchinfo. */ + pCsr->pMIBuffer = fts3MIBufferNew(nMatchinfo, zArg); + if( !pCsr->pMIBuffer ) rc = SQLITE_NOMEM; + + pCsr->isMatchinfoNeeded = 1; + bGlobal = 1; + } + + if( rc==SQLITE_OK ){ + xDestroyOut = fts3MIBufferAlloc(pCsr->pMIBuffer, &aOut); + if( xDestroyOut==0 ){ + rc = SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ + sInfo.aMatchinfo = aOut; + sInfo.nPhrase = pCsr->nPhrase; + rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg); + if( bGlobal ){ + fts3MIBufferSetGlobal(pCsr->pMIBuffer); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + if( xDestroyOut ) xDestroyOut(aOut); + }else{ + int n = pCsr->pMIBuffer->nElem * sizeof(u32); + sqlite3_result_blob(pCtx, aOut, n, xDestroyOut); + } +} + +/* +** Implementation of snippet() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Snippet( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr, /* Cursor object */ + const char *zStart, /* Snippet start text - "" */ + const char *zEnd, /* Snippet end text - "" */ + const char *zEllipsis, /* Snippet ellipsis text - "..." */ + int iCol, /* Extract snippet from this column */ + int nToken /* Approximate number of tokens in snippet */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + int rc = SQLITE_OK; + int i; + StrBuffer res = {0, 0, 0}; + + /* The returned text includes up to four fragments of text extracted from + ** the data in the current row. The first iteration of the for(...) loop + ** below attempts to locate a single fragment of text nToken tokens in + ** size that contains at least one instance of all phrases in the query + ** expression that appear in the current row. If such a fragment of text + ** cannot be found, the second iteration of the loop attempts to locate + ** a pair of fragments, and so on. + */ + int nSnippet = 0; /* Number of fragments in this snippet */ + SnippetFragment aSnippet[4]; /* Maximum of 4 fragments per snippet */ + int nFToken = -1; /* Number of tokens in each fragment */ + + if( !pCsr->pExpr ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + return; + } + + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + + for(nSnippet=1; 1; nSnippet++){ + + int iSnip; /* Loop counter 0..nSnippet-1 */ + u64 mCovered = 0; /* Bitmask of phrases covered by snippet */ + u64 mSeen = 0; /* Bitmask of phrases seen by BestSnippet() */ + + if( nToken>=0 ){ + nFToken = (nToken+nSnippet-1) / nSnippet; + }else{ + nFToken = -1 * nToken; + } + + for(iSnip=0; iSnipnColumn; iRead++){ + SnippetFragment sF = {0, 0, 0, 0}; + int iS = 0; + if( iCol>=0 && iRead!=iCol ) continue; + + /* Find the best snippet of nFToken tokens in column iRead. */ + rc = fts3BestSnippet(nFToken, pCsr, iRead, mCovered, &mSeen, &sF, &iS); + if( rc!=SQLITE_OK ){ + goto snippet_out; + } + if( iS>iBestScore ){ + *pFragment = sF; + iBestScore = iS; + } + } + + mCovered |= pFragment->covered; + } + + /* If all query phrases seen by fts3BestSnippet() are present in at least + ** one of the nSnippet snippet fragments, break out of the loop. + */ + assert( (mCovered&mSeen)==mCovered ); + if( mSeen==mCovered || nSnippet==SizeofArray(aSnippet) ) break; + } + + assert( nFToken>0 ); + + for(i=0; ipCsr, pExpr, p->iCol, &pList); + nTerm = pExpr->pPhrase->nToken; + if( pList ){ + fts3GetDeltaPosition(&pList, &iPos); + assert_fts3_nc( iPos>=0 ); + } + + for(iTerm=0; iTermaTerm[p->iTerm++]; + pT->iOff = nTerm-iTerm-1; + pT->pList = pList; + pT->iPos = iPos; + } + + return rc; +} + +/* +** Implementation of offsets() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Offsets( + sqlite3_context *pCtx, /* SQLite function call context */ + Fts3Cursor *pCsr /* Cursor object */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + sqlite3_tokenizer_module const *pMod = pTab->pTokenizer->pModule; + int rc; /* Return Code */ + int nToken; /* Number of tokens in query */ + int iCol; /* Column currently being processed */ + StrBuffer res = {0, 0, 0}; /* Result string */ + TermOffsetCtx sCtx; /* Context for fts3ExprTermOffsetInit() */ + + if( !pCsr->pExpr ){ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + return; + } + + memset(&sCtx, 0, sizeof(sCtx)); + assert( pCsr->isRequireSeek==0 ); + + /* Count the number of terms in the query */ + rc = fts3ExprLoadDoclists(pCsr, 0, &nToken); + if( rc!=SQLITE_OK ) goto offsets_out; + + /* Allocate the array of TermOffset iterators. */ + sCtx.aTerm = (TermOffset *)sqlite3Fts3MallocZero(sizeof(TermOffset)*nToken); + if( 0==sCtx.aTerm ){ + rc = SQLITE_NOMEM; + goto offsets_out; + } + sCtx.iDocid = pCsr->iPrevId; + sCtx.pCsr = pCsr; + + /* Loop through the table columns, appending offset information to + ** string-buffer res for each column. + */ + for(iCol=0; iColnColumn; iCol++){ + sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor */ + const char *ZDUMMY; /* Dummy argument used with xNext() */ + int NDUMMY = 0; /* Dummy argument used with xNext() */ + int iStart = 0; + int iEnd = 0; + int iCurrent = 0; + const char *zDoc; + int nDoc; + + /* Initialize the contents of sCtx.aTerm[] for column iCol. This + ** operation may fail if the database contains corrupt records. + */ + sCtx.iCol = iCol; + sCtx.iTerm = 0; + rc = fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx); + if( rc!=SQLITE_OK ) goto offsets_out; + + /* Retreive the text stored in column iCol. If an SQL NULL is stored + ** in column iCol, jump immediately to the next iteration of the loop. + ** If an OOM occurs while retrieving the data (this can happen if SQLite + ** needs to transform the data from utf-16 to utf-8), return SQLITE_NOMEM + ** to the caller. + */ + zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol+1); + nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol+1); + if( zDoc==0 ){ + if( sqlite3_column_type(pCsr->pStmt, iCol+1)==SQLITE_NULL ){ + continue; + } + rc = SQLITE_NOMEM; + goto offsets_out; + } + + /* Initialize a tokenizer iterator to iterate through column iCol. */ + rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, + zDoc, nDoc, &pC + ); + if( rc!=SQLITE_OK ) goto offsets_out; + + rc = pMod->xNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); + while( rc==SQLITE_OK ){ + int i; /* Used to loop through terms */ + int iMinPos = 0x7FFFFFFF; /* Position of next token */ + TermOffset *pTerm = 0; /* TermOffset associated with next token */ + + for(i=0; ipList && (pT->iPos-pT->iOff)iPos-pT->iOff; + pTerm = pT; + } + } + + if( !pTerm ){ + /* All offsets for this column have been gathered. */ + rc = SQLITE_DONE; + }else{ + assert_fts3_nc( iCurrent<=iMinPos ); + if( 0==(0xFE&*pTerm->pList) ){ + pTerm->pList = 0; + }else{ + fts3GetDeltaPosition(&pTerm->pList, &pTerm->iPos); + } + while( rc==SQLITE_OK && iCurrentxNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); + } + if( rc==SQLITE_OK ){ + char aBuffer[64]; + sqlite3_snprintf(sizeof(aBuffer), aBuffer, + "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart + ); + rc = fts3StringAppend(&res, aBuffer, -1); + }else if( rc==SQLITE_DONE && pTab->zContentTbl==0 ){ + rc = FTS_CORRUPT_VTAB; + } + } + } + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + } + + pMod->xClose(pC); + if( rc!=SQLITE_OK ) goto offsets_out; + } + + offsets_out: + sqlite3_free(sCtx.aTerm); + assert( rc!=SQLITE_DONE ); + sqlite3Fts3SegmentsClose(pTab); + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + sqlite3_free(res.z); + }else{ + sqlite3_result_text(pCtx, res.z, res.n-1, sqlite3_free); + } + return; +} + +/* +** Implementation of matchinfo() function. +*/ +SQLITE_PRIVATE void sqlite3Fts3Matchinfo( + sqlite3_context *pContext, /* Function call context */ + Fts3Cursor *pCsr, /* FTS3 table cursor */ + const char *zArg /* Second arg to matchinfo() function */ +){ + Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; + const char *zFormat; + + if( zArg ){ + zFormat = zArg; + }else{ + zFormat = FTS3_MATCHINFO_DEFAULT; + } + + if( !pCsr->pExpr ){ + sqlite3_result_blob(pContext, "", 0, SQLITE_STATIC); + return; + }else{ + /* Retrieve matchinfo() data. */ + fts3GetMatchinfo(pContext, pCsr, zFormat); + sqlite3Fts3SegmentsClose(pTab); + } +} + +#endif + +/************** End of fts3_snippet.c ****************************************/ +/************** Begin file fts3_unicode.c ************************************/ +/* +** 2012 May 24 +** +** 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. +** +****************************************************************************** +** +** Implementation of the "unicode" full-text-search tokenizer. +*/ + +#ifndef SQLITE_DISABLE_FTS3_UNICODE + +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) + +/* #include */ +/* #include */ +/* #include */ +/* #include */ + +/* #include "fts3_tokenizer.h" */ + +/* +** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied +** from the sqlite3 source file utf.c. If this file is compiled as part +** of the amalgamation, they are not required. +*/ +#ifndef SQLITE_AMALGAMATION + +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (u8)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (u8)(c & 0x3F); \ + } \ +} + +#endif /* ifndef SQLITE_AMALGAMATION */ + +typedef struct unicode_tokenizer unicode_tokenizer; +typedef struct unicode_cursor unicode_cursor; + +struct unicode_tokenizer { + sqlite3_tokenizer base; + int eRemoveDiacritic; + int nException; + int *aiException; +}; + +struct unicode_cursor { + sqlite3_tokenizer_cursor base; + const unsigned char *aInput; /* Input text being tokenized */ + int nInput; /* Size of aInput[] in bytes */ + int iOff; /* Current offset within aInput[] */ + int iToken; /* Index of next token to be returned */ + char *zToken; /* storage for current token */ + int nAlloc; /* space allocated at zToken */ +}; + + +/* +** Destroy a tokenizer allocated by unicodeCreate(). +*/ +static int unicodeDestroy(sqlite3_tokenizer *pTokenizer){ + if( pTokenizer ){ + unicode_tokenizer *p = (unicode_tokenizer *)pTokenizer; + sqlite3_free(p->aiException); + sqlite3_free(p); + } + return SQLITE_OK; +} + +/* +** As part of a tokenchars= or separators= option, the CREATE VIRTUAL TABLE +** statement has specified that the tokenizer for this table shall consider +** all characters in string zIn/nIn to be separators (if bAlnum==0) or +** token characters (if bAlnum==1). +** +** For each codepoint in the zIn/nIn string, this function checks if the +** sqlite3FtsUnicodeIsalnum() function already returns the desired result. +** If so, no action is taken. Otherwise, the codepoint is added to the +** unicode_tokenizer.aiException[] array. For the purposes of tokenization, +** the return value of sqlite3FtsUnicodeIsalnum() is inverted for all +** codepoints in the aiException[] array. +** +** If a standalone diacritic mark (one that sqlite3FtsUnicodeIsdiacritic() +** identifies as a diacritic) occurs in the zIn/nIn string it is ignored. +** It is not possible to change the behavior of the tokenizer with respect +** to these codepoints. +*/ +static int unicodeAddExceptions( + unicode_tokenizer *p, /* Tokenizer to add exceptions to */ + int bAlnum, /* Replace Isalnum() return value with this */ + const char *zIn, /* Array of characters to make exceptions */ + int nIn /* Length of z in bytes */ +){ + const unsigned char *z = (const unsigned char *)zIn; + const unsigned char *zTerm = &z[nIn]; + unsigned int iCode; + int nEntry = 0; + + assert( bAlnum==0 || bAlnum==1 ); + + while( zaiException,(p->nException+nEntry)*sizeof(int)); + if( aNew==0 ) return SQLITE_NOMEM; + nNew = p->nException; + + z = (const unsigned char *)zIn; + while( zi; j--) aNew[j] = aNew[j-1]; + aNew[i] = (int)iCode; + nNew++; + } + } + p->aiException = aNew; + p->nException = nNew; + } + + return SQLITE_OK; +} + +/* +** Return true if the p->aiException[] array contains the value iCode. +*/ +static int unicodeIsException(unicode_tokenizer *p, int iCode){ + if( p->nException>0 ){ + int *a = p->aiException; + int iLo = 0; + int iHi = p->nException-1; + + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( iCode==a[iTest] ){ + return 1; + }else if( iCode>a[iTest] ){ + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + } + + return 0; +} + +/* +** Return true if, for the purposes of tokenization, codepoint iCode is +** considered a token character (not a separator). +*/ +static int unicodeIsAlnum(unicode_tokenizer *p, int iCode){ + assert( (sqlite3FtsUnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 ); + return sqlite3FtsUnicodeIsalnum(iCode) ^ unicodeIsException(p, iCode); +} + +/* +** Create a new tokenizer instance. +*/ +static int unicodeCreate( + int nArg, /* Size of array argv[] */ + const char * const *azArg, /* Tokenizer creation arguments */ + sqlite3_tokenizer **pp /* OUT: New tokenizer handle */ +){ + unicode_tokenizer *pNew; /* New tokenizer object */ + int i; + int rc = SQLITE_OK; + + pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); + if( pNew==NULL ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(unicode_tokenizer)); + pNew->eRemoveDiacritic = 1; + + for(i=0; rc==SQLITE_OK && ieRemoveDiacritic = 1; + } + else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ + pNew->eRemoveDiacritic = 0; + } + else if( n==19 && memcmp("remove_diacritics=2", z, 19)==0 ){ + pNew->eRemoveDiacritic = 2; + } + else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ + rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); + } + else if( n>=11 && memcmp("separators=", z, 11)==0 ){ + rc = unicodeAddExceptions(pNew, 0, &z[11], n-11); + } + else{ + /* Unrecognized argument */ + rc = SQLITE_ERROR; + } + } + + if( rc!=SQLITE_OK ){ + unicodeDestroy((sqlite3_tokenizer *)pNew); + pNew = 0; + } + *pp = (sqlite3_tokenizer *)pNew; + return rc; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int unicodeOpen( + sqlite3_tokenizer *p, /* The tokenizer */ + const char *aInput, /* Input string */ + int nInput, /* Size of string aInput in bytes */ + sqlite3_tokenizer_cursor **pp /* OUT: New cursor object */ +){ + unicode_cursor *pCsr; + + pCsr = (unicode_cursor *)sqlite3_malloc(sizeof(unicode_cursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(unicode_cursor)); + + pCsr->aInput = (const unsigned char *)aInput; + if( aInput==0 ){ + pCsr->nInput = 0; + pCsr->aInput = (const unsigned char*)""; + }else if( nInput<0 ){ + pCsr->nInput = (int)strlen(aInput); + }else{ + pCsr->nInput = nInput; + } + + *pp = &pCsr->base; + UNUSED_PARAMETER(p); + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to +** simpleOpen() above. +*/ +static int unicodeClose(sqlite3_tokenizer_cursor *pCursor){ + unicode_cursor *pCsr = (unicode_cursor *) pCursor; + sqlite3_free(pCsr->zToken); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. The cursor must +** have been opened by a prior call to simpleOpen(). +*/ +static int unicodeNext( + sqlite3_tokenizer_cursor *pC, /* Cursor returned by simpleOpen */ + const char **paToken, /* OUT: Token text */ + int *pnToken, /* OUT: Number of bytes at *paToken */ + int *piStart, /* OUT: Starting offset of token */ + int *piEnd, /* OUT: Ending offset of token */ + int *piPos /* OUT: Position integer of token */ +){ + unicode_cursor *pCsr = (unicode_cursor *)pC; + unicode_tokenizer *p = ((unicode_tokenizer *)pCsr->base.pTokenizer); + unsigned int iCode = 0; + char *zOut; + const unsigned char *z = &pCsr->aInput[pCsr->iOff]; + const unsigned char *zStart = z; + const unsigned char *zEnd; + const unsigned char *zTerm = &pCsr->aInput[pCsr->nInput]; + + /* Scan past any delimiter characters before the start of the next token. + ** Return SQLITE_DONE early if this takes us all the way to the end of + ** the input. */ + while( z=zTerm ) return SQLITE_DONE; + + zOut = pCsr->zToken; + do { + int iOut; + + /* Grow the output buffer if required. */ + if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); + if( !zNew ) return SQLITE_NOMEM; + zOut = &zNew[zOut - pCsr->zToken]; + pCsr->zToken = zNew; + pCsr->nAlloc += 64; + } + + /* Write the folded case of the last character read to the output */ + zEnd = z; + iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); + if( iOut ){ + WRITE_UTF8(zOut, iOut); + } + + /* If the cursor is not at EOF, read the next character */ + if( z>=zTerm ) break; + READ_UTF8(z, zTerm, iCode); + }while( unicodeIsAlnum(p, (int)iCode) + || sqlite3FtsUnicodeIsdiacritic((int)iCode) + ); + + /* Set the output variables and return. */ + pCsr->iOff = (int)(z - pCsr->aInput); + *paToken = pCsr->zToken; + *pnToken = (int)(zOut - pCsr->zToken); + *piStart = (int)(zStart - pCsr->aInput); + *piEnd = (int)(zEnd - pCsr->aInput); + *piPos = pCsr->iToken++; + return SQLITE_OK; +} + +/* +** Set *ppModule to a pointer to the sqlite3_tokenizer_module +** structure for the unicode tokenizer. +*/ +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const **ppModule){ + static const sqlite3_tokenizer_module module = { + 0, + unicodeCreate, + unicodeDestroy, + unicodeOpen, + unicodeClose, + unicodeNext, + 0, + }; + *ppModule = &module; +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ +#endif /* ifndef SQLITE_DISABLE_FTS3_UNICODE */ + +/************** End of fts3_unicode.c ****************************************/ +/************** Begin file fts3_unicode2.c ***********************************/ +/* +** 2012-05-25 +** +** 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. +** +****************************************************************************** +*/ + +/* +** DO NOT EDIT THIS MACHINE GENERATED FILE. +*/ + +#ifndef SQLITE_DISABLE_FTS3_UNICODE +#if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) + +/* #include */ + +/* +** Return true if the argument corresponds to a unicode codepoint +** classified as either a letter or a number. Otherwise false. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ + /* Each unsigned integer in the following array corresponds to a contiguous + ** range of unicode codepoints that are not either letters or numbers (i.e. + ** codepoints for which this function should return 0). + ** + ** The most significant 22 bits in each 32-bit value contain the first + ** codepoint in the range. The least significant 10 bits are used to store + ** the size of the range (always at least 1). In other words, the value + ** ((C<<22) + N) represents a range of N codepoints starting with codepoint + ** C. It is not possible to represent a range larger than 1023 codepoints + ** using this format. + */ + static const unsigned int aEntry[] = { + 0x00000030, 0x0000E807, 0x00016C06, 0x0001EC2F, 0x0002AC07, + 0x0002D001, 0x0002D803, 0x0002EC01, 0x0002FC01, 0x00035C01, + 0x0003DC01, 0x000B0804, 0x000B480E, 0x000B9407, 0x000BB401, + 0x000BBC81, 0x000DD401, 0x000DF801, 0x000E1002, 0x000E1C01, + 0x000FD801, 0x00120808, 0x00156806, 0x00162402, 0x00163C01, + 0x00164437, 0x0017CC02, 0x00180005, 0x00181816, 0x00187802, + 0x00192C15, 0x0019A804, 0x0019C001, 0x001B5001, 0x001B580F, + 0x001B9C07, 0x001BF402, 0x001C000E, 0x001C3C01, 0x001C4401, + 0x001CC01B, 0x001E980B, 0x001FAC09, 0x001FD804, 0x00205804, + 0x00206C09, 0x00209403, 0x0020A405, 0x0020C00F, 0x00216403, + 0x00217801, 0x0023901B, 0x00240004, 0x0024E803, 0x0024F812, + 0x00254407, 0x00258804, 0x0025C001, 0x00260403, 0x0026F001, + 0x0026F807, 0x00271C02, 0x00272C03, 0x00275C01, 0x00278802, + 0x0027C802, 0x0027E802, 0x00280403, 0x0028F001, 0x0028F805, + 0x00291C02, 0x00292C03, 0x00294401, 0x0029C002, 0x0029D401, + 0x002A0403, 0x002AF001, 0x002AF808, 0x002B1C03, 0x002B2C03, + 0x002B8802, 0x002BC002, 0x002C0403, 0x002CF001, 0x002CF807, + 0x002D1C02, 0x002D2C03, 0x002D5802, 0x002D8802, 0x002DC001, + 0x002E0801, 0x002EF805, 0x002F1803, 0x002F2804, 0x002F5C01, + 0x002FCC08, 0x00300403, 0x0030F807, 0x00311803, 0x00312804, + 0x00315402, 0x00318802, 0x0031FC01, 0x00320802, 0x0032F001, + 0x0032F807, 0x00331803, 0x00332804, 0x00335402, 0x00338802, + 0x00340802, 0x0034F807, 0x00351803, 0x00352804, 0x00355C01, + 0x00358802, 0x0035E401, 0x00360802, 0x00372801, 0x00373C06, + 0x00375801, 0x00376008, 0x0037C803, 0x0038C401, 0x0038D007, + 0x0038FC01, 0x00391C09, 0x00396802, 0x003AC401, 0x003AD006, + 0x003AEC02, 0x003B2006, 0x003C041F, 0x003CD00C, 0x003DC417, + 0x003E340B, 0x003E6424, 0x003EF80F, 0x003F380D, 0x0040AC14, + 0x00412806, 0x00415804, 0x00417803, 0x00418803, 0x00419C07, + 0x0041C404, 0x0042080C, 0x00423C01, 0x00426806, 0x0043EC01, + 0x004D740C, 0x004E400A, 0x00500001, 0x0059B402, 0x005A0001, + 0x005A6C02, 0x005BAC03, 0x005C4803, 0x005CC805, 0x005D4802, + 0x005DC802, 0x005ED023, 0x005F6004, 0x005F7401, 0x0060000F, + 0x0062A401, 0x0064800C, 0x0064C00C, 0x00650001, 0x00651002, + 0x0066C011, 0x00672002, 0x00677822, 0x00685C05, 0x00687802, + 0x0069540A, 0x0069801D, 0x0069FC01, 0x006A8007, 0x006AA006, + 0x006C0005, 0x006CD011, 0x006D6823, 0x006E0003, 0x006E840D, + 0x006F980E, 0x006FF004, 0x00709014, 0x0070EC05, 0x0071F802, + 0x00730008, 0x00734019, 0x0073B401, 0x0073C803, 0x00770027, + 0x0077F004, 0x007EF401, 0x007EFC03, 0x007F3403, 0x007F7403, + 0x007FB403, 0x007FF402, 0x00800065, 0x0081A806, 0x0081E805, + 0x00822805, 0x0082801A, 0x00834021, 0x00840002, 0x00840C04, + 0x00842002, 0x00845001, 0x00845803, 0x00847806, 0x00849401, + 0x00849C01, 0x0084A401, 0x0084B801, 0x0084E802, 0x00850005, + 0x00852804, 0x00853C01, 0x00864264, 0x00900027, 0x0091000B, + 0x0092704E, 0x00940200, 0x009C0475, 0x009E53B9, 0x00AD400A, + 0x00B39406, 0x00B3BC03, 0x00B3E404, 0x00B3F802, 0x00B5C001, + 0x00B5FC01, 0x00B7804F, 0x00B8C00C, 0x00BA001A, 0x00BA6C59, + 0x00BC00D6, 0x00BFC00C, 0x00C00005, 0x00C02019, 0x00C0A807, + 0x00C0D802, 0x00C0F403, 0x00C26404, 0x00C28001, 0x00C3EC01, + 0x00C64002, 0x00C6580A, 0x00C70024, 0x00C8001F, 0x00C8A81E, + 0x00C94001, 0x00C98020, 0x00CA2827, 0x00CB003F, 0x00CC0100, + 0x01370040, 0x02924037, 0x0293F802, 0x02983403, 0x0299BC10, + 0x029A7C01, 0x029BC008, 0x029C0017, 0x029C8002, 0x029E2402, + 0x02A00801, 0x02A01801, 0x02A02C01, 0x02A08C09, 0x02A0D804, + 0x02A1D004, 0x02A20002, 0x02A2D011, 0x02A33802, 0x02A38012, + 0x02A3E003, 0x02A4980A, 0x02A51C0D, 0x02A57C01, 0x02A60004, + 0x02A6CC1B, 0x02A77802, 0x02A8A40E, 0x02A90C01, 0x02A93002, + 0x02A97004, 0x02A9DC03, 0x02A9EC01, 0x02AAC001, 0x02AAC803, + 0x02AADC02, 0x02AAF802, 0x02AB0401, 0x02AB7802, 0x02ABAC07, + 0x02ABD402, 0x02AF8C0B, 0x03600001, 0x036DFC02, 0x036FFC02, + 0x037FFC01, 0x03EC7801, 0x03ECA401, 0x03EEC810, 0x03F4F802, + 0x03F7F002, 0x03F8001A, 0x03F88007, 0x03F8C023, 0x03F95013, + 0x03F9A004, 0x03FBFC01, 0x03FC040F, 0x03FC6807, 0x03FCEC06, + 0x03FD6C0B, 0x03FF8007, 0x03FFA007, 0x03FFE405, 0x04040003, + 0x0404DC09, 0x0405E411, 0x0406400C, 0x0407402E, 0x040E7C01, + 0x040F4001, 0x04215C01, 0x04247C01, 0x0424FC01, 0x04280403, + 0x04281402, 0x04283004, 0x0428E003, 0x0428FC01, 0x04294009, + 0x0429FC01, 0x042CE407, 0x04400003, 0x0440E016, 0x04420003, + 0x0442C012, 0x04440003, 0x04449C0E, 0x04450004, 0x04460003, + 0x0446CC0E, 0x04471404, 0x045AAC0D, 0x0491C004, 0x05BD442E, + 0x05BE3C04, 0x074000F6, 0x07440027, 0x0744A4B5, 0x07480046, + 0x074C0057, 0x075B0401, 0x075B6C01, 0x075BEC01, 0x075C5401, + 0x075CD401, 0x075D3C01, 0x075DBC01, 0x075E2401, 0x075EA401, + 0x075F0C01, 0x07BBC002, 0x07C0002C, 0x07C0C064, 0x07C2800F, + 0x07C2C40E, 0x07C3040F, 0x07C3440F, 0x07C4401F, 0x07C4C03C, + 0x07C5C02B, 0x07C7981D, 0x07C8402B, 0x07C90009, 0x07C94002, + 0x07CC0021, 0x07CCC006, 0x07CCDC46, 0x07CE0014, 0x07CE8025, + 0x07CF1805, 0x07CF8011, 0x07D0003F, 0x07D10001, 0x07D108B6, + 0x07D3E404, 0x07D4003E, 0x07D50004, 0x07D54018, 0x07D7EC46, + 0x07D9140B, 0x07DA0046, 0x07DC0074, 0x38000401, 0x38008060, + 0x380400F0, + }; + static const unsigned int aAscii[4] = { + 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001, + }; + + if( (unsigned int)c<128 ){ + return ( (aAscii[c >> 5] & ((unsigned int)1 << (c & 0x001F)))==0 ); + }else if( (unsigned int)c<(1<<22) ){ + unsigned int key = (((unsigned int)c)<<10) | 0x000003FF; + int iRes = 0; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aEntry[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( aEntry[0]=aEntry[iRes] ); + return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF))); + } + return 1; +} + + +/* +** If the argument is a codepoint corresponding to a lowercase letter +** in the ASCII range with a diacritic added, return the codepoint +** of the ASCII letter only. For example, if passed 235 - "LATIN +** SMALL LETTER E WITH DIAERESIS" - return 65 ("LATIN SMALL LETTER +** E"). The resuls of passing a codepoint that corresponds to an +** uppercase letter are undefined. +*/ +static int remove_diacritic(int c, int bComplex){ + unsigned short aDia[] = { + 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, + 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, + 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, + 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, + }; +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', + }; + + unsigned int key = (((unsigned int)c)<<3) | 0x00000007; + int iRes = 0; + int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aDia[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( key>=aDia[iRes] ); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); +} + + +/* +** Return true if the argument interpreted as a unicode codepoint +** is a diacritical modifier character. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ + unsigned int mask0 = 0x08029FDF; + unsigned int mask1 = 0x000361F8; + if( c<768 || c>817 ) return 0; + return (c < 768+32) ? + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); +} + + +/* +** Interpret the argument as a unicode codepoint. If the codepoint +** is an upper case character that has a lower case equivalent, +** return the codepoint corresponding to the lower case version. +** Otherwise, return a copy of the argument. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ + /* Each entry in the following array defines a rule for folding a range + ** of codepoints to lower case. The rule applies to a range of nRange + ** codepoints starting at codepoint iCode. + ** + ** If the least significant bit in flags is clear, then the rule applies + ** to all nRange codepoints (i.e. all nRange codepoints are upper case and + ** need to be folded). Or, if it is set, then the rule only applies to + ** every second codepoint in the range, starting with codepoint C. + ** + ** The 7 most significant bits in flags are an index into the aiOff[] + ** array. If a specific codepoint C does require folding, then its lower + ** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF). + ** + ** The contents of this array are generated by parsing the CaseFolding.txt + ** file distributed as part of the "Unicode Character Database". See + ** http://www.unicode.org for details. + */ + static const struct TableEntry { + unsigned short iCode; + unsigned char flags; + unsigned char nRange; + } aEntry[] = { + {65, 14, 26}, {181, 64, 1}, {192, 14, 23}, + {216, 14, 7}, {256, 1, 48}, {306, 1, 6}, + {313, 1, 16}, {330, 1, 46}, {376, 116, 1}, + {377, 1, 6}, {383, 104, 1}, {385, 50, 1}, + {386, 1, 4}, {390, 44, 1}, {391, 0, 1}, + {393, 42, 2}, {395, 0, 1}, {398, 32, 1}, + {399, 38, 1}, {400, 40, 1}, {401, 0, 1}, + {403, 42, 1}, {404, 46, 1}, {406, 52, 1}, + {407, 48, 1}, {408, 0, 1}, {412, 52, 1}, + {413, 54, 1}, {415, 56, 1}, {416, 1, 6}, + {422, 60, 1}, {423, 0, 1}, {425, 60, 1}, + {428, 0, 1}, {430, 60, 1}, {431, 0, 1}, + {433, 58, 2}, {435, 1, 4}, {439, 62, 1}, + {440, 0, 1}, {444, 0, 1}, {452, 2, 1}, + {453, 0, 1}, {455, 2, 1}, {456, 0, 1}, + {458, 2, 1}, {459, 1, 18}, {478, 1, 18}, + {497, 2, 1}, {498, 1, 4}, {502, 122, 1}, + {503, 134, 1}, {504, 1, 40}, {544, 110, 1}, + {546, 1, 18}, {570, 70, 1}, {571, 0, 1}, + {573, 108, 1}, {574, 68, 1}, {577, 0, 1}, + {579, 106, 1}, {580, 28, 1}, {581, 30, 1}, + {582, 1, 10}, {837, 36, 1}, {880, 1, 4}, + {886, 0, 1}, {902, 18, 1}, {904, 16, 3}, + {908, 26, 1}, {910, 24, 2}, {913, 14, 17}, + {931, 14, 9}, {962, 0, 1}, {975, 4, 1}, + {976, 140, 1}, {977, 142, 1}, {981, 146, 1}, + {982, 144, 1}, {984, 1, 24}, {1008, 136, 1}, + {1009, 138, 1}, {1012, 130, 1}, {1013, 128, 1}, + {1015, 0, 1}, {1017, 152, 1}, {1018, 0, 1}, + {1021, 110, 3}, {1024, 34, 16}, {1040, 14, 32}, + {1120, 1, 34}, {1162, 1, 54}, {1216, 6, 1}, + {1217, 1, 14}, {1232, 1, 88}, {1329, 22, 38}, + {4256, 66, 38}, {4295, 66, 1}, {4301, 66, 1}, + {7680, 1, 150}, {7835, 132, 1}, {7838, 96, 1}, + {7840, 1, 96}, {7944, 150, 8}, {7960, 150, 6}, + {7976, 150, 8}, {7992, 150, 8}, {8008, 150, 6}, + {8025, 151, 8}, {8040, 150, 8}, {8072, 150, 8}, + {8088, 150, 8}, {8104, 150, 8}, {8120, 150, 2}, + {8122, 126, 2}, {8124, 148, 1}, {8126, 100, 1}, + {8136, 124, 4}, {8140, 148, 1}, {8152, 150, 2}, + {8154, 120, 2}, {8168, 150, 2}, {8170, 118, 2}, + {8172, 152, 1}, {8184, 112, 2}, {8186, 114, 2}, + {8188, 148, 1}, {8486, 98, 1}, {8490, 92, 1}, + {8491, 94, 1}, {8498, 12, 1}, {8544, 8, 16}, + {8579, 0, 1}, {9398, 10, 26}, {11264, 22, 47}, + {11360, 0, 1}, {11362, 88, 1}, {11363, 102, 1}, + {11364, 90, 1}, {11367, 1, 6}, {11373, 84, 1}, + {11374, 86, 1}, {11375, 80, 1}, {11376, 82, 1}, + {11378, 0, 1}, {11381, 0, 1}, {11390, 78, 2}, + {11392, 1, 100}, {11499, 1, 4}, {11506, 0, 1}, + {42560, 1, 46}, {42624, 1, 24}, {42786, 1, 14}, + {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, + {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, + {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, + {65313, 14, 26}, + }; + static const unsigned short aiOff[] = { + 1, 2, 8, 15, 16, 26, 28, 32, + 37, 38, 40, 48, 63, 64, 69, 71, + 79, 80, 116, 202, 203, 205, 206, 207, + 209, 210, 211, 213, 214, 217, 218, 219, + 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, + 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, + 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, + 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, + 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, + 65514, 65521, 65527, 65528, 65529, + }; + + int ret = c; + + assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 ); + + if( c<128 ){ + if( c>='A' && c<='Z' ) ret = c + ('a' - 'A'); + }else if( c<65536 ){ + const struct TableEntry *p; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + int iRes = -1; + + assert( c>aEntry[0].iCode ); + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + int cmp = (c - aEntry[iTest].iCode); + if( cmp>=0 ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + + assert( iRes>=0 && c>=aEntry[iRes].iCode ); + p = &aEntry[iRes]; + if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ + ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; + assert( ret>0 ); + } + + if( eRemoveDiacritic ){ + ret = remove_diacritic(ret, eRemoveDiacritic==2); + } + } + + else if( c>=66560 && c<66600 ){ + ret = c + 40; + } + + return ret; +} +#endif /* defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) */ +#endif /* !defined(SQLITE_DISABLE_FTS3_UNICODE) */ + +/************** End of fts3_unicode2.c ***************************************/ +/************** Begin file json.c ********************************************/ +/* +** 2015-08-12 +** +** 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 SQLite JSON functions. +** +** This file began as an extension in ext/misc/json1.c in 2015. That +** extension proved so useful that it has now been moved into the core. +** +** For the time being, all JSON is stored as pure text. (We might add +** a JSONB type in the future which stores a binary encoding of JSON in +** a BLOB, but there is no support for JSONB in the current implementation. +** This implementation parses JSON text at 250 MB/s, so it is hard to see +** how JSONB might improve on that.) +*/ +#ifndef SQLITE_OMIT_JSON +/* #include "sqliteInt.h" */ + +/* +** Growing our own isspace() routine this way is twice as fast as +** the library isspace() function, resulting in a 7% overall performance +** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). +*/ +static const char jsonIsSpace[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define fast_isspace(x) (jsonIsSpace[(unsigned char)x]) + +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST) +# define VVA(X) +#else +# define VVA(X) X +#endif + +/* Objects */ +typedef struct JsonString JsonString; +typedef struct JsonNode JsonNode; +typedef struct JsonParse JsonParse; + +/* An instance of this object represents a JSON string +** under construction. Really, this is a generic string accumulator +** that can be and is used to create strings other than JSON. +*/ +struct JsonString { + sqlite3_context *pCtx; /* Function context - put error messages here */ + char *zBuf; /* Append JSON content here */ + u64 nAlloc; /* Bytes of storage available in zBuf[] */ + u64 nUsed; /* Bytes of zBuf[] currently used */ + u8 bStatic; /* True if zBuf is static space */ + u8 bErr; /* True if an error has been encountered */ + char zSpace[100]; /* Initial static space */ +}; + +/* JSON type values +*/ +#define JSON_NULL 0 +#define JSON_TRUE 1 +#define JSON_FALSE 2 +#define JSON_INT 3 +#define JSON_REAL 4 +#define JSON_STRING 5 +#define JSON_ARRAY 6 +#define JSON_OBJECT 7 + +/* The "subtype" set for JSON values */ +#define JSON_SUBTYPE 74 /* Ascii for "J" */ + +/* +** Names of the various JSON types: +*/ +static const char * const jsonType[] = { + "null", "true", "false", "integer", "real", "text", "array", "object" +}; + +/* Bit values for the JsonNode.jnFlag field +*/ +#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */ +#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */ +#define JNODE_REMOVE 0x04 /* Do not output */ +#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */ +#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */ +#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */ +#define JNODE_LABEL 0x40 /* Is a label of an object */ + + +/* A single node of parsed JSON +*/ +struct JsonNode { + u8 eType; /* One of the JSON_ type values */ + u8 jnFlags; /* JNODE flags */ + u8 eU; /* Which union element to use */ + u32 n; /* Bytes of content, or number of sub-nodes */ + union { + const char *zJContent; /* 1: Content for INT, REAL, and STRING */ + u32 iAppend; /* 2: More terms for ARRAY and OBJECT */ + u32 iKey; /* 3: Key for ARRAY objects in json_tree() */ + u32 iReplace; /* 4: Replacement content for JNODE_REPLACE */ + JsonNode *pPatch; /* 5: Node chain of patch for JNODE_PATCH */ + } u; +}; + +/* A completely parsed JSON string +*/ +struct JsonParse { + u32 nNode; /* Number of slots of aNode[] used */ + u32 nAlloc; /* Number of slots of aNode[] allocated */ + JsonNode *aNode; /* Array of nodes containing the parse */ + const char *zJson; /* Original JSON string */ + u32 *aUp; /* Index of parent of each node */ + u8 oom; /* Set to true if out of memory */ + u8 nErr; /* Number of errors seen */ + u16 iDepth; /* Nesting depth */ + int nJson; /* Length of the zJson string in bytes */ + u32 iHold; /* Replace cache line with the lowest iHold value */ +}; + +/* +** Maximum nesting depth of JSON for this implementation. +** +** This limit is needed to avoid a stack overflow in the recursive +** descent parser. A depth of 2000 is far deeper than any sane JSON +** should go. +*/ +#define JSON_MAX_DEPTH 2000 + +/************************************************************************** +** Utility routines for dealing with JsonString objects +**************************************************************************/ + +/* Set the JsonString object to an empty string +*/ +static void jsonZero(JsonString *p){ + p->zBuf = p->zSpace; + p->nAlloc = sizeof(p->zSpace); + p->nUsed = 0; + p->bStatic = 1; +} + +/* Initialize the JsonString object +*/ +static void jsonInit(JsonString *p, sqlite3_context *pCtx){ + p->pCtx = pCtx; + p->bErr = 0; + jsonZero(p); +} + + +/* Free all allocated memory and reset the JsonString object back to its +** initial state. +*/ +static void jsonReset(JsonString *p){ + if( !p->bStatic ) sqlite3_free(p->zBuf); + jsonZero(p); +} + + +/* Report an out-of-memory (OOM) condition +*/ +static void jsonOom(JsonString *p){ + p->bErr = 1; + sqlite3_result_error_nomem(p->pCtx); + jsonReset(p); +} + +/* Enlarge pJson->zBuf so that it can hold at least N more bytes. +** Return zero on success. Return non-zero on an OOM error +*/ +static int jsonGrow(JsonString *p, u32 N){ + u64 nTotal = NnAlloc ? p->nAlloc*2 : p->nAlloc+N+10; + char *zNew; + if( p->bStatic ){ + if( p->bErr ) return 1; + zNew = sqlite3_malloc64(nTotal); + if( zNew==0 ){ + jsonOom(p); + return SQLITE_NOMEM; + } + memcpy(zNew, p->zBuf, (size_t)p->nUsed); + p->zBuf = zNew; + p->bStatic = 0; + }else{ + zNew = sqlite3_realloc64(p->zBuf, nTotal); + if( zNew==0 ){ + jsonOom(p); + return SQLITE_NOMEM; + } + p->zBuf = zNew; + } + p->nAlloc = nTotal; + return SQLITE_OK; +} + +/* Append N bytes from zIn onto the end of the JsonString string. +*/ +static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ + if( N==0 ) return; + if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; + memcpy(p->zBuf+p->nUsed, zIn, N); + p->nUsed += N; +} + +/* Append formatted text (not to exceed N bytes) to the JsonString. +*/ +static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){ + va_list ap; + if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return; + va_start(ap, zFormat); + sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap); + va_end(ap); + p->nUsed += (int)strlen(p->zBuf+p->nUsed); +} + +/* Append a single character +*/ +static void jsonAppendChar(JsonString *p, char c){ + if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return; + p->zBuf[p->nUsed++] = c; +} + +/* Append a comma separator to the output buffer, if the previous +** character is not '[' or '{'. +*/ +static void jsonAppendSeparator(JsonString *p){ + char c; + if( p->nUsed==0 ) return; + c = p->zBuf[p->nUsed-1]; + if( c!='[' && c!='{' ) jsonAppendChar(p, ','); +} + +/* Append the N-byte string in zIn to the end of the JsonString string +** under construction. Enclose the string in "..." and escape +** any double-quotes or backslash characters contained within the +** string. +*/ +static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ + u32 i; + if( zIn==0 || ((N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0) ) return; + p->zBuf[p->nUsed++] = '"'; + for(i=0; inUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return; + p->zBuf[p->nUsed++] = '\\'; + }else if( c<=0x1f ){ + static const char aSpecial[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + assert( sizeof(aSpecial)==32 ); + assert( aSpecial['\b']=='b' ); + assert( aSpecial['\f']=='f' ); + assert( aSpecial['\n']=='n' ); + assert( aSpecial['\r']=='r' ); + assert( aSpecial['\t']=='t' ); + if( aSpecial[c] ){ + c = aSpecial[c]; + goto json_simple_escape; + } + if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return; + p->zBuf[p->nUsed++] = '\\'; + p->zBuf[p->nUsed++] = 'u'; + p->zBuf[p->nUsed++] = '0'; + p->zBuf[p->nUsed++] = '0'; + p->zBuf[p->nUsed++] = '0' + (c>>4); + c = "0123456789abcdef"[c&0xf]; + } + p->zBuf[p->nUsed++] = c; + } + p->zBuf[p->nUsed++] = '"'; + assert( p->nUsednAlloc ); +} + +/* +** Append a function parameter value to the JSON string under +** construction. +*/ +static void jsonAppendValue( + JsonString *p, /* Append to this JSON string */ + sqlite3_value *pValue /* Value to append */ +){ + switch( sqlite3_value_type(pValue) ){ + case SQLITE_NULL: { + jsonAppendRaw(p, "null", 4); + break; + } + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + const char *z = (const char*)sqlite3_value_text(pValue); + u32 n = (u32)sqlite3_value_bytes(pValue); + jsonAppendRaw(p, z, n); + break; + } + case SQLITE_TEXT: { + const char *z = (const char*)sqlite3_value_text(pValue); + u32 n = (u32)sqlite3_value_bytes(pValue); + if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){ + jsonAppendRaw(p, z, n); + }else{ + jsonAppendString(p, z, n); + } + break; + } + default: { + if( p->bErr==0 ){ + sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1); + p->bErr = 2; + jsonReset(p); + } + break; + } + } +} + + +/* Make the JSON in p the result of the SQL function. +*/ +static void jsonResult(JsonString *p){ + if( p->bErr==0 ){ + sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, + p->bStatic ? SQLITE_TRANSIENT : sqlite3_free, + SQLITE_UTF8); + jsonZero(p); + } + assert( p->bStatic ); +} + +/************************************************************************** +** Utility routines for dealing with JsonNode and JsonParse objects +**************************************************************************/ + +/* +** Return the number of consecutive JsonNode slots need to represent +** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and +** OBJECT types, the number might be larger. +** +** Appended elements are not counted. The value returned is the number +** by which the JsonNode counter should increment in order to go to the +** next peer value. +*/ +static u32 jsonNodeSize(JsonNode *pNode){ + return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1; +} + +/* +** Reclaim all memory allocated by a JsonParse object. But do not +** delete the JsonParse object itself. +*/ +static void jsonParseReset(JsonParse *pParse){ + sqlite3_free(pParse->aNode); + pParse->aNode = 0; + pParse->nNode = 0; + pParse->nAlloc = 0; + sqlite3_free(pParse->aUp); + pParse->aUp = 0; +} + +/* +** Free a JsonParse object that was obtained from sqlite3_malloc(). +*/ +static void jsonParseFree(JsonParse *pParse){ + jsonParseReset(pParse); + sqlite3_free(pParse); +} + +/* +** Convert the JsonNode pNode into a pure JSON string and +** append to pOut. Subsubstructure is also included. Return +** the number of JsonNode objects that are encoded. +*/ +static void jsonRenderNode( + JsonNode *pNode, /* The node to render */ + JsonString *pOut, /* Write JSON here */ + sqlite3_value **aReplace /* Replacement values */ +){ + assert( pNode!=0 ); + if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){ + if( (pNode->jnFlags & JNODE_REPLACE)!=0 && ALWAYS(aReplace!=0) ){ + assert( pNode->eU==4 ); + jsonAppendValue(pOut, aReplace[pNode->u.iReplace]); + return; + } + assert( pNode->eU==5 ); + pNode = pNode->u.pPatch; + } + switch( pNode->eType ){ + default: { + assert( pNode->eType==JSON_NULL ); + jsonAppendRaw(pOut, "null", 4); + break; + } + case JSON_TRUE: { + jsonAppendRaw(pOut, "true", 4); + break; + } + case JSON_FALSE: { + jsonAppendRaw(pOut, "false", 5); + break; + } + case JSON_STRING: { + if( pNode->jnFlags & JNODE_RAW ){ + assert( pNode->eU==1 ); + jsonAppendString(pOut, pNode->u.zJContent, pNode->n); + break; + } + /* no break */ deliberate_fall_through + } + case JSON_REAL: + case JSON_INT: { + assert( pNode->eU==1 ); + jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n); + break; + } + case JSON_ARRAY: { + u32 j = 1; + jsonAppendChar(pOut, '['); + for(;;){ + while( j<=pNode->n ){ + if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){ + jsonAppendSeparator(pOut); + jsonRenderNode(&pNode[j], pOut, aReplace); + } + j += jsonNodeSize(&pNode[j]); + } + if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; + assert( pNode->eU==2 ); + pNode = &pNode[pNode->u.iAppend]; + j = 1; + } + jsonAppendChar(pOut, ']'); + break; + } + case JSON_OBJECT: { + u32 j = 1; + jsonAppendChar(pOut, '{'); + for(;;){ + while( j<=pNode->n ){ + if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){ + jsonAppendSeparator(pOut); + jsonRenderNode(&pNode[j], pOut, aReplace); + jsonAppendChar(pOut, ':'); + jsonRenderNode(&pNode[j+1], pOut, aReplace); + } + j += 1 + jsonNodeSize(&pNode[j+1]); + } + if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; + assert( pNode->eU==2 ); + pNode = &pNode[pNode->u.iAppend]; + j = 1; + } + jsonAppendChar(pOut, '}'); + break; + } + } +} + +/* +** Return a JsonNode and all its descendents as a JSON string. +*/ +static void jsonReturnJson( + JsonNode *pNode, /* Node to return */ + sqlite3_context *pCtx, /* Return value for this function */ + sqlite3_value **aReplace /* Array of replacement values */ +){ + JsonString s; + jsonInit(&s, pCtx); + jsonRenderNode(pNode, &s, aReplace); + jsonResult(&s); + sqlite3_result_subtype(pCtx, JSON_SUBTYPE); +} + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static u8 jsonHexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#else + h += 9*(1&(h>>6)); +#endif + return (u8)(h & 0xf); +} + +/* +** Convert a 4-byte hex string into an integer +*/ +static u32 jsonHexToInt4(const char *z){ + u32 v; + assert( sqlite3Isxdigit(z[0]) ); + assert( sqlite3Isxdigit(z[1]) ); + assert( sqlite3Isxdigit(z[2]) ); + assert( sqlite3Isxdigit(z[3]) ); + v = (jsonHexToInt(z[0])<<12) + + (jsonHexToInt(z[1])<<8) + + (jsonHexToInt(z[2])<<4) + + jsonHexToInt(z[3]); + return v; +} + +/* +** Make the JsonNode the return value of the function. +*/ +static void jsonReturn( + JsonNode *pNode, /* Node to return */ + sqlite3_context *pCtx, /* Return value for this function */ + sqlite3_value **aReplace /* Array of replacement values */ +){ + switch( pNode->eType ){ + default: { + assert( pNode->eType==JSON_NULL ); + sqlite3_result_null(pCtx); + break; + } + case JSON_TRUE: { + sqlite3_result_int(pCtx, 1); + break; + } + case JSON_FALSE: { + sqlite3_result_int(pCtx, 0); + break; + } + case JSON_INT: { + sqlite3_int64 i = 0; + const char *z; + assert( pNode->eU==1 ); + z = pNode->u.zJContent; + if( z[0]=='-' ){ z++; } + while( z[0]>='0' && z[0]<='9' ){ + unsigned v = *(z++) - '0'; + if( i>=LARGEST_INT64/10 ){ + if( i>LARGEST_INT64/10 ) goto int_as_real; + if( z[0]>='0' && z[0]<='9' ) goto int_as_real; + if( v==9 ) goto int_as_real; + if( v==8 ){ + if( pNode->u.zJContent[0]=='-' ){ + sqlite3_result_int64(pCtx, SMALLEST_INT64); + goto int_done; + }else{ + goto int_as_real; + } + } + } + i = i*10 + v; + } + if( pNode->u.zJContent[0]=='-' ){ i = -i; } + sqlite3_result_int64(pCtx, i); + int_done: + break; + int_as_real: ; /* no break */ deliberate_fall_through + } + case JSON_REAL: { + double r; +#ifdef SQLITE_AMALGAMATION + const char *z; + assert( pNode->eU==1 ); + z = pNode->u.zJContent; + sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); +#else + assert( pNode->eU==1 ); + r = strtod(pNode->u.zJContent, 0); +#endif + sqlite3_result_double(pCtx, r); + break; + } + case JSON_STRING: { +#if 0 /* Never happens because JNODE_RAW is only set by json_set(), + ** json_insert() and json_replace() and those routines do not + ** call jsonReturn() */ + if( pNode->jnFlags & JNODE_RAW ){ + assert( pNode->eU==1 ); + sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n, + SQLITE_TRANSIENT); + }else +#endif + assert( (pNode->jnFlags & JNODE_RAW)==0 ); + if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ + /* JSON formatted without any backslash-escapes */ + assert( pNode->eU==1 ); + sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2, + SQLITE_TRANSIENT); + }else{ + /* Translate JSON formatted string into raw text */ + u32 i; + u32 n = pNode->n; + const char *z; + char *zOut; + u32 j; + assert( pNode->eU==1 ); + z = pNode->u.zJContent; + zOut = sqlite3_malloc( n+1 ); + if( zOut==0 ){ + sqlite3_result_error_nomem(pCtx); + break; + } + for(i=1, j=0; i>6)); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + u32 vlo; + if( (v&0xfc00)==0xd800 + && i>18); + zOut[j++] = 0x80 | ((v>>12)&0x3f); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + zOut[j++] = 0xe0 | (v>>12); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + } + } + }else{ + if( c=='b' ){ + c = '\b'; + }else if( c=='f' ){ + c = '\f'; + }else if( c=='n' ){ + c = '\n'; + }else if( c=='r' ){ + c = '\r'; + }else if( c=='t' ){ + c = '\t'; + } + zOut[j++] = c; + } + } + } + zOut[j] = 0; + sqlite3_result_text(pCtx, zOut, j, sqlite3_free); + } + break; + } + case JSON_ARRAY: + case JSON_OBJECT: { + jsonReturnJson(pNode, pCtx, aReplace); + break; + } + } +} + +/* Forward reference */ +static int jsonParseAddNode(JsonParse*,u32,u32,const char*); + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define JSON_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define JSON_NOINLINE __declspec(noinline) +#else +# define JSON_NOINLINE +#endif + + +static JSON_NOINLINE int jsonParseAddNodeExpand( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + u32 nNew; + JsonNode *pNew; + assert( pParse->nNode>=pParse->nAlloc ); + if( pParse->oom ) return -1; + nNew = pParse->nAlloc*2 + 10; + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); + if( pNew==0 ){ + pParse->oom = 1; + return -1; + } + pParse->nAlloc = nNew; + pParse->aNode = pNew; + assert( pParse->nNodenAlloc ); + return jsonParseAddNode(pParse, eType, n, zContent); +} + +/* +** Create a new JsonNode instance based on the arguments and append that +** instance to the JsonParse. Return the index in pParse->aNode[] of the +** new node, or -1 if a memory allocation fails. +*/ +static int jsonParseAddNode( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + JsonNode *p; + if( pParse->aNode==0 || pParse->nNode>=pParse->nAlloc ){ + return jsonParseAddNodeExpand(pParse, eType, n, zContent); + } + p = &pParse->aNode[pParse->nNode]; + p->eType = (u8)eType; + p->jnFlags = 0; + VVA( p->eU = zContent ? 1 : 0 ); + p->n = n; + p->u.zJContent = zContent; + return pParse->nNode++; +} + +/* +** Return true if z[] begins with 4 (or more) hexadecimal digits +*/ +static int jsonIs4Hex(const char *z){ + int i; + for(i=0; i<4; i++) if( !sqlite3Isxdigit(z[i]) ) return 0; + return 1; +} + +/* +** Parse a single JSON value which begins at pParse->zJson[i]. Return the +** index of the first character past the end of the value parsed. +** +** Return negative for a syntax error. Special cases: return -2 if the +** first non-whitespace character is '}' and return -3 if the first +** non-whitespace character is ']'. +*/ +static int jsonParseValue(JsonParse *pParse, u32 i){ + char c; + u32 j; + int iThis; + int x; + JsonNode *pNode; + const char *z = pParse->zJson; + while( fast_isspace(z[i]) ){ i++; } + if( (c = z[i])=='{' ){ + /* Parse object */ + iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); + if( iThis<0 ) return -1; + for(j=i+1;;j++){ + while( fast_isspace(z[j]) ){ j++; } + if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; + x = jsonParseValue(pParse, j); + if( x<0 ){ + pParse->iDepth--; + if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; + return -1; + } + if( pParse->oom ) return -1; + pNode = &pParse->aNode[pParse->nNode-1]; + if( pNode->eType!=JSON_STRING ) return -1; + pNode->jnFlags |= JNODE_LABEL; + j = x; + while( fast_isspace(z[j]) ){ j++; } + if( z[j]!=':' ) return -1; + j++; + x = jsonParseValue(pParse, j); + pParse->iDepth--; + if( x<0 ) return -1; + j = x; + while( fast_isspace(z[j]) ){ j++; } + c = z[j]; + if( c==',' ) continue; + if( c!='}' ) return -1; + break; + } + pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + return j+1; + }else if( c=='[' ){ + /* Parse array */ + iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); + if( iThis<0 ) return -1; + memset(&pParse->aNode[iThis].u, 0, sizeof(pParse->aNode[iThis].u)); + for(j=i+1;;j++){ + while( fast_isspace(z[j]) ){ j++; } + if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; + x = jsonParseValue(pParse, j); + pParse->iDepth--; + if( x<0 ){ + if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; + return -1; + } + j = x; + while( fast_isspace(z[j]) ){ j++; } + c = z[j]; + if( c==',' ) continue; + if( c!=']' ) return -1; + break; + } + pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + return j+1; + }else if( c=='"' ){ + /* Parse string */ + u8 jnFlags = 0; + j = i+1; + for(;;){ + c = z[j]; + if( (c & ~0x1f)==0 ){ + /* Control characters are not allowed in strings */ + return -1; + } + if( c=='\\' ){ + c = z[++j]; + if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f' + || c=='n' || c=='r' || c=='t' + || (c=='u' && jsonIs4Hex(z+j+1)) ){ + jnFlags = JNODE_ESCAPE; + }else{ + return -1; + } + }else if( c=='"' ){ + break; + } + j++; + } + jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]); + if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags; + return j+1; + }else if( c=='n' + && strncmp(z+i,"null",4)==0 + && !sqlite3Isalnum(z[i+4]) ){ + jsonParseAddNode(pParse, JSON_NULL, 0, 0); + return i+4; + }else if( c=='t' + && strncmp(z+i,"true",4)==0 + && !sqlite3Isalnum(z[i+4]) ){ + jsonParseAddNode(pParse, JSON_TRUE, 0, 0); + return i+4; + }else if( c=='f' + && strncmp(z+i,"false",5)==0 + && !sqlite3Isalnum(z[i+5]) ){ + jsonParseAddNode(pParse, JSON_FALSE, 0, 0); + return i+5; + }else if( c=='-' || (c>='0' && c<='9') ){ + /* Parse number */ + u8 seenDP = 0; + u8 seenE = 0; + assert( '-' < '0' ); + if( c<='0' ){ + j = c=='-' ? i+1 : i; + if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1; + } + j = i+1; + for(;; j++){ + c = z[j]; + if( c>='0' && c<='9' ) continue; + if( c=='.' ){ + if( z[j-1]=='-' ) return -1; + if( seenDP ) return -1; + seenDP = 1; + continue; + } + if( c=='e' || c=='E' ){ + if( z[j-1]<'0' ) return -1; + if( seenE ) return -1; + seenDP = seenE = 1; + c = z[j+1]; + if( c=='+' || c=='-' ){ + j++; + c = z[j+1]; + } + if( c<'0' || c>'9' ) return -1; + continue; + } + break; + } + if( z[j-1]<'0' ) return -1; + jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT, + j - i, &z[i]); + return j; + }else if( c=='}' ){ + return -2; /* End of {...} */ + }else if( c==']' ){ + return -3; /* End of [...] */ + }else if( c==0 ){ + return 0; /* End of file */ + }else{ + return -1; /* Syntax error */ + } +} + +/* +** Parse a complete JSON string. Return 0 on success or non-zero if there +** are any errors. If an error occurs, free all memory associated with +** pParse. +** +** pParse is uninitialized when this routine is called. +*/ +static int jsonParse( + JsonParse *pParse, /* Initialize and fill this JsonParse object */ + sqlite3_context *pCtx, /* Report errors here */ + const char *zJson /* Input JSON text to be parsed */ +){ + int i; + memset(pParse, 0, sizeof(*pParse)); + if( zJson==0 ) return 1; + pParse->zJson = zJson; + i = jsonParseValue(pParse, 0); + if( pParse->oom ) i = -1; + if( i>0 ){ + assert( pParse->iDepth==0 ); + while( fast_isspace(zJson[i]) ) i++; + if( zJson[i] ) i = -1; + } + if( i<=0 ){ + if( pCtx!=0 ){ + if( pParse->oom ){ + sqlite3_result_error_nomem(pCtx); + }else{ + sqlite3_result_error(pCtx, "malformed JSON", -1); + } + } + jsonParseReset(pParse); + return 1; + } + return 0; +} + +/* Mark node i of pParse as being a child of iParent. Call recursively +** to fill in all the descendants of node i. +*/ +static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ + JsonNode *pNode = &pParse->aNode[i]; + u32 j; + pParse->aUp[i] = iParent; + switch( pNode->eType ){ + case JSON_ARRAY: { + for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){ + jsonParseFillInParentage(pParse, i+j, i); + } + break; + } + case JSON_OBJECT: { + for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){ + pParse->aUp[i+j] = i; + jsonParseFillInParentage(pParse, i+j+1, i); + } + break; + } + default: { + break; + } + } +} + +/* +** Compute the parentage of all nodes in a completed parse. +*/ +static int jsonParseFindParents(JsonParse *pParse){ + u32 *aUp; + assert( pParse->aUp==0 ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); + if( aUp==0 ){ + pParse->oom = 1; + return SQLITE_NOMEM; + } + jsonParseFillInParentage(pParse, 0, 0); + return SQLITE_OK; +} + +/* +** Magic number used for the JSON parse cache in sqlite3_get_auxdata() +*/ +#define JSON_CACHE_ID (-429938) /* First cache entry */ +#define JSON_CACHE_SZ 4 /* Max number of cache entries */ + +/* +** Obtain a complete parse of the JSON found in the first argument +** of the argv array. Use the sqlite3_get_auxdata() cache for this +** parse if it is available. If the cache is not available or if it +** is no longer valid, parse the JSON again and return the new parse, +** and also register the new parse so that it will be available for +** future sqlite3_get_auxdata() calls. +*/ +static JsonParse *jsonParseCached( + sqlite3_context *pCtx, + sqlite3_value **argv, + sqlite3_context *pErrCtx +){ + const char *zJson = (const char*)sqlite3_value_text(argv[0]); + int nJson = sqlite3_value_bytes(argv[0]); + JsonParse *p; + JsonParse *pMatch = 0; + int iKey; + int iMinKey = 0; + u32 iMinHold = 0xffffffff; + u32 iMaxHold = 0; + if( zJson==0 ) return 0; + for(iKey=0; iKeynJson==nJson + && memcmp(p->zJson,zJson,nJson)==0 + ){ + p->nErr = 0; + pMatch = p; + }else if( p->iHoldiHold; + iMinKey = iKey; + } + if( p->iHold>iMaxHold ){ + iMaxHold = p->iHold; + } + } + if( pMatch ){ + pMatch->nErr = 0; + pMatch->iHold = iMaxHold+1; + return pMatch; + } + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); + if( p==0 ){ + sqlite3_result_error_nomem(pCtx); + return 0; + } + memset(p, 0, sizeof(*p)); + p->zJson = (char*)&p[1]; + memcpy((char*)p->zJson, zJson, nJson+1); + if( jsonParse(p, pErrCtx, p->zJson) ){ + sqlite3_free(p); + return 0; + } + p->nJson = nJson; + p->iHold = iMaxHold+1; + sqlite3_set_auxdata(pCtx, JSON_CACHE_ID+iMinKey, p, + (void(*)(void*))jsonParseFree); + return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iMinKey); +} + +/* +** Compare the OBJECT label at pNode against zKey,nKey. Return true on +** a match. +*/ +static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){ + assert( pNode->eU==1 ); + if( pNode->jnFlags & JNODE_RAW ){ + if( pNode->n!=nKey ) return 0; + return strncmp(pNode->u.zJContent, zKey, nKey)==0; + }else{ + if( pNode->n!=nKey+2 ) return 0; + return strncmp(pNode->u.zJContent+1, zKey, nKey)==0; + } +} + +/* forward declaration */ +static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**); + +/* +** Search along zPath to find the node specified. Return a pointer +** to that node, or NULL if zPath is malformed or if there is no such +** node. +** +** If pApnd!=0, then try to append new nodes to complete zPath if it is +** possible to do so and if no existing node corresponds to zPath. If +** new nodes are appended *pApnd is set to 1. +*/ +static JsonNode *jsonLookupStep( + JsonParse *pParse, /* The JSON to search */ + u32 iRoot, /* Begin the search at this node */ + const char *zPath, /* The path to search */ + int *pApnd, /* Append nodes to complete path if not NULL */ + const char **pzErr /* Make *pzErr point to any syntax error in zPath */ +){ + u32 i, j, nKey; + const char *zKey; + JsonNode *pRoot = &pParse->aNode[iRoot]; + if( zPath[0]==0 ) return pRoot; + if( pRoot->jnFlags & JNODE_REPLACE ) return 0; + if( zPath[0]=='.' ){ + if( pRoot->eType!=JSON_OBJECT ) return 0; + zPath++; + if( zPath[0]=='"' ){ + zKey = zPath + 1; + for(i=1; zPath[i] && zPath[i]!='"'; i++){} + nKey = i-1; + if( zPath[i] ){ + i++; + }else{ + *pzErr = zPath; + return 0; + } + testcase( nKey==0 ); + }else{ + zKey = zPath; + for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} + nKey = i; + if( nKey==0 ){ + *pzErr = zPath; + return 0; + } + } + j = 1; + for(;;){ + while( j<=pRoot->n ){ + if( jsonLabelCompare(pRoot+j, zKey, nKey) ){ + return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr); + } + j++; + j += jsonNodeSize(&pRoot[j]); + } + if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; + assert( pRoot->eU==2 ); + iRoot += pRoot->u.iAppend; + pRoot = &pParse->aNode[iRoot]; + j = 1; + } + if( pApnd ){ + u32 iStart, iLabel; + JsonNode *pNode; + iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); + iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); + zPath += i; + pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); + if( pParse->oom ) return 0; + if( pNode ){ + pRoot = &pParse->aNode[iRoot]; + assert( pRoot->eU==0 ); + pRoot->u.iAppend = iStart - iRoot; + pRoot->jnFlags |= JNODE_APPEND; + VVA( pRoot->eU = 2 ); + pParse->aNode[iLabel].jnFlags |= JNODE_RAW; + } + return pNode; + } + }else if( zPath[0]=='[' ){ + i = 0; + j = 1; + while( sqlite3Isdigit(zPath[j]) ){ + i = i*10 + zPath[j] - '0'; + j++; + } + if( j<2 || zPath[j]!=']' ){ + if( zPath[1]=='#' ){ + JsonNode *pBase = pRoot; + int iBase = iRoot; + if( pRoot->eType!=JSON_ARRAY ) return 0; + for(;;){ + while( j<=pBase->n ){ + if( (pBase[j].jnFlags & JNODE_REMOVE)==0 ) i++; + j += jsonNodeSize(&pBase[j]); + } + if( (pBase->jnFlags & JNODE_APPEND)==0 ) break; + assert( pBase->eU==2 ); + iBase += pBase->u.iAppend; + pBase = &pParse->aNode[iBase]; + j = 1; + } + j = 2; + if( zPath[2]=='-' && sqlite3Isdigit(zPath[3]) ){ + unsigned int x = 0; + j = 3; + do{ + x = x*10 + zPath[j] - '0'; + j++; + }while( sqlite3Isdigit(zPath[j]) ); + if( x>i ) return 0; + i -= x; + } + if( zPath[j]!=']' ){ + *pzErr = zPath; + return 0; + } + }else{ + *pzErr = zPath; + return 0; + } + } + if( pRoot->eType!=JSON_ARRAY ) return 0; + zPath += j + 1; + j = 1; + for(;;){ + while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){ + if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--; + j += jsonNodeSize(&pRoot[j]); + } + if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; + assert( pRoot->eU==2 ); + iRoot += pRoot->u.iAppend; + pRoot = &pParse->aNode[iRoot]; + j = 1; + } + if( j<=pRoot->n ){ + return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr); + } + if( i==0 && pApnd ){ + u32 iStart; + JsonNode *pNode; + iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0); + pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); + if( pParse->oom ) return 0; + if( pNode ){ + pRoot = &pParse->aNode[iRoot]; + assert( pRoot->eU==0 ); + pRoot->u.iAppend = iStart - iRoot; + pRoot->jnFlags |= JNODE_APPEND; + VVA( pRoot->eU = 2 ); + } + return pNode; + } + }else{ + *pzErr = zPath; + } + return 0; +} + +/* +** Append content to pParse that will complete zPath. Return a pointer +** to the inserted node, or return NULL if the append fails. +*/ +static JsonNode *jsonLookupAppend( + JsonParse *pParse, /* Append content to the JSON parse */ + const char *zPath, /* Description of content to append */ + int *pApnd, /* Set this flag to 1 */ + const char **pzErr /* Make this point to any syntax error */ +){ + *pApnd = 1; + if( zPath[0]==0 ){ + jsonParseAddNode(pParse, JSON_NULL, 0, 0); + return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1]; + } + if( zPath[0]=='.' ){ + jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); + }else if( strncmp(zPath,"[0]",3)==0 ){ + jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); + }else{ + return 0; + } + if( pParse->oom ) return 0; + return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr); +} + +/* +** Return the text of a syntax error message on a JSON path. Space is +** obtained from sqlite3_malloc(). +*/ +static char *jsonPathSyntaxError(const char *zErr){ + return sqlite3_mprintf("JSON path error near '%q'", zErr); +} + +/* +** Do a node lookup using zPath. Return a pointer to the node on success. +** Return NULL if not found or if there is an error. +** +** On an error, write an error message into pCtx and increment the +** pParse->nErr counter. +** +** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if +** nodes are appended. +*/ +static JsonNode *jsonLookup( + JsonParse *pParse, /* The JSON to search */ + const char *zPath, /* The path to search */ + int *pApnd, /* Append nodes to complete path if not NULL */ + sqlite3_context *pCtx /* Report errors here, if not NULL */ +){ + const char *zErr = 0; + JsonNode *pNode = 0; + char *zMsg; + + if( zPath==0 ) return 0; + if( zPath[0]!='$' ){ + zErr = zPath; + goto lookup_err; + } + zPath++; + pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr); + if( zErr==0 ) return pNode; + +lookup_err: + pParse->nErr++; + assert( zErr!=0 && pCtx!=0 ); + zMsg = jsonPathSyntaxError(zErr); + if( zMsg ){ + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); + }else{ + sqlite3_result_error_nomem(pCtx); + } + return 0; +} + + +/* +** Report the wrong number of arguments for json_insert(), json_replace() +** or json_set(). +*/ +static void jsonWrongNumArgs( + sqlite3_context *pCtx, + const char *zFuncName +){ + char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments", + zFuncName); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); +} + +/* +** Mark all NULL entries in the Object passed in as JNODE_REMOVE. +*/ +static void jsonRemoveAllNulls(JsonNode *pNode){ + int i, n; + assert( pNode->eType==JSON_OBJECT ); + n = pNode->n; + for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){ + switch( pNode[i].eType ){ + case JSON_NULL: + pNode[i].jnFlags |= JNODE_REMOVE; + break; + case JSON_OBJECT: + jsonRemoveAllNulls(&pNode[i]); + break; + } + } +} + + +/**************************************************************************** +** SQL functions used for testing and debugging +****************************************************************************/ + +#ifdef SQLITE_DEBUG +/* +** The json_parse(JSON) function returns a string which describes +** a parse of the JSON provided. Or it returns NULL if JSON is not +** well-formed. +*/ +static void jsonParseFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString s; /* Output string - not real JSON */ + JsonParse x; /* The parse */ + u32 i; + + assert( argc==1 ); + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + jsonParseFindParents(&x); + jsonInit(&s, ctx); + for(i=0; inNode ); + if( argc==2 ){ + const char *zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(p, zPath, 0, ctx); + }else{ + pNode = p->aNode; + } + if( pNode==0 ){ + return; + } + if( pNode->eType==JSON_ARRAY ){ + assert( (pNode->jnFlags & JNODE_APPEND)==0 ); + for(i=1; i<=pNode->n; n++){ + i += jsonNodeSize(&pNode[i]); + } + } + sqlite3_result_int64(ctx, n); +} + +/* +** Bit values for the flags passed into jsonExtractFunc() or +** jsonSetFunc() via the user-data value. +*/ +#define JSON_JSON 0x01 /* Result is always JSON */ +#define JSON_SQL 0x02 /* Result is always SQL */ +#define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */ +#define JSON_ISSET 0x04 /* json_set(), not json_insert() */ + +/* +** json_extract(JSON, PATH, ...) +** "->"(JSON,PATH) +** "->>"(JSON,PATH) +** +** Return the element described by PATH. Return NULL if that PATH element +** is not found. +** +** If JSON_JSON is set or if more that one PATH argument is supplied then +** always return a JSON representation of the result. If JSON_SQL is set, +** then always return an SQL representation of the result. If neither flag +** is present and argc==2, then return JSON for objects and arrays and SQL +** for all other values. +** +** When multiple PATH arguments are supplied, the result is a JSON array +** containing the result of each PATH. +** +** Abbreviated JSON path expressions are allows if JSON_ABPATH, for +** compatibility with PG. +*/ +static void jsonExtractFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + JsonNode *pNode; + const char *zPath; + int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); + JsonString jx; + + if( argc<2 ) return; + p = jsonParseCached(ctx, argv, ctx); + if( p==0 ) return; + if( argc==2 ){ + /* With a single PATH argument */ + zPath = (const char*)sqlite3_value_text(argv[1]); + if( zPath==0 ) return; + if( flags & JSON_ABPATH ){ + if( zPath[0]!='$' ){ + /* The -> and ->> operators accept abbreviated PATH arguments. This + ** is mostly for compatibility with PostgreSQL, but also for + ** convenience. + ** + ** NUMBER ==> $[NUMBER] // PG compatible + ** LABEL ==> $.LABEL // PG compatible + ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience + */ + jsonInit(&jx, ctx); + if( sqlite3Isdigit(zPath[0]) ){ + jsonAppendRaw(&jx, "$[", 2); + jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); + jsonAppendRaw(&jx, "]", 2); + }else{ + jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='[')); + jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); + jsonAppendChar(&jx, 0); + } + pNode = jx.bErr ? 0 : jsonLookup(p, jx.zBuf, 0, ctx); + jsonReset(&jx); + }else{ + pNode = jsonLookup(p, zPath, 0, ctx); + } + if( pNode ){ + if( flags & JSON_JSON ){ + jsonReturnJson(pNode, ctx, 0); + }else{ + jsonReturn(pNode, ctx, 0); + sqlite3_result_subtype(ctx, 0); + } + } + }else{ + pNode = jsonLookup(p, zPath, 0, ctx); + if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0); + } + }else{ + /* Two or more PATH arguments results in a JSON array with each + ** element of the array being the value selected by one of the PATHs */ + int i; + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '['); + for(i=1; inErr ) break; + jsonAppendSeparator(&jx); + if( pNode ){ + jsonRenderNode(pNode, &jx, 0); + }else{ + jsonAppendRaw(&jx, "null", 4); + } + } + if( i==argc ){ + jsonAppendChar(&jx, ']'); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } + jsonReset(&jx); + } +} + +/* This is the RFC 7396 MergePatch algorithm. +*/ +static JsonNode *jsonMergePatch( + JsonParse *pParse, /* The JSON parser that contains the TARGET */ + u32 iTarget, /* Node of the TARGET in pParse */ + JsonNode *pPatch /* The PATCH */ +){ + u32 i, j; + u32 iRoot; + JsonNode *pTarget; + if( pPatch->eType!=JSON_OBJECT ){ + return pPatch; + } + assert( iTargetnNode ); + pTarget = &pParse->aNode[iTarget]; + assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); + if( pTarget->eType!=JSON_OBJECT ){ + jsonRemoveAllNulls(pPatch); + return pPatch; + } + iRoot = iTarget; + for(i=1; in; i += jsonNodeSize(&pPatch[i+1])+1){ + u32 nKey; + const char *zKey; + assert( pPatch[i].eType==JSON_STRING ); + assert( pPatch[i].jnFlags & JNODE_LABEL ); + assert( pPatch[i].eU==1 ); + nKey = pPatch[i].n; + zKey = pPatch[i].u.zJContent; + assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); + for(j=1; jn; j += jsonNodeSize(&pTarget[j+1])+1 ){ + assert( pTarget[j].eType==JSON_STRING ); + assert( pTarget[j].jnFlags & JNODE_LABEL ); + assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); + if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){ + if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break; + if( pPatch[i+1].eType==JSON_NULL ){ + pTarget[j+1].jnFlags |= JNODE_REMOVE; + }else{ + JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]); + if( pNew==0 ) return 0; + pTarget = &pParse->aNode[iTarget]; + if( pNew!=&pTarget[j+1] ){ + assert( pTarget[j+1].eU==0 + || pTarget[j+1].eU==1 + || pTarget[j+1].eU==2 ); + testcase( pTarget[j+1].eU==1 ); + testcase( pTarget[j+1].eU==2 ); + VVA( pTarget[j+1].eU = 5 ); + pTarget[j+1].u.pPatch = pNew; + pTarget[j+1].jnFlags |= JNODE_PATCH; + } + } + break; + } + } + if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){ + int iStart, iPatch; + iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); + jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); + iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0); + if( pParse->oom ) return 0; + jsonRemoveAllNulls(pPatch); + pTarget = &pParse->aNode[iTarget]; + assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 ); + testcase( pParse->aNode[iRoot].eU==2 ); + pParse->aNode[iRoot].jnFlags |= JNODE_APPEND; + VVA( pParse->aNode[iRoot].eU = 2 ); + pParse->aNode[iRoot].u.iAppend = iStart - iRoot; + iRoot = iStart; + assert( pParse->aNode[iPatch].eU==0 ); + VVA( pParse->aNode[iPatch].eU = 5 ); + pParse->aNode[iPatch].jnFlags |= JNODE_PATCH; + pParse->aNode[iPatch].u.pPatch = &pPatch[i+1]; + } + } + return pTarget; +} + +/* +** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON +** object that is the result of running the RFC 7396 MergePatch() algorithm +** on the two arguments. +*/ +static void jsonPatchFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The JSON that is being patched */ + JsonParse y; /* The patch */ + JsonNode *pResult; /* The result of the merge */ + + UNUSED_PARAMETER(argc); + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){ + jsonParseReset(&x); + return; + } + pResult = jsonMergePatch(&x, 0, y.aNode); + assert( pResult!=0 || x.oom ); + if( pResult ){ + jsonReturnJson(pResult, ctx, 0); + }else{ + sqlite3_result_error_nomem(ctx); + } + jsonParseReset(&x); + jsonParseReset(&y); +} + + +/* +** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON +** object that contains all name/value given in arguments. Or if any name +** is not a string or if any value is a BLOB, throw an error. +*/ +static void jsonObjectFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + int i; + JsonString jx; + const char *z; + u32 n; + + if( argc&1 ){ + sqlite3_result_error(ctx, "json_object() requires an even number " + "of arguments", -1); + return; + } + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '{'); + for(i=0; ijnFlags |= JNODE_REMOVE; + } + if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ + jsonReturnJson(x.aNode, ctx, 0); + } +remove_done: + jsonParseReset(&x); +} + +/* +** json_replace(JSON, PATH, VALUE, ...) +** +** Replace the value at PATH with VALUE. If PATH does not already exist, +** this routine is a no-op. If JSON or PATH is malformed, throw an error. +*/ +static void jsonReplaceFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + + if( argc<1 ) return; + if( (argc&1)==0 ) { + jsonWrongNumArgs(ctx, "replace"); + return; + } + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + pNode = jsonLookup(&x, zPath, 0, ctx); + if( x.nErr ) goto replace_err; + if( pNode ){ + assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 ); + testcase( pNode->eU!=0 && pNode->eU!=1 ); + pNode->jnFlags |= (u8)JNODE_REPLACE; + VVA( pNode->eU = 4 ); + pNode->u.iReplace = i + 1; + } + } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + assert( x.aNode[0].eU==4 ); + sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } +replace_err: + jsonParseReset(&x); +} + + +/* +** json_set(JSON, PATH, VALUE, ...) +** +** Set the value at PATH to VALUE. Create the PATH if it does not already +** exist. Overwrite existing values that do exist. +** If JSON or PATH is malformed, throw an error. +** +** json_insert(JSON, PATH, VALUE, ...) +** +** Create PATH and initialize it to VALUE. If PATH already exists, this +** routine is a no-op. If JSON or PATH is malformed, throw an error. +*/ +static void jsonSetFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + int bApnd; + int bIsSet = sqlite3_user_data(ctx)!=0; + + if( argc<1 ) return; + if( (argc&1)==0 ) { + jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert"); + return; + } + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + bApnd = 0; + pNode = jsonLookup(&x, zPath, &bApnd, ctx); + if( x.oom ){ + sqlite3_result_error_nomem(ctx); + goto jsonSetDone; + }else if( x.nErr ){ + goto jsonSetDone; + }else if( pNode && (bApnd || bIsSet) ){ + testcase( pNode->eU!=0 && pNode->eU!=1 ); + assert( pNode->eU!=3 && pNode->eU!=5 ); + VVA( pNode->eU = 4 ); + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->u.iReplace = i + 1; + } + } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + assert( x.aNode[0].eU==4 ); + sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } +jsonSetDone: + jsonParseReset(&x); +} + +/* +** json_type(JSON) +** json_type(JSON, PATH) +** +** Return the top-level "type" of a JSON string. json_type() raises an +** error if either the JSON or PATH inputs are not well-formed. +*/ +static void jsonTypeFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + const char *zPath; + JsonNode *pNode; + + p = jsonParseCached(ctx, argv, ctx); + if( p==0 ) return; + if( argc==2 ){ + zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(p, zPath, 0, ctx); + }else{ + pNode = p->aNode; + } + if( pNode ){ + sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); + } +} + +/* +** json_valid(JSON) +** +** Return 1 if JSON is a well-formed JSON string according to RFC-7159. +** Return 0 otherwise. +*/ +static void jsonValidFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + UNUSED_PARAMETER(argc); + p = jsonParseCached(ctx, argv, 0); + sqlite3_result_int(ctx, p!=0); +} + + +/**************************************************************************** +** Aggregate SQL function implementations +****************************************************************************/ +/* +** json_group_array(VALUE) +** +** Return a JSON array composed of all values in the aggregate. +*/ +static void jsonArrayStep( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString *pStr; + UNUSED_PARAMETER(argc); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); + if( pStr ){ + if( pStr->zBuf==0 ){ + jsonInit(pStr, ctx); + jsonAppendChar(pStr, '['); + }else if( pStr->nUsed>1 ){ + jsonAppendChar(pStr, ','); + } + pStr->pCtx = ctx; + jsonAppendValue(pStr, argv[0]); + } +} +static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){ + JsonString *pStr; + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); + if( pStr ){ + pStr->pCtx = ctx; + jsonAppendChar(pStr, ']'); + if( pStr->bErr ){ + if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); + assert( pStr->bStatic ); + }else if( isFinal ){ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic = 1; + }else{ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); + pStr->nUsed--; + } + }else{ + sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); + } + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} +static void jsonArrayValue(sqlite3_context *ctx){ + jsonArrayCompute(ctx, 0); +} +static void jsonArrayFinal(sqlite3_context *ctx){ + jsonArrayCompute(ctx, 1); +} + +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** This method works for both json_group_array() and json_group_object(). +** It works by removing the first element of the group by searching forward +** to the first comma (",") that is not within a string and deleting all +** text through that comma. +*/ +static void jsonGroupInverse( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + unsigned int i; + int inStr = 0; + int nNest = 0; + char *z; + char c; + JsonString *pStr; + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); +#ifdef NEVER + /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will + ** always have been called to initalize it */ + if( NEVER(!pStr) ) return; +#endif + z = pStr->zBuf; + for(i=1; inUsed && ((c = z[i])!=',' || inStr || nNest); i++){ + if( c=='"' ){ + inStr = !inStr; + }else if( c=='\\' ){ + i++; + }else if( !inStr ){ + if( c=='{' || c=='[' ) nNest++; + if( c=='}' || c==']' ) nNest--; + } + } + if( inUsed ){ + pStr->nUsed -= i; + memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1); + z[pStr->nUsed] = 0; + }else{ + pStr->nUsed = 1; + } +} +#else +# define jsonGroupInverse 0 +#endif + + +/* +** json_group_obj(NAME,VALUE) +** +** Return a JSON object composed of all names and values in the aggregate. +*/ +static void jsonObjectStep( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString *pStr; + const char *z; + u32 n; + UNUSED_PARAMETER(argc); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); + if( pStr ){ + if( pStr->zBuf==0 ){ + jsonInit(pStr, ctx); + jsonAppendChar(pStr, '{'); + }else if( pStr->nUsed>1 ){ + jsonAppendChar(pStr, ','); + } + pStr->pCtx = ctx; + z = (const char*)sqlite3_value_text(argv[0]); + n = (u32)sqlite3_value_bytes(argv[0]); + jsonAppendString(pStr, z, n); + jsonAppendChar(pStr, ':'); + jsonAppendValue(pStr, argv[1]); + } +} +static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){ + JsonString *pStr; + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); + if( pStr ){ + jsonAppendChar(pStr, '}'); + if( pStr->bErr ){ + if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); + assert( pStr->bStatic ); + }else if( isFinal ){ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic = 1; + }else{ + sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); + pStr->nUsed--; + } + }else{ + sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); + } + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} +static void jsonObjectValue(sqlite3_context *ctx){ + jsonObjectCompute(ctx, 0); +} +static void jsonObjectFinal(sqlite3_context *ctx){ + jsonObjectCompute(ctx, 1); +} + + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/**************************************************************************** +** The json_each virtual table +****************************************************************************/ +typedef struct JsonEachCursor JsonEachCursor; +struct JsonEachCursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + u32 iRowid; /* The rowid */ + u32 iBegin; /* The first node of the scan */ + u32 i; /* Index in sParse.aNode[] of current row */ + u32 iEnd; /* EOF when i equals or exceeds this value */ + u8 eType; /* Type of top-level element */ + u8 bRecursive; /* True for json_tree(). False for json_each() */ + char *zJson; /* Input JSON */ + char *zRoot; /* Path by which to filter zJson */ + JsonParse sParse; /* Parse of the input JSON */ +}; + +/* Constructor for the json_each virtual table */ +static int jsonEachConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + sqlite3_vtab *pNew; + int rc; + +/* Column numbers */ +#define JEACH_KEY 0 +#define JEACH_VALUE 1 +#define JEACH_TYPE 2 +#define JEACH_ATOM 3 +#define JEACH_ID 4 +#define JEACH_PARENT 5 +#define JEACH_FULLKEY 6 +#define JEACH_PATH 7 +/* The xBestIndex method assumes that the JSON and ROOT columns are +** the last two columns in the table. Should this ever changes, be +** sure to update the xBestIndex method. */ +#define JEACH_JSON 8 +#define JEACH_ROOT 9 + + UNUSED_PARAMETER(pzErr); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(pAux); + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," + "json HIDDEN,root HIDDEN)"); + if( rc==SQLITE_OK ){ + pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); + } + return rc; +} + +/* destructor for json_each virtual table */ +static int jsonEachDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* constructor for a JsonEachCursor object for json_each(). */ +static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + JsonEachCursor *pCur; + + UNUSED_PARAMETER(p); + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* constructor for a JsonEachCursor object for json_tree(). */ +static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + int rc = jsonEachOpenEach(p, ppCursor); + if( rc==SQLITE_OK ){ + JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor; + pCur->bRecursive = 1; + } + return rc; +} + +/* Reset a JsonEachCursor back to its original state. Free any memory +** held. */ +static void jsonEachCursorReset(JsonEachCursor *p){ + sqlite3_free(p->zJson); + sqlite3_free(p->zRoot); + jsonParseReset(&p->sParse); + p->iRowid = 0; + p->i = 0; + p->iEnd = 0; + p->eType = 0; + p->zJson = 0; + p->zRoot = 0; +} + +/* Destructor for a jsonEachCursor object */ +static int jsonEachClose(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + jsonEachCursorReset(p); + sqlite3_free(cur); + return SQLITE_OK; +} + +/* Return TRUE if the jsonEachCursor object has been advanced off the end +** of the JSON object */ +static int jsonEachEof(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + return p->i >= p->iEnd; +} + +/* Advance the cursor to the next element for json_tree() */ +static int jsonEachNext(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + if( p->bRecursive ){ + if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++; + p->i++; + p->iRowid++; + if( p->iiEnd ){ + u32 iUp = p->sParse.aUp[p->i]; + JsonNode *pUp = &p->sParse.aNode[iUp]; + p->eType = pUp->eType; + if( pUp->eType==JSON_ARRAY ){ + assert( pUp->eU==0 || pUp->eU==3 ); + testcase( pUp->eU==3 ); + VVA( pUp->eU = 3 ); + if( iUp==p->i-1 ){ + pUp->u.iKey = 0; + }else{ + pUp->u.iKey++; + } + } + } + }else{ + switch( p->eType ){ + case JSON_ARRAY: { + p->i += jsonNodeSize(&p->sParse.aNode[p->i]); + p->iRowid++; + break; + } + case JSON_OBJECT: { + p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]); + p->iRowid++; + break; + } + default: { + p->i = p->iEnd; + break; + } + } + } + return SQLITE_OK; +} + +/* Append an object label to the JSON Path being constructed +** in pStr. +*/ +static void jsonAppendObjectPathElement( + JsonString *pStr, + JsonNode *pNode +){ + int jj, nn; + const char *z; + assert( pNode->eType==JSON_STRING ); + assert( pNode->jnFlags & JNODE_LABEL ); + assert( pNode->eU==1 ); + z = pNode->u.zJContent; + nn = pNode->n; + assert( nn>=2 ); + assert( z[0]=='"' ); + assert( z[nn-1]=='"' ); + if( nn>2 && sqlite3Isalpha(z[1]) ){ + for(jj=2; jjsParse.aUp[i]; + jsonEachComputePath(p, pStr, iUp); + pNode = &p->sParse.aNode[i]; + pUp = &p->sParse.aNode[iUp]; + if( pUp->eType==JSON_ARRAY ){ + assert( pUp->eU==3 || (pUp->eU==0 && pUp->u.iKey==0) ); + testcase( pUp->eU==0 ); + jsonPrintf(30, pStr, "[%d]", pUp->u.iKey); + }else{ + assert( pUp->eType==JSON_OBJECT ); + if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--; + jsonAppendObjectPathElement(pStr, pNode); + } +} + +/* Return the value of a column */ +static int jsonEachColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + JsonEachCursor *p = (JsonEachCursor*)cur; + JsonNode *pThis = &p->sParse.aNode[p->i]; + switch( i ){ + case JEACH_KEY: { + if( p->i==0 ) break; + if( p->eType==JSON_OBJECT ){ + jsonReturn(pThis, ctx, 0); + }else if( p->eType==JSON_ARRAY ){ + u32 iKey; + if( p->bRecursive ){ + if( p->iRowid==0 ) break; + assert( p->sParse.aNode[p->sParse.aUp[p->i]].eU==3 ); + iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey; + }else{ + iKey = p->iRowid; + } + sqlite3_result_int64(ctx, (sqlite3_int64)iKey); + } + break; + } + case JEACH_VALUE: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + jsonReturn(pThis, ctx, 0); + break; + } + case JEACH_TYPE: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC); + break; + } + case JEACH_ATOM: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + if( pThis->eType>=JSON_ARRAY ) break; + jsonReturn(pThis, ctx, 0); + break; + } + case JEACH_ID: { + sqlite3_result_int64(ctx, + (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0)); + break; + } + case JEACH_PARENT: { + if( p->i>p->iBegin && p->bRecursive ){ + sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]); + } + break; + } + case JEACH_FULLKEY: { + JsonString x; + jsonInit(&x, ctx); + if( p->bRecursive ){ + jsonEachComputePath(p, &x, p->i); + }else{ + if( p->zRoot ){ + jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot)); + }else{ + jsonAppendChar(&x, '$'); + } + if( p->eType==JSON_ARRAY ){ + jsonPrintf(30, &x, "[%d]", p->iRowid); + }else if( p->eType==JSON_OBJECT ){ + jsonAppendObjectPathElement(&x, pThis); + } + } + jsonResult(&x); + break; + } + case JEACH_PATH: { + if( p->bRecursive ){ + JsonString x; + jsonInit(&x, ctx); + jsonEachComputePath(p, &x, p->sParse.aUp[p->i]); + jsonResult(&x); + break; + } + /* For json_each() path and root are the same so fall through + ** into the root case */ + /* no break */ deliberate_fall_through + } + default: { + const char *zRoot = p->zRoot; + if( zRoot==0 ) zRoot = "$"; + sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC); + break; + } + case JEACH_JSON: { + assert( i==JEACH_JSON ); + sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); + break; + } + } + return SQLITE_OK; +} + +/* Return the current rowid value */ +static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + JsonEachCursor *p = (JsonEachCursor*)cur; + *pRowid = p->iRowid; + return SQLITE_OK; +} + +/* The query strategy is to look for an equality constraint on the json +** column. Without such a constraint, the table cannot operate. idxNum is +** 1 if the constraint is found, 3 if the constraint and zRoot are found, +** and 0 otherwise. +*/ +static int jsonEachBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; /* Loop counter or computed array index */ + int aIdx[2]; /* Index of constraints for JSON and ROOT */ + int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */ + int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */ + const struct sqlite3_index_constraint *pConstraint; + + /* This implementation assumes that JSON and ROOT are the last two + ** columns in the table */ + assert( JEACH_ROOT == JEACH_JSON+1 ); + UNUSED_PARAMETER(tab); + aIdx[0] = aIdx[1] = -1; + pConstraint = pIdxInfo->aConstraint; + for(i=0; inConstraint; i++, pConstraint++){ + int iCol; + int iMask; + if( pConstraint->iColumn < JEACH_JSON ) continue; + iCol = pConstraint->iColumn - JEACH_JSON; + assert( iCol==0 || iCol==1 ); + testcase( iCol==0 ); + iMask = 1 << iCol; + if( pConstraint->usable==0 ){ + unusableMask |= iMask; + }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + aIdx[iCol] = i; + idxMask |= iMask; + } + } + if( (unusableMask & ~idxMask)!=0 ){ + /* If there are any unusable constraints on JSON or ROOT, then reject + ** this entire plan */ + return SQLITE_CONSTRAINT; + } + if( aIdx[0]<0 ){ + /* No JSON input. Leave estimatedCost at the huge value that it was + ** initialized to to discourage the query planner from selecting this + ** plan. */ + pIdxInfo->idxNum = 0; + }else{ + pIdxInfo->estimatedCost = 1.0; + i = aIdx[0]; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + if( aIdx[1]<0 ){ + pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */ + }else{ + i = aIdx[1]; + pIdxInfo->aConstraintUsage[i].argvIndex = 2; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */ + } + } + return SQLITE_OK; +} + +/* Start a search on a new JSON string */ +static int jsonEachFilter( + sqlite3_vtab_cursor *cur, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + JsonEachCursor *p = (JsonEachCursor*)cur; + const char *z; + const char *zRoot = 0; + sqlite3_int64 n; + + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(argc); + jsonEachCursorReset(p); + if( idxNum==0 ) return SQLITE_OK; + z = (const char*)sqlite3_value_text(argv[0]); + if( z==0 ) return SQLITE_OK; + n = sqlite3_value_bytes(argv[0]); + p->zJson = sqlite3_malloc64( n+1 ); + if( p->zJson==0 ) return SQLITE_NOMEM; + memcpy(p->zJson, z, (size_t)n+1); + if( jsonParse(&p->sParse, 0, p->zJson) ){ + int rc = SQLITE_NOMEM; + if( p->sParse.oom==0 ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); + if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR; + } + jsonEachCursorReset(p); + return rc; + }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){ + jsonEachCursorReset(p); + return SQLITE_NOMEM; + }else{ + JsonNode *pNode = 0; + if( idxNum==3 ){ + const char *zErr = 0; + zRoot = (const char*)sqlite3_value_text(argv[1]); + if( zRoot==0 ) return SQLITE_OK; + n = sqlite3_value_bytes(argv[1]); + p->zRoot = sqlite3_malloc64( n+1 ); + if( p->zRoot==0 ) return SQLITE_NOMEM; + memcpy(p->zRoot, zRoot, (size_t)n+1); + if( zRoot[0]!='$' ){ + zErr = zRoot; + }else{ + pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); + } + if( zErr ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr); + jsonEachCursorReset(p); + return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; + }else if( pNode==0 ){ + return SQLITE_OK; + } + }else{ + pNode = p->sParse.aNode; + } + p->iBegin = p->i = (int)(pNode - p->sParse.aNode); + p->eType = pNode->eType; + if( p->eType>=JSON_ARRAY ){ + assert( pNode->eU==0 ); + VVA( pNode->eU = 3 ); + pNode->u.iKey = 0; + p->iEnd = p->i + pNode->n + 1; + if( p->bRecursive ){ + p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType; + if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){ + p->i--; + } + }else{ + p->i++; + } + }else{ + p->iEnd = p->i+1; + } + } + return SQLITE_OK; +} + +/* The methods of the json_each virtual table */ +static sqlite3_module jsonEachModule = { + 0, /* iVersion */ + 0, /* xCreate */ + jsonEachConnect, /* xConnect */ + jsonEachBestIndex, /* xBestIndex */ + jsonEachDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + jsonEachOpenEach, /* xOpen - open a cursor */ + jsonEachClose, /* xClose - close a cursor */ + jsonEachFilter, /* xFilter - configure scan constraints */ + jsonEachNext, /* xNext - advance a cursor */ + jsonEachEof, /* xEof - check for end of scan */ + jsonEachColumn, /* xColumn - read data */ + jsonEachRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; + +/* The methods of the json_tree virtual table. */ +static sqlite3_module jsonTreeModule = { + 0, /* iVersion */ + 0, /* xCreate */ + jsonEachConnect, /* xConnect */ + jsonEachBestIndex, /* xBestIndex */ + jsonEachDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + jsonEachOpenTree, /* xOpen - open a cursor */ + jsonEachClose, /* xClose - close a cursor */ + jsonEachFilter, /* xFilter - configure scan constraints */ + jsonEachNext, /* xNext - advance a cursor */ + jsonEachEof, /* xEof - check for end of scan */ + jsonEachColumn, /* xColumn - read data */ + jsonEachRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ +}; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ +#endif /* !defined(SQLITE_OMIT_JSON) */ + +/* +** Register JSON functions. +*/ +SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){ +#ifndef SQLITE_OMIT_JSON + static FuncDef aJsonFunc[] = { + JFUNCTION(json, 1, 0, jsonRemoveFunc), + JFUNCTION(json_array, -1, 0, jsonArrayFunc), + JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc), + JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc), + JFUNCTION(json_extract, -1, 0, jsonExtractFunc), + JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc), + JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc), + JFUNCTION(json_insert, -1, 0, jsonSetFunc), + JFUNCTION(json_object, -1, 0, jsonObjectFunc), + JFUNCTION(json_patch, 2, 0, jsonPatchFunc), + JFUNCTION(json_quote, 1, 0, jsonQuoteFunc), + JFUNCTION(json_remove, -1, 0, jsonRemoveFunc), + JFUNCTION(json_replace, -1, 0, jsonReplaceFunc), + JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc), + JFUNCTION(json_type, 1, 0, jsonTypeFunc), + JFUNCTION(json_type, 2, 0, jsonTypeFunc), + JFUNCTION(json_valid, 1, 0, jsonValidFunc), +#if SQLITE_DEBUG + JFUNCTION(json_parse, 1, 0, jsonParseFunc), + JFUNCTION(json_test1, 1, 0, jsonTest1Func), +#endif + WAGGREGATE(json_group_array, 1, 0, 0, + jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse, + SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS), + WAGGREGATE(json_group_object, 2, 0, 0, + jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse, + SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS) + }; + sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc)); +#endif +} + +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) +/* +** Register the JSON table-valued functions +*/ +SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3 *db){ + int rc = SQLITE_OK; + static const struct { + const char *zName; + sqlite3_module *pModule; + } aMod[] = { + { "json_each", &jsonEachModule }, + { "json_tree", &jsonTreeModule }, + }; + unsigned int i; + for(i=0; i */ +/* #include */ +/* #include */ +/* #include */ + +/* The following macro is used to suppress compiler warnings. +*/ +#ifndef UNUSED_PARAMETER +# define UNUSED_PARAMETER(x) (void)(x) +#endif + +typedef struct Rtree Rtree; +typedef struct RtreeCursor RtreeCursor; +typedef struct RtreeNode RtreeNode; +typedef struct RtreeCell RtreeCell; +typedef struct RtreeConstraint RtreeConstraint; +typedef struct RtreeMatchArg RtreeMatchArg; +typedef struct RtreeGeomCallback RtreeGeomCallback; +typedef union RtreeCoord RtreeCoord; +typedef struct RtreeSearchPoint RtreeSearchPoint; + +/* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */ +#define RTREE_MAX_DIMENSIONS 5 + +/* Maximum number of auxiliary columns */ +#define RTREE_MAX_AUX_COLUMN 100 + +/* Size of hash table Rtree.aHash. This hash table is not expected to +** ever contain very many entries, so a fixed number of buckets is +** used. +*/ +#define HASHSIZE 97 + +/* The xBestIndex method of this virtual table requires an estimate of +** the number of rows in the virtual table to calculate the costs of +** various strategies. If possible, this estimate is loaded from the +** sqlite_stat1 table (with RTREE_MIN_ROWEST as a hard-coded minimum). +** Otherwise, if no sqlite_stat1 entry is available, use +** RTREE_DEFAULT_ROWEST. +*/ +#define RTREE_DEFAULT_ROWEST 1048576 +#define RTREE_MIN_ROWEST 100 + +/* +** An rtree virtual-table object. +*/ +struct Rtree { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* Host database connection */ + int iNodeSize; /* Size in bytes of each node in the node table */ + u8 nDim; /* Number of dimensions */ + u8 nDim2; /* Twice the number of dimensions */ + u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */ + u8 nBytesPerCell; /* Bytes consumed per cell */ + u8 inWrTrans; /* True if inside write transaction */ + u8 nAux; /* # of auxiliary columns in %_rowid */ +#ifdef SQLITE_ENABLE_GEOPOLY + u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#endif +#ifdef SQLITE_DEBUG + u8 bCorrupt; /* Shadow table corruption detected */ +#endif + int iDepth; /* Current depth of the r-tree structure */ + char *zDb; /* Name of database containing r-tree table */ + char *zName; /* Name of r-tree table */ + u32 nBusy; /* Current number of users of this structure */ + i64 nRowEst; /* Estimated number of rows in this table */ + u32 nCursor; /* Number of open cursors */ + u32 nNodeRef; /* Number RtreeNodes with positive nRef */ + char *zReadAuxSql; /* SQL for statement to read aux data */ + + /* List of nodes removed during a CondenseTree operation. List is + ** linked together via the pointer normally used for hash chains - + ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree + ** headed by the node (leaf nodes have RtreeNode.iNode==0). + */ + RtreeNode *pDeleted; + int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */ + + /* Blob I/O on xxx_node */ + sqlite3_blob *pNodeBlob; + + /* Statements to read/write/delete a record from xxx_node */ + sqlite3_stmt *pWriteNode; + sqlite3_stmt *pDeleteNode; + + /* Statements to read/write/delete a record from xxx_rowid */ + sqlite3_stmt *pReadRowid; + sqlite3_stmt *pWriteRowid; + sqlite3_stmt *pDeleteRowid; + + /* Statements to read/write/delete a record from xxx_parent */ + sqlite3_stmt *pReadParent; + sqlite3_stmt *pWriteParent; + sqlite3_stmt *pDeleteParent; + + /* Statement for writing to the "aux:" fields, if there are any */ + sqlite3_stmt *pWriteAux; + + RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ +}; + +/* Possible values for Rtree.eCoordType: */ +#define RTREE_COORD_REAL32 0 +#define RTREE_COORD_INT32 1 + +/* +** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will +** only deal with integer coordinates. No floating point operations +** will be done. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 RtreeDValue; /* High accuracy coordinate */ + typedef int RtreeValue; /* Low accuracy coordinate */ +# define RTREE_ZERO 0 +#else + typedef double RtreeDValue; /* High accuracy coordinate */ + typedef float RtreeValue; /* Low accuracy coordinate */ +# define RTREE_ZERO 0.0 +#endif + +/* +** Set the Rtree.bCorrupt flag +*/ +#ifdef SQLITE_DEBUG +# define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) +#else +# define RTREE_IS_CORRUPT(X) +#endif + +/* +** When doing a search of an r-tree, instances of the following structure +** record intermediate results from the tree walk. +** +** The id is always a node-id. For iLevel>=1 the id is the node-id of +** the node that the RtreeSearchPoint represents. When iLevel==0, however, +** the id is of the parent node and the cell that RtreeSearchPoint +** represents is the iCell-th entry in the parent node. +*/ +struct RtreeSearchPoint { + RtreeDValue rScore; /* The score for this node. Smallest goes first. */ + sqlite3_int64 id; /* Node ID */ + u8 iLevel; /* 0=entries. 1=leaf node. 2+ for higher */ + u8 eWithin; /* PARTLY_WITHIN or FULLY_WITHIN */ + u8 iCell; /* Cell index within the node */ +}; + +/* +** The minimum number of cells allowed for a node is a third of the +** maximum. In Gutman's notation: +** +** m = M/3 +** +** If an R*-tree "Reinsert" operation is required, the same number of +** cells are removed from the overfull node and reinserted into the tree. +*/ +#define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3) +#define RTREE_REINSERT(p) RTREE_MINCELLS(p) +#define RTREE_MAXCELLS 51 + +/* +** The smallest possible node-size is (512-64)==448 bytes. And the largest +** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates). +** Therefore all non-root nodes must contain at least 3 entries. Since +** 3^40 is greater than 2^64, an r-tree structure always has a depth of +** 40 or less. +*/ +#define RTREE_MAX_DEPTH 40 + + +/* +** Number of entries in the cursor RtreeNode cache. The first entry is +** used to cache the RtreeNode for RtreeCursor.sPoint. The remaining +** entries cache the RtreeNode for the first elements of the priority queue. +*/ +#define RTREE_CACHE_SZ 5 + +/* +** An rtree cursor object. +*/ +struct RtreeCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + u8 atEOF; /* True if at end of search */ + u8 bPoint; /* True if sPoint is valid */ + u8 bAuxValid; /* True if pReadAux is valid */ + int iStrategy; /* Copy of idxNum search parameter */ + int nConstraint; /* Number of entries in aConstraint */ + RtreeConstraint *aConstraint; /* Search constraints. */ + int nPointAlloc; /* Number of slots allocated for aPoint[] */ + int nPoint; /* Number of slots used in aPoint[] */ + int mxLevel; /* iLevel value for root of the tree */ + RtreeSearchPoint *aPoint; /* Priority queue for search points */ + sqlite3_stmt *pReadAux; /* Statement to read aux-data */ + RtreeSearchPoint sPoint; /* Cached next search point */ + RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */ + u32 anQueue[RTREE_MAX_DEPTH+1]; /* Number of queued entries by iLevel */ +}; + +/* Return the Rtree of a RtreeCursor */ +#define RTREE_OF_CURSOR(X) ((Rtree*)((X)->base.pVtab)) + +/* +** A coordinate can be either a floating point number or a integer. All +** coordinates within a single R-Tree are always of the same time. +*/ +union RtreeCoord { + RtreeValue f; /* Floating point value */ + int i; /* Integer value */ + u32 u; /* Unsigned for byte-order conversions */ +}; + +/* +** The argument is an RtreeCoord. Return the value stored within the RtreeCoord +** formatted as a RtreeDValue (double or int64). This macro assumes that local +** variable pRtree points to the Rtree structure associated with the +** RtreeCoord. +*/ +#ifdef SQLITE_RTREE_INT_ONLY +# define DCOORD(coord) ((RtreeDValue)coord.i) +#else +# define DCOORD(coord) ( \ + (pRtree->eCoordType==RTREE_COORD_REAL32) ? \ + ((double)coord.f) : \ + ((double)coord.i) \ + ) +#endif + +/* +** A search constraint. +*/ +struct RtreeConstraint { + int iCoord; /* Index of constrained coordinate */ + int op; /* Constraining operation */ + union { + RtreeDValue rValue; /* Constraint value. */ + int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*); + int (*xQueryFunc)(sqlite3_rtree_query_info*); + } u; + sqlite3_rtree_query_info *pInfo; /* xGeom and xQueryFunc argument */ +}; + +/* Possible values for RtreeConstraint.op */ +#define RTREE_EQ 0x41 /* A */ +#define RTREE_LE 0x42 /* B */ +#define RTREE_LT 0x43 /* C */ +#define RTREE_GE 0x44 /* D */ +#define RTREE_GT 0x45 /* E */ +#define RTREE_MATCH 0x46 /* F: Old-style sqlite3_rtree_geometry_callback() */ +#define RTREE_QUERY 0x47 /* G: New-style sqlite3_rtree_query_callback() */ + +/* Special operators available only on cursors. Needs to be consecutive +** with the normal values above, but must be less than RTREE_MATCH. These +** are used in the cursor for contraints such as x=NULL (RTREE_FALSE) or +** x<'xyz' (RTREE_TRUE) */ +#define RTREE_TRUE 0x3f /* ? */ +#define RTREE_FALSE 0x40 /* @ */ + +/* +** An rtree structure node. +*/ +struct RtreeNode { + RtreeNode *pParent; /* Parent node */ + i64 iNode; /* The node number */ + int nRef; /* Number of references to this node */ + int isDirty; /* True if the node needs to be written to disk */ + u8 *zData; /* Content of the node, as should be on disk */ + RtreeNode *pNext; /* Next node in this hash collision chain */ +}; + +/* Return the number of cells in a node */ +#define NCELL(pNode) readInt16(&(pNode)->zData[2]) + +/* +** A single cell from a node, deserialized +*/ +struct RtreeCell { + i64 iRowid; /* Node or entry ID */ + RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2]; /* Bounding box coordinates */ +}; + + +/* +** This object becomes the sqlite3_user_data() for the SQL functions +** that are created by sqlite3_rtree_geometry_callback() and +** sqlite3_rtree_query_callback() and which appear on the right of MATCH +** operators in order to constrain a search. +** +** xGeom and xQueryFunc are the callback functions. Exactly one of +** xGeom and xQueryFunc fields is non-NULL, depending on whether the +** SQL function was created using sqlite3_rtree_geometry_callback() or +** sqlite3_rtree_query_callback(). +** +** This object is deleted automatically by the destructor mechanism in +** sqlite3_create_function_v2(). +*/ +struct RtreeGeomCallback { + int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*); + int (*xQueryFunc)(sqlite3_rtree_query_info*); + void (*xDestructor)(void*); + void *pContext; +}; + +/* +** An instance of this structure (in the form of a BLOB) is returned by +** the SQL functions that sqlite3_rtree_geometry_callback() and +** sqlite3_rtree_query_callback() create, and is read as the right-hand +** operand to the MATCH operator of an R-Tree. +*/ +struct RtreeMatchArg { + u32 iSize; /* Size of this object */ + RtreeGeomCallback cb; /* Info about the callback functions */ + int nParam; /* Number of parameters to the SQL function */ + sqlite3_value **apSqlParam; /* Original SQL parameter values */ + RtreeDValue aParam[1]; /* Values for parameters to the SQL function */ +}; + +#ifndef MAX +# define MAX(x,y) ((x) < (y) ? (y) : (x)) +#endif +#ifndef MIN +# define MIN(x,y) ((x) > (y) ? (y) : (x)) +#endif + +/* What version of GCC is being used. 0 means GCC is not being used . +** Note that the GCC_VERSION macro will also be set correctly when using +** clang, since clang works hard to be gcc compatible. So the gcc +** optimizations will also work when compiling with clang. +*/ +#ifndef GCC_VERSION +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#endif + +/* The testcase() macro should already be defined in the amalgamation. If +** it is not, make it a no-op. +*/ +#ifndef SQLITE_AMALGAMATION +# if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) + unsigned int sqlite3RtreeTestcase = 0; +# define testcase(X) if( X ){ sqlite3RtreeTestcase += __LINE__; } +# else +# define testcase(X) +# endif +#endif + +/* +** Make sure that the compiler intrinsics we desire are enabled when +** compiling with an appropriate version of MSVC unless prevented by +** the SQLITE_DISABLE_INTRINSIC define. +*/ +#if !defined(SQLITE_DISABLE_INTRINSIC) +# if defined(_MSC_VER) && _MSC_VER>=1400 +# if !defined(_WIN32_WCE) +/* # include */ +# pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_byteswap_uint64) +# else +/* # include */ +# endif +# endif +#endif + +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SQLITE_BYTEORDER +#if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__arm__) +# define SQLITE_BYTEORDER 1234 +#elif defined(sparc) || defined(__ppc__) +# define SQLITE_BYTEORDER 4321 +#else +# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ +#endif +#endif + + +/* What version of MSVC is being used. 0 means MSVC is not being used */ +#ifndef MSVC_VERSION +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif +#endif + +/* +** Functions to deserialize a 16 bit integer, 32 bit real number and +** 64 bit integer. The deserialized value is returned. +*/ +static int readInt16(u8 *p){ + return (p[0]<<8) + p[1]; +} +static void readCoord(u8 *p, RtreeCoord *pCoord){ + assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + pCoord->u = _byteswap_ulong(*(u32*)p); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + pCoord->u = __builtin_bswap32(*(u32*)p); +#elif SQLITE_BYTEORDER==4321 + pCoord->u = *(u32*)p; +#else + pCoord->u = ( + (((u32)p[0]) << 24) + + (((u32)p[1]) << 16) + + (((u32)p[2]) << 8) + + (((u32)p[3]) << 0) + ); +#endif +} +static i64 readInt64(u8 *p){ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u64 x; + memcpy(&x, p, 8); + return (i64)_byteswap_uint64(x); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u64 x; + memcpy(&x, p, 8); + return (i64)__builtin_bswap64(x); +#elif SQLITE_BYTEORDER==4321 + i64 x; + memcpy(&x, p, 8); + return x; +#else + return (i64)( + (((u64)p[0]) << 56) + + (((u64)p[1]) << 48) + + (((u64)p[2]) << 40) + + (((u64)p[3]) << 32) + + (((u64)p[4]) << 24) + + (((u64)p[5]) << 16) + + (((u64)p[6]) << 8) + + (((u64)p[7]) << 0) + ); +#endif +} + +/* +** Functions to serialize a 16 bit integer, 32 bit real number and +** 64 bit integer. The value returned is the number of bytes written +** to the argument buffer (always 2, 4 and 8 respectively). +*/ +static void writeInt16(u8 *p, int i){ + p[0] = (i>> 8)&0xFF; + p[1] = (i>> 0)&0xFF; +} +static int writeCoord(u8 *p, RtreeCoord *pCoord){ + u32 i; + assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */ + assert( sizeof(RtreeCoord)==4 ); + assert( sizeof(u32)==4 ); +#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + i = __builtin_bswap32(pCoord->u); + memcpy(p, &i, 4); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + i = _byteswap_ulong(pCoord->u); + memcpy(p, &i, 4); +#elif SQLITE_BYTEORDER==4321 + i = pCoord->u; + memcpy(p, &i, 4); +#else + i = pCoord->u; + p[0] = (i>>24)&0xFF; + p[1] = (i>>16)&0xFF; + p[2] = (i>> 8)&0xFF; + p[3] = (i>> 0)&0xFF; +#endif + return 4; +} +static int writeInt64(u8 *p, i64 i){ +#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + i = (i64)__builtin_bswap64((u64)i); + memcpy(p, &i, 8); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + i = (i64)_byteswap_uint64((u64)i); + memcpy(p, &i, 8); +#elif SQLITE_BYTEORDER==4321 + memcpy(p, &i, 8); +#else + p[0] = (i>>56)&0xFF; + p[1] = (i>>48)&0xFF; + p[2] = (i>>40)&0xFF; + p[3] = (i>>32)&0xFF; + p[4] = (i>>24)&0xFF; + p[5] = (i>>16)&0xFF; + p[6] = (i>> 8)&0xFF; + p[7] = (i>> 0)&0xFF; +#endif + return 8; +} + +/* +** Increment the reference count of node p. +*/ +static void nodeReference(RtreeNode *p){ + if( p ){ + assert( p->nRef>0 ); + p->nRef++; + } +} + +/* +** Clear the content of node p (set all bytes to 0x00). +*/ +static void nodeZero(Rtree *pRtree, RtreeNode *p){ + memset(&p->zData[2], 0, pRtree->iNodeSize-2); + p->isDirty = 1; +} + +/* +** Given a node number iNode, return the corresponding key to use +** in the Rtree.aHash table. +*/ +static unsigned int nodeHash(i64 iNode){ + return ((unsigned)iNode) % HASHSIZE; +} + +/* +** Search the node hash table for node iNode. If found, return a pointer +** to it. Otherwise, return 0. +*/ +static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){ + RtreeNode *p; + for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext); + return p; +} + +/* +** Add node pNode to the node hash table. +*/ +static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){ + int iHash; + assert( pNode->pNext==0 ); + iHash = nodeHash(pNode->iNode); + pNode->pNext = pRtree->aHash[iHash]; + pRtree->aHash[iHash] = pNode; +} + +/* +** Remove node pNode from the node hash table. +*/ +static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ + RtreeNode **pp; + if( pNode->iNode!=0 ){ + pp = &pRtree->aHash[nodeHash(pNode->iNode)]; + for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); } + *pp = pNode->pNext; + pNode->pNext = 0; + } +} + +/* +** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0), +** indicating that node has not yet been assigned a node number. It is +** assigned a node number when nodeWrite() is called to write the +** node contents out to the database. +*/ +static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ + RtreeNode *pNode; + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); + if( pNode ){ + memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pRtree->nNodeRef++; + pNode->pParent = pParent; + pNode->isDirty = 1; + nodeReference(pParent); + } + return pNode; +} + +/* +** Clear the Rtree.pNodeBlob object +*/ +static void nodeBlobReset(Rtree *pRtree){ + if( pRtree->pNodeBlob && pRtree->inWrTrans==0 && pRtree->nCursor==0 ){ + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + sqlite3_blob_close(pBlob); + } +} + +/* +** Obtain a reference to an r-tree node. +*/ +static int nodeAcquire( + Rtree *pRtree, /* R-tree structure */ + i64 iNode, /* Node number to load */ + RtreeNode *pParent, /* Either the parent node or NULL */ + RtreeNode **ppNode /* OUT: Acquired node */ +){ + int rc = SQLITE_OK; + RtreeNode *pNode = 0; + + /* Check if the requested node is already in the hash table. If so, + ** increase its reference count and return it. + */ + if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ + if( pParent && pParent!=pNode->pParent ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + pNode->nRef++; + *ppNode = pNode; + return SQLITE_OK; + } + + if( pRtree->pNodeBlob ){ + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + rc = sqlite3_blob_reopen(pBlob, iNode); + pRtree->pNodeBlob = pBlob; + if( rc ){ + nodeBlobReset(pRtree); + if( rc==SQLITE_NOMEM ) return SQLITE_NOMEM; + } + } + if( pRtree->pNodeBlob==0 ){ + char *zTab = sqlite3_mprintf("%s_node", pRtree->zName); + if( zTab==0 ) return SQLITE_NOMEM; + rc = sqlite3_blob_open(pRtree->db, pRtree->zDb, zTab, "data", iNode, 0, + &pRtree->pNodeBlob); + sqlite3_free(zTab); + } + if( rc ){ + nodeBlobReset(pRtree); + *ppNode = 0; + /* If unable to open an sqlite3_blob on the desired row, that can only + ** be because the shadow tables hold erroneous data. */ + if( rc==SQLITE_ERROR ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); + if( !pNode ){ + rc = SQLITE_NOMEM; + }else{ + pNode->pParent = pParent; + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pRtree->nNodeRef++; + pNode->iNode = iNode; + pNode->isDirty = 0; + pNode->pNext = 0; + rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, + pRtree->iNodeSize, 0); + } + } + + /* If the root node was just loaded, set pRtree->iDepth to the height + ** of the r-tree structure. A height of zero means all data is stored on + ** the root node. A height of one means the children of the root node + ** are the leaves, and so on. If the depth as specified on the root node + ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt. + */ + if( rc==SQLITE_OK && pNode && iNode==1 ){ + pRtree->iDepth = readInt16(pNode->zData); + if( pRtree->iDepth>RTREE_MAX_DEPTH ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + } + + /* If no error has occurred so far, check if the "number of entries" + ** field on the node is too large. If so, set the return code to + ** SQLITE_CORRUPT_VTAB. + */ + if( pNode && rc==SQLITE_OK ){ + if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + } + + if( rc==SQLITE_OK ){ + if( pNode!=0 ){ + nodeReference(pParent); + nodeHashInsert(pRtree, pNode); + }else{ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } + *ppNode = pNode; + }else{ + if( pNode ){ + pRtree->nNodeRef--; + sqlite3_free(pNode); + } + *ppNode = 0; + } + + return rc; +} + +/* +** Overwrite cell iCell of node pNode with the contents of pCell. +*/ +static void nodeOverwriteCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node into which the cell is to be written */ + RtreeCell *pCell, /* The cell to write */ + int iCell /* Index into pNode into which pCell is written */ +){ + int ii; + u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; + p += writeInt64(p, pCell->iRowid); + for(ii=0; iinDim2; ii++){ + p += writeCoord(p, &pCell->aCoord[ii]); + } + pNode->isDirty = 1; +} + +/* +** Remove the cell with index iCell from node pNode. +*/ +static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){ + u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; + u8 *pSrc = &pDst[pRtree->nBytesPerCell]; + int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell; + memmove(pDst, pSrc, nByte); + writeInt16(&pNode->zData[2], NCELL(pNode)-1); + pNode->isDirty = 1; +} + +/* +** Insert the contents of cell pCell into node pNode. If the insert +** is successful, return SQLITE_OK. +** +** If there is not enough free space in pNode, return SQLITE_FULL. +*/ +static int nodeInsertCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* Write new cell into this node */ + RtreeCell *pCell /* The cell to be inserted */ +){ + int nCell; /* Current number of cells in pNode */ + int nMaxCell; /* Maximum number of cells for pNode */ + + nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell; + nCell = NCELL(pNode); + + assert( nCell<=nMaxCell ); + if( nCellzData[2], nCell+1); + pNode->isDirty = 1; + } + + return (nCell==nMaxCell); +} + +/* +** If the node is dirty, write it out to the database. +*/ +static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ + int rc = SQLITE_OK; + if( pNode->isDirty ){ + sqlite3_stmt *p = pRtree->pWriteNode; + if( pNode->iNode ){ + sqlite3_bind_int64(p, 1, pNode->iNode); + }else{ + sqlite3_bind_null(p, 1); + } + sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC); + sqlite3_step(p); + pNode->isDirty = 0; + rc = sqlite3_reset(p); + sqlite3_bind_null(p, 2); + if( pNode->iNode==0 && rc==SQLITE_OK ){ + pNode->iNode = sqlite3_last_insert_rowid(pRtree->db); + nodeHashInsert(pRtree, pNode); + } + } + return rc; +} + +/* +** Release a reference to a node. If the node is dirty and the reference +** count drops to zero, the node data is written to the database. +*/ +static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){ + int rc = SQLITE_OK; + if( pNode ){ + assert( pNode->nRef>0 ); + assert( pRtree->nNodeRef>0 ); + pNode->nRef--; + if( pNode->nRef==0 ){ + pRtree->nNodeRef--; + if( pNode->iNode==1 ){ + pRtree->iDepth = -1; + } + if( pNode->pParent ){ + rc = nodeRelease(pRtree, pNode->pParent); + } + if( rc==SQLITE_OK ){ + rc = nodeWrite(pRtree, pNode); + } + nodeHashDelete(pRtree, pNode); + sqlite3_free(pNode); + } + } + return rc; +} + +/* +** Return the 64-bit integer value associated with cell iCell of +** node pNode. If pNode is a leaf node, this is a rowid. If it is +** an internal node, then the 64-bit integer is a child page number. +*/ +static i64 nodeGetRowid( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node from which to extract the ID */ + int iCell /* The cell index from which to extract the ID */ +){ + assert( iCellzData[4 + pRtree->nBytesPerCell*iCell]); +} + +/* +** Return coordinate iCoord from cell iCell in node pNode. +*/ +static void nodeGetCoord( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node from which to extract a coordinate */ + int iCell, /* The index of the cell within the node */ + int iCoord, /* Which coordinate to extract */ + RtreeCoord *pCoord /* OUT: Space to write result to */ +){ + readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord); +} + +/* +** Deserialize cell iCell of node pNode. Populate the structure pointed +** to by pCell with the results. +*/ +static void nodeGetCell( + Rtree *pRtree, /* The overall R-Tree */ + RtreeNode *pNode, /* The node containing the cell to be read */ + int iCell, /* Index of the cell within the node */ + RtreeCell *pCell /* OUT: Write the cell contents here */ +){ + u8 *pData; + RtreeCoord *pCoord; + int ii = 0; + pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell); + pData = pNode->zData + (12 + pRtree->nBytesPerCell*iCell); + pCoord = pCell->aCoord; + do{ + readCoord(pData, &pCoord[ii]); + readCoord(pData+4, &pCoord[ii+1]); + pData += 8; + ii += 2; + }while( iinDim2 ); +} + + +/* Forward declaration for the function that does the work of +** the virtual table module xCreate() and xConnect() methods. +*/ +static int rtreeInit( + sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int +); + +/* +** Rtree virtual table module xCreate method. +*/ +static int rtreeCreate( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1); +} + +/* +** Rtree virtual table module xConnect method. +*/ +static int rtreeConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0); +} + +/* +** Increment the r-tree reference count. +*/ +static void rtreeReference(Rtree *pRtree){ + pRtree->nBusy++; +} + +/* +** Decrement the r-tree reference count. When the reference count reaches +** zero the structure is deleted. +*/ +static void rtreeRelease(Rtree *pRtree){ + pRtree->nBusy--; + if( pRtree->nBusy==0 ){ + pRtree->inWrTrans = 0; + assert( pRtree->nCursor==0 ); + nodeBlobReset(pRtree); + assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); + sqlite3_finalize(pRtree->pWriteNode); + sqlite3_finalize(pRtree->pDeleteNode); + sqlite3_finalize(pRtree->pReadRowid); + sqlite3_finalize(pRtree->pWriteRowid); + sqlite3_finalize(pRtree->pDeleteRowid); + sqlite3_finalize(pRtree->pReadParent); + sqlite3_finalize(pRtree->pWriteParent); + sqlite3_finalize(pRtree->pDeleteParent); + sqlite3_finalize(pRtree->pWriteAux); + sqlite3_free(pRtree->zReadAuxSql); + sqlite3_free(pRtree); + } +} + +/* +** Rtree virtual table module xDisconnect method. +*/ +static int rtreeDisconnect(sqlite3_vtab *pVtab){ + rtreeRelease((Rtree *)pVtab); + return SQLITE_OK; +} + +/* +** Rtree virtual table module xDestroy method. +*/ +static int rtreeDestroy(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + int rc; + char *zCreate = sqlite3_mprintf( + "DROP TABLE '%q'.'%q_node';" + "DROP TABLE '%q'.'%q_rowid';" + "DROP TABLE '%q'.'%q_parent';", + pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName, + pRtree->zDb, pRtree->zName + ); + if( !zCreate ){ + rc = SQLITE_NOMEM; + }else{ + nodeBlobReset(pRtree); + rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + } + if( rc==SQLITE_OK ){ + rtreeRelease(pRtree); + } + + return rc; +} + +/* +** Rtree virtual table module xOpen method. +*/ +static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + int rc = SQLITE_NOMEM; + Rtree *pRtree = (Rtree *)pVTab; + RtreeCursor *pCsr; + + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); + if( pCsr ){ + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = pVTab; + rc = SQLITE_OK; + pRtree->nCursor++; + } + *ppCursor = (sqlite3_vtab_cursor *)pCsr; + + return rc; +} + + +/* +** Reset a cursor back to its initial state. +*/ +static void resetCursor(RtreeCursor *pCsr){ + Rtree *pRtree = (Rtree *)(pCsr->base.pVtab); + int ii; + sqlite3_stmt *pStmt; + if( pCsr->aConstraint ){ + int i; /* Used to iterate through constraint array */ + for(i=0; inConstraint; i++){ + sqlite3_rtree_query_info *pInfo = pCsr->aConstraint[i].pInfo; + if( pInfo ){ + if( pInfo->xDelUser ) pInfo->xDelUser(pInfo->pUser); + sqlite3_free(pInfo); + } + } + sqlite3_free(pCsr->aConstraint); + pCsr->aConstraint = 0; + } + for(ii=0; iiaNode[ii]); + sqlite3_free(pCsr->aPoint); + pStmt = pCsr->pReadAux; + memset(pCsr, 0, sizeof(RtreeCursor)); + pCsr->base.pVtab = (sqlite3_vtab*)pRtree; + pCsr->pReadAux = pStmt; + +} + +/* +** Rtree virtual table module xClose method. +*/ +static int rtreeClose(sqlite3_vtab_cursor *cur){ + Rtree *pRtree = (Rtree *)(cur->pVtab); + RtreeCursor *pCsr = (RtreeCursor *)cur; + assert( pRtree->nCursor>0 ); + resetCursor(pCsr); + sqlite3_finalize(pCsr->pReadAux); + sqlite3_free(pCsr); + pRtree->nCursor--; + nodeBlobReset(pRtree); + return SQLITE_OK; +} + +/* +** Rtree virtual table module xEof method. +** +** Return non-zero if the cursor does not currently point to a valid +** record (i.e if the scan has finished), or zero otherwise. +*/ +static int rtreeEof(sqlite3_vtab_cursor *cur){ + RtreeCursor *pCsr = (RtreeCursor *)cur; + return pCsr->atEOF; +} + +/* +** Convert raw bits from the on-disk RTree record into a coordinate value. +** The on-disk format is big-endian and needs to be converted for little- +** endian platforms. The on-disk record stores integer coordinates if +** eInt is true and it stores 32-bit floating point records if eInt is +** false. a[] is the four bytes of the on-disk record to be decoded. +** Store the results in "r". +** +** There are five versions of this macro. The last one is generic. The +** other four are various architectures-specific optimizations. +*/ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = _byteswap_ulong(*(u32*)a); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = __builtin_bswap32(*(u32*)a); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==1234 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + memcpy(&c.u,a,4); \ + c.u = ((c.u>>24)&0xff)|((c.u>>8)&0xff00)| \ + ((c.u&0xff)<<24)|((c.u&0xff00)<<8); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==4321 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + memcpy(&c.u,a,4); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#else +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = ((u32)a[0]<<24) + ((u32)a[1]<<16) \ + +((u32)a[2]<<8) + a[3]; \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#endif + +/* +** Check the RTree node or entry given by pCellData and p against the MATCH +** constraint pConstraint. +*/ +static int rtreeCallbackConstraint( + RtreeConstraint *pConstraint, /* The constraint to test */ + int eInt, /* True if RTree holding integer coordinates */ + u8 *pCellData, /* Raw cell content */ + RtreeSearchPoint *pSearch, /* Container of this cell */ + sqlite3_rtree_dbl *prScore, /* OUT: score for the cell */ + int *peWithin /* OUT: visibility of the cell */ +){ + sqlite3_rtree_query_info *pInfo = pConstraint->pInfo; /* Callback info */ + int nCoord = pInfo->nCoord; /* No. of coordinates */ + int rc; /* Callback return code */ + RtreeCoord c; /* Translator union */ + sqlite3_rtree_dbl aCoord[RTREE_MAX_DIMENSIONS*2]; /* Decoded coordinates */ + + assert( pConstraint->op==RTREE_MATCH || pConstraint->op==RTREE_QUERY ); + assert( nCoord==2 || nCoord==4 || nCoord==6 || nCoord==8 || nCoord==10 ); + + if( pConstraint->op==RTREE_QUERY && pSearch->iLevel==1 ){ + pInfo->iRowid = readInt64(pCellData); + } + pCellData += 8; +#ifndef SQLITE_RTREE_INT_ONLY + if( eInt==0 ){ + switch( nCoord ){ + case 10: readCoord(pCellData+36, &c); aCoord[9] = c.f; + readCoord(pCellData+32, &c); aCoord[8] = c.f; + case 8: readCoord(pCellData+28, &c); aCoord[7] = c.f; + readCoord(pCellData+24, &c); aCoord[6] = c.f; + case 6: readCoord(pCellData+20, &c); aCoord[5] = c.f; + readCoord(pCellData+16, &c); aCoord[4] = c.f; + case 4: readCoord(pCellData+12, &c); aCoord[3] = c.f; + readCoord(pCellData+8, &c); aCoord[2] = c.f; + default: readCoord(pCellData+4, &c); aCoord[1] = c.f; + readCoord(pCellData, &c); aCoord[0] = c.f; + } + }else +#endif + { + switch( nCoord ){ + case 10: readCoord(pCellData+36, &c); aCoord[9] = c.i; + readCoord(pCellData+32, &c); aCoord[8] = c.i; + case 8: readCoord(pCellData+28, &c); aCoord[7] = c.i; + readCoord(pCellData+24, &c); aCoord[6] = c.i; + case 6: readCoord(pCellData+20, &c); aCoord[5] = c.i; + readCoord(pCellData+16, &c); aCoord[4] = c.i; + case 4: readCoord(pCellData+12, &c); aCoord[3] = c.i; + readCoord(pCellData+8, &c); aCoord[2] = c.i; + default: readCoord(pCellData+4, &c); aCoord[1] = c.i; + readCoord(pCellData, &c); aCoord[0] = c.i; + } + } + if( pConstraint->op==RTREE_MATCH ){ + int eWithin = 0; + rc = pConstraint->u.xGeom((sqlite3_rtree_geometry*)pInfo, + nCoord, aCoord, &eWithin); + if( eWithin==0 ) *peWithin = NOT_WITHIN; + *prScore = RTREE_ZERO; + }else{ + pInfo->aCoord = aCoord; + pInfo->iLevel = pSearch->iLevel - 1; + pInfo->rScore = pInfo->rParentScore = pSearch->rScore; + pInfo->eWithin = pInfo->eParentWithin = pSearch->eWithin; + rc = pConstraint->u.xQueryFunc(pInfo); + if( pInfo->eWithin<*peWithin ) *peWithin = pInfo->eWithin; + if( pInfo->rScore<*prScore || *prScorerScore; + } + } + return rc; +} + +/* +** Check the internal RTree node given by pCellData against constraint p. +** If this constraint cannot be satisfied by any child within the node, +** set *peWithin to NOT_WITHIN. +*/ +static void rtreeNonleafConstraint( + RtreeConstraint *p, /* The constraint to test */ + int eInt, /* True if RTree holds integer coordinates */ + u8 *pCellData, /* Raw cell content as appears on disk */ + int *peWithin /* Adjust downward, as appropriate */ +){ + sqlite3_rtree_dbl val; /* Coordinate value convert to a double */ + + /* p->iCoord might point to either a lower or upper bound coordinate + ** in a coordinate pair. But make pCellData point to the lower bound. + */ + pCellData += 8 + 4*(p->iCoord&0xfe); + + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE + || p->op==RTREE_FALSE ); + assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ + switch( p->op ){ + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ + case RTREE_EQ: + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the lower bound of the coordinate pair */ + if( p->u.rValue>=val ){ + pCellData += 4; + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the upper bound of the coordinate pair */ + if( p->u.rValue<=val ) return; + } + break; + case RTREE_LE: + case RTREE_LT: + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the lower bound of the coordinate pair */ + if( p->u.rValue>=val ) return; + break; + + default: + pCellData += 4; + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the upper bound of the coordinate pair */ + if( p->u.rValue<=val ) return; + break; + } + *peWithin = NOT_WITHIN; +} + +/* +** Check the leaf RTree cell given by pCellData against constraint p. +** If this constraint is not satisfied, set *peWithin to NOT_WITHIN. +** If the constraint is satisfied, leave *peWithin unchanged. +** +** The constraint is of the form: xN op $val +** +** The op is given by p->op. The xN is p->iCoord-th coordinate in +** pCellData. $val is given by p->u.rValue. +*/ +static void rtreeLeafConstraint( + RtreeConstraint *p, /* The constraint to test */ + int eInt, /* True if RTree holds integer coordinates */ + u8 *pCellData, /* Raw cell content as appears on disk */ + int *peWithin /* Adjust downward, as appropriate */ +){ + RtreeDValue xN; /* Coordinate value converted to a double */ + + assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE + || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE + || p->op==RTREE_FALSE ); + pCellData += 8 + p->iCoord*4; + assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ + RTREE_DECODE_COORD(eInt, pCellData, xN); + switch( p->op ){ + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ + case RTREE_LE: if( xN <= p->u.rValue ) return; break; + case RTREE_LT: if( xN < p->u.rValue ) return; break; + case RTREE_GE: if( xN >= p->u.rValue ) return; break; + case RTREE_GT: if( xN > p->u.rValue ) return; break; + default: if( xN == p->u.rValue ) return; break; + } + *peWithin = NOT_WITHIN; +} + +/* +** One of the cells in node pNode is guaranteed to have a 64-bit +** integer value equal to iRowid. Return the index of this cell. +*/ +static int nodeRowidIndex( + Rtree *pRtree, + RtreeNode *pNode, + i64 iRowid, + int *piIndex +){ + int ii; + int nCell = NCELL(pNode); + assert( nCell<200 ); + for(ii=0; iipParent; + if( ALWAYS(pParent) ){ + return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex); + }else{ + *piIndex = -1; + return SQLITE_OK; + } +} + +/* +** Compare two search points. Return negative, zero, or positive if the first +** is less than, equal to, or greater than the second. +** +** The rScore is the primary key. Smaller rScore values come first. +** If the rScore is a tie, then use iLevel as the tie breaker with smaller +** iLevel values coming first. In this way, if rScore is the same for all +** SearchPoints, then iLevel becomes the deciding factor and the result +** is a depth-first search, which is the desired default behavior. +*/ +static int rtreeSearchPointCompare( + const RtreeSearchPoint *pA, + const RtreeSearchPoint *pB +){ + if( pA->rScorerScore ) return -1; + if( pA->rScore>pB->rScore ) return +1; + if( pA->iLeveliLevel ) return -1; + if( pA->iLevel>pB->iLevel ) return +1; + return 0; +} + +/* +** Interchange two search points in a cursor. +*/ +static void rtreeSearchPointSwap(RtreeCursor *p, int i, int j){ + RtreeSearchPoint t = p->aPoint[i]; + assert( iaPoint[i] = p->aPoint[j]; + p->aPoint[j] = t; + i++; j++; + if( i=RTREE_CACHE_SZ ){ + nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); + p->aNode[i] = 0; + }else{ + RtreeNode *pTemp = p->aNode[i]; + p->aNode[i] = p->aNode[j]; + p->aNode[j] = pTemp; + } + } +} + +/* +** Return the search point with the lowest current score. +*/ +static RtreeSearchPoint *rtreeSearchPointFirst(RtreeCursor *pCur){ + return pCur->bPoint ? &pCur->sPoint : pCur->nPoint ? pCur->aPoint : 0; +} + +/* +** Get the RtreeNode for the search point with the lowest score. +*/ +static RtreeNode *rtreeNodeOfFirstSearchPoint(RtreeCursor *pCur, int *pRC){ + sqlite3_int64 id; + int ii = 1 - pCur->bPoint; + assert( ii==0 || ii==1 ); + assert( pCur->bPoint || pCur->nPoint ); + if( pCur->aNode[ii]==0 ){ + assert( pRC!=0 ); + id = ii ? pCur->aPoint[0].id : pCur->sPoint.id; + *pRC = nodeAcquire(RTREE_OF_CURSOR(pCur), id, 0, &pCur->aNode[ii]); + } + return pCur->aNode[ii]; +} + +/* +** Push a new element onto the priority queue +*/ +static RtreeSearchPoint *rtreeEnqueue( + RtreeCursor *pCur, /* The cursor */ + RtreeDValue rScore, /* Score for the new search point */ + u8 iLevel /* Level for the new search point */ +){ + int i, j; + RtreeSearchPoint *pNew; + if( pCur->nPoint>=pCur->nPointAlloc ){ + int nNew = pCur->nPointAlloc*2 + 8; + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + if( pNew==0 ) return 0; + pCur->aPoint = pNew; + pCur->nPointAlloc = nNew; + } + i = pCur->nPoint++; + pNew = pCur->aPoint + i; + pNew->rScore = rScore; + pNew->iLevel = iLevel; + assert( iLevel<=RTREE_MAX_DEPTH ); + while( i>0 ){ + RtreeSearchPoint *pParent; + j = (i-1)/2; + pParent = pCur->aPoint + j; + if( rtreeSearchPointCompare(pNew, pParent)>=0 ) break; + rtreeSearchPointSwap(pCur, j, i); + i = j; + pNew = pParent; + } + return pNew; +} + +/* +** Allocate a new RtreeSearchPoint and return a pointer to it. Return +** NULL if malloc fails. +*/ +static RtreeSearchPoint *rtreeSearchPointNew( + RtreeCursor *pCur, /* The cursor */ + RtreeDValue rScore, /* Score for the new search point */ + u8 iLevel /* Level for the new search point */ +){ + RtreeSearchPoint *pNew, *pFirst; + pFirst = rtreeSearchPointFirst(pCur); + pCur->anQueue[iLevel]++; + if( pFirst==0 + || pFirst->rScore>rScore + || (pFirst->rScore==rScore && pFirst->iLevel>iLevel) + ){ + if( pCur->bPoint ){ + int ii; + pNew = rtreeEnqueue(pCur, rScore, iLevel); + if( pNew==0 ) return 0; + ii = (int)(pNew - pCur->aPoint) + 1; + assert( ii==1 ); + if( ALWAYS(iiaNode[ii]==0 ); + pCur->aNode[ii] = pCur->aNode[0]; + }else{ + nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]); + } + pCur->aNode[0] = 0; + *pNew = pCur->sPoint; + } + pCur->sPoint.rScore = rScore; + pCur->sPoint.iLevel = iLevel; + pCur->bPoint = 1; + return &pCur->sPoint; + }else{ + return rtreeEnqueue(pCur, rScore, iLevel); + } +} + +#if 0 +/* Tracing routines for the RtreeSearchPoint queue */ +static void tracePoint(RtreeSearchPoint *p, int idx, RtreeCursor *pCur){ + if( idx<0 ){ printf(" s"); }else{ printf("%2d", idx); } + printf(" %d.%05lld.%02d %g %d", + p->iLevel, p->id, p->iCell, p->rScore, p->eWithin + ); + idx++; + if( idxaNode[idx]); + }else{ + printf("\n"); + } +} +static void traceQueue(RtreeCursor *pCur, const char *zPrefix){ + int ii; + printf("=== %9s ", zPrefix); + if( pCur->bPoint ){ + tracePoint(&pCur->sPoint, -1, pCur); + } + for(ii=0; iinPoint; ii++){ + if( ii>0 || pCur->bPoint ) printf(" "); + tracePoint(&pCur->aPoint[ii], ii, pCur); + } +} +# define RTREE_QUEUE_TRACE(A,B) traceQueue(A,B) +#else +# define RTREE_QUEUE_TRACE(A,B) /* no-op */ +#endif + +/* Remove the search point with the lowest current score. +*/ +static void rtreeSearchPointPop(RtreeCursor *p){ + int i, j, k, n; + i = 1 - p->bPoint; + assert( i==0 || i==1 ); + if( p->aNode[i] ){ + nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); + p->aNode[i] = 0; + } + if( p->bPoint ){ + p->anQueue[p->sPoint.iLevel]--; + p->bPoint = 0; + }else if( ALWAYS(p->nPoint) ){ + p->anQueue[p->aPoint[0].iLevel]--; + n = --p->nPoint; + p->aPoint[0] = p->aPoint[n]; + if( naNode[1] = p->aNode[n+1]; + p->aNode[n+1] = 0; + } + i = 0; + while( (j = i*2+1)aPoint[k], &p->aPoint[j])<0 ){ + if( rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[i])<0 ){ + rtreeSearchPointSwap(p, i, k); + i = k; + }else{ + break; + } + }else{ + if( rtreeSearchPointCompare(&p->aPoint[j], &p->aPoint[i])<0 ){ + rtreeSearchPointSwap(p, i, j); + i = j; + }else{ + break; + } + } + } + } +} + + +/* +** Continue the search on cursor pCur until the front of the queue +** contains an entry suitable for returning as a result-set row, +** or until the RtreeSearchPoint queue is empty, indicating that the +** query has completed. +*/ +static int rtreeStepToLeaf(RtreeCursor *pCur){ + RtreeSearchPoint *p; + Rtree *pRtree = RTREE_OF_CURSOR(pCur); + RtreeNode *pNode; + int eWithin; + int rc = SQLITE_OK; + int nCell; + int nConstraint = pCur->nConstraint; + int ii; + int eInt; + RtreeSearchPoint x; + + eInt = pRtree->eCoordType==RTREE_COORD_INT32; + while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ + u8 *pCellData; + pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); + if( rc ) return rc; + nCell = NCELL(pNode); + assert( nCell<200 ); + pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); + while( p->iCellaConstraint + ii; + if( pConstraint->op>=RTREE_MATCH ){ + rc = rtreeCallbackConstraint(pConstraint, eInt, pCellData, p, + &rScore, &eWithin); + if( rc ) return rc; + }else if( p->iLevel==1 ){ + rtreeLeafConstraint(pConstraint, eInt, pCellData, &eWithin); + }else{ + rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); + } + if( eWithin==NOT_WITHIN ){ + p->iCell++; + pCellData += pRtree->nBytesPerCell; + break; + } + } + if( eWithin==NOT_WITHIN ) continue; + p->iCell++; + x.iLevel = p->iLevel - 1; + if( x.iLevel ){ + x.id = readInt64(pCellData); + for(ii=0; iinPoint; ii++){ + if( pCur->aPoint[ii].id==x.id ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + } + x.iCell = 0; + }else{ + x.id = p->id; + x.iCell = p->iCell - 1; + } + if( p->iCell>=nCell ){ + RTREE_QUEUE_TRACE(pCur, "POP-S:"); + rtreeSearchPointPop(pCur); + } + if( rScoreeWithin = (u8)eWithin; + p->id = x.id; + p->iCell = x.iCell; + RTREE_QUEUE_TRACE(pCur, "PUSH-S:"); + break; + } + if( p->iCell>=nCell ){ + RTREE_QUEUE_TRACE(pCur, "POP-Se:"); + rtreeSearchPointPop(pCur); + } + } + pCur->atEOF = p==0; + return SQLITE_OK; +} + +/* +** Rtree virtual table module xNext method. +*/ +static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + int rc = SQLITE_OK; + + /* Move to the next entry that matches the configured constraints. */ + RTREE_QUEUE_TRACE(pCsr, "POP-Nx:"); + if( pCsr->bAuxValid ){ + pCsr->bAuxValid = 0; + sqlite3_reset(pCsr->pReadAux); + } + rtreeSearchPointPop(pCsr); + rc = rtreeStepToLeaf(pCsr); + return rc; +} + +/* +** Rtree virtual table module xRowid method. +*/ +static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + if( rc==SQLITE_OK && ALWAYS(p) ){ + *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); + } + return rc; +} + +/* +** Rtree virtual table module xColumn method. +*/ +static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + Rtree *pRtree = (Rtree *)cur->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)cur; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + RtreeCoord c; + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + + if( rc ) return rc; + if( NEVER(p==0) ) return SQLITE_OK; + if( i==0 ){ + sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); + }else if( i<=pRtree->nDim2 ){ + nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c); +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + sqlite3_result_double(ctx, c.f); + }else +#endif + { + assert( pRtree->eCoordType==RTREE_COORD_INT32 ); + sqlite3_result_int(ctx, c.i); + } + }else{ + if( !pCsr->bAuxValid ){ + if( pCsr->pReadAux==0 ){ + rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0, + &pCsr->pReadAux, 0); + if( rc ) return rc; + } + sqlite3_bind_int64(pCsr->pReadAux, 1, + nodeGetRowid(pRtree, pNode, p->iCell)); + rc = sqlite3_step(pCsr->pReadAux); + if( rc==SQLITE_ROW ){ + pCsr->bAuxValid = 1; + }else{ + sqlite3_reset(pCsr->pReadAux); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; + } + } + sqlite3_result_value(ctx, + sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1)); + } + return SQLITE_OK; +} + +/* +** Use nodeAcquire() to obtain the leaf node containing the record with +** rowid iRowid. If successful, set *ppLeaf to point to the node and +** return SQLITE_OK. If there is no such record in the table, set +** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf +** to zero and return an SQLite error code. +*/ +static int findLeafNode( + Rtree *pRtree, /* RTree to search */ + i64 iRowid, /* The rowid searching for */ + RtreeNode **ppLeaf, /* Write the node here */ + sqlite3_int64 *piNode /* Write the node-id here */ +){ + int rc; + *ppLeaf = 0; + sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid); + if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){ + i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0); + if( piNode ) *piNode = iNode; + rc = nodeAcquire(pRtree, iNode, 0, ppLeaf); + sqlite3_reset(pRtree->pReadRowid); + }else{ + rc = sqlite3_reset(pRtree->pReadRowid); + } + return rc; +} + +/* +** This function is called to configure the RtreeConstraint object passed +** as the second argument for a MATCH constraint. The value passed as the +** first argument to this function is the right-hand operand to the MATCH +** operator. +*/ +static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ + RtreeMatchArg *pBlob, *pSrc; /* BLOB returned by geometry function */ + sqlite3_rtree_query_info *pInfo; /* Callback information */ + + pSrc = sqlite3_value_pointer(pValue, "RtreeMatchArg"); + if( pSrc==0 ) return SQLITE_ERROR; + pInfo = (sqlite3_rtree_query_info*) + sqlite3_malloc64( sizeof(*pInfo)+pSrc->iSize ); + if( !pInfo ) return SQLITE_NOMEM; + memset(pInfo, 0, sizeof(*pInfo)); + pBlob = (RtreeMatchArg*)&pInfo[1]; + memcpy(pBlob, pSrc, pSrc->iSize); + pInfo->pContext = pBlob->cb.pContext; + pInfo->nParam = pBlob->nParam; + pInfo->aParam = pBlob->aParam; + pInfo->apSqlParam = pBlob->apSqlParam; + + if( pBlob->cb.xGeom ){ + pCons->u.xGeom = pBlob->cb.xGeom; + }else{ + pCons->op = RTREE_QUERY; + pCons->u.xQueryFunc = pBlob->cb.xQueryFunc; + } + pCons->pInfo = pInfo; + return SQLITE_OK; +} + +/* +** Rtree virtual table module xFilter method. +*/ +static int rtreeFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + Rtree *pRtree = (Rtree *)pVtabCursor->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeNode *pRoot = 0; + int ii; + int rc = SQLITE_OK; + int iCell = 0; + + rtreeReference(pRtree); + + /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ + resetCursor(pCsr); + + pCsr->iStrategy = idxNum; + if( idxNum==1 ){ + /* Special case - lookup by rowid. */ + RtreeNode *pLeaf; /* Leaf on which the required cell resides */ + RtreeSearchPoint *p; /* Search point for the leaf */ + i64 iRowid = sqlite3_value_int64(argv[0]); + i64 iNode = 0; + int eType = sqlite3_value_numeric_type(argv[0]); + if( eType==SQLITE_INTEGER + || (eType==SQLITE_FLOAT && sqlite3_value_double(argv[0])==iRowid) + ){ + rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + }else{ + rc = SQLITE_OK; + pLeaf = 0; + } + if( rc==SQLITE_OK && pLeaf!=0 ){ + p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); + assert( p!=0 ); /* Always returns pCsr->sPoint */ + pCsr->aNode[0] = pLeaf; + p->id = iNode; + p->eWithin = PARTLY_WITHIN; + rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell); + p->iCell = (u8)iCell; + RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:"); + }else{ + pCsr->atEOF = 1; + } + }else{ + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. + */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + if( rc==SQLITE_OK && argc>0 ){ + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); + pCsr->nConstraint = argc; + if( !pCsr->aConstraint ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc); + memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1)); + assert( (idxStr==0 && argc==0) + || (idxStr && (int)strlen(idxStr)==argc*2) ); + for(ii=0; iiaConstraint[ii]; + int eType = sqlite3_value_numeric_type(argv[ii]); + p->op = idxStr[ii*2]; + p->iCoord = idxStr[ii*2+1]-'0'; + if( p->op>=RTREE_MATCH ){ + /* A MATCH operator. The right-hand-side must be a blob that + ** can be cast into an RtreeMatchArg object. One created using + ** an sqlite3_rtree_geometry_callback() SQL user function. + */ + rc = deserializeGeometry(argv[ii], p); + if( rc!=SQLITE_OK ){ + break; + } + p->pInfo->nCoord = pRtree->nDim2; + p->pInfo->anQueue = pCsr->anQueue; + p->pInfo->mxLevel = pRtree->iDepth + 1; + }else if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ +#ifdef SQLITE_RTREE_INT_ONLY + p->u.rValue = sqlite3_value_int64(argv[ii]); +#else + p->u.rValue = sqlite3_value_double(argv[ii]); +#endif + }else{ + p->u.rValue = RTREE_ZERO; + if( eType==SQLITE_NULL ){ + p->op = RTREE_FALSE; + }else if( p->op==RTREE_LT || p->op==RTREE_LE ){ + p->op = RTREE_TRUE; + }else{ + p->op = RTREE_FALSE; + } + } + } + } + } + if( rc==SQLITE_OK ){ + RtreeSearchPoint *pNew; + assert( pCsr->bPoint==0 ); /* Due to the resetCursor() call above */ + pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); + if( NEVER(pNew==0) ){ /* Because pCsr->bPoint was FALSE */ + return SQLITE_NOMEM; + } + pNew->id = 1; + pNew->iCell = 0; + pNew->eWithin = PARTLY_WITHIN; + assert( pCsr->bPoint==1 ); + pCsr->aNode[0] = pRoot; + pRoot = 0; + RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); + rc = rtreeStepToLeaf(pCsr); + } + } + + nodeRelease(pRtree, pRoot); + rtreeRelease(pRtree); + return rc; +} + +/* +** Rtree virtual table module xBestIndex method. There are three +** table scan strategies to choose from (in order from most to +** least desirable): +** +** idxNum idxStr Strategy +** ------------------------------------------------ +** 1 Unused Direct lookup by rowid. +** 2 See below R-tree query or full-table scan. +** ------------------------------------------------ +** +** If strategy 1 is used, then idxStr is not meaningful. If strategy +** 2 is used, idxStr is formatted to contain 2 bytes for each +** constraint used. The first two bytes of idxStr correspond to +** the constraint in sqlite3_index_info.aConstraintUsage[] with +** (argvIndex==1) etc. +** +** The first of each pair of bytes in idxStr identifies the constraint +** operator as follows: +** +** Operator Byte Value +** ---------------------- +** = 0x41 ('A') +** <= 0x42 ('B') +** < 0x43 ('C') +** >= 0x44 ('D') +** > 0x45 ('E') +** MATCH 0x46 ('F') +** ---------------------- +** +** The second of each pair of bytes identifies the coordinate column +** to which the constraint applies. The leftmost coordinate column +** is 'a', the second from the left 'b' etc. +*/ +static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + Rtree *pRtree = (Rtree*)tab; + int rc = SQLITE_OK; + int ii; + int bMatch = 0; /* True if there exists a MATCH constraint */ + i64 nRow; /* Estimated rows returned by this scan */ + + int iIdx = 0; + char zIdxStr[RTREE_MAX_DIMENSIONS*8+1]; + memset(zIdxStr, 0, sizeof(zIdxStr)); + + /* Check if there exists a MATCH constraint - even an unusable one. If there + ** is, do not consider the lookup-by-rowid plan as using such a plan would + ** require the VDBE to evaluate the MATCH constraint, which is not currently + ** possible. */ + for(ii=0; iinConstraint; ii++){ + if( pIdxInfo->aConstraint[ii].op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + bMatch = 1; + } + } + + assert( pIdxInfo->idxStr==0 ); + for(ii=0; iinConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; + + if( bMatch==0 && p->usable + && p->iColumn<=0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ + ){ + /* We have an equality constraint on the rowid. Use strategy 1. */ + int jj; + for(jj=0; jjaConstraintUsage[jj].argvIndex = 0; + pIdxInfo->aConstraintUsage[jj].omit = 0; + } + pIdxInfo->idxNum = 1; + pIdxInfo->aConstraintUsage[ii].argvIndex = 1; + pIdxInfo->aConstraintUsage[jj].omit = 1; + + /* This strategy involves a two rowid lookups on an B-Tree structures + ** and then a linear search of an R-Tree node. This should be + ** considered almost as quick as a direct rowid lookup (for which + ** sqlite uses an internal cost of 0.0). It is expected to return + ** a single row. + */ + pIdxInfo->estimatedCost = 30.0; + pIdxInfo->estimatedRows = 1; + pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; + return SQLITE_OK; + } + + if( p->usable + && ((p->iColumn>0 && p->iColumn<=pRtree->nDim2) + || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) + ){ + u8 op; + switch( p->op ){ + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; + default: op = 0; break; + } + if( op ){ + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; + } + } + } + + pIdxInfo->idxNum = 2; + pIdxInfo->needToFreeIdxStr = 1; + if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){ + return SQLITE_NOMEM; + } + + nRow = pRtree->nRowEst >> (iIdx/2); + pIdxInfo->estimatedCost = (double)6.0 * (double)nRow; + pIdxInfo->estimatedRows = nRow; + + return rc; +} + +/* +** Return the N-dimensional volumn of the cell stored in *p. +*/ +static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ + RtreeDValue area = (RtreeDValue)1; + assert( pRtree->nDim>=1 && pRtree->nDim<=5 ); +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + switch( pRtree->nDim ){ + case 5: area = p->aCoord[9].f - p->aCoord[8].f; + case 4: area *= p->aCoord[7].f - p->aCoord[6].f; + case 3: area *= p->aCoord[5].f - p->aCoord[4].f; + case 2: area *= p->aCoord[3].f - p->aCoord[2].f; + default: area *= p->aCoord[1].f - p->aCoord[0].f; + } + }else +#endif + { + switch( pRtree->nDim ){ + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; + } + } + return area; +} + +/* +** Return the margin length of cell p. The margin length is the sum +** of the objects size in each dimension. +*/ +static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){ + RtreeDValue margin = 0; + int ii = pRtree->nDim2 - 2; + do{ + margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])); + ii -= 2; + }while( ii>=0 ); + return margin; +} + +/* +** Store the union of cells p1 and p2 in p1. +*/ +static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ + int ii = 0; + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + do{ + p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f); + p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f); + ii += 2; + }while( iinDim2 ); + }else{ + do{ + p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i); + p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i); + ii += 2; + }while( iinDim2 ); + } +} + +/* +** Return true if the area covered by p2 is a subset of the area covered +** by p1. False otherwise. +*/ +static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ + int ii; + int isInt = (pRtree->eCoordType==RTREE_COORD_INT32); + for(ii=0; iinDim2; ii+=2){ + RtreeCoord *a1 = &p1->aCoord[ii]; + RtreeCoord *a2 = &p2->aCoord[ii]; + if( (!isInt && (a2[0].fa1[1].f)) + || ( isInt && (a2[0].ia1[1].i)) + ){ + return 0; + } + } + return 1; +} + +/* +** Return the amount cell p would grow by if it were unioned with pCell. +*/ +static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){ + RtreeDValue area; + RtreeCell cell; + memcpy(&cell, p, sizeof(RtreeCell)); + area = cellArea(pRtree, &cell); + cellUnion(pRtree, &cell, pCell); + return (cellArea(pRtree, &cell)-area); +} + +static RtreeDValue cellOverlap( + Rtree *pRtree, + RtreeCell *p, + RtreeCell *aCell, + int nCell +){ + int ii; + RtreeDValue overlap = RTREE_ZERO; + for(ii=0; iinDim2; jj+=2){ + RtreeDValue x1, x2; + x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj])); + x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1])); + if( x2iDepth-iHeight); ii++){ + int iCell; + sqlite3_int64 iBest = 0; + + RtreeDValue fMinGrowth = RTREE_ZERO; + RtreeDValue fMinArea = RTREE_ZERO; + + int nCell = NCELL(pNode); + RtreeCell cell; + RtreeNode *pChild = 0; + + RtreeCell *aCell = 0; + + /* Select the child node which will be enlarged the least if pCell + ** is inserted into it. Resolve ties by choosing the entry with + ** the smallest area. + */ + for(iCell=0; iCellpParent ){ + RtreeNode *pParent = p->pParent; + RtreeCell cell; + int iCell; + + cnt++; + if( NEVER(cnt>100) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + rc = nodeParentIndex(pRtree, p, &iCell); + if( NEVER(rc!=SQLITE_OK) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + + nodeGetCell(pRtree, pParent, iCell, &cell); + if( !cellContains(pRtree, &cell, pCell) ){ + cellUnion(pRtree, &cell, pCell); + nodeOverwriteCell(pRtree, pParent, &cell, iCell); + } + + p = pParent; + } + return SQLITE_OK; +} + +/* +** Write mapping (iRowid->iNode) to the _rowid table. +*/ +static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){ + sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid); + sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode); + sqlite3_step(pRtree->pWriteRowid); + return sqlite3_reset(pRtree->pWriteRowid); +} + +/* +** Write mapping (iNode->iPar) to the _parent table. +*/ +static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){ + sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode); + sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar); + sqlite3_step(pRtree->pWriteParent); + return sqlite3_reset(pRtree->pWriteParent); +} + +static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int); + + +/* +** Arguments aIdx, aDistance and aSpare all point to arrays of size +** nIdx. The aIdx array contains the set of integers from 0 to +** (nIdx-1) in no particular order. This function sorts the values +** in aIdx according to the indexed values in aDistance. For +** example, assuming the inputs: +** +** aIdx = { 0, 1, 2, 3 } +** aDistance = { 5.0, 2.0, 7.0, 6.0 } +** +** this function sets the aIdx array to contain: +** +** aIdx = { 0, 1, 2, 3 } +** +** The aSpare array is used as temporary working space by the +** sorting algorithm. +*/ +static void SortByDistance( + int *aIdx, + int nIdx, + RtreeDValue *aDistance, + int *aSpare +){ + if( nIdx>1 ){ + int iLeft = 0; + int iRight = 0; + + int nLeft = nIdx/2; + int nRight = nIdx-nLeft; + int *aLeft = aIdx; + int *aRight = &aIdx[nLeft]; + + SortByDistance(aLeft, nLeft, aDistance, aSpare); + SortByDistance(aRight, nRight, aDistance, aSpare); + + memcpy(aSpare, aLeft, sizeof(int)*nLeft); + aLeft = aSpare; + + while( iLeft1 ){ + + int iLeft = 0; + int iRight = 0; + + int nLeft = nIdx/2; + int nRight = nIdx-nLeft; + int *aLeft = aIdx; + int *aRight = &aIdx[nLeft]; + + SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare); + SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare); + + memcpy(aSpare, aLeft, sizeof(int)*nLeft); + aLeft = aSpare; + while( iLeftnDim+1)*(sizeof(int*)+nCell*sizeof(int)); + + aaSorted = (int **)sqlite3_malloc64(nByte); + if( !aaSorted ){ + return SQLITE_NOMEM; + } + + aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell]; + memset(aaSorted, 0, nByte); + for(ii=0; iinDim; ii++){ + int jj; + aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell]; + for(jj=0; jjnDim; ii++){ + RtreeDValue margin = RTREE_ZERO; + RtreeDValue fBestOverlap = RTREE_ZERO; + RtreeDValue fBestArea = RTREE_ZERO; + int iBestLeft = 0; + int nLeft; + + for( + nLeft=RTREE_MINCELLS(pRtree); + nLeft<=(nCell-RTREE_MINCELLS(pRtree)); + nLeft++ + ){ + RtreeCell left; + RtreeCell right; + int kk; + RtreeDValue overlap; + RtreeDValue area; + + memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell)); + memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell)); + for(kk=1; kk<(nCell-1); kk++){ + if( kk0 ){ + RtreeNode *pChild = nodeHashLookup(pRtree, iRowid); + RtreeNode *p; + for(p=pNode; p; p=p->pParent){ + if( p==pChild ) return SQLITE_CORRUPT_VTAB; + } + if( pChild ){ + nodeRelease(pRtree, pChild->pParent); + nodeReference(pNode); + pChild->pParent = pNode; + } + } + if( NEVER(pNode==0) ) return SQLITE_ERROR; + return xSetMapping(pRtree, iRowid, pNode->iNode); +} + +static int SplitNode( + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, + int iHeight +){ + int i; + int newCellIsRight = 0; + + int rc = SQLITE_OK; + int nCell = NCELL(pNode); + RtreeCell *aCell; + int *aiUsed; + + RtreeNode *pLeft = 0; + RtreeNode *pRight = 0; + + RtreeCell leftbbox; + RtreeCell rightbbox; + + /* Allocate an array and populate it with a copy of pCell and + ** all cells from node pLeft. Then zero the original node. + */ + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + if( !aCell ){ + rc = SQLITE_NOMEM; + goto splitnode_out; + } + aiUsed = (int *)&aCell[nCell+1]; + memset(aiUsed, 0, sizeof(int)*(nCell+1)); + for(i=0; iiNode==1 ){ + pRight = nodeNew(pRtree, pNode); + pLeft = nodeNew(pRtree, pNode); + pRtree->iDepth++; + pNode->isDirty = 1; + writeInt16(pNode->zData, pRtree->iDepth); + }else{ + pLeft = pNode; + pRight = nodeNew(pRtree, pLeft->pParent); + pLeft->nRef++; + } + + if( !pLeft || !pRight ){ + rc = SQLITE_NOMEM; + goto splitnode_out; + } + + memset(pLeft->zData, 0, pRtree->iNodeSize); + memset(pRight->zData, 0, pRtree->iNodeSize); + + rc = splitNodeStartree(pRtree, aCell, nCell, pLeft, pRight, + &leftbbox, &rightbbox); + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + + /* Ensure both child nodes have node numbers assigned to them by calling + ** nodeWrite(). Node pRight always needs a node number, as it was created + ** by nodeNew() above. But node pLeft sometimes already has a node number. + ** In this case avoid the all to nodeWrite(). + */ + if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight)) + || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft))) + ){ + goto splitnode_out; + } + + rightbbox.iRowid = pRight->iNode; + leftbbox.iRowid = pLeft->iNode; + + if( pNode->iNode==1 ){ + rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1); + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + }else{ + RtreeNode *pParent = pLeft->pParent; + int iCell; + rc = nodeParentIndex(pRtree, pLeft, &iCell); + if( ALWAYS(rc==SQLITE_OK) ){ + nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell); + rc = AdjustTree(pRtree, pParent, &leftbbox); + assert( rc==SQLITE_OK ); + } + if( NEVER(rc!=SQLITE_OK) ){ + goto splitnode_out; + } + } + if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){ + goto splitnode_out; + } + + for(i=0; iiRowid ){ + newCellIsRight = 1; + } + if( rc!=SQLITE_OK ){ + goto splitnode_out; + } + } + if( pNode->iNode==1 ){ + for(i=0; iiRowid, pLeft, iHeight); + } + + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pRight); + pRight = 0; + } + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pLeft); + pLeft = 0; + } + +splitnode_out: + nodeRelease(pRtree, pRight); + nodeRelease(pRtree, pLeft); + sqlite3_free(aCell); + return rc; +} + +/* +** If node pLeaf is not the root of the r-tree and its pParent pointer is +** still NULL, load all ancestor nodes of pLeaf into memory and populate +** the pLeaf->pParent chain all the way up to the root node. +** +** This operation is required when a row is deleted (or updated - an update +** is implemented as a delete followed by an insert). SQLite provides the +** rowid of the row to delete, which can be used to find the leaf on which +** the entry resides (argument pLeaf). Once the leaf is located, this +** function is called to determine its ancestry. +*/ +static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ + int rc = SQLITE_OK; + RtreeNode *pChild = pLeaf; + while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){ + int rc2 = SQLITE_OK; /* sqlite3_reset() return code */ + sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode); + rc = sqlite3_step(pRtree->pReadParent); + if( rc==SQLITE_ROW ){ + RtreeNode *pTest; /* Used to test for reference loops */ + i64 iNode; /* Node number of parent node */ + + /* Before setting pChild->pParent, test that we are not creating a + ** loop of references (as we would if, say, pChild==pParent). We don't + ** want to do this as it leads to a memory leak when trying to delete + ** the referenced counted node structures. + */ + iNode = sqlite3_column_int64(pRtree->pReadParent, 0); + for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent); + if( pTest==0 ){ + rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent); + } + } + rc = sqlite3_reset(pRtree->pReadParent); + if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK && !pChild->pParent ){ + RTREE_IS_CORRUPT(pRtree); + rc = SQLITE_CORRUPT_VTAB; + } + pChild = pChild->pParent; + } + return rc; +} + +static int deleteCell(Rtree *, RtreeNode *, int, int); + +static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ + int rc; + int rc2; + RtreeNode *pParent = 0; + int iCell; + + assert( pNode->nRef==1 ); + + /* Remove the entry in the parent cell. */ + rc = nodeParentIndex(pRtree, pNode, &iCell); + if( rc==SQLITE_OK ){ + pParent = pNode->pParent; + pNode->pParent = 0; + rc = deleteCell(pRtree, pParent, iCell, iHeight+1); + testcase( rc!=SQLITE_OK ); + } + rc2 = nodeRelease(pRtree, pParent); + if( rc==SQLITE_OK ){ + rc = rc2; + } + if( rc!=SQLITE_OK ){ + return rc; + } + + /* Remove the xxx_node entry. */ + sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode); + sqlite3_step(pRtree->pDeleteNode); + if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){ + return rc; + } + + /* Remove the xxx_parent entry. */ + sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode); + sqlite3_step(pRtree->pDeleteParent); + if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){ + return rc; + } + + /* Remove the node from the in-memory hash table and link it into + ** the Rtree.pDeleted list. Its contents will be re-inserted later on. + */ + nodeHashDelete(pRtree, pNode); + pNode->iNode = iHeight; + pNode->pNext = pRtree->pDeleted; + pNode->nRef++; + pRtree->pDeleted = pNode; + + return SQLITE_OK; +} + +static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ + RtreeNode *pParent = pNode->pParent; + int rc = SQLITE_OK; + if( pParent ){ + int ii; + int nCell = NCELL(pNode); + RtreeCell box; /* Bounding box for pNode */ + nodeGetCell(pRtree, pNode, 0, &box); + for(ii=1; iiiNode; + rc = nodeParentIndex(pRtree, pNode, &ii); + if( rc==SQLITE_OK ){ + nodeOverwriteCell(pRtree, pParent, &box, ii); + rc = fixBoundingBox(pRtree, pParent); + } + } + return rc; +} + +/* +** Delete the cell at index iCell of node pNode. After removing the +** cell, adjust the r-tree data structure if required. +*/ +static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ + RtreeNode *pParent; + int rc; + + if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){ + return rc; + } + + /* Remove the cell from the node. This call just moves bytes around + ** the in-memory node image, so it cannot fail. + */ + nodeDeleteCell(pRtree, pNode, iCell); + + /* If the node is not the tree root and now has less than the minimum + ** number of cells, remove it from the tree. Otherwise, update the + ** cell in the parent node so that it tightly contains the updated + ** node. + */ + pParent = pNode->pParent; + assert( pParent || pNode->iNode==1 ); + if( pParent ){ + if( NCELL(pNode)nDim; iDim++){ + aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]); + aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]); + } + } + for(iDim=0; iDimnDim; iDim++){ + aCenterCoord[iDim] = (aCenterCoord[iDim]/(nCell*(RtreeDValue)2)); + } + + for(ii=0; iinDim; iDim++){ + RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - + DCOORD(aCell[ii].aCoord[iDim*2])); + aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]); + } + } + + SortByDistance(aOrder, nCell, aDistance, aSpare); + nodeZero(pRtree, pNode); + + for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){ + RtreeCell *p = &aCell[aOrder[ii]]; + nodeInsertCell(pRtree, pNode, p); + if( p->iRowid==pCell->iRowid ){ + if( iHeight==0 ){ + rc = rowidWrite(pRtree, p->iRowid, pNode->iNode); + }else{ + rc = parentWrite(pRtree, p->iRowid, pNode->iNode); + } + } + } + if( rc==SQLITE_OK ){ + rc = fixBoundingBox(pRtree, pNode); + } + for(; rc==SQLITE_OK && iiiNode currently contains + ** the height of the sub-tree headed by the cell. + */ + RtreeNode *pInsert; + RtreeCell *p = &aCell[aOrder[ii]]; + rc = ChooseLeaf(pRtree, p, iHeight, &pInsert); + if( rc==SQLITE_OK ){ + int rc2; + rc = rtreeInsertCell(pRtree, pInsert, p, iHeight); + rc2 = nodeRelease(pRtree, pInsert); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + sqlite3_free(aCell); + return rc; +} + +/* +** Insert cell pCell into node pNode. Node pNode is the head of a +** subtree iHeight high (leaf nodes have iHeight==0). +*/ +static int rtreeInsertCell( + Rtree *pRtree, + RtreeNode *pNode, + RtreeCell *pCell, + int iHeight +){ + int rc = SQLITE_OK; + if( iHeight>0 ){ + RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid); + if( pChild ){ + nodeRelease(pRtree, pChild->pParent); + nodeReference(pNode); + pChild->pParent = pNode; + } + } + if( nodeInsertCell(pRtree, pNode, pCell) ){ + if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){ + rc = SplitNode(pRtree, pNode, pCell, iHeight); + }else{ + pRtree->iReinsertHeight = iHeight; + rc = Reinsert(pRtree, pNode, pCell, iHeight); + } + }else{ + rc = AdjustTree(pRtree, pNode, pCell); + if( ALWAYS(rc==SQLITE_OK) ){ + if( iHeight==0 ){ + rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode); + }else{ + rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode); + } + } + } + return rc; +} + +static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){ + int ii; + int rc = SQLITE_OK; + int nCell = NCELL(pNode); + + for(ii=0; rc==SQLITE_OK && iiiNode currently contains + ** the height of the sub-tree headed by the cell. + */ + rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert); + if( rc==SQLITE_OK ){ + int rc2; + rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode); + rc2 = nodeRelease(pRtree, pInsert); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + return rc; +} + +/* +** Select a currently unused rowid for a new r-tree record. +*/ +static int rtreeNewRowid(Rtree *pRtree, i64 *piRowid){ + int rc; + sqlite3_bind_null(pRtree->pWriteRowid, 1); + sqlite3_bind_null(pRtree->pWriteRowid, 2); + sqlite3_step(pRtree->pWriteRowid); + rc = sqlite3_reset(pRtree->pWriteRowid); + *piRowid = sqlite3_last_insert_rowid(pRtree->db); + return rc; +} + +/* +** Remove the entry with rowid=iDelete from the r-tree structure. +*/ +static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ + int rc; /* Return code */ + RtreeNode *pLeaf = 0; /* Leaf node containing record iDelete */ + int iCell; /* Index of iDelete cell in pLeaf */ + RtreeNode *pRoot = 0; /* Root node of rtree structure */ + + + /* Obtain a reference to the root node to initialize Rtree.iDepth */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + + /* Obtain a reference to the leaf node that contains the entry + ** about to be deleted. + */ + if( rc==SQLITE_OK ){ + rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); + } + +#ifdef CORRUPT_DB + assert( pLeaf!=0 || rc!=SQLITE_OK || CORRUPT_DB ); +#endif + + /* Delete the cell in question from the leaf node. */ + if( rc==SQLITE_OK && pLeaf ){ + int rc2; + rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); + if( rc==SQLITE_OK ){ + rc = deleteCell(pRtree, pLeaf, iCell, 0); + } + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + + /* Delete the corresponding entry in the _rowid table. */ + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete); + sqlite3_step(pRtree->pDeleteRowid); + rc = sqlite3_reset(pRtree->pDeleteRowid); + } + + /* Check if the root node now has exactly one child. If so, remove + ** it, schedule the contents of the child for reinsertion and + ** reduce the tree height by one. + ** + ** This is equivalent to copying the contents of the child into + ** the root node (the operation that Gutman's paper says to perform + ** in this scenario). + */ + if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){ + int rc2; + RtreeNode *pChild = 0; + i64 iChild = nodeGetRowid(pRtree, pRoot, 0); + rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); /* tag-20210916a */ + if( rc==SQLITE_OK ){ + rc = removeNode(pRtree, pChild, pRtree->iDepth-1); + } + rc2 = nodeRelease(pRtree, pChild); + if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK ){ + pRtree->iDepth--; + writeInt16(pRoot->zData, pRtree->iDepth); + pRoot->isDirty = 1; + } + } + + /* Re-insert the contents of any underfull nodes removed from the tree. */ + for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){ + if( rc==SQLITE_OK ){ + rc = reinsertNodeContent(pRtree, pLeaf); + } + pRtree->pDeleted = pLeaf->pNext; + pRtree->nNodeRef--; + sqlite3_free(pLeaf); + } + + /* Release the reference to the root node. */ + if( rc==SQLITE_OK ){ + rc = nodeRelease(pRtree, pRoot); + }else{ + nodeRelease(pRtree, pRoot); + } + + return rc; +} + +/* +** Rounding constants for float->double conversion. +*/ +#define RNDTOWARDS (1.0 - 1.0/8388608.0) /* Round towards zero */ +#define RNDAWAY (1.0 + 1.0/8388608.0) /* Round away from zero */ + +#if !defined(SQLITE_RTREE_INT_ONLY) +/* +** Convert an sqlite3_value into an RtreeValue (presumably a float) +** while taking care to round toward negative or positive, respectively. +*/ +static RtreeValue rtreeValueDown(sqlite3_value *v){ + double d = sqlite3_value_double(v); + float f = (float)d; + if( f>d ){ + f = (float)(d*(d<0 ? RNDAWAY : RNDTOWARDS)); + } + return f; +} +static RtreeValue rtreeValueUp(sqlite3_value *v){ + double d = sqlite3_value_double(v); + float f = (float)d; + if( fbase.zErrMsg) to an appropriate value and returns +** SQLITE_CONSTRAINT. +** +** Parameter iCol is the index of the leftmost column involved in the +** constraint failure. If it is 0, then the constraint that failed is +** the unique constraint on the id column. Otherwise, it is the rtree +** (c1<=c2) constraint on columns iCol and iCol+1 that has failed. +** +** If an OOM occurs, SQLITE_NOMEM is returned instead of SQLITE_CONSTRAINT. +*/ +static int rtreeConstraintError(Rtree *pRtree, int iCol){ + sqlite3_stmt *pStmt = 0; + char *zSql; + int rc; + + assert( iCol==0 || iCol%2 ); + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", pRtree->zDb, pRtree->zName); + if( zSql ){ + rc = sqlite3_prepare_v2(pRtree->db, zSql, -1, &pStmt, 0); + }else{ + rc = SQLITE_NOMEM; + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + if( iCol==0 ){ + const char *zCol = sqlite3_column_name(pStmt, 0); + pRtree->base.zErrMsg = sqlite3_mprintf( + "UNIQUE constraint failed: %s.%s", pRtree->zName, zCol + ); + }else{ + const char *zCol1 = sqlite3_column_name(pStmt, iCol); + const char *zCol2 = sqlite3_column_name(pStmt, iCol+1); + pRtree->base.zErrMsg = sqlite3_mprintf( + "rtree constraint failed: %s.(%s<=%s)", pRtree->zName, zCol1, zCol2 + ); + } + } + + sqlite3_finalize(pStmt); + return (rc==SQLITE_OK ? SQLITE_CONSTRAINT : rc); +} + + + +/* +** The xUpdate method for rtree module virtual tables. +*/ +static int rtreeUpdate( + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **aData, + sqlite_int64 *pRowid +){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_OK; + RtreeCell cell; /* New cell to insert if nData>1 */ + int bHaveRowid = 0; /* Set to 1 after new rowid is determined */ + + if( pRtree->nNodeRef ){ + /* Unable to write to the btree while another cursor is reading from it, + ** since the write might do a rebalance which would disrupt the read + ** cursor. */ + return SQLITE_LOCKED_VTAB; + } + rtreeReference(pRtree); + assert(nData>=1); + + cell.iRowid = 0; /* Used only to suppress a compiler warning */ + + /* Constraint handling. A write operation on an r-tree table may return + ** SQLITE_CONSTRAINT for two reasons: + ** + ** 1. A duplicate rowid value, or + ** 2. The supplied data violates the "x2>=x1" constraint. + ** + ** In the first case, if the conflict-handling mode is REPLACE, then + ** the conflicting row can be removed before proceeding. In the second + ** case, SQLITE_CONSTRAINT must be returned regardless of the + ** conflict-handling mode specified by the user. + */ + if( nData>1 ){ + int ii; + int nn = nData - 4; + + if( nn > pRtree->nDim2 ) nn = pRtree->nDim2; + /* Populate the cell.aCoord[] array. The first coordinate is aData[3]. + ** + ** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared + ** with "column" that are interpreted as table constraints. + ** Example: CREATE VIRTUAL TABLE bad USING rtree(x,y,CHECK(y>5)); + ** This problem was discovered after years of use, so we silently ignore + ** these kinds of misdeclared tables to avoid breaking any legacy. + */ + +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + for(ii=0; iicell.aCoord[ii+1].f ){ + rc = rtreeConstraintError(pRtree, ii+1); + goto constraint; + } + } + }else +#endif + { + for(ii=0; iicell.aCoord[ii+1].i ){ + rc = rtreeConstraintError(pRtree, ii+1); + goto constraint; + } + } + } + + /* If a rowid value was supplied, check if it is already present in + ** the table. If so, the constraint has failed. */ + if( sqlite3_value_type(aData[2])!=SQLITE_NULL ){ + cell.iRowid = sqlite3_value_int64(aData[2]); + if( sqlite3_value_type(aData[0])==SQLITE_NULL + || sqlite3_value_int64(aData[0])!=cell.iRowid + ){ + int steprc; + sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid); + steprc = sqlite3_step(pRtree->pReadRowid); + rc = sqlite3_reset(pRtree->pReadRowid); + if( SQLITE_ROW==steprc ){ + if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){ + rc = rtreeDeleteRowid(pRtree, cell.iRowid); + }else{ + rc = rtreeConstraintError(pRtree, 0); + goto constraint; + } + } + } + bHaveRowid = 1; + } + } + + /* If aData[0] is not an SQL NULL value, it is the rowid of a + ** record to delete from the r-tree table. The following block does + ** just that. + */ + if( sqlite3_value_type(aData[0])!=SQLITE_NULL ){ + rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(aData[0])); + } + + /* If the aData[] array contains more than one element, elements + ** (aData[2]..aData[argc-1]) contain a new record to insert into + ** the r-tree structure. + */ + if( rc==SQLITE_OK && nData>1 ){ + /* Insert the new record into the r-tree */ + RtreeNode *pLeaf = 0; + + /* Figure out the rowid of the new row. */ + if( bHaveRowid==0 ){ + rc = rtreeNewRowid(pRtree, &cell.iRowid); + } + *pRowid = cell.iRowid; + + if( rc==SQLITE_OK ){ + rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); + } + if( rc==SQLITE_OK ){ + int rc2; + pRtree->iReinsertHeight = -1; + rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + if( rc==SQLITE_OK && pRtree->nAux ){ + sqlite3_stmt *pUp = pRtree->pWriteAux; + int jj; + sqlite3_bind_int64(pUp, 1, *pRowid); + for(jj=0; jjnAux; jj++){ + sqlite3_bind_value(pUp, jj+2, aData[pRtree->nDim2+3+jj]); + } + sqlite3_step(pUp); + rc = sqlite3_reset(pUp); + } + } + +constraint: + rtreeRelease(pRtree); + return rc; +} + +/* +** Called when a transaction starts. +*/ +static int rtreeBeginTransaction(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + assert( pRtree->inWrTrans==0 ); + pRtree->inWrTrans++; + return SQLITE_OK; +} + +/* +** Called when a transaction completes (either by COMMIT or ROLLBACK). +** The sqlite3_blob object should be released at this point. +*/ +static int rtreeEndTransaction(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + pRtree->inWrTrans = 0; + nodeBlobReset(pRtree); + return SQLITE_OK; +} + +/* +** The xRename method for rtree module virtual tables. +*/ +static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_NOMEM; + char *zSql = sqlite3_mprintf( + "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";" + "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";" + "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";" + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + , pRtree->zDb, pRtree->zName, zNewName + ); + if( zSql ){ + nodeBlobReset(pRtree); + rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + } + return rc; +} + +/* +** The xSavepoint method. +** +** This module does not need to do anything to support savepoints. However, +** it uses this hook to close any open blob handle. This is done because a +** DROP TABLE command - which fortunately always opens a savepoint - cannot +** succeed if there are any open blob handles. i.e. if the blob handle were +** not closed here, the following would fail: +** +** BEGIN; +** INSERT INTO rtree... +** DROP TABLE ; -- Would fail with SQLITE_LOCKED +** COMMIT; +*/ +static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){ + Rtree *pRtree = (Rtree *)pVtab; + u8 iwt = pRtree->inWrTrans; + UNUSED_PARAMETER(iSavepoint); + pRtree->inWrTrans = 0; + nodeBlobReset(pRtree); + pRtree->inWrTrans = iwt; + return SQLITE_OK; +} + +/* +** This function populates the pRtree->nRowEst variable with an estimate +** of the number of rows in the virtual table. If possible, this is based +** on sqlite_stat1 data. Otherwise, use RTREE_DEFAULT_ROWEST. +*/ +static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ + const char *zFmt = "SELECT stat FROM %Q.sqlite_stat1 WHERE tbl = '%q_rowid'"; + char *zSql; + sqlite3_stmt *p; + int rc; + i64 nRow = RTREE_MIN_ROWEST; + + rc = sqlite3_table_column_metadata( + db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0 + ); + if( rc!=SQLITE_OK ){ + pRtree->nRowEst = RTREE_DEFAULT_ROWEST; + return rc==SQLITE_ERROR ? SQLITE_OK : rc; + } + zSql = sqlite3_mprintf(zFmt, pRtree->zDb, pRtree->zName); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(db, zSql, -1, &p, 0); + if( rc==SQLITE_OK ){ + if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0); + rc = sqlite3_finalize(p); + } + sqlite3_free(zSql); + } + pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST); + return rc; +} + + +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int rtreeShadowName(const char *zName){ + static const char *azName[] = { + "node", "parent", "rowid" + }; + unsigned int i; + for(i=0; idb = db; + + if( isCreate ){ + char *zCreate; + sqlite3_str *p = sqlite3_str_new(db); + int ii; + sqlite3_str_appendf(p, + "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno", + zDb, zPrefix); + for(ii=0; iinAux; ii++){ + sqlite3_str_appendf(p,",a%d",ii); + } + sqlite3_str_appendf(p, + ");CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY,data);", + zDb, zPrefix); + sqlite3_str_appendf(p, + "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,parentnode);", + zDb, zPrefix); + sqlite3_str_appendf(p, + "INSERT INTO \"%w\".\"%w_node\"VALUES(1,zeroblob(%d))", + zDb, zPrefix, pRtree->iNodeSize); + zCreate = sqlite3_str_finish(p); + if( !zCreate ){ + return SQLITE_NOMEM; + } + rc = sqlite3_exec(db, zCreate, 0, 0, 0); + sqlite3_free(zCreate); + if( rc!=SQLITE_OK ){ + return rc; + } + } + + appStmt[0] = &pRtree->pWriteNode; + appStmt[1] = &pRtree->pDeleteNode; + appStmt[2] = &pRtree->pReadRowid; + appStmt[3] = &pRtree->pWriteRowid; + appStmt[4] = &pRtree->pDeleteRowid; + appStmt[5] = &pRtree->pReadParent; + appStmt[6] = &pRtree->pWriteParent; + appStmt[7] = &pRtree->pDeleteParent; + + rc = rtreeQueryStat1(db, pRtree); + for(i=0; inAux==0 ){ + zFormat = azSql[i]; + }else { + /* An UPSERT is very slightly slower than REPLACE, but it is needed + ** if there are auxiliary columns */ + zFormat = "INSERT INTO\"%w\".\"%w_rowid\"(rowid,nodeno)VALUES(?1,?2)" + "ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno"; + } + zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); + if( zSql ){ + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); + }else{ + rc = SQLITE_NOMEM; + } + sqlite3_free(zSql); + } + if( pRtree->nAux ){ + pRtree->zReadAuxSql = sqlite3_mprintf( + "SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1", + zDb, zPrefix); + if( pRtree->zReadAuxSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_str *p = sqlite3_str_new(db); + int ii; + char *zSql; + sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix); + for(ii=0; iinAux; ii++){ + if( ii ) sqlite3_str_append(p, ",", 1); +#ifdef SQLITE_ENABLE_GEOPOLY + if( iinAuxNotNull ){ + sqlite3_str_appendf(p,"a%d=coalesce(?%d,a%d)",ii,ii+2,ii); + }else +#endif + { + sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2); + } + } + sqlite3_str_appendf(p, " WHERE rowid=?1"); + zSql = sqlite3_str_finish(p); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); + sqlite3_free(zSql); + } + } + } + + return rc; +} + +/* +** The second argument to this function contains the text of an SQL statement +** that returns a single integer value. The statement is compiled and executed +** using database connection db. If successful, the integer value returned +** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error +** code is returned and the value of *piVal after returning is not defined. +*/ +static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){ + int rc = SQLITE_NOMEM; + if( zSql ){ + sqlite3_stmt *pStmt = 0; + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + *piVal = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_finalize(pStmt); + } + } + return rc; +} + +/* +** This function is called from within the xConnect() or xCreate() method to +** determine the node-size used by the rtree table being created or connected +** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned. +** Otherwise, an SQLite error code is returned. +** +** If this function is being called as part of an xConnect(), then the rtree +** table already exists. In this case the node-size is determined by inspecting +** the root node of the tree. +** +** Otherwise, for an xCreate(), use 64 bytes less than the database page-size. +** This ensures that each node is stored on a single database page. If the +** database page-size is so large that more than RTREE_MAXCELLS entries +** would fit in a single node, use a smaller node-size. +*/ +static int getNodeSize( + sqlite3 *db, /* Database handle */ + Rtree *pRtree, /* Rtree handle */ + int isCreate, /* True for xCreate, false for xConnect */ + char **pzErr /* OUT: Error message, if any */ +){ + int rc; + char *zSql; + if( isCreate ){ + int iPageSize = 0; + zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb); + rc = getIntFromStmt(db, zSql, &iPageSize); + if( rc==SQLITE_OK ){ + pRtree->iNodeSize = iPageSize-64; + if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)iNodeSize ){ + pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + }else{ + zSql = sqlite3_mprintf( + "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1", + pRtree->zDb, pRtree->zName + ); + rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize); + if( rc!=SQLITE_OK ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + }else if( pRtree->iNodeSize<(512-64) ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", + pRtree->zName); + } + } + + sqlite3_free(zSql); + return rc; +} + +/* +** Return the length of a token +*/ +static int rtreeTokenLength(const char *z){ + int dummy = 0; + return sqlite3GetToken((const unsigned char*)z,&dummy); +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the r-tree virtual table. +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> column names... +*/ +static int rtreeInit( + sqlite3 *db, /* Database connection */ + void *pAux, /* One of the RTREE_COORD_* constants */ + int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */ + sqlite3_vtab **ppVtab, /* OUT: New virtual table */ + char **pzErr, /* OUT: Error message, if any */ + int isCreate /* True for xCreate, false for xConnect */ +){ + int rc = SQLITE_OK; + Rtree *pRtree; + int nDb; /* Length of string argv[1] */ + int nName; /* Length of string argv[2] */ + int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32); + sqlite3_str *pSql; + char *zSql; + int ii = 4; + int iErr; + + const char *aErrMsg[] = { + 0, /* 0 */ + "Wrong number of columns for an rtree table", /* 1 */ + "Too few columns for an rtree table", /* 2 */ + "Too many columns for an rtree table", /* 3 */ + "Auxiliary rtree columns must be last" /* 4 */ + }; + + assert( RTREE_MAX_AUX_COLUMN<256 ); /* Aux columns counted by a u8 */ + if( argc<6 || argc>RTREE_MAX_AUX_COLUMN+3 ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[2 + (argc>=6)]); + return SQLITE_ERROR; + } + + sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Allocate the sqlite3_vtab structure */ + nDb = (int)strlen(argv[1]); + nName = (int)strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); + if( !pRtree ){ + return SQLITE_NOMEM; + } + memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + pRtree->nBusy = 1; + pRtree->base.pModule = &rtreeModule; + pRtree->zDb = (char *)&pRtree[1]; + pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->eCoordType = (u8)eCoordType; + memcpy(pRtree->zDb, argv[1], nDb); + memcpy(pRtree->zName, argv[2], nName); + + + /* Create/Connect to the underlying relational database schema. If + ** that is successful, call sqlite3_declare_vtab() to configure + ** the r-tree table schema. + */ + pSql = sqlite3_str_new(db); + sqlite3_str_appendf(pSql, "CREATE TABLE x(%.*s INT", + rtreeTokenLength(argv[3]), argv[3]); + for(ii=4; iinAux++; + sqlite3_str_appendf(pSql, ",%.*s", rtreeTokenLength(zArg+1), zArg+1); + }else if( pRtree->nAux>0 ){ + break; + }else{ + static const char *azFormat[] = {",%.*s REAL", ",%.*s INT"}; + pRtree->nDim2++; + sqlite3_str_appendf(pSql, azFormat[eCoordType], + rtreeTokenLength(zArg), zArg); + } + } + sqlite3_str_appendf(pSql, ");"); + zSql = sqlite3_str_finish(pSql); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else if( iinDim = pRtree->nDim2/2; + if( pRtree->nDim<1 ){ + iErr = 2; + }else if( pRtree->nDim2>RTREE_MAX_DIMENSIONS*2 ){ + iErr = 3; + }else if( pRtree->nDim2 % 2 ){ + iErr = 1; + }else{ + iErr = 0; + } + if( iErr ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]); + goto rtreeInit_fail; + } + pRtree->nBytesPerCell = 8 + pRtree->nDim2*4; + + /* Figure out the node size to use. */ + rc = getNodeSize(db, pRtree, isCreate, pzErr); + if( rc ) goto rtreeInit_fail; + rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); + if( rc ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + goto rtreeInit_fail; + } + + *ppVtab = (sqlite3_vtab *)pRtree; + return SQLITE_OK; + +rtreeInit_fail: + if( rc==SQLITE_OK ) rc = SQLITE_ERROR; + assert( *ppVtab==0 ); + assert( pRtree->nBusy==1 ); + rtreeRelease(pRtree); + return rc; +} + + +/* +** Implementation of a scalar function that decodes r-tree nodes to +** human readable strings. This can be used for debugging and analysis. +** +** The scalar function takes two arguments: (1) the number of dimensions +** to the rtree (between 1 and 5, inclusive) and (2) a blob of data containing +** an r-tree node. For a two-dimensional r-tree structure called "rt", to +** deserialize all nodes, a statement like: +** +** SELECT rtreenode(2, data) FROM rt_node; +** +** The human readable string takes the form of a Tcl list with one +** entry for each cell in the r-tree node. Each entry is itself a +** list, containing the 8-byte rowid/pageno followed by the +** *2 coordinates. +*/ +static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ + RtreeNode node; + Rtree tree; + int ii; + int nData; + int errCode; + sqlite3_str *pOut; + + UNUSED_PARAMETER(nArg); + memset(&node, 0, sizeof(RtreeNode)); + memset(&tree, 0, sizeof(Rtree)); + tree.nDim = (u8)sqlite3_value_int(apArg[0]); + if( tree.nDim<1 || tree.nDim>5 ) return; + tree.nDim2 = tree.nDim*2; + tree.nBytesPerCell = 8 + 8 * tree.nDim; + node.zData = (u8 *)sqlite3_value_blob(apArg[1]); + if( node.zData==0 ) return; + nData = sqlite3_value_bytes(apArg[1]); + if( nData<4 ) return; + if( nData0 ) sqlite3_str_append(pOut, " ", 1); + sqlite3_str_appendf(pOut, "{%lld", cell.iRowid); + for(jj=0; jjrc==SQLITE_OK ) pCheck->rc = rc; +} + +/* +** The second and subsequent arguments to this function are a format string +** and printf style arguments. This function formats the string and attempts +** to compile it as an SQL statement. +** +** If successful, a pointer to the new SQL statement is returned. Otherwise, +** NULL is returned and an error code left in RtreeCheck.rc. +*/ +static sqlite3_stmt *rtreeCheckPrepare( + RtreeCheck *pCheck, /* RtreeCheck object */ + const char *zFmt, ... /* Format string and trailing args */ +){ + va_list ap; + char *z; + sqlite3_stmt *pRet = 0; + + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + + if( pCheck->rc==SQLITE_OK ){ + if( z==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + pCheck->rc = sqlite3_prepare_v2(pCheck->db, z, -1, &pRet, 0); + } + } + + sqlite3_free(z); + va_end(ap); + return pRet; +} + +/* +** The second and subsequent arguments to this function are a printf() +** style format string and arguments. This function formats the string and +** appends it to the report being accumuated in pCheck. +*/ +static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + if( pCheck->rc==SQLITE_OK && pCheck->nErrrc = SQLITE_NOMEM; + }else{ + pCheck->zReport = sqlite3_mprintf("%z%s%z", + pCheck->zReport, (pCheck->zReport ? "\n" : ""), z + ); + if( pCheck->zReport==0 ){ + pCheck->rc = SQLITE_NOMEM; + } + } + pCheck->nErr++; + } + va_end(ap); +} + +/* +** This function is a no-op if there is already an error code stored +** in the RtreeCheck object indicated by the first argument. NULL is +** returned in this case. +** +** Otherwise, the contents of rtree table node iNode are loaded from +** the database and copied into a buffer obtained from sqlite3_malloc(). +** If no error occurs, a pointer to the buffer is returned and (*pnNode) +** is set to the size of the buffer in bytes. +** +** Or, if an error does occur, NULL is returned and an error code left +** in the RtreeCheck object. The final value of *pnNode is undefined in +** this case. +*/ +static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ + u8 *pRet = 0; /* Return value */ + + if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ + pCheck->pGetNode = rtreeCheckPrepare(pCheck, + "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", + pCheck->zDb, pCheck->zTab + ); + } + + if( pCheck->rc==SQLITE_OK ){ + sqlite3_bind_int64(pCheck->pGetNode, 1, iNode); + if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ + int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); + const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); + pRet = sqlite3_malloc64(nNode); + if( pRet==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + memcpy(pRet, pNode, nNode); + *pnNode = nNode; + } + } + rtreeCheckReset(pCheck, pCheck->pGetNode); + if( pCheck->rc==SQLITE_OK && pRet==0 ){ + rtreeCheckAppendMsg(pCheck, "Node %lld missing from database", iNode); + } + } + + return pRet; +} + +/* +** This function is used to check that the %_parent (if bLeaf==0) or %_rowid +** (if bLeaf==1) table contains a specified entry. The schemas of the +** two tables are: +** +** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) +** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...) +** +** In both cases, this function checks that there exists an entry with +** IPK value iKey and the second column set to iVal. +** +*/ +static void rtreeCheckMapping( + RtreeCheck *pCheck, /* RtreeCheck object */ + int bLeaf, /* True for a leaf cell, false for interior */ + i64 iKey, /* Key for mapping */ + i64 iVal /* Expected value for mapping */ +){ + int rc; + sqlite3_stmt *pStmt; + const char *azSql[2] = { + "SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1", + "SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1" + }; + + assert( bLeaf==0 || bLeaf==1 ); + if( pCheck->aCheckMapping[bLeaf]==0 ){ + pCheck->aCheckMapping[bLeaf] = rtreeCheckPrepare(pCheck, + azSql[bLeaf], pCheck->zDb, pCheck->zTab + ); + } + if( pCheck->rc!=SQLITE_OK ) return; + + pStmt = pCheck->aCheckMapping[bLeaf]; + sqlite3_bind_int64(pStmt, 1, iKey); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_DONE ){ + rtreeCheckAppendMsg(pCheck, "Mapping (%lld -> %lld) missing from %s table", + iKey, iVal, (bLeaf ? "%_rowid" : "%_parent") + ); + }else if( rc==SQLITE_ROW ){ + i64 ii = sqlite3_column_int64(pStmt, 0); + if( ii!=iVal ){ + rtreeCheckAppendMsg(pCheck, + "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)", + iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), iKey, iVal + ); + } + } + rtreeCheckReset(pCheck, pStmt); +} + +/* +** Argument pCell points to an array of coordinates stored on an rtree page. +** This function checks that the coordinates are internally consistent (no +** x1>x2 conditions) and adds an error message to the RtreeCheck object +** if they are not. +** +** Additionally, if pParent is not NULL, then it is assumed to point to +** the array of coordinates on the parent page that bound the page +** containing pCell. In this case it is also verified that the two +** sets of coordinates are mutually consistent and an error message added +** to the RtreeCheck object if they are not. +*/ +static void rtreeCheckCellCoord( + RtreeCheck *pCheck, + i64 iNode, /* Node id to use in error messages */ + int iCell, /* Cell number to use in error messages */ + u8 *pCell, /* Pointer to cell coordinates */ + u8 *pParent /* Pointer to parent coordinates */ +){ + RtreeCoord c1, c2; + RtreeCoord p1, p2; + int i; + + for(i=0; inDim; i++){ + readCoord(&pCell[4*2*i], &c1); + readCoord(&pCell[4*(2*i + 1)], &c2); + + /* printf("%e, %e\n", c1.u.f, c2.u.f); */ + if( pCheck->bInt ? c1.i>c2.i : c1.f>c2.f ){ + rtreeCheckAppendMsg(pCheck, + "Dimension %d of cell %d on node %lld is corrupt", i, iCell, iNode + ); + } + + if( pParent ){ + readCoord(&pParent[4*2*i], &p1); + readCoord(&pParent[4*(2*i + 1)], &p2); + + if( (pCheck->bInt ? c1.ibInt ? c2.i>p2.i : c2.f>p2.f) + ){ + rtreeCheckAppendMsg(pCheck, + "Dimension %d of cell %d on node %lld is corrupt relative to parent" + , i, iCell, iNode + ); + } + } + } +} + +/* +** Run rtreecheck() checks on node iNode, which is at depth iDepth within +** the r-tree structure. Argument aParent points to the array of coordinates +** that bound node iNode on the parent node. +** +** If any problems are discovered, an error message is appended to the +** report accumulated in the RtreeCheck object. +*/ +static void rtreeCheckNode( + RtreeCheck *pCheck, + int iDepth, /* Depth of iNode (0==leaf) */ + u8 *aParent, /* Buffer containing parent coords */ + i64 iNode /* Node to check */ +){ + u8 *aNode = 0; + int nNode = 0; + + assert( iNode==1 || aParent!=0 ); + assert( pCheck->nDim>0 ); + + aNode = rtreeCheckGetNode(pCheck, iNode, &nNode); + if( aNode ){ + if( nNode<4 ){ + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small (%d bytes)", iNode, nNode + ); + }else{ + int nCell; /* Number of cells on page */ + int i; /* Used to iterate through cells */ + if( aParent==0 ){ + iDepth = readInt16(aNode); + if( iDepth>RTREE_MAX_DEPTH ){ + rtreeCheckAppendMsg(pCheck, "Rtree depth out of range (%d)", iDepth); + sqlite3_free(aNode); + return; + } + } + nCell = readInt16(&aNode[2]); + if( (4 + nCell*(8 + pCheck->nDim*2*4))>nNode ){ + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small for cell count of %d (%d bytes)", + iNode, nCell, nNode + ); + }else{ + for(i=0; inDim*2*4)]; + i64 iVal = readInt64(pCell); + rtreeCheckCellCoord(pCheck, iNode, i, &pCell[8], aParent); + + if( iDepth>0 ){ + rtreeCheckMapping(pCheck, 0, iVal, iNode); + rtreeCheckNode(pCheck, iDepth-1, &pCell[8], iVal); + pCheck->nNonLeaf++; + }else{ + rtreeCheckMapping(pCheck, 1, iVal, iNode); + pCheck->nLeaf++; + } + } + } + } + sqlite3_free(aNode); + } +} + +/* +** The second argument to this function must be either "_rowid" or +** "_parent". This function checks that the number of entries in the +** %_rowid or %_parent table is exactly nExpect. If not, it adds +** an error message to the report in the RtreeCheck object indicated +** by the first argument. +*/ +static void rtreeCheckCount(RtreeCheck *pCheck, const char *zTbl, i64 nExpect){ + if( pCheck->rc==SQLITE_OK ){ + sqlite3_stmt *pCount; + pCount = rtreeCheckPrepare(pCheck, "SELECT count(*) FROM %Q.'%q%s'", + pCheck->zDb, pCheck->zTab, zTbl + ); + if( pCount ){ + if( sqlite3_step(pCount)==SQLITE_ROW ){ + i64 nActual = sqlite3_column_int64(pCount, 0); + if( nActual!=nExpect ){ + rtreeCheckAppendMsg(pCheck, "Wrong number of entries in %%%s table" + " - expected %lld, actual %lld" , zTbl, nExpect, nActual + ); + } + } + pCheck->rc = sqlite3_finalize(pCount); + } + } +} + +/* +** This function does the bulk of the work for the rtree integrity-check. +** It is called by rtreecheck(), which is the SQL function implementation. +*/ +static int rtreeCheckTable( + sqlite3 *db, /* Database handle to access db through */ + const char *zDb, /* Name of db ("main", "temp" etc.) */ + const char *zTab, /* Name of rtree table to check */ + char **pzReport /* OUT: sqlite3_malloc'd report text */ +){ + RtreeCheck check; /* Common context for various routines */ + sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */ + int bEnd = 0; /* True if transaction should be closed */ + int nAux = 0; /* Number of extra columns. */ + + /* Initialize the context object */ + memset(&check, 0, sizeof(check)); + check.db = db; + check.zDb = zDb; + check.zTab = zTab; + + /* If there is not already an open transaction, open one now. This is + ** to ensure that the queries run as part of this integrity-check operate + ** on a consistent snapshot. */ + if( sqlite3_get_autocommit(db) ){ + check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0); + bEnd = 1; + } + + /* Find the number of auxiliary columns */ + if( check.rc==SQLITE_OK ){ + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab); + if( pStmt ){ + nAux = sqlite3_column_count(pStmt) - 2; + sqlite3_finalize(pStmt); + }else + if( check.rc!=SQLITE_NOMEM ){ + check.rc = SQLITE_OK; + } + } + + /* Find number of dimensions in the rtree table. */ + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.%Q", zDb, zTab); + if( pStmt ){ + int rc; + check.nDim = (sqlite3_column_count(pStmt) - 1 - nAux) / 2; + if( check.nDim<1 ){ + rtreeCheckAppendMsg(&check, "Schema corrupt or not an rtree"); + }else if( SQLITE_ROW==sqlite3_step(pStmt) ){ + check.bInt = (sqlite3_column_type(pStmt, 1)==SQLITE_INTEGER); + } + rc = sqlite3_finalize(pStmt); + if( rc!=SQLITE_CORRUPT ) check.rc = rc; + } + + /* Do the actual integrity-check */ + if( check.nDim>=1 ){ + if( check.rc==SQLITE_OK ){ + rtreeCheckNode(&check, 0, 0, 1); + } + rtreeCheckCount(&check, "_rowid", check.nLeaf); + rtreeCheckCount(&check, "_parent", check.nNonLeaf); + } + + /* Finalize SQL statements used by the integrity-check */ + sqlite3_finalize(check.pGetNode); + sqlite3_finalize(check.aCheckMapping[0]); + sqlite3_finalize(check.aCheckMapping[1]); + + /* If one was opened, close the transaction */ + if( bEnd ){ + int rc = sqlite3_exec(db, "END", 0, 0, 0); + if( check.rc==SQLITE_OK ) check.rc = rc; + } + *pzReport = check.zReport; + return check.rc; +} + +/* +** Usage: +** +** rtreecheck(); +** rtreecheck(, ); +** +** Invoking this SQL function runs an integrity-check on the named rtree +** table. The integrity-check verifies the following: +** +** 1. For each cell in the r-tree structure (%_node table), that: +** +** a) for each dimension, (coord1 <= coord2). +** +** b) unless the cell is on the root node, that the cell is bounded +** by the parent cell on the parent node. +** +** c) for leaf nodes, that there is an entry in the %_rowid +** table corresponding to the cell's rowid value that +** points to the correct node. +** +** d) for cells on non-leaf nodes, that there is an entry in the +** %_parent table mapping from the cell's child node to the +** node that it resides on. +** +** 2. That there are the same number of entries in the %_rowid table +** as there are leaf cells in the r-tree structure, and that there +** is a leaf cell that corresponds to each entry in the %_rowid table. +** +** 3. That there are the same number of entries in the %_parent table +** as there are non-leaf cells in the r-tree structure, and that +** there is a non-leaf cell that corresponds to each entry in the +** %_parent table. +*/ +static void rtreecheck( + sqlite3_context *ctx, + int nArg, + sqlite3_value **apArg +){ + if( nArg!=1 && nArg!=2 ){ + sqlite3_result_error(ctx, + "wrong number of arguments to function rtreecheck()", -1 + ); + }else{ + int rc; + char *zReport = 0; + const char *zDb = (const char*)sqlite3_value_text(apArg[0]); + const char *zTab; + if( nArg==1 ){ + zTab = zDb; + zDb = "main"; + }else{ + zTab = (const char*)sqlite3_value_text(apArg[1]); + } + rc = rtreeCheckTable(sqlite3_context_db_handle(ctx), zDb, zTab, &zReport); + if( rc==SQLITE_OK ){ + sqlite3_result_text(ctx, zReport ? zReport : "ok", -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_code(ctx, rc); + } + sqlite3_free(zReport); + } +} + +/* Conditionally include the geopoly code */ +#ifdef SQLITE_ENABLE_GEOPOLY +/************** Include geopoly.c in the middle of rtree.c *******************/ +/************** Begin file geopoly.c *****************************************/ +/* +** 2018-05-25 +** +** 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 an alternative R-Tree virtual table that +** uses polygons to express the boundaries of 2-dimensional objects. +** +** This file is #include-ed onto the end of "rtree.c" so that it has +** access to all of the R-Tree internals. +*/ +/* #include */ + +/* Enable -DGEOPOLY_ENABLE_DEBUG for debugging facilities */ +#ifdef GEOPOLY_ENABLE_DEBUG + static int geo_debug = 0; +# define GEODEBUG(X) if(geo_debug)printf X +#else +# define GEODEBUG(X) +#endif + +/* Character class routines */ +#ifdef sqlite3Isdigit + /* Use the SQLite core versions if this routine is part of the + ** SQLite amalgamation */ +# define safe_isdigit(x) sqlite3Isdigit(x) +# define safe_isalnum(x) sqlite3Isalnum(x) +# define safe_isxdigit(x) sqlite3Isxdigit(x) +#else + /* Use the standard library for separate compilation */ +#include /* amalgamator: keep */ +# define safe_isdigit(x) isdigit((unsigned char)(x)) +# define safe_isalnum(x) isalnum((unsigned char)(x)) +# define safe_isxdigit(x) isxdigit((unsigned char)(x)) +#endif + +#ifndef JSON_NULL /* The following stuff repeats things found in json1 */ +/* +** Growing our own isspace() routine this way is twice as fast as +** the library isspace() function. +*/ +static const char geopolyIsSpace[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define fast_isspace(x) (geopolyIsSpace[(unsigned char)x]) +#endif /* JSON NULL - back to original code */ + +/* Compiler and version */ +#ifndef GCC_VERSION +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#endif +#ifndef MSVC_VERSION +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif +#endif + +/* Datatype for coordinates +*/ +typedef float GeoCoord; + +/* +** Internal representation of a polygon. +** +** The polygon consists of a sequence of vertexes. There is a line +** segment between each pair of vertexes, and one final segment from +** the last vertex back to the first. (This differs from the GeoJSON +** standard in which the final vertex is a repeat of the first.) +** +** The polygon follows the right-hand rule. The area to the right of +** each segment is "outside" and the area to the left is "inside". +** +** The on-disk representation consists of a 4-byte header followed by +** the values. The 4-byte header is: +** +** encoding (1 byte) 0=big-endian, 1=little-endian +** nvertex (3 bytes) Number of vertexes as a big-endian integer +** +** Enough space is allocated for 4 coordinates, to work around over-zealous +** warnings coming from some compiler (notably, clang). In reality, the size +** of each GeoPoly memory allocate is adjusted as necessary so that the +** GeoPoly.a[] array at the end is the appropriate size. +*/ +typedef struct GeoPoly GeoPoly; +struct GeoPoly { + int nVertex; /* Number of vertexes */ + unsigned char hdr[4]; /* Header for on-disk representation */ + GeoCoord a[8]; /* 2*nVertex values. X (longitude) first, then Y */ +}; + +/* The size of a memory allocation needed for a GeoPoly object sufficient +** to hold N coordinate pairs. +*/ +#define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) + +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + +/* +** State of a parse of a GeoJSON input. +*/ +typedef struct GeoParse GeoParse; +struct GeoParse { + const unsigned char *z; /* Unparsed input */ + int nVertex; /* Number of vertexes in a[] */ + int nAlloc; /* Space allocated to a[] */ + int nErr; /* Number of errors encountered */ + GeoCoord *a; /* Array of vertexes. From sqlite3_malloc64() */ +}; + +/* Do a 4-byte byte swap */ +static void geopolySwab32(unsigned char *a){ + unsigned char t = a[0]; + a[0] = a[3]; + a[3] = t; + t = a[1]; + a[1] = a[2]; + a[2] = t; +} + +/* Skip whitespace. Return the next non-whitespace character. */ +static char geopolySkipSpace(GeoParse *p){ + while( fast_isspace(p->z[0]) ) p->z++; + return p->z[0]; +} + +/* Parse out a number. Write the value into *pVal if pVal!=0. +** return non-zero on success and zero if the next token is not a number. +*/ +static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ + char c = geopolySkipSpace(p); + const unsigned char *z = p->z; + int j = 0; + int seenDP = 0; + int seenE = 0; + if( c=='-' ){ + j = 1; + c = z[j]; + } + if( c=='0' && z[j+1]>='0' && z[j+1]<='9' ) return 0; + for(;; j++){ + c = z[j]; + if( safe_isdigit(c) ) continue; + if( c=='.' ){ + if( z[j-1]=='-' ) return 0; + if( seenDP ) return 0; + seenDP = 1; + continue; + } + if( c=='e' || c=='E' ){ + if( z[j-1]<'0' ) return 0; + if( seenE ) return -1; + seenDP = seenE = 1; + c = z[j+1]; + if( c=='+' || c=='-' ){ + j++; + c = z[j+1]; + } + if( c<'0' || c>'9' ) return 0; + continue; + } + break; + } + if( z[j-1]<'0' ) return 0; + if( pVal ){ +#ifdef SQLITE_AMALGAMATION + /* The sqlite3AtoF() routine is much much faster than atof(), if it + ** is available */ + double r; + (void)sqlite3AtoF((const char*)p->z, &r, j, SQLITE_UTF8); + *pVal = r; +#else + *pVal = (GeoCoord)atof((const char*)p->z); +#endif + } + p->z += j; + return 1; +} + +/* +** If the input is a well-formed JSON array of coordinates with at least +** four coordinates and where each coordinate is itself a two-value array, +** then convert the JSON into a GeoPoly object and return a pointer to +** that object. +** +** If any error occurs, return NULL. +*/ +static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ + GeoParse s; + int rc = SQLITE_OK; + memset(&s, 0, sizeof(s)); + s.z = z; + if( geopolySkipSpace(&s)=='[' ){ + s.z++; + while( geopolySkipSpace(&s)=='[' ){ + int ii = 0; + char c; + s.z++; + if( s.nVertex>=s.nAlloc ){ + GeoCoord *aNew; + s.nAlloc = s.nAlloc*2 + 16; + aNew = sqlite3_realloc64(s.a, s.nAlloc*sizeof(GeoCoord)*2 ); + if( aNew==0 ){ + rc = SQLITE_NOMEM; + s.nErr++; + break; + } + s.a = aNew; + } + while( geopolyParseNumber(&s, ii<=1 ? &s.a[s.nVertex*2+ii] : 0) ){ + ii++; + if( ii==2 ) s.nVertex++; + c = geopolySkipSpace(&s); + s.z++; + if( c==',' ) continue; + if( c==']' && ii>=2 ) break; + s.nErr++; + rc = SQLITE_ERROR; + goto parse_json_err; + } + if( geopolySkipSpace(&s)==',' ){ + s.z++; + continue; + } + break; + } + if( geopolySkipSpace(&s)==']' + && s.nVertex>=4 + && s.a[0]==s.a[s.nVertex*2-2] + && s.a[1]==s.a[s.nVertex*2-1] + && (s.z++, geopolySkipSpace(&s)==0) + ){ + GeoPoly *pOut; + int x = 1; + s.nVertex--; /* Remove the redundant vertex at the end */ + pOut = sqlite3_malloc64( GEOPOLY_SZ((sqlite3_int64)s.nVertex) ); + x = 1; + if( pOut==0 ) goto parse_json_err; + pOut->nVertex = s.nVertex; + memcpy(pOut->a, s.a, s.nVertex*2*sizeof(GeoCoord)); + pOut->hdr[0] = *(unsigned char*)&x; + pOut->hdr[1] = (s.nVertex>>16)&0xff; + pOut->hdr[2] = (s.nVertex>>8)&0xff; + pOut->hdr[3] = s.nVertex&0xff; + sqlite3_free(s.a); + if( pRc ) *pRc = SQLITE_OK; + return pOut; + }else{ + s.nErr++; + rc = SQLITE_ERROR; + } + } +parse_json_err: + if( pRc ) *pRc = rc; + sqlite3_free(s.a); + return 0; +} + +/* +** Given a function parameter, try to interpret it as a polygon, either +** in the binary format or JSON text. Compute a GeoPoly object and +** return a pointer to that object. Or if the input is not a well-formed +** polygon, put an error message in sqlite3_context and return NULL. +*/ +static GeoPoly *geopolyFuncParam( + sqlite3_context *pCtx, /* Context for error messages */ + sqlite3_value *pVal, /* The value to decode */ + int *pRc /* Write error here */ +){ + GeoPoly *p = 0; + int nByte; + testcase( pCtx==0 ); + if( sqlite3_value_type(pVal)==SQLITE_BLOB + && (nByte = sqlite3_value_bytes(pVal))>=(4+6*sizeof(GeoCoord)) + ){ + const unsigned char *a = sqlite3_value_blob(pVal); + int nVertex; + if( a==0 ){ + if( pCtx ) sqlite3_result_error_nomem(pCtx); + return 0; + } + nVertex = (a[1]<<16) + (a[2]<<8) + a[3]; + if( (a[0]==0 || a[0]==1) + && (nVertex*2*sizeof(GeoCoord) + 4)==(unsigned int)nByte + ){ + p = sqlite3_malloc64( sizeof(*p) + (nVertex-1)*2*sizeof(GeoCoord) ); + if( p==0 ){ + if( pRc ) *pRc = SQLITE_NOMEM; + if( pCtx ) sqlite3_result_error_nomem(pCtx); + }else{ + int x = 1; + p->nVertex = nVertex; + memcpy(p->hdr, a, nByte); + if( a[0] != *(unsigned char*)&x ){ + int ii; + for(ii=0; iihdr[0] ^= 1; + } + } + } + if( pRc ) *pRc = SQLITE_OK; + return p; + }else if( sqlite3_value_type(pVal)==SQLITE_TEXT ){ + const unsigned char *zJson = sqlite3_value_text(pVal); + if( zJson==0 ){ + if( pRc ) *pRc = SQLITE_NOMEM; + return 0; + } + return geopolyParseJson(zJson, pRc); + }else{ + if( pRc ) *pRc = SQLITE_ERROR; + return 0; + } +} + +/* +** Implementation of the geopoly_blob(X) function. +** +** If the input is a well-formed Geopoly BLOB or JSON string +** then return the BLOB representation of the polygon. Otherwise +** return NULL. +*/ +static void geopolyBlobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +/* +** SQL function: geopoly_json(X) +** +** Interpret X as a polygon and render it as a JSON array +** of coordinates. Or, if X is not a valid polygon, return NULL. +*/ +static void geopolyJsonFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3 *db = sqlite3_context_db_handle(context); + sqlite3_str *x = sqlite3_str_new(db); + int i; + sqlite3_str_append(x, "[", 1); + for(i=0; inVertex; i++){ + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); + } + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); + sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); + sqlite3_free(p); + } +} + +/* +** SQL function: geopoly_svg(X, ....) +** +** Interpret X as a polygon and render it as a SVG . +** Additional arguments are added as attributes to the . +*/ +static void geopolySvgFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3 *db = sqlite3_context_db_handle(context); + sqlite3_str *x = sqlite3_str_new(db); + int i; + char cSep = '\''; + sqlite3_str_appendf(x, ""); + sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); + sqlite3_free(p); + } +} + +/* +** SQL Function: geopoly_xform(poly, A, B, C, D, E, F) +** +** Transform and/or translate a polygon as follows: +** +** x1 = A*x0 + B*y0 + E +** y1 = C*x0 + D*y0 + F +** +** For a translation: +** +** geopoly_xform(poly, 1, 0, 0, 1, x-offset, y-offset) +** +** Rotate by R around the point (0,0): +** +** geopoly_xform(poly, cos(R), sin(R), -sin(R), cos(R), 0, 0) +*/ +static void geopolyXformFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + double A = sqlite3_value_double(argv[1]); + double B = sqlite3_value_double(argv[2]); + double C = sqlite3_value_double(argv[3]); + double D = sqlite3_value_double(argv[4]); + double E = sqlite3_value_double(argv[5]); + double F = sqlite3_value_double(argv[6]); + GeoCoord x1, y1, x0, y0; + int ii; + if( p ){ + for(ii=0; iinVertex; ii++){ + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); + x1 = (GeoCoord)(A*x0 + B*y0 + E); + y1 = (GeoCoord)(C*x0 + D*y0 + F); + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; + } + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +/* +** Compute the area enclosed by the polygon. +** +** This routine can also be used to detect polygons that rotate in +** the wrong direction. Polygons are suppose to be counter-clockwise (CCW). +** This routine returns a negative value for clockwise (CW) polygons. +*/ +static double geopolyArea(GeoPoly *p){ + double rArea = 0.0; + int ii; + for(ii=0; iinVertex-1; ii++){ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ + * 0.5; + } + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ + * 0.5; + return rArea; +} + +/* +** Implementation of the geopoly_area(X) function. +** +** If the input is a well-formed Geopoly BLOB then return the area +** enclosed by the polygon. If the polygon circulates clockwise instead +** of counterclockwise (as it should) then return the negative of the +** enclosed area. Otherwise return NULL. +*/ +static void geopolyAreaFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + sqlite3_result_double(context, geopolyArea(p)); + sqlite3_free(p); + } +} + +/* +** Implementation of the geopoly_ccw(X) function. +** +** If the rotation of polygon X is clockwise (incorrect) instead of +** counter-clockwise (the correct winding order according to RFC7946) +** then reverse the order of the vertexes in polygon X. +** +** In other words, this routine returns a CCW polygon regardless of the +** winding order of its input. +** +** Use this routine to sanitize historical inputs that that sometimes +** contain polygons that wind in the wrong direction. +*/ +static void geopolyCcwFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + if( geopolyArea(p)<0.0 ){ + int ii, jj; + for(ii=1, jj=p->nVertex-1; iihdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +#define GEOPOLY_PI 3.1415926535897932385 + +/* Fast approximation for sine(X) for X between -0.5*pi and 2*pi +*/ +static double geopolySine(double r){ + assert( r>=-0.5*GEOPOLY_PI && r<=2.0*GEOPOLY_PI ); + if( r>=1.5*GEOPOLY_PI ){ + r -= 2.0*GEOPOLY_PI; + } + if( r>=0.5*GEOPOLY_PI ){ + return -geopolySine(r-GEOPOLY_PI); + }else{ + double r2 = r*r; + double r3 = r2*r; + double r5 = r3*r2; + return 0.9996949*r - 0.1656700*r3 + 0.0075134*r5; + } +} + +/* +** Function: geopoly_regular(X,Y,R,N) +** +** Construct a simple, convex, regular polygon centered at X, Y +** with circumradius R and with N sides. +*/ +static void geopolyRegularFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + double x = sqlite3_value_double(argv[0]); + double y = sqlite3_value_double(argv[1]); + double r = sqlite3_value_double(argv[2]); + int n = sqlite3_value_int(argv[3]); + int i; + GeoPoly *p; + + if( n<3 || r<=0.0 ) return; + if( n>1000 ) n = 1000; + p = sqlite3_malloc64( sizeof(*p) + (n-1)*2*sizeof(GeoCoord) ); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + i = 1; + p->hdr[0] = *(unsigned char*)&i; + p->hdr[1] = 0; + p->hdr[2] = (n>>8)&0xff; + p->hdr[3] = n&0xff; + for(i=0; ihdr, 4+8*n, SQLITE_TRANSIENT); + sqlite3_free(p); +} + +/* +** If pPoly is a polygon, compute its bounding box. Then: +** +** (1) if aCoord!=0 store the bounding box in aCoord, returning NULL +** (2) otherwise, compute a GeoPoly for the bounding box and return the +** new GeoPoly +** +** If pPoly is NULL but aCoord is not NULL, then compute a new GeoPoly from +** the bounding box in aCoord and return a pointer to that GeoPoly. +*/ +static GeoPoly *geopolyBBox( + sqlite3_context *context, /* For recording the error */ + sqlite3_value *pPoly, /* The polygon */ + RtreeCoord *aCoord, /* Results here */ + int *pRc /* Error code here */ +){ + GeoPoly *pOut = 0; + GeoPoly *p; + float mnX, mxX, mnY, mxY; + if( pPoly==0 && aCoord!=0 ){ + p = 0; + mnX = aCoord[0].f; + mxX = aCoord[1].f; + mnY = aCoord[2].f; + mxY = aCoord[3].f; + goto geopolyBboxFill; + }else{ + p = geopolyFuncParam(context, pPoly, pRc); + } + if( p ){ + int ii; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); + for(ii=1; iinVertex; ii++){ + double r = GeoX(p,ii); + if( rmxX ) mxX = (float)r; + r = GeoY(p,ii); + if( rmxY ) mxY = (float)r; + } + if( pRc ) *pRc = SQLITE_OK; + if( aCoord==0 ){ + geopolyBboxFill: + pOut = sqlite3_realloc64(p, GEOPOLY_SZ(4)); + if( pOut==0 ){ + sqlite3_free(p); + if( context ) sqlite3_result_error_nomem(context); + if( pRc ) *pRc = SQLITE_NOMEM; + return 0; + } + pOut->nVertex = 4; + ii = 1; + pOut->hdr[0] = *(unsigned char*)ⅈ + pOut->hdr[1] = 0; + pOut->hdr[2] = 0; + pOut->hdr[3] = 4; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; + }else{ + sqlite3_free(p); + aCoord[0].f = mnX; + aCoord[1].f = mxX; + aCoord[2].f = mnY; + aCoord[3].f = mxY; + } + }else if( aCoord ){ + memset(aCoord, 0, sizeof(RtreeCoord)*4); + } + return pOut; +} + +/* +** Implementation of the geopoly_bbox(X) SQL function. +*/ +static void geopolyBBoxFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyBBox(context, argv[0], 0, 0); + if( p ){ + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +/* +** State vector for the geopoly_group_bbox() aggregate function. +*/ +typedef struct GeoBBox GeoBBox; +struct GeoBBox { + int isInit; + RtreeCoord a[4]; +}; + + +/* +** Implementation of the geopoly_group_bbox(X) aggregate SQL function. +*/ +static void geopolyBBoxStep( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + RtreeCoord a[4]; + int rc = SQLITE_OK; + (void)geopolyBBox(context, argv[0], a, &rc); + if( rc==SQLITE_OK ){ + GeoBBox *pBBox; + pBBox = (GeoBBox*)sqlite3_aggregate_context(context, sizeof(*pBBox)); + if( pBBox==0 ) return; + if( pBBox->isInit==0 ){ + pBBox->isInit = 1; + memcpy(pBBox->a, a, sizeof(RtreeCoord)*4); + }else{ + if( a[0].f < pBBox->a[0].f ) pBBox->a[0] = a[0]; + if( a[1].f > pBBox->a[1].f ) pBBox->a[1] = a[1]; + if( a[2].f < pBBox->a[2].f ) pBBox->a[2] = a[2]; + if( a[3].f > pBBox->a[3].f ) pBBox->a[3] = a[3]; + } + } +} +static void geopolyBBoxFinal( + sqlite3_context *context +){ + GeoPoly *p; + GeoBBox *pBBox; + pBBox = (GeoBBox*)sqlite3_aggregate_context(context, 0); + if( pBBox==0 ) return; + p = geopolyBBox(context, 0, pBBox->a, 0); + if( p ){ + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + + +/* +** Determine if point (x0,y0) is beneath line segment (x1,y1)->(x2,y2). +** Returns: +** +** +2 x0,y0 is on the line segement +** +** +1 x0,y0 is beneath line segment +** +** 0 x0,y0 is not on or beneath the line segment or the line segment +** is vertical and x0,y0 is not on the line segment +** +** The left-most coordinate min(x1,x2) is not considered to be part of +** the line segment for the purposes of this analysis. +*/ +static int pointBeneathLine( + double x0, double y0, + double x1, double y1, + double x2, double y2 +){ + double y; + if( x0==x1 && y0==y1 ) return 2; + if( x1x2 ) return 0; + }else if( x1>x2 ){ + if( x0<=x2 || x0>x1 ) return 0; + }else{ + /* Vertical line segment */ + if( x0!=x1 ) return 0; + if( y0y1 && y0>y2 ) return 0; + return 2; + } + y = y1 + (y2-y1)*(x0-x1)/(x2-x1); + if( y0==y ) return 2; + if( y0nVertex-1; ii++){ + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); + if( v==2 ) break; + cnt += v; + } + if( v!=2 ){ + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); + } + if( v==2 ){ + sqlite3_result_int(context, 1); + }else if( ((v+cnt)&1)==0 ){ + sqlite3_result_int(context, 0); + }else{ + sqlite3_result_int(context, 2); + } + sqlite3_free(p1); +} + +/* Forward declaration */ +static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2); + +/* +** SQL function: geopoly_within(P1,P2) +** +** Return +2 if P1 and P2 are the same polygon +** Return +1 if P2 is contained within P1 +** Return 0 if any part of P2 is on the outside of P1 +** +*/ +static void geopolyWithinFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0); + if( p1 && p2 ){ + int x = geopolyOverlap(p1, p2); + if( x<0 ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_int(context, x==2 ? 1 : x==4 ? 2 : 0); + } + } + sqlite3_free(p1); + sqlite3_free(p2); +} + +/* Objects used by the overlap algorihm. */ +typedef struct GeoEvent GeoEvent; +typedef struct GeoSegment GeoSegment; +typedef struct GeoOverlap GeoOverlap; +struct GeoEvent { + double x; /* X coordinate at which event occurs */ + int eType; /* 0 for ADD, 1 for REMOVE */ + GeoSegment *pSeg; /* The segment to be added or removed */ + GeoEvent *pNext; /* Next event in the sorted list */ +}; +struct GeoSegment { + double C, B; /* y = C*x + B */ + double y; /* Current y value */ + float y0; /* Initial y value */ + unsigned char side; /* 1 for p1, 2 for p2 */ + unsigned int idx; /* Which segment within the side */ + GeoSegment *pNext; /* Next segment in a list sorted by y */ +}; +struct GeoOverlap { + GeoEvent *aEvent; /* Array of all events */ + GeoSegment *aSegment; /* Array of all segments */ + int nEvent; /* Number of events */ + int nSegment; /* Number of segments */ +}; + +/* +** Add a single segment and its associated events. +*/ +static void geopolyAddOneSegment( + GeoOverlap *p, + GeoCoord x0, + GeoCoord y0, + GeoCoord x1, + GeoCoord y1, + unsigned char side, + unsigned int idx +){ + GeoSegment *pSeg; + GeoEvent *pEvent; + if( x0==x1 ) return; /* Ignore vertical segments */ + if( x0>x1 ){ + GeoCoord t = x0; + x0 = x1; + x1 = t; + t = y0; + y0 = y1; + y1 = t; + } + pSeg = p->aSegment + p->nSegment; + p->nSegment++; + pSeg->C = (y1-y0)/(x1-x0); + pSeg->B = y1 - x1*pSeg->C; + pSeg->y0 = y0; + pSeg->side = side; + pSeg->idx = idx; + pEvent = p->aEvent + p->nEvent; + p->nEvent++; + pEvent->x = x0; + pEvent->eType = 0; + pEvent->pSeg = pSeg; + pEvent = p->aEvent + p->nEvent; + p->nEvent++; + pEvent->x = x1; + pEvent->eType = 1; + pEvent->pSeg = pSeg; +} + + + +/* +** Insert all segments and events for polygon pPoly. +*/ +static void geopolyAddSegments( + GeoOverlap *p, /* Add segments to this Overlap object */ + GeoPoly *pPoly, /* Take all segments from this polygon */ + unsigned char side /* The side of pPoly */ +){ + unsigned int i; + GeoCoord *x; + for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ + x = &GeoX(pPoly,i); + geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); + } + x = &GeoX(pPoly,i); + geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); +} + +/* +** Merge two lists of sorted events by X coordinate +*/ +static GeoEvent *geopolyEventMerge(GeoEvent *pLeft, GeoEvent *pRight){ + GeoEvent head, *pLast; + head.pNext = 0; + pLast = &head; + while( pRight && pLeft ){ + if( pRight->x <= pLeft->x ){ + pLast->pNext = pRight; + pLast = pRight; + pRight = pRight->pNext; + }else{ + pLast->pNext = pLeft; + pLast = pLeft; + pLeft = pLeft->pNext; + } + } + pLast->pNext = pRight ? pRight : pLeft; + return head.pNext; +} + +/* +** Sort an array of nEvent event objects into a list. +*/ +static GeoEvent *geopolySortEventsByX(GeoEvent *aEvent, int nEvent){ + int mx = 0; + int i, j; + GeoEvent *p; + GeoEvent *a[50]; + for(i=0; ipNext = 0; + for(j=0; j=mx ) mx = j+1; + } + p = 0; + for(i=0; iy - pLeft->y; + if( r==0.0 ) r = pRight->C - pLeft->C; + if( r<0.0 ){ + pLast->pNext = pRight; + pLast = pRight; + pRight = pRight->pNext; + }else{ + pLast->pNext = pLeft; + pLast = pLeft; + pLeft = pLeft->pNext; + } + } + pLast->pNext = pRight ? pRight : pLeft; + return head.pNext; +} + +/* +** Sort a list of GeoSegments in order of increasing Y and in the event of +** a tie, increasing C (slope). +*/ +static GeoSegment *geopolySortSegmentsByYAndC(GeoSegment *pList){ + int mx = 0; + int i; + GeoSegment *p; + GeoSegment *a[50]; + while( pList ){ + p = pList; + pList = pList->pNext; + p->pNext = 0; + for(i=0; i=mx ) mx = i+1; + } + p = 0; + for(i=0; inVertex + p2->nVertex + 2; + GeoOverlap *p; + sqlite3_int64 nByte; + GeoEvent *pThisEvent; + double rX; + int rc = 0; + int needSort = 0; + GeoSegment *pActive = 0; + GeoSegment *pSeg; + unsigned char aOverlap[4]; + + nByte = sizeof(GeoEvent)*nVertex*2 + + sizeof(GeoSegment)*nVertex + + sizeof(GeoOverlap); + p = sqlite3_malloc64( nByte ); + if( p==0 ) return -1; + p->aEvent = (GeoEvent*)&p[1]; + p->aSegment = (GeoSegment*)&p->aEvent[nVertex*2]; + p->nEvent = p->nSegment = 0; + geopolyAddSegments(p, p1, 1); + geopolyAddSegments(p, p2, 2); + pThisEvent = geopolySortEventsByX(p->aEvent, p->nEvent); + rX = pThisEvent && pThisEvent->x==0.0 ? -1.0 : 0.0; + memset(aOverlap, 0, sizeof(aOverlap)); + while( pThisEvent ){ + if( pThisEvent->x!=rX ){ + GeoSegment *pPrev = 0; + int iMask = 0; + GEODEBUG(("Distinct X: %g\n", pThisEvent->x)); + rX = pThisEvent->x; + if( needSort ){ + GEODEBUG(("SORT\n")); + pActive = geopolySortSegmentsByYAndC(pActive); + needSort = 0; + } + for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ + if( pPrev ){ + if( pPrev->y!=pSeg->y ){ + GEODEBUG(("MASK: %d\n", iMask)); + aOverlap[iMask] = 1; + } + } + iMask ^= pSeg->side; + pPrev = pSeg; + } + pPrev = 0; + for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ + double y = pSeg->C*rX + pSeg->B; + GEODEBUG(("Segment %d.%d %g->%g\n", pSeg->side, pSeg->idx, pSeg->y, y)); + pSeg->y = y; + if( pPrev ){ + if( pPrev->y>pSeg->y && pPrev->side!=pSeg->side ){ + rc = 1; + GEODEBUG(("Crossing: %d.%d and %d.%d\n", + pPrev->side, pPrev->idx, + pSeg->side, pSeg->idx)); + goto geopolyOverlapDone; + }else if( pPrev->y!=pSeg->y ){ + GEODEBUG(("MASK: %d\n", iMask)); + aOverlap[iMask] = 1; + } + } + iMask ^= pSeg->side; + pPrev = pSeg; + } + } + GEODEBUG(("%s %d.%d C=%g B=%g\n", + pThisEvent->eType ? "RM " : "ADD", + pThisEvent->pSeg->side, pThisEvent->pSeg->idx, + pThisEvent->pSeg->C, + pThisEvent->pSeg->B)); + if( pThisEvent->eType==0 ){ + /* Add a segment */ + pSeg = pThisEvent->pSeg; + pSeg->y = pSeg->y0; + pSeg->pNext = pActive; + pActive = pSeg; + needSort = 1; + }else{ + /* Remove a segment */ + if( pActive==pThisEvent->pSeg ){ + pActive = ALWAYS(pActive) ? pActive->pNext : 0; + }else{ + for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ + if( pSeg->pNext==pThisEvent->pSeg ){ + pSeg->pNext = ALWAYS(pSeg->pNext) ? pSeg->pNext->pNext : 0; + break; + } + } + } + } + pThisEvent = pThisEvent->pNext; + } + if( aOverlap[3]==0 ){ + rc = 0; + }else if( aOverlap[1]!=0 && aOverlap[2]==0 ){ + rc = 3; + }else if( aOverlap[1]==0 && aOverlap[2]!=0 ){ + rc = 2; + }else if( aOverlap[1]==0 && aOverlap[2]==0 ){ + rc = 4; + }else{ + rc = 1; + } + +geopolyOverlapDone: + sqlite3_free(p); + return rc; +} + +/* +** SQL function: geopoly_overlap(P1,P2) +** +** Determine whether or not P1 and P2 overlap. Return value: +** +** 0 The two polygons are disjoint +** 1 They overlap +** 2 P1 is completely contained within P2 +** 3 P2 is completely contained within P1 +** 4 P1 and P2 are the same polygon +** NULL Either P1 or P2 or both are not valid polygons +*/ +static void geopolyOverlapFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p1 = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p2 = geopolyFuncParam(context, argv[1], 0); + if( p1 && p2 ){ + int x = geopolyOverlap(p1, p2); + if( x<0 ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_int(context, x); + } + } + sqlite3_free(p1); + sqlite3_free(p2); +} + +/* +** Enable or disable debugging output +*/ +static void geopolyDebugFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ +#ifdef GEOPOLY_ENABLE_DEBUG + geo_debug = sqlite3_value_int(argv[0]); +#endif +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the geopoly virtual table. +** +** argv[0] -> module name +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> column names... +*/ +static int geopolyInit( + sqlite3 *db, /* Database connection */ + void *pAux, /* One of the RTREE_COORD_* constants */ + int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */ + sqlite3_vtab **ppVtab, /* OUT: New virtual table */ + char **pzErr, /* OUT: Error message, if any */ + int isCreate /* True for xCreate, false for xConnect */ +){ + int rc = SQLITE_OK; + Rtree *pRtree; + sqlite3_int64 nDb; /* Length of string argv[1] */ + sqlite3_int64 nName; /* Length of string argv[2] */ + sqlite3_str *pSql; + char *zSql; + int ii; + + sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + + /* Allocate the sqlite3_vtab structure */ + nDb = strlen(argv[1]); + nName = strlen(argv[2]); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); + if( !pRtree ){ + return SQLITE_NOMEM; + } + memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + pRtree->nBusy = 1; + pRtree->base.pModule = &rtreeModule; + pRtree->zDb = (char *)&pRtree[1]; + pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->eCoordType = RTREE_COORD_REAL32; + pRtree->nDim = 2; + pRtree->nDim2 = 4; + memcpy(pRtree->zDb, argv[1], nDb); + memcpy(pRtree->zName, argv[2], nName); + + + /* Create/Connect to the underlying relational database schema. If + ** that is successful, call sqlite3_declare_vtab() to configure + ** the r-tree table schema. + */ + pSql = sqlite3_str_new(db); + sqlite3_str_appendf(pSql, "CREATE TABLE x(_shape"); + pRtree->nAux = 1; /* Add one for _shape */ + pRtree->nAuxNotNull = 1; /* The _shape column is always not-null */ + for(ii=3; iinAux++; + sqlite3_str_appendf(pSql, ",%s", argv[ii]); + } + sqlite3_str_appendf(pSql, ");"); + zSql = sqlite3_str_finish(pSql); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + sqlite3_free(zSql); + if( rc ) goto geopolyInit_fail; + pRtree->nBytesPerCell = 8 + pRtree->nDim2*4; + + /* Figure out the node size to use. */ + rc = getNodeSize(db, pRtree, isCreate, pzErr); + if( rc ) goto geopolyInit_fail; + rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); + if( rc ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + goto geopolyInit_fail; + } + + *ppVtab = (sqlite3_vtab *)pRtree; + return SQLITE_OK; + +geopolyInit_fail: + if( rc==SQLITE_OK ) rc = SQLITE_ERROR; + assert( *ppVtab==0 ); + assert( pRtree->nBusy==1 ); + rtreeRelease(pRtree); + return rc; +} + + +/* +** GEOPOLY virtual table module xCreate method. +*/ +static int geopolyCreate( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 1); +} + +/* +** GEOPOLY virtual table module xConnect method. +*/ +static int geopolyConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + return geopolyInit(db, pAux, argc, argv, ppVtab, pzErr, 0); +} + + +/* +** GEOPOLY virtual table module xFilter method. +** +** Query plans: +** +** 1 rowid lookup +** 2 search for objects overlapping the same bounding box +** that contains polygon argv[0] +** 3 search for objects overlapping the same bounding box +** that contains polygon argv[0] +** 4 full table scan +*/ +static int geopolyFilter( + sqlite3_vtab_cursor *pVtabCursor, /* The cursor to initialize */ + int idxNum, /* Query plan */ + const char *idxStr, /* Not Used */ + int argc, sqlite3_value **argv /* Parameters to the query plan */ +){ + Rtree *pRtree = (Rtree *)pVtabCursor->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; + RtreeNode *pRoot = 0; + int rc = SQLITE_OK; + int iCell = 0; + + rtreeReference(pRtree); + + /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ + resetCursor(pCsr); + + pCsr->iStrategy = idxNum; + if( idxNum==1 ){ + /* Special case - lookup by rowid. */ + RtreeNode *pLeaf; /* Leaf on which the required cell resides */ + RtreeSearchPoint *p; /* Search point for the leaf */ + i64 iRowid = sqlite3_value_int64(argv[0]); + i64 iNode = 0; + rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); + if( rc==SQLITE_OK && pLeaf!=0 ){ + p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); + assert( p!=0 ); /* Always returns pCsr->sPoint */ + pCsr->aNode[0] = pLeaf; + p->id = iNode; + p->eWithin = PARTLY_WITHIN; + rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell); + p->iCell = (u8)iCell; + RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:"); + }else{ + pCsr->atEOF = 1; + } + }else{ + /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array + ** with the configured constraints. + */ + rc = nodeAcquire(pRtree, 1, 0, &pRoot); + if( rc==SQLITE_OK && idxNum<=3 ){ + RtreeCoord bbox[4]; + RtreeConstraint *p; + assert( argc==1 ); + assert( argv[0]!=0 ); + geopolyBBox(0, argv[0], bbox, &rc); + if( rc ){ + goto geopoly_filter_end; + } + pCsr->aConstraint = p = sqlite3_malloc(sizeof(RtreeConstraint)*4); + pCsr->nConstraint = 4; + if( p==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*4); + memset(pCsr->anQueue, 0, sizeof(u32)*(pRtree->iDepth + 1)); + if( idxNum==2 ){ + /* Overlap query */ + p->op = 'B'; + p->iCoord = 0; + p->u.rValue = bbox[1].f; + p++; + p->op = 'D'; + p->iCoord = 1; + p->u.rValue = bbox[0].f; + p++; + p->op = 'B'; + p->iCoord = 2; + p->u.rValue = bbox[3].f; + p++; + p->op = 'D'; + p->iCoord = 3; + p->u.rValue = bbox[2].f; + }else{ + /* Within query */ + p->op = 'D'; + p->iCoord = 0; + p->u.rValue = bbox[0].f; + p++; + p->op = 'B'; + p->iCoord = 1; + p->u.rValue = bbox[1].f; + p++; + p->op = 'D'; + p->iCoord = 2; + p->u.rValue = bbox[2].f; + p++; + p->op = 'B'; + p->iCoord = 3; + p->u.rValue = bbox[3].f; + } + } + } + if( rc==SQLITE_OK ){ + RtreeSearchPoint *pNew; + pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + goto geopoly_filter_end; + } + pNew->id = 1; + pNew->iCell = 0; + pNew->eWithin = PARTLY_WITHIN; + assert( pCsr->bPoint==1 ); + pCsr->aNode[0] = pRoot; + pRoot = 0; + RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); + rc = rtreeStepToLeaf(pCsr); + } + } + +geopoly_filter_end: + nodeRelease(pRtree, pRoot); + rtreeRelease(pRtree); + return rc; +} + +/* +** Rtree virtual table module xBestIndex method. There are three +** table scan strategies to choose from (in order from most to +** least desirable): +** +** idxNum idxStr Strategy +** ------------------------------------------------ +** 1 "rowid" Direct lookup by rowid. +** 2 "rtree" R-tree overlap query using geopoly_overlap() +** 3 "rtree" R-tree within query using geopoly_within() +** 4 "fullscan" full-table scan. +** ------------------------------------------------ +*/ +static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + int ii; + int iRowidTerm = -1; + int iFuncTerm = -1; + int idxNum = 0; + + for(ii=0; iinConstraint; ii++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; + if( !p->usable ) continue; + if( p->iColumn<0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + iRowidTerm = ii; + break; + } + if( p->iColumn==0 && p->op>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){ + /* p->op==SQLITE_INDEX_CONSTRAINT_FUNCTION for geopoly_overlap() + ** p->op==(SQLITE_INDEX_CONTRAINT_FUNCTION+1) for geopoly_within(). + ** See geopolyFindFunction() */ + iFuncTerm = ii; + idxNum = p->op - SQLITE_INDEX_CONSTRAINT_FUNCTION + 2; + } + } + + if( iRowidTerm>=0 ){ + pIdxInfo->idxNum = 1; + pIdxInfo->idxStr = "rowid"; + pIdxInfo->aConstraintUsage[iRowidTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iRowidTerm].omit = 1; + pIdxInfo->estimatedCost = 30.0; + pIdxInfo->estimatedRows = 1; + pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; + return SQLITE_OK; + } + if( iFuncTerm>=0 ){ + pIdxInfo->idxNum = idxNum; + pIdxInfo->idxStr = "rtree"; + pIdxInfo->aConstraintUsage[iFuncTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iFuncTerm].omit = 0; + pIdxInfo->estimatedCost = 300.0; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; + } + pIdxInfo->idxNum = 4; + pIdxInfo->idxStr = "fullscan"; + pIdxInfo->estimatedCost = 3000000.0; + pIdxInfo->estimatedRows = 100000; + return SQLITE_OK; +} + + +/* +** GEOPOLY virtual table module xColumn method. +*/ +static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + Rtree *pRtree = (Rtree *)cur->pVtab; + RtreeCursor *pCsr = (RtreeCursor *)cur; + RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); + int rc = SQLITE_OK; + RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + + if( rc ) return rc; + if( p==0 ) return SQLITE_OK; + if( i==0 && sqlite3_vtab_nochange(ctx) ) return SQLITE_OK; + if( i<=pRtree->nAux ){ + if( !pCsr->bAuxValid ){ + if( pCsr->pReadAux==0 ){ + rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0, + &pCsr->pReadAux, 0); + if( rc ) return rc; + } + sqlite3_bind_int64(pCsr->pReadAux, 1, + nodeGetRowid(pRtree, pNode, p->iCell)); + rc = sqlite3_step(pCsr->pReadAux); + if( rc==SQLITE_ROW ){ + pCsr->bAuxValid = 1; + }else{ + sqlite3_reset(pCsr->pReadAux); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; + } + } + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i+2)); + } + return SQLITE_OK; +} + + +/* +** The xUpdate method for GEOPOLY module virtual tables. +** +** For DELETE: +** +** argv[0] = the rowid to be deleted +** +** For INSERT: +** +** argv[0] = SQL NULL +** argv[1] = rowid to insert, or an SQL NULL to select automatically +** argv[2] = _shape column +** argv[3] = first application-defined column.... +** +** For UPDATE: +** +** argv[0] = rowid to modify. Never NULL +** argv[1] = rowid after the change. Never NULL +** argv[2] = new value for _shape +** argv[3] = new value for first application-defined column.... +*/ +static int geopolyUpdate( + sqlite3_vtab *pVtab, + int nData, + sqlite3_value **aData, + sqlite_int64 *pRowid +){ + Rtree *pRtree = (Rtree *)pVtab; + int rc = SQLITE_OK; + RtreeCell cell; /* New cell to insert if nData>1 */ + i64 oldRowid; /* The old rowid */ + int oldRowidValid; /* True if oldRowid is valid */ + i64 newRowid; /* The new rowid */ + int newRowidValid; /* True if newRowid is valid */ + int coordChange = 0; /* Change in coordinates */ + + if( pRtree->nNodeRef ){ + /* Unable to write to the btree while another cursor is reading from it, + ** since the write might do a rebalance which would disrupt the read + ** cursor. */ + return SQLITE_LOCKED_VTAB; + } + rtreeReference(pRtree); + assert(nData>=1); + + oldRowidValid = sqlite3_value_type(aData[0])!=SQLITE_NULL;; + oldRowid = oldRowidValid ? sqlite3_value_int64(aData[0]) : 0; + newRowidValid = nData>1 && sqlite3_value_type(aData[1])!=SQLITE_NULL; + newRowid = newRowidValid ? sqlite3_value_int64(aData[1]) : 0; + cell.iRowid = newRowid; + + if( nData>1 /* not a DELETE */ + && (!oldRowidValid /* INSERT */ + || !sqlite3_value_nochange(aData[2]) /* UPDATE _shape */ + || oldRowid!=newRowid) /* Rowid change */ + ){ + assert( aData[2]!=0 ); + geopolyBBox(0, aData[2], cell.aCoord, &rc); + if( rc ){ + if( rc==SQLITE_ERROR ){ + pVtab->zErrMsg = + sqlite3_mprintf("_shape does not contain a valid polygon"); + } + goto geopoly_update_end; + } + coordChange = 1; + + /* If a rowid value was supplied, check if it is already present in + ** the table. If so, the constraint has failed. */ + if( newRowidValid && (!oldRowidValid || oldRowid!=newRowid) ){ + int steprc; + sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid); + steprc = sqlite3_step(pRtree->pReadRowid); + rc = sqlite3_reset(pRtree->pReadRowid); + if( SQLITE_ROW==steprc ){ + if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){ + rc = rtreeDeleteRowid(pRtree, cell.iRowid); + }else{ + rc = rtreeConstraintError(pRtree, 0); + } + } + } + } + + /* If aData[0] is not an SQL NULL value, it is the rowid of a + ** record to delete from the r-tree table. The following block does + ** just that. + */ + if( rc==SQLITE_OK && (nData==1 || (coordChange && oldRowidValid)) ){ + rc = rtreeDeleteRowid(pRtree, oldRowid); + } + + /* If the aData[] array contains more than one element, elements + ** (aData[2]..aData[argc-1]) contain a new record to insert into + ** the r-tree structure. + */ + if( rc==SQLITE_OK && nData>1 && coordChange ){ + /* Insert the new record into the r-tree */ + RtreeNode *pLeaf = 0; + if( !newRowidValid ){ + rc = rtreeNewRowid(pRtree, &cell.iRowid); + } + *pRowid = cell.iRowid; + if( rc==SQLITE_OK ){ + rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); + } + if( rc==SQLITE_OK ){ + int rc2; + pRtree->iReinsertHeight = -1; + rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); + rc2 = nodeRelease(pRtree, pLeaf); + if( rc==SQLITE_OK ){ + rc = rc2; + } + } + } + + /* Change the data */ + if( rc==SQLITE_OK && nData>1 ){ + sqlite3_stmt *pUp = pRtree->pWriteAux; + int jj; + int nChange = 0; + sqlite3_bind_int64(pUp, 1, cell.iRowid); + assert( pRtree->nAux>=1 ); + if( sqlite3_value_nochange(aData[2]) ){ + sqlite3_bind_null(pUp, 2); + }else{ + GeoPoly *p = 0; + if( sqlite3_value_type(aData[2])==SQLITE_TEXT + && (p = geopolyFuncParam(0, aData[2], &rc))!=0 + && rc==SQLITE_OK + ){ + sqlite3_bind_blob(pUp, 2, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); + }else{ + sqlite3_bind_value(pUp, 2, aData[2]); + } + sqlite3_free(p); + nChange = 1; + } + for(jj=1; jjnAux; jj++){ + nChange++; + sqlite3_bind_value(pUp, jj+2, aData[jj+2]); + } + if( nChange ){ + sqlite3_step(pUp); + rc = sqlite3_reset(pUp); + } + } + +geopoly_update_end: + rtreeRelease(pRtree); + return rc; +} + +/* +** Report that geopoly_overlap() is an overloaded function suitable +** for use in xBestIndex. +*/ +static int geopolyFindFunction( + sqlite3_vtab *pVtab, + int nArg, + const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg +){ + if( sqlite3_stricmp(zName, "geopoly_overlap")==0 ){ + *pxFunc = geopolyOverlapFunc; + *ppArg = 0; + return SQLITE_INDEX_CONSTRAINT_FUNCTION; + } + if( sqlite3_stricmp(zName, "geopoly_within")==0 ){ + *pxFunc = geopolyWithinFunc; + *ppArg = 0; + return SQLITE_INDEX_CONSTRAINT_FUNCTION+1; + } + return 0; +} + + +static sqlite3_module geopolyModule = { + 3, /* iVersion */ + geopolyCreate, /* xCreate - create a table */ + geopolyConnect, /* xConnect - connect to an existing table */ + geopolyBestIndex, /* xBestIndex - Determine search strategy */ + rtreeDisconnect, /* xDisconnect - Disconnect from a table */ + rtreeDestroy, /* xDestroy - Drop a table */ + rtreeOpen, /* xOpen - open a cursor */ + rtreeClose, /* xClose - close a cursor */ + geopolyFilter, /* xFilter - configure scan constraints */ + rtreeNext, /* xNext - advance a cursor */ + rtreeEof, /* xEof */ + geopolyColumn, /* xColumn - read data */ + rtreeRowid, /* xRowid - read data */ + geopolyUpdate, /* xUpdate - write data */ + rtreeBeginTransaction, /* xBegin - begin transaction */ + rtreeEndTransaction, /* xSync - sync transaction */ + rtreeEndTransaction, /* xCommit - commit transaction */ + rtreeEndTransaction, /* xRollback - rollback transaction */ + geopolyFindFunction, /* xFindFunction - function overloading */ + rtreeRename, /* xRename - rename the table */ + rtreeSavepoint, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + rtreeShadowName /* xShadowName */ +}; + +static int sqlite3_geopoly_init(sqlite3 *db){ + int rc = SQLITE_OK; + static const struct { + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + signed char nArg; + unsigned char bPure; + const char *zName; + } aFunc[] = { + { geopolyAreaFunc, 1, 1, "geopoly_area" }, + { geopolyBlobFunc, 1, 1, "geopoly_blob" }, + { geopolyJsonFunc, 1, 1, "geopoly_json" }, + { geopolySvgFunc, -1, 1, "geopoly_svg" }, + { geopolyWithinFunc, 2, 1, "geopoly_within" }, + { geopolyContainsPointFunc, 3, 1, "geopoly_contains_point" }, + { geopolyOverlapFunc, 2, 1, "geopoly_overlap" }, + { geopolyDebugFunc, 1, 0, "geopoly_debug" }, + { geopolyBBoxFunc, 1, 1, "geopoly_bbox" }, + { geopolyXformFunc, 7, 1, "geopoly_xform" }, + { geopolyRegularFunc, 4, 1, "geopoly_regular" }, + { geopolyCcwFunc, 1, 1, "geopoly_ccw" }, + }; + static const struct { + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinal)(sqlite3_context*); + const char *zName; + } aAgg[] = { + { geopolyBBoxStep, geopolyBBoxFinal, "geopoly_group_bbox" }, + }; + int i; + for(i=0; ixDestructor ) pInfo->xDestructor(pInfo->pContext); + sqlite3_free(p); +} + +/* +** This routine frees the BLOB that is returned by geomCallback(). +*/ +static void rtreeMatchArgFree(void *pArg){ + int i; + RtreeMatchArg *p = (RtreeMatchArg*)pArg; + for(i=0; inParam; i++){ + sqlite3_value_free(p->apSqlParam[i]); + } + sqlite3_free(p); +} + +/* +** Each call to sqlite3_rtree_geometry_callback() or +** sqlite3_rtree_query_callback() creates an ordinary SQLite +** scalar function that is implemented by this routine. +** +** All this function does is construct an RtreeMatchArg object that +** contains the geometry-checking callback routines and a list of +** parameters to this function, then return that RtreeMatchArg object +** as a BLOB. +** +** The R-Tree MATCH operator will read the returned BLOB, deserialize +** the RtreeMatchArg object, and use the RtreeMatchArg object to figure +** out which elements of the R-Tree should be returned by the query. +*/ +static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ + RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); + RtreeMatchArg *pBlob; + sqlite3_int64 nBlob; + int memErr = 0; + + nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + + nArg*sizeof(sqlite3_value*); + pBlob = (RtreeMatchArg *)sqlite3_malloc64(nBlob); + if( !pBlob ){ + sqlite3_result_error_nomem(ctx); + }else{ + int i; + pBlob->iSize = nBlob; + pBlob->cb = pGeomCtx[0]; + pBlob->apSqlParam = (sqlite3_value**)&pBlob->aParam[nArg]; + pBlob->nParam = nArg; + for(i=0; iapSqlParam[i] = sqlite3_value_dup(aArg[i]); + if( pBlob->apSqlParam[i]==0 ) memErr = 1; +#ifdef SQLITE_RTREE_INT_ONLY + pBlob->aParam[i] = sqlite3_value_int64(aArg[i]); +#else + pBlob->aParam[i] = sqlite3_value_double(aArg[i]); +#endif + } + if( memErr ){ + sqlite3_result_error_nomem(ctx); + rtreeMatchArgFree(pBlob); + }else{ + sqlite3_result_pointer(ctx, pBlob, "RtreeMatchArg", rtreeMatchArgFree); + } + } +} + +/* +** Register a new geometry function for use with the r-tree MATCH operator. +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, /* Register SQL function on this connection */ + const char *zGeom, /* Name of the new SQL function */ + int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*), /* Callback */ + void *pContext /* Extra data associated with the callback */ +){ + RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */ + + /* Allocate and populate the context object. */ + pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); + if( !pGeomCtx ) return SQLITE_NOMEM; + pGeomCtx->xGeom = xGeom; + pGeomCtx->xQueryFunc = 0; + pGeomCtx->xDestructor = 0; + pGeomCtx->pContext = pContext; + return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY, + (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback + ); +} + +/* +** Register a new 2nd-generation geometry function for use with the +** r-tree MATCH operator. +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, /* Register SQL function on this connection */ + const char *zQueryFunc, /* Name of new SQL function */ + int (*xQueryFunc)(sqlite3_rtree_query_info*), /* Callback */ + void *pContext, /* Extra data passed into the callback */ + void (*xDestructor)(void*) /* Destructor for the extra data */ +){ + RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */ + + /* Allocate and populate the context object. */ + pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); + if( !pGeomCtx ){ + if( xDestructor ) xDestructor(pContext); + return SQLITE_NOMEM; + } + pGeomCtx->xGeom = 0; + pGeomCtx->xQueryFunc = xQueryFunc; + pGeomCtx->xDestructor = xDestructor; + pGeomCtx->pContext = pContext; + return sqlite3_create_function_v2(db, zQueryFunc, -1, SQLITE_ANY, + (void *)pGeomCtx, geomCallback, 0, 0, rtreeFreeCallback + ); +} + +#if !SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_rtree_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3RtreeInit(db); +} +#endif + +#endif + +/************** End of rtree.c ***********************************************/ +/************** Begin file icu.c *********************************************/ +/* +** 2007 May 6 +** +** 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. +** +************************************************************************* +** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $ +** +** This file implements an integration between the ICU library +** ("International Components for Unicode", an open-source library +** for handling unicode data) and SQLite. The integration uses +** ICU to provide the following to SQLite: +** +** * An implementation of the SQL regexp() function (and hence REGEXP +** operator) using the ICU uregex_XX() APIs. +** +** * Implementations of the SQL scalar upper() and lower() functions +** for case mapping. +** +** * Integration of ICU and SQLite collation sequences. +** +** * An implementation of the LIKE operator that uses ICU to +** provide case-independent matching. +*/ + +#if !defined(SQLITE_CORE) \ + || defined(SQLITE_ENABLE_ICU) \ + || defined(SQLITE_ENABLE_ICU_COLLATIONS) + +/* Include ICU headers */ +#include +#include +#include +#include + +/* #include */ + +#ifndef SQLITE_CORE +/* #include "sqlite3ext.h" */ + SQLITE_EXTENSION_INIT1 +#else +/* #include "sqlite3.h" */ +#endif + +/* +** This function is called when an ICU function called from within +** the implementation of an SQL scalar function returns an error. +** +** The scalar function context passed as the first argument is +** loaded with an error message based on the following two args. +*/ +static void icuFunctionError( + sqlite3_context *pCtx, /* SQLite scalar function context */ + const char *zName, /* Name of ICU function that failed */ + UErrorCode e /* Error code returned by ICU function */ +){ + char zBuf[128]; + sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); + zBuf[127] = '\0'; + sqlite3_result_error(pCtx, zBuf, -1); +} + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Version of sqlite3_free() that is always a function, never a macro. +*/ +static void xFree(void *p){ + sqlite3_free(p); +} + +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. It is copied here from SQLite source +** code file utf8.c. +*/ +static const unsigned char icuUtf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define SQLITE_ICU_READ_UTF8(zIn, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = icuUtf8Trans1[c-0xc0]; \ + while( (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + } + +#define SQLITE_ICU_SKIP_UTF8(zIn) \ + assert( *zIn ); \ + if( *(zIn++)>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){zIn++;} \ + } + + +/* +** Compare two UTF-8 strings for equality where the first string is +** a "LIKE" expression. Return true (1) if they are the same and +** false (0) if they are different. +*/ +static int icuLikeCompare( + const uint8_t *zPattern, /* LIKE pattern */ + const uint8_t *zString, /* The UTF-8 string to compare against */ + const UChar32 uEsc /* The escape character */ +){ + static const uint32_t MATCH_ONE = (uint32_t)'_'; + static const uint32_t MATCH_ALL = (uint32_t)'%'; + + int prevEscape = 0; /* True if the previous character was uEsc */ + + while( 1 ){ + + /* Read (and consume) the next character from the input pattern. */ + uint32_t uPattern; + SQLITE_ICU_READ_UTF8(zPattern, uPattern); + if( uPattern==0 ) break; + + /* There are now 4 possibilities: + ** + ** 1. uPattern is an unescaped match-all character "%", + ** 2. uPattern is an unescaped match-one character "_", + ** 3. uPattern is an unescaped escape character, or + ** 4. uPattern is to be handled as an ordinary character + */ + if( uPattern==MATCH_ALL && !prevEscape && uPattern!=(uint32_t)uEsc ){ + /* Case 1. */ + uint8_t c; + + /* Skip any MATCH_ALL or MATCH_ONE characters that follow a + ** MATCH_ALL. For each MATCH_ONE, skip one character in the + ** test string. + */ + while( (c=*zPattern) == MATCH_ALL || c == MATCH_ONE ){ + if( c==MATCH_ONE ){ + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); + } + zPattern++; + } + + if( *zPattern==0 ) return 1; + + while( *zString ){ + if( icuLikeCompare(zPattern, zString, uEsc) ){ + return 1; + } + SQLITE_ICU_SKIP_UTF8(zString); + } + return 0; + + }else if( uPattern==MATCH_ONE && !prevEscape && uPattern!=(uint32_t)uEsc ){ + /* Case 2. */ + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); + + }else if( uPattern==(uint32_t)uEsc && !prevEscape ){ + /* Case 3. */ + prevEscape = 1; + + }else{ + /* Case 4. */ + uint32_t uString; + SQLITE_ICU_READ_UTF8(zString, uString); + uString = (uint32_t)u_foldCase((UChar32)uString, U_FOLD_CASE_DEFAULT); + uPattern = (uint32_t)u_foldCase((UChar32)uPattern, U_FOLD_CASE_DEFAULT); + if( uString!=uPattern ){ + return 0; + } + prevEscape = 0; + } + } + + return *zString==0; +} + +/* +** Implementation of the like() SQL function. This function implements +** the build-in LIKE operator. The first argument to the function is the +** pattern and the second argument is the string. So, the SQL statements: +** +** A LIKE B +** +** is implemented as like(B, A). If there is an escape character E, +** +** A LIKE B ESCAPE E +** +** is mapped to like(B, A, E). +*/ +static void icuLikeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const unsigned char *zA = sqlite3_value_text(argv[0]); + const unsigned char *zB = sqlite3_value_text(argv[1]); + UChar32 uEsc = 0; + + /* Limit the length of the LIKE or GLOB pattern to avoid problems + ** of deep recursion and N*N behavior in patternCompare(). + */ + if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ + sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); + return; + } + + + if( argc==3 ){ + /* The escape character string must consist of a single UTF-8 character. + ** Otherwise, return an error. + */ + int nE= sqlite3_value_bytes(argv[2]); + const unsigned char *zE = sqlite3_value_text(argv[2]); + int i = 0; + if( zE==0 ) return; + U8_NEXT(zE, i, nE, uEsc); + if( i!=nE){ + sqlite3_result_error(context, + "ESCAPE expression must be a single character", -1); + return; + } + } + + if( zA && zB ){ + sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); + } +} + +/* +** Function to delete compiled regexp objects. Registered as +** a destructor function with sqlite3_set_auxdata(). +*/ +static void icuRegexpDelete(void *p){ + URegularExpression *pExpr = (URegularExpression *)p; + uregex_close(pExpr); +} + +/* +** Implementation of SQLite REGEXP operator. This scalar function takes +** two arguments. The first is a regular expression pattern to compile +** the second is a string to match against that pattern. If either +** argument is an SQL NULL, then NULL Is returned. Otherwise, the result +** is 1 if the string matches the pattern, or 0 otherwise. +** +** SQLite maps the regexp() function to the regexp() operator such +** that the following two are equivalent: +** +** zString REGEXP zPattern +** regexp(zPattern, zString) +** +** Uses the following ICU regexp APIs: +** +** uregex_open() +** uregex_matches() +** uregex_close() +*/ +static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + UErrorCode status = U_ZERO_ERROR; + URegularExpression *pExpr; + UBool res; + const UChar *zString = sqlite3_value_text16(apArg[1]); + + (void)nArg; /* Unused parameter */ + + /* If the left hand side of the regexp operator is NULL, + ** then the result is also NULL. + */ + if( !zString ){ + return; + } + + pExpr = sqlite3_get_auxdata(p, 0); + if( !pExpr ){ + const UChar *zPattern = sqlite3_value_text16(apArg[0]); + if( !zPattern ){ + return; + } + pExpr = uregex_open(zPattern, -1, 0, 0, &status); + + if( U_SUCCESS(status) ){ + sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); + }else{ + assert(!pExpr); + icuFunctionError(p, "uregex_open", status); + return; + } + } + + /* Configure the text that the regular expression operates on. */ + uregex_setText(pExpr, zString, -1, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_setText", status); + return; + } + + /* Attempt the match */ + res = uregex_matches(pExpr, 0, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "uregex_matches", status); + return; + } + + /* Set the text that the regular expression operates on to a NULL + ** pointer. This is not really necessary, but it is tidier than + ** leaving the regular expression object configured with an invalid + ** pointer after this function returns. + */ + uregex_setText(pExpr, 0, 0, &status); + + /* Return 1 or 0. */ + sqlite3_result_int(p, res ? 1 : 0); +} + +/* +** Implementations of scalar functions for case mapping - upper() and +** lower(). Function upper() converts its input to upper-case (ABC). +** Function lower() converts to lower-case (abc). +** +** ICU provides two types of case mapping, "general" case mapping and +** "language specific". Refer to ICU documentation for the differences +** between the two. +** +** To utilise "general" case mapping, the upper() or lower() scalar +** functions are invoked with one argument: +** +** upper('ABC') -> 'abc' +** lower('abc') -> 'ABC' +** +** To access ICU "language specific" case mapping, upper() or lower() +** should be invoked with two arguments. The second argument is the name +** of the locale to use. Passing an empty string ("") or SQL NULL value +** as the second argument is the same as invoking the 1 argument version +** of upper() or lower(). +** +** lower('I', 'en_us') -> 'i' +** lower('I', 'tr_tr') -> '\u131' (small dotless i) +** +** http://www.icu-project.org/userguide/posix.html#case_mappings +*/ +static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + const UChar *zInput; /* Pointer to input string */ + UChar *zOutput = 0; /* Pointer to output buffer */ + int nInput; /* Size of utf-16 input string in bytes */ + int nOut; /* Size of output buffer in bytes */ + int cnt; + int bToUpper; /* True for toupper(), false for tolower() */ + UErrorCode status; + const char *zLocale = 0; + + assert(nArg==1 || nArg==2); + bToUpper = (sqlite3_user_data(p)!=0); + if( nArg==2 ){ + zLocale = (const char *)sqlite3_value_text(apArg[1]); + } + + zInput = sqlite3_value_text16(apArg[0]); + if( !zInput ){ + return; + } + nOut = nInput = sqlite3_value_bytes16(apArg[0]); + if( nOut==0 ){ + sqlite3_result_text16(p, "", 0, SQLITE_STATIC); + return; + } + + for(cnt=0; cnt<2; cnt++){ + UChar *zNew = sqlite3_realloc(zOutput, nOut); + if( zNew==0 ){ + sqlite3_free(zOutput); + sqlite3_result_error_nomem(p); + return; + } + zOutput = zNew; + status = U_ZERO_ERROR; + if( bToUpper ){ + nOut = 2*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + }else{ + nOut = 2*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + } + + if( U_SUCCESS(status) ){ + sqlite3_result_text16(p, zOutput, nOut, xFree); + }else if( status==U_BUFFER_OVERFLOW_ERROR ){ + assert( cnt==0 ); + continue; + }else{ + icuFunctionError(p, bToUpper ? "u_strToUpper" : "u_strToLower", status); + } + return; + } + assert( 0 ); /* Unreachable */ +} + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ + +/* +** Collation sequence destructor function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static void icuCollationDel(void *pCtx){ + UCollator *p = (UCollator *)pCtx; + ucol_close(p); +} + +/* +** Collation sequence comparison function. The pCtx argument points to +** a UCollator structure previously allocated using ucol_open(). +*/ +static int icuCollationColl( + void *pCtx, + int nLeft, + const void *zLeft, + int nRight, + const void *zRight +){ + UCollationResult res; + UCollator *p = (UCollator *)pCtx; + res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); + switch( res ){ + case UCOL_LESS: return -1; + case UCOL_GREATER: return +1; + case UCOL_EQUAL: return 0; + } + assert(!"Unexpected return value from ucol_strcoll()"); + return 0; +} + +/* +** Implementation of the scalar function icu_load_collation(). +** +** This scalar function is used to add ICU collation based collation +** types to an SQLite database connection. It is intended to be called +** as follows: +** +** SELECT icu_load_collation(, ); +** +** Where is a string containing an ICU locale identifier (i.e. +** "en_AU", "tr_TR" etc.) and is the name of the +** collation sequence to create. +*/ +static void icuLoadCollation( + sqlite3_context *p, + int nArg, + sqlite3_value **apArg +){ + sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); + UErrorCode status = U_ZERO_ERROR; + const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ + const char *zName; /* SQL Collation sequence name (eg. "japanese") */ + UCollator *pUCollator; /* ICU library collation object */ + int rc; /* Return code from sqlite3_create_collation_x() */ + + assert(nArg==2); + (void)nArg; /* Unused parameter */ + zLocale = (const char *)sqlite3_value_text(apArg[0]); + zName = (const char *)sqlite3_value_text(apArg[1]); + + if( !zLocale || !zName ){ + return; + } + + pUCollator = ucol_open(zLocale, &status); + if( !U_SUCCESS(status) ){ + icuFunctionError(p, "ucol_open", status); + return; + } + assert(p); + + rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, + icuCollationColl, icuCollationDel + ); + if( rc!=SQLITE_OK ){ + ucol_close(pUCollator); + sqlite3_result_error(p, "Error registering collation function", -1); + } +} + +/* +** Register the ICU extension functions with database db. +*/ +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ +# define SQLITEICU_EXTRAFLAGS (SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS) + static const struct IcuScalar { + const char *zName; /* Function name */ + unsigned char nArg; /* Number of arguments */ + unsigned int enc; /* Optimal text encoding */ + unsigned char iContext; /* sqlite3_user_data() context */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } scalars[] = { + {"icu_load_collation",2,SQLITE_UTF8|SQLITE_DIRECTONLY,1, icuLoadCollation}, +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + {"regexp", 2, SQLITE_ANY|SQLITEICU_EXTRAFLAGS, 0, icuRegexpFunc}, + {"lower", 1, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF16|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"lower", 1, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 1, icuCaseFunc16}, + {"like", 2, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuLikeFunc}, + {"like", 3, SQLITE_UTF8|SQLITEICU_EXTRAFLAGS, 0, icuLikeFunc}, +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ + }; + int rc = SQLITE_OK; + int i; + + for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ + const struct IcuScalar *p = &scalars[i]; + rc = sqlite3_create_function( + db, p->zName, p->nArg, p->enc, + p->iContext ? (void*)db : (void*)0, + p->xFunc, 0, 0 + ); + } + + return rc; +} + +#if !SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_icu_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi) + return sqlite3IcuInit(db); +} +#endif + +#endif + +/************** End of icu.c *************************************************/ +/************** Begin file fts3_icu.c ****************************************/ +/* +** 2007 June 22 +** +** 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 a tokenizer for fts3 based on the ICU library. +*/ +/* #include "fts3Int.h" */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) +#ifdef SQLITE_ENABLE_ICU + +/* #include */ +/* #include */ +/* #include "fts3_tokenizer.h" */ + +#include +/* #include */ +/* #include */ +#include + +typedef struct IcuTokenizer IcuTokenizer; +typedef struct IcuCursor IcuCursor; + +struct IcuTokenizer { + sqlite3_tokenizer base; + char *zLocale; +}; + +struct IcuCursor { + sqlite3_tokenizer_cursor base; + + UBreakIterator *pIter; /* ICU break-iterator object */ + int nChar; /* Number of UChar elements in pInput */ + UChar *aChar; /* Copy of input using utf-16 encoding */ + int *aOffset; /* Offsets of each character in utf-8 input */ + + int nBuffer; + char *zBuffer; + + int iToken; +}; + +/* +** Create a new tokenizer instance. +*/ +static int icuCreate( + int argc, /* Number of entries in argv[] */ + const char * const *argv, /* Tokenizer creation arguments */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ +){ + IcuTokenizer *p; + int n = 0; + + if( argc>0 ){ + n = strlen(argv[0])+1; + } + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); + if( !p ){ + return SQLITE_NOMEM; + } + memset(p, 0, sizeof(IcuTokenizer)); + + if( n ){ + p->zLocale = (char *)&p[1]; + memcpy(p->zLocale, argv[0], n); + } + + *ppTokenizer = (sqlite3_tokenizer *)p; + + return SQLITE_OK; +} + +/* +** Destroy a tokenizer +*/ +static int icuDestroy(sqlite3_tokenizer *pTokenizer){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Prepare to begin tokenizing a particular string. The input +** string to be tokenized is pInput[0..nBytes-1]. A cursor +** used to incrementally tokenize this string is returned in +** *ppCursor. +*/ +static int icuOpen( + sqlite3_tokenizer *pTokenizer, /* The tokenizer */ + const char *zInput, /* Input string */ + int nInput, /* Length of zInput in bytes */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ +){ + IcuTokenizer *p = (IcuTokenizer *)pTokenizer; + IcuCursor *pCsr; + + const int32_t opt = U_FOLD_CASE_DEFAULT; + UErrorCode status = U_ZERO_ERROR; + int nChar; + + UChar32 c; + int iInput = 0; + int iOut = 0; + + *ppCursor = 0; + + if( zInput==0 ){ + nInput = 0; + zInput = ""; + }else if( nInput<0 ){ + nInput = strlen(zInput); + } + nChar = nInput+1; + pCsr = (IcuCursor *)sqlite3_malloc64( + sizeof(IcuCursor) + /* IcuCursor */ + ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ + (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ + ); + if( !pCsr ){ + return SQLITE_NOMEM; + } + memset(pCsr, 0, sizeof(IcuCursor)); + pCsr->aChar = (UChar *)&pCsr[1]; + pCsr->aOffset = (int *)&pCsr->aChar[(nChar+3)&~3]; + + pCsr->aOffset[iOut] = iInput; + U8_NEXT(zInput, iInput, nInput, c); + while( c>0 ){ + int isError = 0; + c = u_foldCase(c, opt); + U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); + if( isError ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->aOffset[iOut] = iInput; + + if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); + if( !U_SUCCESS(status) ){ + sqlite3_free(pCsr); + return SQLITE_ERROR; + } + pCsr->nChar = iOut; + + ubrk_first(pCsr->pIter); + *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Close a tokenization cursor previously opened by a call to icuOpen(). +*/ +static int icuClose(sqlite3_tokenizer_cursor *pCursor){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + ubrk_close(pCsr->pIter); + sqlite3_free(pCsr->zBuffer); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Extract the next token from a tokenization cursor. +*/ +static int icuNext( + sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ + const char **ppToken, /* OUT: *ppToken is the token text */ + int *pnBytes, /* OUT: Number of bytes in token */ + int *piStartOffset, /* OUT: Starting offset of token */ + int *piEndOffset, /* OUT: Ending offset of token */ + int *piPosition /* OUT: Position integer of token */ +){ + IcuCursor *pCsr = (IcuCursor *)pCursor; + + int iStart = 0; + int iEnd = 0; + int nByte = 0; + + while( iStart==iEnd ){ + UChar32 c; + + iStart = ubrk_current(pCsr->pIter); + iEnd = ubrk_next(pCsr->pIter); + if( iEnd==UBRK_DONE ){ + return SQLITE_DONE; + } + + while( iStartaChar, iWhite, pCsr->nChar, c); + if( u_isspace(c) ){ + iStart = iWhite; + }else{ + break; + } + } + assert(iStart<=iEnd); + } + + do { + UErrorCode status = U_ZERO_ERROR; + if( nByte ){ + char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); + if( !zNew ){ + return SQLITE_NOMEM; + } + pCsr->zBuffer = zNew; + pCsr->nBuffer = nByte; + } + + u_strToUTF8( + pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ + &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ + &status /* Output success/failure */ + ); + } while( nByte>pCsr->nBuffer ); + + *ppToken = pCsr->zBuffer; + *pnBytes = nByte; + *piStartOffset = pCsr->aOffset[iStart]; + *piEndOffset = pCsr->aOffset[iEnd]; + *piPosition = pCsr->iToken++; + + return SQLITE_OK; +} + +/* +** The set of routines that implement the simple tokenizer +*/ +static const sqlite3_tokenizer_module icuTokenizerModule = { + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ + 0, /* xLanguageid */ +}; + +/* +** Set *ppModule to point at the implementation of the ICU tokenizer. +*/ +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( + sqlite3_tokenizer_module const**ppModule +){ + *ppModule = &icuTokenizerModule; +} + +#endif /* defined(SQLITE_ENABLE_ICU) */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ + +/************** End of fts3_icu.c ********************************************/ +/************** Begin file sqlite3rbu.c **************************************/ +/* +** 2014 August 30 +** +** 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. +** +************************************************************************* +** +** +** OVERVIEW +** +** The RBU extension requires that the RBU update be packaged as an +** SQLite database. The tables it expects to find are described in +** sqlite3rbu.h. Essentially, for each table xyz in the target database +** that the user wishes to write to, a corresponding data_xyz table is +** created in the RBU database and populated with one row for each row to +** update, insert or delete from the target table. +** +** The update proceeds in three stages: +** +** 1) The database is updated. The modified database pages are written +** to a *-oal file. A *-oal file is just like a *-wal file, except +** that it is named "-oal" instead of "-wal". +** Because regular SQLite clients do not look for file named +** "-oal", they go on using the original database in +** rollback mode while the *-oal file is being generated. +** +** During this stage RBU does not update the database by writing +** directly to the target tables. Instead it creates "imposter" +** tables using the SQLITE_TESTCTRL_IMPOSTER interface that it uses +** to update each b-tree individually. All updates required by each +** b-tree are completed before moving on to the next, and all +** updates are done in sorted key order. +** +** 2) The "-oal" file is moved to the equivalent "-wal" +** location using a call to rename(2). Before doing this the RBU +** module takes an EXCLUSIVE lock on the database file, ensuring +** that there are no other active readers. +** +** Once the EXCLUSIVE lock is released, any other database readers +** detect the new *-wal file and read the database in wal mode. At +** this point they see the new version of the database - including +** the updates made as part of the RBU update. +** +** 3) The new *-wal file is checkpointed. This proceeds in the same way +** as a regular database checkpoint, except that a single frame is +** checkpointed each time sqlite3rbu_step() is called. If the RBU +** handle is closed before the entire *-wal file is checkpointed, +** the checkpoint progress is saved in the RBU database and the +** checkpoint can be resumed by another RBU client at some point in +** the future. +** +** POTENTIAL PROBLEMS +** +** The rename() call might not be portable. And RBU is not currently +** syncing the directory after renaming the file. +** +** When state is saved, any commit to the *-oal file and the commit to +** the RBU update database are not atomic. So if the power fails at the +** wrong moment they might get out of sync. As the main database will be +** committed before the RBU update database this will likely either just +** pass unnoticed, or result in SQLITE_CONSTRAINT errors (due to UNIQUE +** constraint violations). +** +** If some client does modify the target database mid RBU update, or some +** other error occurs, the RBU extension will keep throwing errors. It's +** not really clear how to get out of this state. The system could just +** by delete the RBU update database and *-oal file and have the device +** download the update again and start over. +** +** At present, for an UPDATE, both the new.* and old.* records are +** collected in the rbu_xyz table. And for both UPDATEs and DELETEs all +** fields are collected. This means we're probably writing a lot more +** data to disk when saving the state of an ongoing update to the RBU +** update database than is strictly necessary. +** +*/ + +/* #include */ +/* #include */ +/* #include */ + +/* #include "sqlite3.h" */ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RBU) +/************** Include sqlite3rbu.h in the middle of sqlite3rbu.c ***********/ +/************** Begin file sqlite3rbu.h **************************************/ +/* +** 2014 August 30 +** +** 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 contains the public interface for the RBU extension. +*/ + +/* +** SUMMARY +** +** Writing a transaction containing a large number of operations on +** b-tree indexes that are collectively larger than the available cache +** memory can be very inefficient. +** +** The problem is that in order to update a b-tree, the leaf page (at least) +** containing the entry being inserted or deleted must be modified. If the +** working set of leaves is larger than the available cache memory, then a +** single leaf that is modified more than once as part of the transaction +** may be loaded from or written to the persistent media multiple times. +** Additionally, because the index updates are likely to be applied in +** random order, access to pages within the database is also likely to be in +** random order, which is itself quite inefficient. +** +** One way to improve the situation is to sort the operations on each index +** by index key before applying them to the b-tree. This leads to an IO +** pattern that resembles a single linear scan through the index b-tree, +** and all but guarantees each modified leaf page is loaded and stored +** exactly once. SQLite uses this trick to improve the performance of +** CREATE INDEX commands. This extension allows it to be used to improve +** the performance of large transactions on existing databases. +** +** Additionally, this extension allows the work involved in writing the +** large transaction to be broken down into sub-transactions performed +** sequentially by separate processes. This is useful if the system cannot +** guarantee that a single update process will run for long enough to apply +** the entire update, for example because the update is being applied on a +** mobile device that is frequently rebooted. Even after the writer process +** has committed one or more sub-transactions, other database clients continue +** to read from the original database snapshot. In other words, partially +** applied transactions are not visible to other clients. +** +** "RBU" stands for "Resumable Bulk Update". As in a large database update +** transmitted via a wireless network to a mobile device. A transaction +** applied using this extension is hence refered to as an "RBU update". +** +** +** LIMITATIONS +** +** An "RBU update" transaction is subject to the following limitations: +** +** * The transaction must consist of INSERT, UPDATE and DELETE operations +** only. +** +** * INSERT statements may not use any default values. +** +** * UPDATE and DELETE statements must identify their target rows by +** non-NULL PRIMARY KEY values. Rows with NULL values stored in PRIMARY +** KEY fields may not be updated or deleted. If the table being written +** has no PRIMARY KEY, affected rows must be identified by rowid. +** +** * UPDATE statements may not modify PRIMARY KEY columns. +** +** * No triggers will be fired. +** +** * No foreign key violations are detected or reported. +** +** * CHECK constraints are not enforced. +** +** * No constraint handling mode except for "OR ROLLBACK" is supported. +** +** +** PREPARATION +** +** An "RBU update" is stored as a separate SQLite database. A database +** containing an RBU update is an "RBU database". For each table in the +** target database to be updated, the RBU database should contain a table +** named "data_" containing the same set of columns as the +** target table, and one more - "rbu_control". The data_% table should +** have no PRIMARY KEY or UNIQUE constraints, but each column should have +** the same type as the corresponding column in the target database. +** The "rbu_control" column should have no type at all. For example, if +** the target database contains: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c UNIQUE); +** +** Then the RBU database should contain: +** +** CREATE TABLE data_t1(a INTEGER, b TEXT, c, rbu_control); +** +** The order of the columns in the data_% table does not matter. +** +** Instead of a regular table, the RBU database may also contain virtual +** tables or view named using the data_ naming scheme. +** +** Instead of the plain data_ naming scheme, RBU database tables +** may also be named data_, where is any sequence +** of zero or more numeric characters (0-9). This can be significant because +** tables within the RBU database are always processed in order sorted by +** name. By judicious selection of the portion of the names +** of the RBU tables the user can therefore control the order in which they +** are processed. This can be useful, for example, to ensure that "external +** content" FTS4 tables are updated before their underlying content tables. +** +** If the target database table is a virtual table or a table that has no +** PRIMARY KEY declaration, the data_% table must also contain a column +** named "rbu_rowid". This column is mapped to the tables implicit primary +** key column - "rowid". Virtual tables for which the "rowid" column does +** not function like a primary key value cannot be updated using RBU. For +** example, if the target db contains either of the following: +** +** CREATE VIRTUAL TABLE x1 USING fts3(a, b); +** CREATE TABLE x1(a, b) +** +** then the RBU database should contain: +** +** CREATE TABLE data_x1(a, b, rbu_rowid, rbu_control); +** +** All non-hidden columns (i.e. all columns matched by "SELECT *") of the +** target table must be present in the input table. For virtual tables, +** hidden columns are optional - they are updated by RBU if present in +** the input table, or not otherwise. For example, to write to an fts4 +** table with a hidden languageid column such as: +** +** CREATE VIRTUAL TABLE ft1 USING fts4(a, b, languageid='langid'); +** +** Either of the following input table schemas may be used: +** +** CREATE TABLE data_ft1(a, b, langid, rbu_rowid, rbu_control); +** CREATE TABLE data_ft1(a, b, rbu_rowid, rbu_control); +** +** For each row to INSERT into the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 0. The +** other columns should be set to the values that make up the new record +** to insert. +** +** If the target database table has an INTEGER PRIMARY KEY, it is not +** possible to insert a NULL value into the IPK column. Attempting to +** do so results in an SQLITE_MISMATCH error. +** +** For each row to DELETE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 1. The +** real primary key values of the row to delete should be stored in the +** corresponding columns of the data_% table. The values stored in the +** other columns are not used. +** +** For each row to UPDATE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain a value of type text. +** The real primary key values identifying the row to update should be +** stored in the corresponding columns of the data_% table row, as should +** the new values of all columns being update. The text value in the +** "rbu_control" column must contain the same number of characters as +** there are columns in the target database table, and must consist entirely +** of 'x' and '.' characters (or in some special cases 'd' - see below). For +** each column that is being updated, the corresponding character is set to +** 'x'. For those that remain as they are, the corresponding character of the +** rbu_control value should be set to '.'. For example, given the tables +** above, the update statement: +** +** UPDATE t1 SET c = 'usa' WHERE a = 4; +** +** is represented by the data_t1 row created by: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..x'); +** +** Instead of an 'x' character, characters of the rbu_control value specified +** for UPDATEs may also be set to 'd'. In this case, instead of updating the +** target table with the value stored in the corresponding data_% column, the +** user-defined SQL function "rbu_delta()" is invoked and the result stored in +** the target table column. rbu_delta() is invoked with two arguments - the +** original value currently stored in the target table column and the +** value specified in the data_xxx table. +** +** For example, this row: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d'); +** +** is similar to an UPDATE statement such as: +** +** UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4; +** +** Finally, if an 'f' character appears in place of a 'd' or 's' in an +** ota_control string, the contents of the data_xxx table column is assumed +** to be a "fossil delta" - a patch to be applied to a blob value in the +** format used by the fossil source-code management system. In this case +** the existing value within the target database table must be of type BLOB. +** It is replaced by the result of applying the specified fossil delta to +** itself. +** +** If the target database table is a virtual table or a table with no PRIMARY +** KEY, the rbu_control value should not include a character corresponding +** to the rbu_rowid value. For example, this: +** +** INSERT INTO data_ft1(a, b, rbu_rowid, rbu_control) +** VALUES(NULL, 'usa', 12, '.x'); +** +** causes a result similar to: +** +** UPDATE ft1 SET b = 'usa' WHERE rowid = 12; +** +** The data_xxx tables themselves should have no PRIMARY KEY declarations. +** However, RBU is more efficient if reading the rows in from each data_xxx +** table in "rowid" order is roughly the same as reading them sorted by +** the PRIMARY KEY of the corresponding target database table. In other +** words, rows should be sorted using the destination table PRIMARY KEY +** fields before they are inserted into the data_xxx tables. +** +** USAGE +** +** The API declared below allows an application to apply an RBU update +** stored on disk to an existing target database. Essentially, the +** application: +** +** 1) Opens an RBU handle using the sqlite3rbu_open() function. +** +** 2) Registers any required virtual table modules with the database +** handle returned by sqlite3rbu_db(). Also, if required, register +** the rbu_delta() implementation. +** +** 3) Calls the sqlite3rbu_step() function one or more times on +** the new handle. Each call to sqlite3rbu_step() performs a single +** b-tree operation, so thousands of calls may be required to apply +** a complete update. +** +** 4) Calls sqlite3rbu_close() to close the RBU update handle. If +** sqlite3rbu_step() has been called enough times to completely +** apply the update to the target database, then the RBU database +** is marked as fully applied. Otherwise, the state of the RBU +** update application is saved in the RBU database for later +** resumption. +** +** See comments below for more detail on APIs. +** +** If an update is only partially applied to the target database by the +** time sqlite3rbu_close() is called, various state information is saved +** within the RBU database. This allows subsequent processes to automatically +** resume the RBU update from where it left off. +** +** To remove all RBU extension state information, returning an RBU database +** to its original contents, it is sufficient to drop all tables that begin +** with the prefix "rbu_" +** +** DATABASE LOCKING +** +** An RBU update may not be applied to a database in WAL mode. Attempting +** to do so is an error (SQLITE_ERROR). +** +** While an RBU handle is open, a SHARED lock may be held on the target +** database file. This means it is possible for other clients to read the +** database, but not to write it. +** +** If an RBU update is started and then suspended before it is completed, +** then an external client writes to the database, then attempting to resume +** the suspended RBU update is also an error (SQLITE_BUSY). +*/ + +#ifndef _SQLITE3RBU_H +#define _SQLITE3RBU_H + +/* #include "sqlite3.h" ** Required for error code definitions ** */ + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3rbu sqlite3rbu; + +/* +** Open an RBU handle. +** +** Argument zTarget is the path to the target database. Argument zRbu is +** the path to the RBU database. Each call to this function must be matched +** by a call to sqlite3rbu_close(). When opening the databases, RBU passes +** the SQLITE_CONFIG_URI flag to sqlite3_open_v2(). So if either zTarget +** or zRbu begin with "file:", it will be interpreted as an SQLite +** database URI, not a regular file name. +** +** If the zState argument is passed a NULL value, the RBU extension stores +** the current state of the update (how many rows have been updated, which +** indexes are yet to be updated etc.) within the RBU database itself. This +** can be convenient, as it means that the RBU application does not need to +** organize removing a separate state file after the update is concluded. +** Or, if zState is non-NULL, it must be a path to a database file in which +** the RBU extension can store the state of the update. +** +** When resuming an RBU update, the zState argument must be passed the same +** value as when the RBU update was started. +** +** Once the RBU update is finished, the RBU extension does not +** automatically remove any zState database file, even if it created it. +** +** By default, RBU uses the default VFS to access the files on disk. To +** use a VFS other than the default, an SQLite "file:" URI containing a +** "vfs=..." option may be passed as the zTarget option. +** +** IMPORTANT NOTE FOR ZIPVFS USERS: The RBU extension works with all of +** SQLite's built-in VFSs, including the multiplexor VFS. However it does +** not work out of the box with zipvfs. Refer to the comment describing +** the zipvfs_create_vfs() API below for details on using RBU with zipvfs. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_open( + const char *zTarget, + const char *zRbu, + const char *zState +); + +/* +** Open an RBU handle to perform an RBU vacuum on database file zTarget. +** An RBU vacuum is similar to SQLite's built-in VACUUM command, except +** that it can be suspended and resumed like an RBU update. +** +** The second argument to this function identifies a database in which +** to store the state of the RBU vacuum operation if it is suspended. The +** first time sqlite3rbu_vacuum() is called, to start an RBU vacuum +** operation, the state database should either not exist or be empty +** (contain no tables). If an RBU vacuum is suspended by calling +** sqlite3rbu_close() on the RBU handle before sqlite3rbu_step() has +** returned SQLITE_DONE, the vacuum state is stored in the state database. +** The vacuum can be resumed by calling this function to open a new RBU +** handle specifying the same target and state databases. +** +** If the second argument passed to this function is NULL, then the +** name of the state database is "-vacuum", where +** is the name of the target database file. In this case, on UNIX, if the +** state database is not already present in the file-system, it is created +** with the same permissions as the target db is made. +** +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal +** use. +** +** This function does not delete the state database after an RBU vacuum +** is completed, even if it created it. However, if the call to +** sqlite3rbu_close() returns any value other than SQLITE_OK, the contents +** of the state tables within the state database are zeroed. This way, +** the next call to sqlite3rbu_vacuum() opens a handle that starts a +** new RBU vacuum operation. +** +** As with sqlite3rbu_open(), Zipvfs users should rever to the comment +** describing the sqlite3rbu_create_vfs() API function below for +** a description of the complications associated with using RBU with +** zipvfs databases. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( + const char *zTarget, + const char *zState +); + +/* +** Configure a limit for the amount of temp space that may be used by +** the RBU handle passed as the first argument. The new limit is specified +** in bytes by the second parameter. If it is positive, the limit is updated. +** If the second parameter to this function is passed zero, then the limit +** is removed entirely. If the second parameter is negative, the limit is +** not modified (this is useful for querying the current limit). +** +** In all cases the returned value is the current limit in bytes (zero +** indicates unlimited). +** +** If the temp space limit is exceeded during operation, an SQLITE_FULL +** error is returned. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size_limit(sqlite3rbu*, sqlite3_int64); + +/* +** Return the current amount of temp file space, in bytes, currently used by +** the RBU handle passed as the only argument. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); + +/* +** Internally, each RBU connection uses a separate SQLite database +** connection to access the target and rbu update databases. This +** API allows the application direct access to these database handles. +** +** The first argument passed to this function must be a valid, open, RBU +** handle. The second argument should be passed zero to access the target +** database handle, or non-zero to access the rbu update database handle. +** Accessing the underlying database handles may be useful in the +** following scenarios: +** +** * If any target tables are virtual tables, it may be necessary to +** call sqlite3_create_module() on the target database handle to +** register the required virtual table implementations. +** +** * If the data_xxx tables in the RBU source database are virtual +** tables, the application may need to call sqlite3_create_module() on +** the rbu update db handle to any required virtual table +** implementations. +** +** * If the application uses the "rbu_delta()" feature described above, +** it must use sqlite3_create_function() or similar to register the +** rbu_delta() implementation with the target database handle. +** +** If an error has occurred, either while opening or stepping the RBU object, +** this function may return NULL. The error code and message may be collected +** when sqlite3rbu_close() is called. +** +** Database handles returned by this function remain valid until the next +** call to any sqlite3rbu_xxx() function other than sqlite3rbu_db(). +*/ +SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu*, int bRbu); + +/* +** Do some work towards applying the RBU update to the target db. +** +** Return SQLITE_DONE if the update has been completely applied, or +** SQLITE_OK if no error occurs but there remains work to do to apply +** the RBU update. If an error does occur, some other error code is +** returned. +** +** Once a call to sqlite3rbu_step() has returned a value other than +** SQLITE_OK, all subsequent calls on the same RBU handle are no-ops +** that immediately return the same value. +*/ +SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); + +/* +** Force RBU to save its state to disk. +** +** If a power failure or application crash occurs during an update, following +** system recovery RBU may resume the update from the point at which the state +** was last saved. In other words, from the most recent successful call to +** sqlite3rbu_close() or this function. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); + +/* +** Close an RBU handle. +** +** If the RBU update has been completely applied, mark the RBU database +** as fully applied. Otherwise, assuming no error has occurred, save the +** current state of the RBU update appliation to the RBU database. +** +** If an error has already occurred as part of an sqlite3rbu_step() +** or sqlite3rbu_open() call, or if one occurs within this function, an +** SQLite error code is returned. Additionally, if pzErrmsg is not NULL, +** *pzErrmsg may be set to point to a buffer containing a utf-8 formatted +** English language error message. It is the responsibility of the caller to +** eventually free any such buffer using sqlite3_free(). +** +** Otherwise, if no error occurs, this function returns SQLITE_OK if the +** update has been partially applied, or SQLITE_DONE if it has been +** completely applied. +*/ +SQLITE_API int sqlite3rbu_close(sqlite3rbu *pRbu, char **pzErrmsg); + +/* +** Return the total number of key-value operations (inserts, deletes or +** updates) that have been performed on the target database since the +** current RBU update was started. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); + +/* +** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) +** progress indications for the two stages of an RBU update. This API may +** be useful for driving GUI progress indicators and similar. +** +** An RBU update is divided into two stages: +** +** * Stage 1, in which changes are accumulated in an oal/wal file, and +** * Stage 2, in which the contents of the wal file are copied into the +** main database. +** +** The update is visible to non-RBU clients during stage 2. During stage 1 +** non-RBU reader clients may see the original database. +** +** If this API is called during stage 2 of the update, output variable +** (*pnOne) is set to 10000 to indicate that stage 1 has finished and (*pnTwo) +** to a value between 0 and 10000 to indicate the permyriadage progress of +** stage 2. A value of 5000 indicates that stage 2 is half finished, +** 9000 indicates that it is 90% finished, and so on. +** +** If this API is called during stage 1 of the update, output variable +** (*pnTwo) is set to 0 to indicate that stage 2 has not yet started. The +** value to which (*pnOne) is set depends on whether or not the RBU +** database contains an "rbu_count" table. The rbu_count table, if it +** exists, must contain the same columns as the following: +** +** CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; +** +** There must be one row in the table for each source (data_xxx) table within +** the RBU database. The 'tbl' column should contain the name of the source +** table. The 'cnt' column should contain the number of rows within the +** source table. +** +** If the rbu_count table is present and populated correctly and this +** API is called during stage 1, the *pnOne output variable is set to the +** permyriadage progress of the same stage. If the rbu_count table does +** not exist, then (*pnOne) is set to -1 during stage 1. If the rbu_count +** table exists but is not correctly populated, the value of the *pnOne +** output variable during stage 1 is undefined. +*/ +SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *pRbu, int *pnOne, int*pnTwo); + +/* +** Obtain an indication as to the current stage of an RBU update or vacuum. +** This function always returns one of the SQLITE_RBU_STATE_XXX constants +** defined in this file. Return values should be interpreted as follows: +** +** SQLITE_RBU_STATE_OAL: +** RBU is currently building a *-oal file. The next call to sqlite3rbu_step() +** may either add further data to the *-oal file, or compute data that will +** be added by a subsequent call. +** +** SQLITE_RBU_STATE_MOVE: +** RBU has finished building the *-oal file. The next call to sqlite3rbu_step() +** will move the *-oal file to the equivalent *-wal path. If the current +** operation is an RBU update, then the updated version of the database +** file will become visible to ordinary SQLite clients following the next +** call to sqlite3rbu_step(). +** +** SQLITE_RBU_STATE_CHECKPOINT: +** RBU is currently performing an incremental checkpoint. The next call to +** sqlite3rbu_step() will copy a page of data from the *-wal file into +** the target database file. +** +** SQLITE_RBU_STATE_DONE: +** The RBU operation has finished. Any subsequent calls to sqlite3rbu_step() +** will immediately return SQLITE_DONE. +** +** SQLITE_RBU_STATE_ERROR: +** An error has occurred. Any subsequent calls to sqlite3rbu_step() will +** immediately return the SQLite error code associated with the error. +*/ +#define SQLITE_RBU_STATE_OAL 1 +#define SQLITE_RBU_STATE_MOVE 2 +#define SQLITE_RBU_STATE_CHECKPOINT 3 +#define SQLITE_RBU_STATE_DONE 4 +#define SQLITE_RBU_STATE_ERROR 5 + +SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); + +/* +** Create an RBU VFS named zName that accesses the underlying file-system +** via existing VFS zParent. Or, if the zParent parameter is passed NULL, +** then the new RBU VFS uses the default system VFS to access the file-system. +** The new object is registered as a non-default VFS with SQLite before +** returning. +** +** Part of the RBU implementation uses a custom VFS object. Usually, this +** object is created and deleted automatically by RBU. +** +** The exception is for applications that also use zipvfs. In this case, +** the custom VFS must be explicitly created by the user before the RBU +** handle is opened. The RBU VFS should be installed so that the zipvfs +** VFS uses the RBU VFS, which in turn uses any other VFS layers in use +** (for example multiplexor) to access the file-system. For example, +** to assemble an RBU enabled VFS stack that uses both zipvfs and +** multiplexor (error checking omitted): +** +** // Create a VFS named "multiplex" (not the default). +** sqlite3_multiplex_initialize(0, 0); +** +** // Create an rbu VFS named "rbu" that uses multiplexor. If the +** // second argument were replaced with NULL, the "rbu" VFS would +** // access the file-system via the system default VFS, bypassing the +** // multiplexor. +** sqlite3rbu_create_vfs("rbu", "multiplex"); +** +** // Create a zipvfs VFS named "zipvfs" that uses rbu. +** zipvfs_create_vfs_v3("zipvfs", "rbu", 0, xCompressorAlgorithmDetector); +** +** // Make zipvfs the default VFS. +** sqlite3_vfs_register(sqlite3_vfs_find("zipvfs"), 1); +** +** Because the default VFS created above includes a RBU functionality, it +** may be used by RBU clients. Attempting to use RBU with a zipvfs VFS stack +** that does not include the RBU layer results in an error. +** +** The overhead of adding the "rbu" VFS to the system is negligible for +** non-RBU users. There is no harm in an application accessing the +** file-system via "rbu" all the time, even if it only uses RBU functionality +** occasionally. +*/ +SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent); + +/* +** Deregister and destroy an RBU vfs created by an earlier call to +** sqlite3rbu_create_vfs(). +** +** VFS objects are not reference counted. If a VFS object is destroyed +** before all database handles that use it have been closed, the results +** are undefined. +*/ +SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _SQLITE3RBU_H */ + +/************** End of sqlite3rbu.h ******************************************/ +/************** Continuing where we left off in sqlite3rbu.c *****************/ + +#if defined(_WIN32_WCE) +/* #include "windows.h" */ +#endif + +/* Maximum number of prepared UPDATE statements held by this module */ +#define SQLITE_RBU_UPDATE_CACHESIZE 16 + +/* Delta checksums disabled by default. Compile with -DRBU_ENABLE_DELTA_CKSUM +** to enable checksum verification. +*/ +#ifndef RBU_ENABLE_DELTA_CKSUM +# define RBU_ENABLE_DELTA_CKSUM 0 +#endif + +/* +** Swap two objects of type TYPE. +*/ +#if !defined(SQLITE_AMALGAMATION) +# define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} +#endif + +/* +** Name of the URI option that causes RBU to take an exclusive lock as +** part of the incremental checkpoint operation. +*/ +#define RBU_EXCLUSIVE_CHECKPOINT "rbu_exclusive_checkpoint" + + +/* +** The rbu_state table is used to save the state of a partially applied +** update so that it can be resumed later. The table consists of integer +** keys mapped to values as follows: +** +** RBU_STATE_STAGE: +** May be set to integer values 1, 2, 4 or 5. As follows: +** 1: the *-rbu file is currently under construction. +** 2: the *-rbu file has been constructed, but not yet moved +** to the *-wal path. +** 4: the checkpoint is underway. +** 5: the rbu update has been checkpointed. +** +** RBU_STATE_TBL: +** Only valid if STAGE==1. The target database name of the table +** currently being written. +** +** RBU_STATE_IDX: +** Only valid if STAGE==1. The target database name of the index +** currently being written, or NULL if the main table is currently being +** updated. +** +** RBU_STATE_ROW: +** Only valid if STAGE==1. Number of rows already processed for the current +** table/index. +** +** RBU_STATE_PROGRESS: +** Trbul number of sqlite3rbu_step() calls made so far as part of this +** rbu update. +** +** RBU_STATE_CKPT: +** Valid if STAGE==4. The 64-bit checksum associated with the wal-index +** header created by recovering the *-wal file. This is used to detect +** cases when another client appends frames to the *-wal file in the +** middle of an incremental checkpoint (an incremental checkpoint cannot +** be continued if this happens). +** +** RBU_STATE_COOKIE: +** Valid if STAGE==1. The current change-counter cookie value in the +** target db file. +** +** RBU_STATE_OALSZ: +** Valid if STAGE==1. The size in bytes of the *-oal file. +** +** RBU_STATE_DATATBL: +** Only valid if STAGE==1. The RBU database name of the table +** currently being read. +*/ +#define RBU_STATE_STAGE 1 +#define RBU_STATE_TBL 2 +#define RBU_STATE_IDX 3 +#define RBU_STATE_ROW 4 +#define RBU_STATE_PROGRESS 5 +#define RBU_STATE_CKPT 6 +#define RBU_STATE_COOKIE 7 +#define RBU_STATE_OALSZ 8 +#define RBU_STATE_PHASEONESTEP 9 +#define RBU_STATE_DATATBL 10 + +#define RBU_STAGE_OAL 1 +#define RBU_STAGE_MOVE 2 +#define RBU_STAGE_CAPTURE 3 +#define RBU_STAGE_CKPT 4 +#define RBU_STAGE_DONE 5 + + +#define RBU_CREATE_STATE \ + "CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)" + +typedef struct RbuFrame RbuFrame; +typedef struct RbuObjIter RbuObjIter; +typedef struct RbuState RbuState; +typedef struct RbuSpan RbuSpan; +typedef struct rbu_vfs rbu_vfs; +typedef struct rbu_file rbu_file; +typedef struct RbuUpdateStmt RbuUpdateStmt; + +#if !defined(SQLITE_AMALGAMATION) +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; +typedef sqlite3_int64 i64; +#endif + +/* +** These values must match the values defined in wal.c for the equivalent +** locks. These are not magic numbers as they are part of the SQLite file +** format. +*/ +#define WAL_LOCK_WRITE 0 +#define WAL_LOCK_CKPT 1 +#define WAL_LOCK_READ0 3 + +#define SQLITE_FCNTL_RBUCNT 5149216 + +/* +** A structure to store values read from the rbu_state table in memory. +*/ +struct RbuState { + int eStage; + char *zTbl; + char *zDataTbl; + char *zIdx; + i64 iWalCksum; + int nRow; + i64 nProgress; + u32 iCookie; + i64 iOalSz; + i64 nPhaseOneStep; +}; + +struct RbuUpdateStmt { + char *zMask; /* Copy of update mask used with pUpdate */ + sqlite3_stmt *pUpdate; /* Last update statement (or NULL) */ + RbuUpdateStmt *pNext; +}; + +struct RbuSpan { + const char *zSpan; + int nSpan; +}; + +/* +** An iterator of this type is used to iterate through all objects in +** the target database that require updating. For each such table, the +** iterator visits, in order: +** +** * the table itself, +** * each index of the table (zero or more points to visit), and +** * a special "cleanup table" state. +** +** abIndexed: +** If the table has no indexes on it, abIndexed is set to NULL. Otherwise, +** it points to an array of flags nTblCol elements in size. The flag is +** set for each column that is either a part of the PK or a part of an +** index. Or clear otherwise. +** +** If there are one or more partial indexes on the table, all fields of +** this array set set to 1. This is because in that case, the module has +** no way to tell which fields will be required to add and remove entries +** from the partial indexes. +** +*/ +struct RbuObjIter { + sqlite3_stmt *pTblIter; /* Iterate through tables */ + sqlite3_stmt *pIdxIter; /* Index iterator */ + int nTblCol; /* Size of azTblCol[] array */ + char **azTblCol; /* Array of unquoted target column names */ + char **azTblType; /* Array of target column types */ + int *aiSrcOrder; /* src table col -> target table col */ + u8 *abTblPk; /* Array of flags, set on target PK columns */ + u8 *abNotNull; /* Array of flags, set on NOT NULL columns */ + u8 *abIndexed; /* Array of flags, set on indexed & PK cols */ + int eType; /* Table type - an RBU_PK_XXX value */ + + /* Output variables. zTbl==0 implies EOF. */ + int bCleanup; /* True in "cleanup" state */ + const char *zTbl; /* Name of target db table */ + const char *zDataTbl; /* Name of rbu db table (or null) */ + const char *zIdx; /* Name of target db index (or null) */ + int iTnum; /* Root page of current object */ + int iPkTnum; /* If eType==EXTERNAL, root of PK index */ + int bUnique; /* Current index is unique */ + int nIndex; /* Number of aux. indexes on table zTbl */ + + /* Statements created by rbuObjIterPrepareAll() */ + int nCol; /* Number of columns in current object */ + sqlite3_stmt *pSelect; /* Source data */ + sqlite3_stmt *pInsert; /* Statement for INSERT operations */ + sqlite3_stmt *pDelete; /* Statement for DELETE ops */ + sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ + int nIdxCol; + RbuSpan *aIdxCol; + char *zIdxSql; + + /* Last UPDATE used (for PK b-tree updates only), or NULL. */ + RbuUpdateStmt *pRbuUpdate; +}; + +/* +** Values for RbuObjIter.eType +** +** 0: Table does not exist (error) +** 1: Table has an implicit rowid. +** 2: Table has an explicit IPK column. +** 3: Table has an external PK index. +** 4: Table is WITHOUT ROWID. +** 5: Table is a virtual table. +*/ +#define RBU_PK_NOTABLE 0 +#define RBU_PK_NONE 1 +#define RBU_PK_IPK 2 +#define RBU_PK_EXTERNAL 3 +#define RBU_PK_WITHOUT_ROWID 4 +#define RBU_PK_VTAB 5 + + +/* +** Within the RBU_STAGE_OAL stage, each call to sqlite3rbu_step() performs +** one of the following operations. +*/ +#define RBU_INSERT 1 /* Insert on a main table b-tree */ +#define RBU_DELETE 2 /* Delete a row from a main table b-tree */ +#define RBU_REPLACE 3 /* Delete and then insert a row */ +#define RBU_IDX_DELETE 4 /* Delete a row from an aux. index b-tree */ +#define RBU_IDX_INSERT 5 /* Insert on an aux. index b-tree */ + +#define RBU_UPDATE 6 /* Update a row in a main table b-tree */ + +/* +** A single step of an incremental checkpoint - frame iWalFrame of the wal +** file should be copied to page iDbPage of the database file. +*/ +struct RbuFrame { + u32 iDbPage; + u32 iWalFrame; +}; + +/* +** RBU handle. +** +** nPhaseOneStep: +** If the RBU database contains an rbu_count table, this value is set to +** a running estimate of the number of b-tree operations required to +** finish populating the *-oal file. This allows the sqlite3_bp_progress() +** API to calculate the permyriadage progress of populating the *-oal file +** using the formula: +** +** permyriadage = (10000 * nProgress) / nPhaseOneStep +** +** nPhaseOneStep is initialized to the sum of: +** +** nRow * (nIndex + 1) +** +** for all source tables in the RBU database, where nRow is the number +** of rows in the source table and nIndex the number of indexes on the +** corresponding target database table. +** +** This estimate is accurate if the RBU update consists entirely of +** INSERT operations. However, it is inaccurate if: +** +** * the RBU update contains any UPDATE operations. If the PK specified +** for an UPDATE operation does not exist in the target table, then +** no b-tree operations are required on index b-trees. Or if the +** specified PK does exist, then (nIndex*2) such operations are +** required (one delete and one insert on each index b-tree). +** +** * the RBU update contains any DELETE operations for which the specified +** PK does not exist. In this case no operations are required on index +** b-trees. +** +** * the RBU update contains REPLACE operations. These are similar to +** UPDATE operations. +** +** nPhaseOneStep is updated to account for the conditions above during the +** first pass of each source table. The updated nPhaseOneStep value is +** stored in the rbu_state table if the RBU update is suspended. +*/ +struct sqlite3rbu { + int eStage; /* Value of RBU_STATE_STAGE field */ + sqlite3 *dbMain; /* target database handle */ + sqlite3 *dbRbu; /* rbu database handle */ + char *zTarget; /* Path to target db */ + char *zRbu; /* Path to rbu db */ + char *zState; /* Path to state db (or NULL if zRbu) */ + char zStateDb[5]; /* Db name for state ("stat" or "main") */ + int rc; /* Value returned by last rbu_step() call */ + char *zErrmsg; /* Error message if rc!=SQLITE_OK */ + int nStep; /* Rows processed for current object */ + int nProgress; /* Rows processed for all objects */ + RbuObjIter objiter; /* Iterator for skipping through tbl/idx */ + const char *zVfsName; /* Name of automatically created rbu vfs */ + rbu_file *pTargetFd; /* File handle open on target db */ + int nPagePerSector; /* Pages per sector for pTargetFd */ + i64 iOalSz; + i64 nPhaseOneStep; + + /* The following state variables are used as part of the incremental + ** checkpoint stage (eStage==RBU_STAGE_CKPT). See comments surrounding + ** function rbuSetupCheckpoint() for details. */ + u32 iMaxFrame; /* Largest iWalFrame value in aFrame[] */ + u32 mLock; + int nFrame; /* Entries in aFrame[] array */ + int nFrameAlloc; /* Allocated size of aFrame[] array */ + RbuFrame *aFrame; + int pgsz; + u8 *aBuf; + i64 iWalCksum; + i64 szTemp; /* Current size of all temp files in use */ + i64 szTempLimit; /* Total size limit for temp files */ + + /* Used in RBU vacuum mode only */ + int nRbu; /* Number of RBU VFS in the stack */ + rbu_file *pRbuFd; /* Fd for main db of dbRbu */ +}; + +/* +** An rbu VFS is implemented using an instance of this structure. +** +** Variable pRbu is only non-NULL for automatically created RBU VFS objects. +** It is NULL for RBU VFS objects created explicitly using +** sqlite3rbu_create_vfs(). It is used to track the total amount of temp +** space used by the RBU handle. +*/ +struct rbu_vfs { + sqlite3_vfs base; /* rbu VFS shim methods */ + sqlite3_vfs *pRealVfs; /* Underlying VFS */ + sqlite3_mutex *mutex; /* Mutex to protect pMain */ + sqlite3rbu *pRbu; /* Owner RBU object */ + rbu_file *pMain; /* List of main db files */ + rbu_file *pMainRbu; /* List of main db files with pRbu!=0 */ +}; + +/* +** Each file opened by an rbu VFS is represented by an instance of +** the following structure. +** +** If this is a temporary file (pRbu!=0 && flags&DELETE_ON_CLOSE), variable +** "sz" is set to the current size of the database file. +*/ +struct rbu_file { + sqlite3_file base; /* sqlite3_file methods */ + sqlite3_file *pReal; /* Underlying file handle */ + rbu_vfs *pRbuVfs; /* Pointer to the rbu_vfs object */ + sqlite3rbu *pRbu; /* Pointer to rbu object (rbu target only) */ + i64 sz; /* Size of file in bytes (temp only) */ + + int openFlags; /* Flags this file was opened with */ + u32 iCookie; /* Cookie value for main db files */ + u8 iWriteVer; /* "write-version" value for main db files */ + u8 bNolock; /* True to fail EXCLUSIVE locks */ + + int nShm; /* Number of entries in apShm[] array */ + char **apShm; /* Array of mmap'd *-shm regions */ + char *zDel; /* Delete this when closing file */ + + const char *zWal; /* Wal filename for this main db file */ + rbu_file *pWalFd; /* Wal file descriptor for this main db */ + rbu_file *pMainNext; /* Next MAIN_DB file */ + rbu_file *pMainRbuNext; /* Next MAIN_DB file with pRbu!=0 */ +}; + +/* +** True for an RBU vacuum handle, or false otherwise. +*/ +#define rbuIsVacuum(p) ((p)->zTarget==0) + + +/************************************************************************* +** The following three functions, found below: +** +** rbuDeltaGetInt() +** rbuDeltaChecksum() +** rbuDeltaApply() +** +** are lifted from the fossil source code (http://fossil-scm.org). They +** are used to implement the scalar SQL function rbu_fossil_delta(). +*/ + +/* +** Read bytes from *pz and convert them into a positive integer. When +** finished, leave *pz pointing to the first character past the end of +** the integer. The *pLen parameter holds the length of the string +** in *pz and is decremented once for each character in the integer. +*/ +static unsigned int rbuDeltaGetInt(const char **pz, int *pLen){ + static const signed char zValue[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, + -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1, + }; + unsigned int v = 0; + int c; + unsigned char *z = (unsigned char*)*pz; + unsigned char *zStart = z; + while( (c = zValue[0x7f&*(z++)])>=0 ){ + v = (v<<6) + c; + } + z--; + *pLen -= z - zStart; + *pz = (char*)z; + return v; +} + +#if RBU_ENABLE_DELTA_CKSUM +/* +** Compute a 32-bit checksum on the N-byte buffer. Return the result. +*/ +static unsigned int rbuDeltaChecksum(const char *zIn, size_t N){ + const unsigned char *z = (const unsigned char *)zIn; + unsigned sum0 = 0; + unsigned sum1 = 0; + unsigned sum2 = 0; + unsigned sum3 = 0; + while(N >= 16){ + sum0 += ((unsigned)z[0] + z[4] + z[8] + z[12]); + sum1 += ((unsigned)z[1] + z[5] + z[9] + z[13]); + sum2 += ((unsigned)z[2] + z[6] + z[10]+ z[14]); + sum3 += ((unsigned)z[3] + z[7] + z[11]+ z[15]); + z += 16; + N -= 16; + } + while(N >= 4){ + sum0 += z[0]; + sum1 += z[1]; + sum2 += z[2]; + sum3 += z[3]; + z += 4; + N -= 4; + } + sum3 += (sum2 << 8) + (sum1 << 16) + (sum0 << 24); + switch(N){ + case 3: sum3 += (z[2] << 8); + case 2: sum3 += (z[1] << 16); + case 1: sum3 += (z[0] << 24); + default: ; + } + return sum3; +} +#endif + +/* +** Apply a delta. +** +** The output buffer should be big enough to hold the whole output +** file and a NUL terminator at the end. The delta_output_size() +** routine will determine this size for you. +** +** The delta string should be null-terminated. But the delta string +** may contain embedded NUL characters (if the input and output are +** binary files) so we also have to pass in the length of the delta in +** the lenDelta parameter. +** +** This function returns the size of the output file in bytes (excluding +** the final NUL terminator character). Except, if the delta string is +** malformed or intended for use with a source file other than zSrc, +** then this routine returns -1. +** +** Refer to the delta_create() documentation above for a description +** of the delta file format. +*/ +static int rbuDeltaApply( + const char *zSrc, /* The source or pattern file */ + int lenSrc, /* Length of the source file */ + const char *zDelta, /* Delta to apply to the pattern */ + int lenDelta, /* Length of the delta */ + char *zOut /* Write the output into this preallocated buffer */ +){ + unsigned int limit; + unsigned int total = 0; +#if RBU_ENABLE_DELTA_CKSUM + char *zOrigOut = zOut; +#endif + + limit = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + zDelta++; lenDelta--; + while( *zDelta && lenDelta>0 ){ + unsigned int cnt, ofst; + cnt = rbuDeltaGetInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + ofst = rbuDeltaGetInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: copy exceeds output file size */ + return -1; + } + if( (int)(ofst+cnt) > lenSrc ){ + /* ERROR: copy extends past end of input */ + return -1; + } + memcpy(zOut, &zSrc[ofst], cnt); + zOut += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: insert command gives an output larger than predicted */ + return -1; + } + if( (int)cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + memcpy(zOut, zDelta, cnt); + zOut += cnt; + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + zDelta++; lenDelta--; + zOut[0] = 0; +#if RBU_ENABLE_DELTA_CKSUM + if( cnt!=rbuDeltaChecksum(zOrigOut, total) ){ + /* ERROR: bad checksum */ + return -1; + } +#endif + if( total!=limit ){ + /* ERROR: generated size does not match predicted size */ + return -1; + } + return total; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +static int rbuDeltaOutputSize(const char *zDelta, int lenDelta){ + int size; + size = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + return size; +} + +/* +** End of code taken from fossil. +*************************************************************************/ + +/* +** Implementation of SQL scalar function rbu_fossil_delta(). +** +** This function applies a fossil delta patch to a blob. Exactly two +** arguments must be passed to this function. The first is the blob to +** patch and the second the patch to apply. If no error occurs, this +** function returns the patched blob. +*/ +static void rbuFossilDeltaFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aDelta; + int nDelta; + const char *aOrig; + int nOrig; + + int nOut; + int nOut2; + char *aOut; + + assert( argc==2 ); + + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nDelta = sqlite3_value_bytes(argv[1]); + aDelta = (const char*)sqlite3_value_blob(argv[1]); + + /* Figure out the size of the output */ + nOut = rbuDeltaOutputSize(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + } + + aOut = sqlite3_malloc(nOut+1); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); + if( nOut2!=nOut ){ + sqlite3_free(aOut); + sqlite3_result_error(context, "corrupt fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + + +/* +** Prepare the SQL statement in buffer zSql against database handle db. +** If successful, set *ppStmt to point to the new statement and return +** SQLITE_OK. +** +** Otherwise, if an error does occur, set *ppStmt to NULL and return +** an SQLite error code. Additionally, set output variable *pzErrmsg to +** point to a buffer containing an error message. It is the responsibility +** of the caller to (eventually) free this buffer using sqlite3_free(). +*/ +static int prepareAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + const char *zSql +){ + int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + *ppStmt = 0; + } + return rc; +} + +/* +** Reset the SQL statement passed as the first argument. Return a copy +** of the value returned by sqlite3_reset(). +** +** If an error has occurred, then set *pzErrmsg to point to a buffer +** containing an error message. It is the responsibility of the caller +** to eventually free this buffer using sqlite3_free(). +*/ +static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ + int rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(sqlite3_db_handle(pStmt))); + } + return rc; +} + +/* +** Unless it is NULL, argument zSql points to a buffer allocated using +** sqlite3_malloc containing an SQL statement. This function prepares the SQL +** statement against database db and frees the buffer. If statement +** compilation is successful, *ppStmt is set to point to the new statement +** handle and SQLITE_OK is returned. +** +** Otherwise, if an error occurs, *ppStmt is set to NULL and an error code +** returned. In this case, *pzErrmsg may also be set to point to an error +** message. It is the responsibility of the caller to free this error message +** buffer using sqlite3_free(). +** +** If argument zSql is NULL, this function assumes that an OOM has occurred. +** In this case SQLITE_NOMEM is returned and *ppStmt set to NULL. +*/ +static int prepareFreeAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + char *zSql +){ + int rc; + assert( *pzErrmsg==0 ); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + *ppStmt = 0; + }else{ + rc = prepareAndCollectError(db, ppStmt, pzErrmsg, zSql); + sqlite3_free(zSql); + } + return rc; +} + +/* +** Free the RbuObjIter.azTblCol[] and RbuObjIter.abTblPk[] arrays allocated +** by an earlier call to rbuObjIterCacheTableInfo(). +*/ +static void rbuObjIterFreeCols(RbuObjIter *pIter){ + int i; + for(i=0; inTblCol; i++){ + sqlite3_free(pIter->azTblCol[i]); + sqlite3_free(pIter->azTblType[i]); + } + sqlite3_free(pIter->azTblCol); + pIter->azTblCol = 0; + pIter->azTblType = 0; + pIter->aiSrcOrder = 0; + pIter->abTblPk = 0; + pIter->abNotNull = 0; + pIter->nTblCol = 0; + pIter->eType = 0; /* Invalid value */ +} + +/* +** Finalize all statements and free all allocations that are specific to +** the current object (table/index pair). +*/ +static void rbuObjIterClearStatements(RbuObjIter *pIter){ + RbuUpdateStmt *pUp; + + sqlite3_finalize(pIter->pSelect); + sqlite3_finalize(pIter->pInsert); + sqlite3_finalize(pIter->pDelete); + sqlite3_finalize(pIter->pTmpInsert); + pUp = pIter->pRbuUpdate; + while( pUp ){ + RbuUpdateStmt *pTmp = pUp->pNext; + sqlite3_finalize(pUp->pUpdate); + sqlite3_free(pUp); + pUp = pTmp; + } + sqlite3_free(pIter->aIdxCol); + sqlite3_free(pIter->zIdxSql); + + pIter->pSelect = 0; + pIter->pInsert = 0; + pIter->pDelete = 0; + pIter->pRbuUpdate = 0; + pIter->pTmpInsert = 0; + pIter->nCol = 0; + pIter->nIdxCol = 0; + pIter->aIdxCol = 0; + pIter->zIdxSql = 0; +} + +/* +** Clean up any resources allocated as part of the iterator object passed +** as the only argument. +*/ +static void rbuObjIterFinalize(RbuObjIter *pIter){ + rbuObjIterClearStatements(pIter); + sqlite3_finalize(pIter->pTblIter); + sqlite3_finalize(pIter->pIdxIter); + rbuObjIterFreeCols(pIter); + memset(pIter, 0, sizeof(RbuObjIter)); +} + +/* +** Advance the iterator to the next position. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the next entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ + int rc = p->rc; + if( rc==SQLITE_OK ){ + + /* Free any SQLite statements used while processing the previous object */ + rbuObjIterClearStatements(pIter); + if( pIter->zIdx==0 ){ + rc = sqlite3_exec(p->dbMain, + "DROP TRIGGER IF EXISTS temp.rbu_insert_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update1_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update2_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_delete_tr;" + , 0, 0, &p->zErrmsg + ); + } + + if( rc==SQLITE_OK ){ + if( pIter->bCleanup ){ + rbuObjIterFreeCols(pIter); + pIter->bCleanup = 0; + rc = sqlite3_step(pIter->pTblIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg); + pIter->zTbl = 0; + }else{ + pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0); + pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1); + rc = (pIter->zDataTbl && pIter->zTbl) ? SQLITE_OK : SQLITE_NOMEM; + } + }else{ + if( pIter->zIdx==0 ){ + sqlite3_stmt *pIdx = pIter->pIdxIter; + rc = sqlite3_bind_text(pIdx, 1, pIter->zTbl, -1, SQLITE_STATIC); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_step(pIter->pIdxIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg); + pIter->bCleanup = 1; + pIter->zIdx = 0; + }else{ + pIter->zIdx = (const char*)sqlite3_column_text(pIter->pIdxIter, 0); + pIter->iTnum = sqlite3_column_int(pIter->pIdxIter, 1); + pIter->bUnique = sqlite3_column_int(pIter->pIdxIter, 2); + rc = pIter->zIdx ? SQLITE_OK : SQLITE_NOMEM; + } + } + } + } + } + + if( rc!=SQLITE_OK ){ + rbuObjIterFinalize(pIter); + p->rc = rc; + } + return rc; +} + + +/* +** The implementation of the rbu_target_name() SQL function. This function +** accepts one or two arguments. The first argument is the name of a table - +** the name of a table in the RBU database. The second, if it is present, is 1 +** for a view or 0 for a table. +** +** For a non-vacuum RBU handle, if the table name matches the pattern: +** +** data[0-9]_ +** +** where is any sequence of 1 or more characters, is returned. +** Otherwise, if the only argument does not match the above pattern, an SQL +** NULL is returned. +** +** "data_t1" -> "t1" +** "data0123_t2" -> "t2" +** "dataAB_t3" -> NULL +** +** For an rbu vacuum handle, a copy of the first argument is returned if +** the second argument is either missing or 0 (not a view). +*/ +static void rbuTargetNameFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + const char *zIn; + assert( argc==1 || argc==2 ); + + zIn = (const char*)sqlite3_value_text(argv[0]); + if( zIn ){ + if( rbuIsVacuum(p) ){ + assert( argc==2 || argc==1 ); + if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ + sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); + } + }else{ + if( strlen(zIn)>4 && memcmp("data", zIn, 4)==0 ){ + int i; + for(i=4; zIn[i]>='0' && zIn[i]<='9'; i++); + if( zIn[i]=='_' && zIn[i+1] ){ + sqlite3_result_text(pCtx, &zIn[i+1], -1, SQLITE_STATIC); + } + } + } + } +} + +/* +** Initialize the iterator structure passed as the second argument. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the first entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ + int rc; + memset(pIter, 0, sizeof(RbuObjIter)); + + rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, + sqlite3_mprintf( + "SELECT rbu_target_name(name, type='view') AS target, name " + "FROM sqlite_schema " + "WHERE type IN ('table', 'view') AND target IS NOT NULL " + " %s " + "ORDER BY name" + , rbuIsVacuum(p) ? "AND rootpage!=0 AND rootpage IS NOT NULL" : "")); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pIter->pIdxIter, &p->zErrmsg, + "SELECT name, rootpage, sql IS NULL OR substr(8, 6)=='UNIQUE' " + " FROM main.sqlite_schema " + " WHERE type='index' AND tbl_name = ?" + ); + } + + pIter->bCleanup = 1; + p->rc = rc; + return rbuObjIterNext(p, pIter); +} + +/* +** This is a wrapper around "sqlite3_mprintf(zFmt, ...)". If an OOM occurs, +** an error code is stored in the RBU handle passed as the first argument. +** +** If an error has already occurred (p->rc is already set to something other +** than SQLITE_OK), then this function returns NULL without modifying the +** stored error code. In this case it still calls sqlite3_free() on any +** printf() parameters associated with %z conversions. +*/ +static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ + char *zSql = 0; + va_list ap; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ) p->rc = SQLITE_NOMEM; + }else{ + sqlite3_free(zSql); + zSql = 0; + } + va_end(ap); + return zSql; +} + +/* +** Argument zFmt is a sqlite3_mprintf() style format string. The trailing +** arguments are the usual subsitution values. This function performs +** the printf() style substitutions and executes the result as an SQL +** statement on the RBU handles database. +** +** If an error occurs, an error code and error message is stored in the +** RBU handle. If an error has already occurred when this function is +** called, it is a no-op. +*/ +static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ + va_list ap; + char *zSql; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + p->rc = sqlite3_exec(db, zSql, 0, 0, &p->zErrmsg); + } + } + sqlite3_free(zSql); + va_end(ap); + return p->rc; +} + +/* +** Attempt to allocate and return a pointer to a zeroed block of nByte +** bytes. +** +** If an error (i.e. an OOM condition) occurs, return NULL and leave an +** error code in the rbu handle passed as the first argument. Or, if an +** error has already occurred when this function is called, return NULL +** immediately without attempting the allocation or modifying the stored +** error code. +*/ +static void *rbuMalloc(sqlite3rbu *p, sqlite3_int64 nByte){ + void *pRet = 0; + if( p->rc==SQLITE_OK ){ + assert( nByte>0 ); + pRet = sqlite3_malloc64(nByte); + if( pRet==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + } + return pRet; +} + + +/* +** Allocate and zero the pIter->azTblCol[] and abTblPk[] arrays so that +** there is room for at least nCol elements. If an OOM occurs, store an +** error code in the RBU handle passed as the first argument. +*/ +static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ + sqlite3_int64 nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; + char **azNew; + + azNew = (char**)rbuMalloc(p, nByte); + if( azNew ){ + pIter->azTblCol = azNew; + pIter->azTblType = &azNew[nCol]; + pIter->aiSrcOrder = (int*)&pIter->azTblType[nCol]; + pIter->abTblPk = (u8*)&pIter->aiSrcOrder[nCol]; + pIter->abNotNull = (u8*)&pIter->abTblPk[nCol]; + pIter->abIndexed = (u8*)&pIter->abNotNull[nCol]; + } +} + +/* +** The first argument must be a nul-terminated string. This function +** returns a copy of the string in memory obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free this memory +** using sqlite3_free(). +** +** If an OOM condition is encountered when attempting to allocate memory, +** output variable (*pRc) is set to SQLITE_NOMEM before returning. Otherwise, +** if the allocation succeeds, (*pRc) is left unchanged. +*/ +static char *rbuStrndup(const char *zStr, int *pRc){ + char *zRet = 0; + + if( *pRc==SQLITE_OK ){ + if( zStr ){ + size_t nCopy = strlen(zStr) + 1; + zRet = (char*)sqlite3_malloc64(nCopy); + if( zRet ){ + memcpy(zRet, zStr, nCopy); + }else{ + *pRc = SQLITE_NOMEM; + } + } + } + + return zRet; +} + +/* +** Finalize the statement passed as the second argument. +** +** If the sqlite3_finalize() call indicates that an error occurs, and the +** rbu handle error code is not already set, set the error code and error +** message accordingly. +*/ +static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ + sqlite3 *db = sqlite3_db_handle(pStmt); + int rc = sqlite3_finalize(pStmt); + if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){ + p->rc = rc; + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } +} + +/* Determine the type of a table. +** +** peType is of type (int*), a pointer to an output parameter of type +** (int). This call sets the output parameter as follows, depending +** on the type of the table specified by parameters dbName and zTbl. +** +** RBU_PK_NOTABLE: No such table. +** RBU_PK_NONE: Table has an implicit rowid. +** RBU_PK_IPK: Table has an explicit IPK column. +** RBU_PK_EXTERNAL: Table has an external PK index. +** RBU_PK_WITHOUT_ROWID: Table is WITHOUT ROWID. +** RBU_PK_VTAB: Table is a virtual table. +** +** Argument *piPk is also of type (int*), and also points to an output +** parameter. Unless the table has an external primary key index +** (i.e. unless *peType is set to 3), then *piPk is set to zero. Or, +** if the table does have an external primary key index, then *piPk +** is set to the root page number of the primary key index before +** returning. +** +** ALGORITHM: +** +** if( no entry exists in sqlite_schema ){ +** return RBU_PK_NOTABLE +** }else if( sql for the entry starts with "CREATE VIRTUAL" ){ +** return RBU_PK_VTAB +** }else if( "PRAGMA index_list()" for the table contains a "pk" index ){ +** if( the index that is the pk exists in sqlite_schema ){ +** *piPK = rootpage of that index. +** return RBU_PK_EXTERNAL +** }else{ +** return RBU_PK_WITHOUT_ROWID +** } +** }else if( "PRAGMA table_info()" lists one or more "pk" columns ){ +** return RBU_PK_IPK +** }else{ +** return RBU_PK_NONE +** } +*/ +static void rbuTableType( + sqlite3rbu *p, + const char *zTab, + int *peType, + int *piTnum, + int *piPk +){ + /* + ** 0) SELECT count(*) FROM sqlite_schema where name=%Q AND IsVirtual(%Q) + ** 1) PRAGMA index_list = ? + ** 2) SELECT count(*) FROM sqlite_schema where name=%Q + ** 3) PRAGMA table_info = ? + */ + sqlite3_stmt *aStmt[4] = {0, 0, 0, 0}; + + *peType = RBU_PK_NOTABLE; + *piPk = 0; + + assert( p->rc==SQLITE_OK ); + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, + sqlite3_mprintf( + "SELECT " + " (sql COLLATE nocase BETWEEN 'CREATE VIRTUAL' AND 'CREATE VIRTUAM')," + " rootpage" + " FROM sqlite_schema" + " WHERE name=%Q", zTab + )); + if( p->rc!=SQLITE_OK || sqlite3_step(aStmt[0])!=SQLITE_ROW ){ + /* Either an error, or no such table. */ + goto rbuTableType_end; + } + if( sqlite3_column_int(aStmt[0], 0) ){ + *peType = RBU_PK_VTAB; /* virtual table */ + goto rbuTableType_end; + } + *piTnum = sqlite3_column_int(aStmt[0], 1); + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, + sqlite3_mprintf("PRAGMA index_list=%Q",zTab) + ); + if( p->rc ) goto rbuTableType_end; + while( sqlite3_step(aStmt[1])==SQLITE_ROW ){ + const u8 *zOrig = sqlite3_column_text(aStmt[1], 3); + const u8 *zIdx = sqlite3_column_text(aStmt[1], 1); + if( zOrig && zIdx && zOrig[0]=='p' ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, + sqlite3_mprintf( + "SELECT rootpage FROM sqlite_schema WHERE name = %Q", zIdx + )); + if( p->rc==SQLITE_OK ){ + if( sqlite3_step(aStmt[2])==SQLITE_ROW ){ + *piPk = sqlite3_column_int(aStmt[2], 0); + *peType = RBU_PK_EXTERNAL; + }else{ + *peType = RBU_PK_WITHOUT_ROWID; + } + } + goto rbuTableType_end; + } + } + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info=%Q",zTab) + ); + if( p->rc==SQLITE_OK ){ + while( sqlite3_step(aStmt[3])==SQLITE_ROW ){ + if( sqlite3_column_int(aStmt[3],5)>0 ){ + *peType = RBU_PK_IPK; /* explicit IPK column */ + goto rbuTableType_end; + } + } + *peType = RBU_PK_NONE; + } + +rbuTableType_end: { + unsigned int i; + for(i=0; iabIndexed[] array. +*/ +static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pList = 0; + int bIndex = 0; + + if( p->rc==SQLITE_OK ){ + memcpy(pIter->abIndexed, pIter->abTblPk, sizeof(u8)*pIter->nTblCol); + p->rc = prepareFreeAndCollectError(p->dbMain, &pList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + } + + pIter->nIndex = 0; + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ + const char *zIdx = (const char*)sqlite3_column_text(pList, 1); + int bPartial = sqlite3_column_int(pList, 4); + sqlite3_stmt *pXInfo = 0; + if( zIdx==0 ) break; + if( bPartial ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + if( iCid>=0 ) pIter->abIndexed[iCid] = 1; + if( iCid==-2 ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } + } + rbuFinalize(p, pXInfo); + bIndex = 1; + pIter->nIndex++; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + /* "PRAGMA index_list" includes the main PK b-tree */ + pIter->nIndex--; + } + + rbuFinalize(p, pList); + if( bIndex==0 ) pIter->abIndexed = 0; +} + + +/* +** If they are not already populated, populate the pIter->azTblCol[], +** pIter->abTblPk[], pIter->nTblCol and pIter->bRowid variables according to +** the table (not index) that the iterator currently points to. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. If +** an error does occur, an error code and error message are also left in +** the RBU handle. +*/ +static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ + if( pIter->azTblCol==0 ){ + sqlite3_stmt *pStmt = 0; + int nCol = 0; + int i; /* for() loop iterator variable */ + int bRbuRowid = 0; /* If input table has column "rbu_rowid" */ + int iOrder = 0; + int iTnum = 0; + + /* Figure out the type of table this step will deal with. */ + assert( pIter->eType==0 ); + rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum); + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("no such table: %s", pIter->zTbl); + } + if( p->rc ) return p->rc; + if( pIter->zIdx==0 ) pIter->iTnum = iTnum; + + assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK + || pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_WITHOUT_ROWID + || pIter->eType==RBU_PK_VTAB + ); + + /* Populate the azTblCol[] and nTblCol variables based on the columns + ** of the input table. Ignore any input table columns that begin with + ** "rbu_". */ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT * FROM '%q'", pIter->zDataTbl) + ); + if( p->rc==SQLITE_OK ){ + nCol = sqlite3_column_count(pStmt); + rbuAllocateIterArrays(p, pIter, nCol); + } + for(i=0; p->rc==SQLITE_OK && irc); + pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol; + pIter->azTblCol[pIter->nTblCol++] = zCopy; + } + else if( 0==sqlite3_stricmp("rbu_rowid", zName) ){ + bRbuRowid = 1; + } + } + sqlite3_finalize(pStmt); + pStmt = 0; + + if( p->rc==SQLITE_OK + && rbuIsVacuum(p)==0 + && bRbuRowid!=(pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) + ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf( + "table %q %s rbu_rowid column", pIter->zDataTbl, + (bRbuRowid ? "may not have" : "requires") + ); + } + + /* Check that all non-HIDDEN columns in the destination table are also + ** present in the input table. Populate the abTblPk[], azTblType[] and + ** aiTblOrder[] arrays at the same time. */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info(%Q)", pIter->zTbl) + ); + } + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zName = (const char*)sqlite3_column_text(pStmt, 1); + if( zName==0 ) break; /* An OOM - finalize() below returns S_NOMEM */ + for(i=iOrder; inTblCol; i++){ + if( 0==strcmp(zName, pIter->azTblCol[i]) ) break; + } + if( i==pIter->nTblCol ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("column missing from %q: %s", + pIter->zDataTbl, zName + ); + }else{ + int iPk = sqlite3_column_int(pStmt, 5); + int bNotNull = sqlite3_column_int(pStmt, 3); + const char *zType = (const char*)sqlite3_column_text(pStmt, 2); + + if( i!=iOrder ){ + SWAP(int, pIter->aiSrcOrder[i], pIter->aiSrcOrder[iOrder]); + SWAP(char*, pIter->azTblCol[i], pIter->azTblCol[iOrder]); + } + + pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc); + assert( iPk>=0 ); + pIter->abTblPk[iOrder] = (u8)iPk; + pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0); + iOrder++; + } + } + + rbuFinalize(p, pStmt); + rbuObjIterCacheIndexedCols(p, pIter); + assert( pIter->eType!=RBU_PK_VTAB || pIter->abIndexed==0 ); + assert( pIter->eType!=RBU_PK_VTAB || pIter->nIndex==0 ); + } + + return p->rc; +} + +/* +** This function constructs and returns a pointer to a nul-terminated +** string containing some SQL clause or list based on one or more of the +** column names currently stored in the pIter->azTblCol[] array. +*/ +static char *rbuObjIterGetCollist( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter /* Object iterator for column names */ +){ + char *zList = 0; + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + const char *z = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"", zList, zSep, z); + zSep = ", "; + } + return zList; +} + +/* +** Return a comma separated list of the quoted PRIMARY KEY column names, +** in order, for the current table. Before each column name, add the text +** zPre. After each column name, add the zPost text. Use zSeparator as +** the separator text (usually ", "). +*/ +static char *rbuObjIterGetPkList( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + const char *zPre, /* Before each quoted column name */ + const char *zSeparator, /* Separator to use between columns */ + const char *zPost /* After each quoted column name */ +){ + int iPk = 1; + char *zRet = 0; + const char *zSep = ""; + while( 1 ){ + int i; + for(i=0; inTblCol; i++){ + if( (int)pIter->abTblPk[i]==iPk ){ + const char *zCol = pIter->azTblCol[i]; + zRet = rbuMPrintf(p, "%z%s%s\"%w\"%s", zRet, zSep, zPre, zCol, zPost); + zSep = zSeparator; + break; + } + } + if( i==pIter->nTblCol ) break; + iPk++; + } + return zRet; +} + +/* +** This function is called as part of restarting an RBU vacuum within +** stage 1 of the process (while the *-oal file is being built) while +** updating a table (not an index). The table may be a rowid table or +** a WITHOUT ROWID table. It queries the target database to find the +** largest key that has already been written to the target table and +** constructs a WHERE clause that can be used to extract the remaining +** rows from the source table. For a rowid table, the WHERE clause +** is of the form: +** +** "WHERE _rowid_ > ?" +** +** and for WITHOUT ROWID tables: +** +** "WHERE (key1, key2) > (?, ?)" +** +** Instead of "?" placeholders, the actual WHERE clauses created by +** this function contain literal SQL values. +*/ +static char *rbuVacuumTableStart( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* RBU iterator object */ + int bRowid, /* True for a rowid table */ + const char *zWrite /* Target table name prefix */ +){ + sqlite3_stmt *pMax = 0; + char *zRet = 0; + if( bRowid ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + sqlite3_mprintf( + "SELECT max(_rowid_) FROM \"%s%w\"", zWrite, pIter->zTbl + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + sqlite3_int64 iMax = sqlite3_column_int64(pMax, 0); + zRet = rbuMPrintf(p, " WHERE _rowid_ > %lld ", iMax); + } + rbuFinalize(p, pMax); + }else{ + char *zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", " DESC"); + char *zSelect = rbuObjIterGetPkList(p, pIter, "quote(", "||','||", ")"); + char *zList = rbuObjIterGetPkList(p, pIter, "", ", ", ""); + + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pMax, &p->zErrmsg, + sqlite3_mprintf( + "SELECT %s FROM \"%s%w\" ORDER BY %s LIMIT 1", + zSelect, zWrite, pIter->zTbl, zOrder + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ + const char *zVal = (const char*)sqlite3_column_text(pMax, 0); + zRet = rbuMPrintf(p, " WHERE (%s) > (%s) ", zList, zVal); + } + rbuFinalize(p, pMax); + } + + sqlite3_free(zOrder); + sqlite3_free(zSelect); + sqlite3_free(zList); + } + return zRet; +} + +/* +** This function is called as part of restating an RBU vacuum when the +** current operation is writing content to an index. If possible, it +** queries the target index b-tree for the largest key already written to +** it, then composes and returns an expression that can be used in a WHERE +** clause to select the remaining required rows from the source table. +** It is only possible to return such an expression if: +** +** * The index contains no DESC columns, and +** * The last key written to the index before the operation was +** suspended does not contain any NULL values. +** +** The expression is of the form: +** +** (index-field1, index-field2, ...) > (?, ?, ...) +** +** except that the "?" placeholders are replaced with literal values. +** +** If the expression cannot be created, NULL is returned. In this case, +** the caller has to use an OFFSET clause to extract only the required +** rows from the sourct table, just as it does for an RBU update operation. +*/ +static char *rbuVacuumIndexStart( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter /* RBU iterator object */ +){ + char *zOrder = 0; + char *zLhs = 0; + char *zSelect = 0; + char *zVector = 0; + char *zRet = 0; + int bFailed = 0; + const char *zSep = ""; + int iCol = 0; + sqlite3_stmt *pXInfo = 0; + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol; + if( sqlite3_column_int(pXInfo, 3) ){ + bFailed = 1; + break; + } + + if( iCid<0 ){ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else{ + zCol = "_rowid_"; + } + }else{ + zCol = pIter->azTblCol[iCid]; + } + + zLhs = rbuMPrintf(p, "%z%s \"%w\" COLLATE %Q", + zLhs, zSep, zCol, zCollate + ); + zOrder = rbuMPrintf(p, "%z%s \"rbu_imp_%d%w\" COLLATE %Q DESC", + zOrder, zSep, iCol, zCol, zCollate + ); + zSelect = rbuMPrintf(p, "%z%s quote(\"rbu_imp_%d%w\")", + zSelect, zSep, iCol, zCol + ); + zSep = ", "; + iCol++; + } + rbuFinalize(p, pXInfo); + if( bFailed ) goto index_start_out; + + if( p->rc==SQLITE_OK ){ + sqlite3_stmt *pSel = 0; + + p->rc = prepareFreeAndCollectError(p->dbMain, &pSel, &p->zErrmsg, + sqlite3_mprintf("SELECT %s FROM \"rbu_imp_%w\" ORDER BY %s LIMIT 1", + zSelect, pIter->zTbl, zOrder + ) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSel) ){ + zSep = ""; + for(iCol=0; iColnCol; iCol++){ + const char *zQuoted = (const char*)sqlite3_column_text(pSel, iCol); + if( zQuoted==0 ){ + p->rc = SQLITE_NOMEM; + }else if( zQuoted[0]=='N' ){ + bFailed = 1; + break; + } + zVector = rbuMPrintf(p, "%z%s%s", zVector, zSep, zQuoted); + zSep = ", "; + } + + if( !bFailed ){ + zRet = rbuMPrintf(p, "(%s) > (%s)", zLhs, zVector); + } + } + rbuFinalize(p, pSel); + } + + index_start_out: + sqlite3_free(zOrder); + sqlite3_free(zSelect); + sqlite3_free(zVector); + sqlite3_free(zLhs); + return zRet; +} + +/* +** This function is used to create a SELECT list (the list of SQL +** expressions that follows a SELECT keyword) for a SELECT statement +** used to read from an data_xxx or rbu_tmp_xxx table while updating the +** index object currently indicated by the iterator object passed as the +** second argument. A "PRAGMA index_xinfo = " statement is used +** to obtain the required information. +** +** If the index is of the following form: +** +** CREATE INDEX i1 ON t1(c, b COLLATE nocase); +** +** and "t1" is a table with an explicit INTEGER PRIMARY KEY column +** "ipk", the returned string is: +** +** "`c` COLLATE 'BINARY', `b` COLLATE 'NOCASE', `ipk` COLLATE 'BINARY'" +** +** As well as the returned string, three other malloc'd strings are +** returned via output parameters. As follows: +** +** pzImposterCols: ... +** pzImposterPk: ... +** pzWhere: ... +*/ +static char *rbuObjIterGetIndexCols( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + char **pzImposterCols, /* OUT: Columns for imposter table */ + char **pzImposterPk, /* OUT: Imposter PK clause */ + char **pzWhere, /* OUT: WHERE clause */ + int *pnBind /* OUT: Trbul number of columns */ +){ + int rc = p->rc; /* Error code */ + int rc2; /* sqlite3_finalize() return code */ + char *zRet = 0; /* String to return */ + char *zImpCols = 0; /* String to return via *pzImposterCols */ + char *zImpPK = 0; /* String to return via *pzImposterPK */ + char *zWhere = 0; /* String to return via *pzWhere */ + int nBind = 0; /* Value to return via *pnBind */ + const char *zCom = ""; /* Set to ", " later on */ + const char *zAnd = ""; /* Set to " AND " later on */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = ? */ + + if( rc==SQLITE_OK ){ + assert( p->zErrmsg==0 ); + rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol = 0; + const char *zType; + + if( iCid==-2 ){ + int iSeq = sqlite3_column_int(pXInfo, 0); + zRet = sqlite3_mprintf("%z%s(%.*s) COLLATE %Q", zRet, zCom, + pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate + ); + zType = ""; + }else { + if( iCid<0 ){ + /* An integer primary key. If the table has an explicit IPK, use + ** its name. Otherwise, use "rbu_rowid". */ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else if( rbuIsVacuum(p) ){ + zCol = "_rowid_"; + }else{ + zCol = "rbu_rowid"; + } + zType = "INTEGER"; + }else{ + zCol = pIter->azTblCol[iCid]; + zType = pIter->azTblType[iCid]; + } + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom,zCol,zCollate); + } + + if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ + const char *zOrder = (bDesc ? " DESC" : ""); + zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", + zImpPK, zCom, nBind, zCol, zOrder + ); + } + zImpCols = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\" %s COLLATE %Q", + zImpCols, zCom, nBind, zCol, zType, zCollate + ); + zWhere = sqlite3_mprintf( + "%z%s\"rbu_imp_%d%w\" IS ?", zWhere, zAnd, nBind, zCol + ); + if( zRet==0 || zImpPK==0 || zImpCols==0 || zWhere==0 ) rc = SQLITE_NOMEM; + zCom = ", "; + zAnd = " AND "; + nBind++; + } + + rc2 = sqlite3_finalize(pXInfo); + if( rc==SQLITE_OK ) rc = rc2; + + if( rc!=SQLITE_OK ){ + sqlite3_free(zRet); + sqlite3_free(zImpCols); + sqlite3_free(zImpPK); + sqlite3_free(zWhere); + zRet = 0; + zImpCols = 0; + zImpPK = 0; + zWhere = 0; + p->rc = rc; + } + + *pzImposterCols = zImpCols; + *pzImposterPk = zImpPK; + *pzWhere = zWhere; + *pnBind = nBind; + return zRet; +} + +/* +** Assuming the current table columns are "a", "b" and "c", and the zObj +** paramter is passed "old", return a string of the form: +** +** "old.a, old.b, old.b" +** +** With the column names escaped. +** +** For tables with implicit rowids - RBU_PK_EXTERNAL and RBU_PK_NONE, append +** the text ", old._rowid_" to the returned value. +*/ +static char *rbuObjIterGetOldlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zObj +){ + char *zList = 0; + if( p->rc==SQLITE_OK && pIter->abIndexed ){ + const char *zS = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abIndexed[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = sqlite3_mprintf("%z%s%s.\"%w\"", zList, zS, zObj, zCol); + }else{ + zList = sqlite3_mprintf("%z%sNULL", zList, zS); + } + zS = ", "; + if( zList==0 ){ + p->rc = SQLITE_NOMEM; + break; + } + } + + /* For a table with implicit rowids, append "old._rowid_" to the list. */ + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "%z, %s._rowid_", zList, zObj); + } + } + return zList; +} + +/* +** Return an expression that can be used in a WHERE clause to match the +** primary key of the current table. For example, if the table is: +** +** CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)); +** +** Return the string: +** +** "b = ?1 AND c = ?2" +*/ +static char *rbuObjIterGetWhere( + sqlite3rbu *p, + RbuObjIter *pIter +){ + char *zList = 0; + if( pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "_rowid_ = ?%d", pIter->nTblCol+1); + }else if( pIter->eType==RBU_PK_EXTERNAL ){ + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abTblPk[i] ){ + zList = rbuMPrintf(p, "%z%sc%d=?%d", zList, zSep, i, i+1); + zSep = " AND "; + } + } + zList = rbuMPrintf(p, + "_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)", zList + ); + + }else{ + const char *zSep = ""; + int i; + for(i=0; inTblCol; i++){ + if( pIter->abTblPk[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", zList, zSep, zCol, i+1); + zSep = " AND "; + } + } + } + return zList; +} + +/* +** The SELECT statement iterating through the keys for the current object +** (p->objiter.pSelect) currently points to a valid row. However, there +** is something wrong with the rbu_control value in the rbu_control value +** stored in the (p->nCol+1)'th column. Set the error code and error message +** of the RBU handle to something reflecting this. +*/ +static void rbuBadControlError(sqlite3rbu *p){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid rbu_control value"); +} + + +/* +** Return a nul-terminated string containing the comma separated list of +** assignments that should be included following the "SET" keyword of +** an UPDATE statement used to update the table object that the iterator +** passed as the second argument currently points to if the rbu_control +** column of the data_xxx table entry is set to zMask. +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetSetlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zMask +){ + char *zList = 0; + if( p->rc==SQLITE_OK ){ + int i; + + if( (int)strlen(zMask)!=pIter->nTblCol ){ + rbuBadControlError(p); + }else{ + const char *zSep = ""; + for(i=0; inTblCol; i++){ + char c = zMask[pIter->aiSrcOrder[i]]; + if( c=='x' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", + zList, zSep, pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='d' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='f' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + } + } + } + return zList; +} + +/* +** Return a nul-terminated string consisting of nByte comma separated +** "?" expressions. For example, if nByte is 3, return a pointer to +** a buffer containing the string "?,?,?". +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ + char *zRet = 0; + sqlite3_int64 nByte = 2*(sqlite3_int64)nBind + 1; + + zRet = (char*)rbuMalloc(p, nByte); + if( zRet ){ + int i; + for(i=0; izIdx==0 ); + if( p->rc==SQLITE_OK ){ + const char *zSep = "PRIMARY KEY("; + sqlite3_stmt *pXList = 0; /* PRAGMA index_list = (pIter->zTbl) */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = */ + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXList) ){ + const char *zOrig = (const char*)sqlite3_column_text(pXList,3); + if( zOrig && strcmp(zOrig, "pk")==0 ){ + const char *zIdx = (const char*)sqlite3_column_text(pXList,1); + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + break; + } + } + rbuFinalize(p, pXList); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + if( sqlite3_column_int(pXInfo, 5) ){ + /* int iCid = sqlite3_column_int(pXInfo, 0); */ + const char *zCol = (const char*)sqlite3_column_text(pXInfo, 2); + const char *zDesc = sqlite3_column_int(pXInfo, 3) ? " DESC" : ""; + z = rbuMPrintf(p, "%z%s\"%w\"%s", z, zSep, zCol, zDesc); + zSep = ", "; + } + } + z = rbuMPrintf(p, "%z)", z); + rbuFinalize(p, pXInfo); + } + return z; +} + +/* +** This function creates the second imposter table used when writing to +** a table b-tree where the table has an external primary key. If the +** iterator passed as the second argument does not currently point to +** a table (not index) with an external primary key, this function is a +** no-op. +** +** Assuming the iterator does point to a table with an external PK, this +** function creates a WITHOUT ROWID imposter table named "rbu_imposter2" +** used to access that PK index. For example, if the target table is +** declared as follows: +** +** CREATE TABLE t1(a, b TEXT, c REAL, PRIMARY KEY(b, c)); +** +** then the imposter table schema is: +** +** CREATE TABLE rbu_imposter2(c1 TEXT, c2 REAL, id INTEGER) WITHOUT ROWID; +** +*/ +static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_EXTERNAL ){ + int tnum = pIter->iPkTnum; /* Root page of PK index */ + sqlite3_stmt *pQuery = 0; /* SELECT name ... WHERE rootpage = $tnum */ + const char *zIdx = 0; /* Name of PK index */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA main.index_xinfo = $zIdx */ + const char *zComma = ""; + char *zCols = 0; /* Used to build up list of table cols */ + char *zPk = 0; /* Used to build up table PK declaration */ + + /* Figure out the name of the primary key index for the current table. + ** This is needed for the argument to "PRAGMA index_xinfo". Set + ** zIdx to point to a nul-terminated string containing this name. */ + p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, + "SELECT name FROM sqlite_schema WHERE rootpage = ?" + ); + if( p->rc==SQLITE_OK ){ + sqlite3_bind_int(pQuery, 1, tnum); + if( SQLITE_ROW==sqlite3_step(pQuery) ){ + zIdx = (const char*)sqlite3_column_text(pQuery, 0); + } + } + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + rbuFinalize(p, pQuery); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int bKey = sqlite3_column_int(pXInfo, 5); + if( bKey ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma, + iCid, pIter->azTblType[iCid], zCollate + ); + zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":""); + zComma = ", "; + } + } + zCols = rbuMPrintf(p, "%z, id INTEGER", zCols); + rbuFinalize(p, pXInfo); + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID", + zCols, zPk + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** If an error has already occurred when this function is called, it +** immediately returns zero (without doing any work). Or, if an error +** occurs during the execution of this function, it sets the error code +** in the sqlite3rbu object indicated by the first argument and returns +** zero. +** +** The iterator passed as the second argument is guaranteed to point to +** a table (not an index) when this function is called. This function +** attempts to create any imposter table required to write to the main +** table b-tree of the table before returning. Non-zero is returned if +** an imposter table are created, or zero otherwise. +** +** An imposter table is required in all cases except RBU_PK_VTAB. Only +** virtual tables are written to directly. The imposter table has the +** same schema as the actual target table (less any UNIQUE constraints). +** More precisely, the "same schema" means the same columns, types, +** collation sequences. For tables that do not have an external PRIMARY +** KEY, it also means the same PRIMARY KEY declaration. +*/ +static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType!=RBU_PK_VTAB ){ + int tnum = pIter->iTnum; + const char *zComma = ""; + char *zSql = 0; + int iCol; + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + + for(iCol=0; p->rc==SQLITE_OK && iColnTblCol; iCol++){ + const char *zPk = ""; + const char *zCol = pIter->azTblCol[iCol]; + const char *zColl = 0; + + p->rc = sqlite3_table_column_metadata( + p->dbMain, "main", pIter->zTbl, zCol, 0, &zColl, 0, 0, 0 + ); + + if( pIter->eType==RBU_PK_IPK && pIter->abTblPk[iCol] ){ + /* If the target table column is an "INTEGER PRIMARY KEY", add + ** "PRIMARY KEY" to the imposter table column declaration. */ + zPk = "PRIMARY KEY "; + } + zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s", + zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl, + (pIter->abNotNull[iCol] ? " NOT NULL" : "") + ); + zComma = ", "; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + char *zPk = rbuWithoutRowidPK(p, pIter); + if( zPk ){ + zSql = rbuMPrintf(p, "%z, %z", zSql, zPk); + } + } + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", + pIter->zTbl, zSql, + (pIter->eType==RBU_PK_WITHOUT_ROWID ? " WITHOUT ROWID" : "") + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** Prepare a statement used to insert rows into the "rbu_tmp_xxx" table. +** Specifically a statement of the form: +** +** INSERT INTO rbu_tmp_xxx VALUES(?, ?, ? ...); +** +** The number of bound variables is equal to the number of columns in +** the target table, plus one (for the rbu_control column), plus one more +** (for the rbu_rowid column) if the target table is an implicit IPK or +** virtual table. +*/ +static void rbuObjIterPrepareTmpInsert( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zCollist, + const char *zRbuRowid +){ + int bRbuRowid = (pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE); + char *zBind = rbuObjIterGetBindlist(p, pIter->nTblCol + 1 + bRbuRowid); + if( zBind ){ + assert( pIter->pTmpInsert==0 ); + p->rc = prepareFreeAndCollectError( + p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf( + "INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)", + p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind + )); + } +} + +static void rbuTmpInsertFunc( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + int rc = SQLITE_OK; + int i; + + assert( sqlite3_value_int(apVal[0])!=0 + || p->objiter.eType==RBU_PK_EXTERNAL + || p->objiter.eType==RBU_PK_NONE + ); + if( sqlite3_value_int(apVal[0])!=0 ){ + p->nPhaseOneStep += p->objiter.nIndex; + } + + for(i=0; rc==SQLITE_OK && iobjiter.pTmpInsert, i+1, apVal[i]); + } + if( rc==SQLITE_OK ){ + sqlite3_step(p->objiter.pTmpInsert); + rc = sqlite3_reset(p->objiter.pTmpInsert); + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + } +} + +static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pStmt = 0; + int rc = p->rc; + char *zRet = 0; + + assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==0 ); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + "SELECT trim(sql) FROM sqlite_schema WHERE type='index' AND name=?" + ); + } + if( rc==SQLITE_OK ){ + int rc2; + rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + char *zSql = (char*)sqlite3_column_text(pStmt, 0); + if( zSql ){ + pIter->zIdxSql = zSql = rbuStrndup(zSql, &rc); + } + if( zSql ){ + int nParen = 0; /* Number of open parenthesis */ + int i; + int iIdxCol = 0; + int nIdxAlloc = 0; + for(i=0; zSql[i]; i++){ + char c = zSql[i]; + + /* If necessary, grow the pIter->aIdxCol[] array */ + if( iIdxCol==nIdxAlloc ){ + RbuSpan *aIdxCol = (RbuSpan*)sqlite3_realloc( + pIter->aIdxCol, (nIdxAlloc+16)*sizeof(RbuSpan) + ); + if( aIdxCol==0 ){ + rc = SQLITE_NOMEM; + break; + } + pIter->aIdxCol = aIdxCol; + nIdxAlloc += 16; + } + + if( c=='(' ){ + if( nParen==0 ){ + assert( iIdxCol==0 ); + pIter->aIdxCol[0].zSpan = &zSql[i+1]; + } + nParen++; + } + else if( c==')' ){ + nParen--; + if( nParen==0 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + i++; + break; + } + }else if( c==',' && nParen==1 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1]; + }else if( c=='"' || c=='\'' || c=='`' ){ + for(i++; 1; i++){ + if( zSql[i]==c ){ + if( zSql[i+1]!=c ) break; + i++; + } + } + }else if( c=='[' ){ + for(i++; 1; i++){ + if( zSql[i]==']' ) break; + } + }else if( c=='-' && zSql[i+1]=='-' ){ + for(i=i+2; zSql[i] && zSql[i]!='\n'; i++); + if( zSql[i]=='\0' ) break; + }else if( c=='/' && zSql[i+1]=='*' ){ + for(i=i+2; zSql[i] && (zSql[i]!='*' || zSql[i+1]!='/'); i++); + if( zSql[i]=='\0' ) break; + i++; + } + } + if( zSql[i] ){ + zRet = rbuStrndup(&zSql[i], &rc); + } + pIter->nIdxCol = iIdxCol; + } + } + + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + } + + p->rc = rc; + return zRet; +} + +/* +** Ensure that the SQLite statement handles required to update the +** target database object currently indicated by the iterator passed +** as the second argument are available. +*/ +static int rbuObjIterPrepareAll( + sqlite3rbu *p, + RbuObjIter *pIter, + int nOffset /* Add "LIMIT -1 OFFSET $nOffset" to SELECT */ +){ + assert( pIter->bCleanup==0 ); + if( pIter->pSelect==0 && rbuObjIterCacheTableInfo(p, pIter)==SQLITE_OK ){ + const int tnum = pIter->iTnum; + char *zCollist = 0; /* List of indexed columns */ + char **pz = &p->zErrmsg; + const char *zIdx = pIter->zIdx; + char *zLimit = 0; + + if( nOffset ){ + zLimit = sqlite3_mprintf(" LIMIT -1 OFFSET %d", nOffset); + if( !zLimit ) p->rc = SQLITE_NOMEM; + } + + if( zIdx ){ + const char *zTbl = pIter->zTbl; + char *zImposterCols = 0; /* Columns for imposter table */ + char *zImposterPK = 0; /* Primary key declaration for imposter */ + char *zWhere = 0; /* WHERE clause on PK columns */ + char *zBind = 0; + char *zPart = 0; + int nBind = 0; + + assert( pIter->eType!=RBU_PK_VTAB ); + zPart = rbuObjIterGetIndexWhere(p, pIter); + zCollist = rbuObjIterGetIndexCols( + p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind + ); + zBind = rbuObjIterGetBindlist(p, nBind); + + /* Create the imposter table used to write to this index. */ + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1,tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE \"rbu_imp_%w\"( %s, PRIMARY KEY( %s ) ) WITHOUT ROWID", + zTbl, zImposterCols, zImposterPK + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + + /* Create the statement to insert index entries */ + pIter->nCol = nBind; + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pInsert, &p->zErrmsg, + sqlite3_mprintf("INSERT INTO \"rbu_imp_%w\" VALUES(%s)", zTbl, zBind) + ); + } + + /* And to delete index entries */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pDelete, &p->zErrmsg, + sqlite3_mprintf("DELETE FROM \"rbu_imp_%w\" WHERE %s", zTbl, zWhere) + ); + } + + /* Create the SELECT statement to read keys in sorted order */ + if( p->rc==SQLITE_OK ){ + char *zSql; + if( rbuIsVacuum(p) ){ + char *zStart = 0; + if( nOffset ){ + zStart = rbuVacuumIndexStart(p, pIter); + if( zStart ){ + sqlite3_free(zLimit); + zLimit = 0; + } + } + + zSql = sqlite3_mprintf( + "SELECT %s, 0 AS rbu_control FROM '%q' %s %s %s ORDER BY %s%s", + zCollist, + pIter->zDataTbl, + zPart, + (zStart ? (zPart ? "AND" : "WHERE") : ""), zStart, + zCollist, zLimit + ); + sqlite3_free(zStart); + }else + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, + zPart, zCollist, zLimit + ); + }else{ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' %s " + "UNION ALL " + "SELECT %s, rbu_control FROM '%q' " + "%s %s typeof(rbu_control)='integer' AND rbu_control!=1 " + "ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, zPart, + zCollist, pIter->zDataTbl, + zPart, + (zPart ? "AND" : "WHERE"), + zCollist, zLimit + ); + } + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbRbu,&pIter->pSelect,pz,zSql); + }else{ + sqlite3_free(zSql); + } + } + + sqlite3_free(zImposterCols); + sqlite3_free(zImposterPK); + sqlite3_free(zWhere); + sqlite3_free(zBind); + sqlite3_free(zPart); + }else{ + int bRbuRowid = (pIter->eType==RBU_PK_VTAB) + ||(pIter->eType==RBU_PK_NONE) + ||(pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)); + const char *zTbl = pIter->zTbl; /* Table this step applies to */ + const char *zWrite; /* Imposter table name */ + + char *zBindings = rbuObjIterGetBindlist(p, pIter->nTblCol + bRbuRowid); + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zOldlist = rbuObjIterGetOldlist(p, pIter, "old"); + char *zNewlist = rbuObjIterGetOldlist(p, pIter, "new"); + + zCollist = rbuObjIterGetCollist(p, pIter); + pIter->nCol = pIter->nTblCol; + + /* Create the imposter table or tables (if required). */ + rbuCreateImposterTable(p, pIter); + rbuCreateImposterTable2(p, pIter); + zWrite = (pIter->eType==RBU_PK_VTAB ? "" : "rbu_imp_"); + + /* Create the INSERT statement to write to the target PK b-tree */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz, + sqlite3_mprintf( + "INSERT INTO \"%s%w\"(%s%s) VALUES(%s)", + zWrite, zTbl, zCollist, (bRbuRowid ? ", _rowid_" : ""), zBindings + ) + ); + } + + /* Create the DELETE statement to write to the target PK b-tree. + ** Because it only performs INSERT operations, this is not required for + ** an rbu vacuum handle. */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pDelete, pz, + sqlite3_mprintf( + "DELETE FROM \"%s%w\" WHERE %s", zWrite, zTbl, zWhere + ) + ); + } + + if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ + const char *zRbuRowid = ""; + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zRbuRowid = ", rbu_rowid"; + } + + /* Create the rbu_tmp_xxx table and the triggers to populate it. */ + rbuMPrintfExec(p, p->dbRbu, + "CREATE TABLE IF NOT EXISTS %s.'rbu_tmp_%q' AS " + "SELECT *%s FROM '%q' WHERE 0;" + , p->zStateDb, pIter->zDataTbl + , (pIter->eType==RBU_PK_EXTERNAL ? ", 0 AS rbu_rowid" : "") + , pIter->zDataTbl + ); + + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_delete_tr BEFORE DELETE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update1_tr BEFORE UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update2_tr AFTER UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(4, %s);" + "END;", + zWrite, zTbl, zOldlist, + zWrite, zTbl, zOldlist, + zWrite, zTbl, zNewlist + ); + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_insert_tr AFTER INSERT ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(0, %s);" + "END;", + zWrite, zTbl, zNewlist + ); + } + + rbuObjIterPrepareTmpInsert(p, pIter, zCollist, zRbuRowid); + } + + /* Create the SELECT statement to read keys from data_xxx */ + if( p->rc==SQLITE_OK ){ + const char *zRbuRowid = ""; + char *zStart = 0; + char *zOrder = 0; + if( bRbuRowid ){ + zRbuRowid = rbuIsVacuum(p) ? ",_rowid_ " : ",rbu_rowid"; + } + + if( rbuIsVacuum(p) ){ + if( nOffset ){ + zStart = rbuVacuumTableStart(p, pIter, bRbuRowid, zWrite); + if( zStart ){ + sqlite3_free(zLimit); + zLimit = 0; + } + } + if( bRbuRowid ){ + zOrder = rbuMPrintf(p, "_rowid_"); + }else{ + zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", ""); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, + sqlite3_mprintf( + "SELECT %s,%s rbu_control%s FROM '%q'%s %s %s %s", + zCollist, + (rbuIsVacuum(p) ? "0 AS " : ""), + zRbuRowid, + pIter->zDataTbl, (zStart ? zStart : ""), + (zOrder ? "ORDER BY" : ""), zOrder, + zLimit + ) + ); + } + sqlite3_free(zStart); + sqlite3_free(zOrder); + } + + sqlite3_free(zWhere); + sqlite3_free(zOldlist); + sqlite3_free(zNewlist); + sqlite3_free(zBindings); + } + sqlite3_free(zCollist); + sqlite3_free(zLimit); + } + + return p->rc; +} + +/* +** Set output variable *ppStmt to point to an UPDATE statement that may +** be used to update the imposter table for the main table b-tree of the +** table object that pIter currently points to, assuming that the +** rbu_control column of the data_xyz table contains zMask. +** +** If the zMask string does not specify any columns to update, then this +** is not an error. Output variable *ppStmt is set to NULL in this case. +*/ +static int rbuGetUpdateStmt( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* Object iterator */ + const char *zMask, /* rbu_control value ('x.x.') */ + sqlite3_stmt **ppStmt /* OUT: UPDATE statement handle */ +){ + RbuUpdateStmt **pp; + RbuUpdateStmt *pUp = 0; + int nUp = 0; + + /* In case an error occurs */ + *ppStmt = 0; + + /* Search for an existing statement. If one is found, shift it to the front + ** of the LRU queue and return immediately. Otherwise, leave nUp pointing + ** to the number of statements currently in the cache and pUp to the + ** last object in the list. */ + for(pp=&pIter->pRbuUpdate; *pp; pp=&((*pp)->pNext)){ + pUp = *pp; + if( strcmp(pUp->zMask, zMask)==0 ){ + *pp = pUp->pNext; + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + *ppStmt = pUp->pUpdate; + return SQLITE_OK; + } + nUp++; + } + assert( pUp==0 || pUp->pNext==0 ); + + if( nUp>=SQLITE_RBU_UPDATE_CACHESIZE ){ + for(pp=&pIter->pRbuUpdate; *pp!=pUp; pp=&((*pp)->pNext)); + *pp = 0; + sqlite3_finalize(pUp->pUpdate); + pUp->pUpdate = 0; + }else{ + pUp = (RbuUpdateStmt*)rbuMalloc(p, sizeof(RbuUpdateStmt)+pIter->nTblCol+1); + } + + if( pUp ){ + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zSet = rbuObjIterGetSetlist(p, pIter, zMask); + char *zUpdate = 0; + + pUp->zMask = (char*)&pUp[1]; + memcpy(pUp->zMask, zMask, pIter->nTblCol); + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + + if( zSet ){ + const char *zPrefix = ""; + + if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_"; + zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", + zPrefix, pIter->zTbl, zSet, zWhere + ); + p->rc = prepareFreeAndCollectError( + p->dbMain, &pUp->pUpdate, &p->zErrmsg, zUpdate + ); + *ppStmt = pUp->pUpdate; + } + sqlite3_free(zWhere); + sqlite3_free(zSet); + } + + return p->rc; +} + +static sqlite3 *rbuOpenDbhandle( + sqlite3rbu *p, + const char *zName, + int bUseVfs +){ + sqlite3 *db = 0; + if( p->rc==SQLITE_OK ){ + const int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_URI; + p->rc = sqlite3_open_v2(zName, &db, flags, bUseVfs ? p->zVfsName : 0); + if( p->rc ){ + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + sqlite3_close(db); + db = 0; + } + } + return db; +} + +/* +** Free an RbuState object allocated by rbuLoadState(). +*/ +static void rbuFreeState(RbuState *p){ + if( p ){ + sqlite3_free(p->zTbl); + sqlite3_free(p->zDataTbl); + sqlite3_free(p->zIdx); + sqlite3_free(p); + } +} + +/* +** Allocate an RbuState object and load the contents of the rbu_state +** table into it. Return a pointer to the new object. It is the +** responsibility of the caller to eventually free the object using +** sqlite3_free(). +** +** If an error occurs, leave an error code and message in the rbu handle +** and return NULL. +*/ +static RbuState *rbuLoadState(sqlite3rbu *p){ + RbuState *pRet = 0; + sqlite3_stmt *pStmt = 0; + int rc; + int rc2; + + pRet = (RbuState*)rbuMalloc(p, sizeof(RbuState)); + if( pRet==0 ) return 0; + + rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT k, v FROM %s.rbu_state", p->zStateDb) + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + switch( sqlite3_column_int(pStmt, 0) ){ + case RBU_STATE_STAGE: + pRet->eStage = sqlite3_column_int(pStmt, 1); + if( pRet->eStage!=RBU_STAGE_OAL + && pRet->eStage!=RBU_STAGE_MOVE + && pRet->eStage!=RBU_STAGE_CKPT + ){ + p->rc = SQLITE_CORRUPT; + } + break; + + case RBU_STATE_TBL: + pRet->zTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_IDX: + pRet->zIdx = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_ROW: + pRet->nRow = sqlite3_column_int(pStmt, 1); + break; + + case RBU_STATE_PROGRESS: + pRet->nProgress = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_CKPT: + pRet->iWalCksum = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_COOKIE: + pRet->iCookie = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_OALSZ: + pRet->iOalSz = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_PHASEONESTEP: + pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_DATATBL: + pRet->zDataTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + default: + rc = SQLITE_CORRUPT; + break; + } + } + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + + p->rc = rc; + return pRet; +} + + +/* +** Open the database handle and attach the RBU database as "rbu". If an +** error occurs, leave an error code and message in the RBU handle. +** +** If argument dbMain is not NULL, then it is a database handle already +** open on the target database. Use this handle instead of opening a new +** one. +*/ +static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ + assert( p->rc || (p->dbMain==0 && p->dbRbu==0) ); + assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 ); + assert( dbMain==0 || rbuIsVacuum(p)==0 ); + + /* Open the RBU database */ + p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1); + p->dbMain = dbMain; + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( p->zState==0 ){ + const char *zFile = sqlite3_db_filename(p->dbRbu, "main"); + p->zState = rbuMPrintf(p, "file://%s-vacuum?modeof=%s", zFile, zFile); + } + } + + /* If using separate RBU and state databases, attach the state database to + ** the RBU db handle now. */ + if( p->zState ){ + rbuMPrintfExec(p, p->dbRbu, "ATTACH %Q AS stat", p->zState); + memcpy(p->zStateDb, "stat", 4); + }else{ + memcpy(p->zStateDb, "main", 4); + } + +#if 0 + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, 0); + } +#endif + + /* If it has not already been created, create the rbu_state table */ + rbuMPrintfExec(p, p->dbRbu, RBU_CREATE_STATE, p->zStateDb); + +#if 0 + if( rbuIsVacuum(p) ){ + if( p->rc==SQLITE_OK ){ + int rc2; + int bOk = 0; + sqlite3_stmt *pCnt = 0; + p->rc = prepareAndCollectError(p->dbRbu, &pCnt, &p->zErrmsg, + "SELECT count(*) FROM stat.sqlite_schema" + ); + if( p->rc==SQLITE_OK + && sqlite3_step(pCnt)==SQLITE_ROW + && 1==sqlite3_column_int(pCnt, 0) + ){ + bOk = 1; + } + rc2 = sqlite3_finalize(pCnt); + if( p->rc==SQLITE_OK ) p->rc = rc2; + + if( p->rc==SQLITE_OK && bOk==0 ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid state database"); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); + } + } + } +#endif + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + int bOpen = 0; + int rc; + p->nRbu = 0; + p->pRbuFd = 0; + rc = sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( rc!=SQLITE_NOTFOUND ) p->rc = rc; + if( p->eStage>=RBU_STAGE_MOVE ){ + bOpen = 1; + }else{ + RbuState *pState = rbuLoadState(p); + if( pState ){ + bOpen = (pState->eStage>=RBU_STAGE_MOVE); + rbuFreeState(pState); + } + } + if( bOpen ) p->dbMain = rbuOpenDbhandle(p, p->zRbu, p->nRbu<=1); + } + + p->eStage = 0; + if( p->rc==SQLITE_OK && p->dbMain==0 ){ + if( !rbuIsVacuum(p) ){ + p->dbMain = rbuOpenDbhandle(p, p->zTarget, 1); + }else if( p->pRbuFd->pWalFd ){ + if( pbRetry ){ + p->pRbuFd->bNolock = 0; + sqlite3_close(p->dbRbu); + sqlite3_close(p->dbMain); + p->dbMain = 0; + p->dbRbu = 0; + *pbRetry = 1; + return; + } + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("cannot vacuum wal mode database"); + }else{ + char *zTarget; + char *zExtra = 0; + if( strlen(p->zRbu)>=5 && 0==memcmp("file:", p->zRbu, 5) ){ + zExtra = &p->zRbu[5]; + while( *zExtra ){ + if( *zExtra++=='?' ) break; + } + if( *zExtra=='\0' ) zExtra = 0; + } + + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", + sqlite3_db_filename(p->dbRbu, "main"), + (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) + ); + + if( zTarget==0 ){ + p->rc = SQLITE_NOMEM; + return; + } + p->dbMain = rbuOpenDbhandle(p, zTarget, p->nRbu<=1); + sqlite3_free(zTarget); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_tmp_insert", -1, SQLITE_UTF8, (void*)p, rbuTmpInsertFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_fossil_delta", 2, SQLITE_UTF8, 0, rbuFossilDeltaFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbRbu, + "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + rbuMPrintfExec(p, p->dbMain, "SELECT * FROM sqlite_schema"); + + /* Mark the database file just opened as an RBU target database. If + ** this call returns SQLITE_NOTFOUND, then the RBU vfs is not in use. + ** This is an error. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + + if( p->rc==SQLITE_NOTFOUND ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("rbu vfs not found"); + } +} + +/* +** This routine is a copy of the sqlite3FileSuffix3() routine from the core. +** It is a no-op unless SQLITE_ENABLE_8_3_NAMES is defined. +** +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +static void rbuFileSuffix3(const char *zBase, char *z){ +#ifdef SQLITE_ENABLE_8_3_NAMES +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBase, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = (int)strlen(z)&0xffffff; + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && sz>i+4 ) memmove(&z[i+1], &z[sz-3], 4); + } +#endif +} + +/* +** Return the current wal-index header checksum for the target database +** as a 64-bit integer. +** +** The checksum is store in the first page of xShmMap memory as an 8-byte +** blob starting at byte offset 40. +*/ +static i64 rbuShmChecksum(sqlite3rbu *p){ + i64 iRet = 0; + if( p->rc==SQLITE_OK ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + u32 volatile *ptr; + p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, (void volatile**)&ptr); + if( p->rc==SQLITE_OK ){ + iRet = ((i64)ptr[10] << 32) + ptr[11]; + } + } + return iRet; +} + +/* +** This function is called as part of initializing or reinitializing an +** incremental checkpoint. +** +** It populates the sqlite3rbu.aFrame[] array with the set of +** (wal frame -> db page) copy operations required to checkpoint the +** current wal file, and obtains the set of shm locks required to safely +** perform the copy operations directly on the file-system. +** +** If argument pState is not NULL, then the incremental checkpoint is +** being resumed. In this case, if the checksum of the wal-index-header +** following recovery is not the same as the checksum saved in the RbuState +** object, then the rbu handle is set to DONE state. This occurs if some +** other client appends a transaction to the wal file in the middle of +** an incremental checkpoint. +*/ +static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ + + /* If pState is NULL, then the wal file may not have been opened and + ** recovered. Running a read-statement here to ensure that doing so + ** does not interfere with the "capture" process below. */ + if( pState==0 ){ + p->eStage = 0; + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbMain, "SELECT * FROM sqlite_schema", 0, 0, 0); + } + } + + /* Assuming no error has occurred, run a "restart" checkpoint with the + ** sqlite3rbu.eStage variable set to CAPTURE. This turns on the following + ** special behaviour in the rbu VFS: + ** + ** * If the exclusive shm WRITER or READ0 lock cannot be obtained, + ** the checkpoint fails with SQLITE_BUSY (normally SQLite would + ** proceed with running a passive checkpoint instead of failing). + ** + ** * Attempts to read from the *-wal file or write to the database file + ** do not perform any IO. Instead, the frame/page combinations that + ** would be read/written are recorded in the sqlite3rbu.aFrame[] + ** array. + ** + ** * Calls to xShmLock(UNLOCK) to release the exclusive shm WRITER, + ** READ0 and CHECKPOINT locks taken as part of the checkpoint are + ** no-ops. These locks will not be released until the connection + ** is closed. + ** + ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL + ** error. + ** + ** As a result, unless an error (i.e. OOM or SQLITE_BUSY) occurs, the + ** checkpoint below fails with SQLITE_INTERNAL, and leaves the aFrame[] + ** array populated with a set of (frame -> page) mappings. Because the + ** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy + ** data from the wal file into the database file according to the + ** contents of aFrame[]. + */ + if( p->rc==SQLITE_OK ){ + int rc2; + p->eStage = RBU_STAGE_CAPTURE; + rc2 = sqlite3_exec(p->dbMain, "PRAGMA main.wal_checkpoint=restart", 0, 0,0); + if( rc2!=SQLITE_INTERNAL ) p->rc = rc2; + } + + if( p->rc==SQLITE_OK && p->nFrame>0 ){ + p->eStage = RBU_STAGE_CKPT; + p->nStep = (pState ? pState->nRow : 0); + p->aBuf = rbuMalloc(p, p->pgsz); + p->iWalCksum = rbuShmChecksum(p); + } + + if( p->rc==SQLITE_OK ){ + if( p->nFrame==0 || (pState && pState->iWalCksum!=p->iWalCksum) ){ + p->rc = SQLITE_DONE; + p->eStage = RBU_STAGE_DONE; + }else{ + int nSectorSize; + sqlite3_file *pDb = p->pTargetFd->pReal; + sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; + assert( p->nPagePerSector==0 ); + nSectorSize = pDb->pMethods->xSectorSize(pDb); + if( nSectorSize>p->pgsz ){ + p->nPagePerSector = nSectorSize / p->pgsz; + }else{ + p->nPagePerSector = 1; + } + + /* Call xSync() on the wal file. This causes SQLite to sync the + ** directory in which the target database and the wal file reside, in + ** case it has not been synced since the rename() call in + ** rbuMoveOalFile(). */ + p->rc = pWal->pMethods->xSync(pWal, SQLITE_SYNC_NORMAL); + } + } +} + +/* +** Called when iAmt bytes are read from offset iOff of the wal file while +** the rbu object is in capture mode. Record the frame number of the frame +** being read in the aFrame[] array. +*/ +static int rbuCaptureWalRead(sqlite3rbu *pRbu, i64 iOff, int iAmt){ + const u32 mReq = (1<mLock!=mReq ){ + pRbu->rc = SQLITE_BUSY; + return SQLITE_INTERNAL; + } + + pRbu->pgsz = iAmt; + if( pRbu->nFrame==pRbu->nFrameAlloc ){ + int nNew = (pRbu->nFrameAlloc ? pRbu->nFrameAlloc : 64) * 2; + RbuFrame *aNew; + aNew = (RbuFrame*)sqlite3_realloc64(pRbu->aFrame, nNew * sizeof(RbuFrame)); + if( aNew==0 ) return SQLITE_NOMEM; + pRbu->aFrame = aNew; + pRbu->nFrameAlloc = nNew; + } + + iFrame = (u32)((iOff-32) / (i64)(iAmt+24)) + 1; + if( pRbu->iMaxFrame
      17. NPY%(*eK97b8Hto7BP2cLv~YmO213wiI>n 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 literal 0 HcmV?d00001 diff --git a/prj_config.h.in b/prj_config.h.in new file mode 100644 index 0000000..c95a7ac --- /dev/null +++ b/prj_config.h.in @@ -0,0 +1,18 @@ +// +// Created by xajhuang on 2022/12/14. +// + +#ifndef PROJECT_PRG_CONFIG_H_IN +#define PROJECT_PRG_CONFIG_H_IN + +#define PROJECT_GIT_VERSION "@VERSION_GIT_TAG@" +#define PROJECT_GIT_HASH "@VERSION_GIT_HASH@" +#define PROJECT_GIT_HASH_SHORT "@VERSION_GIT_HASH_SHORT@" +#define PROJECT_GIT_BRANCH "@VERSION_GIT_BRANCH@" +#define PROJECT_PROJECT_NAME "@PROJECT_NAME@" +#define PROJECT_PROJECT_VER "@PROJECT_VERSION@" +#define PROJECT_PROJECT_VER_MAJOR "@PROJECT_VERSION_MAJOR@" +#define PROJECT_PROJECT_VER_MINOR "@PROJECT_VERSION_MINOR@" +#define PROJECT_PTOJECT_VER_PATCH "@PROJECT_VERSION_PATCH@" + +#endif //PROJECT_PRG_CONFIG_H_IN diff --git a/srcs/CMakeLists.txt b/srcs/CMakeLists.txt new file mode 100644 index 0000000..4b14098 --- /dev/null +++ b/srcs/CMakeLists.txt @@ -0,0 +1,43 @@ +SET(PROJECT_TARGET middleware_agent) + +PROJECT(${PROJECT_TARGET} LANGUAGES C) + +ADD_DEFINITIONS(${COMMON_DEFINE}) + +INCLUDE_DIRECTORIES(include ./ ./include ./libs/include ${COMMON_INCLUDE}) + +SET(CMAKE_C_STANDARD 99) + +FILE(GLOB AGENT_HEADS include/*.h include/uthash/*.h include/s2j/*.h) + +ADD_EXECUTABLE(${PROJECT_TARGET} ${AGENT_HEADS} middleware_agent.c) + +TARGET_LINK_LIBRARIES(${PROJECT_TARGET} common) +TARGET_LINK_LIBRARIES(${PROJECT_TARGET} ${COMMON_LIBS}) +TARGET_INCLUDE_DIRECTORIES(${PROJECT_TARGET} PUBLIC ${PROJECT_BINARY_DIR}/../) + +# 自动复制配置文件到运行路径 +ADD_CUSTOM_COMMAND(TARGET ${PROJECT_TARGET} + POST_BUILD + COMMENT "!!!!!! Notice: Automatic upgreade configuration files after build project." + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/config/" + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/log/" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/config/zlog.conf" "${CMAKE_CURRENT_BINARY_DIR}/config/" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/config/agent.cfg" "${CMAKE_CURRENT_BINARY_DIR}/config/" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/config/banner.txt" "${CMAKE_CURRENT_BINARY_DIR}/config/") + +SET(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install/") +INSTALL(FILES ../config/agent.cfg ../config/agent@.service ../config/banner.txt ../config/zlog.conf + DESTINATION config) +INSTALL(TARGETS ${PROJECT_TARGET} RUNTIME DESTINATION ./) +INSTALL(DIRECTORY DESTINATION ./log) + +SET(CPACK_GENERATOR "TGZ") +IF ("${VERSION_GIT_HASH_SHORT}" STREQUAL "") + STRING(REGEX REPLACE "[_:-]" "" VER_STR "${VERSION_GIT_TAG}") + SET(CPACK_PACKAGE_FILE_NAME "agent-${AGENT_VERSION}-linux-amd64_${VER_STR}") +ELSE () + SET(CPACK_PACKAGE_FILE_NAME "agent-${AGENT_VERSION}-linux-amd64_${VERSION_GIT_HASH_SHORT}") +ENDIF () + +INCLUDE(CPack) \ No newline at end of file diff --git a/srcs/libs/CMakeLists.txt b/srcs/libs/CMakeLists.txt new file mode 100644 index 0000000..5b94cd4 --- /dev/null +++ b/srcs/libs/CMakeLists.txt @@ -0,0 +1,76 @@ +SET(LIB_PROJECT_TARGET common) + +PROJECT(${LIB_PROJECT_TARGET} LANGUAGES C VERSION 1.1.0) + +STRING(REPLACE ";" ", " BUILD_CONFIG_INFO "${COMMON_DEFINE}") +CONFIGURE_FILE(lib_config.h.in lib_config.h) + +IF (USED_SQLITE_CRYPTO) + INCLUDE_DIRECTORIES(include/sqlite3) +ENDIF () + +INCLUDE_DIRECTORIES(include ./ ./include ../lwip/src/arch_linux/include ../include mongoose) +FILE(GLOB C_HEADS ./include/network/*.h include/*.h include/uthash/*.h include/s2j/*.h vector/*.h ${CMAKE_BINARY_DIR}/*.h ${PROJECT_BINARY_DIR}/*.h) + +AUX_SOURCE_DIRECTORY(json C_SRC) +AUX_SOURCE_DIRECTORY(args C_SRC) +AUX_SOURCE_DIRECTORY(init C_SRC) +AUX_SOURCE_DIRECTORY(misc C_SRC) +AUX_SOURCE_DIRECTORY(bitset C_SRC) +AUX_SOURCE_DIRECTORY(banner C_SRC) +AUX_SOURCE_DIRECTORY(configure C_SRC) +AUX_SOURCE_DIRECTORY(network C_SRC) +AUX_SOURCE_DIRECTORY(task C_SRC) +AUX_SOURCE_DIRECTORY(ipaddr C_SRC) +AUX_SOURCE_DIRECTORY(cmdline C_SRC) +AUX_SOURCE_DIRECTORY(crypto_cipher C_SRC) +AUX_SOURCE_DIRECTORY(hardware C_SRC) +AUX_SOURCE_DIRECTORY(protocol C_SRC) +AUX_SOURCE_DIRECTORY(fs_watch C_SRC) +AUX_SOURCE_DIRECTORY(zlog_module C_SRC) + +IF (USED_JSON_VALIDATE) + ADD_SUBDIRECTORY(./json/json_schema) +ENDIF () + +IF (USED_HTTP_SVR) + AUX_SOURCE_DIRECTORY(mongoose C_SRC) +ENDIF () + +IF (USED_SQLITE) + LIST(APPEND C_SRC database/database.c) + IF (SQLITE_CRYPTO_ON) + AUX_SOURCE_DIRECTORY(database/sqlite3 C_SRC) + ENDIF () +ENDIF () + +SET(CMAKE_C_STANDARD 99) + +SET_SOURCE_FILES_PROPERTIES(misc/zvector.c PROPERTIES COMPILE_FLAGS "-Wall -Wextra -flto") +SET_SOURCE_FILES_PROPERTIES(mongoose/mongoose.c PROPERTIES COMPILE_FLAGS "-Wall -Wextra -w") + +IF (USED_SQLITE_CRYPTO) + SET_SOURCE_FILES_PROPERTIES(database/sqlite3/sqlite3.c PROPERTIES + COMPILE_FLAGS "-DSQLITE_HAS_CODEC \ +-DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_OS_UNIX=1 \ +-D_HAVE_SQLITE_CONFIG_H -DBUILD_sqlite -DNDEBUG -DSQLITE_THREADSAFE=1 \ +-DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \ +-DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \ +-DSQLITE_HAVE_ZLIB=1 -DSQLITE_TEMP_STORE=2") +ENDIF () + +ADD_DEFINITIONS(${COMMON_DEFINE}) + +IF (USED_HTTP_SVR) + ADD_DEFINITIONS(-DMG_ARCH=MG_ARCH_UNIX -DMG_ENABLE_OPENSSL=1) +ENDIF () + +ADD_LIBRARY(${LIB_PROJECT_TARGET} ${C_SRC} ${C_HEADS}) + +TARGET_LINK_LIBRARIES(${LIB_PROJECT_TARGET} ${COMMON_LIBS}) + +IF (USED_JSON_VALIDATE) + TARGET_LINK_LIBRARIES(${LIB_PROJECT_TARGET} jsoncdac) +ENDIF () + +TARGET_INCLUDE_DIRECTORIES(${LIB_PROJECT_TARGET} PUBLIC ${PROJECT_BINARY_DIR}/ ${CMAKE_BINARY_DIR}/) diff --git a/srcs/libs/args/argtable3.c b/srcs/libs/args/argtable3.c new file mode 100644 index 0000000..5a9e7e9 --- /dev/null +++ b/srcs/libs/args/argtable3.c @@ -0,0 +1,6403 @@ +/******************************************************************************* + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#define ARG_AMALGAMATION + +/******************************************************************************* + * argtable3_private: Declares private types, constants, and interfaces + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef ARG_UTILS_H +#define ARG_UTILS_H + +#include + +#define ARG_ENABLE_TRACE 0 +#define ARG_ENABLE_LOG 1 + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + ARG_ERR_MINCOUNT = 1, + ARG_ERR_MAXCOUNT, + ARG_ERR_BADINT, + ARG_ERR_OVERFLOW, + ARG_ERR_BADDOUBLE, + ARG_ERR_BADDATE, + ARG_ERR_REGNOMATCH +}; + +typedef void(arg_panicfn)(const char *fmt, ...); + +#if defined(_MSC_VER) +#define ARG_TRACE(x) \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) do { \ + if (ARG_ENABLE_TRACE) \ + dbg_printf x; \ + } \ + while (0) \ + __pragma(warning(pop)) + +#define ARG_LOG(x) \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) do { \ + if (ARG_ENABLE_LOG) \ + dbg_printf x; \ + } \ + while (0) \ + __pragma(warning(pop)) +#else +#define ARG_TRACE(x) \ + do { \ + if (ARG_ENABLE_TRACE) \ + dbg_printf x; \ + } while (0) + +#define ARG_LOG(x) \ + do { \ + if (ARG_ENABLE_LOG) \ + dbg_printf x; \ + } while (0) +#endif + +/* + * Rename a few generic names to unique names. + * They can be a problem for the platforms like NuttX, where + * the namespace is flat for everything including apps and libraries. + */ +#define xmalloc argtable3_xmalloc +#define xcalloc argtable3_xcalloc +#define xrealloc argtable3_xrealloc +#define xfree argtable3_xfree + +extern void dbg_printf(const char *fmt, ...); +extern void arg_set_panic(arg_panicfn *proc); +extern void *xmalloc(size_t size); +extern void *xcalloc(size_t count, size_t size); +extern void *xrealloc(void *ptr, size_t size); +extern void xfree(void *ptr); + +struct arg_hashtable_entry { + void *k, *v; + unsigned int h; + struct arg_hashtable_entry *next; +}; + +typedef struct arg_hashtable { + unsigned int tablelength; + struct arg_hashtable_entry **table; + unsigned int entrycount; + unsigned int loadlimit; + unsigned int primeindex; + unsigned int (*hashfn)(const void *k); + int (*eqfn)(const void *k1, const void *k2); +} arg_hashtable_t; + +/** + * @brief Create a hash table. + * + * @param minsize minimum initial size of hash table + * @param hashfn function for hashing keys + * @param eqfn function for determining key equality + * @return newly created hash table or NULL on failure + */ +arg_hashtable_t *arg_hashtable_create(unsigned int minsize, + unsigned int (*hashfn)(const void *), + int (*eqfn)(const void *, const void *)); + +/** + * @brief This function will cause the table to expand if the insertion would + * take the ratio of entries to table size over the maximum load factor. + * + * This function does not check for repeated insertions with a duplicate key. + * The value returned when using a duplicate key is undefined -- when + * the hash table changes size, the order of retrieval of duplicate key + * entries is reversed. + * If in doubt, remove before insert. + * + * @param h the hash table to insert into + * @param k the key - hash table claims ownership and will free on removal + * @param v the value - does not claim ownership + * @return non-zero for successful insertion + */ +void arg_hashtable_insert(arg_hashtable_t *h, void *k, void *v); + +#define ARG_DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ + int fnname(arg_hashtable_t *h, keytype *k, valuetype *v) { \ + return arg_hashtable_insert(h, k, v); \ + } + +/** + * @brief Search the specified key in the hash table. + * + * @param h the hash table to search + * @param k the key to search for - does not claim ownership + * @return the value associated with the key, or NULL if none found + */ +void *arg_hashtable_search(arg_hashtable_t *h, const void *k); + +#define ARG_DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ + valuetype *fnname(arg_hashtable_t *h, keytype *k) { \ + return (valuetype *)(arg_hashtable_search(h, k)); \ + } + +/** + * @brief Remove the specified key from the hash table. + * + * @param h the hash table to remove the item from + * @param k the key to search for - does not claim ownership + */ +void arg_hashtable_remove(arg_hashtable_t *h, const void *k); + +#define ARG_DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ + void fnname(arg_hashtable_t *h, keytype *k) { \ + arg_hashtable_remove(h, k); \ + } + +/** + * @brief Return the number of keys in the hash table. + * + * @param h the hash table + * @return the number of items stored in the hash table + */ +unsigned int arg_hashtable_count(arg_hashtable_t *h); + +/** + * @brief Change the value associated with the key. + * + * function to change the value associated with a key, where there already + * exists a value bound to the key in the hash table. + * Source due to Holger Schemel. + * + * @name hashtable_change + * @param h the hash table + * @param key + * @param value + */ +int arg_hashtable_change(arg_hashtable_t *h, void *k, void *v); + +/** + * @brief Free the hash table and the memory allocated for each key-value pair. + * + * @param h the hash table + * @param free_values whether to call 'free' on the remaining values + */ +void arg_hashtable_destroy(arg_hashtable_t *h, int free_values); + +typedef struct arg_hashtable_itr { + arg_hashtable_t *h; + struct arg_hashtable_entry *e; + struct arg_hashtable_entry *parent; + unsigned int index; +} arg_hashtable_itr_t; + +arg_hashtable_itr_t *arg_hashtable_itr_create(arg_hashtable_t *h); + +void arg_hashtable_itr_destroy(arg_hashtable_itr_t *itr); + +/** + * @brief Return the value of the (key,value) pair at the current position. + */ +extern void *arg_hashtable_itr_key(arg_hashtable_itr_t *i); + +/** + * @brief Return the value of the (key,value) pair at the current position. + */ +extern void *arg_hashtable_itr_value(arg_hashtable_itr_t *i); + +/** + * @brief Advance the iterator to the next element. Returns zero if advanced to + * end of table. + */ +int arg_hashtable_itr_advance(arg_hashtable_itr_t *itr); + +/** + * @brief Remove current element and advance the iterator to the next element. + */ +int arg_hashtable_itr_remove(arg_hashtable_itr_t *itr); + +/** + * @brief Search and overwrite the supplied iterator, to point to the entry + * matching the supplied key. + * + * @return Zero if not found. + */ +int arg_hashtable_itr_search(arg_hashtable_itr_t *itr, arg_hashtable_t *h, void *k); + +#define ARG_DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \ + int fnname(arg_hashtable_itr_t *i, arg_hashtable_t *h, keytype *k) { \ + return (arg_hashtable_iterator_search(i, h, k)); \ + } + +#ifdef __cplusplus +} +#endif + +#endif +/******************************************************************************* + * arg_utils: Implements memory, panic, and other utility functions + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include +#include + +static void panic(const char *fmt, ...); +static arg_panicfn *s_panic = panic; + +void dbg_printf(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} + +static void panic(const char *fmt, ...) { + va_list args; + char *s; + + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif + s = getenv("EF_DUMPCORE"); +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + + if (s != NULL && *s != '\0') { + abort(); + } else { + exit(EXIT_FAILURE); + } +} + +void arg_set_panic(arg_panicfn *proc) { + s_panic = proc; +} + +void *xmalloc(size_t size) { + void *ret = malloc(size); + if (!ret) { + s_panic("Out of memory!\n"); + } + return ret; +} + +void *xcalloc(size_t count, size_t size) { + size_t allocated_count = count && size ? count : 1; + size_t allocated_size = count && size ? size : 1; + void *ret = calloc(allocated_count, allocated_size); + if (!ret) { + s_panic("Out of memory!\n"); + } + return ret; +} + +void *xrealloc(void *ptr, size_t size) { + size_t allocated_size = size ? size : 1; + void *ret = realloc(ptr, allocated_size); + if (!ret) { + s_panic("Out of memory!\n"); + } + return ret; +} + +void xfree(void *ptr) { + free(ptr); +} + +static void merge(void *data, int esize, int i, int j, int k, arg_comparefn *comparefn) { + char *a = (char *)data; + char *m; + int ipos, jpos, mpos; + + /* Initialize the counters used in merging. */ + ipos = i; + jpos = j + 1; + mpos = 0; + + /* Allocate storage for the merged elements. */ + m = (char *)xmalloc((size_t)(esize * ((k - i) + 1))); + + /* Continue while either division has elements to merge. */ + while (ipos <= j || jpos <= k) { + if (ipos > j) { + /* The left division has no more elements to merge. */ + while (jpos <= k) { + memcpy(&m[mpos * esize], &a[jpos * esize], (size_t)esize); + jpos++; + mpos++; + } + + continue; + } else if (jpos > k) { + /* The right division has no more elements to merge. */ + while (ipos <= j) { + memcpy(&m[mpos * esize], &a[ipos * esize], (size_t)esize); + ipos++; + mpos++; + } + + continue; + } + + /* Append the next ordered element to the merged elements. */ + if (comparefn(&a[ipos * esize], &a[jpos * esize]) < 0) { + memcpy(&m[mpos * esize], &a[ipos * esize], (size_t)esize); + ipos++; + mpos++; + } else { + memcpy(&m[mpos * esize], &a[jpos * esize], (size_t)esize); + jpos++; + mpos++; + } + } + + /* Prepare to pass back the merged data. */ + memcpy(&a[i * esize], m, (size_t)(esize * ((k - i) + 1))); + xfree(m); +} + +void arg_mgsort(void *data, int size, int esize, int i, int k, arg_comparefn *comparefn) { + int j; + + /* Stop the recursion when no more divisions can be made. */ + if (i < k) { + /* Determine where to divide the elements. */ + j = (int)(((i + k - 1)) / 2); + + /* Recursively sort the two divisions. */ + arg_mgsort(data, size, esize, i, j, comparefn); + arg_mgsort(data, size, esize, j + 1, k, comparefn); + merge(data, esize, i, j, k, comparefn); + } +} + +/******************************************************************************* + * arg_hashtable: Implements the hash table utilities + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include +#include + +/* + * This hash table module is adapted from the C hash table implementation by + * Christopher Clark. Here is the copyright notice from the library: + * + * Copyright (c) 2002, Christopher Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Credit for primes table: Aaron Krowne + * http://br.endernet.org/~akrowne/ + * http://planetmath.org/encyclopedia/GoodHashTablePrimes.html + */ +static const unsigned int primes[] = {53, 97, 193, 389, 769, 1543, 3079, + 6151, 12289, 24593, 49157, 98317, 196613, 393241, + 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653, + 100663319, 201326611, 402653189, 805306457, 1610612741}; +const unsigned int prime_table_length = sizeof(primes) / sizeof(primes[0]); +const float max_load_factor = (float)0.65; + +static unsigned int enhanced_hash(arg_hashtable_t *h, const void *k) { + /* + * Aim to protect against poor hash functions by adding logic here. + * The logic is taken from Java 1.4 hash table source. + */ + unsigned int i = h->hashfn(k); + i += ~(i << 9); + i ^= ((i >> 14) | (i << 18)); /* >>> */ + i += (i << 4); + i ^= ((i >> 10) | (i << 22)); /* >>> */ + return i; +} + +static unsigned int index_for(unsigned int tablelength, unsigned int hashvalue) { + return (hashvalue % tablelength); +} + +arg_hashtable_t *arg_hashtable_create(unsigned int minsize, + unsigned int (*hashfn)(const void *), + int (*eqfn)(const void *, const void *)) { + arg_hashtable_t *h; + unsigned int pindex; + unsigned int size = primes[0]; + + /* Check requested hash table isn't too large */ + if (minsize > (1u << 30)) { + return NULL; + } + + /* + * Enforce size as prime. The reason is to avoid clustering of values + * into a small number of buckets (yes, distribution). A more even + * distributed hash table will perform more consistently. + */ + for (pindex = 0; pindex < prime_table_length; pindex++) { + if (primes[pindex] > minsize) { + size = primes[pindex]; + break; + } + } + + h = (arg_hashtable_t *)xmalloc(sizeof(arg_hashtable_t)); + h->table = (struct arg_hashtable_entry **)xmalloc(sizeof(struct arg_hashtable_entry *) * size); + memset(h->table, 0, size * sizeof(struct arg_hashtable_entry *)); + h->tablelength = size; + h->primeindex = pindex; + h->entrycount = 0; + h->hashfn = hashfn; + h->eqfn = eqfn; + h->loadlimit = (unsigned int)ceil(size * (double)max_load_factor); + return h; +} + +static int arg_hashtable_expand(arg_hashtable_t *h) { + /* Double the size of the table to accommodate more entries */ + struct arg_hashtable_entry **newtable; + struct arg_hashtable_entry *e; + unsigned int newsize; + unsigned int i; + unsigned int index; + + /* Check we're not hitting max capacity */ + if (h->primeindex == (prime_table_length - 1)) { + return 0; + } + newsize = primes[++(h->primeindex)]; + + newtable = (struct arg_hashtable_entry **)xmalloc(sizeof(struct arg_hashtable_entry *) * newsize); + memset(newtable, 0, newsize * sizeof(struct arg_hashtable_entry *)); + /* + * This algorithm is not 'stable': it reverses the list + * when it transfers entries between the tables + */ + for (i = 0; i < h->tablelength; i++) { + while (NULL != (e = h->table[i])) { + h->table[i] = e->next; + index = index_for(newsize, e->h); + e->next = newtable[index]; + newtable[index] = e; + } + } + + xfree(h->table); + h->table = newtable; + h->tablelength = newsize; + h->loadlimit = (unsigned int)ceil(newsize * (double)max_load_factor); + return -1; +} + +unsigned int arg_hashtable_count(arg_hashtable_t *h) { + return h->entrycount; +} + +void arg_hashtable_insert(arg_hashtable_t *h, void *k, void *v) { + /* This method allows duplicate keys - but they shouldn't be used */ + unsigned int index; + struct arg_hashtable_entry *e; + if ((h->entrycount + 1) > h->loadlimit) { + /* + * Ignore the return value. If expand fails, we should + * still try cramming just this value into the existing table + * -- we may not have memory for a larger table, but one more + * element may be ok. Next time we insert, we'll try expanding again. + */ + arg_hashtable_expand(h); + } + e = (struct arg_hashtable_entry *)xmalloc(sizeof(struct arg_hashtable_entry)); + e->h = enhanced_hash(h, k); + index = index_for(h->tablelength, e->h); + e->k = k; + e->v = v; + e->next = h->table[index]; + h->table[index] = e; + h->entrycount++; +} + +void *arg_hashtable_search(arg_hashtable_t *h, const void *k) { + struct arg_hashtable_entry *e; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + e = h->table[index]; + while (e != NULL) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + return e->v; + } + e = e->next; + } + return NULL; +} + +void arg_hashtable_remove(arg_hashtable_t *h, const void *k) { + /* + * TODO: consider compacting the table when the load factor drops enough, + * or provide a 'compact' method. + */ + + struct arg_hashtable_entry *e; + struct arg_hashtable_entry **pE; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + pE = &(h->table[index]); + e = *pE; + while (NULL != e) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + *pE = e->next; + h->entrycount--; + xfree(e->k); + xfree(e->v); + xfree(e); + return; + } + pE = &(e->next); + e = e->next; + } +} + +void arg_hashtable_destroy(arg_hashtable_t *h, int free_values) { + unsigned int i; + struct arg_hashtable_entry *e, *f; + struct arg_hashtable_entry **table = h->table; + if (free_values) { + for (i = 0; i < h->tablelength; i++) { + e = table[i]; + while (NULL != e) { + f = e; + e = e->next; + xfree(f->k); + xfree(f->v); + xfree(f); + } + } + } else { + for (i = 0; i < h->tablelength; i++) { + e = table[i]; + while (NULL != e) { + f = e; + e = e->next; + xfree(f->k); + xfree(f); + } + } + } + xfree(h->table); + xfree(h); +} + +arg_hashtable_itr_t *arg_hashtable_itr_create(arg_hashtable_t *h) { + unsigned int i; + unsigned int tablelength; + + arg_hashtable_itr_t *itr = (arg_hashtable_itr_t *)xmalloc(sizeof(arg_hashtable_itr_t)); + itr->h = h; + itr->e = NULL; + itr->parent = NULL; + tablelength = h->tablelength; + itr->index = tablelength; + if (0 == h->entrycount) { + return itr; + } + + for (i = 0; i < tablelength; i++) { + if (h->table[i] != NULL) { + itr->e = h->table[i]; + itr->index = i; + break; + } + } + return itr; +} + +void arg_hashtable_itr_destroy(arg_hashtable_itr_t *itr) { + xfree(itr); +} + +void *arg_hashtable_itr_key(arg_hashtable_itr_t *i) { + return i->e->k; +} + +void *arg_hashtable_itr_value(arg_hashtable_itr_t *i) { + return i->e->v; +} + +int arg_hashtable_itr_advance(arg_hashtable_itr_t *itr) { + unsigned int j; + unsigned int tablelength; + struct arg_hashtable_entry **table; + struct arg_hashtable_entry *next; + + if (itr->e == NULL) { + return 0; /* stupidity check */ + } + + next = itr->e->next; + if (NULL != next) { + itr->parent = itr->e; + itr->e = next; + return -1; + } + + tablelength = itr->h->tablelength; + itr->parent = NULL; + if (tablelength <= (j = ++(itr->index))) { + itr->e = NULL; + return 0; + } + + table = itr->h->table; + while (NULL == (next = table[j])) { + if (++j >= tablelength) { + itr->index = tablelength; + itr->e = NULL; + return 0; + } + } + + itr->index = j; + itr->e = next; + return -1; +} + +int arg_hashtable_itr_remove(arg_hashtable_itr_t *itr) { + struct arg_hashtable_entry *remember_e; + struct arg_hashtable_entry *remember_parent; + int ret; + + /* Do the removal */ + if ((itr->parent) == NULL) { + /* element is head of a chain */ + itr->h->table[itr->index] = itr->e->next; + } else { + /* element is mid-chain */ + itr->parent->next = itr->e->next; + } + /* itr->e is now outside the hashtable */ + remember_e = itr->e; + itr->h->entrycount--; + xfree(remember_e->k); + xfree(remember_e->v); + + /* Advance the iterator, correcting the parent */ + remember_parent = itr->parent; + ret = arg_hashtable_itr_advance(itr); + if (itr->parent == remember_e) { + itr->parent = remember_parent; + } + xfree(remember_e); + return ret; +} + +int arg_hashtable_itr_search(arg_hashtable_itr_t *itr, arg_hashtable_t *h, void *k) { + struct arg_hashtable_entry *e; + struct arg_hashtable_entry *parent; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + + e = h->table[index]; + parent = NULL; + while (e != NULL) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + itr->index = index; + itr->e = e; + itr->parent = parent; + itr->h = h; + return -1; + } + parent = e; + e = e->next; + } + return 0; +} + +int arg_hashtable_change(arg_hashtable_t *h, void *k, void *v) { + struct arg_hashtable_entry *e; + unsigned int hashvalue; + unsigned int index; + + hashvalue = enhanced_hash(h, k); + index = index_for(h->tablelength, hashvalue); + e = h->table[index]; + while (e != NULL) { + /* Check hash value to short circuit heavier comparison */ + if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { + xfree(e->v); + e->v = v; + return -1; + } + e = e->next; + } + return 0; +} + +/******************************************************************************* + * arg_dstr: Implements the dynamic string utilities + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif + +#define START_VSNBUFF 16 + +/* + * This dynamic string module is adapted from TclResult.c in the Tcl library. + * Here is the copyright notice from the library: + * + * This software is copyrighted by the Regents of the University of + * California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState + * Corporation and other parties. The following terms apply to all files + * associated with the software unless explicitly disclaimed in + * individual files. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + * + * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY + * DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE + * IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE + * NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS. + * + * GOVERNMENT USE: If you are acquiring this software on behalf of the + * U.S. government, the Government shall have only "Restricted Rights" + * in the software and related documentation as defined in the Federal + * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you + * are acquiring the software on behalf of the Department of Defense, the + * software shall be classified as "Commercial Computer Software" and the + * Government shall have only "Restricted Rights" as defined in Clause + * 252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the + * authors grant the U.S. Government and others acting in its behalf + * permission to use and distribute the software in accordance with the + * terms specified in this license. + */ + +typedef struct _internal_arg_dstr { + char *data; + arg_dstr_freefn *free_proc; + char sbuf[ARG_DSTR_SIZE + 1]; + char *append_data; + int append_data_size; + int append_used; +} _internal_arg_dstr_t; + +static void setup_append_buf(arg_dstr_t res, int newSpace); + +arg_dstr_t arg_dstr_create(void) { + _internal_arg_dstr_t *h = (_internal_arg_dstr_t *)xmalloc(sizeof(_internal_arg_dstr_t)); + memset(h, 0, sizeof(_internal_arg_dstr_t)); + h->sbuf[0] = 0; + h->data = h->sbuf; + h->free_proc = ARG_DSTR_STATIC; + return h; +} + +void arg_dstr_destroy(arg_dstr_t ds) { + if (ds == NULL) { + return; + } + + arg_dstr_reset(ds); + xfree(ds); + return; +} + +void arg_dstr_set(arg_dstr_t ds, char *str, arg_dstr_freefn *free_proc) { + int length; + register arg_dstr_freefn *old_free_proc = ds->free_proc; + char *old_result = ds->data; + + if (str == NULL) { + ds->sbuf[0] = 0; + ds->data = ds->sbuf; + ds->free_proc = ARG_DSTR_STATIC; + } else if (free_proc == ARG_DSTR_VOLATILE) { + length = (int)strlen(str); + if (length > ARG_DSTR_SIZE) { + ds->data = (char *)xmalloc((unsigned)length + 1); + ds->free_proc = ARG_DSTR_DYNAMIC; + } else { + ds->data = ds->sbuf; + ds->free_proc = ARG_DSTR_STATIC; + } + strcpy(ds->data, str); + } else { + ds->data = str; + ds->free_proc = free_proc; + } + + /* + * If the old result was dynamically-allocated, free it up. Do it here, + * rather than at the beginning, in case the new result value was part of + * the old result value. + */ + + if ((old_free_proc != 0) && (old_result != ds->data)) { + if (old_free_proc == ARG_DSTR_DYNAMIC) { + xfree(old_result); + } else { + (*old_free_proc)(old_result); + } + } + + if ((ds->append_data != NULL) && (ds->append_data_size > 0)) { + xfree(ds->append_data); + ds->append_data = NULL; + ds->append_data_size = 0; + } +} + +char *arg_dstr_cstr(arg_dstr_t ds) /* Interpreter whose result to return. */ +{ + return ds->data; +} + +void arg_dstr_cat(arg_dstr_t ds, const char *str) { + setup_append_buf(ds, (int)strlen(str) + 1); + memcpy(ds->data + strlen(ds->data), str, strlen(str)); +} + +void arg_dstr_catc(arg_dstr_t ds, char c) { + setup_append_buf(ds, 2); + memcpy(ds->data + strlen(ds->data), &c, 1); +} + +/* + * The logic of the `arg_dstr_catf` function is adapted from the `bformat` + * function in The Better String Library by Paul Hsieh. Here is the copyright + * notice from the library: + * + * Copyright (c) 2014, Paul Hsieh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of bstrlib nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +void arg_dstr_catf(arg_dstr_t ds, const char *fmt, ...) { + va_list arglist; + char *buff; + int n, r; + size_t slen; + + if (fmt == NULL) { + return; + } + + /* Since the length is not determinable beforehand, a search is + performed using the truncating "vsnprintf" call (to avoid buffer + overflows) on increasing potential sizes for the output result. */ + + if ((n = (int)(2 * strlen(fmt))) < START_VSNBUFF) { + n = START_VSNBUFF; + } + + buff = (char *)xmalloc((size_t)(n + 2)); + memset(buff, 0, (size_t)(n + 2)); + + for (;;) { + va_start(arglist, fmt); + r = vsnprintf(buff, (size_t)(n + 1), fmt, arglist); + va_end(arglist); + + slen = strlen(buff); + if (slen < (size_t)n) { + break; + } + + if (r > n) { + n = r; + } else { + n += n; + } + + xfree(buff); + buff = (char *)xmalloc((size_t)(n + 2)); + memset(buff, 0, (size_t)(n + 2)); + } + + arg_dstr_cat(ds, buff); + xfree(buff); +} + +static void setup_append_buf(arg_dstr_t ds, int new_space) { + int total_space; + + /* + * Make the append buffer larger, if that's necessary, then copy the + * data into the append buffer and make the append buffer the official + * data. + */ + if (ds->data != ds->append_data) { + /* + * If the buffer is too big, then free it up so we go back to a + * smaller buffer. This avoids tying up memory forever after a large + * operation. + */ + if (ds->append_data_size > 500) { + xfree(ds->append_data); + ds->append_data = NULL; + ds->append_data_size = 0; + } + ds->append_used = (int)strlen(ds->data); + } else if (ds->data[ds->append_used] != 0) { + /* + * Most likely someone has modified a result created by + * arg_dstr_cat et al. so that it has a different size. Just + * recompute the size. + */ + ds->append_used = (int)strlen(ds->data); + } + + total_space = new_space + ds->append_used; + if (total_space >= ds->append_data_size) { + char *newbuf; + + if (total_space < 100) { + total_space = 200; + } else { + total_space *= 2; + } + newbuf = (char *)xmalloc((unsigned)total_space); + memset(newbuf, 0, (size_t)total_space); + strcpy(newbuf, ds->data); + if (ds->append_data != NULL) { + xfree(ds->append_data); + } + ds->append_data = newbuf; + ds->append_data_size = total_space; + } else if (ds->data != ds->append_data) { + strcpy(ds->append_data, ds->data); + } + + arg_dstr_free(ds); + ds->data = ds->append_data; +} + +void arg_dstr_free(arg_dstr_t ds) { + if (ds->free_proc != NULL) { + if (ds->free_proc == ARG_DSTR_DYNAMIC) { + xfree(ds->data); + } else { + (*ds->free_proc)(ds->data); + } + ds->free_proc = NULL; + } +} + +void arg_dstr_reset(arg_dstr_t ds) { + arg_dstr_free(ds); + if ((ds->append_data != NULL) && (ds->append_data_size > 0)) { + xfree(ds->append_data); + ds->append_data = NULL; + ds->append_data_size = 0; + } + + ds->data = ds->sbuf; + ds->sbuf[0] = 0; +} + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif +/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */ +/* $FreeBSD$ */ + +/*- + * SPDX-License-Identifier: BSD-2-Clause-NetBSD + * + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#if ARG_REPLACE_GETOPT == 1 + +#ifndef _GETOPT_H_ +#define _GETOPT_H_ + +/* + * GNU-like getopt_long()/getopt_long_only() with 4.4BSD optreset extension. + * getopt() is declared here too for GNU programs. + */ +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +struct option { + /* name of long option */ + const char *name; + /* + * one of no_argument, required_argument, and optional_argument: + * whether option takes an argument + */ + int has_arg; + /* if not NULL, set *flag to val when option found */ + int *flag; + /* if flag not NULL, value to set *flag to; else return value */ + int val; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int getopt_long(int, char *const *, const char *, const struct option *, int *); +int getopt_long_only(int, char *const *, const char *, const struct option *, int *); +#ifndef _GETOPT_DECLARED +#define _GETOPT_DECLARED +int getopt(int, char *const[], const char *); + +extern char *optarg; /* getopt(3) external variables */ +extern int optind, opterr, optopt; +#endif +#ifndef _OPTRESET_DECLARED +#define _OPTRESET_DECLARED +extern int optreset; /* getopt(3) external variable */ +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !_GETOPT_H_ */ + +#endif /* ARG_REPLACE_GETOPT == 1 */ +/* $OpenBSD: getopt_long.c,v 1.26 2013/06/08 22:47:56 millert Exp $ + */ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ + +/* + * Copyright (c) 2002 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "argtable3.h" + +#if ARG_REPLACE_GETOPT == 1 + +#ifndef ARG_AMALGAMATION +#include "arg_getopt.h" +#endif + +#include +#include +#include + +#define GNU_COMPATIBLE /* Be more compatible, configure's use us! */ + +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +int optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define PRINT_ERROR ((opterr) && (*options != ':')) + +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ + +/* return values */ +#define BADCH (int)'?' +#define BADARG ((*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 + +#define EMSG "" + +#ifdef GNU_COMPATIBLE +#define NO_PREFIX (-1) +#define D_PREFIX 0 +#define DD_PREFIX 1 +#define W_PREFIX 2 +#endif + +static int getopt_internal(int, char *const *, const char *, const struct option *, int *, int); +static int parse_long_options(char *const *, const char *, const struct option *, int *, int, int); +static int gcd(int, int); +static void permute_args(int, int, int, char *const *); + +static char *place = EMSG; /* option letter processing */ + +/* XXX: set optreset to 1 rather than these two */ +static int nonopt_start = -1; /* first non option argument (for permute) */ +static int nonopt_end = -1; /* first option after non options (for permute) */ + +/* Error messages */ +static const char recargchar[] = "option requires an argument -- %c"; +static const char illoptchar[] = "illegal option -- %c"; /* From P1003.2 */ +#ifdef GNU_COMPATIBLE +static int dash_prefix = NO_PREFIX; +static const char gnuoptchar[] = "invalid option -- %c"; + +static const char recargstring[] = "option `%s%s' requires an argument"; +static const char ambig[] = "option `%s%.*s' is ambiguous"; +static const char noarg[] = "option `%s%.*s' doesn't allow an argument"; +static const char illoptstring[] = "unrecognized option `%s%s'"; +#else +static const char recargstring[] = "option requires an argument -- %s"; +static const char ambig[] = "ambiguous option -- %.*s"; +static const char noarg[] = "option doesn't take an argument -- %.*s"; +static const char illoptstring[] = "unknown option -- %s"; +#endif + +#ifdef _WIN32 + +/* + * Windows needs warnx(). We change the definition though: + * 1. (another) global is defined, opterrmsg, which holds the error message + * 2. errors are always printed out on stderr w/o the program name + * Note that opterrmsg always gets set no matter what opterr is set to. The + * error message will not be printed if opterr is 0 as usual. + */ + +#include +#include + +#define MAX_OPTERRMSG_SIZE 128 + +extern char opterrmsg[MAX_OPTERRMSG_SIZE]; +char opterrmsg[MAX_OPTERRMSG_SIZE]; /* buffer for the last error message */ + +static void warnx(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + + /* + * Make sure opterrmsg is always zero-terminated despite the _vsnprintf() + * implementation specifics and manually suppress the warning. + */ + memset(opterrmsg, 0, sizeof(opterrmsg)); + if (fmt != NULL) +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + _vsnprintf_s(opterrmsg, sizeof(opterrmsg), sizeof(opterrmsg) - 1, fmt, ap); +#else + _vsnprintf(opterrmsg, sizeof(opterrmsg) - 1, fmt, ap); +#endif + + va_end(ap); + +#ifdef _MSC_VER +#pragma warning(suppress : 6053) +#endif + fprintf(stderr, "%s\n", opterrmsg); +} + +#else +#include +#endif /*_WIN32*/ +/* + * Compute the greatest common divisor of a and b. + */ +static int gcd(int a, int b) { + int c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return (b); +} + +/* + * Exchange the block from nonopt_start to nonopt_end with the block + * from nonopt_end to opt_end (keeping the same order of arguments + * in each block). + */ +static void permute_args(int panonopt_start, int panonopt_end, int opt_end, char *const *nargv) { + int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; + char *swap; + + /* + * compute lengths of blocks and number and size of cycles + */ + nnonopts = panonopt_end - panonopt_start; + nopts = opt_end - panonopt_end; + ncycle = gcd(nnonopts, nopts); + cyclelen = (opt_end - panonopt_start) / ncycle; + + for (i = 0; i < ncycle; i++) { + cstart = panonopt_end + i; + pos = cstart; + for (j = 0; j < cyclelen; j++) { + if (pos >= panonopt_end) { + pos -= nnonopts; + } else { + pos += nopts; + } + swap = nargv[pos]; + /* LINTED const cast */ + ((char **)nargv)[pos] = nargv[cstart]; + /* LINTED const cast */ + ((char **)nargv)[cstart] = swap; + } + } +} + +/* + * parse_long_options -- + * Parse long options in argc/argv argument vector. + * Returns -1 if short_too is set and the option does not match long_options. + */ +static int parse_long_options(char *const *nargv, + const char *options, + const struct option *long_options, + int *idx, + int short_too, + int flags) { + char *current_argv, *has_equal; +#ifdef GNU_COMPATIBLE + char *current_dash; +#endif + size_t current_argv_len; + int i, match, exact_match, second_partial_match; + + current_argv = place; +#ifdef GNU_COMPATIBLE + switch (dash_prefix) { + case D_PREFIX: + current_dash = "-"; + break; + case DD_PREFIX: + current_dash = "--"; + break; + case W_PREFIX: + current_dash = "-W "; + break; + default: + current_dash = ""; + break; + } +#endif + match = -1; + exact_match = 0; + second_partial_match = 0; + + optind++; + + if ((has_equal = strchr(current_argv, '=')) != NULL) { + /* argument found (--option=arg) */ + current_argv_len = (size_t)(has_equal - current_argv); + has_equal++; + } else { + current_argv_len = strlen(current_argv); + } + + for (i = 0; long_options[i].name; i++) { + /* find matching long option */ + if (strncmp(current_argv, long_options[i].name, current_argv_len)) { + continue; + } + + if (strlen(long_options[i].name) == current_argv_len) { + /* exact match */ + match = i; + exact_match = 1; + break; + } + /* + * If this is a known short option, don't allow + * a partial match of a single character. + */ + if (short_too && current_argv_len == 1) { + continue; + } + + if (match == -1) { /* first partial match */ + match = i; + } else if ((flags & FLAG_LONGONLY) || long_options[i].has_arg != long_options[match].has_arg || + long_options[i].flag != long_options[match].flag || long_options[i].val != long_options[match].val) { + second_partial_match = 1; + } + } + if (!exact_match && second_partial_match) { + /* ambiguous abbreviation */ + if (PRINT_ERROR) { + warnx(ambig, +#ifdef GNU_COMPATIBLE + current_dash, +#endif + (int)current_argv_len, + current_argv); + } + optopt = 0; + return (BADCH); + } + if (match != -1) { /* option found */ + if (long_options[match].has_arg == no_argument && has_equal) { + if (PRINT_ERROR) { + warnx(noarg, +#ifdef GNU_COMPATIBLE + current_dash, +#endif + (int)current_argv_len, + current_argv); + } + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) { + optopt = long_options[match].val; + } else { + optopt = 0; + } +#ifdef GNU_COMPATIBLE + return (BADCH); +#else + return (BADARG); +#endif + } + if (long_options[match].has_arg == required_argument || long_options[match].has_arg == optional_argument) { + if (has_equal) { + optarg = has_equal; + } else if (long_options[match].has_arg == required_argument) { + /* + * optional argument doesn't use next nargv + */ + optarg = nargv[optind++]; + } + } + if ((long_options[match].has_arg == required_argument) && (optarg == NULL)) { + /* + * Missing argument; leading ':' indicates no error + * should be generated. + */ + if (PRINT_ERROR) { + warnx(recargstring, +#ifdef GNU_COMPATIBLE + current_dash, +#endif + current_argv); + } + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) { + optopt = long_options[match].val; + } else { + optopt = 0; + } + --optind; + return (BADARG); + } + } else { /* unknown option */ + if (short_too) { + --optind; + return (-1); + } + if (PRINT_ERROR) { + warnx(illoptstring, +#ifdef GNU_COMPATIBLE + current_dash, +#endif + current_argv); + } + optopt = 0; + return (BADCH); + } + if (idx) { + *idx = match; + } + if (long_options[match].flag) { + *long_options[match].flag = long_options[match].val; + return (0); + } else { + return (long_options[match].val); + } +} + +/* + * getopt_internal -- + * Parse argc/argv argument vector. Called by user level routines. + */ +static int getopt_internal(int nargc, + char *const *nargv, + const char *options, + const struct option *long_options, + int *idx, + int flags) { + char *oli; /* option letter list index */ + int optchar, short_too; + static int posixly_correct = -1; + + if (options == NULL) { + return (-1); + } + + /* + * XXX Some GNU programs (like cvs) set optind to 0 instead of + * XXX using optreset. Work around this braindamage. + */ + if (optind == 0) { + optind = optreset = 1; + } + + /* + * Disable GNU extensions if POSIXLY_CORRECT is set or options + * string begins with a '+'. + */ + if (posixly_correct == -1 || optreset) { +#if defined(_WIN32) && \ + ((defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__))) + size_t requiredSize; + getenv_s(&requiredSize, NULL, 0, "POSIXLY_CORRECT"); + posixly_correct = requiredSize != 0; +#else + posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); +#endif + } + + if (*options == '-') { + flags |= FLAG_ALLARGS; + } else if (posixly_correct || *options == '+') { + flags &= ~FLAG_PERMUTE; + } + if (*options == '+' || *options == '-') { + options++; + } + + optarg = NULL; + if (optreset) { + nonopt_start = nonopt_end = -1; + } +start: + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc) { /* end of argument vector */ + place = EMSG; + if (nonopt_end != -1) { + /* do permutation, if we have to */ + permute_args(nonopt_start, nonopt_end, optind, nargv); + optind -= nonopt_end - nonopt_start; + } else if (nonopt_start != -1) { + /* + * If we skipped non-options, set optind + * to the first of them. + */ + optind = nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + if (*(place = nargv[optind]) != '-' || +#ifdef GNU_COMPATIBLE + place[1] == '\0') { +#else + (place[1] == '\0' && strchr(options, '-') == NULL)) { +#endif + place = EMSG; /* found non-option */ + if (flags & FLAG_ALLARGS) { + /* + * GNU extension: + * return non-option as argument to option 1 + */ + optarg = nargv[optind++]; + return (INORDER); + } + if (!(flags & FLAG_PERMUTE)) { + /* + * If no permutation wanted, stop parsing + * at first non-option. + */ + return (-1); + } + /* do permutation */ + if (nonopt_start == -1) { + nonopt_start = optind; + } else if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, optind, nargv); + nonopt_start = optind - (nonopt_end - nonopt_start); + nonopt_end = -1; + } + optind++; + /* process next argument */ + goto start; + } + if (nonopt_start != -1 && nonopt_end == -1) { + nonopt_end = optind; + } + + /* + * If we have "-" do nothing, if "--" we are done. + */ + if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { + optind++; + place = EMSG; + /* + * We found an option (--), so if we skipped + * non-options, we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, optind, nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + } + + /* + * Check long options if: + * 1) we were passed some + * 2) the arg is not just "-" + * 3) either the arg starts with -- we are getopt_long_only() + */ + if (long_options != NULL && place != nargv[optind] && (*place == '-' || (flags & FLAG_LONGONLY))) { + short_too = 0; +#ifdef GNU_COMPATIBLE + dash_prefix = D_PREFIX; +#endif + if (*place == '-') { + place++; /* --foo long option */ + if (*place == '\0') { + return (BADARG); /* malformed option */ + } +#ifdef GNU_COMPATIBLE + dash_prefix = DD_PREFIX; +#endif + } else if (*place != ':' && strchr(options, *place) != NULL) { + short_too = 1; /* could be short option too */ + } + + optchar = parse_long_options(nargv, options, long_options, idx, short_too, flags); + if (optchar != -1) { + place = EMSG; + return (optchar); + } + } + + if ((optchar = (int)*place++) == (int)':' || (optchar == (int)'-' && *place != '\0') || + (oli = strchr(options, optchar)) == NULL) { + /* + * If the user specified "-" and '-' isn't listed in + * options, return -1 (non-option) as per POSIX. + * Otherwise, it is an unknown option character (or ':'). + */ + if (optchar == (int)'-' && *place == '\0') { + return (-1); + } + if (!*place) { + ++optind; + } +#ifdef GNU_COMPATIBLE + if (PRINT_ERROR) { + warnx(posixly_correct ? illoptchar : gnuoptchar, optchar); + } +#else + if (PRINT_ERROR) { + warnx(illoptchar, optchar); + } +#endif + optopt = optchar; + return (BADCH); + } + if (long_options != NULL && optchar == 'W' && oli[1] == ';') { + /* -W long-option */ + if (*place) /* no space */ + /* NOTHING */; + else if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) { + warnx(recargchar, optchar); + } + optopt = optchar; + return (BADARG); + } else { /* white space */ + place = nargv[optind]; + } +#ifdef GNU_COMPATIBLE + dash_prefix = W_PREFIX; +#endif + optchar = parse_long_options(nargv, options, long_options, idx, 0, flags); + place = EMSG; + return (optchar); + } + if (*++oli != ':') { /* doesn't take argument */ + if (!*place) { + ++optind; + } + } else { /* takes (optional) argument */ + optarg = NULL; + if (*place) { /* no white space */ + optarg = place; + } else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) { + warnx(recargchar, optchar); + } + optopt = optchar; + return (BADARG); + } else { + optarg = nargv[optind]; + } + } + place = EMSG; + ++optind; + } + /* dump back option letter */ + return (optchar); +} + +/* + * getopt -- + * Parse argc/argv argument vector. + * + * [eventually this will replace the BSD getopt] + */ +int getopt(int nargc, char *const *nargv, const char *options) { + + /* + * We don't pass FLAG_PERMUTE to getopt_internal() since + * the BSD getopt(3) (unlike GNU) has never done this. + * + * Furthermore, since many privileged programs call getopt() + * before dropping privileges it makes sense to keep things + * as simple (and bug-free) as possible. + */ + return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); +} + +/* + * getopt_long -- + * Parse argc/argv argument vector. + */ +int getopt_long(int nargc, char *const *nargv, const char *options, const struct option *long_options, int *idx) { + + return (getopt_internal(nargc, nargv, options, long_options, idx, FLAG_PERMUTE)); +} + +/* + * getopt_long_only -- + * Parse argc/argv argument vector. + */ +int getopt_long_only(int nargc, char *const *nargv, const char *options, const struct option *long_options, int *idx) { + + return (getopt_internal(nargc, nargv, options, long_options, idx, FLAG_PERMUTE | FLAG_LONGONLY)); +} + +#endif /* ARG_REPLACE_GETOPT == 1 */ +/******************************************************************************* + * arg_date: Implements the date command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include + +char *arg_strptime(const char *buf, const char *fmt, struct tm *tm); + +static void arg_date_resetfn(struct arg_date *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +static int arg_date_scanfn(struct arg_date *parent, const char *argval) { + int errorcode = 0; + + if (parent->count == parent->hdr.maxcount) { + errorcode = ARG_ERR_MAXCOUNT; + } else if (!argval) { + /* no argument value was given, leave parent->tmval[] unaltered but still + * count it */ + parent->count++; + } else { + const char *pend; + struct tm tm = parent->tmval[parent->count]; + + /* parse the given argument value, store result in parent->tmval[] */ + pend = arg_strptime(argval, parent->format, &tm); + if (pend && pend[0] == '\0') { + parent->tmval[parent->count++] = tm; + } else { + errorcode = ARG_ERR_BADDATE; + } + } + + ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static int arg_date_checkfn(struct arg_date *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + + ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static void arg_date_errorfn(struct arg_date *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + /* make argval NULL safe */ + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + + case ARG_ERR_BADDATE: { + struct tm tm; + char buff[200]; + + arg_dstr_catf(ds, "illegal timestamp format \"%s\"\n", argval); + memset(&tm, 0, sizeof(tm)); + arg_strptime("1999-12-31 23:59:59", "%F %H:%M:%S", &tm); + strftime(buff, sizeof(buff), parent->format, &tm); + arg_dstr_catf(ds, "correct format is \"%s\"\n", buff); + break; + } + } +} + +struct arg_date *arg_date0(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary) { + return arg_daten(shortopts, longopts, format, datatype, 0, 1, glossary); +} + +struct arg_date *arg_date1(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary) { + return arg_daten(shortopts, longopts, format, datatype, 1, 1, glossary); +} + +struct arg_date *arg_daten(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { + size_t nbytes; + struct arg_date *result; + + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + /* default time format is the national date format for the locale */ + if (!format) { + format = "%x"; + } + + nbytes = sizeof(struct arg_date) /* storage for struct arg_date */ + + (size_t)maxcount * sizeof(struct tm); /* storage for tmval[maxcount] array */ + + /* allocate storage for the arg_date struct + tmval[] array. */ + /* we use calloc because we want the tmval[] array zero filled. */ + result = (struct arg_date *)xcalloc(1, nbytes); + + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : format; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_date_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_date_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_date_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_date_errorfn; + + /* store the tmval[maxcount] array immediately after the arg_date struct */ + result->tmval = (struct tm *)(result + 1); + + /* init the remaining arg_date member variables */ + result->count = 0; + result->format = format; + + ARG_TRACE(("arg_daten() returns %p\n", result)); + return result; +} + +/*- + * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code was contributed to The NetBSD Foundation by Klaus Klein. + * Heavily optimised by David Laight + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +/* + * We do not implement alternate representations. However, we always + * check whether a given modifier is allowed for a certain conversion. + */ +#define ALT_E 0x01 +#define ALT_O 0x02 +#define LEGAL_ALT(x) \ + { \ + if (alt_format & ~(x)) \ + return (0); \ + } +#define TM_YEAR_BASE (1900) + +static int conv_num(const char **, int *, int, int); + +static const char *day[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + +static const char *abday[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; + +static const char *mon[12] = {"January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"}; + +static const char *abmon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + +static const char *am_pm[2] = {"AM", "PM"}; + +static int arg_strcasecmp(const char *s1, const char *s2) { + const unsigned char *us1 = (const unsigned char *)s1; + const unsigned char *us2 = (const unsigned char *)s2; + while (tolower(*us1) == tolower(*us2++)) { + if (*us1++ == '\0') { + return 0; + } + } + + return tolower(*us1) - tolower(*--us2); +} + +static int arg_strncasecmp(const char *s1, const char *s2, size_t n) { + if (n != 0) { + const unsigned char *us1 = (const unsigned char *)s1; + const unsigned char *us2 = (const unsigned char *)s2; + do { + if (tolower(*us1) != tolower(*us2++)) { + return tolower(*us1) - tolower(*--us2); + } + + if (*us1++ == '\0') { + break; + } + } while (--n != 0); + } + + return 0; +} + +char *arg_strptime(const char *buf, const char *fmt, struct tm *tm) { + char c; + const char *bp; + size_t len = 0; + int alt_format, i, split_year = 0; + + bp = buf; + + while ((c = *fmt) != '\0') { + /* Clear `alternate' modifier prior to new conversion. */ + alt_format = 0; + + /* Eat up white-space. */ + if (isspace(c)) { + while (isspace((int)(*bp))) { + bp++; + } + + fmt++; + continue; + } + + if ((c = *fmt++) != '%') { + goto literal; + } + + again: + switch (c = *fmt++) { + case '%': /* "%%" is converted to "%". */ + literal: + if (c != *bp++) { + return (0); + } + break; + + /* + * "Alternative" modifiers. Just set the appropriate flag + * and start over again. + */ + case 'E': /* "%E?" alternative conversion modifier. */ + LEGAL_ALT(0); + alt_format |= ALT_E; + goto again; + + case 'O': /* "%O?" alternative conversion modifier. */ + LEGAL_ALT(0); + alt_format |= ALT_O; + goto again; + + /* + * "Complex" conversion rules, implemented through recursion. + */ + case 'c': /* Date and time, using the locale's format. */ + LEGAL_ALT(ALT_E); + bp = arg_strptime(bp, "%x %X", tm); + if (!bp) { + return (0); + } + break; + + case 'D': /* The date as "%m/%d/%y". */ + LEGAL_ALT(0); + bp = arg_strptime(bp, "%m/%d/%y", tm); + if (!bp) { + return (0); + } + break; + + case 'R': /* The time as "%H:%M". */ + LEGAL_ALT(0); + bp = arg_strptime(bp, "%H:%M", tm); + if (!bp) { + return (0); + } + break; + + case 'r': /* The time in 12-hour clock representation. */ + LEGAL_ALT(0); + bp = arg_strptime(bp, "%I:%M:%S %p", tm); + if (!bp) { + return (0); + } + break; + + case 'T': /* The time as "%H:%M:%S". */ + LEGAL_ALT(0); + bp = arg_strptime(bp, "%H:%M:%S", tm); + if (!bp) { + return (0); + } + break; + + case 'X': /* The time, using the locale's format. */ + LEGAL_ALT(ALT_E); + bp = arg_strptime(bp, "%H:%M:%S", tm); + if (!bp) { + return (0); + } + break; + + case 'x': /* The date, using the locale's format. */ + LEGAL_ALT(ALT_E); + bp = arg_strptime(bp, "%m/%d/%y", tm); + if (!bp) { + return (0); + } + break; + + /* + * "Elementary" conversion rules. + */ + case 'A': /* The day of week, using the locale's form. */ + case 'a': + LEGAL_ALT(0); + for (i = 0; i < 7; i++) { + /* Full name. */ + len = strlen(day[i]); + if (arg_strncasecmp(day[i], bp, len) == 0) { + break; + } + + /* Abbreviated name. */ + len = strlen(abday[i]); + if (arg_strncasecmp(abday[i], bp, len) == 0) { + break; + } + } + + /* Nothing matched. */ + if (i == 7) { + return (0); + } + + tm->tm_wday = i; + bp += len; + break; + + case 'B': /* The month, using the locale's form. */ + case 'b': + case 'h': + LEGAL_ALT(0); + for (i = 0; i < 12; i++) { + /* Full name. */ + len = strlen(mon[i]); + if (arg_strncasecmp(mon[i], bp, len) == 0) { + break; + } + + /* Abbreviated name. */ + len = strlen(abmon[i]); + if (arg_strncasecmp(abmon[i], bp, len) == 0) { + break; + } + } + + /* Nothing matched. */ + if (i == 12) { + return (0); + } + + tm->tm_mon = i; + bp += len; + break; + + case 'C': /* The century number. */ + LEGAL_ALT(ALT_E); + if (!(conv_num(&bp, &i, 0, 99))) { + return (0); + } + + if (split_year) { + tm->tm_year = (tm->tm_year % 100) + (i * 100); + } else { + tm->tm_year = i * 100; + split_year = 1; + } + break; + + case 'd': /* The day of month. */ + case 'e': + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &tm->tm_mday, 1, 31))) { + return (0); + } + break; + + case 'k': /* The hour (24-hour clock representation). */ + LEGAL_ALT(0); + /* FALLTHROUGH */ + case 'H': + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &tm->tm_hour, 0, 23))) { + return (0); + } + break; + + case 'l': /* The hour (12-hour clock representation). */ + LEGAL_ALT(0); + /* FALLTHROUGH */ + case 'I': + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &tm->tm_hour, 1, 12))) { + return (0); + } + if (tm->tm_hour == 12) { + tm->tm_hour = 0; + } + break; + + case 'j': /* The day of year. */ + LEGAL_ALT(0); + if (!(conv_num(&bp, &i, 1, 366))) { + return (0); + } + tm->tm_yday = i - 1; + break; + + case 'M': /* The minute. */ + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &tm->tm_min, 0, 59))) { + return (0); + } + break; + + case 'm': /* The month. */ + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &i, 1, 12))) { + return (0); + } + tm->tm_mon = i - 1; + break; + + case 'p': /* The locale's equivalent of AM/PM. */ + LEGAL_ALT(0); + /* AM? */ + if (arg_strcasecmp(am_pm[0], bp) == 0) { + if (tm->tm_hour > 11) { + return (0); + } + + bp += strlen(am_pm[0]); + break; + } + /* PM? */ + else if (arg_strcasecmp(am_pm[1], bp) == 0) { + if (tm->tm_hour > 11) { + return (0); + } + + tm->tm_hour += 12; + bp += strlen(am_pm[1]); + break; + } + + /* Nothing matched. */ + return (0); + + case 'S': /* The seconds. */ + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &tm->tm_sec, 0, 61))) { + return (0); + } + break; + + case 'U': /* The week of year, beginning on sunday. */ + case 'W': /* The week of year, beginning on monday. */ + LEGAL_ALT(ALT_O); + /* + * XXX This is bogus, as we can not assume any valid + * information present in the tm structure at this + * point to calculate a real value, so just check the + * range for now. + */ + if (!(conv_num(&bp, &i, 0, 53))) { + return (0); + } + break; + + case 'w': /* The day of week, beginning on sunday. */ + LEGAL_ALT(ALT_O); + if (!(conv_num(&bp, &tm->tm_wday, 0, 6))) { + return (0); + } + break; + + case 'Y': /* The year. */ + LEGAL_ALT(ALT_E); + if (!(conv_num(&bp, &i, 0, 9999))) { + return (0); + } + + tm->tm_year = i - TM_YEAR_BASE; + break; + + case 'y': /* The year within 100 years of the epoch. */ + LEGAL_ALT(ALT_E | ALT_O); + if (!(conv_num(&bp, &i, 0, 99))) { + return (0); + } + + if (split_year) { + tm->tm_year = ((tm->tm_year / 100) * 100) + i; + break; + } + split_year = 1; + if (i <= 68) { + tm->tm_year = i + 2000 - TM_YEAR_BASE; + } else { + tm->tm_year = i + 1900 - TM_YEAR_BASE; + } + break; + + /* + * Miscellaneous conversions. + */ + case 'n': /* Any kind of white-space. */ + case 't': + LEGAL_ALT(0); + while (isspace((int)(*bp))) { + bp++; + } + break; + + default: /* Unknown/unsupported conversion. */ + return (0); + } + } + + /* LINTED functional specification */ + return ((char *)bp); +} + +static int conv_num(const char **buf, int *dest, int llim, int ulim) { + int result = 0; + + /* The limit also determines the number of valid digits. */ + int rulim = ulim; + + if (**buf < '0' || **buf > '9') { + return (0); + } + + do { + result *= 10; + result += *(*buf)++ - '0'; + rulim /= 10; + } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= '9'); + + if (result < llim || result > ulim) { + return (0); + } + + *dest = result; + return (1); +} + +/******************************************************************************* + * arg_dbl: Implements the double command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include + +static void arg_dbl_resetfn(struct arg_dbl *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +static int arg_dbl_scanfn(struct arg_dbl *parent, const char *argval) { + int errorcode = 0; + + if (parent->count == parent->hdr.maxcount) { + /* maximum number of arguments exceeded */ + errorcode = ARG_ERR_MAXCOUNT; + } else if (!argval) { + /* a valid argument with no argument value was given. */ + /* This happens when an optional argument value was invoked. */ + /* leave parent argument value unaltered but still count the argument. */ + parent->count++; + } else { + double val; + char *end; + + /* extract double from argval into val */ + val = strtod(argval, &end); + + /* if success then store result in parent->dval[] array otherwise return + * error*/ + if (*end == 0) { + parent->dval[parent->count++] = val; + } else { + errorcode = ARG_ERR_BADDOUBLE; + } + } + + ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static int arg_dbl_checkfn(struct arg_dbl *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + + ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static void arg_dbl_errorfn(struct arg_dbl *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + /* make argval NULL safe */ + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + + case ARG_ERR_BADDOUBLE: + arg_dstr_catf(ds, "invalid argument \"%s\" to option ", argval); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + } +} + +struct arg_dbl *arg_dbl0(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_dbln(shortopts, longopts, datatype, 0, 1, glossary); +} + +struct arg_dbl *arg_dbl1(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_dbln(shortopts, longopts, datatype, 1, 1, glossary); +} + +struct arg_dbl *arg_dbln(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { + size_t nbytes; + struct arg_dbl *result; + size_t addr; + size_t rem; + + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + nbytes = sizeof(struct arg_dbl) /* storage for struct arg_dbl */ + + (size_t)(maxcount + 1) * sizeof(double); /* storage for dval[maxcount] array plus one + extra for padding to memory boundary */ + + result = (struct arg_dbl *)xmalloc(nbytes); + + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_dbl_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_dbl_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_dbl_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_dbl_errorfn; + + /* Store the dval[maxcount] array on the first double boundary that + * immediately follows the arg_dbl struct. We do the memory alignment + * purely for SPARC and Motorola systems. They require floats and + * doubles to be aligned on natural boundaries. + */ + addr = (size_t)(result + 1); + rem = addr % sizeof(double); + result->dval = (double *)(addr + sizeof(double) - rem); + ARG_TRACE(("addr=%p, dval=%p, sizeof(double)=%d rem=%d\n", addr, result->dval, (int)sizeof(double), (int)rem)); + + result->count = 0; + + ARG_TRACE(("arg_dbln() returns %p\n", result)); + return result; +} + +/******************************************************************************* + * arg_end: Implements the error handling utilities + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include + +static void arg_end_resetfn(struct arg_end *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +static void arg_end_errorfn(void *parent, arg_dstr_t ds, int error, const char *argval, const char *progname) { + /* suppress unreferenced formal parameter warning */ + (void)parent; + + progname = progname ? progname : ""; + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (error) { + case ARG_ELIMIT: + arg_dstr_cat(ds, "too many errors to display"); + break; + case ARG_EMALLOC: + arg_dstr_cat(ds, "insufficient memory"); + break; + case ARG_ENOMATCH: + arg_dstr_catf(ds, "unexpected argument \"%s\"", argval); + break; + case ARG_EMISSARG: + arg_dstr_catf(ds, "option \"%s\" requires an argument", argval); + break; + case ARG_ELONGOPT: + arg_dstr_catf(ds, "invalid option \"%s\"", argval); + break; + default: + arg_dstr_catf(ds, "invalid option \"-%c\"", error); + break; + } + + arg_dstr_cat(ds, "\n"); +} + +struct arg_end *arg_end(int maxcount) { + size_t nbytes; + struct arg_end *result; + + nbytes = sizeof(struct arg_end) + (size_t)maxcount * sizeof(int) /* storage for int error[maxcount] array*/ + + (size_t)maxcount * sizeof(void *) /* storage for void* parent[maxcount] array */ + + (size_t)maxcount * sizeof(char *); /* storage for char* argval[maxcount] array */ + + result = (struct arg_end *)xmalloc(nbytes); + + /* init the arg_hdr struct */ + result->hdr.flag = ARG_TERMINATOR; + result->hdr.shortopts = NULL; + result->hdr.longopts = NULL; + result->hdr.datatype = NULL; + result->hdr.glossary = NULL; + result->hdr.mincount = 1; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_end_resetfn; + result->hdr.scanfn = NULL; + result->hdr.checkfn = NULL; + result->hdr.errorfn = (arg_errorfn *)arg_end_errorfn; + + /* store error[maxcount] array immediately after struct arg_end */ + result->error = (int *)(result + 1); + + /* store parent[maxcount] array immediately after error[] array */ + result->parent = (void **)(result->error + maxcount); + + /* store argval[maxcount] array immediately after parent[] array */ + result->argval = (const char **)(result->parent + maxcount); + + ARG_TRACE(("arg_end(%d) returns %p\n", maxcount, result)); + return result; +} + +void arg_print_errors_ds(arg_dstr_t ds, struct arg_end *end, const char *progname) { + int i; + ARG_TRACE(("arg_errors()\n")); + for (i = 0; i < end->count; i++) { + struct arg_hdr *errorparent = (struct arg_hdr *)(end->parent[i]); + if (errorparent->errorfn) { + errorparent->errorfn(end->parent[i], ds, end->error[i], end->argval[i], progname); + } + } +} + +void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_errors_ds(ds, end, progname); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} + +/******************************************************************************* + * arg_file: Implements the file command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include + +#ifdef WIN32 +#define FILESEPARATOR1 '\\' +#define FILESEPARATOR2 '/' +#else +#define FILESEPARATOR1 '/' +#define FILESEPARATOR2 '/' +#endif + +static void arg_file_resetfn(struct arg_file *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +/* Returns ptr to the base filename within *filename */ +static const char *arg_basename(const char *filename) { + const char *result = NULL, *result1, *result2; + + /* Find the last occurrence of eother file separator character. */ + /* Two alternative file separator chars are supported as legal */ + /* file separators but not both together in the same filename. */ + result1 = (filename ? strrchr(filename, FILESEPARATOR1) : NULL); + result2 = (filename ? strrchr(filename, FILESEPARATOR2) : NULL); + + if (result2) { + result = result2 + 1; /* using FILESEPARATOR2 (the alternative file separator) */ + } + + if (result1) { + result = result1 + 1; /* using FILESEPARATOR1 (the preferred file separator) */ + } + + if (!result) { + result = filename; /* neither file separator was found so basename is the + whole filename */ + } + + /* special cases of "." and ".." are not considered basenames */ + if (result && (strcmp(".", result) == 0 || strcmp("..", result) == 0)) { + result = filename + strlen(filename); + } + + return result; +} + +/* Returns ptr to the file extension within *basename */ +static const char *arg_extension(const char *basename) { + /* find the last occurrence of '.' in basename */ + const char *result = (basename ? strrchr(basename, '.') : NULL); + + /* if no '.' was found then return pointer to end of basename */ + if (basename && !result) { + result = basename + strlen(basename); + } + + /* special case: basenames with a single leading dot (eg ".foo") are not + * considered as true extensions */ + if (basename && result == basename) { + result = basename + strlen(basename); + } + + /* special case: empty extensions (eg "foo.","foo..") are not considered as + * true extensions */ + if (basename && result && strlen(result) == 1) { + result = basename + strlen(basename); + } + + return result; +} + +static int arg_file_scanfn(struct arg_file *parent, const char *argval) { + int errorcode = 0; + + if (parent->count == parent->hdr.maxcount) { + /* maximum number of arguments exceeded */ + errorcode = ARG_ERR_MAXCOUNT; + } else if (!argval) { + /* a valid argument with no argument value was given. */ + /* This happens when an optional argument value was invoked. */ + /* leave parent arguiment value unaltered but still count the argument. */ + parent->count++; + } else { + parent->filename[parent->count] = argval; + parent->basename[parent->count] = arg_basename(argval); + parent->extension[parent->count] = arg_extension( + parent->basename[parent->count]); /* only seek extensions within the + basename (not the file path)*/ + parent->count++; + } + + ARG_TRACE(("%s4:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static int arg_file_checkfn(struct arg_file *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + + ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static void arg_file_errorfn(struct arg_file *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + /* make argval NULL safe */ + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + + default: + arg_dstr_catf(ds, "unknown error at \"%s\"\n", argval); + } +} + +struct arg_file *arg_file0(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_filen(shortopts, longopts, datatype, 0, 1, glossary); +} + +struct arg_file *arg_file1(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_filen(shortopts, longopts, datatype, 1, 1, glossary); +} + +struct arg_file *arg_filen(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { + size_t nbytes; + struct arg_file *result; + int i; + + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + nbytes = sizeof(struct arg_file) /* storage for struct arg_file */ + + sizeof(char *) * (size_t)maxcount /* storage for filename[maxcount] array */ + + sizeof(char *) * (size_t)maxcount /* storage for basename[maxcount] array */ + + sizeof(char *) * (size_t)maxcount; /* storage for extension[maxcount] array */ + + result = (struct arg_file *)xmalloc(nbytes); + + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.glossary = glossary; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_file_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_file_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_file_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_file_errorfn; + + /* store the filename,basename,extension arrays immediately after the arg_file + * struct */ + result->filename = (const char **)(result + 1); + result->basename = result->filename + maxcount; + result->extension = result->basename + maxcount; + result->count = 0; + + /* foolproof the string pointers by initialising them with empty strings */ + for (i = 0; i < maxcount; i++) { + result->filename[i] = ""; + result->basename[i] = ""; + result->extension[i] = ""; + } + + ARG_TRACE(("arg_filen() returns %p\n", result)); + return result; +} + +/******************************************************************************* + * arg_int: Implements the int command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include + +static void arg_int_resetfn(struct arg_int *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +/* strtol0x() is like strtol() except that the numeric string is */ +/* expected to be prefixed by "0X" where X is a user supplied char. */ +/* The string may optionally be prefixed by white space and + or - */ +/* as in +0X123 or -0X123. */ +/* Once the prefix has been scanned, the remainder of the numeric */ +/* string is converted using strtol() with the given base. */ +/* eg: to parse hex str="-0X12324", specify X='X' and base=16. */ +/* eg: to parse oct str="+0o12324", specify X='O' and base=8. */ +/* eg: to parse bin str="-0B01010", specify X='B' and base=2. */ +/* Failure of conversion is indicated by result where *endptr==str. */ +static long int strtol0X(const char *str, const char **endptr, char X, int base) { + long int val; /* stores result */ + int s = 1; /* sign is +1 or -1 */ + const char *ptr = str; /* ptr to current position in str */ + + /* skip leading whitespace */ + while (isspace((int)(*ptr))) { + ptr++; + } + /* printf("1) %s\n",ptr); */ + + /* scan optional sign character */ + switch (*ptr) { + case '+': + ptr++; + s = 1; + break; + case '-': + ptr++; + s = -1; + break; + default: + s = 1; + break; + } + /* printf("2) %s\n",ptr); */ + + /* '0X' prefix */ + if ((*ptr++) != '0') { + /* printf("failed to detect '0'\n"); */ + *endptr = str; + return 0; + } + /* printf("3) %s\n",ptr); */ + if (toupper(*ptr++) != toupper(X)) { + /* printf("failed to detect '%c'\n",X); */ + *endptr = str; + return 0; + } + /* printf("4) %s\n",ptr); */ + + /* attempt conversion on remainder of string using strtol() */ + val = strtol(ptr, (char **)endptr, base); + if (*endptr == ptr) { + /* conversion failed */ + *endptr = str; + return 0; + } + + /* success */ + return s * val; +} + +/* Returns 1 if str matches suffix (case insensitive). */ +/* Str may contain trailing whitespace, but nothing else. */ +static int detectsuffix(const char *str, const char *suffix) { + /* scan pairwise through strings until mismatch detected */ + while (toupper(*str) == toupper(*suffix)) { + /* printf("'%c' '%c'\n", *str, *suffix); */ + + /* return 1 (success) if match persists until the string terminator */ + if (*str == '\0') { + return 1; + } + + /* next chars */ + str++; + suffix++; + } + /* printf("'%c' '%c' mismatch\n", *str, *suffix); */ + + /* return 0 (fail) if the matching did not consume the entire suffix */ + if (*suffix != 0) { + return 0; /* failed to consume entire suffix */ + } + + /* skip any remaining whitespace in str */ + while (isspace((int)(*str))) { + str++; + } + + /* return 1 (success) if we have reached end of str else return 0 (fail) */ + return (*str == '\0') ? 1 : 0; +} + +static int arg_int_scanfn(struct arg_int *parent, const char *argval) { + int errorcode = 0; + + if (parent->count == parent->hdr.maxcount) { + /* maximum number of arguments exceeded */ + errorcode = ARG_ERR_MAXCOUNT; + } else if (!argval) { + /* a valid argument with no argument value was given. */ + /* This happens when an optional argument value was invoked. */ + /* leave parent arguiment value unaltered but still count the argument. */ + parent->count++; + } else { + long int val; + const char *end; + + /* attempt to extract hex integer (eg: +0x123) from argval into val + * conversion */ + val = strtol0X(argval, &end, 'X', 16); + if (end == argval) { + /* hex failed, attempt octal conversion (eg +0o123) */ + val = strtol0X(argval, &end, 'O', 8); + if (end == argval) { + /* octal failed, attempt binary conversion (eg +0B101) */ + val = strtol0X(argval, &end, 'B', 2); + if (end == argval) { + /* binary failed, attempt decimal conversion with no prefix (eg 1234) + */ + val = strtol(argval, (char **)&end, 10); + if (end == argval) { + /* all supported number formats failed */ + return ARG_ERR_BADINT; + } + } + } + } + + /* Safety check for integer overflow. WARNING: this check */ + /* achieves nothing on machines where size(int)==size(long). */ + if (val > INT_MAX || val < INT_MIN) { + errorcode = ARG_ERR_OVERFLOW; + } + + /* Detect any suffixes (KB,MB,GB) and multiply argument value appropriately. + */ + /* We need to be mindful of integer overflows when using such big numbers. + */ + if (detectsuffix(end, "KB")) /* kilobytes */ + { + if (val > (INT_MAX / 1024) || val < (INT_MIN / 1024)) { + errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ + } else { + val *= 1024; /* 1KB = 1024 */ + } + } else if (detectsuffix(end, "MB")) /* megabytes */ + { + if (val > (INT_MAX / 1048576) || val < (INT_MIN / 1048576)) { + errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ + } else { + val *= 1048576; /* 1MB = 1024*1024 */ + } + } else if (detectsuffix(end, "GB")) /* gigabytes */ + { + if (val > (INT_MAX / 1073741824) || val < (INT_MIN / 1073741824)) { + errorcode = ARG_ERR_OVERFLOW; /* Overflow would occur if we proceed */ + } else { + val *= 1073741824; /* 1GB = 1024*1024*1024 */ + } + } else if (!detectsuffix(end, "")) { + errorcode = ARG_ERR_BADINT; /* invalid suffix detected */ + } + + /* if success then store result in parent->ival[] array */ + if (errorcode == 0) { + parent->ival[parent->count++] = (int)val; + } + } + + /* printf("%s:scanfn(%p,%p) returns %d\n",__FILE__,parent,argval,errorcode); + */ + return errorcode; +} + +static int arg_int_checkfn(struct arg_int *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/ + return errorcode; +} + +static void arg_int_errorfn(struct arg_int *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + /* make argval NULL safe */ + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + + case ARG_ERR_BADINT: + arg_dstr_catf(ds, "invalid argument \"%s\" to option ", argval); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_OVERFLOW: + arg_dstr_cat(ds, "integer overflow at option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, " "); + arg_dstr_catf(ds, "(%s is too large)\n", argval); + break; + } +} + +struct arg_int *arg_int0(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_intn(shortopts, longopts, datatype, 0, 1, glossary); +} + +struct arg_int *arg_int1(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_intn(shortopts, longopts, datatype, 1, 1, glossary); +} + +struct arg_int *arg_intn(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { + size_t nbytes; + struct arg_int *result; + + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + nbytes = sizeof(struct arg_int) /* storage for struct arg_int */ + + (size_t)maxcount * sizeof(int); /* storage for ival[maxcount] array */ + + result = (struct arg_int *)xmalloc(nbytes); + + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_int_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_int_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_int_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_int_errorfn; + + /* store the ival[maxcount] array immediately after the arg_int struct */ + result->ival = (int *)(result + 1); + result->count = 0; + + ARG_TRACE(("arg_intn() returns %p\n", result)); + return result; +} + +/******************************************************************************* + * arg_lit: Implements the literature command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include + +static void arg_lit_resetfn(struct arg_lit *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +static int arg_lit_scanfn(struct arg_lit *parent, const char *argval) { + int errorcode = 0; + if (parent->count < parent->hdr.maxcount) { + parent->count++; + } else { + errorcode = ARG_ERR_MAXCOUNT; + } + + ARG_TRACE(("%s:scanfn(%p,%s) returns %d\n", __FILE__, parent, argval, errorcode)); + return errorcode; +} + +static int arg_lit_checkfn(struct arg_lit *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static void arg_lit_errorfn(struct arg_lit *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_catf(ds, "%s: missing option ", progname); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + arg_dstr_cat(ds, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_catf(ds, "%s: extraneous option ", progname); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + } + + ARG_TRACE(("%s:errorfn(%p, %p, %d, %s, %s)\n", __FILE__, parent, ds, errorcode, argval, progname)); +} + +struct arg_lit *arg_lit0(const char *shortopts, const char *longopts, const char *glossary) { + return arg_litn(shortopts, longopts, 0, 1, glossary); +} + +struct arg_lit *arg_lit1(const char *shortopts, const char *longopts, const char *glossary) { + return arg_litn(shortopts, longopts, 1, 1, glossary); +} + +struct arg_lit *arg_litn(const char *shortopts, + const char *longopts, + int mincount, + int maxcount, + const char *glossary) { + struct arg_lit *result; + + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + result = (struct arg_lit *)xmalloc(sizeof(struct arg_lit)); + + /* init the arg_hdr struct */ + result->hdr.flag = 0; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = NULL; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_lit_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_lit_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_lit_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_lit_errorfn; + + /* init local variables */ + result->count = 0; + + ARG_TRACE(("arg_litn() returns %p\n", result)); + return result; +} + +/******************************************************************************* + * arg_rem: Implements the rem command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include + +struct arg_rem *arg_rem(const char *datatype, const char *glossary) { + struct arg_rem *result = (struct arg_rem *)xmalloc(sizeof(struct arg_rem)); + + result->hdr.flag = 0; + result->hdr.shortopts = NULL; + result->hdr.longopts = NULL; + result->hdr.datatype = datatype; + result->hdr.glossary = glossary; + result->hdr.mincount = 1; + result->hdr.maxcount = 1; + result->hdr.parent = result; + result->hdr.resetfn = NULL; + result->hdr.scanfn = NULL; + result->hdr.checkfn = NULL; + result->hdr.errorfn = NULL; + + ARG_TRACE(("arg_rem() returns %p\n", result)); + return result; +} + +/******************************************************************************* + * arg_rex: Implements the regex command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include + +#ifndef _TREX_H_ +#define _TREX_H_ + +/* + * This module uses the T-Rex regular expression library to implement the regex + * logic. Here is the copyright notice of the library: + * + * Copyright (C) 2003-2006 Alberto Demichelis + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be held + * liable for any damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for + * any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; + * you must not claim that you wrote the original software. + * If you use this software in a product, an acknowledgment + * in the product documentation would be appreciated but + * is not required. + * + * 2. Altered source versions must be plainly marked as such, + * and must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any + * source distribution. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define TRexChar char +#define MAX_CHAR 0xFF +#define _TREXC(c) (c) +#define trex_strlen strlen +#define trex_printf printf + +#ifndef TREX_API +#define TREX_API extern +#endif + +#define TRex_True 1 +#define TRex_False 0 + +#define TREX_ICASE ARG_REX_ICASE + +typedef unsigned int TRexBool; +typedef struct TRex TRex; + +typedef struct { + const TRexChar *begin; + int len; +} TRexMatch; + +#if defined(__clang__) +TREX_API TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) __attribute__((optnone)); +#elif defined(__GNUC__) +TREX_API TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) __attribute__((optimize(0))); +#else +TREX_API TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags); +#endif +TREX_API void trex_free(TRex *exp); +TREX_API TRexBool trex_match(TRex *exp, const TRexChar *text); +TREX_API TRexBool trex_search(TRex *exp, const TRexChar *text, const TRexChar **out_begin, const TRexChar **out_end); +TREX_API TRexBool trex_searchrange(TRex *exp, + const TRexChar *text_begin, + const TRexChar *text_end, + const TRexChar **out_begin, + const TRexChar **out_end); +TREX_API int trex_getsubexpcount(TRex *exp); +TREX_API TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp); + +#ifdef __cplusplus +} +#endif + +#endif + +struct privhdr { + const char *pattern; + int flags; +}; + +static void arg_rex_resetfn(struct arg_rex *parent) { + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + parent->count = 0; +} + +static int arg_rex_scanfn(struct arg_rex *parent, const char *argval) { + int errorcode = 0; + const TRexChar *error = NULL; + TRex *rex = NULL; + TRexBool is_match = TRex_False; + + if (parent->count == parent->hdr.maxcount) { + /* maximum number of arguments exceeded */ + errorcode = ARG_ERR_MAXCOUNT; + } else if (!argval) { + /* a valid argument with no argument value was given. */ + /* This happens when an optional argument value was invoked. */ + /* leave parent argument value unaltered but still count the argument. */ + parent->count++; + } else { + struct privhdr *priv = (struct privhdr *)parent->hdr.priv; + + /* test the current argument value for a match with the regular expression + */ + /* if a match is detected, record the argument value in the arg_rex struct + */ + + rex = trex_compile(priv->pattern, &error, priv->flags); + is_match = trex_match(rex, argval); + if (!is_match) { + errorcode = ARG_ERR_REGNOMATCH; + } else { + parent->sval[parent->count++] = argval; + } + + trex_free(rex); + } + + ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static int arg_rex_checkfn(struct arg_rex *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; +#if 0 + struct privhdr *priv = (struct privhdr*)parent->hdr.priv; + + /* free the regex "program" we constructed in resetfn */ + regfree(&(priv->regex)); + + /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/ +#endif + return errorcode; +} + +static void arg_rex_errorfn(struct arg_rex *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + /* make argval NULL safe */ + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + + case ARG_ERR_REGNOMATCH: + arg_dstr_cat(ds, "illegal value "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + + default: { +#if 0 + char errbuff[256]; + regerror(errorcode, NULL, errbuff, sizeof(errbuff)); + printf("%s\n", errbuff); +#endif + } break; + } +} + +struct arg_rex *arg_rex0(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary) { + return arg_rexn(shortopts, longopts, pattern, datatype, 0, 1, flags, glossary); +} + +struct arg_rex *arg_rex1(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary) { + return arg_rexn(shortopts, longopts, pattern, datatype, 1, 1, flags, glossary); +} + +struct arg_rex *arg_rexn(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int mincount, + int maxcount, + int flags, + const char *glossary) { + size_t nbytes; + struct arg_rex *result; + struct privhdr *priv; + int i; + const TRexChar *error = NULL; + TRex *rex = NULL; + + if (!pattern) { + printf("argtable: ERROR - illegal regular expression pattern \"(NULL)\"\n"); + printf("argtable: Bad argument table.\n"); + return NULL; + } + + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + nbytes = sizeof(struct arg_rex) /* storage for struct arg_rex */ + + sizeof(struct privhdr) /* storage for private arg_rex data */ + + (size_t)maxcount * sizeof(char *); /* storage for sval[maxcount] array */ + + /* init the arg_hdr struct */ + result = (struct arg_rex *)xmalloc(nbytes); + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : pattern; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_rex_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_rex_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_rex_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_rex_errorfn; + + /* store the arg_rex_priv struct immediately after the arg_rex struct */ + result->hdr.priv = result + 1; + priv = (struct privhdr *)(result->hdr.priv); + priv->pattern = pattern; + priv->flags = flags; + + /* store the sval[maxcount] array immediately after the arg_rex_priv struct */ + result->sval = (const char **)(priv + 1); + result->count = 0; + + /* foolproof the string pointers by initializing them to reference empty + * strings */ + for (i = 0; i < maxcount; i++) { + result->sval[i] = ""; + } + + /* here we construct and destroy a regex representation of the regular + * expression for no other reason than to force any regex errors to be + * trapped now rather than later. If we don't, then errors may go undetected + * until an argument is actually parsed. + */ + + rex = trex_compile(priv->pattern, &error, priv->flags); + if (rex == NULL) { + ARG_LOG(("argtable: %s \"%s\"\n", error ? error : _TREXC("undefined"), priv->pattern)); + ARG_LOG(("argtable: Bad argument table.\n")); + } + + trex_free(rex); + + ARG_TRACE(("arg_rexn() returns %p\n", result)); + return result; +} + +/* see copyright notice in trex.h */ +#include +#include +#include +#include + +#ifdef _UINCODE +#define scisprint iswprint +#define scstrlen wcslen +#define scprintf wprintf +#define _SC(x) L(x) +#else +#define scisprint isprint +#define scstrlen strlen +#define scprintf printf +#define _SC(x) (x) +#endif + +#ifdef ARG_REX_DEBUG +#include + +static const TRexChar *g_nnames[] = {_SC("NONE"), + _SC("OP_GREEDY"), + _SC("OP_OR"), + _SC("OP_EXPR"), + _SC("OP_NOCAPEXPR"), + _SC("OP_DOT"), + _SC("OP_CLASS"), + _SC("OP_CCLASS"), + _SC("OP_NCLASS"), + _SC("OP_RANGE"), + _SC("OP_CHAR"), + _SC("OP_EOL"), + _SC("OP_BOL"), + _SC("OP_WB")}; + +#endif +#define OP_GREEDY (MAX_CHAR + 1) /* * + ? {n} */ +#define OP_OR (MAX_CHAR + 2) +#define OP_EXPR (MAX_CHAR + 3) /* parentesis () */ +#define OP_NOCAPEXPR (MAX_CHAR + 4) /* parentesis (?:) */ +#define OP_DOT (MAX_CHAR + 5) +#define OP_CLASS (MAX_CHAR + 6) +#define OP_CCLASS (MAX_CHAR + 7) +#define OP_NCLASS (MAX_CHAR + 8) /* negates class the [^ */ +#define OP_RANGE (MAX_CHAR + 9) +#define OP_CHAR (MAX_CHAR + 10) +#define OP_EOL (MAX_CHAR + 11) +#define OP_BOL (MAX_CHAR + 12) +#define OP_WB (MAX_CHAR + 13) + +#define TREX_SYMBOL_ANY_CHAR ('.') +#define TREX_SYMBOL_GREEDY_ONE_OR_MORE ('+') +#define TREX_SYMBOL_GREEDY_ZERO_OR_MORE ('*') +#define TREX_SYMBOL_GREEDY_ZERO_OR_ONE ('?') +#define TREX_SYMBOL_BRANCH ('|') +#define TREX_SYMBOL_END_OF_STRING ('$') +#define TREX_SYMBOL_BEGINNING_OF_STRING ('^') +#define TREX_SYMBOL_ESCAPE_CHAR ('\\') + +typedef int TRexNodeType; + +typedef struct tagTRexNode { + TRexNodeType type; + int left; + int right; + int next; +} TRexNode; + +struct TRex { + const TRexChar *_eol; + const TRexChar *_bol; + const TRexChar *_p; + int _first; + int _op; + TRexNode *_nodes; + int _nallocated; + int _nsize; + int _nsubexpr; + TRexMatch *_matches; + int _currsubexp; + void *_jmpbuf; + const TRexChar **_error; + int _flags; +}; + +static int trex_list(TRex *exp); + +static int trex_newnode(TRex *exp, TRexNodeType type) { + TRexNode n; + int newid; + n.type = type; + n.next = n.right = n.left = -1; + if (type == OP_EXPR) { + n.right = exp->_nsubexpr++; + } + if (exp->_nallocated < (exp->_nsize + 1)) { + exp->_nallocated *= 2; + exp->_nodes = (TRexNode *)xrealloc(exp->_nodes, (size_t)exp->_nallocated * sizeof(TRexNode)); + } + exp->_nodes[exp->_nsize++] = n; + newid = exp->_nsize - 1; + return (int)newid; +} + +static void trex_error(TRex *exp, const TRexChar *error) { + if (exp->_error) { + *exp->_error = error; + } + longjmp(*((jmp_buf *)exp->_jmpbuf), -1); +} + +static void trex_expect(TRex *exp, int n) { + if ((*exp->_p) != n) { + trex_error(exp, _SC("expected paren")); + } + exp->_p++; +} + +static TRexChar trex_escapechar(TRex *exp) { + if (*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) { + exp->_p++; + switch (*exp->_p) { + case 'v': + exp->_p++; + return '\v'; + case 'n': + exp->_p++; + return '\n'; + case 't': + exp->_p++; + return '\t'; + case 'r': + exp->_p++; + return '\r'; + case 'f': + exp->_p++; + return '\f'; + default: + return (*exp->_p++); + } + } else if (!scisprint((int)(*exp->_p))) { + trex_error(exp, _SC("letter expected")); + } + return (*exp->_p++); +} + +static int trex_charclass(TRex *exp, int classid) { + int n = trex_newnode(exp, OP_CCLASS); + exp->_nodes[n].left = classid; + return n; +} + +static int trex_charnode(TRex *exp, TRexBool isclass) { + TRexChar t; + if (*exp->_p == TREX_SYMBOL_ESCAPE_CHAR) { + exp->_p++; + switch (*exp->_p) { + case 'n': + exp->_p++; + return trex_newnode(exp, '\n'); + case 't': + exp->_p++; + return trex_newnode(exp, '\t'); + case 'r': + exp->_p++; + return trex_newnode(exp, '\r'); + case 'f': + exp->_p++; + return trex_newnode(exp, '\f'); + case 'v': + exp->_p++; + return trex_newnode(exp, '\v'); + case 'a': + case 'A': + case 'w': + case 'W': + case 's': + case 'S': + case 'd': + case 'D': + case 'x': + case 'X': + case 'c': + case 'C': + case 'p': + case 'P': + case 'l': + case 'u': { + t = *exp->_p; + exp->_p++; + return trex_charclass(exp, t); + } + case 'b': + case 'B': + if (!isclass) { + int node = trex_newnode(exp, OP_WB); + exp->_nodes[node].left = *exp->_p; + exp->_p++; + return node; + } + /* fall through */ + default: + t = *exp->_p; + exp->_p++; + return trex_newnode(exp, t); + } + } else if (!scisprint((int)(*exp->_p))) { + trex_error(exp, _SC("letter expected")); + } + t = *exp->_p; + exp->_p++; + return trex_newnode(exp, t); +} + +static int trex_class(TRex *exp) { + int ret = -1; + int first = -1, chain; + if (*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) { + ret = trex_newnode(exp, OP_NCLASS); + exp->_p++; + } else { + ret = trex_newnode(exp, OP_CLASS); + } + + if (*exp->_p == ']') { + trex_error(exp, _SC("empty class")); + } + chain = ret; + while (*exp->_p != ']' && exp->_p != exp->_eol) { + if (*exp->_p == '-' && first != -1) { + int r, t; + if (*exp->_p++ == ']') { + trex_error(exp, _SC("unfinished range")); + } + r = trex_newnode(exp, OP_RANGE); + if (first > *exp->_p) { + trex_error(exp, _SC("invalid range")); + } + if (exp->_nodes[first].type == OP_CCLASS) { + trex_error(exp, _SC("cannot use character classes in ranges")); + } + exp->_nodes[r].left = exp->_nodes[first].type; + t = trex_escapechar(exp); + exp->_nodes[r].right = t; + exp->_nodes[chain].next = r; + chain = r; + first = -1; + } else { + if (first != -1) { + int c = first; + exp->_nodes[chain].next = c; + chain = c; + first = trex_charnode(exp, TRex_True); + } else { + first = trex_charnode(exp, TRex_True); + } + } + } + if (first != -1) { + int c = first; + exp->_nodes[chain].next = c; + chain = c; + first = -1; + } + /* hack? */ + exp->_nodes[ret].left = exp->_nodes[ret].next; + exp->_nodes[ret].next = -1; + return ret; +} + +static int trex_parsenumber(TRex *exp) { + int ret = *exp->_p - '0'; + int positions = 10; + exp->_p++; + while (isdigit((int)(*exp->_p))) { + ret = ret * 10 + (*exp->_p++ - '0'); + if (positions == 1000000000) { + trex_error(exp, _SC("overflow in numeric constant")); + } + positions *= 10; + }; + return ret; +} + +static int trex_element(TRex *exp) { + int ret = -1; + switch (*exp->_p) { + case '(': { + int expr, newn; + exp->_p++; + + if (*exp->_p == '?') { + exp->_p++; + trex_expect(exp, ':'); + expr = trex_newnode(exp, OP_NOCAPEXPR); + } else { + expr = trex_newnode(exp, OP_EXPR); + } + newn = trex_list(exp); + exp->_nodes[expr].left = newn; + ret = expr; + trex_expect(exp, ')'); + } break; + case '[': + exp->_p++; + ret = trex_class(exp); + trex_expect(exp, ']'); + break; + case TREX_SYMBOL_END_OF_STRING: + exp->_p++; + ret = trex_newnode(exp, OP_EOL); + break; + case TREX_SYMBOL_ANY_CHAR: + exp->_p++; + ret = trex_newnode(exp, OP_DOT); + break; + default: + ret = trex_charnode(exp, TRex_False); + break; + } + + { + TRexBool isgreedy = TRex_False; + unsigned short p0 = 0, p1 = 0; + switch (*exp->_p) { + case TREX_SYMBOL_GREEDY_ZERO_OR_MORE: + p0 = 0; + p1 = 0xFFFF; + exp->_p++; + isgreedy = TRex_True; + break; + case TREX_SYMBOL_GREEDY_ONE_OR_MORE: + p0 = 1; + p1 = 0xFFFF; + exp->_p++; + isgreedy = TRex_True; + break; + case TREX_SYMBOL_GREEDY_ZERO_OR_ONE: + p0 = 0; + p1 = 1; + exp->_p++; + isgreedy = TRex_True; + break; + case '{': + exp->_p++; + if (!isdigit((int)(*exp->_p))) { + trex_error(exp, _SC("number expected")); + } + p0 = (unsigned short)trex_parsenumber(exp); + /*******************************/ + switch (*exp->_p) { + case '}': + p1 = p0; + exp->_p++; + break; + case ',': + exp->_p++; + p1 = 0xFFFF; + if (isdigit((int)(*exp->_p))) { + p1 = (unsigned short)trex_parsenumber(exp); + } + trex_expect(exp, '}'); + break; + default: + trex_error(exp, _SC(", or } expected")); + } + /*******************************/ + isgreedy = TRex_True; + break; + } + if (isgreedy) { + int nnode = trex_newnode(exp, OP_GREEDY); + exp->_nodes[nnode].left = ret; + exp->_nodes[nnode].right = ((p0) << 16) | p1; + ret = nnode; + } + } + if ((*exp->_p != TREX_SYMBOL_BRANCH) && (*exp->_p != ')') && (*exp->_p != TREX_SYMBOL_GREEDY_ZERO_OR_MORE) && + (*exp->_p != TREX_SYMBOL_GREEDY_ONE_OR_MORE) && (*exp->_p != '\0')) { + int nnode = trex_element(exp); + exp->_nodes[ret].next = nnode; + } + + return ret; +} + +static int trex_list(TRex *exp) { + int ret = -1, e; + if (*exp->_p == TREX_SYMBOL_BEGINNING_OF_STRING) { + exp->_p++; + ret = trex_newnode(exp, OP_BOL); + } + e = trex_element(exp); + if (ret != -1) { + exp->_nodes[ret].next = e; + } else { + ret = e; + } + + if (*exp->_p == TREX_SYMBOL_BRANCH) { + int temp, tright; + exp->_p++; + temp = trex_newnode(exp, OP_OR); + exp->_nodes[temp].left = ret; + tright = trex_list(exp); + exp->_nodes[temp].right = tright; + ret = temp; + } + return ret; +} + +static TRexBool trex_matchcclass(int cclass, TRexChar c) { + switch (cclass) { + case 'a': + return isalpha(c) ? TRex_True : TRex_False; + case 'A': + return !isalpha(c) ? TRex_True : TRex_False; + case 'w': + return (isalnum(c) || c == '_') ? TRex_True : TRex_False; + case 'W': + return (!isalnum(c) && c != '_') ? TRex_True : TRex_False; + case 's': + return isspace(c) ? TRex_True : TRex_False; + case 'S': + return !isspace(c) ? TRex_True : TRex_False; + case 'd': + return isdigit(c) ? TRex_True : TRex_False; + case 'D': + return !isdigit(c) ? TRex_True : TRex_False; + case 'x': + return isxdigit(c) ? TRex_True : TRex_False; + case 'X': + return !isxdigit(c) ? TRex_True : TRex_False; + case 'c': + return iscntrl(c) ? TRex_True : TRex_False; + case 'C': + return !iscntrl(c) ? TRex_True : TRex_False; + case 'p': + return ispunct(c) ? TRex_True : TRex_False; + case 'P': + return !ispunct(c) ? TRex_True : TRex_False; + case 'l': + return islower(c) ? TRex_True : TRex_False; + case 'u': + return isupper(c) ? TRex_True : TRex_False; + } + return TRex_False; /*cannot happen*/ +} + +static TRexBool trex_matchclass(TRex *exp, TRexNode *node, TRexChar c) { + do { + switch (node->type) { + case OP_RANGE: + if (exp->_flags & TREX_ICASE) { + if (c >= toupper(node->left) && c <= toupper(node->right)) { + return TRex_True; + } + if (c >= tolower(node->left) && c <= tolower(node->right)) { + return TRex_True; + } + } else { + if (c >= node->left && c <= node->right) { + return TRex_True; + } + } + break; + case OP_CCLASS: + if (trex_matchcclass(node->left, c)) { + return TRex_True; + } + break; + default: + if (exp->_flags & TREX_ICASE) { + if (c == tolower(node->type) || c == toupper(node->type)) { + return TRex_True; + } + } else { + if (c == node->type) { + return TRex_True; + } + } + } + } while ((node->next != -1) && ((node = &exp->_nodes[node->next]) != NULL)); + return TRex_False; +} + +static const TRexChar *trex_matchnode(TRex *exp, TRexNode *node, const TRexChar *str, TRexNode *next) { + TRexNodeType type = node->type; + switch (type) { + case OP_GREEDY: { + /* TRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : + * NULL; */ + TRexNode *greedystop = NULL; + int p0 = (node->right >> 16) & 0x0000FFFF, p1 = node->right & 0x0000FFFF, nmaches = 0; + const TRexChar *s = str, *good = str; + + if (node->next != -1) { + greedystop = &exp->_nodes[node->next]; + } else { + greedystop = next; + } + + while ((nmaches == 0xFFFF || nmaches < p1)) { + const TRexChar *stop; + if ((s = trex_matchnode(exp, &exp->_nodes[node->left], s, greedystop)) == NULL) { + break; + } + nmaches++; + good = s; + if (greedystop) { + /* checks that 0 matches satisfy the expression(if so skips) */ + /* if not would always stop(for instance if is a '?') */ + if (greedystop->type != OP_GREEDY || + (greedystop->type == OP_GREEDY && ((greedystop->right >> 16) & 0x0000FFFF) != 0)) { + TRexNode *gnext = NULL; + if (greedystop->next != -1) { + gnext = &exp->_nodes[greedystop->next]; + } else if (next && next->next != -1) { + gnext = &exp->_nodes[next->next]; + } + stop = trex_matchnode(exp, greedystop, s, gnext); + if (stop) { + /* if satisfied stop it */ + if (p0 == p1 && p0 == nmaches) { + break; + } else if (nmaches >= p0 && p1 == 0xFFFF) { + break; + } else if (nmaches >= p0 && nmaches <= p1) { + break; + } + } + } + } + + if (s >= exp->_eol) { + break; + } + } + if (p0 == p1 && p0 == nmaches) { + return good; + } else if (nmaches >= p0 && p1 == 0xFFFF) { + return good; + } else if (nmaches >= p0 && nmaches <= p1) { + return good; + } + return NULL; + } + case OP_OR: { + const TRexChar *asd = str; + TRexNode *temp = &exp->_nodes[node->left]; + while ((asd = trex_matchnode(exp, temp, asd, NULL)) != NULL) { + if (temp->next != -1) { + temp = &exp->_nodes[temp->next]; + } else { + return asd; + } + } + asd = str; + temp = &exp->_nodes[node->right]; + while ((asd = trex_matchnode(exp, temp, asd, NULL)) != NULL) { + if (temp->next != -1) { + temp = &exp->_nodes[temp->next]; + } else { + return asd; + } + } + return NULL; + break; + } + case OP_EXPR: + case OP_NOCAPEXPR: { + TRexNode *n = &exp->_nodes[node->left]; + const TRexChar *cur = str; + int capture = -1; + if (node->type != OP_NOCAPEXPR && node->right == exp->_currsubexp) { + capture = exp->_currsubexp; + exp->_matches[capture].begin = cur; + exp->_currsubexp++; + } + + do { + TRexNode *subnext = NULL; + if (n->next != -1) { + subnext = &exp->_nodes[n->next]; + } else { + subnext = next; + } + if ((cur = trex_matchnode(exp, n, cur, subnext)) == NULL) { + if (capture != -1) { + exp->_matches[capture].begin = 0; + exp->_matches[capture].len = 0; + } + return NULL; + } + } while ((n->next != -1) && ((n = &exp->_nodes[n->next]) != NULL)); + + if (capture != -1) { + exp->_matches[capture].len = (int)(cur - exp->_matches[capture].begin); + } + return cur; + } + case OP_WB: + if ((str == exp->_bol && !isspace((int)(*str))) || (str == exp->_eol && !isspace((int)(*(str - 1)))) || + (!isspace((int)(*str)) && isspace((int)(*(str + 1)))) || + (isspace((int)(*str)) && !isspace((int)(*(str + 1))))) { + return (node->left == 'b') ? str : NULL; + } + return (node->left == 'b') ? NULL : str; + case OP_BOL: + if (str == exp->_bol) { + return str; + } + return NULL; + case OP_EOL: + if (str == exp->_eol) { + return str; + } + return NULL; + case OP_DOT: { + str++; + } + return str; + case OP_NCLASS: + case OP_CLASS: + if (trex_matchclass(exp, &exp->_nodes[node->left], *str) ? (type == OP_CLASS ? TRex_True : TRex_False) + : (type == OP_NCLASS ? TRex_True : TRex_False)) { + str++; + return str; + } + return NULL; + case OP_CCLASS: + if (trex_matchcclass(node->left, *str)) { + str++; + return str; + } + return NULL; + default: /* char */ + if (exp->_flags & TREX_ICASE) { + if (*str != tolower(node->type) && *str != toupper(node->type)) { + return NULL; + } + } else { + if (*str != node->type) { + return NULL; + } + } + str++; + return str; + } +} + +/* public api */ +TRex *trex_compile(const TRexChar *pattern, const TRexChar **error, int flags) { + TRex *exp = (TRex *)xmalloc(sizeof(TRex)); + exp->_eol = exp->_bol = NULL; + exp->_p = pattern; + exp->_nallocated = (int)(scstrlen(pattern) * sizeof(TRexChar)); + exp->_nodes = (TRexNode *)xmalloc((size_t)exp->_nallocated * sizeof(TRexNode)); + exp->_nsize = 0; + exp->_matches = 0; + exp->_nsubexpr = 0; + exp->_first = trex_newnode(exp, OP_EXPR); + exp->_error = error; + exp->_jmpbuf = xmalloc(sizeof(jmp_buf)); + exp->_flags = flags; + if (setjmp(*((jmp_buf *)exp->_jmpbuf)) == 0) { + int res = trex_list(exp); + exp->_nodes[exp->_first].left = res; + if (*exp->_p != '\0') { + trex_error(exp, _SC("unexpected character")); + } +#ifdef ARG_REX_DEBUG + { + int nsize, i; + nsize = exp->_nsize; + scprintf(_SC("\n")); + for (i = 0; i < nsize; i++) { + if (exp->_nodes[i].type > MAX_CHAR) { + scprintf(_SC("[%02d] %10s "), i, g_nnames[exp->_nodes[i].type - MAX_CHAR]); + } else { + scprintf(_SC("[%02d] %10c "), i, exp->_nodes[i].type); + } + scprintf(_SC("left %02d right %02d next %02d\n"), + exp->_nodes[i].left, + exp->_nodes[i].right, + exp->_nodes[i].next); + } + scprintf(_SC("\n")); + } +#endif + exp->_matches = (TRexMatch *)xmalloc((size_t)exp->_nsubexpr * sizeof(TRexMatch)); + memset(exp->_matches, 0, (size_t)exp->_nsubexpr * sizeof(TRexMatch)); + } else { + trex_free(exp); + return NULL; + } + return exp; +} + +void trex_free(TRex *exp) { + if (exp) { + xfree(exp->_nodes); + xfree(exp->_jmpbuf); + xfree(exp->_matches); + xfree(exp); + } +} + +TRexBool trex_match(TRex *exp, const TRexChar *text) { + const TRexChar *res = NULL; + exp->_bol = text; + exp->_eol = text + scstrlen(text); + exp->_currsubexp = 0; + res = trex_matchnode(exp, exp->_nodes, text, NULL); + if (res == NULL || res != exp->_eol) { + return TRex_False; + } + return TRex_True; +} + +TRexBool trex_searchrange(TRex *exp, + const TRexChar *text_begin, + const TRexChar *text_end, + const TRexChar **out_begin, + const TRexChar **out_end) { + const TRexChar *cur = NULL; + int node = exp->_first; + if (text_begin >= text_end) { + return TRex_False; + } + exp->_bol = text_begin; + exp->_eol = text_end; + do { + cur = text_begin; + while (node != -1) { + exp->_currsubexp = 0; + cur = trex_matchnode(exp, &exp->_nodes[node], cur, NULL); + if (!cur) { + break; + } + node = exp->_nodes[node].next; + } + text_begin++; + } while (cur == NULL && text_begin != text_end); + + if (cur == NULL) { + return TRex_False; + } + + --text_begin; + + if (out_begin) { + *out_begin = text_begin; + } + if (out_end) { + *out_end = cur; + } + return TRex_True; +} + +TRexBool trex_search(TRex *exp, const TRexChar *text, const TRexChar **out_begin, const TRexChar **out_end) { + return trex_searchrange(exp, text, text + scstrlen(text), out_begin, out_end); +} + +int trex_getsubexpcount(TRex *exp) { + return exp->_nsubexpr; +} + +TRexBool trex_getsubexp(TRex *exp, int n, TRexMatch *subexp) { + if (n < 0 || n >= exp->_nsubexpr) { + return TRex_False; + } + *subexp = exp->_matches[n]; + return TRex_True; +} + +/******************************************************************************* + * arg_str: Implements the str command-line option + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include + +static void arg_str_resetfn(struct arg_str *parent) { + int i; + + ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent)); + for (i = 0; i < parent->count; i++) { + parent->sval[i] = ""; + } + parent->count = 0; +} + +static int arg_str_scanfn(struct arg_str *parent, const char *argval) { + int errorcode = 0; + + if (parent->count == parent->hdr.maxcount) { + /* maximum number of arguments exceeded */ + errorcode = ARG_ERR_MAXCOUNT; + } else if (!argval) { + /* a valid argument with no argument value was given. */ + /* This happens when an optional argument value was invoked. */ + /* leave parent argument value unaltered but still count the argument. */ + parent->count++; + } else { + parent->sval[parent->count++] = argval; + } + + ARG_TRACE(("%s:scanfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static int arg_str_checkfn(struct arg_str *parent) { + int errorcode = (parent->count < parent->hdr.mincount) ? ARG_ERR_MINCOUNT : 0; + + ARG_TRACE(("%s:checkfn(%p) returns %d\n", __FILE__, parent, errorcode)); + return errorcode; +} + +static void arg_str_errorfn(struct arg_str *parent, + arg_dstr_t ds, + int errorcode, + const char *argval, + const char *progname) { + const char *shortopts = parent->hdr.shortopts; + const char *longopts = parent->hdr.longopts; + const char *datatype = parent->hdr.datatype; + + /* make argval NULL safe */ + argval = argval ? argval : ""; + + arg_dstr_catf(ds, "%s: ", progname); + switch (errorcode) { + case ARG_ERR_MINCOUNT: + arg_dstr_cat(ds, "missing option "); + arg_print_option_ds(ds, shortopts, longopts, datatype, "\n"); + break; + + case ARG_ERR_MAXCOUNT: + arg_dstr_cat(ds, "excess option "); + arg_print_option_ds(ds, shortopts, longopts, argval, "\n"); + break; + } +} + +struct arg_str *arg_str0(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_strn(shortopts, longopts, datatype, 0, 1, glossary); +} + +struct arg_str *arg_str1(const char *shortopts, const char *longopts, const char *datatype, const char *glossary) { + return arg_strn(shortopts, longopts, datatype, 1, 1, glossary); +} + +struct arg_str *arg_strn(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary) { + size_t nbytes; + struct arg_str *result; + int i; + + /* should not allow this stupid error */ + /* we should return an error code warning this logic error */ + /* foolproof things by ensuring maxcount is not less than mincount */ + maxcount = (maxcount < mincount) ? mincount : maxcount; + + nbytes = sizeof(struct arg_str) /* storage for struct arg_str */ + + (size_t)maxcount * sizeof(char *); /* storage for sval[maxcount] array */ + + result = (struct arg_str *)xmalloc(nbytes); + + /* init the arg_hdr struct */ + result->hdr.flag = ARG_HASVALUE; + result->hdr.shortopts = shortopts; + result->hdr.longopts = longopts; + result->hdr.datatype = datatype ? datatype : ""; + result->hdr.glossary = glossary; + result->hdr.mincount = mincount; + result->hdr.maxcount = maxcount; + result->hdr.parent = result; + result->hdr.resetfn = (arg_resetfn *)arg_str_resetfn; + result->hdr.scanfn = (arg_scanfn *)arg_str_scanfn; + result->hdr.checkfn = (arg_checkfn *)arg_str_checkfn; + result->hdr.errorfn = (arg_errorfn *)arg_str_errorfn; + + /* store the sval[maxcount] array immediately after the arg_str struct */ + result->sval = (const char **)(result + 1); + result->count = 0; + + /* foolproof the string pointers by initializing them to reference empty + * strings */ + for (i = 0; i < maxcount; i++) { + result->sval[i] = ""; + } + + ARG_TRACE(("arg_strn() returns %p\n", result)); + return result; +} + +/******************************************************************************* + * arg_cmd: Provides the sub-command mechanism + * + * This file is part of the argtable3 library. + * + * Copyright (C) 2013-2019 Tom G. Huang + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#endif + +#include +#include +#include + +#define MAX_MODULE_VERSION_SIZE 128 + +static arg_hashtable_t *s_hashtable = NULL; +static char *s_module_name = NULL; +static int s_mod_ver_major = 0; +static int s_mod_ver_minor = 0; +static int s_mod_ver_patch = 0; +static char *s_mod_ver_tag = NULL; +static char *s_mod_ver = NULL; + +void arg_set_module_name(const char *name) { + size_t slen; + + xfree(s_module_name); + slen = strlen(name); + s_module_name = (char *)xmalloc(slen + 1); + memset(s_module_name, 0, slen + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(s_module_name, slen + 1, name, slen); +#else + memcpy(s_module_name, name, slen); +#endif +} + +void arg_set_module_version(int major, int minor, int patch, const char *tag) { + size_t slen_tag, slen_ds; + arg_dstr_t ds; + + s_mod_ver_major = major; + s_mod_ver_minor = minor; + s_mod_ver_patch = patch; + + xfree(s_mod_ver_tag); + slen_tag = strlen(tag); + s_mod_ver_tag = (char *)xmalloc(slen_tag + 1); + memset(s_mod_ver_tag, 0, slen_tag + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(s_mod_ver_tag, slen_tag + 1, tag, slen_tag); +#else + memcpy(s_mod_ver_tag, tag, slen_tag); +#endif + + ds = arg_dstr_create(); + arg_dstr_catf(ds, "%d.", s_mod_ver_major); + arg_dstr_catf(ds, "%d.", s_mod_ver_minor); + arg_dstr_catf(ds, "%d.", s_mod_ver_patch); + arg_dstr_cat(ds, s_mod_ver_tag); + + xfree(s_mod_ver); + slen_ds = strlen(arg_dstr_cstr(ds)); + s_mod_ver = (char *)xmalloc(slen_ds + 1); + memset(s_mod_ver, 0, slen_ds + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(s_mod_ver, slen_ds + 1, arg_dstr_cstr(ds), slen_ds); +#else + memcpy(s_mod_ver, arg_dstr_cstr(ds), slen_ds); +#endif + + arg_dstr_destroy(ds); +} + +static unsigned int hash_key(const void *key) { + const char *str = (const char *)key; + int c; + unsigned int hash = 5381; + + while ((c = *str++) != 0) { + hash = ((hash << 5) + hash) + (unsigned int)c; /* hash * 33 + c */ + } + + return hash; +} + +static int equal_keys(const void *key1, const void *key2) { + char *k1 = (char *)key1; + char *k2 = (char *)key2; + return (0 == strcmp(k1, k2)); +} + +void arg_cmd_init(void) { + s_hashtable = arg_hashtable_create(32, hash_key, equal_keys); +} + +void arg_cmd_uninit(void) { + arg_hashtable_destroy(s_hashtable, 1); +} + +void arg_cmd_register(const char *name, arg_cmdfn *proc, const char *description) { + arg_cmd_info_t *cmd_info; + size_t slen_name; + void *k; + + assert(strlen(name) < ARG_CMD_NAME_LEN); + assert(strlen(description) < ARG_CMD_DESCRIPTION_LEN); + + /* Check if the command already exists. */ + /* If the command exists, replace the existing command. */ + /* If the command doesn't exist, insert the command. */ + cmd_info = (arg_cmd_info_t *)arg_hashtable_search(s_hashtable, name); + if (cmd_info) { + arg_hashtable_remove(s_hashtable, name); + cmd_info = NULL; + } + + cmd_info = (arg_cmd_info_t *)xmalloc(sizeof(arg_cmd_info_t)); + memset(cmd_info, 0, sizeof(arg_cmd_info_t)); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s(cmd_info->name, ARG_CMD_NAME_LEN, name, strlen(name)); + strncpy_s(cmd_info->description, ARG_CMD_DESCRIPTION_LEN, description, strlen(description)); +#else + memcpy(cmd_info->name, name, strlen(name)); + memcpy(cmd_info->description, description, strlen(description)); +#endif + + cmd_info->proc = proc; + + slen_name = strlen(name); + k = xmalloc(slen_name + 1); + memset(k, 0, slen_name + 1); + +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncpy_s((char *)k, slen_name + 1, name, slen_name); +#else + memcpy((char *)k, name, slen_name); +#endif + + arg_hashtable_insert(s_hashtable, k, cmd_info); +} + +void arg_cmd_unregister(const char *name) { + arg_hashtable_remove(s_hashtable, name); +} + +int arg_cmd_dispatch(const char *name, int argc, char *argv[], arg_dstr_t res) { + arg_cmd_info_t *cmd_info = arg_cmd_info(name); + + assert(cmd_info != NULL); + assert(cmd_info->proc != NULL); + + return cmd_info->proc(argc, argv, res); +} + +arg_cmd_info_t *arg_cmd_info(const char *name) { + return (arg_cmd_info_t *)arg_hashtable_search(s_hashtable, name); +} + +unsigned int arg_cmd_count(void) { + return arg_hashtable_count(s_hashtable); +} + +arg_cmd_itr_t arg_cmd_itr_create(void) { + return (arg_cmd_itr_t)arg_hashtable_itr_create(s_hashtable); +} + +int arg_cmd_itr_advance(arg_cmd_itr_t itr) { + return arg_hashtable_itr_advance((arg_hashtable_itr_t *)itr); +} + +char *arg_cmd_itr_key(arg_cmd_itr_t itr) { + return (char *)arg_hashtable_itr_key((arg_hashtable_itr_t *)itr); +} + +arg_cmd_info_t *arg_cmd_itr_value(arg_cmd_itr_t itr) { + return (arg_cmd_info_t *)arg_hashtable_itr_value((arg_hashtable_itr_t *)itr); +} + +void arg_cmd_itr_destroy(arg_cmd_itr_t itr) { + arg_hashtable_itr_destroy((arg_hashtable_itr_t *)itr); +} + +int arg_cmd_itr_search(arg_cmd_itr_t itr, void *k) { + return arg_hashtable_itr_search((arg_hashtable_itr_t *)itr, s_hashtable, k); +} + +static const char *module_name(void) { + if (s_module_name == NULL || strlen(s_module_name) == 0) { + return ""; + } + + return s_module_name; +} + +static const char *module_version(void) { + if (s_mod_ver == NULL || strlen(s_mod_ver) == 0) { + return "0.0.0.0"; + } + + return s_mod_ver; +} + +void arg_make_get_help_msg(arg_dstr_t res) { + arg_dstr_catf(res, "%s v%s\n", module_name(), module_version()); + arg_dstr_catf(res, "Please type '%s help' to get more information.\n", module_name()); +} + +void arg_make_help_msg(arg_dstr_t ds, char *cmd_name, void **argtable) { + arg_cmd_info_t *cmd_info = (arg_cmd_info_t *)arg_hashtable_search(s_hashtable, cmd_name); + if (cmd_info) { + arg_dstr_catf(ds, "%s: %s\n", cmd_name, cmd_info->description); + } + + arg_dstr_cat(ds, "Usage:\n"); + arg_dstr_catf(ds, " %s", module_name()); + + arg_print_syntaxv_ds(ds, argtable, "\n \nAvailable options:\n"); + arg_print_glossary_ds(ds, argtable, " %-23s %s\n"); + + arg_dstr_cat(ds, "\n"); +} + +void arg_make_syntax_err_msg(arg_dstr_t ds, void **argtable, struct arg_end *end) { + arg_print_errors_ds(ds, end, module_name()); + arg_dstr_cat(ds, "Usage: \n"); + arg_dstr_catf(ds, " %s", module_name()); + arg_print_syntaxv_ds(ds, argtable, "\n"); + arg_dstr_cat(ds, "\n"); +} + +int arg_make_syntax_err_help_msg(arg_dstr_t ds, + char *name, + int help, + int nerrors, + void **argtable, + struct arg_end *end, + int *exitcode) { + /* help handling + * note: '-h|--help' takes precedence over error reporting + */ + if (help > 0) { + arg_make_help_msg(ds, name, argtable); + *exitcode = EXIT_SUCCESS; + return 1; + } + + /* syntax error handling */ + if (nerrors > 0) { + arg_make_syntax_err_msg(ds, argtable, end); + *exitcode = EXIT_FAILURE; + return 1; + } + + return 0; +} + +/******************************************************************************* + * argtable3: Implements the main interfaces of the library + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "argtable3.h" + +#ifndef ARG_AMALGAMATION +#include "argtable3_private.h" +#if ARG_REPLACE_GETOPT == 1 +#include "arg_getopt.h" +#else +#include +#endif +#else +#if ARG_REPLACE_GETOPT == 0 +#include +#endif +#endif + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN +#endif + +#include +#include +#include +#include +#include + +static void arg_register_error(struct arg_end *end, void *parent, int error, const char *argval) { + /* printf("arg_register_error(%p,%p,%d,%s)\n",end,parent,error,argval); */ + if (end->count < end->hdr.maxcount) { + end->error[end->count] = error; + end->parent[end->count] = parent; + end->argval[end->count] = argval; + end->count++; + } else { + end->error[end->hdr.maxcount - 1] = ARG_ELIMIT; + end->parent[end->hdr.maxcount - 1] = end; + end->argval[end->hdr.maxcount - 1] = NULL; + } +} + +/* + * Return index of first table entry with a matching short option + * or -1 if no match was found. + */ +static int find_shortoption(struct arg_hdr **table, char shortopt) { + int tabindex; + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + if (table[tabindex]->shortopts && strchr(table[tabindex]->shortopts, shortopt)) { + return tabindex; + } + } + return -1; +} + +struct longoptions { + int getoptval; + int noptions; + struct option *options; +}; + +#if 0 +static +void dump_longoptions(struct longoptions * longoptions) +{ + int i; + printf("getoptval = %d\n", longoptions->getoptval); + printf("noptions = %d\n", longoptions->noptions); + for (i = 0; i < longoptions->noptions; i++) + { + printf("options[%d].name = \"%s\"\n", + i, + longoptions->options[i].name); + printf("options[%d].has_arg = %d\n", i, longoptions->options[i].has_arg); + printf("options[%d].flag = %p\n", i, longoptions->options[i].flag); + printf("options[%d].val = %d\n", i, longoptions->options[i].val); + } +} +#endif + +static struct longoptions *alloc_longoptions(struct arg_hdr **table) { + struct longoptions *result; + size_t nbytes; + int noptions = 1; + size_t longoptlen = 0; + int tabindex; + int option_index = 0; + char *store; + + /* + * Determine the total number of option structs required + * by counting the number of comma separated long options + * in all table entries and return the count in noptions. + * note: noptions starts at 1 not 0 because we getoptlong + * requires a NULL option entry to terminate the option array. + * While we are at it, count the number of chars required + * to store private copies of all the longoption strings + * and return that count in logoptlen. + */ + tabindex = 0; + do { + const char *longopts = table[tabindex]->longopts; + longoptlen += (longopts ? strlen(longopts) : 0) + 1; + while (longopts) { + noptions++; + longopts = strchr(longopts + 1, ','); + } + } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); + /*printf("%d long options consuming %d chars in + * total\n",noptions,longoptlen);*/ + + /* allocate storage for return data structure as: */ + /* (struct longoptions) + (struct options)[noptions] + char[longoptlen] */ + nbytes = sizeof(struct longoptions) + sizeof(struct option) * (size_t)noptions + longoptlen; + result = (struct longoptions *)xmalloc(nbytes); + + result->getoptval = 0; + result->noptions = noptions; + result->options = (struct option *)(result + 1); + store = (char *)(result->options + noptions); + + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + const char *longopts = table[tabindex]->longopts; + + while (longopts && *longopts) { + char *storestart = store; + + /* copy progressive longopt strings into the store */ + while (*longopts != 0 && *longopts != ',') { + *store++ = *longopts++; + } + *store++ = 0; + if (*longopts == ',') { + longopts++; + } + /*fprintf(stderr,"storestart=\"%s\"\n",storestart);*/ + + result->options[option_index].name = storestart; + result->options[option_index].flag = &(result->getoptval); + result->options[option_index].val = tabindex; + if (table[tabindex]->flag & ARG_HASOPTVALUE) { + result->options[option_index].has_arg = 2; + } else if (table[tabindex]->flag & ARG_HASVALUE) { + result->options[option_index].has_arg = 1; + } else { + result->options[option_index].has_arg = 0; + } + + option_index++; + } + } + /* terminate the options array with a zero-filled entry */ + result->options[option_index].name = 0; + result->options[option_index].has_arg = 0; + result->options[option_index].flag = 0; + result->options[option_index].val = 0; + + /*dump_longoptions(result);*/ + return result; +} + +static char *alloc_shortoptions(struct arg_hdr **table) { + char *result; + size_t len = 2; + int tabindex; + char *res; + + /* determine the total number of option chars required */ + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + struct arg_hdr *hdr = table[tabindex]; + len += 3 * (hdr->shortopts ? strlen(hdr->shortopts) : 0); + } + + result = xmalloc(len); + + res = result; + + /* add a leading ':' so getopt return codes distinguish */ + /* unrecognised option and options missing argument values */ + *res++ = ':'; + + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + struct arg_hdr *hdr = table[tabindex]; + const char *shortopts = hdr->shortopts; + while (shortopts && *shortopts) { + *res++ = *shortopts++; + if (hdr->flag & ARG_HASVALUE) { + *res++ = ':'; + } + if (hdr->flag & ARG_HASOPTVALUE) { + *res++ = ':'; + } + } + } + /* null terminate the string */ + *res = 0; + + /*printf("alloc_shortoptions() returns \"%s\"\n",(result?result:"NULL"));*/ + return result; +} + +/* return index of the table terminator entry */ +static int arg_endindex(struct arg_hdr **table) { + int tabindex = 0; + while (!(table[tabindex]->flag & ARG_TERMINATOR)) { + tabindex++; + } + return tabindex; +} + +static void arg_parse_tagged(int argc, char **argv, struct arg_hdr **table, struct arg_end *endtable) { + struct longoptions *longoptions; + char *shortoptions; + int copt; + + /*printf("arg_parse_tagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/ + + /* allocate short and long option arrays for the given opttable[]. */ + /* if the allocs fail then put an error msg in the last table entry. */ + longoptions = alloc_longoptions(table); + shortoptions = alloc_shortoptions(table); + + /*dump_longoptions(longoptions);*/ + + /* reset getopts internal option-index to zero, and disable error reporting */ + optind = 0; + opterr = 0; + + /* fetch and process args using getopt_long */ +#ifdef ARG_LONG_ONLY + while ((copt = getopt_long_only(argc, argv, shortoptions, longoptions->options, NULL)) != -1) { +#else + while ((copt = getopt_long(argc, argv, shortoptions, longoptions->options, NULL)) != -1) { +#endif + /* + printf("optarg='%s'\n",optarg); + printf("optind=%d\n",optind); + printf("copt=%c\n",(char)copt); + printf("optopt=%c (%d)\n",optopt, (int)(optopt)); + */ + switch (copt) { + case 0: { + int tabindex = longoptions->getoptval; + void *parent = table[tabindex]->parent; + /*printf("long option detected from argtable[%d]\n", tabindex);*/ + if (optarg && optarg[0] == 0 && (table[tabindex]->flag & ARG_HASVALUE)) { + /* printf(": long option %s requires an argument\n",argv[optind-1]); */ + arg_register_error(endtable, endtable, ARG_EMISSARG, argv[optind - 1]); + /* continue to scan the (empty) argument value to enforce argument count + * checking */ + } + if (table[tabindex]->scanfn) { + int errorcode = table[tabindex]->scanfn(parent, optarg); + if (errorcode != 0) { + arg_register_error(endtable, parent, errorcode, optarg); + } + } + } break; + + case '?': + /* + * getopt_long() found an unrecognised short option. + * if it was a short option its value is in optopt + * if it was a long option then optopt=0 + */ + switch (optopt) { + case 0: + /*printf("?0 unrecognised long option %s\n",argv[optind-1]);*/ + arg_register_error(endtable, endtable, ARG_ELONGOPT, argv[optind - 1]); + break; + default: + /*printf("?* unrecognised short option '%c'\n",optopt);*/ + arg_register_error(endtable, endtable, optopt, NULL); + break; + } + break; + + case ':': + /* + * getopt_long() found an option with its argument missing. + */ + /*printf(": option %s requires an argument\n",argv[optind-1]); */ + arg_register_error(endtable, endtable, ARG_EMISSARG, argv[optind - 1]); + break; + + default: { + /* getopt_long() found a valid short option */ + int tabindex = find_shortoption(table, (char)copt); + /*printf("short option detected from argtable[%d]\n", tabindex);*/ + if (tabindex == -1) { + /* should never get here - but handle it just in case */ + /*printf("unrecognised short option %d\n",copt);*/ + arg_register_error(endtable, endtable, copt, NULL); + } else { + if (table[tabindex]->scanfn) { + void *parent = table[tabindex]->parent; + int errorcode = table[tabindex]->scanfn(parent, optarg); + if (errorcode != 0) { + arg_register_error(endtable, parent, errorcode, optarg); + } + } + } + break; + } + } + } + + xfree(shortoptions); + xfree(longoptions); +} + +static void arg_parse_untagged(int argc, char **argv, struct arg_hdr **table, struct arg_end *endtable) { + int tabindex = 0; + int errorlast = 0; + const char *optarglast = NULL; + void *parentlast = NULL; + + /*printf("arg_parse_untagged(%d,%p,%p,%p)\n",argc,argv,table,endtable);*/ + while (!(table[tabindex]->flag & ARG_TERMINATOR)) { + void *parent; + int errorcode; + + /* if we have exhausted our argv[optind] entries then we have finished */ + if (optind >= argc) { + /*printf("arg_parse_untagged(): argv[] exhausted\n");*/ + return; + } + + /* skip table entries with non-null long or short options (they are not + * untagged entries) */ + if (table[tabindex]->longopts || table[tabindex]->shortopts) { + /*printf("arg_parse_untagged(): skipping argtable[%d] (tagged + * argument)\n",tabindex);*/ + tabindex++; + continue; + } + + /* skip table entries with NULL scanfn */ + if (!(table[tabindex]->scanfn)) { + /*printf("arg_parse_untagged(): skipping argtable[%d] (NULL + * scanfn)\n",tabindex);*/ + tabindex++; + continue; + } + + /* attempt to scan the current argv[optind] with the current */ + /* table[tabindex] entry. If it succeeds then keep it, otherwise */ + /* try again with the next table[] entry. */ + parent = table[tabindex]->parent; + errorcode = table[tabindex]->scanfn(parent, argv[optind]); + if (errorcode == 0) { + /* success, move onto next argv[optind] but stay with same table[tabindex] + */ + /*printf("arg_parse_untagged(): argtable[%d] successfully + * matched\n",tabindex);*/ + optind++; + + /* clear the last tentative error */ + errorlast = 0; + } else { + /* failure, try same argv[optind] with next table[tabindex] entry */ + /*printf("arg_parse_untagged(): argtable[%d] failed match\n",tabindex);*/ + tabindex++; + + /* remember this as a tentative error we may wish to reinstate later */ + errorlast = errorcode; + optarglast = argv[optind]; + parentlast = parent; + } + } + + /* if a tenative error still remains at this point then register it as a + * proper error */ + if (errorlast) { + arg_register_error(endtable, parentlast, errorlast, optarglast); + optind++; + } + + /* only get here when not all argv[] entries were consumed */ + /* register an error for each unused argv[] entry */ + while (optind < argc) { + /*printf("arg_parse_untagged(): argv[%d]=\"%s\" not + * consumed\n",optind,argv[optind]);*/ + arg_register_error(endtable, endtable, ARG_ENOMATCH, argv[optind++]); + } + + return; +} + +static void arg_parse_check(struct arg_hdr **table, struct arg_end *endtable) { + int tabindex = 0; + /* printf("arg_parse_check()\n"); */ + do { + if (table[tabindex]->checkfn) { + void *parent = table[tabindex]->parent; + int errorcode = table[tabindex]->checkfn(parent); + if (errorcode != 0) { + arg_register_error(endtable, parent, errorcode, NULL); + } + } + } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); +} + +static void arg_reset(void **argtable) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int tabindex = 0; + /*printf("arg_reset(%p)\n",argtable);*/ + do { + if (table[tabindex]->resetfn) { + table[tabindex]->resetfn(table[tabindex]->parent); + } + } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); +} + +int arg_parse(int argc, char **argv, void **argtable) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + struct arg_end *endtable; + int endindex; + char **argvcopy = NULL; + int i; + + /*printf("arg_parse(%d,%p,%p)\n",argc,argv,argtable);*/ + + /* reset any argtable data from previous invocations */ + arg_reset(argtable); + + /* locate the first end-of-table marker within the array */ + endindex = arg_endindex(table); + endtable = (struct arg_end *)table[endindex]; + + /* Special case of argc==0. This can occur on Texas Instruments DSP. */ + /* Failure to trap this case results in an unwanted NULL result from */ + /* the malloc for argvcopy (next code block). */ + if (argc == 0) { + /* We must still perform post-parse checks despite the absence of command + * line arguments */ + arg_parse_check(table, endtable); + + /* Now we are finished */ + return endtable->count; + } + + argvcopy = (char **)xmalloc(sizeof(char *) * (size_t)(argc + 1)); + + /* + Fill in the local copy of argv[]. We need a local copy + because getopt rearranges argv[] which adversely affects + susbsequent parsing attempts. + */ + for (i = 0; i < argc; i++) { + argvcopy[i] = argv[i]; + } + + argvcopy[argc] = NULL; + + /* parse the command line (local copy) for tagged options */ + arg_parse_tagged(argc, argvcopy, table, endtable); + + /* parse the command line (local copy) for untagged options */ + arg_parse_untagged(argc, argvcopy, table, endtable); + + /* if no errors so far then perform post-parse checks otherwise dont bother */ + if (endtable->count == 0) { + arg_parse_check(table, endtable); + } + + /* release the local copt of argv[] */ + xfree(argvcopy); + + return endtable->count; +} + +/* + * Concatenate contents of src[] string onto *pdest[] string. + * The *pdest pointer is altered to point to the end of the + * target string and *pndest is decremented by the same number + * of chars. + * Does not append more than *pndest chars into *pdest[] + * so as to prevent buffer overruns. + * Its something like strncat() but more efficient for repeated + * calls on the same destination string. + * Example of use: + * char dest[30] = "good" + * size_t ndest = sizeof(dest); + * char *pdest = dest; + * arg_char(&pdest,"bye ",&ndest); + * arg_char(&pdest,"cruel ",&ndest); + * arg_char(&pdest,"world!",&ndest); + * Results in: + * dest[] == "goodbye cruel world!" + * ndest == 10 + */ +static void arg_cat(char **pdest, const char *src, size_t *pndest) { + char *dest = *pdest; + char *end = dest + *pndest; + + /*locate null terminator of dest string */ + while (dest < end - 1 && *dest != 0) { + dest++; + } + + /* concat src string to dest string */ + while (dest < end - 1 && *src != 0) { + *dest++ = *src++; + } + + /* null terminate dest string */ + *dest = 0; + + /* update *pdest and *pndest */ + *pndest = (size_t)(end - dest); + *pdest = dest; +} + +static void arg_cat_option(char *dest, + size_t ndest, + const char *shortopts, + const char *longopts, + const char *datatype, + int optvalue) { + if (shortopts) { + char option[3]; + + /* note: option array[] is initialiazed dynamically here to satisfy */ + /* a deficiency in the watcom compiler wrt static array initializers. */ + option[0] = '-'; + option[1] = shortopts[0]; + option[2] = 0; + + arg_cat(&dest, option, &ndest); + if (datatype) { + arg_cat(&dest, " ", &ndest); + if (optvalue) { + arg_cat(&dest, "[", &ndest); + arg_cat(&dest, datatype, &ndest); + arg_cat(&dest, "]", &ndest); + } else { + arg_cat(&dest, datatype, &ndest); + } + } + } else if (longopts) { + size_t ncspn; + + /* add "--" tag prefix */ + arg_cat(&dest, "--", &ndest); + + /* add comma separated option tag */ + ncspn = strcspn(longopts, ","); +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncat_s(dest, ndest, longopts, (ncspn < ndest) ? ncspn : ndest); +#else + strncat(dest, longopts, (ncspn < ndest) ? ncspn : ndest); +#endif + + if (datatype) { + arg_cat(&dest, "=", &ndest); + if (optvalue) { + arg_cat(&dest, "[", &ndest); + arg_cat(&dest, datatype, &ndest); + arg_cat(&dest, "]", &ndest); + } else { + arg_cat(&dest, datatype, &ndest); + } + } + } else if (datatype) { + if (optvalue) { + arg_cat(&dest, "[", &ndest); + arg_cat(&dest, datatype, &ndest); + arg_cat(&dest, "]", &ndest); + } else { + arg_cat(&dest, datatype, &ndest); + } + } +} + +static void arg_cat_optionv(char *dest, + size_t ndest, + const char *shortopts, + const char *longopts, + const char *datatype, + int optvalue, + const char *separator) { + separator = separator ? separator : ""; + + if (shortopts) { + const char *c = shortopts; + while (*c) { + /* "-a|-b|-c" */ + char shortopt[3]; + + /* note: shortopt array[] is initialiazed dynamically here to satisfy */ + /* a deficiency in the watcom compiler wrt static array initializers. */ + shortopt[0] = '-'; + shortopt[1] = *c; + shortopt[2] = 0; + + arg_cat(&dest, shortopt, &ndest); + if (*++c) { + arg_cat(&dest, separator, &ndest); + } + } + } + + /* put separator between long opts and short opts */ + if (shortopts && longopts) { + arg_cat(&dest, separator, &ndest); + } + + if (longopts) { + const char *c = longopts; + while (*c) { + size_t ncspn; + + /* add "--" tag prefix */ + arg_cat(&dest, "--", &ndest); + + /* add comma separated option tag */ + ncspn = strcspn(c, ","); +#if (defined(__STDC_LIB_EXT1__) && defined(__STDC_WANT_LIB_EXT1__)) || \ + (defined(__STDC_SECURE_LIB__) && defined(__STDC_WANT_SECURE_LIB__)) + strncat_s(dest, ndest, c, (ncspn < ndest) ? ncspn : ndest); +#else + strncat(dest, c, (ncspn < ndest) ? ncspn : ndest); +#endif + c += ncspn; + + /* add given separator in place of comma */ + if (*c == ',') { + arg_cat(&dest, separator, &ndest); + c++; + } + } + } + + if (datatype) { + if (longopts) { + arg_cat(&dest, "=", &ndest); + } else if (shortopts) { + arg_cat(&dest, " ", &ndest); + } + + if (optvalue) { + arg_cat(&dest, "[", &ndest); + arg_cat(&dest, datatype, &ndest); + arg_cat(&dest, "]", &ndest); + } else { + arg_cat(&dest, datatype, &ndest); + } + } +} + +void arg_print_option_ds(arg_dstr_t ds, + const char *shortopts, + const char *longopts, + const char *datatype, + const char *suffix) { + char syntax[200] = ""; + suffix = suffix ? suffix : ""; + + /* there is no way of passing the proper optvalue for optional argument values + * here, so we must ignore it */ + arg_cat_optionv(syntax, sizeof(syntax) - 1, shortopts, longopts, datatype, 0, "|"); + + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, (char *)suffix); +} + +/* this function should be deprecated because it doesn't consider optional + * argument values (ARG_HASOPTVALUE) */ +void arg_print_option(FILE *fp, const char *shortopts, const char *longopts, const char *datatype, const char *suffix) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_option_ds(ds, shortopts, longopts, datatype, suffix); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} + +/* + * Print a GNU style [OPTION] string in which all short options that + * do not take argument values are presented in abbreviated form, as + * in: -xvfsd, or -xvf[sd], or [-xvsfd] + */ +static void arg_print_gnuswitch_ds(arg_dstr_t ds, struct arg_hdr **table) { + int tabindex; + const char *format1 = " -%c"; + const char *format2 = " [-%c"; + const char *suffix = ""; + + /* print all mandatory switches that are without argument values */ + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + /* skip optional options */ + if (table[tabindex]->mincount < 1) { + continue; + } + + /* skip non-short options */ + if (table[tabindex]->shortopts == NULL) { + continue; + } + + /* skip options that take argument values */ + if (table[tabindex]->flag & ARG_HASVALUE) { + continue; + } + + /* print the short option (only the first short option char, ignore multiple + * choices)*/ + arg_dstr_catf(ds, format1, table[tabindex]->shortopts[0]); + format1 = "%c"; + format2 = "[%c"; + } + + /* print all optional switches that are without argument values */ + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + /* skip mandatory args */ + if (table[tabindex]->mincount > 0) { + continue; + } + + /* skip args without short options */ + if (table[tabindex]->shortopts == NULL) { + continue; + } + + /* skip args with values */ + if (table[tabindex]->flag & ARG_HASVALUE) { + continue; + } + + /* print first short option */ + arg_dstr_catf(ds, format2, table[tabindex]->shortopts[0]); + format2 = "%c"; + suffix = "]"; + } + + arg_dstr_catf(ds, "%s", suffix); +} + +void arg_print_syntax_ds(arg_dstr_t ds, void **argtable, const char *suffix) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int i, tabindex; + + /* print GNU style [OPTION] string */ + arg_print_gnuswitch_ds(ds, table); + + /* print remaining options in abbreviated style */ + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + char syntax[200] = ""; + const char *shortopts, *longopts, *datatype; + + /* skip short options without arg values (they were printed by + * arg_print_gnu_switch) */ + if (table[tabindex]->shortopts && !(table[tabindex]->flag & ARG_HASVALUE)) { + continue; + } + + shortopts = table[tabindex]->shortopts; + longopts = table[tabindex]->longopts; + datatype = table[tabindex]->datatype; + arg_cat_option(syntax, + sizeof(syntax) - 1, + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE); + + if (strlen(syntax) > 0) { + /* print mandatory instances of this option */ + for (i = 0; i < table[tabindex]->mincount; i++) { + arg_dstr_cat(ds, " "); + arg_dstr_cat(ds, syntax); + } + + /* print optional instances enclosed in "[..]" */ + switch (table[tabindex]->maxcount - table[tabindex]->mincount) { + case 0: + break; + case 1: + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + break; + case 2: + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + break; + default: + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]..."); + break; + } + } + } + + if (suffix) { + arg_dstr_cat(ds, (char *)suffix); + } +} + +void arg_print_syntax(FILE *fp, void **argtable, const char *suffix) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_syntax_ds(ds, argtable, suffix); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} + +void arg_print_syntaxv_ds(arg_dstr_t ds, void **argtable, const char *suffix) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int i, tabindex; + + /* print remaining options in abbreviated style */ + for (tabindex = 0; table[tabindex] && !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + char syntax[200] = ""; + const char *shortopts, *longopts, *datatype; + + shortopts = table[tabindex]->shortopts; + longopts = table[tabindex]->longopts; + datatype = table[tabindex]->datatype; + arg_cat_optionv(syntax, + sizeof(syntax) - 1, + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE, + "|"); + + /* print mandatory options */ + for (i = 0; i < table[tabindex]->mincount; i++) { + arg_dstr_cat(ds, " "); + arg_dstr_cat(ds, syntax); + } + + /* print optional args enclosed in "[..]" */ + switch (table[tabindex]->maxcount - table[tabindex]->mincount) { + case 0: + break; + case 1: + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + break; + case 2: + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]"); + break; + default: + arg_dstr_cat(ds, " ["); + arg_dstr_cat(ds, syntax); + arg_dstr_cat(ds, "]..."); + break; + } + } + + if (suffix) { + arg_dstr_cat(ds, (char *)suffix); + } +} + +void arg_print_syntaxv(FILE *fp, void **argtable, const char *suffix) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_syntaxv_ds(ds, argtable, suffix); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} + +void arg_print_glossary_ds(arg_dstr_t ds, void **argtable, const char *format) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int tabindex; + + format = format ? format : " %-20s %s\n"; + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + if (table[tabindex]->glossary) { + char syntax[200] = ""; + const char *shortopts = table[tabindex]->shortopts; + const char *longopts = table[tabindex]->longopts; + const char *datatype = table[tabindex]->datatype; + const char *glossary = table[tabindex]->glossary; + arg_cat_optionv(syntax, + sizeof(syntax) - 1, + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE, + ", "); + arg_dstr_catf(ds, format, syntax, glossary); + } + } +} + +void arg_print_glossary(FILE *fp, void **argtable, const char *format) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_glossary_ds(ds, argtable, format); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} + +/** + * Print a piece of text formatted, which means in a column with a + * left and a right margin. The lines are wrapped at whitspaces next + * to right margin. The function does not indent the first line, but + * only the following ones. + * + * Example: + * arg_print_formatted( fp, 0, 5, "Some text that doesn't fit." ) + * will result in the following output: + * + * Some + * text + * that + * doesn' + * t fit. + * + * Too long lines will be wrapped in the middle of a word. + * + * arg_print_formatted( fp, 2, 7, "Some text that doesn't fit." ) + * will result in the following output: + * + * Some + * text + * that + * doesn' + * t fit. + * + * As you see, the first line is not indented. This enables output of + * lines, which start in a line where output already happened. + * + * Author: Uli Fouquet + */ +static void arg_print_formatted_ds(arg_dstr_t ds, const unsigned lmargin, const unsigned rmargin, const char *text) { + const unsigned int textlen = (unsigned int)strlen(text); + unsigned int line_start = 0; + unsigned int line_end = textlen; + const unsigned int colwidth = (rmargin - lmargin) + 1; + + assert(strlen(text) < UINT_MAX); + + /* Someone doesn't like us... */ + if (line_end < line_start) { + arg_dstr_catf(ds, "%s\n", text); + } + + while (line_end > line_start) { + /* Eat leading white spaces. This is essential because while + wrapping lines, there will often be a whitespace at beginning + of line. Preserve newlines */ + while (isspace((int)(*(text + line_start))) && *(text + line_start) != '\n') { + line_start++; + } + + /* Find last whitespace, that fits into line */ + if (line_end - line_start > colwidth) { + line_end = line_start + colwidth; + + while ((line_end > line_start) && !isspace((int)(*(text + line_end)))) { + line_end--; + } + + /* If no whitespace could be found, eg. the text is one long word, break + * the word */ + if (line_end == line_start) { + /* Set line_end to previous value */ + line_end = line_start + colwidth; + } else { + /* Consume trailing spaces, except newlines */ + while ((line_end > line_start) && isspace((int)(*(text + line_end))) && *(text + line_start) != '\n') { + line_end--; + } + + /* Restore the last non-space character */ + line_end++; + } + } + + /* Output line of text */ + while (line_start < line_end) { + char c = *(text + line_start); + + /* If character is newline stop printing, skip this character, as a + * newline will be printed below. */ + if (c == '\n') { + line_start++; + break; + } + + arg_dstr_catc(ds, c); + line_start++; + } + arg_dstr_cat(ds, "\n"); + + /* Initialize another line */ + if (line_end < textlen) { + unsigned i; + + for (i = 0; i < lmargin; i++) { + arg_dstr_cat(ds, " "); + } + + line_end = textlen; + } + } /* lines of text */ +} + +/** + * Prints the glossary in strict GNU format. + * Differences to arg_print_glossary() are: + * - wraps lines after 80 chars + * - indents lines without shortops + * - does not accept formatstrings + * + * Contributed by Uli Fouquet + */ +void arg_print_glossary_gnu_ds(arg_dstr_t ds, void **argtable) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int tabindex; + + for (tabindex = 0; !(table[tabindex]->flag & ARG_TERMINATOR); tabindex++) { + if (table[tabindex]->glossary) { + char syntax[200] = ""; + const char *shortopts = table[tabindex]->shortopts; + const char *longopts = table[tabindex]->longopts; + const char *datatype = table[tabindex]->datatype; + const char *glossary = table[tabindex]->glossary; + + if (!shortopts && longopts) { + /* Indent trailing line by 4 spaces... */ + memset(syntax, ' ', 4); + *(syntax + 4) = '\0'; + } + + arg_cat_optionv(syntax, + sizeof(syntax) - 1, + shortopts, + longopts, + datatype, + table[tabindex]->flag & ARG_HASOPTVALUE, + ", "); + + /* If syntax fits not into column, print glossary in new line... */ + if (strlen(syntax) > 25) { + arg_dstr_catf(ds, " %-25s %s\n", syntax, ""); + *syntax = '\0'; + } + + arg_dstr_catf(ds, " %-25s ", syntax); + arg_print_formatted_ds(ds, 28, 79, glossary); + } + } /* for each table entry */ + + arg_dstr_cat(ds, "\n"); +} + +void arg_print_glossary_gnu(FILE *fp, void **argtable) { + arg_dstr_t ds = arg_dstr_create(); + arg_print_glossary_gnu_ds(ds, argtable); + fputs(arg_dstr_cstr(ds), fp); + arg_dstr_destroy(ds); +} + +/** + * Checks the argtable[] array for NULL entries and returns 1 + * if any are found, zero otherwise. + */ +int arg_nullcheck(void **argtable) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int tabindex; + /*printf("arg_nullcheck(%p)\n",argtable);*/ + + if (!table) { + return 1; + } + + tabindex = 0; + do { + /*printf("argtable[%d]=%p\n",tabindex,argtable[tabindex]);*/ + if (!table[tabindex]) { + return 1; + } + } while (!(table[tabindex++]->flag & ARG_TERMINATOR)); + + return 0; +} + +/* + * arg_free() is deprecated in favour of arg_freetable() due to a flaw in its + * design. The flaw results in memory leak in the (very rare) case that an + * intermediate entry in the argtable array failed its memory allocation while + * others following that entry were still allocated ok. Those subsequent + * allocations will not be deallocated by arg_free(). Despite the unlikeliness + * of the problem occurring, and the even unlikelier event that it has any + * deliterious effect, it is fixed regardless by replacing arg_free() with the + * newer arg_freetable() function. We still keep arg_free() for backwards + * compatibility. + */ +void arg_free(void **argtable) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + int tabindex = 0; + int flag; + /*printf("arg_free(%p)\n",argtable);*/ + do { + /* + if we encounter a NULL entry then somewhat incorrectly we presume + we have come to the end of the array. It isnt strictly true because + an intermediate entry could be NULL with other non-NULL entries to + follow. The subsequent argtable entries would then not be freed as they + should. + */ + if (table[tabindex] == NULL) { + break; + } + + flag = table[tabindex]->flag; + xfree(table[tabindex]); + table[tabindex++] = NULL; + + } while (!(flag & ARG_TERMINATOR)); +} + +/* frees each non-NULL element of argtable[], where n is the size of the number + * of entries in the array */ +void arg_freetable(void **argtable, size_t n) { + struct arg_hdr **table = (struct arg_hdr **)argtable; + size_t tabindex = 0; + /*printf("arg_freetable(%p)\n",argtable);*/ + for (tabindex = 0; tabindex < n; tabindex++) { + if (table[tabindex] == NULL) { + continue; + } + + xfree(table[tabindex]); + table[tabindex] = NULL; + }; +} + +#ifdef _WIN32 +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { + return TRUE; + UNREFERENCED_PARAMETER(hinstDLL); + UNREFERENCED_PARAMETER(fdwReason); + UNREFERENCED_PARAMETER(lpvReserved); +} +#endif diff --git a/srcs/libs/args/argtable3.h b/srcs/libs/args/argtable3.h new file mode 100644 index 0000000..d1f3b87 --- /dev/null +++ b/srcs/libs/args/argtable3.h @@ -0,0 +1,371 @@ +/******************************************************************************* + * argtable3: Declares the main interfaces of the library + * + * This file is part of the argtable3 library. + * + * Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of STEWART HEITMANN nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL STEWART HEITMANN BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef ARGTABLE3 +#define ARGTABLE3 + +#include /* FILE */ +#include /* struct tm */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ARG_REX_ICASE 1 +#define ARG_DSTR_SIZE 200 +#define ARG_CMD_NAME_LEN 100 +#define ARG_CMD_DESCRIPTION_LEN 256 + +#ifndef ARG_REPLACE_GETOPT +#define ARG_REPLACE_GETOPT 1 /* use the embedded getopt as the system getopt(3) */ +#endif /* ARG_REPLACE_GETOPT */ + +/* bit masks for arg_hdr.flag */ +enum { + ARG_TERMINATOR = 0x1, + ARG_HASVALUE = 0x2, + ARG_HASOPTVALUE = 0x4 +}; + +#if defined(_WIN32) +#if defined(argtable3_EXPORTS) +#define ARG_EXTERN __declspec(dllexport) +#elif defined(argtable3_IMPORTS) +#define ARG_EXTERN __declspec(dllimport) +#else +#define ARG_EXTERN +#endif +#else +#define ARG_EXTERN +#endif + +typedef struct _internal_arg_dstr *arg_dstr_t; +typedef void *arg_cmd_itr_t; + +typedef void(arg_resetfn)(void *parent); +typedef int(arg_scanfn)(void *parent, const char *argval); +typedef int(arg_checkfn)(void *parent); +typedef void(arg_errorfn)(void *parent, arg_dstr_t ds, int error, const char *argval, const char *progname); +typedef void(arg_dstr_freefn)(char *buf); +typedef int(arg_cmdfn)(int argc, char *argv[], arg_dstr_t res); +typedef int(arg_comparefn)(const void *k1, const void *k2); + +/* + * The arg_hdr struct defines properties that are common to all arg_xxx structs. + * The argtable library requires each arg_xxx struct to have an arg_hdr + * struct as its first data member. + * The argtable library functions then use this data to identify the + * properties of the command line option, such as its option tags, + * datatype string, and glossary strings, and so on. + * Moreover, the arg_hdr struct contains pointers to custom functions that + * are provided by each arg_xxx struct which perform the tasks of parsing + * that particular arg_xxx arguments, performing post-parse checks, and + * reporting errors. + * These functions are private to the individual arg_xxx source code + * and are the pointer to them are initiliased by that arg_xxx struct's + * constructor function. The user could alter them after construction + * if desired, but the original intention is for them to be set by the + * constructor and left unaltered. + */ +typedef struct arg_hdr { + char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */ + const char *shortopts; /* String defining the short options */ + const char *longopts; /* String defiing the long options */ + const char *datatype; /* Description of the argument data type */ + const char *glossary; /* Description of the option as shown by + arg_print_glossary function */ + int mincount; /* Minimum number of occurences of this option accepted */ + int maxcount; /* Maximum number of occurences if this option accepted */ + void *parent; /* Pointer to parent arg_xxx struct */ + arg_resetfn *resetfn; /* Pointer to parent arg_xxx reset function */ + arg_scanfn *scanfn; /* Pointer to parent arg_xxx scan function */ + arg_checkfn *checkfn; /* Pointer to parent arg_xxx check function */ + arg_errorfn *errorfn; /* Pointer to parent arg_xxx error function */ + void *priv; /* Pointer to private header data for use by arg_xxx functions */ +} arg_hdr_t; + +typedef struct arg_rem { + struct arg_hdr hdr; /* The mandatory argtable header struct */ +} arg_rem_t; + +typedef struct arg_lit { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ +} arg_lit_t; + +typedef struct arg_int { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + int *ival; /* Array of parsed argument values */ +} arg_int_t; + +typedef struct arg_dbl { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + double *dval; /* Array of parsed argument values */ +} arg_dbl_t; + +typedef struct arg_str { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + const char **sval; /* Array of parsed argument values */ +} arg_str_t; + +typedef struct arg_rex { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args */ + const char **sval; /* Array of parsed argument values */ +} arg_rex_t; + +typedef struct arg_file { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of matching command line args*/ + const char **filename; /* Array of parsed filenames (eg: /home/foo.bar) */ + const char **basename; /* Array of parsed basenames (eg: foo.bar) */ + const char **extension; /* Array of parsed extensions (eg: .bar) */ +} arg_file_t; + +typedef struct arg_date { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + const char *format; /* strptime format string used to parse the date */ + int count; /* Number of matching command line args */ + struct tm *tmval; /* Array of parsed time values */ +} arg_date_t; + +enum { + ARG_ELIMIT = 1, + ARG_EMALLOC, + ARG_ENOMATCH, + ARG_ELONGOPT, + ARG_EMISSARG +}; + +typedef struct arg_end { + struct arg_hdr hdr; /* The mandatory argtable header struct */ + int count; /* Number of errors encountered */ + int *error; /* Array of error codes */ + void **parent; /* Array of pointers to offending arg_xxx struct */ + const char **argval; /* Array of pointers to offending argv[] string */ +} arg_end_t; + +typedef struct arg_cmd_info { + char name[ARG_CMD_NAME_LEN]; + char description[ARG_CMD_DESCRIPTION_LEN]; + arg_cmdfn *proc; +} arg_cmd_info_t; + +/**** arg_xxx constructor functions *********************************/ + +ARG_EXTERN struct arg_rem *arg_rem(const char *datatype, const char *glossary); + +ARG_EXTERN struct arg_lit *arg_lit0(const char *shortopts, const char *longopts, const char *glossary); +ARG_EXTERN struct arg_lit *arg_lit1(const char *shortopts, const char *longopts, const char *glossary); +ARG_EXTERN struct arg_lit *arg_litn(const char *shortopts, + const char *longopts, + int mincount, + int maxcount, + const char *glossary); + +ARG_EXTERN struct arg_int *arg_int0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_int *arg_int1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_int *arg_intn(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); + +ARG_EXTERN struct arg_dbl *arg_dbl0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_dbl *arg_dbl1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_dbl *arg_dbln(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); + +ARG_EXTERN struct arg_str *arg_str0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_str *arg_str1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_str *arg_strn(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); + +ARG_EXTERN struct arg_rex *arg_rex0(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary); +ARG_EXTERN struct arg_rex *arg_rex1(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int flags, + const char *glossary); +ARG_EXTERN struct arg_rex *arg_rexn(const char *shortopts, + const char *longopts, + const char *pattern, + const char *datatype, + int mincount, + int maxcount, + int flags, + const char *glossary); + +ARG_EXTERN struct arg_file *arg_file0(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_file *arg_file1(const char *shortopts, + const char *longopts, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_file *arg_filen(const char *shortopts, + const char *longopts, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); + +ARG_EXTERN struct arg_date *arg_date0(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_date *arg_date1(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + const char *glossary); +ARG_EXTERN struct arg_date *arg_daten(const char *shortopts, + const char *longopts, + const char *format, + const char *datatype, + int mincount, + int maxcount, + const char *glossary); + +ARG_EXTERN struct arg_end *arg_end(int maxcount); + +#define ARG_DSTR_STATIC ((arg_dstr_freefn *)0) +#define ARG_DSTR_VOLATILE ((arg_dstr_freefn *)1) +#define ARG_DSTR_DYNAMIC ((arg_dstr_freefn *)3) + +/**** other functions *******************************************/ +ARG_EXTERN int arg_nullcheck(void **argtable); +ARG_EXTERN int arg_parse(int argc, char **argv, void **argtable); +ARG_EXTERN void arg_print_option(FILE *fp, + const char *shortopts, + const char *longopts, + const char *datatype, + const char *suffix); +ARG_EXTERN void arg_print_syntax(FILE *fp, void **argtable, const char *suffix); +ARG_EXTERN void arg_print_syntaxv(FILE *fp, void **argtable, const char *suffix); +ARG_EXTERN void arg_print_glossary(FILE *fp, void **argtable, const char *format); +ARG_EXTERN void arg_print_glossary_gnu(FILE *fp, void **argtable); +ARG_EXTERN void arg_print_errors(FILE *fp, struct arg_end *end, const char *progname); +ARG_EXTERN void arg_print_option_ds(arg_dstr_t ds, + const char *shortopts, + const char *longopts, + const char *datatype, + const char *suffix); +ARG_EXTERN void arg_print_syntax_ds(arg_dstr_t ds, void **argtable, const char *suffix); +ARG_EXTERN void arg_print_syntaxv_ds(arg_dstr_t ds, void **argtable, const char *suffix); +ARG_EXTERN void arg_print_glossary_ds(arg_dstr_t ds, void **argtable, const char *format); +ARG_EXTERN void arg_print_glossary_gnu_ds(arg_dstr_t ds, void **argtable); +ARG_EXTERN void arg_print_errors_ds(arg_dstr_t ds, struct arg_end *end, const char *progname); +ARG_EXTERN void arg_freetable(void **argtable, size_t n); + +ARG_EXTERN arg_dstr_t arg_dstr_create(void); +ARG_EXTERN void arg_dstr_destroy(arg_dstr_t ds); +ARG_EXTERN void arg_dstr_reset(arg_dstr_t ds); +ARG_EXTERN void arg_dstr_free(arg_dstr_t ds); +ARG_EXTERN void arg_dstr_set(arg_dstr_t ds, char *str, arg_dstr_freefn *free_proc); +ARG_EXTERN void arg_dstr_cat(arg_dstr_t ds, const char *str); +ARG_EXTERN void arg_dstr_catc(arg_dstr_t ds, char c); +ARG_EXTERN void arg_dstr_catf(arg_dstr_t ds, const char *fmt, ...); +ARG_EXTERN char *arg_dstr_cstr(arg_dstr_t ds); + +ARG_EXTERN void arg_cmd_init(void); +ARG_EXTERN void arg_cmd_uninit(void); +ARG_EXTERN void arg_cmd_register(const char *name, arg_cmdfn *proc, const char *description); +ARG_EXTERN void arg_cmd_unregister(const char *name); +ARG_EXTERN int arg_cmd_dispatch(const char *name, int argc, char *argv[], arg_dstr_t res); +ARG_EXTERN unsigned int arg_cmd_count(void); +ARG_EXTERN arg_cmd_info_t *arg_cmd_info(const char *name); +ARG_EXTERN arg_cmd_itr_t arg_cmd_itr_create(void); +ARG_EXTERN void arg_cmd_itr_destroy(arg_cmd_itr_t itr); +ARG_EXTERN int arg_cmd_itr_advance(arg_cmd_itr_t itr); +ARG_EXTERN char *arg_cmd_itr_key(arg_cmd_itr_t itr); +ARG_EXTERN arg_cmd_info_t *arg_cmd_itr_value(arg_cmd_itr_t itr); +ARG_EXTERN int arg_cmd_itr_search(arg_cmd_itr_t itr, void *k); +ARG_EXTERN void arg_mgsort(void *data, int size, int esize, int i, int k, arg_comparefn *comparefn); +ARG_EXTERN void arg_make_get_help_msg(arg_dstr_t res); +ARG_EXTERN void arg_make_help_msg(arg_dstr_t ds, char *cmd_name, void **argtable); +ARG_EXTERN void arg_make_syntax_err_msg(arg_dstr_t ds, void **argtable, struct arg_end *end); +ARG_EXTERN int arg_make_syntax_err_help_msg(arg_dstr_t ds, + char *name, + int help, + int nerrors, + void **argtable, + struct arg_end *end, + int *exitcode); +ARG_EXTERN void arg_set_module_name(const char *name); +ARG_EXTERN void arg_set_module_version(int major, int minor, int patch, const char *tag); + +/**** deprecated functions, for back-compatibility only ********/ +ARG_EXTERN void arg_free(void **argtable); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/srcs/libs/banner/banner.c b/srcs/libs/banner/banner.c new file mode 100644 index 0000000..1942b9d --- /dev/null +++ b/srcs/libs/banner/banner.c @@ -0,0 +1,42 @@ +// +// Created by xajhu on 2021/6/29 0029. +// +#include "uthash/utstring.h" + +#include "banner.h" +#include "config.h" +#include "zlog_module.h" + +void banner_show() { + FILE *fp; + UT_string *pPath; + char rdBuf[1024]; + + utstring_new(pPath); + utstring_printf(pPath, "%s/%s", cfg_get_config_directory(), BANNER_FILE); + + // 读取文件 + if ((fp = fopen(utstring_body(pPath), "r")) != NULL) { + UT_string *pBannerText; + utstring_new(pBannerText); + + while (!feof(fp)) { + memset(rdBuf, 0, 1024); + fgets(rdBuf, 1024, fp); + // 保存读取的banner信息 + utstring_bincpy(pBannerText, rdBuf, strlen(rdBuf)); + } + + fclose(fp); + + LOG_MOD(info, + ZLOG_MOD_MAIN, + "================== Banner Used ===================\n%s\n", + utstring_body(pBannerText)); + utstring_free(pBannerText); + } else { + LOG_MOD(error, ZLOG_MOD_MAIN, "Banner file does not exists: %s\n", utstring_body(pPath)); + } + + utstring_free(pPath); +} \ No newline at end of file diff --git a/srcs/libs/bitset/bitset.c b/srcs/libs/bitset/bitset.c new file mode 100644 index 0000000..1565fe4 --- /dev/null +++ b/srcs/libs/bitset/bitset.c @@ -0,0 +1,382 @@ +#include +#include +#include + +#include "bitset/bitset.h" + +/* Create a new bitset. Return NULL in case of failure. */ +bitset_t *bitset_create() { + bitset_t *bitset = NULL; + /* Allocate the bitset itself. */ + if ((bitset = (bitset_t *)malloc(sizeof(bitset_t))) == NULL) { + return NULL; + } + bitset->array = NULL; + bitset->arraysize = 0; + bitset->capacity = 0; + return bitset; +} + +/* Create a new bitset able to contain size bits. Return NULL in case of failure. */ +bitset_t *bitset_create_with_capacity(size_t size) { + bitset_t *bitset = NULL; + /* Allocate the bitset itself. */ + if ((bitset = (bitset_t *)malloc(sizeof(bitset_t))) == NULL) { + return NULL; + } + bitset->arraysize = (size + sizeof(uint64_t) * 8 - 1) / (sizeof(uint64_t) * 8); + bitset->capacity = bitset->arraysize; + if ((bitset->array = (uint64_t *)calloc(bitset->arraysize, sizeof(uint64_t))) == NULL) { + free(bitset); + return NULL; + } + return bitset; +} + +/* Create a copy */ +bitset_t *bitset_copy(const bitset_t *bitset) { + bitset_t *copy = NULL; + /* Allocate the bitset itself. */ + if ((copy = (bitset_t *)malloc(sizeof(bitset_t))) == NULL) { + return NULL; + } + memcpy(copy, bitset, sizeof(bitset_t)); + copy->capacity = copy->arraysize; + if ((copy->array = (uint64_t *)malloc(sizeof(uint64_t) * bitset->arraysize)) == NULL) { + free(copy); + return NULL; + } + memcpy(copy->array, bitset->array, sizeof(uint64_t) * bitset->arraysize); + return copy; +} + +void bitset_clear(bitset_t *bitset) { + memset(bitset->array, 0, sizeof(uint64_t) * bitset->arraysize); +} + +void bitset_shift_left(bitset_t *bitset, size_t s) { + size_t extra_words = s / 64; + int inword_shift = (int)(s % 64); + size_t as = bitset->arraysize; + if (inword_shift == 0) { + bitset_resize(bitset, as + extra_words, FALSE); + // could be done with a memmove + for (size_t i = as + extra_words; i > extra_words; i--) { + bitset->array[i - 1] = bitset->array[i - 1 - extra_words]; + } + } else { + bitset_resize(bitset, as + extra_words + 1, TRUE); + bitset->array[as + extra_words] = bitset->array[as - 1] >> (64 - inword_shift); + for (size_t i = as + extra_words; i >= extra_words + 2; i--) { + bitset->array[i - 1] = (bitset->array[i - 1 - extra_words] << inword_shift) | + (bitset->array[i - 2 - extra_words] >> (64 - inword_shift)); + } + bitset->array[extra_words] = bitset->array[0] << inword_shift; + } + for (size_t i = 0; i < extra_words; i++) { + bitset->array[i] = 0; + } +} + +void bitset_shift_right(bitset_t *bitset, size_t s) { + size_t extra_words = s / 64; + int inword_shift = (int)(s % 64); + size_t as = bitset->arraysize; + if (inword_shift == 0) { + // could be done with a memmove + for (size_t i = 0; i < as - extra_words; i++) { + bitset->array[i] = bitset->array[i + extra_words]; + } + bitset_resize(bitset, as - extra_words, FALSE); + + } else { + for (size_t i = 0; i + extra_words + 1 < as; i++) { + bitset->array[i] = (bitset->array[i + extra_words] >> inword_shift) | + (bitset->array[i + extra_words + 1] << (64 - inword_shift)); + } + bitset->array[as - extra_words - 1] = (bitset->array[as - 1] >> inword_shift); + bitset_resize(bitset, as - extra_words, FALSE); + } +} + +/* Free memory. */ +void bitset_free(bitset_t *bitset) { + free(bitset->array); + free(bitset); +} + +/* Resize the bitset so that it can support newarraysize * 64 bits. Return TRUE in case of success, FALSE for failure. */ +int bitset_resize(bitset_t *bitset, size_t newarraysize, int padwithzeroes) { + size_t smallest = newarraysize < bitset->arraysize ? newarraysize : bitset->arraysize; + if (bitset->capacity < newarraysize) { + uint64_t *newarray; + bitset->capacity = newarraysize * 2; + if ((newarray = (uint64_t *)realloc(bitset->array, sizeof(uint64_t) * bitset->capacity)) == NULL) { + free(bitset->array); + return FALSE; + } + bitset->array = newarray; + } + if (padwithzeroes && (newarraysize > smallest)) { + memset(bitset->array + smallest, 0, sizeof(uint64_t) * (newarraysize - smallest)); + } + bitset->arraysize = newarraysize; + return TRUE; // success! +} + +size_t bitset_count(const bitset_t *bitset) { + size_t card = 0; + size_t k = 0; + // assumes that long long is 8 bytes + for (; k + 7 < bitset->arraysize; k += 8) { + card += __builtin_popcountll(bitset->array[k]); + card += __builtin_popcountll(bitset->array[k + 1]); + card += __builtin_popcountll(bitset->array[k + 2]); + card += __builtin_popcountll(bitset->array[k + 3]); + card += __builtin_popcountll(bitset->array[k + 4]); + card += __builtin_popcountll(bitset->array[k + 5]); + card += __builtin_popcountll(bitset->array[k + 6]); + card += __builtin_popcountll(bitset->array[k + 7]); + } + for (; k + 3 < bitset->arraysize; k += 4) { + card += __builtin_popcountll(bitset->array[k]); + card += __builtin_popcountll(bitset->array[k + 1]); + card += __builtin_popcountll(bitset->array[k + 2]); + card += __builtin_popcountll(bitset->array[k + 3]); + } + for (; k < bitset->arraysize; k++) { + card += __builtin_popcountll(bitset->array[k]); + } + return card; +} + +int bitset_inplace_union(bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + for (size_t k = 0; k < minlength; ++k) { + b1->array[k] |= b2->array[k]; + } + if (b2->arraysize > b1->arraysize) { + size_t oldsize = b1->arraysize; + if (!bitset_resize(b1, b2->arraysize, FALSE)) { + return FALSE; + } + memcpy(b1->array + oldsize, b2->array + oldsize, (b2->arraysize - oldsize) * sizeof(uint64_t)); + } + return TRUE; +} + +size_t bitset_minimum(const bitset_t *bitset) { + for (size_t k = 0; k < bitset->arraysize; k++) { + uint64_t w = bitset->array[k]; + if (w != 0) { + return __builtin_ctzll(w) + k * 64; + } + } + return 0; +} + +size_t bitset_maximum(const bitset_t *bitset) { + for (size_t k = bitset->arraysize; k > 0; k--) { + uint64_t w = bitset->array[k - 1]; + if (w != 0) { + return 63 - __builtin_clzll(w) + (k - 1) * 64; + } + } + return 0; +} + +/* Returns TRUE if bitsets share no common elements, FALSE otherwise. + * + * Performs early-out if common element found. */ +int bitsets_disjoint(const bitset_t *b1, const bitset_t *b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + + for (size_t k = 0; k < minlength; k++) { + if ((b1->array[k] & b2->array[k]) != 0) { + return FALSE; + } + } + return TRUE; +} + +/* Returns TRUE if bitsets contain at least 1 common element, FALSE if they are + * disjoint. + * + * Performs early-out if common element found. */ +int bitsets_intersect(const bitset_t *b1, const bitset_t *b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + + for (size_t k = 0; k < minlength; k++) { + if ((b1->array[k] & b2->array[k]) != 0) { + return TRUE; + } + } + return FALSE; +} + +/* Returns TRUE if b has any bits set in or after b->array[starting_loc]. */ +static int any_bits_set(const bitset_t *b, size_t starting_loc) { + if (starting_loc >= b->arraysize) { + return FALSE; + } + for (size_t k = starting_loc; k < b->arraysize; k++) { + if (b->array[k] != 0) { + return TRUE; + } + } + return FALSE; +} + +/* Returns TRUE if b1 has all of b2's bits set. + * + * Performs early out if a bit is found in b2 that is not found in b1. */ +int bitset_contains_all(const bitset_t *b1, const bitset_t *b2) { + for (size_t k = 0; k < b1->arraysize; k++) { + if ((b1->array[k] & b2->array[k]) != b2->array[k]) { + return FALSE; + } + } + if (b2->arraysize > b1->arraysize) { + /* Need to check if b2 has any bits set beyond b1's array */ + return !any_bits_set(b2, b1->arraysize); + } + return TRUE; +} + +size_t bitset_union_count(const bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t answer = 0; + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + size_t k = 0; + for (; k + 3 < minlength; k += 4) { + answer += __builtin_popcountll(b1->array[k] | b2->array[k]); + answer += __builtin_popcountll(b1->array[k + 1] | b2->array[k + 1]); + answer += __builtin_popcountll(b1->array[k + 2] | b2->array[k + 2]); + answer += __builtin_popcountll(b1->array[k + 3] | b2->array[k + 3]); + } + for (; k < minlength; ++k) { + answer += __builtin_popcountll(b1->array[k] | b2->array[k]); + } + if (b2->arraysize > b1->arraysize) { + //k = b1->arraysize; + for (; k + 3 < b2->arraysize; k += 4) { + answer += __builtin_popcountll(b2->array[k]); + answer += __builtin_popcountll(b2->array[k + 1]); + answer += __builtin_popcountll(b2->array[k + 2]); + answer += __builtin_popcountll(b2->array[k + 3]); + } + for (; k < b2->arraysize; ++k) { + answer += __builtin_popcountll(b2->array[k]); + } + } else { + //k = b2->arraysize; + for (; k + 3 < b1->arraysize; k += 4) { + answer += __builtin_popcountll(b1->array[k]); + answer += __builtin_popcountll(b1->array[k + 1]); + answer += __builtin_popcountll(b1->array[k + 2]); + answer += __builtin_popcountll(b1->array[k + 3]); + } + for (; k < b1->arraysize; ++k) { + answer += __builtin_popcountll(b1->array[k]); + } + } + return answer; +} + +void bitset_inplace_intersection(bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + size_t k = 0; + for (; k < minlength; ++k) { + b1->array[k] &= b2->array[k]; + } + for (; k < b1->arraysize; ++k) { + b1->array[k] = 0; // memset could, maybe, be a tiny bit faster + } +} + +size_t bitset_intersection_count(const bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t answer = 0; + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + for (size_t k = 0; k < minlength; ++k) { + answer += __builtin_popcountll(b1->array[k] & b2->array[k]); + } + return answer; +} + +void bitset_inplace_difference(bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + size_t k = 0; + for (; k < minlength; ++k) { + b1->array[k] &= ~(b2->array[k]); + } +} + +size_t bitset_difference_count(const bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + size_t k = 0; + size_t answer = 0; + for (; k < minlength; ++k) { + answer += __builtin_popcountll(b1->array[k] & ~(b2->array[k])); + } + for (; k < b1->arraysize; ++k) { + answer += __builtin_popcountll(b1->array[k]); + } + return answer; +} + +int bitset_inplace_symmetric_difference(bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + size_t k = 0; + for (; k < minlength; ++k) { + b1->array[k] ^= b2->array[k]; + } + if (b2->arraysize > b1->arraysize) { + size_t oldsize = b1->arraysize; + if (!bitset_resize(b1, b2->arraysize, FALSE)) { + return FALSE; + } + memcpy(b1->array + oldsize, b2->array + oldsize, (b2->arraysize - oldsize) * sizeof(uint64_t)); + } + return TRUE; +} + +size_t bitset_symmetric_difference_count(const bitset_t *CBITSET_RESTRICT b1, const bitset_t *CBITSET_RESTRICT b2) { + size_t minlength = b1->arraysize < b2->arraysize ? b1->arraysize : b2->arraysize; + size_t k = 0; + size_t answer = 0; + for (; k < minlength; ++k) { + answer += __builtin_popcountll(b1->array[k] ^ b2->array[k]); + } + if (b2->arraysize > b1->arraysize) { + for (; k < b2->arraysize; ++k) { + answer += __builtin_popcountll(b2->array[k]); + } + } else { + for (; k < b1->arraysize; ++k) { + answer += __builtin_popcountll(b1->array[k]); + } + } + return answer; +} + +int bitset_trim(bitset_t *bitset) { + size_t newsize = bitset->arraysize; + while (newsize > 0) { + if (bitset->array[newsize - 1] == 0) { + newsize -= 1; + } else { + break; + } + } + if (bitset->capacity == newsize) { + return TRUE; // nothing to do + } + bitset->capacity = newsize; + bitset->arraysize = newsize; + uint64_t *newarray; + if ((newarray = (uint64_t *)realloc(bitset->array, sizeof(uint64_t) * bitset->capacity)) == NULL) { + free(bitset->array); + return FALSE; + } + bitset->array = newarray; + return TRUE; +} diff --git a/srcs/libs/cmdline/cmd_menu.c b/srcs/libs/cmdline/cmd_menu.c new file mode 100644 index 0000000..579a4c0 --- /dev/null +++ b/srcs/libs/cmdline/cmd_menu.c @@ -0,0 +1,712 @@ +// +// Created by xajhu on 2021/8/3 0003. +// +#include +#include + +#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L + +#include + +#else +#include +#endif + +#include "args/argtable3.h" +#include "cmdline.h" +#include "user_errno.h" +#include "task_manager.h" +#include "init.h" +#include "crypto.h" +#include "misc.h" +#include "config.h" +#include "s2j/s2j.h" +#include "msg_queue.h" +#include "prj_config.h" + +#define REG_ICASE (ARG_REX_ICASE) + +typedef void (*HelpCmdCb)(void *, const char *, void *); + +typedef int (*ProcessCmdCb)(void **, const char *, void *); + +typedef struct { + void *argTbl; + int nArgItem; + int *pErrCode; + ProcessCmdCb pCmd; + HelpCmdCb pHelp; + const char *pDesc; +} ARG_TBL_INFO, *PARG_TBL_INFO; + +static PARG_TBL_INFO g_pArgTbl = NULL; +static unsigned int g_nArgTbl = 0; +static const char *g_toolsKey[][2] = { + {"cfg_all", "get all configuration information" }, + {"mem_info", "show the memory alloc information" }, + {"sys_info", "show the system and hardware information"}, +}; + +static int get_reg_cmd(void *pTbl[]) { + return ((arg_rex_t *)pTbl[0])->count; +} + +static void *get_arg_err(void *pTbl[], PARG_TBL_INFO pInfo) { + return pTbl[pInfo->nArgItem - 1]; +} + +static arg_lit_t *get_help_cmd(void *pTbl[], PARG_TBL_INFO pInfo) { + return pTbl[pInfo->nArgItem - 2]; +} + +static void show_help(const char *pAppName) { + int i; + for (i = 0; i < g_nArgTbl; i++) { + if (i == 0) { + printf("Usage: \033[1;33m%s", pAppName); + } else { + printf(" \033[1;33m%s", pAppName); + } + arg_print_syntax(stdout, g_pArgTbl[i].argTbl, "\n"); + } + + printf("\033[0m\nThe Intrusion Detection Systems agent application\n"); + printf("\nMandatory arguments to long options are mandatory for short options too.\n"); + arg_print_glossary(stdout, g_pArgTbl[i - 1].argTbl, " \033[1;32m%-30s %s\033[0m\n"); + printf("\nSupport subcommand: \n"); + + for (i = 0; i < g_nArgTbl - 1; i++) { + if (g_pArgTbl[i].pDesc) { + printf("%s", g_pArgTbl[i].pDesc); + arg_print_glossary(stdout, g_pArgTbl[i].argTbl, " %-30s %s\n"); + } + } + + printf("\n\nTry '\033[1;31m%s --help\033[0m' for more information.\n", pAppName); +} + +static void cmdn_help(void *pTbl, const char *pName, void *pErr) { + if (pErr != NULL) { + printf("\033[1;31m"); + arg_print_errors(stdout, pErr, ""); + printf("\033[0m\n"); + } + + printf("usage : %s", pName); + arg_print_syntax(stdout, pTbl, "\n"); + printf("\nMandatory arguments to long options are mandatory for short options too.\n"); + arg_print_glossary(stdout, pTbl, "%-30s %s\n"); +} + +static void cmd2_help(void *pTbl, const char *pName, void *pErr) { + int i; + + cmdn_help(pTbl, pName, pErr); + + printf("\n\nSupport keys:\n"); + printf(" \033[1;4;35mConfiguration\033[0m:\n"); + + for (i = 0; i < ARRAY_SIZE(g_toolsKey); i++) { + printf(" \033[4m%s\033[0m:\t %s\n", g_toolsKey[i][0], g_toolsKey[i][1]); + } +} + +static int on_cmd1(void *pTbl[], const char *pName, void *pInfo) { + int ret; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + const char *pCfgFile = ((arg_file_t *)pTbl[1])->filename[0]; + const char *pCfgDir = ((arg_file_t *)pTbl[2])->filename[0]; + const char *pKey = ((arg_str_t *)pTbl[3])->sval[0]; + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, NULL); + return ERR_MENU_EXIT; + } + + if ((ret = user_init(pCfgFile, pCfgDir, pKey, 0)) != ERR_SUCCESS) { + printf("System init error: %d\n", ret); + return ret; + } + + return ret; +} + +static cJSON *s2j_mq_msg(void *pObj) { + PMQ_CMD_MSG pMsg = (PMQ_CMD_MSG)pObj; + s2j_create_json_obj(pJsonObj); + + s2j_json_set_basic_element(pJsonObj, pMsg, string, cmd); + s2j_json_set_basic_element(pJsonObj, pMsg, string, key); + s2j_json_set_basic_element(pJsonObj, pMsg, string, value); + + return pJsonObj; +} + +static int on_cmd2(void *pTbl[], const char *pName, void *pInfo) { + int ret, i; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + MQ_CMD_MSG msg; + cJSON *pJsonObj; + const char *pJsonStr; + + const char *pSvr = ((arg_str_t *)pTbl[1])->sval[0]; + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, NULL); + return ERR_MENU_EXIT; + } + + memset(&msg, 0, sizeof(MQ_CMD_MSG)); + + strncpy(msg.cmd, ((arg_str_t *)pTbl[2])->sval[0], MAX_PATH - 1); + strncpy(msg.key, ((arg_str_t *)pTbl[3])->sval[0], MAX_PATH - 1); + strncpy(msg.value, ((arg_str_t *)pTbl[4])->sval[0], MAX_PATH - 1); + + if (strcmp(msg.cmd, "get") != 0 && strcmp(msg.cmd, "set") != 0) { + printf("Error command: %s\n", msg.cmd); + return -ERR_INPUT_PARAMS; + } + + ret = FALSE; + for (i = 0; i < ARRAY_SIZE(g_toolsKey); i++) { + if (strcmp(g_toolsKey[i][0], msg.key) == 0) { + ret = TRUE; + break; + } + } + + if (ret == FALSE) { + printf("Error key: %s\n", msg.key); + return -ERR_INPUT_PARAMS; + } + + pJsonObj = s2j_mq_msg(&msg); + + if (pJsonObj == NULL) { + return -ERR_JSON_CREAT_OBJ; + } + + pJsonStr = cJSON_PrintUnformatted(pJsonObj); +#ifdef ZEROMQ_ON + ret = mq_cmd_run(pSvr, pJsonStr); +#else + ret = ERR_SUCCESS; +#endif + cJSON_Delete(pJsonObj); + free((void *)pJsonStr); + + return (ret == ERR_SUCCESS) ? ERR_MENU_EXIT : ret; +} + +static int on_cmd3(void *pTbl[], const char *pName, void *pInfo) { + const char *pRet; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + int type = ((arg_lit_t *)pTbl[1])->count; + const char *pValue = ((arg_str_t *)pTbl[2])->sval[0]; + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, NULL); + return ERR_MENU_EXIT; + } + + if (type == 0) { + pRet = base64_encode((unsigned char *)pValue, strlen(pValue)); + } else { + pRet = (const char *)base64_decode(pValue, NULL); + } + + if (pRet == NULL) { + return type == 0 ? -ERR_EVP_ENCRYPTION : -ERR_EVP_DECRYPTION; + } + + printf("Base64 %s: {%s} --> [%s]\n", type == 0 ? "encode" : "decode", pValue, pRet); + + free((void *)pRet); + return ERR_MENU_EXIT; +} + +static int on_cmd4(void *pTbl[], const char *pName, void *pInfo) { + char *pHashValue = NULL; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + const char *type = ((arg_str_t *)pTbl[1])->sval[0]; + const char *pFile = ((arg_file_t *)pTbl[2])->filename[0]; + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, NULL); + return ERR_MENU_EXIT; + } + + if (strcmp(type, "sha256") == 0) { + hash_digest_file(HASH_TYPE_SHA256, pFile, &pHashValue); + } else if (strcmp(type, "sha1") == 0) { + hash_digest_file(HASH_TYPE_SHA1, pFile, &pHashValue); + } else if (strcmp(type, "md5") == 0) { + hash_digest_file(HASH_TYPE_MD5, pFile, &pHashValue); + } else { + printf("Unsupported type: %s\n", type); + return -ERR_UNSUP_EVP_TYPE; + } + + printf("%s %s hash value: [%s]\n", type, pFile, pHashValue); + + free(pHashValue); + return ERR_MENU_EXIT; +} + +static int on_cmd5(void *pTbl[], const char *pName, void *pInfo) { + int algType; + const char *strRet; + unsigned char *buf; + int outSize = 0; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + int encrypt = ((arg_lit_t *)pTbl[1])->count; + const char *alg = ((arg_str_t *)pTbl[2])->sval[0]; + const char *key = ((arg_str_t *)pTbl[3])->sval[0]; + const char *data = ((arg_str_t *)pTbl[4])->sval[0]; + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, NULL); + return ERR_MENU_EXIT; + } + + if (strcmp(alg, "3des_ecb") == 0) { + algType = DES3_ECB_PKCS7PADDING; + } else if (strcmp(alg, "3des_cbc") == 0) { + algType = DES3_CBC_PKCS7PADDING; + } else if (strcmp(alg, "3des_ofb") == 0) { + algType = DES3_OFB_PKCS7PADDING; + } else if (strcmp(alg, "aes128_ecb") == 0) { + algType = AES128_ECB_PKCS7PADDING; + } else if (strcmp(alg, "aes128_ecb_sha1") == 0) { + algType = AES128_ECB_PKCS7PADDING_SHA1PRNG; + } else if (strcmp(alg, "aes128_cbc") == 0) { + algType = AES128_CBC_PKCS7PADDING; + } else if (strcmp(alg, "aes128_ofb") == 0) { + algType = AES128_OFB_PKCS7PADDING; + } else if (strcmp(alg, "aes192_ecb") == 0) { + algType = AES192_ECB_PKCS7PADDING; + } else if (strcmp(alg, "aes192_cbc") == 0) { + algType = AES192_CBC_PKCS7PADDING; + } else if (strcmp(alg, "aes192_ofb") == 0) { + algType = AES192_OFB_PKCS7PADDING; + } else if (strcmp(alg, "aes256_ecb") == 0) { + algType = AES256_ECB_PKCS7PADDING; + } else if (strcmp(alg, "aes256_cbc") == 0) { + algType = AES256_CBC_PKCS7PADDING; + } else if (strcmp(alg, "aes256_ofb") == 0) { + algType = AES256_OFB_PKCS7PADDING; + } else { + printf("Unsupported cipher algorithms: %s\n", alg); + return -ERR_UNSUP_EVP_TYPE; + } + + if (encrypt > 0) { + if (symmetric_encrypto(algType, (unsigned char *)data, strlen(data), &buf, &outSize, key) != ERR_SUCCESS) { + printf("Unsupported aes algorithms: %s\n", alg); + return -ERR_EVP_ENCRYPTION; + } else { + strRet = base64_encode((unsigned char *)buf, outSize); + } + } else { + unsigned char *pBase64 = (unsigned char *)base64_decode(data, (unsigned int *)&outSize); + + if (pBase64 == NULL) { + printf("Base64 decode error: %s\n", data); + return -ERR_EVP_DECRYPTION; + } + + if (symmetric_decrypto(algType, pBase64, outSize, &buf, &outSize, key) != ERR_SUCCESS) { + printf("Unsupported aes algorithms: %s\n", alg); + free((void *)pBase64); + return -ERR_EVP_DECRYPTION; + } else { + buf[outSize] = 0; + strRet = strdup((const char *)buf); + } + } + + printf("AES %s: {%s} --> [%s]\n", encrypt > 0 ? "encryption" : "decryption", data, strRet); + + free(buf); + free((void *)strRet); + return ERR_MENU_EXIT; +} + +static int on_cmd6(void *pTbl[], const char *pName, void *pInfo) { + unsigned char *buf; + int outSize = 0; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + const char *pKeygen = get_config_keygen(); + const char *pKey = ((arg_str_t *)pTbl[1])->sval[0]; + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, NULL); + return ERR_MENU_EXIT; + } + + if (symmetric_encrypto(DES3_CBC_PKCS7PADDING, (unsigned char *)pKey, strlen(pKey), &buf, &outSize, pKeygen) != + ERR_SUCCESS) { + free((void *)pKeygen); + return -ERR_EVP_ENCRYPTION; + } else { + const char *strRet = base64_encode((unsigned char *)buf, outSize); + printf("Key: [%s]\n", strRet); + printf("Keygen: {%s} --> [%s]\n", pKey, strRet); + free((void *)strRet); + } + + free(buf); + free((void *)pKeygen); + return ERR_MENU_EXIT; +} + +#ifdef DHCPD_ON +static int on_cmd8(void *pTbl[], const char *pName, void *pInfo) { + int ret; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + const char *pCfgFile = ((arg_file_t *)pTbl[1])->filename[0]; + const char *pCfgDir = ((arg_file_t *)pTbl[2])->filename[0]; + const char *pIfName = ((arg_str_t *)pTbl[3])->sval[0]; + const char *pKey = ((arg_str_t *)pTbl[4])->sval[0]; + + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, pTbl); + return ERR_MENU_EXIT; + } + + if ((ret = user_init(pCfgFile, pCfgDir, pKey, 0)) != ERR_SUCCESS) { + printf("System init error: %d\n", ret); + return ret; + } + + dhcpd_init(MODE_DHCP_SERVER, pIfName); + return ERR_SUCCESS; +} +#endif + +#ifdef OPENDHCPD_ON + +typedef struct { + int mode; + const char *pIni; + const char *pStatus; + const char *pIfName; +} DHCPD_SETUP, *PDHCPD_SETUP; + +static void dhcpd_task(void *pArg) { + PDHCPD_SETUP p = (PDHCPD_SETUP)pArg; + + if (p) { + //dhcpd_init(MODE_DHCP_SERVER, p->pIfName); + //dhcpd_main(p->mode, p->pIni, p->pStatus, p->pIfName); + + if (p->pIni) { + free((void *)p->pIni); + } + + if (p->pStatus) { + free((void *)p->pStatus); + } + + if (p->pIfName) { + free((void *)p->pIfName); + } + + free(p); + } +} + +static int on_cmd7(void *pTbl[], const char *pName, void *pInfo) { + int ret; + // PDHCPD_SETUP p; + static uv_thread_t uvThread; + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + int mode = ((arg_lit_t *)pTbl[1])->count; + const char *pCfgFile = ((arg_file_t *)pTbl[2])->filename[0]; + const char *pCfgDir = ((arg_file_t *)pTbl[3])->filename[0]; + const char *piniFile = ((arg_file_t *)pTbl[4])->filename[0]; + const char *pstatFile = ((arg_file_t *)pTbl[5])->filename[0]; + const char *pIfName = ((arg_str_t *)pTbl[6])->sval[0]; +#ifdef USERVNI_ON + int *pVni = ((arg_int_t *)pTbl[7])->ival; + const char *pKey = ((arg_str_t *)pTbl[8])->sval[0]; +#else + const char *pKey = ((arg_str_t *)pTbl[7])->sval[0]; +#endif + int help = get_help_cmd(pTbl, pArg)->count; + + if (pArg->pHelp && help > 0) { + pArg->pHelp(pArg->argTbl, pName, pTbl); + return ERR_MENU_EXIT; + } + +#ifdef USERVNI_ON + if (pVni && *pVni > 0) { + cfg_set_user_vni_id(*pVni); + } else { + cfg_set_user_vni_id(0); + } +#endif + + if ((ret = user_init(pCfgFile, pCfgDir, pKey, 0)) != ERR_SUCCESS) { + printf("System init error: %d\n", ret); + return ret; + } + + dhcpd_init(MODE_DHCP_SERVER, pIfName); +#if 0 + p = (PDHCPD_SETUP)malloc(sizeof(DHCPD_SETUP)); + + if (p) { + p->mode = mode; + p->pIni = piniFile ? strdup(piniFile) : NULL; + p->pStatus = pstatFile ? strdup(pstatFile) : NULL; + p->pIfName = pIfName ? strdup(pIfName) : NULL; + uv_thread_create(&uvThread, dhcpd_task, p); + } +#endif + return ERR_SUCCESS; +} +#endif + +static int on_cmd_(void *pTbl[], const char *pName, void *pInfo) { + PARG_TBL_INFO pArg = (PARG_TBL_INFO)pInfo; + int help = get_help_cmd(pTbl, pArg)->count; + //int version = ((arg_lit_t *)pTbl[0])->count; + + if (help > 0) { + show_help(pName); + } else { + printf("Application information: %s (Build: %s %s GCC Ver:%s) With %lu(bits) OS\n", PROJECT_GIT_VERSION, __DATE__, + __TIME__, __VERSION__, sizeof(int *) * 8); + +#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L + printf("OpenSSL information: %s (%s, %s)\n", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_BUILT_ON), + SSLeay_version(SSLEAY_PLATFORM)); +#else + printf("OpenSSL information: %s (%s, %s)\n", OPENSSL_VERSION_TEXT, OpenSSL_version(OPENSSL_BUILT_ON), + OpenSSL_version(OPENSSL_PLATFORM)); +#endif + } + + return ERR_MENU_EXIT; +} + +int menu_run(int argc, char **argv) { + int ret = ERR_MENU_EXIT; + int i, flag = FALSE; + const char *pAppName = basename_v2(argv[0]); + + /***************************************************************** + * 系统服务启动参数 + ******************************************************************/ + // clang-format off + arg_rex_t *cmd1 = arg_rex1(NULL, NULL, "start", NULL, REG_ICASE, NULL); + arg_file_t *cfgfile = arg_filen("c", "config", "[file]", 0, 1, + "\tSpecify the current application configuration file path"); + arg_file_t *cfgdir = arg_file1("d", "directory", "

      ?7iKvxs2~&iR=+YH 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�|8_=xUVRh%0c7Hzrn**!n|i(7uMK;sB-Q9d&oxY~-m#=&}VB4Q=88 zFH$YVn5uIFbgQ1r+q_da_d`dIDBMkp=UR{AqG6kp;5kZ$%Kw1aKz?w}Vm8#2edF3u zeG{J%2^?MDp_pqzZk=g;HoZHZMCH2HTQ;7C9o_m#TAze(NMOIDeLvTk{x3je_h zOv;{h>|aFTFwhoXmS}YiXI>$?&M;UZ%JPeN$T<|D_yC8}P%*@p7KHUlvj&ytV=L7k-1^H00gTs<^)g}E*rp`%}viGIPA*M`cJ zVr#o@oJfTzjf)GZkwPAFl)`lJ2-P4T8&vZleeb$x$WPC*k2e*UX7AE_y|g9Wut|X557v@*j;6-$5+k* zFHrTwoxLIs)*iXIz>_vy#1Ap`k5xw9WJ+{36!kvCFc9?K0oo$6wMFXh1{~?Vr^DYc z=8Th3)cYtJ8r@S{5HJ^kJF$_`RuAVkn8662G^aA)E#)^*Bd$R8_^VezJM`t3iC(2& zM+r(P7;=hX=AO<))gsbZj-ET9KNQTw*(yIay#VOE@Fa{TZ`u9|qMEvV#+=tq1LlPUw zT(cC+C#ham&b7wLKE1rI=1ZOP#N)moA)r`@Wq|d0biE}V0h(xSzrSe6&;TcwrAAb3u_2AQ})hEvLAw%vWz4Twv>9`@)n9(sX z{H`_dm{DwrT;vYiq>z}fi9u&e&f%+*y~BgITdz+J;hXPwj!x8xP+x9dJuHMm181ee z(1O8eZ^T;2ra_1FN%R&i%_3+dsXEK0m~f~br~g~$JrMpZ2H6aRqEcNY@pwPTbv|gq zVPHC87powBz$$ULns9+Ew!nQeuUr#fkMRSS22vzMaxWy8ZepV*v`S-ek>>YwyKDNN zsCgluS0>>QUhk*eVFHU?!FmB)7c3p4%7c+g_?&hj1kbOOzB%rxU@;>$F{fu|o%)kK z-g&vVeYj8mdbM@5b#i!g%;rrQ1f{Pm?dPW5Pv{h3nSb~6!2;zfUXk=1|hco!er9< zcVE*Il`IiW4%8`Ro{1M%1glLbuLHYk0(;GBW&-;Ge067_M+xdKz^`htc4qJ^yUfoB z{zhtW_-g0i?en9p?VY!lBJ8}~-#gfu0Q-bmJyYE_Ad~N&{R&5*jR2CMinCQGzM9l7!Hk$oR7g=u-;*vk&Wki;YXh#C?ue z54dfOJ9>S1W|N}eh|$#Z#Vp9WEy_{Usu$30;BHI*v*=%TbmnB!ODaXvIdG zXu=O5trGW=N9**tafgi>#aot}>!V&~(e3I6n|#pbNGBbi2RKKEdMirQwTPllnuKm+ zZ{jK%Kx}#$mi>G7XS*&Nb4G_UNrh%RhBKzN;7TFg8-~5-vyDVBcT6h$$_>MXN+)CV zBs2#%L_6Ah@Ei4RnHFMZl8AU2XHDgDe z<&9pw8!SOyq-(P{%=v^#9 z@|I_uA2YFjEAabq=(n2Pi!3OuqQcg3`d~Dqi_3NaQ`BDQ>Lf$8s9Vc=r{#Z%efYFupIJzJl^~OU6;1;WME6xYKn2Xf``I7iCdImj9 zl*%i4nf*w&xS^KxHR)oqz4l&T{)e*C*A!2rl$ZuCbD4a+`-tlcOL?u3+110i_DDKUnCZo6$ zFK+{4yxtMzy}IdmwFw(0)(pp}Mep0dSAW+8XXhQsn&2;P3UFKYlDKsVfNpq>M;5%P zf2Uw}sJWh&qY-PESuY3~G;BXPH79vd? zblembcIc#Dc-+u2RyfGWIOB2_jX$=1Mk8|xL4-7E6^w+2)@nY`lv>f8Sy6=ubBmyv zTd3)|MNrEv^sSkeTa@!FR3o>TaLaQ4mQ6vnjGbemTvnRHUbZP_u@dm?b9vWqin-(> z&pwfRAwL=9s_B(8^Oa`VRjaa-ZYuH=XQ)n43Ol`OmNfB_t7$H_D_MGj)+NVvn(ZU@ z&JM!&l0M1+RzRu0aeyp#P?ZsZsg)1ADg8Fk>&f@WpcpY+6L zXYG@hb2nPDSEIsBrR9wLl2lNVA8OU&u<(@1NqTV5pa-j&^xztbre@KDJ=NXn!RpTS z;9A7^!|21FbHbC!D=vlGh~xQ;BTnzFs92fnd=Sky!X^S8^H;m{mZ?U`gGkp1XC)@d z!$~5g`yFEWB_Hz+k6vz_ynV5=yY+hiTDepbc#RUVQTMc2D_ zZX8>~!{$D^wYeReItCSbO*wKYC(d0)u{)mA?ZNuM&!iW#M>BqUwexoG;H0Lal>TXB z4YqBwz!I8%evNq{LYSd_m`*Rr#Isu2Z3i zJFzz!Z}1tzU~E6ty0Q|keP*nc*O&RFNnWT-KeyXj$`Hz!fi<%nVqAGfhaz$|0o1zH zSLlXIFdcNp(AiqG1Xa5QHF>nX#xP`oY+wwX($T0%M^iSPc?+U&KQ!-4mzpt$)3lx& z8{BSoK-F`Z*%bFlCZ1rV`y_LYG2eX};7)1SyQ|43oBVVeZl{dEESIk0kt!iOV!1*0 zn5_%0P_FO&6edI-p!V{ytJ*hjER}AqXI)gYh~K4S`NRUajai=7u&7F6_pNDvUPE4P zfPT|h(q>priR|2TK~tG4r(IT+GTn4plP#OmuBk%2e&eI7p=dW<(ar6pwqjZKi)>H8^1bo(GsmJB)N0<` z$ezy6LzqfQ5vzsa-lh`ry`7m$Q@^99_U>@LW7x;M%_}TI=flz8ctxXp>RuB%B)o%S zjIeOizu2bd+(WaxL5d}%PHdqGGc`!M)C!h5OWFeA^xkve&?+UTOu*(EVLFQj7(0Gz z{H>`xiUa3v{cJzXrB+)Pl0ZdbJUTxfg}KxUouy_EdD+_CSezMQi2XV{jwP>*(^yA> z`sgu#x^m)2OtTrcqzmsOOFzWDsORmVqvrP{Rv23+wtPE+DFH^697aQtRuPoFPPG)z z6csTmw;3_kyDN;+v9^Xei;?UU*7dpKW86^b)tJz4hJcfW4-X5cH(_WrtXhjE7%~ht z&VYuF;Xo?q09vZr!r}T*r$SHVpyyqmzQ5wB@N-?h5!N-ZkbJRD<2pwMv$;^ak`b&goX&$p&jkP23#j5_5w$cm1tq z7epcLwQsUTBHnj(f;`%o@Ez&L7#Gw$$2o0FY{#9UWE$zYm7cr3e3N*VC^@go1iC5d zFvV~TyP`%=R#NbuQlKl_!Ss zDP#DX?AtZ|%~qpxv+kGO{ll%3a(!R=<@n@i@8H|om!2OU?$^Gvb#%1#Q|&AJd&ei& z)q?!=8x?=Ji8Ke)hHE|CX}~Uw%F5?mk4hMOlMvl5CbA|mdA(;zd&7=)+R9#U$BOBq zgo22;eu>Pfi{BG*uePVc%}y^oKhMxkHskG@0@k7l-}SIUjAlDT9l>FDOZR&G;pQpJ zRd;vDiL(HvXjKD-LL9{cN@u<`A()pqj8?F*Mjg`4-+obwmXelUt-#c?Twq2_V`>04 z4hL)SM_ee?2zT+bRvoEr$#6S~nfs_Wv`@GL!I=i8_yJqb+q0=zaX?D!6L?XSYYGl< z>hMdk3hw{zv>)+%!P~l1PUF`$C8csL`@C5|52g{&Cx+Vl%1}j2S9c_)yXt(?N!NF{ zxZz3H^sMl=>Zb#nQo_x_Vm=xyaZPTTN69>>E9#02(;vO69DN{1KVzBi3yc|^nC4Ay z$q)EO)u+Tycp2&L(BrlBy22cq7UL)t9}#*CP*&6hFDY5OC_*B@K&7~%E(U;BdqOIc zY1JZ_Qh{&k5FfmIcbQ?O^7CpwUfTl_?nfAr291 z>Kf7H6pW__^J>KtRjV|A!DfeXKE&$osnqZxI8=iQOz%~vKj4Yeyg|DH?DVr1XeC72Dis)Zmcxj$tx3(r;1ra^PXJHta<=@#@_rPXRhC{RmUL+giSc?p$i)&eF)Yk! z>^q2xi?mm}q~O=<`tL34lAnXWHYtfbeEpVhKK_KD!B04;tN)Zet%$Zfb#5=f*i&U@ znwKKxeHj)m^ddFKAc58O0qH8$+>Xzuf4q(g%E9H{#c=3Gw5vQ&LA}s*w0QaNwHQ?y z&^dtWZ+Cq1pJMVx47lSpR9eD(S{$2*V5CEpYg$Z)bntpJ!nr?IkbHpL#l8-`Ovqt=M=Xa0B`~LRC0hiAcn`5&rKm0j|k$ZB}9vm4; zrltq4us=%mQ2eiJ?!Mbsh5GejnN85kRVG!tYkS#-PKh=D6#NMh{-tkfF9ccw%CrF0 z`lfSm+a`@Yi1Plmw&O=#=w6$FT};a}U)Tk)KsK(w(YRCEg`xKjtH)IOzV6zXhJv-n zw5Th&)*aWPDZW;fS?pTI(45vJp3-t^H`dbul(?**6*z*HDhpcWm6<>gBb$=#&{Y3t zAa6Di1P2*?V<%|tuaNxBFEHl#$mIK*5ncRHQxIL#ZcP1r3^tjaG`Rnb@+tNvRPAee z?`W)HkJuo@1IvuQTd!+q9zv>An8d?TpNz@AR=|;BwTePsy~`}|;vJTM%~zSCedd4d zLuI}ONLoa0keaXmXqMIq8g5VRvREDOVZnQs4$vONh`xa`mmb-R2@!gXrdU+dnOY%lF|D9)(s~_uiEz6weQ+{pw)fp z6l^cWw4KgtI%NlwnNoaK%aS_ol4uXkni{)byFI(Tjou98yCpA3LvQYJ;IA1bFM6As zV&VU5Ww6po>`ImISx-aRrr)InPkSh;=1_tuxL0f)J*pcf;=aIz&wdDW(06bOb>mEZ z4Cdt-FpzdX9{SUPFklcWTmJuMsC-J(XpfC*{SH`G}(UHPRk` zyMFx;XV}3ua4!bjj0nx-a0s$!*6MChGTE9HCTSC>hcPKc53EdYbw!Rl;$7EWjgC!% zk*2IVWCAoh*dGmITx_C^*tf}%Br6$&S4g;|0ZNZtxM-glowCOW)@ORPO={7pKGb$) zt@dozbY+H)&8DAeN8P4lbIk=NSaxsFu{o&g*sLaZYz}7X*sSV1HU~HB*sT1H&B1-g zX6o4N_vxIe5i>5Twh^ zXdfP#C`Dswq__MHU8@MBS>08Ot93Q?9`#<_8Wrg_cj~$CJ^FvW_o#QW$GW}evFYyl z@7a3PgUU9}x@F=*0I$qwVLf=NLBQN+8$rsattMnEiY>!n3!@RJKiKaI-d<%59SweEK$-vm?YVN@=gMs2h_lWLmT+ zzjjOH;1(W3GhRK4u&CkGZcENUrlib+7>2h6&y!oH(KqEEA*o zCRZeKN*vW!9-4kxl~#MzFbRnUACJIe$E<0|=QxKQ{ACA(7soh7n?rWfSL=hj`2wv< z>~me>f#NugdT5T3dZLdYLFKoHV*Oy%$ozWfNyz~xW1=^cCl6szgQc2}!k+YQ3 z&SSW-wJdi!b$kMUg}szrCL({oVnCJ#G z)$avK?&sJ_<2-k^6R&#T=h)KZ3GZxgws`gD*w}>G?rc{qOniS^o$ai;j8D6>iSr5DMT0`usS@O-IN-GSez`weXuV`jthufhIJcA` zzl9VHQjUGtDJ*O%lacgF0hG=TOdN)ASihtn@%T<~sF`=mdlkl%!~n0OI7UsBWLVDx zHMIcX23Eo$Jd6G4!fP#w->#O81Jf}*9n`cv9ZHdyRP8Pg&!U1?<6sBobYF&7xumAY zTnhvLBl{w~NX$_d0ZAy$N9X4{jhao6g$GnB9xe5qydnouc-euuO=i+$RD3qiLUG5TAoFv)gAR@{*P@{oR1gGz{cAA(=@ou@WxA(V z`RUb#1@-J#cw=!9&xfYtVfbhD>{>-|%gjS1AY!O0K0~s#2M7Ab0*O^oq9|0u1#4Uv zT&BPGAq4&T+*Zs-BSgC!XWbF#^%7Z#+I2SSM>+O{-G20_6-1r$PRphSWB^{#3NeBK zlp97<3R-c<#R4Iv;-s>e#2S2wU8DK?csK+sMbBA=CC8@H8nj;e>viy}t_8uY0gb)& z45aoQY8N}(E1t+X#d3T(! z6u82YC#~qz2i((uGV$5eNHzBWQYbw%$qj_)>>c>p=iT#jPHnyp%+pIRJ9w;}%ee)R zBZ$-F!+w}w9CtJHg^eA6pM0Csqcng^bc(oun?B77=t+EkGVizbm%33#xlvscsmOU% z7^LV%C|Wx`;6%3%Tv>brx*05Ue|v_ZX}ctt!?Bvq4N+9|aXwDOvW;Ca9ECDE>5_+D{t>Giz&1CD#|XxA);3XN*6h-u3Dw= zTf|4yxP}1SxI4lktxmKkhF}kdF?J@RQODt1<q7#Y6Efdff|-bZ4{4(p<5u7211-QBGtw;NbnX?)C0O0slFh_=?-vPap9bbS>&ls zZZPrYmKrLp=hiH@#Bt4@46~(Vt$%V>gWFXn&|u=u8Ku_kxHo$eWfOwnG32&N`r)UXM?Cmc99x@ zuqf41VJ;UpztugQch7aKItjTyMgDYYW^p`>Pr zYDTIMsa?uy4DzqQ{>hR{%Tbl+-ySCs=W9s^s!vYawg0=6(HKGA{BrHnHC+;Mk~L)9U`YLnt=xT{PZHC!uu(dc1 zN4r@(G-b4$>@nK8-|1RgGHUy_()%WZ(=8vujRw=KGI~%yy6$)ACiJTsU4&&tE!#ON zI>+ztqZE2TbE9U@Rpy-*xaNX+X&WH(X3?31Q0s3o@;>JT{qYy+ufbFo2~fL>_s2cH z9A1%^-^_JEh#VyO+%IpIewpD~l|qB`IXNBhbnA^NZ+$HT)IlbncU_L8C`uXNpeyX{j zF@1CTGDFDNG-P1rsJ8kzG#f}oVXCFbGq)Ik;@oe;W6vgsqs?^AGk|qE|GLv~c>4IL zDW+&5;5YKAwEWfymb8zjHgye7Rnd}4J*|ZFQSKYLA)M~#W*l)=)FgMh zO=MD2wbC|?XW$@cmDA_9Re6^JONg_FCWYAulS{2&sk5XzfipEN*EwyKip=;+rb|%i z7gN40bvI4b+P>rR_T*mAb~U89_W)~GOyM_ZB+B*UOm4CzuaHPLCC$aWWHk+$#iFAP zT^?xG-sDCPc%qk4zu##zcN^>W1R|*OV1x3VHwJ7$y>VbrQdN8UhF`bC2G4fo`KHRb z*7!u!^V?TiXhG0IQ!ONv@^BL9v3M~T1kwq8LKkdEqFnY z6|Hf`)A1C}>AMnPBpDXl0isc~rJQ5bbDI_EL+R+ba=B5WlM0ccQ=X?HMO0s%xQphy z3ySZID47O^v37C+U(WwI!iTV6-214QGTppR9;3}undfPmGSP#E+56E9CBmxWYVC(l zNIJ;^7UxqGq;PCMHT=G2$<4I@W?G??{N1A?oD6I}Y9GehUV-8{ABM#@DneWGcl#SD zYG!IL&$bC)Y{xP|_+Pu5Qm-?9u5pj9_-QtBauNCTod>xN+_Jw!DsoeN+zS&(Fs`%6 zH*YC-i;Ue;z9^1aChlXbU9`%&g^M@%CDj0(kxZHW+u~Z2s%m+XL>}E;J*~PrT7E23 z<>+}HTX(0XmOk9()W4C1y)^^U2b8{o9 z{3e&?)^mUjuv0XT-+-o0Q3z(bpr(nHU`laJC$*JeTx#eTVVVSX*UND7yQl&4YzV?v zBabL_I%jkqCw1NbDo^4JW1b^mzMX#D((^KUMQbD=9-r*D^Wq9?`W8A&l+$h;6FYY6 zkb54fih{z<9Uo^K4PJg|ld_>rWY=f#kJSTj#IX0HGoBC;Ff7Pte8s}lPxKr$*1I}@y z-EEzpXPBKeruA3pjbk=UP5bx(pW)P_>jc|dzywgl?26dMe5kbPgD-^`r!a|(-nX_k zY8QcQsTFLjwNH^F$ls+N1TF0eYXzp`h#pVywmg(Ff9tGgGui^PKVFT_c| zsE^Z8){XoQZ&Rt&RH~1v>)AG2hJA!NHTb3NptfD+4ws=0cMN;FGc%V@#;KLtI)u_N zqq7kS2~NiYCn~hfH6|q|Pb=?gYUMqsQ{GjB@?MI1EvxXZ&sU96;b%KGF9q8kTdB!j z)3N!z>uPo(Wfv8fT|{$N^-M_ykUy^J0L=+6ac?Y|N69>Bsn%74b&A~NQ&o+p+5oQv z!7?_q?Ky@XQJ4qy<~A_TZ0nh+@isTq6OF+GZg4*d#qOf~bGg%1 zTZ!4(w%!|WP5Qc)k&CW(Vm%`?g|~F-;s&%BUCO%W9)_TJ+gt2{R4c`;hyCyh6q1z5 z5i0Us>7&)DF8?a}723nvwK4E59)qTI|qEqDy6jB;7C2 zuLr7I35i*IH0;r+{?f38NWx;0ZnoYC!j)-32oGL2LvVF01Wo>?c3M_a4F=Ibccqf; z#f2>)J9Y=F)9zq(><-q(?qDQsjp3@pv74@sx{nzWJ$N2nd@%)eNmo005SW1%Q_v3DqV9-{Th~AVYPM%ghgMW|I!{B*}oH;nY zi2D7_P59yk{qJ{S{$79cU%*D_A0QDA=^wA6jDLD{1zaGZe;$oauizg90~%X>A7+%y zjD1PkIk8LO^JILW*r!O^XB4_BIHzexRPHzD+-a9Ei=I|xo;hD{zC%MN$+<5{&M1}u zwNj?bpIr(P_R9>jCo*m3M)y9Vy?#45)xgBwS>BTH4a5YTSt4Ml2}~Pt1Qv)yJ&XK` z$D}LK8_KRvsqdtNX=v*HYXZwlE)CMrXyzVbD|pcgrs2OcVV2G*cV~jx_kX<}y$|z$ z1zVlq+bleVd+lBpk*OBE+pXm9*%NT zrP|VQUS-8#Ir)VscQ_}lr_c*p8AOj=U3~+!X zyzPa1wG8TZf<2R#CjqZT-~kbdXQzkHchc;9aTs>rBg!wj(;LtjxFF#nbpAvjk%^Rg z85S_ZCD65AFOEu(aqw4Ou*9HDp6VdsqtgX%y>r1sx!`c1vD8`ZEOnMFOc)eMfE~Q~ zL}0E4G@zW@+qltpcPrrbNTj5H1~l*E4~0bi#If;hJfdF<6G zD3HnfIB_nTfdxYWd5}htPXq{@NU6hqbPjhj?1#|@MvZR2U56dpFoV41v5OK^R2fC4 zf=ZVcu;|TgK*GRaZmiMd69EOMlFs2VrJ8PT?pt6C(%y&_E`|v{Jq{RxBFY8E_N%P} z4-^22JPNb!1;~wILRaR0y9q`<^cQgj?S1FsEUhn6a_4kVtsTXIt3VWm8;x?G3a&I2 z$^f9lXF#S?5Q!PzhF1n+D?+9DY1`wH^xC{Cd2qJEj5KO^HH;UNh0zM zS8mo&!iq*d|84euX^}_Km(AI$puYb*$$>0FI>^s^bht(JB-9N^fgo*p1&bDM8DA|$ z_(V91)9Axbhd9N{Fnb?-3&+RDpTPqzhzNJ_Egy3Y#Av|Dcvr2FOK?)32J3h zqls=;DhQx-KNy7Bl!m<-^;QHLjQ3Hm0Cj#**!RDEwcjbCkFj3lxV7zS?Vf^D9M$^9 z3u>NCspk<^l95=O=LfsNIsZa59B_Cs~P_@Zq;3mJFa-3%&X#GD*wH)X1=+IKDz&Qej$I9g**8- zz9~&!b6$0js(FR>Im5#+F~i%LZ0^k*oMPPz&UprNzu?Q|h0e{>yNxd`;7fdr?px1( z^+jc>}|_$C>r^aY^{v!YHY?*JPD!(ZOC`JYSeCvV};hox6F{`zmXAN}&TH}J+UkLn)>ByM_Pe|~@A zZ>6{J3V6>iz4`IuFZldcdpB&KRi@#4GX9l$nyE4uU#iks;PU2aeGeD@_H&2-HUB2s z`Ndf|4E8_t=)C+rub*7_TlrB*>$8|*#0YC&4txIyyA+Yi6~71*edi};XNE{|PlqgT9dGaLNyIW1 zFT6}KXe{W(Ack1;W0~zzET#N=9J`*CD~}R(ZNjenDPbW54i4NqOZ37@3!w&b@@Hku zH(!gL#a~A;bYvEHZXZIonAscGpS+8cpI$}kPxqfc@TcQQ_SBzxv6priUxx1^^1_9K zJD6h$J{ucr_}}Hn>r3u`>9f4?_)p7gOB<`}ORF18>wj8WURzmP`%|!V2XjySjPe4w zbMU8&kK>=4^!xwOkD^GOw^^6()-jLZucQP_(ztPDwM2Jo;O zV-JGl8QNhb1P%EKrRJge&-}%t1n0nEP~yyjZx3Dv`#ZMQ*U$I& zwgdS8orB{Y^W^tZJ$$9J3=&y%nvKvTxcubF6Kh#chgVsAeo>&Fo&6I{Ep*MR;x6@MVPlA((11tI=)^j-?ff^93t}dbHH81eVms>%ww6eUs z++JQ?dK?6=kGBG)c0NSe6_sbt*&1CG90*RucO?*tL%X5?o;`(m2l!*GTZhEC65DkE z_j1H_B(YXJ)gR#acM}$li6WHR@J83OFHBVqlhCLOu8VbOA9PX#IUGWO#!)g!b^!)O zu5`6=PGnC_V<^t+3C9n`qtMiMk*uqEo3gZ@08*!}U zvUN7(4yb90J|@<+Z58B#`U+s}nX7b^alB?aK>uofLC>4&zyLAW>T^j9HgtW=N25n)TuYak3sN`aYaS1>zeAaGqnWB1J1qsP2%{odL^e!vg8n zNaG&tTo5J_fkP%9I2}qj#61k7@ICcWch9_qKXD%GS(I@t{?wohJUzl$u(|>$U)>16 zbU11{*t~-FE;5A#K1Fd+bnz`(I%LLD7jK!tydZ7HIn%o8Y4!o8#^7K)naeo8Sa@ot z!gTfs-D?t?MGX_*w!B@_w_L$x1crMq0k5VbOE4-IVxwWRJ9jaxn;yIdTaJLk#9|mU; zj6zdj3jBF2*oZxRU>tH@psa9V;6#uG*q4HU|{8j&dDVWg~z{2L%)bOUMqVg_YXnSST+;@P#S0 z2ye{5;&b#QXd%i&FZ(NV*$0@P19H2Ldyu$dtW`n{7dTx-`tQgk8_;Q8wW7d2E`cV^Zh`lQcGm1y+d#qFHzn_ zsnkjm?6Jj-QdqB%(OT5656i^cBqc2ksb;~JU{IDUNw}|*E>)d$sX3D)RywPavZend zeF<(4)t4*yJf@J?7<0HYl3gY-Jw30D!Nz!KE@z*Lu0@2O9TBM)t_|3q0wqY=o0AI5pp z?0t*MfMxLqE=Vsg8){$)*NJ!P^)hgwab94AUGIRNYDiIMGa-Fkeo?s#Kf@O&RR?3P zvpCdZB%rh`U@YpGNhv<7AAYn0Q2|}OiYl*GmKXfM33xtE;DX=1l{A?qNn;N{IqAyOi{`dKe>*19Jhv1ye$CNtd{Q0+~`y z*%6~$7h3kn!j)y9F_L8fE3RAhqV`$XMS&dq-i28YfeMm(_acs@OJA!Bd0PvN?JP=E zTUSy6>490sBHMetR4aPx|TG0^pkMxu(fx+J35>m+kvj%%M0XKOoQV$Ph(9CSgS127Znx)0Q1E=YW3%8 z(?*g?%(j#PZIp1gU91s+6*w~|*L4`B(#ep=?30Rmn)a?V^-+2s038p{s!P%wZrd2J z#;%7hh6Izks~{xA09zW28xs**rk=jkf)FdZ;dydtX&`ZlH8d^m$I0kpZ%`yEJWRCxj7@7jD_PW9W-EM=&}{kO8OU(G@;dsjZ{bL#jF@}Y~1jQYPz_Yu~esoC+G^h zqS85l6t6EC2KdRE zF#$lbG?|v8*_##Tfu{HL5KEpY@hg9~MaovMT^i6(M^kjtH8;zpV2h%1f6#jZn>KWNRKa==g2rDg2hiJPk~gHykL|5hWQUhtVTZ(m?p7+OMM| zp^6=b|1+OXfUf8UHwb9AnGb+$$Oe~D9ZKxcrS+7j1lWuhfwjsp@nf!vv4OM#L zc??6tAbQE`7lEZDF>uMK0?P~Gd1Edx?kFyh%>H1UMRH5C5prJ~G{@<*CC&^+QWCeq z=3msXQW2p1e8=Z=WV%LiV_FZdrAfIpJG*!s=AN$wiH7*9uow0S*1+nlncPxm`(0H3%GjU)$*SaH7Q>?PU3WsA3gk4+YpD?E1;l))> zg5cy!8sh)M`Zup$X)5Jij)rv8AH z<2OBFF;qrOjI5HttOT`gARtlyOiTkM0ih14_zs(T3aNAD*zb{Q!->&xVaI?(V|dQ? zJfI)efyiwhoME)egH>2Gvhq`t7s4u|%L7>+6H$=T-jh_LDoREDKDsS47FH1<8YEIj zFL&3lN9OXdi~hnZ&Cm@XG*&rMn5}O@ILoOC>6t>|P8N$bMElb2IZWzA#uByE^S6}4 z>q6-;aZWKU+J9n7blEjiUC;DAGM)l|HEuBSB!t0vn)a~S3^w3BJEP*JsjKOl@(R%h zQaBQ~K$R_ePrDKk)P(^-pyjU#*cY4&Ywz03E!~WAVjXBaGdWmPqj;2&2ZbBn!g$#mg;uqRgOpG z7+ZbwGFE!j@f60>W~}7OtKDWWLa$tDz_FO51r)O})1ri^XxQJ>Hs|uuDCcNmv7b1* zFO5j&Qi75qD51E@xjUu;r_>&lok><5O(YD-Cqq=ZfbK6<(^oM95q_s#3Z&#VqK}VW zkvzMKzVDJ_Wil?%aEqPI16}>SbYNVBm`knG1i9pY4uCd(h;q3fE;SGj4EorSShRG3 zR%f4pG|DXhQZAUw8pzQc=B24If{Md&_(u9KutC!d8|LOR2n@wTOxe61yHXx}ic;}2 zLpo^;gGEV|9$IJBC8?^`637-L(UL?3 `jl|{t$LDRH^;*W?xlC*?hMC4+oZDBD= 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 literal 0 HcmV?d00001 diff --git a/depend/libuv-1.49.2.tar.gz b/depend/libuv-1.49.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b043ceb38f51a24e5b102f35fdfb2d7b20d97efd GIT binary patch literal 1338717 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 ORv6}~Y57J2Xf>XZiWd7%k`alvY{r^ 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

      6Ub*Xq8pwjyOZD4Eo0ZUc4yy;12c7TM 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℘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 z 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 z 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

    V@7K#X`oiTum7gv*+$ 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 z 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 ZF>*ib=d?nGPJIe2k_4_s7^`VI)E@JOz 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

    5>#^55j*ZXM?^_vXR)fwjQ9e8dzoE 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 BSS#2Z1&s&2!65}6D-t?!o`8V{SR^jjSih&U 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